diff --git a/examples/examples_test.go b/examples/examples_test.go index 0e0f9e5bdeb..c30e8934159 100644 --- a/examples/examples_test.go +++ b/examples/examples_test.go @@ -29,6 +29,8 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/validation" + "k8s.io/kubernetes/pkg/apis/experimental" + expValidation "k8s.io/kubernetes/pkg/apis/experimental/validation" "k8s.io/kubernetes/pkg/capabilities" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/yaml" @@ -99,6 +101,11 @@ func validateObject(obj runtime.Object) (errors []error) { t.Namespace = api.NamespaceDefault } errors = validation.ValidateResourceQuota(t) + case *experimental.Deployment: + if t.Namespace == "" { + t.Namespace = api.NamespaceDefault + } + errors = expValidation.ValidateDeployment(t) default: return []error{fmt.Errorf("no validation defined for %#v", obj)} } @@ -343,6 +350,9 @@ func TestExampleObjectSchemas(t *testing.T) { "../examples/fibre_channel": { "fc": &api.Pod{}, }, + "../examples/experimental": { + "deployment": &experimental.Deployment{}, + }, } capabilities.SetForTests(capabilities.Capabilities{ @@ -369,7 +379,11 @@ func TestExampleObjectSchemas(t *testing.T) { } //TODO: Add validate method for &schedulerapi.Policy } else { - if err := testapi.Default.Codec().DecodeInto(data, expectedType); err != nil { + codec, err := testapi.GetCodecForObject(expectedType) + if err != nil { + t.Errorf("Could not get codec for %s: %s", expectedType, err) + } + if err := codec.DecodeInto(data, expectedType); err != nil { t.Errorf("%s did not decode correctly: %v\n%s", path, err, string(data)) return } diff --git a/examples/experimental/deployment.yaml b/examples/experimental/deployment.yaml new file mode 100644 index 00000000000..19bbfe32a97 --- /dev/null +++ b/examples/experimental/deployment.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Deployment +metadata: + name: nginx-deployment + labels: + name: nginx-deployment +spec: + replicas: 3 + selector: + name: nginx + template: + metadata: + labels: + name: nginx + spec: + containers: + - name: nginx + image: nginx + ports: + - containerPort: 80 diff --git a/pkg/api/testapi/testapi.go b/pkg/api/testapi/testapi.go index 8bd0248d7e5..bbf0c9265c7 100644 --- a/pkg/api/testapi/testapi.go +++ b/pkg/api/testapi/testapi.go @@ -22,6 +22,7 @@ import ( "os" "strings" + "k8s.io/kubernetes/pkg/api" _ "k8s.io/kubernetes/pkg/api/install" _ "k8s.io/kubernetes/pkg/apis/experimental/install" @@ -208,3 +209,21 @@ func (g TestGroup) ResourcePath(resource, namespace, name string) string { func (g TestGroup) RESTMapper() meta.RESTMapper { return latest.GroupOrDie(g.Group).RESTMapper } + +// Get codec based on runtime.Object +func GetCodecForObject(obj runtime.Object) (runtime.Codec, error) { + _, kind, err := api.Scheme.ObjectVersionAndKind(obj) + if err != nil { + return nil, fmt.Errorf("unexpected encoding error: %v", err) + } + // TODO: caesarxuchao: we should detect which group an object belongs to + // by using the version returned by Schem.ObjectVersionAndKind() once we + // split the schemes for internal objects. + // TODO: caesarxuchao: we should add a map from kind to group in Scheme. + for _, group := range Groups { + if api.Scheme.Recognizes(group.GroupAndVersion(), kind) { + return group.Codec(), nil + } + } + return nil, fmt.Errorf("unexpected kind: %v", kind) +}