diff --git a/api/v1beta1/context_types.go b/api/v1beta1/context_types.go index 2fde92b..e34b48c 100644 --- a/api/v1beta1/context_types.go +++ b/api/v1beta1/context_types.go @@ -72,8 +72,7 @@ type Attachment struct { // ContextSpec defines the desired state of Context // +kubebuilder:validation:XValidation:message=only one of space or spaceId should be set,rule=has(self.spaceId) != has(self.space) type ContextSpec struct { - // +kubebuilder:validation:MinLength=1 - Name string `json:"name"` + Name *string `json:"name,omitempty"` // +kubebuilder:validation:MinLength=1 SpaceId *string `json:"spaceId,omitempty"` // +kubebuilder:validation:MinLength=1 @@ -104,6 +103,13 @@ type Context struct { Status ContextStatus `json:"status,omitempty"` } +func (c *Context) Name() string { + if c.Spec.Name != nil { + return *c.Spec.Name + } + return c.ObjectMeta.Name +} + func (c *Context) SetContext(context *models.Context) { if context.Id != "" { c.Status.Id = context.Id diff --git a/api/v1beta1/policy_types.go b/api/v1beta1/policy_types.go index 5d03b61..db66126 100644 --- a/api/v1beta1/policy_types.go +++ b/api/v1beta1/policy_types.go @@ -26,8 +26,7 @@ import ( // +kubebuilder:validation:XValidation:rule="(has(self.spaceName) != has(self.spaceId)) || (!has(self.spaceName) && !has(self.spaceId))",message="only one of spaceName or spaceId can be set" type PolicySpec struct { // Name of the policy - should be unique in one account - // +kubebuilder:validation:MinLength=1 - Name string `json:"name"` + Name *string `json:"name,omitempty"` // Body of the policy // +kubebuilder:validation:MinLength=1 Body string `json:"body"` @@ -66,6 +65,13 @@ type Policy struct { Status PolicyStatus `json:"status,omitempty"` } +func (p *Policy) Name() string { + if p.Spec.Name != nil { + return *p.Spec.Name + } + return p.ObjectMeta.Name +} + func (p *Policy) SetPolicy(policy models.Policy) { p.Status.Id = policy.Id } diff --git a/api/v1beta1/space_types.go b/api/v1beta1/space_types.go index 3e3c0db..f27e17f 100644 --- a/api/v1beta1/space_types.go +++ b/api/v1beta1/space_types.go @@ -25,9 +25,8 @@ import ( // SpaceSpec defines the desired state of space type SpaceSpec struct { // +kubebuilder:validation:MinLength=1 - ParentSpace string `json:"parentSpace"` - // +kubebuilder:validation:MinLength=1 - Name string `json:"name"` + ParentSpace string `json:"parentSpace"` + Name *string `json:"name,omitempty"` Description string `json:"description,omitempty"` InheritEntities bool `json:"inheritEntities,omitempty"` Labels *[]string `json:"labels,omitempty"` @@ -45,6 +44,13 @@ type Space struct { Status SpaceStatus `json:"status,omitempty"` } +func (s *Space) Name() string { + if s.Spec.Name != nil { + return *s.Spec.Name + } + return s.ObjectMeta.Name +} + func (s *Space) Ready() bool { return s.Status.Id != "" } diff --git a/api/v1beta1/stack_types.go b/api/v1beta1/stack_types.go index 8c1c96b..b1405df 100644 --- a/api/v1beta1/stack_types.go +++ b/api/v1beta1/stack_types.go @@ -28,8 +28,7 @@ type StackSpec struct { // +kubebuilder:validation:MinLength=1 CommitSHA *string `json:"commitSHA,omitempty"` - // +kubebuilder:validation:MinLength=1 - Name string `json:"name"` + Name *string `json:"name,omitempty"` SpaceName *string `json:"spaceName,omitempty"` SpaceId *string `json:"spaceId,omitempty"` AdditionalProjectGlobs *[]string `json:"additionalProjectGlobs,omitempty"` @@ -139,6 +138,13 @@ type Stack struct { Status StackStatus `json:"status,omitempty"` } +func (s *Stack) Name() string { + if s.Spec.Name != nil { + return *s.Spec.Name + } + return s.ObjectMeta.Name +} + func (s *Stack) Ready() bool { return s.Status.Id != "" } diff --git a/api/v1beta1/zz_generated.deepcopy.go b/api/v1beta1/zz_generated.deepcopy.go index b36a20c..f1aa377 100644 --- a/api/v1beta1/zz_generated.deepcopy.go +++ b/api/v1beta1/zz_generated.deepcopy.go @@ -192,6 +192,11 @@ func (in *ContextList) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ContextSpec) DeepCopyInto(out *ContextSpec) { *out = *in + if in.Name != nil { + in, out := &in.Name, &out.Name + *out = new(string) + **out = **in + } if in.SpaceId != nil { in, out := &in.SpaceId, &out.SpaceId *out = new(string) @@ -483,6 +488,11 @@ func (in *PolicyList) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PolicySpec) DeepCopyInto(out *PolicySpec) { *out = *in + if in.Name != nil { + in, out := &in.Name, &out.Name + *out = new(string) + **out = **in + } if in.Description != nil { in, out := &in.Description, &out.Description *out = new(string) @@ -706,6 +716,11 @@ func (in *SpaceList) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SpaceSpec) DeepCopyInto(out *SpaceSpec) { *out = *in + if in.Name != nil { + in, out := &in.Name, &out.Name + *out = new(string) + **out = **in + } if in.Labels != nil { in, out := &in.Labels, &out.Labels *out = new([]string) @@ -809,6 +824,11 @@ func (in *StackSpec) DeepCopyInto(out *StackSpec) { *out = new(string) **out = **in } + if in.Name != nil { + in, out := &in.Name, &out.Name + *out = new(string) + **out = **in + } if in.SpaceName != nil { in, out := &in.SpaceName, &out.SpaceName *out = new(string) diff --git a/config/crd/bases/app.spacelift.io_contexts.yaml b/config/crd/bases/app.spacelift.io_contexts.yaml index 151fc1b..63af7d7 100644 --- a/config/crd/bases/app.spacelift.io_contexts.yaml +++ b/config/crd/bases/app.spacelift.io_contexts.yaml @@ -184,7 +184,6 @@ spec: rule: has(self.valueFromSecret) != has(self.value) type: array name: - minLength: 1 type: string space: minLength: 1 @@ -192,8 +191,6 @@ spec: spaceId: minLength: 1 type: string - required: - - name type: object x-kubernetes-validations: - message: only one of space or spaceId should be set diff --git a/config/crd/bases/app.spacelift.io_policies.yaml b/config/crd/bases/app.spacelift.io_policies.yaml index 8961c24..db3e42b 100644 --- a/config/crd/bases/app.spacelift.io_policies.yaml +++ b/config/crd/bases/app.spacelift.io_policies.yaml @@ -55,7 +55,6 @@ spec: type: array name: description: Name of the policy - should be unique in one account - minLength: 1 type: string spaceId: description: SpaceId is ID (slug) of the space the policy is in @@ -82,7 +81,6 @@ spec: type: string required: - body - - name - type type: object x-kubernetes-validations: diff --git a/config/crd/bases/app.spacelift.io_spaces.yaml b/config/crd/bases/app.spacelift.io_spaces.yaml index ed2582a..fba47ed 100644 --- a/config/crd/bases/app.spacelift.io_spaces.yaml +++ b/config/crd/bases/app.spacelift.io_spaces.yaml @@ -43,13 +43,11 @@ spec: type: string type: array name: - minLength: 1 type: string parentSpace: minLength: 1 type: string required: - - name - parentSpace type: object status: diff --git a/config/crd/bases/app.spacelift.io_stacks.yaml b/config/crd/bases/app.spacelift.io_stacks.yaml index bc9e1c6..6075c3d 100644 --- a/config/crd/bases/app.spacelift.io_stacks.yaml +++ b/config/crd/bases/app.spacelift.io_stacks.yaml @@ -122,7 +122,6 @@ spec: description: In our API managesStateFile is not part of StackInput type: boolean name: - minLength: 1 type: string projectRoot: type: string @@ -221,7 +220,6 @@ spec: workerPool: type: string required: - - name - repository type: object x-kubernetes-validations: diff --git a/internal/controller/context_controller_test.go b/internal/controller/context_controller_test.go index 222e9fa..ffa9543 100644 --- a/internal/controller/context_controller_test.go +++ b/internal/controller/context_controller_test.go @@ -78,12 +78,11 @@ func (s *ContextControllerTestSuite) TestContextCreation_InvalidSpec() { }{ { Spec: v1beta1.ContextSpec{}, - Name: "empty spec, missing name and space or spaceId", - ExpectedErr: `Context.app.spacelift.io "invalid-context" is invalid: [spec.name: Invalid value: "": spec.name in body should be at least 1 chars long, spec: Invalid value: "object": only one of space or spaceId should be set]`, + Name: "empty spec, missing space or spaceId", + ExpectedErr: `Context.app.spacelift.io "invalid-context" is invalid: spec: Invalid value: "object": only one of space or spaceId should be set`, }, { Spec: v1beta1.ContextSpec{ - Name: "foobar", Space: utils.AddressOf("foobar"), SpaceId: utils.AddressOf("foobar"), }, @@ -92,15 +91,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_InvalidSpec() { }, { Spec: v1beta1.ContextSpec{ - Name: "", - Space: utils.AddressOf("foobar"), - }, - Name: "name empty string", - ExpectedErr: `Context.app.spacelift.io "invalid-context" is invalid: spec.name: Invalid value: "": spec.name in body should be at least 1 chars long`, - }, - { - Spec: v1beta1.ContextSpec{ - Name: "foobar", Space: utils.AddressOf(""), }, Name: "space empty string", @@ -108,7 +98,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_InvalidSpec() { }, { Spec: v1beta1.ContextSpec{ - Name: "foobar", SpaceId: utils.AddressOf(""), }, Name: "spaceId empty string", @@ -116,7 +105,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_InvalidSpec() { }, { Spec: v1beta1.ContextSpec{ - Name: "foobar", Space: utils.AddressOf("foobar"), Attachments: []v1beta1.Attachment{{}}, }, @@ -125,7 +113,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_InvalidSpec() { }, { Spec: v1beta1.ContextSpec{ - Name: "foobar", Space: utils.AddressOf("foobar"), Attachments: []v1beta1.Attachment{{ Stack: utils.AddressOf("foobar"), @@ -137,7 +124,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_InvalidSpec() { }, { Spec: v1beta1.ContextSpec{ - Name: "foobar", Space: utils.AddressOf("foobar"), Attachments: []v1beta1.Attachment{{ ModuleId: utils.AddressOf("foobar"), @@ -150,7 +136,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_InvalidSpec() { { Spec: v1beta1.ContextSpec{ - Name: "foobar", Space: utils.AddressOf("foobar"), Attachments: []v1beta1.Attachment{{ Stack: utils.AddressOf("foobar"), @@ -162,7 +147,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_InvalidSpec() { }, { Spec: v1beta1.ContextSpec{ - Name: "foobar", Space: utils.AddressOf("foobar"), Attachments: []v1beta1.Attachment{{ Stack: utils.AddressOf(""), @@ -173,7 +157,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_InvalidSpec() { }, { Spec: v1beta1.ContextSpec{ - Name: "foobar", Space: utils.AddressOf("foobar"), Attachments: []v1beta1.Attachment{{ StackId: utils.AddressOf(""), @@ -184,7 +167,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_InvalidSpec() { }, { Spec: v1beta1.ContextSpec{ - Name: "foobar", Space: utils.AddressOf("foobar"), Attachments: []v1beta1.Attachment{{ ModuleId: utils.AddressOf(""), @@ -195,7 +177,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_InvalidSpec() { }, { Spec: v1beta1.ContextSpec{ - Name: "foobar", Space: utils.AddressOf("foobar"), Environment: []v1beta1.Environment{ { @@ -209,7 +190,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_InvalidSpec() { }, { Spec: v1beta1.ContextSpec{ - Name: "foobar", Space: utils.AddressOf("foobar"), Environment: []v1beta1.Environment{ { @@ -224,7 +204,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_InvalidSpec() { }, { Spec: v1beta1.ContextSpec{ - Name: "foobar", Space: utils.AddressOf("foobar"), MountedFiles: []v1beta1.MountedFile{ { @@ -238,7 +217,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_InvalidSpec() { }, { Spec: v1beta1.ContextSpec{ - Name: "foobar", Space: utils.AddressOf("foobar"), MountedFiles: []v1beta1.MountedFile{ { @@ -286,7 +264,7 @@ func (s *ContextControllerTestSuite) TestContextCreation_UnableToCreateOnSpaceli s.Require().Never(func() bool { context, err := s.ContextRepo.Get(s.Context(), types.NamespacedName{ Namespace: context.Namespace, - Name: context.Name, + Name: context.ObjectMeta.Name, }) s.Require().NoError(err) return context.Status.Id != "" @@ -310,7 +288,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_OK_SpaceNotReady() { Namespace: "default", }, Spec: v1beta1.ContextSpec{ - Name: "test-context", Space: utils.AddressOf("test-space"), }, } @@ -362,11 +339,11 @@ func (s *ContextControllerTestSuite) TestContextCreation_OK_SpaceNotReady() { c, err = s.ContextRepo.Get(s.Context(), types.NamespacedName{ Namespace: c.Namespace, - Name: c.Name, + Name: c.ObjectMeta.Name, }) s.Require().NoError(err) s.Assert().Len(c.OwnerReferences, 1) - s.Assert().Equal(space.Name, c.OwnerReferences[0].Name) + s.Assert().Equal(space.ObjectMeta.Name, c.OwnerReferences[0].Name) s.Assert().Equal("Space", c.OwnerReferences[0].Kind) } @@ -381,7 +358,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_OK_AttachedStackNotRead Namespace: "default", }, Spec: v1beta1.ContextSpec{ - Name: "test-context", SpaceId: utils.AddressOf("test-space"), Attachments: []v1beta1.Attachment{ { @@ -452,7 +428,6 @@ func (s *ContextControllerTestSuite) TestContextCreation_OK_SecretNotReady() { Namespace: "default", }, Spec: v1beta1.ContextSpec{ - Name: "test-context", SpaceId: utils.AddressOf("test-space"), Environment: []v1beta1.Environment{ { @@ -553,7 +528,7 @@ func (s *ContextControllerTestSuite) TestContextCreation_OK() { Namespace: "default", }, Spec: v1beta1.ContextSpec{ - Name: "test-context", + Name: utils.AddressOf("test context new name"), SpaceId: utils.AddressOf("test-space"), }, } @@ -572,7 +547,7 @@ func (s *ContextControllerTestSuite) TestContextCreation_OK() { context, err = s.ContextRepo.Get(s.Context(), types.NamespacedName{ Namespace: context.Namespace, - Name: context.Name, + Name: context.ObjectMeta.Name, }) s.Require().NoError(err) s.Assert().Equal("test-context-id", context.Status.Id) @@ -599,7 +574,7 @@ func (s *ContextControllerTestSuite) TestContextUpdate_OK() { context, err = s.ContextRepo.Get(s.Context(), types.NamespacedName{ Namespace: context.Namespace, - Name: context.Name, + Name: context.ObjectMeta.Name, }) s.Require().NoError(err) s.Assert().Equal("test-context-id", context.Status.Id) diff --git a/internal/controller/policy_controller_test.go b/internal/controller/policy_controller_test.go index 76a487d..fca853a 100644 --- a/internal/controller/policy_controller_test.go +++ b/internal/controller/policy_controller_test.go @@ -68,18 +68,9 @@ func (s *PolicyControllerSuite) TestPolicyCreation_InvalidSpec() { Spec v1beta1.PolicySpec ExpectedErr string }{ - { - Name: "empty name", - Spec: v1beta1.PolicySpec{ - Body: "test", - Type: "ACCESS", - }, - ExpectedErr: `Policy.app.spacelift.io "invalid-policy" is invalid: spec.name: Invalid value: "": spec.name in body should be at least 1 chars long`, - }, { Name: "empty body", Spec: v1beta1.PolicySpec{ - Name: "test", Type: "ACCESS", }, ExpectedErr: `Policy.app.spacelift.io "invalid-policy" is invalid: spec.body: Invalid value: "": spec.body in body should be at least 1 chars long`, @@ -87,7 +78,6 @@ func (s *PolicyControllerSuite) TestPolicyCreation_InvalidSpec() { { Name: "empty type", Spec: v1beta1.PolicySpec{ - Name: "test", Body: "test", }, ExpectedErr: `Policy.app.spacelift.io "invalid-policy" is invalid: spec.type: Unsupported value: "": supported values: "ACCESS", "APPROVAL", "GIT_PUSH", "INITIALIZATION", "LOGIN", "PLAN", "TASK", "TRIGGER", "NOTIFICATION"`, @@ -95,7 +85,6 @@ func (s *PolicyControllerSuite) TestPolicyCreation_InvalidSpec() { { Name: "invalid type", Spec: v1beta1.PolicySpec{ - Name: "test", Body: "test", Type: "FOOBAR", }, @@ -104,7 +93,6 @@ func (s *PolicyControllerSuite) TestPolicyCreation_InvalidSpec() { { Name: "both stackName and stackId are set", Spec: v1beta1.PolicySpec{ - Name: "test", Body: "test", Type: "ACCESS", SpaceId: utils.AddressOf("space-id"), @@ -147,7 +135,7 @@ func (s *PolicyControllerSuite) TestPolicyCreation_UnableToCreateOnSpacelift() { s.Require().Never(func() bool { policy, err := s.PolicyRepo.Get(s.Context(), types.NamespacedName{ Namespace: policy.Namespace, - Name: policy.Name, + Name: policy.ObjectMeta.Name, }) s.Require().NoError(err) return policy.Status.Id != "" @@ -277,7 +265,7 @@ func (s *PolicyControllerSuite) TestPolicyCreation_OK() { policy, err = s.PolicyRepo.Get(s.Context(), types.NamespacedName{ Namespace: policy.Namespace, - Name: policy.Name, + Name: policy.ObjectMeta.Name, }) s.Require().NoError(err) s.Assert().Equal("test-policy-id", policy.Status.Id) @@ -303,7 +291,7 @@ func (s *PolicyControllerSuite) TestPolicyUpdate_OK() { policy, err = s.PolicyRepo.Get(s.Context(), types.NamespacedName{ Namespace: policy.Namespace, - Name: policy.Name, + Name: policy.ObjectMeta.Name, }) s.Require().NoError(err) s.Assert().Equal("test-policy-id", policy.Status.Id) diff --git a/internal/controller/space_controller_test.go b/internal/controller/space_controller_test.go index 19de515..5bcf5f2 100644 --- a/internal/controller/space_controller_test.go +++ b/internal/controller/space_controller_test.go @@ -61,16 +61,7 @@ func (s *SpaceControllerSuite) TestSpaceCreation_InvalidSpec() { ExpectedErr string }{ { - Spec: v1beta1.SpaceSpec{ - ParentSpace: "root", - }, - Name: "missing name", - ExpectedErr: `Space.app.spacelift.io "invalid-space" is invalid: spec.name: Invalid value: "": spec.name in body should be at least 1 chars long`, - }, - { - Spec: v1beta1.SpaceSpec{ - Name: "child-space", - }, + Spec: v1beta1.SpaceSpec{}, Name: "missing parentSpace", ExpectedErr: `Space.app.spacelift.io "invalid-space" is invalid: spec.parentSpace: Invalid value: "": spec.parentSpace in body should be at least 1 chars long`, }, @@ -110,7 +101,7 @@ func (s *SpaceControllerSuite) TestSpaceCreation_UnableToCreateOnSpacelift() { s.Require().Never(func() bool { space, err := s.SpaceRepo.Get(s.Context(), types.NamespacedName{ Namespace: space.Namespace, - Name: space.Name, + Name: space.ObjectMeta.Name, }) s.Require().NoError(err) return space.Status.Id != "" @@ -140,7 +131,7 @@ func (s *SpaceControllerSuite) TestSpaceCreation_Success() { s.Require().Eventually(func() bool { space, err := s.SpaceRepo.Get(s.Context(), types.NamespacedName{ Namespace: space.Namespace, - Name: space.Name, + Name: space.ObjectMeta.Name, }) s.Require().NoError(err) return space.Status.Id == "test-space-generated-id" @@ -175,7 +166,7 @@ func (s *SpaceControllerSuite) TestSpaceUpdate_UnableToUpdateOnSpacelift() { s.Require().Never(func() bool { space, err := s.SpaceRepo.Get(s.Context(), types.NamespacedName{ Namespace: space.Namespace, - Name: space.Name, + Name: space.ObjectMeta.Name, }) s.Require().NoError(err) return space.Status.Id != "" diff --git a/internal/controller/stack_controller.go b/internal/controller/stack_controller.go index 2a26638..d4995f3 100644 --- a/internal/controller/stack_controller.go +++ b/internal/controller/stack_controller.go @@ -120,7 +120,7 @@ func (r *StackReconciler) handleCreateStack(ctx context.Context, stack *v1beta1. } // Refetch the stack to get the latest state. - stack, err = r.StackRepository.Get(ctx, types.NamespacedName{Namespace: stack.Namespace, Name: stack.Name}) + stack, err = r.StackRepository.Get(ctx, types.NamespacedName{Namespace: stack.Namespace, Name: stack.ObjectMeta.Name}) if err != nil { logger.Error(err, "Unable to retrieve Stack from kube API.") return ctrl.Result{}, err diff --git a/internal/controller/stack_controller_test.go b/internal/controller/stack_controller_test.go index b918efa..442af29 100644 --- a/internal/controller/stack_controller_test.go +++ b/internal/controller/stack_controller_test.go @@ -68,14 +68,9 @@ func (s *StackControllerSuite) TestStackCreation_InvalidSpec() { ExpectedErr string }{ { - Spec: v1beta1.StackSpec{SpaceName: utils.AddressOf("space-name")}, - Name: "missing name", - ExpectedErr: `Stack.app.spacelift.io "invalid-stack" is invalid: spec.name: Invalid value: "": spec.name in body should be at least 1 chars long`, - }, - { - Spec: v1beta1.StackSpec{Name: "name"}, - Name: "missing space", - ExpectedErr: `Stack.app.spacelift.io "invalid-stack" is invalid: spec: Invalid value: "object": only one of spaceName or spaceId can be set`, + Spec: v1beta1.StackSpec{}, + Name: "missing spaceName/spaceId", + ExpectedErr: `Stack.app.spacelift.io "invalid-stack" is invalid: spec.settings: Invalid value: "object": only one of spaceName or spaceId can be set`, }, } @@ -113,7 +108,7 @@ func (s *StackControllerSuite) TestStackCreation_UnableToCreateOnSpacelift() { s.Require().Never(func() bool { stack, err := s.StackRepo.Get(s.Context(), types.NamespacedName{ Namespace: stack.Namespace, - Name: stack.Name, + Name: stack.ObjectMeta.Name, }) s.Require().NoError(err) return stack.Status.Id != "" @@ -143,7 +138,7 @@ func (s *StackControllerSuite) TestStackCreation_OK() { s.Require().Eventually(func() bool { stack, err := s.StackRepo.Get(s.Context(), types.NamespacedName{ Namespace: stack.Namespace, - Name: stack.Name, + Name: stack.ObjectMeta.Name, }) s.Require().NoError(err) return stack.Status.Id == "test-stack-generated-id" @@ -174,7 +169,6 @@ func (s *StackControllerSuite) TestStackCreation_OK_SpaceNotReady() { Namespace: "default", }, Spec: v1beta1.StackSpec{ - Name: "test-stack", Branch: utils.AddressOf("fake-branch"), Repository: "fake-repository", SpaceName: utils.AddressOf(spaceName), @@ -203,11 +197,10 @@ func (s *StackControllerSuite) TestStackCreation_OK_SpaceNotReady() { APIVersion: v1beta1.GroupVersion.String(), }, ObjectMeta: metav1.ObjectMeta{ - Name: "test-space1", + Name: spaceName, Namespace: "default", }, Spec: v1beta1.SpaceSpec{ - Name: spaceName, ParentSpace: "root", }, } @@ -239,11 +232,11 @@ func (s *StackControllerSuite) TestStackCreation_OK_SpaceNotReady() { stack, err = s.StackRepo.Get(s.Context(), types.NamespacedName{ Namespace: stack.Namespace, - Name: stack.Name, + Name: stack.ObjectMeta.Name, }) s.Require().NoError(err) s.Assert().Len(stack.OwnerReferences, 1) - s.Assert().Equal(space.Name, stack.OwnerReferences[0].Name) + s.Assert().Equal(space.ObjectMeta.Name, stack.OwnerReferences[0].Name) s.Assert().Equal("Space", stack.OwnerReferences[0].Kind) } @@ -271,7 +264,6 @@ func (s *StackControllerSuite) TestStackCreationWithSpaceName_OK() { Namespace: "default", }, Spec: v1beta1.StackSpec{ - Name: "test-stack", Branch: utils.AddressOf("fake-branch"), Repository: "fake-repository", SpaceName: utils.AddressOf(space.Name), @@ -286,7 +278,7 @@ func (s *StackControllerSuite) TestStackCreationWithSpaceName_OK() { s.Require().Eventually(func() bool { stack, err := s.StackRepo.Get(s.Context(), types.NamespacedName{ Namespace: stack.Namespace, - Name: stack.Name, + Name: stack.ObjectMeta.Name, }) s.Require().NoError(err) return stack.Status.Id == "test-stack-generated-id" @@ -321,7 +313,7 @@ func (s *StackControllerSuite) TestStackUpdate_UnableToUpdateOnSpacelift() { s.Require().Never(func() bool { stack, err := s.StackRepo.Get(s.Context(), types.NamespacedName{ Namespace: stack.Namespace, - Name: stack.Name, + Name: stack.ObjectMeta.Name, }) s.Require().NoError(err) return stack.Status.Id != "" diff --git a/internal/k8s/repository/stack_output.go b/internal/k8s/repository/stack_output.go index a9b4c4d..a1da0b8 100644 --- a/internal/k8s/repository/stack_output.go +++ b/internal/k8s/repository/stack_output.go @@ -29,7 +29,7 @@ func NewStackOutputRepository(client client.Client, scheme *runtime.Scheme, even } func (r *StackOutputRepository) UpdateOrCreateStackOutputSecret(ctx context.Context, stack *v1beta1.Stack, outputs []models.StackOutput) (*v1.Secret, error) { - secretName := "stack-output-" + stack.Name + secretName := "stack-output-" + stack.ObjectMeta.Name secret := &v1.Secret{ ObjectMeta: metav1.ObjectMeta{ Namespace: stack.Namespace, diff --git a/internal/spacelift/repository/context.go b/internal/spacelift/repository/context.go index e042f4f..8bf41e2 100644 --- a/internal/spacelift/repository/context.go +++ b/internal/spacelift/repository/context.go @@ -44,7 +44,7 @@ func (r *contextRepository) Create(ctx context.Context, context *v1beta1.Context } `graphql:"contextCreateV2(input: $input)"` } - contextInput, err := structs.FromContextSpec(context.Spec) + contextInput, err := structs.FromContextSpec(context) if err != nil { return nil, errors.Wrap(err, "unable to build context spec") } @@ -73,7 +73,7 @@ func (r *contextRepository) Update(ctx context.Context, context *v1beta1.Context } `graphql:"contextUpdateV2(id: $id, input: $input, replaceConfigElements: $replaceConfigElements)"` } - contextInput, err := structs.FromContextSpec(context.Spec) + contextInput, err := structs.FromContextSpec(context) if err != nil { return nil, errors.Wrap(err, "unable to build context spec") } diff --git a/internal/spacelift/repository/policy.go b/internal/spacelift/repository/policy.go index d29dc51..e1c0eba 100644 --- a/internal/spacelift/repository/policy.go +++ b/internal/spacelift/repository/policy.go @@ -75,7 +75,7 @@ func (r *policyRepository) Create(ctx context.Context, policy *v1beta1.Policy) ( var mutation policyCreateMutation creationVars := map[string]any{ - "name": graphql.String(policy.Spec.Name), + "name": graphql.String(policy.Name()), "body": graphql.String(policy.Spec.Body), "type": PolicyType(policy.Spec.Type), "labels": structs.GetGraphQLStrings(&policy.Spec.Labels), @@ -120,7 +120,7 @@ func (r *policyRepository) Update(ctx context.Context, policy *v1beta1.Policy) ( var updateMutation policyUpdateMutation updateVars := map[string]any{ "id": graphql.ID(policy.Status.Id), - "name": graphql.String(policy.Spec.Name), + "name": graphql.String(policy.Name()), "body": graphql.String(policy.Spec.Body), "labels": structs.GetGraphQLStrings(&policy.Spec.Labels), "space": (*graphql.ID)(nil), diff --git a/internal/spacelift/repository/policy_test.go b/internal/spacelift/repository/policy_test.go index b75407b..86d8175 100644 --- a/internal/spacelift/repository/policy_test.go +++ b/internal/spacelift/repository/policy_test.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/spacelift-io/spacelift-operator/api/v1beta1" @@ -26,8 +27,10 @@ func Test_policyRepository_Create(t *testing.T) { { name: "basic policy", policy: v1beta1.Policy{ - Spec: v1beta1.PolicySpec{ + ObjectMeta: v1.ObjectMeta{ Name: "name", + }, + Spec: v1beta1.PolicySpec{ Body: "body", Type: "PLAN", Labels: []string{ @@ -44,11 +47,37 @@ func Test_policyRepository_Create(t *testing.T) { "space": (*graphql.ID)(nil), }, }, + { + name: "basic policy with name", + policy: v1beta1.Policy{ + ObjectMeta: v1.ObjectMeta{ + Name: "name", + }, + Spec: v1beta1.PolicySpec{ + Name: utils.AddressOf("test name override"), + Body: "body", + Type: "PLAN", + Labels: []string{ + "label1", + "label2", + }, + }, + }, + expectedVars: map[string]any{ + "name": graphql.String("test name override"), + "body": graphql.String("body"), + "type": PolicyType("PLAN"), + "labels": structs.GetGraphQLStrings(&[]string{"label1", "label2"}), + "space": (*graphql.ID)(nil), + }, + }, { name: "basic policy with space", policy: v1beta1.Policy{ + ObjectMeta: v1.ObjectMeta{ + Name: "name", + }, Spec: v1beta1.PolicySpec{ - Name: "name", Body: "body", Type: "PLAN", SpaceId: utils.AddressOf("space-1"), @@ -66,8 +95,10 @@ func Test_policyRepository_Create(t *testing.T) { { name: "policy with space to attach", policy: v1beta1.Policy{ + ObjectMeta: v1.ObjectMeta{ + Name: "name", + }, Spec: v1beta1.PolicySpec{ - Name: "name", Body: "body", Type: "PLAN", SpaceId: utils.AddressOf("space-1"), @@ -145,8 +176,10 @@ func Test_policyRepository_Create_WithAttachedStacks(t *testing.T) { ).Once().Return(nil) policy := v1beta1.Policy{ + ObjectMeta: v1.ObjectMeta{ + Name: "name", + }, Spec: v1beta1.PolicySpec{ - Name: "name", Body: "body", Type: "PLAN", AttachedStacksIds: []string{"stack-id-1", "stack-id-2"}, @@ -166,8 +199,10 @@ func Test_policyRepository_Update(t *testing.T) { { name: "basic policy", policy: v1beta1.Policy{ - Spec: v1beta1.PolicySpec{ + ObjectMeta: v1.ObjectMeta{ Name: "name", + }, + Spec: v1beta1.PolicySpec{ Body: "body", Type: "PLAN", Labels: []string{ @@ -187,11 +222,40 @@ func Test_policyRepository_Update(t *testing.T) { "space": (*graphql.ID)(nil), }, }, + { + name: "basic policy with name", + policy: v1beta1.Policy{ + ObjectMeta: v1.ObjectMeta{ + Name: "name", + }, + Spec: v1beta1.PolicySpec{ + Name: utils.AddressOf("test name override"), + Body: "body", + Type: "PLAN", + Labels: []string{ + "label1", + "label2", + }, + }, + Status: v1beta1.PolicyStatus{ + Id: "policy-id", + }, + }, + expectedVars: map[string]any{ + "id": graphql.ID("policy-id"), + "name": graphql.String("test name override"), + "body": graphql.String("body"), + "labels": structs.GetGraphQLStrings(&[]string{"label1", "label2"}), + "space": (*graphql.ID)(nil), + }, + }, { name: "basic policy with space", policy: v1beta1.Policy{ + ObjectMeta: v1.ObjectMeta{ + Name: "name", + }, Spec: v1beta1.PolicySpec{ - Name: "name", Body: "body", Type: "PLAN", SpaceId: utils.AddressOf("space-1"), @@ -212,8 +276,10 @@ func Test_policyRepository_Update(t *testing.T) { { name: "policy with space to attach", policy: v1beta1.Policy{ + ObjectMeta: v1.ObjectMeta{ + Name: "name", + }, Spec: v1beta1.PolicySpec{ - Name: "name", Body: "body", Type: "PLAN", SpaceId: utils.AddressOf("space-1"), @@ -313,8 +379,10 @@ func Test_policyRepository_Update_WithAttachedStacks(t *testing.T) { ).Once().Return(nil) policy := v1beta1.Policy{ + ObjectMeta: v1.ObjectMeta{ + Name: "name", + }, Spec: v1beta1.PolicySpec{ - Name: "name", Body: "body", Type: "PLAN", AttachedStacksIds: []string{"stack-id-3"}, @@ -371,8 +439,10 @@ func Test_policyRepository_Update_DetachAllStacks(t *testing.T) { // stack-id-2 should not be detached because it is autoattached policy := v1beta1.Policy{ + ObjectMeta: v1.ObjectMeta{ + Name: "name", + }, Spec: v1beta1.PolicySpec{ - Name: "name", Body: "body", Type: "PLAN", AttachedStacksIds: []string{}, diff --git a/internal/spacelift/repository/space.go b/internal/spacelift/repository/space.go index 5e6aef9..a6fe22b 100644 --- a/internal/spacelift/repository/space.go +++ b/internal/spacelift/repository/space.go @@ -42,7 +42,7 @@ func (r *spaceRepository) Create(ctx context.Context, space *v1beta1.Space) (*mo } `graphql:"spaceCreate(input: $input)"` } - spaceCreationVars := map[string]any{"input": structs.FromSpaceSpec(space.Spec)} + spaceCreationVars := map[string]any{"input": structs.FromSpaceSpec(space)} if err := c.Mutate(ctx, &mutation, spaceCreationVars); err != nil { return nil, errors.Wrap(err, "unable to create space") @@ -68,7 +68,7 @@ func (r *spaceRepository) Update(ctx context.Context, space *v1beta1.Space) (*mo spaceUpdateVars := map[string]any{ "space": graphql.ID(space.Status.Id), - "input": structs.FromSpaceSpec(space.Spec), + "input": structs.FromSpaceSpec(space), } if err := c.Mutate(ctx, &spaceUpdateMutation, spaceUpdateVars); err != nil { diff --git a/internal/spacelift/repository/stack.go b/internal/spacelift/repository/stack.go index f488f32..17ac364 100644 --- a/internal/spacelift/repository/stack.go +++ b/internal/spacelift/repository/stack.go @@ -48,7 +48,7 @@ func (r *stackRepository) Create(ctx context.Context, stack *v1beta1.Stack) (*mo } `graphql:"stackCreate(input: $input, manageState: $manageState)"` } - stackInput := structs.FromStackSpec(stack.Spec) + stackInput := structs.FromStackSpec(stack) stackCreateMutationVars := map[string]interface{}{ "input": stackInput, "manageState": graphql.Boolean(true), @@ -118,9 +118,9 @@ func (r *stackRepository) Update(ctx context.Context, stack *v1beta1.Stack) (*mo } `graphql:"stackUpdate(id: $id, input: $input)"` } - stackInput := structs.FromStackSpec(stack.Spec) + stackInput := structs.FromStackSpec(stack) vars := map[string]interface{}{ - "id": slug.SafeSlug(stack.Spec.Name), + "id": slug.SafeSlug(stack.Name()), "input": stackInput, } @@ -151,7 +151,7 @@ func (r *stackRepository) Get(ctx context.Context, stack *v1beta1.Stack) (*model } `graphql:"stack(id: $stackId)"` } vars := map[string]any{ - "stackId": graphql.ID(slug.SafeSlug(stack.Spec.Name)), + "stackId": graphql.ID(slug.SafeSlug(stack.Name())), } if err := c.Query(ctx, &query, vars); err != nil { return nil, errors.Wrap(err, "unable to get stack") diff --git a/internal/spacelift/repository/structs/context_input.go b/internal/spacelift/repository/structs/context_input.go index 18b6fa3..7da4515 100644 --- a/internal/spacelift/repository/structs/context_input.go +++ b/internal/spacelift/repository/structs/context_input.go @@ -50,9 +50,10 @@ type ContextInput struct { ConfigAttachments []ConfigAttachments `json:"configAttachments"` } -func FromContextSpec(spec v1beta1.ContextSpec) (*ContextInput, error) { +func FromContextSpec(c *v1beta1.Context) (*ContextInput, error) { + spec := c.Spec input := ContextInput{ - Name: spec.Name, + Name: c.Name(), Space: *spec.SpaceId, } if spec.Description != nil { diff --git a/internal/spacelift/repository/structs/space_input.go b/internal/spacelift/repository/structs/space_input.go index ccc0942..6c803e8 100644 --- a/internal/spacelift/repository/structs/space_input.go +++ b/internal/spacelift/repository/structs/space_input.go @@ -14,9 +14,10 @@ type SpaceInput struct { Labels *[]graphql.String `json:"labels"` } -func FromSpaceSpec(spec v1beta1.SpaceSpec) SpaceInput { +func FromSpaceSpec(s *v1beta1.Space) SpaceInput { + spec := s.Spec return SpaceInput{ - Name: graphql.String(spec.Name), + Name: graphql.String(s.Name()), Description: graphql.String(spec.Description), InheritEntities: graphql.Boolean(spec.InheritEntities), ParentSpace: graphql.String(spec.ParentSpace), diff --git a/internal/spacelift/repository/structs/stack_input.go b/internal/spacelift/repository/structs/stack_input.go index 1b771ec..6b54b32 100644 --- a/internal/spacelift/repository/structs/stack_input.go +++ b/internal/spacelift/repository/structs/stack_input.go @@ -94,7 +94,8 @@ type TerraformInput struct { ExternalStateAccessEnabled *graphql.Boolean `json:"externalStateAccessEnabled"` } -func FromStackSpec(stackSpec v1beta1.StackSpec) StackInput { +func FromStackSpec(stack *v1beta1.Stack) StackInput { + stackSpec := stack.Spec administrative := getGraphQLBoolean(stackSpec.Administrative) if administrative == nil { administrative = graphql.NewBoolean(false) @@ -120,7 +121,7 @@ func FromStackSpec(stackSpec v1beta1.StackSpec) StackInput { Branch: branch, GitHubActionDeploy: getGraphQLBoolean(stackSpec.GitHubActionDeploy), LocalPreviewEnabled: getGraphQLBoolean(stackSpec.LocalPreviewEnabled), - Name: graphql.String(stackSpec.Name), + Name: graphql.String(stack.Name()), ProtectFromDeletion: getGraphQLBoolean(stackSpec.ProtectFromDeletion), Namespace: getGraphQLString(namespace), Repository: graphql.String(repo), diff --git a/tests/integration/context_suite.go b/tests/integration/context_suite.go index 24c9206..e317b90 100644 --- a/tests/integration/context_suite.go +++ b/tests/integration/context_suite.go @@ -23,7 +23,6 @@ var DefaultValidContext = v1beta1.Context{ Namespace: "default", }, Spec: v1beta1.ContextSpec{ - Name: "test-context", SpaceId: utils.AddressOf("test-space-id"), }, } @@ -44,7 +43,7 @@ func (s *WithContextSuiteHelper) CreateTestContext() (*v1beta1.Context, error) { func (s *WithContextSuiteHelper) WaitUntilContextExists(context *v1beta1.Context) bool { return s.Eventually(func() bool { st := &v1beta1.Context{} - err := s.Client().Get(s.Context(), types.NamespacedName{Namespace: context.Namespace, Name: context.Name}, st) + err := s.Client().Get(s.Context(), types.NamespacedName{Namespace: context.Namespace, Name: context.ObjectMeta.Name}, st) return err == nil }, DefaultTimeout, DefaultInterval) } @@ -58,7 +57,7 @@ func (s *WithContextSuiteHelper) DeleteContext(context *v1beta1.Context) { func (s *WithContextSuiteHelper) WaitUntilContextRemoved(context *v1beta1.Context) bool { return s.Eventually(func() bool { st := &v1beta1.Context{} - err := s.Client().Get(s.Context(), types.NamespacedName{Namespace: context.Namespace, Name: context.Name}, st) + err := s.Client().Get(s.Context(), types.NamespacedName{Namespace: context.Namespace, Name: context.ObjectMeta.Name}, st) return k8sErrors.IsNotFound(err) }, DefaultTimeout, DefaultInterval) } diff --git a/tests/integration/policy_suite.go b/tests/integration/policy_suite.go index 98129ee..77f7aaa 100644 --- a/tests/integration/policy_suite.go +++ b/tests/integration/policy_suite.go @@ -16,7 +16,6 @@ var DefaultValidPolicy = v1beta1.Policy{ Namespace: "default", }, Spec: v1beta1.PolicySpec{ - Name: "test policy", Body: "package spacelift", Type: "PLAN", }, diff --git a/tests/integration/run_suite.go b/tests/integration/run_suite.go index d8cd23a..3d53385 100644 --- a/tests/integration/run_suite.go +++ b/tests/integration/run_suite.go @@ -40,7 +40,7 @@ func (s *WithRunSuiteHelper) CreateRun(run *v1beta1.Run) error { stackName := run.Spec.StackName s.FakeSpaceliftRunRepo.EXPECT(). Create(mock.Anything, mock.MatchedBy(func(r *v1beta1.Stack) bool { - return r.Name == stackName + return r.ObjectMeta.Name == stackName })). Once(). Return(&models.Run{ diff --git a/tests/integration/space_suite.go b/tests/integration/space_suite.go index 876b870..69371a3 100644 --- a/tests/integration/space_suite.go +++ b/tests/integration/space_suite.go @@ -23,7 +23,6 @@ func (s *WithSpaceSuiteHelper) CreateTestSpace() (*v1beta1.Space, error) { Namespace: "default", }, Spec: v1beta1.SpaceSpec{ - Name: "test-space", ParentSpace: "root", }, } @@ -64,7 +63,7 @@ func (s *WithSpaceSuiteHelper) DeleteSpace(space *v1beta1.Space) { func (s *WithSpaceSuiteHelper) WaitUntilSpaceRemoved(space *v1beta1.Space) { s.Eventually(func() bool { st := &v1beta1.Space{} - err := s.Client().Get(s.Context(), types.NamespacedName{Name: space.Name, Namespace: space.Namespace}, st) + err := s.Client().Get(s.Context(), types.NamespacedName{Name: space.ObjectMeta.Name, Namespace: space.Namespace}, st) return k8sErrors.IsNotFound(err) }, DefaultTimeout, DefaultInterval) } diff --git a/tests/integration/stack_suite.go b/tests/integration/stack_suite.go index 33f8080..606408c 100644 --- a/tests/integration/stack_suite.go +++ b/tests/integration/stack_suite.go @@ -24,7 +24,6 @@ var DefaultValidStack = v1beta1.Stack{ Namespace: "default", }, Spec: v1beta1.StackSpec{ - Name: "test-stack", Branch: utils.AddressOf("fake-branch"), Repository: "fake-repository", SpaceId: utils.AddressOf("fake-space"), @@ -66,7 +65,7 @@ func (s *WithStackSuiteHelper) CreateStack(stack *v1beta1.Stack) (*v1beta1.Stack func (s *WithStackSuiteHelper) WaitUntilStackExists(stack *v1beta1.Stack) bool { return s.Eventually(func() bool { st := &v1beta1.Stack{} - err := s.Client().Get(s.Context(), types.NamespacedName{Namespace: stack.Namespace, Name: stack.Name}, st) + err := s.Client().Get(s.Context(), types.NamespacedName{Namespace: stack.Namespace, Name: stack.ObjectMeta.Name}, st) return err == nil }, DefaultTimeout, DefaultInterval) } @@ -80,7 +79,7 @@ func (s *WithStackSuiteHelper) DeleteStack(stack *v1beta1.Stack) { func (s *WithStackSuiteHelper) WaitUntilStackRemoved(stack *v1beta1.Stack) bool { return s.Eventually(func() bool { st := &v1beta1.Stack{} - err := s.Client().Get(s.Context(), types.NamespacedName{Namespace: stack.Namespace, Name: stack.Name}, st) + err := s.Client().Get(s.Context(), types.NamespacedName{Namespace: stack.Namespace, Name: stack.ObjectMeta.Name}, st) return k8sErrors.IsNotFound(err) }, DefaultTimeout, DefaultInterval) } @@ -89,7 +88,7 @@ func (s *WithStackSuiteHelper) GetStackOutput(stack *v1beta1.Stack) (*v1.Secret, secret := &v1.Secret{} if err := s.Client().Get(s.Context(), types.NamespacedName{ Namespace: stack.Namespace, - Name: "stack-output-" + stack.Name, + Name: "stack-output-" + stack.ObjectMeta.Name, }, secret); err != nil { return nil, err }