Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
99806167
Commit
99806167
authored
Dec 29, 2014
by
Daniel Smith
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2909 from smarterclayton/passversiontorestmapper
Allow --api-version to properly override various default behaviors in CLI
parents
9873d8a7
203246b7
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
160 additions
and
51 deletions
+160
-51
latest_test.go
pkg/api/latest/latest_test.go
+1
-1
interfaces.go
pkg/api/meta/interfaces.go
+1
-1
restmapper.go
pkg/api/meta/restmapper.go
+21
-8
restmapper_test.go
pkg/api/meta/restmapper_test.go
+41
-19
client_builder.go
pkg/client/clientcmd/client_builder.go
+32
-6
client_builder_test.go
pkg/client/clientcmd/client_builder_test.go
+35
-0
config.go
pkg/config/config.go
+1
-1
cmd.go
pkg/kubectl/cmd/cmd.go
+3
-1
create.go
pkg/kubectl/cmd/create.go
+1
-1
createall.go
pkg/kubectl/cmd/createall.go
+1
-1
describe_test.go
pkg/kubectl/cmd/describe_test.go
+1
-0
get_test.go
pkg/kubectl/cmd/get_test.go
+1
-0
resource.go
pkg/kubectl/cmd/resource.go
+20
-11
update.go
pkg/kubectl/cmd/update.go
+1
-1
No files found.
pkg/api/latest/latest_test.go
View file @
99806167
...
@@ -228,7 +228,7 @@ func TestRESTMapper(t *testing.T) {
...
@@ -228,7 +228,7 @@ func TestRESTMapper(t *testing.T) {
}
}
for
_
,
version
:=
range
Versions
{
for
_
,
version
:=
range
Versions
{
mapping
,
err
:=
RESTMapper
.
RESTMapping
(
version
,
"ReplicationController"
)
mapping
,
err
:=
RESTMapper
.
RESTMapping
(
"ReplicationController"
,
version
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
}
...
...
pkg/api/meta/interfaces.go
View file @
99806167
...
@@ -106,5 +106,5 @@ type RESTMapping struct {
...
@@ -106,5 +106,5 @@ type RESTMapping struct {
// consumers of Kubernetes compatible REST APIs as defined in docs/api-conventions.md.
// consumers of Kubernetes compatible REST APIs as defined in docs/api-conventions.md.
type
RESTMapper
interface
{
type
RESTMapper
interface
{
VersionAndKindForResource
(
resource
string
)
(
defaultVersion
,
kind
string
,
err
error
)
VersionAndKindForResource
(
resource
string
)
(
defaultVersion
,
kind
string
,
err
error
)
RESTMapping
(
version
,
kind
string
)
(
*
RESTMapping
,
error
)
RESTMapping
(
kind
string
,
versions
...
string
)
(
*
RESTMapping
,
error
)
}
}
pkg/api/meta/restmapper.go
View file @
99806167
...
@@ -122,21 +122,34 @@ func (m *DefaultRESTMapper) VersionAndKindForResource(resource string) (defaultV
...
@@ -122,21 +122,34 @@ func (m *DefaultRESTMapper) VersionAndKindForResource(resource string) (defaultV
}
}
// RESTMapping returns a struct representing the resource path and conversion interfaces a
// RESTMapping returns a struct representing the resource path and conversion interfaces a
// RESTClient should use to operate on the provided
version and kind. If a version is not
// RESTClient should use to operate on the provided
kind in order of versions. If a version search
// provided, the search order provided to DefaultRESTMapper will be used to resolve which
//
order is not
provided, the search order provided to DefaultRESTMapper will be used to resolve which
// APIVersion should be used to access the named kind.
// APIVersion should be used to access the named kind.
func
(
m
*
DefaultRESTMapper
)
RESTMapping
(
version
,
kind
string
)
(
*
RESTMapping
,
error
)
{
func
(
m
*
DefaultRESTMapper
)
RESTMapping
(
kind
string
,
versions
...
string
)
(
*
RESTMapping
,
error
)
{
// Default to a version with this kind
// Pick an appropriate version
if
len
(
version
)
==
0
{
var
version
string
hadVersion
:=
false
for
_
,
v
:=
range
versions
{
if
len
(
v
)
==
0
{
continue
}
hadVersion
=
true
if
_
,
ok
:=
m
.
reverse
[
typeMeta
{
APIVersion
:
v
,
Kind
:
kind
}];
ok
{
version
=
v
break
}
}
// Use the default preferred versions
if
!
hadVersion
&&
len
(
version
)
==
0
{
for
_
,
v
:=
range
m
.
versions
{
for
_
,
v
:=
range
m
.
versions
{
if
_
,
ok
:=
m
.
reverse
[
typeMeta
{
APIVersion
:
v
,
Kind
:
kind
}];
ok
{
if
_
,
ok
:=
m
.
reverse
[
typeMeta
{
APIVersion
:
v
,
Kind
:
kind
}];
ok
{
version
=
v
version
=
v
break
break
}
}
}
}
if
len
(
version
)
==
0
{
}
return
nil
,
fmt
.
Errorf
(
"no object named %q is registered"
,
kind
)
if
len
(
version
)
==
0
{
}
return
nil
,
fmt
.
Errorf
(
"no object named %q is registered"
,
kind
)
}
}
// Ensure we have a REST mapping
// Ensure we have a REST mapping
...
...
pkg/api/meta/restmapper_test.go
View file @
99806167
...
@@ -122,31 +122,39 @@ func TestKindToResource(t *testing.T) {
...
@@ -122,31 +122,39 @@ func TestKindToResource(t *testing.T) {
func
TestRESTMapperRESTMapping
(
t
*
testing
.
T
)
{
func
TestRESTMapperRESTMapping
(
t
*
testing
.
T
)
{
testCases
:=
[]
struct
{
testCases
:=
[]
struct
{
Kind
,
APIVersion
string
Kind
string
MixedCase
bool
APIVersions
[]
string
MixedCase
bool
DefaultVersions
[]
string
Resource
string
Resource
string
Version
string
Version
string
Err
bool
Err
bool
}{
}{
{
Kind
:
"Unknown"
,
APIVersion
:
""
,
Err
:
true
},
{
Kind
:
"Unknown"
,
Err
:
true
},
{
Kind
:
"InternalObject"
,
Err
:
true
},
{
DefaultVersions
:
[]
string
{
"test"
},
Kind
:
"Unknown"
,
Err
:
true
},
{
DefaultVersions
:
[]
string
{
"test"
},
Kind
:
"InternalObject"
,
APIVersions
:
[]
string
{
"test"
},
Resource
:
"internalobjects"
},
{
DefaultVersions
:
[]
string
{
"test"
},
Kind
:
"InternalObject"
,
APIVersions
:
[]
string
{
"test"
},
Resource
:
"internalobjects"
},
{
Kind
:
"InternalObject"
,
APIVersion
:
"test"
,
Resource
:
"internalobjects"
},
{
DefaultVersions
:
[]
string
{
"test"
},
Kind
:
"InternalObject"
,
APIVersions
:
[]
string
{
"test"
},
Resource
:
"internalobjects"
},
{
Kind
:
"InternalObject"
,
APIVersion
:
"test"
,
Resource
:
"internalobjects"
},
{
Kind
:
"InternalObject"
,
APIVersion
:
""
,
Resource
:
"internalobjects"
,
Version
:
"test"
},
{
Kind
:
"InternalObject"
,
APIVersion
:
"test"
,
Resource
:
"internalobjects"
},
{
DefaultVersions
:
[]
string
{
"test"
},
Kind
:
"InternalObject"
,
APIVersions
:
[]
string
{},
Resource
:
"internalobjects"
,
Version
:
"test"
},
{
Kind
:
"InternalObject"
,
APIVersion
:
"test"
,
MixedCase
:
true
,
Resource
:
"internalObjects"
},
{
DefaultVersions
:
[]
string
{
"test"
},
Kind
:
"InternalObject"
,
APIVersions
:
[]
string
{
"test"
},
Resource
:
"internalobjects"
},
{
DefaultVersions
:
[]
string
{
"test"
},
Kind
:
"InternalObject"
,
APIVersions
:
[]
string
{
"test"
},
MixedCase
:
true
,
Resource
:
"internalObjects"
},
// TODO: add test for a resource that exists in one version but not another
// TODO: add test for a resource that exists in one version but not another
}
}
for
i
,
testCase
:=
range
testCases
{
for
i
,
testCase
:=
range
testCases
{
mapper
:=
NewDefaultRESTMapper
(
[]
string
{
"test"
}
,
fakeInterfaces
)
mapper
:=
NewDefaultRESTMapper
(
testCase
.
DefaultVersions
,
fakeInterfaces
)
scheme
:=
runtime
.
NewScheme
()
scheme
:=
runtime
.
NewScheme
()
scheme
.
AddKnownTypes
(
"test"
,
&
InternalObject
{})
scheme
.
AddKnownTypes
(
"test"
,
&
InternalObject
{})
mapper
.
Add
(
scheme
,
testCase
.
MixedCase
,
"test"
)
mapper
.
Add
(
scheme
,
testCase
.
MixedCase
,
"test"
)
mapping
,
err
:=
mapper
.
RESTMapping
(
testCase
.
APIVersion
,
testCase
.
Kind
)
mapping
,
err
:=
mapper
.
RESTMapping
(
testCase
.
Kind
,
testCase
.
APIVersions
...
)
hasErr
:=
err
!=
nil
hasErr
:=
err
!=
nil
if
hasErr
!=
testCase
.
Err
{
if
hasErr
!=
testCase
.
Err
{
t
.
Errorf
(
"%d: unexpected error behavior %t: %v"
,
i
,
testCase
.
Err
,
err
)
t
.
Errorf
(
"%d: unexpected error behavior %t: %v"
,
i
,
testCase
.
Err
,
err
)
...
@@ -159,7 +167,7 @@ func TestRESTMapperRESTMapping(t *testing.T) {
...
@@ -159,7 +167,7 @@ func TestRESTMapperRESTMapping(t *testing.T) {
}
}
version
:=
testCase
.
Version
version
:=
testCase
.
Version
if
version
==
""
{
if
version
==
""
{
version
=
testCase
.
APIVersion
version
=
testCase
.
APIVersion
s
[
0
]
}
}
if
mapping
.
APIVersion
!=
version
{
if
mapping
.
APIVersion
!=
version
{
t
.
Errorf
(
"%d: unexpected version: %#v"
,
i
,
mapping
)
t
.
Errorf
(
"%d: unexpected version: %#v"
,
i
,
mapping
)
...
@@ -179,37 +187,51 @@ func TestRESTMapperRESTMappingSelectsVersion(t *testing.T) {
...
@@ -179,37 +187,51 @@ func TestRESTMapperRESTMappingSelectsVersion(t *testing.T) {
mapper
.
Add
(
scheme
,
false
,
"test1"
,
"test2"
)
mapper
.
Add
(
scheme
,
false
,
"test1"
,
"test2"
)
// pick default matching object kind based on search order
// pick default matching object kind based on search order
mapping
,
err
:=
mapper
.
RESTMapping
(
"
"
,
"
OtherObject"
)
mapping
,
err
:=
mapper
.
RESTMapping
(
"OtherObject"
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Error
f
(
"unexpected error: %v"
,
err
)
t
.
Fatal
f
(
"unexpected error: %v"
,
err
)
}
}
if
mapping
.
Resource
!=
"otherobjects"
||
mapping
.
APIVersion
!=
"test2"
{
if
mapping
.
Resource
!=
"otherobjects"
||
mapping
.
APIVersion
!=
"test2"
{
t
.
Errorf
(
"unexpected mapping: %#v"
,
mapping
)
t
.
Errorf
(
"unexpected mapping: %#v"
,
mapping
)
}
}
mapping
,
err
=
mapper
.
RESTMapping
(
"
"
,
"
InternalObject"
)
mapping
,
err
=
mapper
.
RESTMapping
(
"InternalObject"
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Error
f
(
"unexpected error: %v"
,
err
)
t
.
Fatal
f
(
"unexpected error: %v"
,
err
)
}
}
if
mapping
.
Resource
!=
"internalobjects"
||
mapping
.
APIVersion
!=
"test1"
{
if
mapping
.
Resource
!=
"internalobjects"
||
mapping
.
APIVersion
!=
"test1"
{
t
.
Errorf
(
"unexpected mapping: %#v"
,
mapping
)
t
.
Errorf
(
"unexpected mapping: %#v"
,
mapping
)
}
}
// mismatch of version
// mismatch of version
mapping
,
err
=
mapper
.
RESTMapping
(
"
test2"
,
"InternalObject
"
)
mapping
,
err
=
mapper
.
RESTMapping
(
"
InternalObject"
,
"test2
"
)
if
err
==
nil
{
if
err
==
nil
{
t
.
Errorf
(
"unexpected non-error"
)
t
.
Errorf
(
"unexpected non-error"
)
}
}
mapping
,
err
=
mapper
.
RESTMapping
(
"
test1"
,
"OtherObject
"
)
mapping
,
err
=
mapper
.
RESTMapping
(
"
OtherObject"
,
"test1
"
)
if
err
==
nil
{
if
err
==
nil
{
t
.
Errorf
(
"unexpected non-error"
)
t
.
Errorf
(
"unexpected non-error"
)
}
}
// not in the search versions
// not in the search versions
mapping
,
err
=
mapper
.
RESTMapping
(
"test3"
,
"OtherObject"
)
mapping
,
err
=
mapper
.
RESTMapping
(
"OtherObject"
,
"test3"
)
if
err
==
nil
{
t
.
Errorf
(
"unexpected non-error"
)
}
// explicit search order
mapping
,
err
=
mapper
.
RESTMapping
(
"OtherObject"
,
"test3"
,
"test1"
)
if
err
==
nil
{
if
err
==
nil
{
t
.
Errorf
(
"unexpected non-error"
)
t
.
Errorf
(
"unexpected non-error"
)
}
}
mapping
,
err
=
mapper
.
RESTMapping
(
"OtherObject"
,
"test3"
,
"test2"
)
if
err
!=
nil
{
t
.
Fatalf
(
"unexpected non-error"
)
}
if
mapping
.
Resource
!=
"otherobjects"
||
mapping
.
APIVersion
!=
"test2"
{
t
.
Errorf
(
"unexpected mapping: %#v"
,
mapping
)
}
}
}
func
TestRESTMapperReportsErrorOnBadVersion
(
t
*
testing
.
T
)
{
func
TestRESTMapperReportsErrorOnBadVersion
(
t
*
testing
.
T
)
{
...
@@ -218,7 +240,7 @@ func TestRESTMapperReportsErrorOnBadVersion(t *testing.T) {
...
@@ -218,7 +240,7 @@ func TestRESTMapperReportsErrorOnBadVersion(t *testing.T) {
scheme
.
AddKnownTypes
(
"test1"
,
&
InternalObject
{})
scheme
.
AddKnownTypes
(
"test1"
,
&
InternalObject
{})
mapper
.
Add
(
scheme
,
false
,
"test1"
)
mapper
.
Add
(
scheme
,
false
,
"test1"
)
_
,
err
:=
mapper
.
RESTMapping
(
"
test1"
,
"InternalObject
"
)
_
,
err
:=
mapper
.
RESTMapping
(
"
InternalObject"
,
"test1
"
)
if
err
==
nil
{
if
err
==
nil
{
t
.
Errorf
(
"unexpected non-error"
)
t
.
Errorf
(
"unexpected non-error"
)
}
}
...
...
pkg/client/clientcmd/client_builder.go
View file @
99806167
...
@@ -33,10 +33,15 @@ import (
...
@@ -33,10 +33,15 @@ import (
type
Builder
interface
{
type
Builder
interface
{
// BindFlags must bind and keep track of all the flags required to build a client config object
// BindFlags must bind and keep track of all the flags required to build a client config object
BindFlags
(
flags
*
pflag
.
FlagSet
)
BindFlags
(
flags
*
pflag
.
FlagSet
)
// Config uses the values of the bound flags and builds a complete client config
Config
()
(
*
client
.
Config
,
error
)
// Client calls BuildConfig under the covers and uses that config to return a client
// Client calls BuildConfig under the covers and uses that config to return a client
Client
()
(
*
client
.
Client
,
error
)
Client
()
(
*
client
.
Client
,
error
)
// Config uses the values of the bound flags and builds a complete client config
Config
()
(
*
client
.
Config
,
error
)
// Override invokes Config(), then passes that to the provided function, and returns a new
// builder that will use that config as its default. If Config() returns an error for the default
// values the function will not be invoked, and the error will be available when Client() is called.
Override
(
func
(
*
client
.
Config
))
Builder
}
}
// cmdAuthInfo is used to track whether flags have been set
// cmdAuthInfo is used to track whether flags have been set
...
@@ -58,6 +63,8 @@ type builder struct {
...
@@ -58,6 +63,8 @@ type builder struct {
apiserver
string
apiserver
string
apiVersion
string
apiVersion
string
matchApiVersion
bool
matchApiVersion
bool
config
*
client
.
Config
}
}
// NewBuilder returns a valid Builder that uses the passed authLoader. If authLoader is nil, the NewDefaultAuthLoader is used.
// NewBuilder returns a valid Builder that uses the passed authLoader. If authLoader is nil, the NewDefaultAuthLoader is used.
...
@@ -124,6 +131,26 @@ func (builder *builder) Client() (*client.Client, error) {
...
@@ -124,6 +131,26 @@ func (builder *builder) Client() (*client.Client, error) {
// Config implements Builder
// Config implements Builder
func
(
builder
*
builder
)
Config
()
(
*
client
.
Config
,
error
)
{
func
(
builder
*
builder
)
Config
()
(
*
client
.
Config
,
error
)
{
if
builder
.
config
!=
nil
{
return
builder
.
config
,
nil
}
return
builder
.
newConfig
()
}
// Override implements Builder
func
(
builder
*
builder
)
Override
(
fn
func
(
*
client
.
Config
))
Builder
{
config
,
err
:=
builder
.
newConfig
()
if
err
!=
nil
{
return
builder
}
fn
(
config
)
b
:=
*
builder
b
.
config
=
config
return
&
b
}
// newConfig creates a new config object for this builder
func
(
builder
*
builder
)
newConfig
()
(
*
client
.
Config
,
error
)
{
clientConfig
:=
client
.
Config
{}
clientConfig
:=
client
.
Config
{}
if
len
(
builder
.
apiserver
)
>
0
{
if
len
(
builder
.
apiserver
)
>
0
{
clientConfig
.
Host
=
builder
.
apiserver
clientConfig
.
Host
=
builder
.
apiserver
...
@@ -140,12 +167,11 @@ func (builder *builder) Config() (*client.Config, error) {
...
@@ -140,12 +167,11 @@ func (builder *builder) Config() (*client.Config, error) {
authInfoFileFound
:=
true
authInfoFileFound
:=
true
authInfo
,
err
:=
builder
.
authLoader
.
LoadAuth
(
builder
.
authPath
)
authInfo
,
err
:=
builder
.
authLoader
.
LoadAuth
(
builder
.
authPath
)
if
authInfo
==
nil
&&
err
!=
nil
{
// only consider failing if we don't have any auth info
if
authInfo
==
nil
&&
err
!=
nil
{
// only consider failing if we don't have any auth info
if
os
.
IsNotExist
(
err
)
{
// if it's just a case of a missing file, simply flag the auth as not found and use the command line arguments
if
!
os
.
IsNotExist
(
err
)
{
// if it's just a case of a missing file, simply flag the auth as not found and use the command line arguments
authInfoFileFound
=
false
authInfo
=
&
clientauth
.
Info
{}
}
else
{
return
nil
,
err
return
nil
,
err
}
}
authInfoFileFound
=
false
authInfo
=
&
clientauth
.
Info
{}
}
}
// If provided, the command line options override options from the auth file
// If provided, the command line options override options from the auth file
...
...
pkg/client/clientcmd/client_builder_test.go
View file @
99806167
...
@@ -29,6 +29,7 @@ import (
...
@@ -29,6 +29,7 @@ import (
"github.com/spf13/pflag"
"github.com/spf13/pflag"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/latest"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/latest"
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
"github.com/GoogleCloudPlatform/kubernetes/pkg/clientauth"
"github.com/GoogleCloudPlatform/kubernetes/pkg/clientauth"
)
)
...
@@ -251,6 +252,40 @@ func TestLoadClientAuthInfoOrPrompt(t *testing.T) {
...
@@ -251,6 +252,40 @@ func TestLoadClientAuthInfoOrPrompt(t *testing.T) {
}
}
}
}
func
TestOverride
(
t
*
testing
.
T
)
{
b
:=
NewBuilder
(
nil
)
cfg
,
err
:=
b
.
Config
()
if
err
!=
nil
{
t
.
Fatalf
(
"unexpected error: %v"
,
err
)
}
if
cfg
.
Version
!=
""
{
t
.
Errorf
(
"unexpected default config version"
)
}
newCfg
,
err
:=
b
.
Override
(
func
(
cfg
*
client
.
Config
)
{
if
cfg
.
Version
!=
""
{
t
.
Errorf
(
"unexpected default config version"
)
}
cfg
.
Version
=
"test"
})
.
Config
()
if
newCfg
.
Version
!=
"test"
{
t
.
Errorf
(
"unexpected override config version"
)
}
if
cfg
.
Version
!=
""
{
t
.
Errorf
(
"original object should not change"
)
}
cfg
,
err
=
b
.
Config
()
if
err
!=
nil
{
t
.
Fatalf
(
"unexpected error: %v"
,
err
)
}
if
cfg
.
Version
!=
""
{
t
.
Errorf
(
"override should not be persistent"
)
}
}
func
matchStringArg
(
expected
,
got
string
,
t
*
testing
.
T
)
{
func
matchStringArg
(
expected
,
got
string
,
t
*
testing
.
T
)
{
if
expected
!=
got
{
if
expected
!=
got
{
t
.
Errorf
(
"Expected %v, got %v"
,
expected
,
got
)
t
.
Errorf
(
"Expected %v, got %v"
,
expected
,
got
)
...
...
pkg/config/config.go
View file @
99806167
...
@@ -45,7 +45,7 @@ func CreateObjects(typer runtime.ObjectTyper, mapper meta.RESTMapper, clientFor
...
@@ -45,7 +45,7 @@ func CreateObjects(typer runtime.ObjectTyper, mapper meta.RESTMapper, clientFor
continue
continue
}
}
mapping
,
err
:=
mapper
.
RESTMapping
(
version
,
kind
)
mapping
,
err
:=
mapper
.
RESTMapping
(
kind
,
version
)
if
err
!=
nil
{
if
err
!=
nil
{
allErrors
=
append
(
allErrors
,
fmt
.
Errorf
(
"Config.item[%d] mapping: %v"
,
i
,
err
))
allErrors
=
append
(
allErrors
,
fmt
.
Errorf
(
"Config.item[%d] mapping: %v"
,
i
,
err
))
continue
continue
...
...
pkg/kubectl/cmd/cmd.go
View file @
99806167
...
@@ -64,7 +64,9 @@ func NewFactory(clientBuilder clientcmd.Builder) *Factory {
...
@@ -64,7 +64,9 @@ func NewFactory(clientBuilder clientcmd.Builder) *Factory {
}
}
},
},
Client
:
func
(
cmd
*
cobra
.
Command
,
mapping
*
meta
.
RESTMapping
)
(
kubectl
.
RESTClient
,
error
)
{
Client
:
func
(
cmd
*
cobra
.
Command
,
mapping
*
meta
.
RESTMapping
)
(
kubectl
.
RESTClient
,
error
)
{
return
clientBuilder
.
Client
()
return
clientBuilder
.
Override
(
func
(
c
*
client
.
Config
)
{
c
.
Version
=
mapping
.
APIVersion
})
.
Client
()
},
},
Describer
:
func
(
cmd
*
cobra
.
Command
,
mapping
*
meta
.
RESTMapping
)
(
kubectl
.
Describer
,
error
)
{
Describer
:
func
(
cmd
*
cobra
.
Command
,
mapping
*
meta
.
RESTMapping
)
(
kubectl
.
Describer
,
error
)
{
client
,
err
:=
clientBuilder
.
Client
()
client
,
err
:=
clientBuilder
.
Client
()
...
...
pkg/kubectl/cmd/create.go
View file @
99806167
...
@@ -45,7 +45,7 @@ Examples:
...
@@ -45,7 +45,7 @@ Examples:
}
}
schema
,
err
:=
f
.
Validator
(
cmd
)
schema
,
err
:=
f
.
Validator
(
cmd
)
checkErr
(
err
)
checkErr
(
err
)
mapping
,
namespace
,
name
,
data
:=
ResourceFromFile
(
filename
,
f
.
Typer
,
f
.
Mapper
,
schema
)
mapping
,
namespace
,
name
,
data
:=
ResourceFromFile
(
cmd
,
filename
,
f
.
Typer
,
f
.
Mapper
,
schema
)
client
,
err
:=
f
.
Client
(
cmd
,
mapping
)
client
,
err
:=
f
.
Client
(
cmd
,
mapping
)
checkErr
(
err
)
checkErr
(
err
)
...
...
pkg/kubectl/cmd/createall.go
View file @
99806167
...
@@ -44,7 +44,7 @@ func DataToObjects(m meta.RESTMapper, t runtime.ObjectTyper, data []byte) (resul
...
@@ -44,7 +44,7 @@ func DataToObjects(m meta.RESTMapper, t runtime.ObjectTyper, data []byte) (resul
continue
continue
}
}
mapping
,
err
:=
m
.
RESTMapping
(
version
,
kind
)
mapping
,
err
:=
m
.
RESTMapping
(
kind
,
version
)
if
err
!=
nil
{
if
err
!=
nil
{
errors
=
append
(
errors
,
fmt
.
Errorf
(
"item[%d] mapping: %v"
,
i
,
err
))
errors
=
append
(
errors
,
fmt
.
Errorf
(
"item[%d] mapping: %v"
,
i
,
err
))
continue
continue
...
...
pkg/kubectl/cmd/describe_test.go
View file @
99806167
...
@@ -37,6 +37,7 @@ func TestDescribeUnknownSchemaObject(t *testing.T) {
...
@@ -37,6 +37,7 @@ func TestDescribeUnknownSchemaObject(t *testing.T) {
buf
:=
bytes
.
NewBuffer
([]
byte
{})
buf
:=
bytes
.
NewBuffer
([]
byte
{})
cmd
:=
f
.
NewCmdDescribe
(
buf
)
cmd
:=
f
.
NewCmdDescribe
(
buf
)
cmd
.
Flags
()
.
String
(
"api-version"
,
"default"
,
""
)
cmd
.
Flags
()
.
String
(
"namespace"
,
"test"
,
""
)
cmd
.
Flags
()
.
String
(
"namespace"
,
"test"
,
""
)
cmd
.
Run
(
cmd
,
[]
string
{
"type"
,
"foo"
})
cmd
.
Run
(
cmd
,
[]
string
{
"type"
,
"foo"
})
...
...
pkg/kubectl/cmd/get_test.go
View file @
99806167
...
@@ -37,6 +37,7 @@ func TestGetUnknownSchemaObject(t *testing.T) {
...
@@ -37,6 +37,7 @@ func TestGetUnknownSchemaObject(t *testing.T) {
buf
:=
bytes
.
NewBuffer
([]
byte
{})
buf
:=
bytes
.
NewBuffer
([]
byte
{})
cmd
:=
f
.
NewCmdGet
(
buf
)
cmd
:=
f
.
NewCmdGet
(
buf
)
cmd
.
Flags
()
.
String
(
"api-version"
,
"default"
,
""
)
cmd
.
Flags
()
.
String
(
"namespace"
,
"test"
,
""
)
cmd
.
Flags
()
.
String
(
"namespace"
,
"test"
,
""
)
cmd
.
Run
(
cmd
,
[]
string
{
"type"
,
"foo"
})
cmd
.
Run
(
cmd
,
[]
string
{
"type"
,
"foo"
})
...
...
pkg/kubectl/cmd/resource.go
View file @
99806167
...
@@ -201,13 +201,13 @@ func ResourceFromArgsOrFile(cmd *cobra.Command, args []string, filename string,
...
@@ -201,13 +201,13 @@ func ResourceFromArgsOrFile(cmd *cobra.Command, args []string, filename string,
usageError
(
cmd
,
"Must specify filename or command line params"
)
usageError
(
cmd
,
"Must specify filename or command line params"
)
}
}
v
ersion
,
kind
,
err
:=
mapper
.
VersionAndKindForResource
(
resource
)
defaultV
ersion
,
kind
,
err
:=
mapper
.
VersionAndKindForResource
(
resource
)
if
err
!=
nil
{
if
err
!=
nil
{
// The error returned by mapper is "no resource defined", which is a usage error
// The error returned by mapper is "no resource defined", which is a usage error
usageError
(
cmd
,
err
.
Error
())
usageError
(
cmd
,
err
.
Error
())
}
}
version
:=
GetFlagString
(
cmd
,
"api-version"
)
mapping
,
err
=
mapper
.
RESTMapping
(
version
,
kind
)
mapping
,
err
=
mapper
.
RESTMapping
(
kind
,
version
,
defaultVersion
)
checkErr
(
err
)
checkErr
(
err
)
return
return
}
}
...
@@ -216,7 +216,7 @@ func ResourceFromArgsOrFile(cmd *cobra.Command, args []string, filename string,
...
@@ -216,7 +216,7 @@ func ResourceFromArgsOrFile(cmd *cobra.Command, args []string, filename string,
usageError
(
cmd
,
"Must specify filename or command line params"
)
usageError
(
cmd
,
"Must specify filename or command line params"
)
}
}
mapping
,
namespace
,
name
,
_
=
ResourceFromFile
(
filename
,
typer
,
mapper
,
schema
)
mapping
,
namespace
,
name
,
_
=
ResourceFromFile
(
cmd
,
filename
,
typer
,
mapper
,
schema
)
if
len
(
name
)
==
0
{
if
len
(
name
)
==
0
{
checkErr
(
fmt
.
Errorf
(
"the resource in the provided file has no name (or ID) defined"
))
checkErr
(
fmt
.
Errorf
(
"the resource in the provided file has no name (or ID) defined"
))
}
}
...
@@ -242,7 +242,7 @@ func ResourceFromArgs(cmd *cobra.Command, args []string, mapper meta.RESTMapper)
...
@@ -242,7 +242,7 @@ func ResourceFromArgs(cmd *cobra.Command, args []string, mapper meta.RESTMapper)
version
,
kind
,
err
:=
mapper
.
VersionAndKindForResource
(
resource
)
version
,
kind
,
err
:=
mapper
.
VersionAndKindForResource
(
resource
)
checkErr
(
err
)
checkErr
(
err
)
mapping
,
err
=
mapper
.
RESTMapping
(
version
,
kind
)
mapping
,
err
=
mapper
.
RESTMapping
(
kind
,
version
)
checkErr
(
err
)
checkErr
(
err
)
return
return
}
}
...
@@ -268,10 +268,11 @@ func ResourceOrTypeFromArgs(cmd *cobra.Command, args []string, mapper meta.RESTM
...
@@ -268,10 +268,11 @@ func ResourceOrTypeFromArgs(cmd *cobra.Command, args []string, mapper meta.RESTM
}
}
}
}
v
ersion
,
kind
,
err
:=
mapper
.
VersionAndKindForResource
(
resource
)
defaultV
ersion
,
kind
,
err
:=
mapper
.
VersionAndKindForResource
(
resource
)
checkErr
(
err
)
checkErr
(
err
)
mapping
,
err
=
mapper
.
RESTMapping
(
version
,
kind
)
version
:=
GetFlagString
(
cmd
,
"api-version"
)
mapping
,
err
=
mapper
.
RESTMapping
(
kind
,
version
,
defaultVersion
)
checkErr
(
err
)
checkErr
(
err
)
return
return
...
@@ -280,23 +281,24 @@ func ResourceOrTypeFromArgs(cmd *cobra.Command, args []string, mapper meta.RESTM
...
@@ -280,23 +281,24 @@ func ResourceOrTypeFromArgs(cmd *cobra.Command, args []string, mapper meta.RESTM
// ResourceFromFile retrieves the name and namespace from a valid file. If the file does not
// ResourceFromFile retrieves the name and namespace from a valid file. If the file does not
// resolve to a known type an error is returned. The returned mapping can be used to determine
// resolve to a known type an error is returned. The returned mapping can be used to determine
// the correct REST endpoint to modify this resource with.
// the correct REST endpoint to modify this resource with.
func
ResourceFromFile
(
filename
string
,
typer
runtime
.
ObjectTyper
,
mapper
meta
.
RESTMapper
,
schema
validation
.
Schema
)
(
mapping
*
meta
.
RESTMapping
,
namespace
,
name
string
,
data
[]
byte
)
{
func
ResourceFromFile
(
cmd
*
cobra
.
Command
,
filename
string
,
typer
runtime
.
ObjectTyper
,
mapper
meta
.
RESTMapper
,
schema
validation
.
Schema
)
(
mapping
*
meta
.
RESTMapping
,
namespace
,
name
string
,
data
[]
byte
)
{
configData
,
err
:=
ReadConfigData
(
filename
)
configData
,
err
:=
ReadConfigData
(
filename
)
checkErr
(
err
)
checkErr
(
err
)
data
=
configData
data
=
configData
v
ersion
,
kind
,
err
:=
typer
.
DataVersionAndKind
(
data
)
objV
ersion
,
kind
,
err
:=
typer
.
DataVersionAndKind
(
data
)
checkErr
(
err
)
checkErr
(
err
)
// TODO: allow unversioned objects?
// TODO: allow unversioned objects?
if
len
(
v
ersion
)
==
0
{
if
len
(
objV
ersion
)
==
0
{
checkErr
(
fmt
.
Errorf
(
"the resource in the provided file has no apiVersion defined"
))
checkErr
(
fmt
.
Errorf
(
"the resource in the provided file has no apiVersion defined"
))
}
}
err
=
schema
.
ValidateBytes
(
data
)
err
=
schema
.
ValidateBytes
(
data
)
checkErr
(
err
)
checkErr
(
err
)
mapping
,
err
=
mapper
.
RESTMapping
(
version
,
kind
)
// decode using the version stored with the object (allows codec to vary across versions)
mapping
,
err
=
mapper
.
RESTMapping
(
kind
,
objVersion
)
checkErr
(
err
)
checkErr
(
err
)
obj
,
err
:=
mapping
.
Codec
.
Decode
(
data
)
obj
,
err
:=
mapping
.
Codec
.
Decode
(
data
)
...
@@ -308,6 +310,13 @@ func ResourceFromFile(filename string, typer runtime.ObjectTyper, mapper meta.RE
...
@@ -308,6 +310,13 @@ func ResourceFromFile(filename string, typer runtime.ObjectTyper, mapper meta.RE
name
,
err
=
meta
.
Name
(
obj
)
name
,
err
=
meta
.
Name
(
obj
)
checkErr
(
err
)
checkErr
(
err
)
// if the preferred API version differs, get a different mapper
version
:=
GetFlagString
(
cmd
,
"api-version"
)
if
version
!=
objVersion
{
mapping
,
err
=
mapper
.
RESTMapping
(
kind
,
version
)
checkErr
(
err
)
}
return
return
}
}
...
...
pkg/kubectl/cmd/update.go
View file @
99806167
...
@@ -45,7 +45,7 @@ Examples:
...
@@ -45,7 +45,7 @@ Examples:
}
}
schema
,
err
:=
f
.
Validator
(
cmd
)
schema
,
err
:=
f
.
Validator
(
cmd
)
checkErr
(
err
)
checkErr
(
err
)
mapping
,
namespace
,
name
,
data
:=
ResourceFromFile
(
filename
,
f
.
Typer
,
f
.
Mapper
,
schema
)
mapping
,
namespace
,
name
,
data
:=
ResourceFromFile
(
cmd
,
filename
,
f
.
Typer
,
f
.
Mapper
,
schema
)
client
,
err
:=
f
.
Client
(
cmd
,
mapping
)
client
,
err
:=
f
.
Client
(
cmd
,
mapping
)
checkErr
(
err
)
checkErr
(
err
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment