From 7a3891e5f8819456b355750c0603e48da35b895b Mon Sep 17 00:00:00 2001 From: Max Forbes Date: Thu, 16 Jul 2015 12:02:12 -0700 Subject: [PATCH] Add ServiceAccount as an alias for ServiceAccountName --- api/swagger-spec/v1.json | 4 + pkg/api/v1/conversion.go | 137 ++++++++++++++++++++++++++++- pkg/api/v1/conversion_generated.go | 126 -------------------------- pkg/api/v1/conversion_test.go | 46 ++++++++++ pkg/api/v1/deep_copy_generated.go | 1 + pkg/api/v1/types.go | 2 + 6 files changed, 189 insertions(+), 127 deletions(-) diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index 898acae6da..40fbea0dfa 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -12417,6 +12417,10 @@ "type": "string", "description": "name of the ServiceAccount to use to run this pod; see http://releases.k8s.io/HEAD/docs/service_accounts.md" }, + "serviceAccount": { + "type": "string", + "description": "deprecated; use serviceAccountName instead" + }, "nodeName": { "type": "string", "description": "node requested for this pod" diff --git a/pkg/api/v1/conversion.go b/pkg/api/v1/conversion.go index 7f4863ae52..d1b0afb8dd 100644 --- a/pkg/api/v1/conversion.go +++ b/pkg/api/v1/conversion.go @@ -27,8 +27,10 @@ import ( func addConversionFuncs() { // Add non-generated conversion functions err := api.Scheme.AddConversionFuncs( - convert_v1_ReplicationControllerSpec_To_api_ReplicationControllerSpec, + convert_api_PodSpec_To_v1_PodSpec, convert_api_ReplicationControllerSpec_To_v1_ReplicationControllerSpec, + convert_v1_PodSpec_To_api_PodSpec, + convert_v1_ReplicationControllerSpec_To_api_ReplicationControllerSpec, ) if err != nil { // If one of the conversion functions is malformed, detect it immediately. @@ -223,3 +225,136 @@ func convert_v1_ReplicationControllerSpec_To_api_ReplicationControllerSpec(in *R } return nil } + +// The following two PodSpec conversions are done here to support ServiceAccount +// as an alias for ServiceAccountName. +func convert_api_PodSpec_To_v1_PodSpec(in *api.PodSpec, out *PodSpec, s conversion.Scope) error { + if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { + defaulting.(func(*api.PodSpec))(in) + } + if in.Volumes != nil { + out.Volumes = make([]Volume, len(in.Volumes)) + for i := range in.Volumes { + if err := convert_api_Volume_To_v1_Volume(&in.Volumes[i], &out.Volumes[i], s); err != nil { + return err + } + } + } else { + out.Volumes = nil + } + if in.Containers != nil { + out.Containers = make([]Container, len(in.Containers)) + for i := range in.Containers { + if err := convert_api_Container_To_v1_Container(&in.Containers[i], &out.Containers[i], s); err != nil { + return err + } + } + } else { + out.Containers = nil + } + out.RestartPolicy = RestartPolicy(in.RestartPolicy) + if in.TerminationGracePeriodSeconds != nil { + out.TerminationGracePeriodSeconds = new(int64) + *out.TerminationGracePeriodSeconds = *in.TerminationGracePeriodSeconds + } else { + out.TerminationGracePeriodSeconds = nil + } + if in.ActiveDeadlineSeconds != nil { + out.ActiveDeadlineSeconds = new(int64) + *out.ActiveDeadlineSeconds = *in.ActiveDeadlineSeconds + } else { + out.ActiveDeadlineSeconds = nil + } + out.DNSPolicy = DNSPolicy(in.DNSPolicy) + if in.NodeSelector != nil { + out.NodeSelector = make(map[string]string) + for key, val := range in.NodeSelector { + out.NodeSelector[key] = val + } + } else { + out.NodeSelector = nil + } + out.ServiceAccountName = in.ServiceAccountName + // DeprecatedServiceAccount is an alias for ServiceAccountName. + out.DeprecatedServiceAccount = in.ServiceAccountName + out.NodeName = in.NodeName + out.HostNetwork = in.HostNetwork + if in.ImagePullSecrets != nil { + out.ImagePullSecrets = make([]LocalObjectReference, len(in.ImagePullSecrets)) + for i := range in.ImagePullSecrets { + if err := convert_api_LocalObjectReference_To_v1_LocalObjectReference(&in.ImagePullSecrets[i], &out.ImagePullSecrets[i], s); err != nil { + return err + } + } + } else { + out.ImagePullSecrets = nil + } + return nil +} + +func convert_v1_PodSpec_To_api_PodSpec(in *PodSpec, out *api.PodSpec, s conversion.Scope) error { + if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { + defaulting.(func(*PodSpec))(in) + } + if in.Volumes != nil { + out.Volumes = make([]api.Volume, len(in.Volumes)) + for i := range in.Volumes { + if err := convert_v1_Volume_To_api_Volume(&in.Volumes[i], &out.Volumes[i], s); err != nil { + return err + } + } + } else { + out.Volumes = nil + } + if in.Containers != nil { + out.Containers = make([]api.Container, len(in.Containers)) + for i := range in.Containers { + if err := convert_v1_Container_To_api_Container(&in.Containers[i], &out.Containers[i], s); err != nil { + return err + } + } + } else { + out.Containers = nil + } + out.RestartPolicy = api.RestartPolicy(in.RestartPolicy) + if in.TerminationGracePeriodSeconds != nil { + out.TerminationGracePeriodSeconds = new(int64) + *out.TerminationGracePeriodSeconds = *in.TerminationGracePeriodSeconds + } else { + out.TerminationGracePeriodSeconds = nil + } + if in.ActiveDeadlineSeconds != nil { + out.ActiveDeadlineSeconds = new(int64) + *out.ActiveDeadlineSeconds = *in.ActiveDeadlineSeconds + } else { + out.ActiveDeadlineSeconds = nil + } + out.DNSPolicy = api.DNSPolicy(in.DNSPolicy) + if in.NodeSelector != nil { + out.NodeSelector = make(map[string]string) + for key, val := range in.NodeSelector { + out.NodeSelector[key] = val + } + } else { + out.NodeSelector = nil + } + // We support DeprecatedServiceAccount as an alias for ServiceAccountName. + // If both are specified, ServiceAccountName (the new field) wins. + out.ServiceAccountName = in.ServiceAccountName + if in.ServiceAccountName == "" { + out.ServiceAccountName = in.DeprecatedServiceAccount + } + out.NodeName = in.NodeName + out.HostNetwork = in.HostNetwork + if in.ImagePullSecrets != nil { + out.ImagePullSecrets = make([]api.LocalObjectReference, len(in.ImagePullSecrets)) + for i := range in.ImagePullSecrets { + if err := convert_v1_LocalObjectReference_To_api_LocalObjectReference(&in.ImagePullSecrets[i], &out.ImagePullSecrets[i], s); err != nil { + return err + } + } + } else { + out.ImagePullSecrets = nil + } + return nil +} diff --git a/pkg/api/v1/conversion_generated.go b/pkg/api/v1/conversion_generated.go index 91b2b6849c..d98300aba2 100644 --- a/pkg/api/v1/conversion_generated.go +++ b/pkg/api/v1/conversion_generated.go @@ -1472,68 +1472,6 @@ func convert_api_PodProxyOptions_To_v1_PodProxyOptions(in *api.PodProxyOptions, return nil } -func convert_api_PodSpec_To_v1_PodSpec(in *api.PodSpec, out *PodSpec, s conversion.Scope) error { - if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { - defaulting.(func(*api.PodSpec))(in) - } - if in.Volumes != nil { - out.Volumes = make([]Volume, len(in.Volumes)) - for i := range in.Volumes { - if err := convert_api_Volume_To_v1_Volume(&in.Volumes[i], &out.Volumes[i], s); err != nil { - return err - } - } - } else { - out.Volumes = nil - } - if in.Containers != nil { - out.Containers = make([]Container, len(in.Containers)) - for i := range in.Containers { - if err := convert_api_Container_To_v1_Container(&in.Containers[i], &out.Containers[i], s); err != nil { - return err - } - } - } else { - out.Containers = nil - } - out.RestartPolicy = RestartPolicy(in.RestartPolicy) - if in.TerminationGracePeriodSeconds != nil { - out.TerminationGracePeriodSeconds = new(int64) - *out.TerminationGracePeriodSeconds = *in.TerminationGracePeriodSeconds - } else { - out.TerminationGracePeriodSeconds = nil - } - if in.ActiveDeadlineSeconds != nil { - out.ActiveDeadlineSeconds = new(int64) - *out.ActiveDeadlineSeconds = *in.ActiveDeadlineSeconds - } else { - out.ActiveDeadlineSeconds = nil - } - out.DNSPolicy = DNSPolicy(in.DNSPolicy) - if in.NodeSelector != nil { - out.NodeSelector = make(map[string]string) - for key, val := range in.NodeSelector { - out.NodeSelector[key] = val - } - } else { - out.NodeSelector = nil - } - out.ServiceAccountName = in.ServiceAccountName - out.NodeName = in.NodeName - out.HostNetwork = in.HostNetwork - if in.ImagePullSecrets != nil { - out.ImagePullSecrets = make([]LocalObjectReference, len(in.ImagePullSecrets)) - for i := range in.ImagePullSecrets { - if err := convert_api_LocalObjectReference_To_v1_LocalObjectReference(&in.ImagePullSecrets[i], &out.ImagePullSecrets[i], s); err != nil { - return err - } - } - } else { - out.ImagePullSecrets = nil - } - return nil -} - func convert_api_PodStatus_To_v1_PodStatus(in *api.PodStatus, out *PodStatus, s conversion.Scope) error { if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { defaulting.(func(*api.PodStatus))(in) @@ -3784,68 +3722,6 @@ func convert_v1_PodProxyOptions_To_api_PodProxyOptions(in *PodProxyOptions, out return nil } -func convert_v1_PodSpec_To_api_PodSpec(in *PodSpec, out *api.PodSpec, s conversion.Scope) error { - if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { - defaulting.(func(*PodSpec))(in) - } - if in.Volumes != nil { - out.Volumes = make([]api.Volume, len(in.Volumes)) - for i := range in.Volumes { - if err := convert_v1_Volume_To_api_Volume(&in.Volumes[i], &out.Volumes[i], s); err != nil { - return err - } - } - } else { - out.Volumes = nil - } - if in.Containers != nil { - out.Containers = make([]api.Container, len(in.Containers)) - for i := range in.Containers { - if err := convert_v1_Container_To_api_Container(&in.Containers[i], &out.Containers[i], s); err != nil { - return err - } - } - } else { - out.Containers = nil - } - out.RestartPolicy = api.RestartPolicy(in.RestartPolicy) - if in.TerminationGracePeriodSeconds != nil { - out.TerminationGracePeriodSeconds = new(int64) - *out.TerminationGracePeriodSeconds = *in.TerminationGracePeriodSeconds - } else { - out.TerminationGracePeriodSeconds = nil - } - if in.ActiveDeadlineSeconds != nil { - out.ActiveDeadlineSeconds = new(int64) - *out.ActiveDeadlineSeconds = *in.ActiveDeadlineSeconds - } else { - out.ActiveDeadlineSeconds = nil - } - out.DNSPolicy = api.DNSPolicy(in.DNSPolicy) - if in.NodeSelector != nil { - out.NodeSelector = make(map[string]string) - for key, val := range in.NodeSelector { - out.NodeSelector[key] = val - } - } else { - out.NodeSelector = nil - } - out.ServiceAccountName = in.ServiceAccountName - out.NodeName = in.NodeName - out.HostNetwork = in.HostNetwork - if in.ImagePullSecrets != nil { - out.ImagePullSecrets = make([]api.LocalObjectReference, len(in.ImagePullSecrets)) - for i := range in.ImagePullSecrets { - if err := convert_v1_LocalObjectReference_To_api_LocalObjectReference(&in.ImagePullSecrets[i], &out.ImagePullSecrets[i], s); err != nil { - return err - } - } - } else { - out.ImagePullSecrets = nil - } - return nil -} - func convert_v1_PodStatus_To_api_PodStatus(in *PodStatus, out *api.PodStatus, s conversion.Scope) error { if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { defaulting.(func(*PodStatus))(in) @@ -4725,7 +4601,6 @@ func init() { convert_api_PodList_To_v1_PodList, convert_api_PodLogOptions_To_v1_PodLogOptions, convert_api_PodProxyOptions_To_v1_PodProxyOptions, - convert_api_PodSpec_To_v1_PodSpec, convert_api_PodStatusResult_To_v1_PodStatusResult, convert_api_PodStatus_To_v1_PodStatus, convert_api_PodTemplateList_To_v1_PodTemplateList, @@ -4838,7 +4713,6 @@ func init() { convert_v1_PodList_To_api_PodList, convert_v1_PodLogOptions_To_api_PodLogOptions, convert_v1_PodProxyOptions_To_api_PodProxyOptions, - convert_v1_PodSpec_To_api_PodSpec, convert_v1_PodStatusResult_To_api_PodStatusResult, convert_v1_PodStatus_To_api_PodStatus, convert_v1_PodTemplateList_To_api_PodTemplateList, diff --git a/pkg/api/v1/conversion_test.go b/pkg/api/v1/conversion_test.go index 8611567e11..519915dc03 100644 --- a/pkg/api/v1/conversion_test.go +++ b/pkg/api/v1/conversion_test.go @@ -45,3 +45,49 @@ func TestNodeConversion(t *testing.T) { t.Fatalf("unexpected error: %v", err) } } + +// TestPodSpecConversion tests that ServiceAccount is an alias for +// ServiceAccountName. +func TestPodSpecConversion(t *testing.T) { + name, other := "foo", "bar" + + // Test internal -> v1. Should have both alias (DeprecatedServiceAccount) + // and new field (ServiceAccountName). + i := &api.PodSpec{ + ServiceAccountName: name, + } + v := versioned.PodSpec{} + if err := api.Scheme.Convert(i, &v); err != nil { + t.Fatalf("unexpected error: %v", err) + } + if v.ServiceAccountName != name { + t.Fatalf("want v1.ServiceAccountName %q, got %q", name, v.ServiceAccountName) + } + if v.DeprecatedServiceAccount != name { + t.Fatalf("want v1.DeprecatedServiceAccount %q, got %q", name, v.DeprecatedServiceAccount) + } + + // Test v1 -> internal. Either DeprecatedServiceAccount, ServiceAccountName, + // or both should translate to ServiceAccountName. ServiceAccountName wins + // if both are set. + testCases := []*versioned.PodSpec{ + // New + {ServiceAccountName: name}, + // Alias + {DeprecatedServiceAccount: name}, + // Both: same + {ServiceAccountName: name, DeprecatedServiceAccount: name}, + // Both: different + {ServiceAccountName: name, DeprecatedServiceAccount: other}, + } + for k, v := range testCases { + got := api.PodSpec{} + err := api.Scheme.Convert(v, &got) + if err != nil { + t.Fatalf("unexpected error for case %d: %v", k, err) + } + if got.ServiceAccountName != name { + t.Fatalf("want api.ServiceAccountName %q, got %q", name, got.ServiceAccountName) + } + } +} diff --git a/pkg/api/v1/deep_copy_generated.go b/pkg/api/v1/deep_copy_generated.go index 950bbb683d..b61b2cdce3 100644 --- a/pkg/api/v1/deep_copy_generated.go +++ b/pkg/api/v1/deep_copy_generated.go @@ -1311,6 +1311,7 @@ func deepCopy_v1_PodSpec(in PodSpec, out *PodSpec, c *conversion.Cloner) error { out.NodeSelector = nil } out.ServiceAccountName = in.ServiceAccountName + out.DeprecatedServiceAccount = in.DeprecatedServiceAccount out.NodeName = in.NodeName out.HostNetwork = in.HostNetwork if in.ImagePullSecrets != nil { diff --git a/pkg/api/v1/types.go b/pkg/api/v1/types.go index ffbe8faaa9..4e6447733c 100644 --- a/pkg/api/v1/types.go +++ b/pkg/api/v1/types.go @@ -877,6 +877,8 @@ type PodSpec struct { // ServiceAccountName is the name of the ServiceAccount to use to run this pod ServiceAccountName string `json:"serviceAccountName,omitempty" description:"name of the ServiceAccount to use to run this pod; see http://releases.k8s.io/HEAD/docs/service_accounts.md"` + // DeprecatedServiceAccount is a depreciated alias for ServiceAccountName. + DeprecatedServiceAccount string `json:"serviceAccount,omitempty" description:"deprecated; use serviceAccountName instead"` // NodeName is a request to schedule this pod onto a specific node. If it is non-empty, // the scheduler simply schedules this pod onto that node, assuming that it fits resource