mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-10-31 05:40:42 +00:00 
			
		
		
		
	Merge pull request #22009 from aveshagarwal/master-create-urls-issue
Fix kubectl create to create to all resources in a url.
This commit is contained in:
		| @@ -1502,6 +1502,29 @@ __EOF__ | |||||||
|     kubectl delete -f "${file}" "${kube_flags[@]}" |     kubectl delete -f "${file}" "${kube_flags[@]}" | ||||||
|   done |   done | ||||||
|  |  | ||||||
|  |   ############################# | ||||||
|  |   # Multiple Resources via URL# | ||||||
|  |   ############################# | ||||||
|  |  | ||||||
|  |   # Pre-condition: no service (other than default kubernetes services) or replication controller exists | ||||||
|  |   kube::test::get_object_assert services "{{range.items}}{{$id_field}}:{{end}}" 'kubernetes:' | ||||||
|  |   kube::test::get_object_assert rc "{{range.items}}{{$id_field}}:{{end}}" '' | ||||||
|  |  | ||||||
|  |   # Command | ||||||
|  |   kubectl create -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/hack/testdata/multi-resource-yaml.yaml "${kube_flags[@]}" | ||||||
|  |  | ||||||
|  |   # Post-condition: service(mock) and rc(mock) exist | ||||||
|  |   kube::test::get_object_assert services "{{range.items}}{{$id_field}}:{{end}}" 'kubernetes:mock:' | ||||||
|  |   kube::test::get_object_assert rc "{{range.items}}{{$id_field}}:{{end}}" 'mock:' | ||||||
|  |  | ||||||
|  |   # Clean up | ||||||
|  |   kubectl delete -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/hack/testdata/multi-resource-yaml.yaml "${kube_flags[@]}" | ||||||
|  |  | ||||||
|  |   # Post-condition: no service (other than default kubernetes services) or replication controller exists | ||||||
|  |   kube::test::get_object_assert services "{{range.items}}{{$id_field}}:{{end}}" 'kubernetes:' | ||||||
|  |   kube::test::get_object_assert rc "{{range.items}}{{$id_field}}:{{end}}" '' | ||||||
|  |  | ||||||
|  |  | ||||||
|   ###################### |   ###################### | ||||||
|   # Persistent Volumes # |   # Persistent Volumes # | ||||||
|   ###################### |   ###################### | ||||||
|   | |||||||
| @@ -126,9 +126,8 @@ func (b *Builder) FilenameParam(enforceNamespace bool, paths ...string) *Builder | |||||||
| func (b *Builder) URL(urls ...*url.URL) *Builder { | func (b *Builder) URL(urls ...*url.URL) *Builder { | ||||||
| 	for _, u := range urls { | 	for _, u := range urls { | ||||||
| 		b.paths = append(b.paths, &URLVisitor{ | 		b.paths = append(b.paths, &URLVisitor{ | ||||||
| 			Mapper: b.mapper, |  | ||||||
| 			URL:           u, | 			URL:           u, | ||||||
| 			Schema: b.schema, | 			StreamVisitor: NewStreamVisitor(nil, b.mapper, u.String(), b.schema), | ||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
| 	return b | 	return b | ||||||
|   | |||||||
| @@ -316,25 +316,31 @@ func TestURLBuilder(t *testing.T) { | |||||||
| 	s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { | 	s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { | ||||||
| 		w.WriteHeader(http.StatusOK) | 		w.WriteHeader(http.StatusOK) | ||||||
| 		w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &api.Pod{ObjectMeta: api.ObjectMeta{Namespace: "foo", Name: "test"}}))) | 		w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &api.Pod{ObjectMeta: api.ObjectMeta{Namespace: "foo", Name: "test"}}))) | ||||||
|  | 		w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &api.Pod{ObjectMeta: api.ObjectMeta{Namespace: "foo", Name: "test1"}}))) | ||||||
| 	})) | 	})) | ||||||
| 	// TODO: Uncomment when fix #19254 | 	// TODO: Uncomment when fix #19254 | ||||||
| 	// defer s.Close() | 	// defer s.Close() | ||||||
|  |  | ||||||
| 	b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). | 	b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). | ||||||
| 		FilenameParam(false, s.URL). | 		FilenameParam(false, s.URL). | ||||||
| 		NamespaceParam("test") | 		NamespaceParam("foo") | ||||||
|  |  | ||||||
| 	test := &testVisitor{} | 	test := &testVisitor{} | ||||||
| 	singular := false |  | ||||||
|  |  | ||||||
| 	err := b.Do().IntoSingular(&singular).Visit(test.Handle) | 	err := b.Do().Visit(test.Handle) | ||||||
| 	if err != nil || !singular || len(test.Infos) != 1 { | 	if err != nil || len(test.Infos) != 2 { | ||||||
| 		t.Fatalf("unexpected response: %v %t %#v", err, singular, test.Infos) | 		t.Fatalf("unexpected response: %v %#v", err, test.Infos) | ||||||
| 	} | 	} | ||||||
| 	info := test.Infos[0] | 	info := test.Infos[0] | ||||||
| 	if info.Name != "test" || info.Namespace != "foo" || info.Object == nil { | 	if info.Name != "test" || info.Namespace != "foo" || info.Object == nil { | ||||||
| 		t.Errorf("unexpected info: %#v", info) | 		t.Errorf("unexpected info: %#v", info) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	info = test.Infos[1] | ||||||
|  | 	if info.Name != "test1" || info.Namespace != "foo" || info.Object == nil { | ||||||
|  | 		t.Errorf("unexpected info: %#v", info) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestURLBuilderRequireNamespace(t *testing.T) { | func TestURLBuilderRequireNamespace(t *testing.T) { | ||||||
|   | |||||||
| @@ -20,7 +20,6 @@ import ( | |||||||
| 	"bytes" | 	"bytes" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" | 	"io" | ||||||
| 	"io/ioutil" |  | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"os" | 	"os" | ||||||
| @@ -219,9 +218,8 @@ func ValidateSchema(data []byte, schema validation.Schema) error { | |||||||
| // URLVisitor downloads the contents of a URL, and if successful, returns | // URLVisitor downloads the contents of a URL, and if successful, returns | ||||||
| // an info object representing the downloaded object. | // an info object representing the downloaded object. | ||||||
| type URLVisitor struct { | type URLVisitor struct { | ||||||
| 	*Mapper |  | ||||||
| 	URL *url.URL | 	URL *url.URL | ||||||
| 	Schema validation.Schema | 	*StreamVisitor | ||||||
| } | } | ||||||
|  |  | ||||||
| func (v *URLVisitor) Visit(fn VisitorFunc) error { | func (v *URLVisitor) Visit(fn VisitorFunc) error { | ||||||
| @@ -233,18 +231,9 @@ func (v *URLVisitor) Visit(fn VisitorFunc) error { | |||||||
| 	if res.StatusCode != 200 { | 	if res.StatusCode != 200 { | ||||||
| 		return fmt.Errorf("unable to read URL %q, server reported %d %s", v.URL, res.StatusCode, res.Status) | 		return fmt.Errorf("unable to read URL %q, server reported %d %s", v.URL, res.StatusCode, res.Status) | ||||||
| 	} | 	} | ||||||
| 	data, err := ioutil.ReadAll(res.Body) |  | ||||||
| 	if err != nil { | 	v.StreamVisitor.Reader = res.Body | ||||||
| 		return fmt.Errorf("unable to read URL %q: %v\n", v.URL, err) | 	return v.StreamVisitor.Visit(fn) | ||||||
| 	} |  | ||||||
| 	if err := ValidateSchema(data, v.Schema); err != nil { |  | ||||||
| 		return fmt.Errorf("error validating %q: %v", v.URL, err) |  | ||||||
| 	} |  | ||||||
| 	info, err := v.Mapper.InfoForData(data, v.URL.String()) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	return fn(info, nil) |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // DecoratedVisitor will invoke the decorators in order prior to invoking the visitor function | // DecoratedVisitor will invoke the decorators in order prior to invoking the visitor function | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user