mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-14 21:53:52 +00:00
Make kubectl create use dynamic clients
This commit is contained in:
@@ -27,6 +27,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/kubectl"
|
"k8s.io/kubernetes/pkg/kubectl"
|
||||||
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/resource"
|
"k8s.io/kubernetes/pkg/kubectl/resource"
|
||||||
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CreateOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of
|
// CreateOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of
|
||||||
@@ -107,8 +108,11 @@ func RunCreate(f *cmdutil.Factory, cmd *cobra.Command, out io.Writer, options *C
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd))
|
mapper, typer, err := f.UnstructuredObject()
|
||||||
r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)).
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), runtime.UnstructuredJSONScheme).
|
||||||
Schema(schema).
|
Schema(schema).
|
||||||
ContinueOnError().
|
ContinueOnError().
|
||||||
NamespaceParam(cmdNamespace).DefaultNamespace().
|
NamespaceParam(cmdNamespace).DefaultNamespace().
|
||||||
|
@@ -21,6 +21,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"k8s.io/kubernetes/pkg/client/typed/dynamic"
|
||||||
"k8s.io/kubernetes/pkg/client/unversioned/fake"
|
"k8s.io/kubernetes/pkg/client/unversioned/fake"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -40,14 +41,15 @@ func TestCreateObject(t *testing.T) {
|
|||||||
_, _, rc := testData()
|
_, _, rc := testData()
|
||||||
rc.Items[0].Name = "redis-master-controller"
|
rc.Items[0].Name = "redis-master-controller"
|
||||||
|
|
||||||
f, tf, codec, ns := NewAPIFactory()
|
f, tf, codec, _ := NewAPIFactory()
|
||||||
|
ns := dynamic.ContentConfig().NegotiatedSerializer
|
||||||
tf.Printer = &testPrinter{}
|
tf.Printer = &testPrinter{}
|
||||||
tf.Client = &fake.RESTClient{
|
tf.Client = &fake.RESTClient{
|
||||||
NegotiatedSerializer: ns,
|
NegotiatedSerializer: ns,
|
||||||
Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
|
Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
|
||||||
switch p, m := req.URL.Path, req.Method; {
|
switch p, m := req.URL.Path, req.Method; {
|
||||||
case p == "/namespaces/test/replicationcontrollers" && m == "POST":
|
case p == "/namespaces/test/replicationcontrollers" && m == http.MethodPost:
|
||||||
return &http.Response{StatusCode: 201, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil
|
return &http.Response{StatusCode: http.StatusCreated, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil
|
||||||
default:
|
default:
|
||||||
t.Fatalf("unexpected request: %#v\n%#v", req.URL, req)
|
t.Fatalf("unexpected request: %#v\n%#v", req.URL, req)
|
||||||
return nil, nil
|
return nil, nil
|
||||||
@@ -72,16 +74,17 @@ func TestCreateMultipleObject(t *testing.T) {
|
|||||||
initTestErrorHandler(t)
|
initTestErrorHandler(t)
|
||||||
_, svc, rc := testData()
|
_, svc, rc := testData()
|
||||||
|
|
||||||
f, tf, codec, ns := NewAPIFactory()
|
f, tf, codec, _ := NewAPIFactory()
|
||||||
|
ns := dynamic.ContentConfig().NegotiatedSerializer
|
||||||
tf.Printer = &testPrinter{}
|
tf.Printer = &testPrinter{}
|
||||||
tf.Client = &fake.RESTClient{
|
tf.Client = &fake.RESTClient{
|
||||||
NegotiatedSerializer: ns,
|
NegotiatedSerializer: ns,
|
||||||
Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
|
Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
|
||||||
switch p, m := req.URL.Path, req.Method; {
|
switch p, m := req.URL.Path, req.Method; {
|
||||||
case p == "/namespaces/test/services" && m == "POST":
|
case p == "/namespaces/test/services" && m == http.MethodPost:
|
||||||
return &http.Response{StatusCode: 201, Header: defaultHeader(), Body: objBody(codec, &svc.Items[0])}, nil
|
return &http.Response{StatusCode: http.StatusCreated, Header: defaultHeader(), Body: objBody(codec, &svc.Items[0])}, nil
|
||||||
case p == "/namespaces/test/replicationcontrollers" && m == "POST":
|
case p == "/namespaces/test/replicationcontrollers" && m == http.MethodPost:
|
||||||
return &http.Response{StatusCode: 201, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil
|
return &http.Response{StatusCode: http.StatusCreated, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil
|
||||||
default:
|
default:
|
||||||
t.Fatalf("unexpected request: %#v\n%#v", req.URL, req)
|
t.Fatalf("unexpected request: %#v\n%#v", req.URL, req)
|
||||||
return nil, nil
|
return nil, nil
|
||||||
@@ -108,14 +111,15 @@ func TestCreateDirectory(t *testing.T) {
|
|||||||
_, _, rc := testData()
|
_, _, rc := testData()
|
||||||
rc.Items[0].Name = "name"
|
rc.Items[0].Name = "name"
|
||||||
|
|
||||||
f, tf, codec, ns := NewAPIFactory()
|
f, tf, codec, _ := NewAPIFactory()
|
||||||
|
ns := dynamic.ContentConfig().NegotiatedSerializer
|
||||||
tf.Printer = &testPrinter{}
|
tf.Printer = &testPrinter{}
|
||||||
tf.Client = &fake.RESTClient{
|
tf.Client = &fake.RESTClient{
|
||||||
NegotiatedSerializer: ns,
|
NegotiatedSerializer: ns,
|
||||||
Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
|
Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
|
||||||
switch p, m := req.URL.Path, req.Method; {
|
switch p, m := req.URL.Path, req.Method; {
|
||||||
case p == "/namespaces/test/replicationcontrollers" && m == "POST":
|
case p == "/namespaces/test/replicationcontrollers" && m == http.MethodPost:
|
||||||
return &http.Response{StatusCode: 201, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil
|
return &http.Response{StatusCode: http.StatusCreated, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil
|
||||||
default:
|
default:
|
||||||
t.Fatalf("unexpected request: %#v\n%#v", req.URL, req)
|
t.Fatalf("unexpected request: %#v\n%#v", req.URL, req)
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@@ -33,6 +33,7 @@ import (
|
|||||||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
"k8s.io/kubernetes/pkg/client/restclient"
|
"k8s.io/kubernetes/pkg/client/restclient"
|
||||||
|
"k8s.io/kubernetes/pkg/client/typed/discovery"
|
||||||
"k8s.io/kubernetes/pkg/client/unversioned/fake"
|
"k8s.io/kubernetes/pkg/client/unversioned/fake"
|
||||||
"k8s.io/kubernetes/pkg/runtime"
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
"k8s.io/kubernetes/pkg/runtime/serializer"
|
"k8s.io/kubernetes/pkg/runtime/serializer"
|
||||||
@@ -89,6 +90,26 @@ func testData() (*api.PodList, *api.ServiceList, *api.ReplicationControllerList)
|
|||||||
return pods, svc, rc
|
return pods, svc, rc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testDynamicResources() []*discovery.APIGroupResources {
|
||||||
|
return []*discovery.APIGroupResources{
|
||||||
|
{
|
||||||
|
Group: unversioned.APIGroup{
|
||||||
|
Versions: []unversioned.GroupVersionForDiscovery{
|
||||||
|
{Version: "v1"},
|
||||||
|
},
|
||||||
|
PreferredVersion: unversioned.GroupVersionForDiscovery{Version: "v1"},
|
||||||
|
},
|
||||||
|
VersionedResources: map[string][]unversioned.APIResource{
|
||||||
|
"v1": {
|
||||||
|
{Name: "pods", Namespaced: true, Kind: "Pod"},
|
||||||
|
{Name: "services", Namespaced: true, Kind: "Service"},
|
||||||
|
{Name: "replicationcontrollers", Namespaced: true, Kind: "ReplicationController"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func testComponentStatusData() *api.ComponentStatusList {
|
func testComponentStatusData() *api.ComponentStatusList {
|
||||||
good := api.ComponentStatus{
|
good := api.ComponentStatus{
|
||||||
Conditions: []api.ComponentCondition{
|
Conditions: []api.ComponentCondition{
|
||||||
|
Reference in New Issue
Block a user