Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,13 @@ spec:
description: OpenStackDataPlaneDeploymentSpec defines the desired state
of OpenStackDataPlaneDeployment
properties:
ansibleEEEnvConfigMapName:
description: |-
AnsibleEEEnvConfigMapName is the name of the ConfigMap containing environment
variables to inject into the Ansible Execution Environment pod.
If not specified, defaults to "openstack-aee-default-env".
maxLength: 253
type: string
ansibleExtraVars:
description: AnsibleExtraVars for ansible execution
x-kubernetes-preserve-unknown-fields: true
Expand Down
3 changes: 3 additions & 0 deletions api/dataplane/v1beta1/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,4 +198,7 @@ type AnsibleEESpec struct {
// the ansible execution run with. Without specifying, it will run with
// default serviceaccount
ServiceAccountName string
// AnsibleEEEnvConfigMapName is the name of ConfigMap containing environment
// variables to inject to the Ansible execution environment pod.
AnsibleEEEnvConfigMapName string `json:"ansibleEEEnvConfigMapName,omitempty"`
}
7 changes: 7 additions & 0 deletions api/dataplane/v1beta1/openstackdataplanedeployment_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,13 @@ type OpenStackDataPlaneDeploymentSpec struct {
// +kubebuilder:validation:Optional
// AnsibleJobNodeSelector to target subset of worker nodes running the ansible jobs
AnsibleJobNodeSelector map[string]string `json:"ansibleJobNodeSelector,omitempty"`

// +kubebuilder:validation:Optional
// +kubebuilder:validation:MaxLength:=253
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could set a kubebuilder:default here, so that the value is defaulted automatically to openstack-aee-default-env. You could get rid of the check in ansible_execution.go at line 68.

// AnsibleEEEnvConfigMapName is the name of the ConfigMap containing environment
// variables to inject into the Ansible Execution Environment pod.
// If not specified, defaults to "openstack-aee-default-env".
AnsibleEEEnvConfigMapName string `json:"ansibleEEEnvConfigMapName,omitempty"`
}

// OpenStackDataPlaneDeploymentStatus defines the observed state of OpenStackDataPlaneDeployment
Expand Down
8 changes: 4 additions & 4 deletions api/dataplane/v1beta1/openstackdataplanenodeset_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,10 +205,10 @@ func (instance *OpenStackDataPlaneNodeSet) InitConditions() {
// GetAnsibleEESpec - get the fields that will be passed to AEE Job
func (instance OpenStackDataPlaneNodeSet) GetAnsibleEESpec() AnsibleEESpec {
return AnsibleEESpec{
NetworkAttachments: instance.Spec.NetworkAttachments,
ExtraMounts: instance.Spec.NodeTemplate.ExtraMounts,
Env: instance.Spec.Env,
ServiceAccountName: instance.Name,
NetworkAttachments: instance.Spec.NetworkAttachments,
ExtraMounts: instance.Spec.NodeTemplate.ExtraMounts,
Env: instance.Spec.Env,
ServiceAccountName: instance.Name,
}
}

Expand Down
7 changes: 7 additions & 0 deletions bindata/crds/crds.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17144,6 +17144,13 @@ spec:
description: OpenStackDataPlaneDeploymentSpec defines the desired state
of OpenStackDataPlaneDeployment
properties:
ansibleEEEnvConfigMapName:
description: |-
AnsibleEEEnvConfigMapName is the name of the ConfigMap containing environment
variables to inject into the Ansible Execution Environment pod.
If not specified, defaults to "openstack-aee-default-env".
maxLength: 253
type: string
ansibleExtraVars:
description: AnsibleExtraVars for ansible execution
x-kubernetes-preserve-unknown-fields: true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,13 @@ spec:
description: OpenStackDataPlaneDeploymentSpec defines the desired state
of OpenStackDataPlaneDeployment
properties:
ansibleEEEnvConfigMapName:
description: |-
AnsibleEEEnvConfigMapName is the name of the ConfigMap containing environment
variables to inject into the Ansible Execution Environment pod.
If not specified, defaults to "openstack-aee-default-env".
maxLength: 253
type: string
ansibleExtraVars:
description: AnsibleExtraVars for ansible execution
x-kubernetes-preserve-unknown-fields: true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,7 @@ func (r *OpenStackDataPlaneDeploymentReconciler) Reconcile(ctx context.Context,
ansibleEESpec.AnsibleSkipTags = instance.Spec.AnsibleSkipTags
ansibleEESpec.AnsibleLimit = instance.Spec.AnsibleLimit
ansibleEESpec.ExtraVars = instance.Spec.AnsibleExtraVars
ansibleEESpec.AnsibleEEEnvConfigMapName = instance.Spec.AnsibleEEEnvConfigMapName

if nodeSet.Status.DNSClusterAddresses != nil && nodeSet.Status.CtlplaneSearchDomain != "" {
ansibleEESpec.DNSConfig = &corev1.PodDNSConfig{
Expand Down
8 changes: 7 additions & 1 deletion internal/dataplane/util/ansible_execution.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,17 @@ func AnsibleExecution(
return nil
}

// Use Deployment's ansibleEEEnvConfigMapName if set, otherwise default
envConfigMapName := aeeSpec.AnsibleEEEnvConfigMapName
if envConfigMapName == "" {
envConfigMapName = "openstack-aee-default-env"
}

ansibleEE := EEJob{
Name: executionName,
Namespace: deployment.GetNamespace(),
Labels: labels,
EnvConfigMapName: "openstack-aee-default-env",
EnvConfigMapName: envConfigMapName,
}

ansibleEE.NetworkAttachments = aeeSpec.NetworkAttachments
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,8 @@ func (v *OpenStackDataPlaneDeploymentCustomValidator) ValidateCreate(_ context.C
if !ok {
return nil, fmt.Errorf("expected a OpenStackDataPlaneDeployment object but got %T", obj)
}
openstackdataplanedeploymentlog.Info("Validation for OpenStackDataPlaneDeployment upon creation", "name", openstackdataplanedeployment.GetName())
openstackdataplanedeploymentlog.Info("Validation for OpenStackDataPlaneDeployment upon creation", "name",
openstackdataplanedeployment.GetName())

// Call the ValidateCreate method on the OpenStackDataPlaneDeployment type
return openstackdataplanedeployment.ValidateCreate()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1811,4 +1811,74 @@ var _ = Describe("Dataplane NodeSet Test", func() {
})
})
})

When("A Deployment is created without specifying ansibleEEEnvConfigMapName", func() {
BeforeEach(func() {
nodeSetSpec := DefaultDataPlaneNodeSetSpec("edpm-compute")
nodeSetSpec["preProvisioned"] = true
nodeSetSpec["services"] = []string{"bootstrap"}

DeferCleanup(th.DeleteInstance, CreateNetConfig(dataplaneNetConfigName, DefaultNetConfigSpec()))
DeferCleanup(th.DeleteInstance, CreateDNSMasq(dnsMasqName, DefaultDNSMasqSpec()))
DeferCleanup(th.DeleteInstance, CreateDataplaneNodeSet(dataplaneNodeSetName, nodeSetSpec))
DeferCleanup(th.DeleteInstance, CreateDataplaneDeployment(dataplaneDeploymentName, DefaultDataPlaneDeploymentSpec()))
CreateSSHSecret(dataplaneSSHSecretName)
CreateCABundleSecret(caBundleSecretName)
SimulateDNSMasqComplete(dnsMasqName)
SimulateIPSetComplete(dataplaneNodeName)
SimulateDNSDataComplete(dataplaneNodeSetName)
})

It("Should use default openstack-aee-default-env ConfigMap in the Job", func() {
Eventually(func(g Gomega) {
ansibleeeName := types.NamespacedName{
Name: fmt.Sprintf("bootstrap-%s-%s", dataplaneDeploymentName.Name, dataplaneNodeSetName.Name),
Namespace: namespace,
}
ansibleEE := GetAnsibleee(ansibleeeName)

// Verify EnvFrom references the default ConfigMap
g.Expect(ansibleEE.Spec.Template.Spec.Containers[0].EnvFrom).To(HaveLen(1))
g.Expect(ansibleEE.Spec.Template.Spec.Containers[0].EnvFrom[0].ConfigMapRef).NotTo(BeNil())
g.Expect(ansibleEE.Spec.Template.Spec.Containers[0].EnvFrom[0].ConfigMapRef.LocalObjectReference.Name).To(Equal("openstack-aee-default-env"))
g.Expect(*ansibleEE.Spec.Template.Spec.Containers[0].EnvFrom[0].ConfigMapRef.Optional).To(BeTrue())
}, th.Timeout, th.Interval).Should(Succeed())
})
})

When("A Deployment specifies custom ansibleEEEnvConfigMapName", func() {
BeforeEach(func() {
nodeSetSpec := DefaultDataPlaneNodeSetSpec("edpm-compute")
nodeSetSpec["preProvisioned"] = true
nodeSetSpec["services"] = []string{"bootstrap"}

deploymentSpec := DefaultDataPlaneDeploymentSpec()
deploymentSpec["ansibleEEEnvConfigMapName"] = "custom-deployment-env"

DeferCleanup(th.DeleteInstance, CreateNetConfig(dataplaneNetConfigName, DefaultNetConfigSpec()))
DeferCleanup(th.DeleteInstance, CreateDNSMasq(dnsMasqName, DefaultDNSMasqSpec()))
DeferCleanup(th.DeleteInstance, CreateDataplaneNodeSet(dataplaneNodeSetName, nodeSetSpec))
DeferCleanup(th.DeleteInstance, CreateDataplaneDeployment(dataplaneDeploymentName, deploymentSpec))
CreateSSHSecret(dataplaneSSHSecretName)
CreateCABundleSecret(caBundleSecretName)
SimulateDNSMasqComplete(dnsMasqName)
SimulateIPSetComplete(dataplaneNodeName)
SimulateDNSDataComplete(dataplaneNodeSetName)
})

It("Should use Deployment's custom ConfigMap name in the Job", func() {
Eventually(func(g Gomega) {
ansibleeeName := types.NamespacedName{
Name: fmt.Sprintf("bootstrap-%s-%s", dataplaneDeploymentName.Name, dataplaneNodeSetName.Name),
Namespace: namespace,
}
ansibleEE := GetAnsibleee(ansibleeeName)

// Verify EnvFrom references the Deployment's custom ConfigMap
g.Expect(ansibleEE.Spec.Template.Spec.Containers[0].EnvFrom).To(HaveLen(1))
g.Expect(ansibleEE.Spec.Template.Spec.Containers[0].EnvFrom[0].ConfigMapRef).NotTo(BeNil())
g.Expect(ansibleEE.Spec.Template.Spec.Containers[0].EnvFrom[0].ConfigMapRef.LocalObjectReference.Name).To(Equal("custom-deployment-env"))
}, th.Timeout, th.Interval).Should(Succeed())
})
})
})