Skip to content

Commit 3139895

Browse files
committed
WIP - move ports out of instance
1 parent a873934 commit 3139895

15 files changed

+819
-617
lines changed

api/v1alpha5/conversion.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,3 +437,14 @@ func Convert_v1alpha5_OpenStackClusterStatus_To_v1alpha7_OpenStackClusterStatus(
437437
func Convert_v1alpha7_OpenStackMachineSpec_To_v1alpha5_OpenStackMachineSpec(in *infrav1.OpenStackMachineSpec, out *OpenStackMachineSpec, s conversion.Scope) error {
438438
return autoConvert_v1alpha7_OpenStackMachineSpec_To_v1alpha5_OpenStackMachineSpec(in, out, s)
439439
}
440+
441+
func Convert_v1alpha7_OpenStackMachineStatus_To_v1alpha5_OpenStackMachineStatus(in *infrav1.OpenStackMachineStatus, out *OpenStackMachineStatus, s conversion.Scope) error {
442+
err := autoConvert_v1alpha7_OpenStackMachineStatus_To_v1alpha5_OpenStackMachineStatus(in, out, s)
443+
if err != nil {
444+
return err
445+
}
446+
447+
in.Ports = nil
448+
449+
return nil
450+
}

api/v1alpha5/zz_generated.conversion.go

Lines changed: 6 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1alpha6/conversion.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,3 +659,14 @@ func Convert_v1alpha6_OpenStackClusterStatus_To_v1alpha7_OpenStackClusterStatus(
659659
func Convert_v1alpha7_OpenStackMachineSpec_To_v1alpha6_OpenStackMachineSpec(in *infrav1.OpenStackMachineSpec, out *OpenStackMachineSpec, s apiconversion.Scope) error {
660660
return autoConvert_v1alpha7_OpenStackMachineSpec_To_v1alpha6_OpenStackMachineSpec(in, out, s)
661661
}
662+
663+
func Convert_v1alpha7_OpenStackMachineStatus_To_v1alpha6_OpenStackMachineStatus(in *infrav1.OpenStackMachineStatus, out *OpenStackMachineStatus, s apiconversion.Scope) error {
664+
err := autoConvert_v1alpha7_OpenStackMachineStatus_To_v1alpha6_OpenStackMachineStatus(in, out, s)
665+
if err != nil {
666+
return err
667+
}
668+
669+
in.Ports = nil
670+
671+
return nil
672+
}

api/v1alpha6/zz_generated.conversion.go

Lines changed: 6 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1alpha7/openstackmachine_types.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ type OpenStackMachineStatus struct {
111111
// +optional
112112
InstanceState *InstanceState `json:"instanceState,omitempty"`
113113

114+
// Ports contains the list of OpenStack ports and their status associated with the machine.
115+
Ports []PortStatus `json:"ports,omitempty"`
116+
114117
FailureReason *errors.MachineStatusError `json:"failureReason,omitempty"`
115118

116119
// FailureMessage will be set in the event that there is a terminal problem

api/v1alpha7/types.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@ type PortOpts struct {
128128
ValueSpecs []ValueSpec `json:"valueSpecs,omitempty"`
129129
}
130130

131+
type PortStatus struct {
132+
// ID is the unique identifier of the port.
133+
ID string `json:"id,omitempty"`
134+
}
135+
131136
type BindingProfile struct {
132137
// OVSHWOffload enables or disables the OVS hardware offload feature.
133138
OVSHWOffload bool `json:"ovsHWOffload,omitempty"`

api/v1alpha7/zz_generated.deepcopy.go

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/infrastructure.cluster.x-k8s.io_openstackmachines.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1603,6 +1603,16 @@ spec:
16031603
description: InstanceState is the state of the OpenStack instance
16041604
for this machine.
16051605
type: string
1606+
ports:
1607+
description: Ports contains the list of OpenStack ports and their
1608+
status associated with the machine.
1609+
items:
1610+
properties:
1611+
id:
1612+
description: ID is the unique identifier of the port.
1613+
type: string
1614+
type: object
1615+
type: array
16061616
ready:
16071617
description: Ready is true when the provider resource is ready.
16081618
type: boolean

controllers/openstackcluster_controller.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,11 @@ func reconcileBastion(scope scope.Scope, cluster *clusterv1.Cluster, openStackCl
320320
return err
321321
}
322322

323+
networkingService, err := networking.NewService(scope)
324+
if err != nil {
325+
return err
326+
}
327+
323328
instanceSpec := bastionToInstanceSpec(openStackCluster, cluster.Name)
324329
bastionHash, err := compute.HashInstanceSpec(instanceSpec)
325330
if err != nil {
@@ -349,15 +354,27 @@ func reconcileBastion(scope scope.Scope, cluster *clusterv1.Cluster, openStackCl
349354
}
350355
}
351356

352-
instanceStatus, err = computeService.CreateInstance(openStackCluster, openStackCluster, instanceSpec, cluster.Name)
357+
// TODO
358+
machine := &clusterv1.Machine{}
359+
bastionMachineSpec := openStackCluster.Spec.Bastion.Instance
360+
openStackMachine := &infrav1.OpenStackMachine{
361+
Spec: bastionMachineSpec,
362+
}
363+
364+
portStatus, err := networkingService.CreatePortsForInstance(machine, openStackMachine, openStackCluster, true)
353365
if err != nil {
354-
return fmt.Errorf("failed to reconcile bastion: %w", err)
366+
return fmt.Errorf("failed to create ports for bastion: %w", err)
367+
}
368+
var portIDs []string
369+
for _, port := range portStatus {
370+
portIDs = append(portIDs, port.ID)
355371
}
356372

357-
networkingService, err := networking.NewService(scope)
373+
instanceStatus, err = computeService.CreateInstance(openStackCluster, openStackCluster, instanceSpec, cluster.Name, portIDs)
358374
if err != nil {
359-
return err
375+
return fmt.Errorf("failed to reconcile bastion: %w", err)
360376
}
377+
361378
clusterName := fmt.Sprintf("%s-%s", cluster.Namespace, cluster.Name)
362379
fp, err := networkingService.GetOrCreateFloatingIP(openStackCluster, openStackCluster, clusterName, openStackCluster.Spec.Bastion.Instance.FloatingIP)
363380
if err != nil {

controllers/openstackmachine_controller.go

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,11 @@ func (r *OpenStackMachineReconciler) reconcileNormal(ctx context.Context, scope
328328
return ctrl.Result{}, err
329329
}
330330

331-
instanceStatus, err := r.getOrCreate(scope.Logger(), cluster, openStackCluster, machine, openStackMachine, computeService, userData)
331+
portStatus, err := r.getOrCreatePorts(scope.Logger(), cluster, openStackCluster, machine, openStackMachine, networkingService)
332+
if err != nil {
333+
return ctrl.Result{}, err
334+
}
335+
instanceStatus, err := r.getOrCreateInstance(scope.Logger(), cluster, openStackCluster, machine, openStackMachine, computeService, networkingService, userData, portStatus)
332336
if err != nil {
333337
// Conditions set in getOrCreate
334338
return ctrl.Result{}, err
@@ -430,7 +434,11 @@ func (r *OpenStackMachineReconciler) reconcileNormal(ctx context.Context, scope
430434
return ctrl.Result{}, nil
431435
}
432436

433-
func (r *OpenStackMachineReconciler) getOrCreate(logger logr.Logger, cluster *clusterv1.Cluster, openStackCluster *infrav1.OpenStackCluster, machine *clusterv1.Machine, openStackMachine *infrav1.OpenStackMachine, computeService *compute.Service, userData string) (*compute.InstanceStatus, error) {
437+
func (r *OpenStackMachineReconciler) getOrCreateInstance(logger logr.Logger, cluster *clusterv1.Cluster, openStackCluster *infrav1.OpenStackCluster, machine *clusterv1.Machine, openStackMachine *infrav1.OpenStackMachine, computeService *compute.Service, networkingService *networking.Service, userData string, portStatus []infrav1.PortStatus) (*compute.InstanceStatus, error) {
438+
var portIDs []string
439+
for _, port := range portStatus {
440+
portIDs = append(portIDs, port.ID)
441+
}
434442
instanceStatus, err := computeService.GetInstanceStatusByName(openStackMachine, openStackMachine.Name)
435443
if err != nil {
436444
logger.Info("Unable to get OpenStack instance", "name", openStackMachine.Name)
@@ -441,16 +449,32 @@ func (r *OpenStackMachineReconciler) getOrCreate(logger logr.Logger, cluster *cl
441449
if instanceStatus == nil {
442450
instanceSpec := machineToInstanceSpec(openStackCluster, machine, openStackMachine, userData)
443451
logger.Info("Machine does not exist, creating Machine", "name", openStackMachine.Name)
444-
instanceStatus, err = computeService.CreateInstance(openStackMachine, openStackCluster, instanceSpec, cluster.Name)
452+
instanceStatus, err = computeService.CreateInstance(openStackMachine, openStackCluster, instanceSpec, cluster.Name, portIDs)
445453
if err != nil {
446454
conditions.MarkFalse(openStackMachine, infrav1.InstanceReadyCondition, infrav1.InstanceCreateFailedReason, clusterv1.ConditionSeverityError, err.Error())
455+
456+
err := networkingService.DeletePortsForInstance(machine, openStackMachine)
457+
if err != nil {
458+
return nil, fmt.Errorf("delete ports: %w", err)
459+
}
447460
return nil, fmt.Errorf("create OpenStack instance: %w", err)
448461
}
449462
}
450463

451464
return instanceStatus, nil
452465
}
453466

467+
func (r *OpenStackMachineReconciler) getOrCreatePorts(logger logr.Logger, cluster *clusterv1.Cluster, openStackCluster *infrav1.OpenStackCluster, machine *clusterv1.Machine, openStackMachine *infrav1.OpenStackMachine, networkingService *networking.Service) ([]infrav1.PortStatus, error) {
468+
logger.Info("Reconciling ports for machine", "name", openStackMachine.Name)
469+
portStatus, err := networkingService.CreatePortsForInstance(machine, openStackMachine, openStackCluster, false)
470+
if err != nil {
471+
return nil, fmt.Errorf("create ports: %w", err)
472+
}
473+
logger.Info("Reconciled ports for machine", "name", openStackMachine.Name)
474+
475+
return portStatus, nil
476+
}
477+
454478
func machineToInstanceSpec(openStackCluster *infrav1.OpenStackCluster, machine *clusterv1.Machine, openStackMachine *infrav1.OpenStackMachine, userData string) *compute.InstanceSpec {
455479
instanceSpec := compute.InstanceSpec{
456480
Name: openStackMachine.Name,

controllers/suite_test.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import (
3939

4040
infrav1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha7"
4141
"sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/compute"
42+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/networking"
4243
"sigs.k8s.io/cluster-api-provider-openstack/pkg/scope"
4344
"sigs.k8s.io/cluster-api-provider-openstack/test/helpers/external"
4445
)
@@ -126,12 +127,13 @@ var _ = Describe("EnvTest sanity check", func() {
126127

127128
var _ = Describe("When calling getOrCreate", func() {
128129
var (
129-
logger logr.Logger
130-
reconsiler OpenStackMachineReconciler
131-
mockCtrl *gomock.Controller
132-
mockScopeFactory *scope.MockScopeFactory
133-
computeService *compute.Service
134-
err error
130+
logger logr.Logger
131+
reconsiler OpenStackMachineReconciler
132+
mockCtrl *gomock.Controller
133+
mockScopeFactory *scope.MockScopeFactory
134+
computeService *compute.Service
135+
networkingService *networking.Service
136+
err error
135137
)
136138

137139
BeforeEach(func() {
@@ -142,16 +144,19 @@ var _ = Describe("When calling getOrCreate", func() {
142144
mockScopeFactory = scope.NewMockScopeFactory(mockCtrl, "1234", logger)
143145
computeService, err = compute.NewService(mockScopeFactory)
144146
Expect(err).NotTo(HaveOccurred())
147+
networkingService, err = networking.NewService(mockScopeFactory)
148+
Expect(err).NotTo(HaveOccurred())
145149
})
146150

147151
It("should return an error if unable to get instance", func() {
148152
cluster := &clusterv1.Cluster{}
149153
openStackCluster := &infrav1.OpenStackCluster{}
150154
machine := &clusterv1.Machine{}
151155
openStackMachine := &infrav1.OpenStackMachine{}
156+
portStatus := []infrav1.PortStatus{}
152157

153158
mockScopeFactory.ComputeClient.EXPECT().ListServers(gomock.Any()).Return(nil, errors.New("Test error when listing servers"))
154-
instanceStatus, err := reconsiler.getOrCreate(logger, cluster, openStackCluster, machine, openStackMachine, computeService, "")
159+
instanceStatus, err := reconsiler.getOrCreateInstance(logger, cluster, openStackCluster, machine, openStackMachine, computeService, networkingService, "", portStatus)
155160
Expect(err).To(HaveOccurred())
156161
Expect(instanceStatus).To(BeNil())
157162
conditions := openStackMachine.GetConditions()

0 commit comments

Comments
 (0)