Skip to content

Commit 4e66c12

Browse files
committed
Reuse common code in CreateBastion and CreateInstance
Common network and security group handling between CreateBastion() and CreateInstance(). A principal advantage of this refactor is that it makes the marshalling of OpenStackMachineSpec and Instance respectively into an InstanceSpec a cheap operation which makes no API calls.
1 parent 104f15f commit 4e66c12

File tree

3 files changed

+66
-96
lines changed

3 files changed

+66
-96
lines changed

pkg/cloud/services/compute/bastion.go

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -34,31 +34,15 @@ func (s *Service) CreateBastion(openStackCluster *infrav1.OpenStackCluster, clus
3434
RootVolume: openStackCluster.Spec.Bastion.Instance.RootVolume,
3535
}
3636

37-
securityGroups, err := s.networkingService.GetSecurityGroups(openStackCluster.Spec.Bastion.Instance.SecurityGroups)
38-
if err != nil {
39-
return nil, err
40-
}
37+
instanceSpec.SecurityGroups = openStackCluster.Spec.Bastion.Instance.SecurityGroups
4138
if openStackCluster.Spec.ManagedSecurityGroups {
42-
securityGroups = append(securityGroups, openStackCluster.Status.BastionSecurityGroup.ID)
39+
instanceSpec.SecurityGroups = append(instanceSpec.SecurityGroups, infrav1.SecurityGroupParam{
40+
UUID: openStackCluster.Status.BastionSecurityGroup.ID,
41+
})
4342
}
44-
instanceSpec.SecurityGroups = securityGroups
4543

46-
var nets []infrav1.Network
47-
if len(openStackCluster.Spec.Bastion.Instance.Networks) > 0 {
48-
var err error
49-
nets, err = s.getServerNetworks(openStackCluster.Spec.Bastion.Instance.Networks)
50-
if err != nil {
51-
return nil, err
52-
}
53-
} else {
54-
nets = []infrav1.Network{{
55-
ID: openStackCluster.Status.Network.ID,
56-
Subnet: &infrav1.Subnet{
57-
ID: openStackCluster.Status.Network.Subnet.ID,
58-
},
59-
}}
60-
}
61-
instanceSpec.Networks = nets
44+
instanceSpec.Networks = openStackCluster.Spec.Bastion.Instance.Networks
45+
instanceSpec.Ports = openStackCluster.Spec.Bastion.Instance.Ports
6246

63-
return s.createInstance(openStackCluster, clusterName, instanceSpec, retryIntervalInstanceStatus)
47+
return s.createInstance(openStackCluster, openStackCluster, clusterName, instanceSpec, retryIntervalInstanceStatus)
6448
}

pkg/cloud/services/compute/instance.go

Lines changed: 56 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -70,19 +70,9 @@ func (s *Service) createInstanceImpl(openStackCluster *infrav1.OpenStackCluster,
7070
RootVolume: openStackMachine.Spec.RootVolume,
7171
Subnet: openStackMachine.Spec.Subnet,
7272
ServerGroupID: openStackMachine.Spec.ServerGroupID,
73+
Trunk: openStackMachine.Spec.Trunk,
7374
}
7475

75-
// verify that trunk is supported if set at instance level.
76-
if openStackMachine.Spec.Trunk {
77-
trunkSupported, err := s.isTrunkExtSupported()
78-
if err != nil {
79-
return nil, err
80-
}
81-
if !trunkSupported {
82-
return nil, fmt.Errorf("there is no trunk support. please ensure that the trunk extension is enabled in your OpenStack deployment")
83-
}
84-
instanceSpec.Trunk = true
85-
}
8676
machineTags := []string{}
8777

8878
// Append machine specific tags
@@ -96,56 +86,44 @@ func (s *Service) createInstanceImpl(openStackCluster *infrav1.OpenStackCluster,
9686

9787
instanceSpec.Tags = machineTags
9888

99-
// Get security groups
100-
securityGroups, err := s.networkingService.GetSecurityGroups(openStackMachine.Spec.SecurityGroups)
101-
if err != nil {
102-
return nil, err
103-
}
89+
instanceSpec.SecurityGroups = openStackMachine.Spec.SecurityGroups
10490
if openStackCluster.Spec.ManagedSecurityGroups {
91+
var managedSecurityGroup string
10592
if util.IsControlPlaneMachine(machine) {
106-
securityGroups = append(securityGroups, openStackCluster.Status.ControlPlaneSecurityGroup.ID)
93+
managedSecurityGroup = openStackCluster.Status.ControlPlaneSecurityGroup.ID
10794
} else {
108-
securityGroups = append(securityGroups, openStackCluster.Status.WorkerSecurityGroup.ID)
95+
managedSecurityGroup = openStackCluster.Status.WorkerSecurityGroup.ID
10996
}
110-
}
111-
instanceSpec.SecurityGroups = securityGroups
11297

113-
nets, err := s.constructNetworks(openStackCluster, openStackMachine)
114-
if err != nil {
115-
return nil, err
98+
instanceSpec.SecurityGroups = append(instanceSpec.SecurityGroups, infrav1.SecurityGroupParam{
99+
UUID: managedSecurityGroup,
100+
})
116101
}
117102

118-
trunkConfigured := s.isTrunkConfigured(nets, instanceSpec.Trunk)
119-
if trunkConfigured {
120-
trunkSupported, err := s.isTrunkExtSupported()
121-
if err != nil {
122-
return nil, err
123-
}
124-
if !trunkSupported {
125-
return nil, fmt.Errorf("there is no trunk support. please ensure that the trunk extension is enabled in your OpenStack deployment")
126-
}
127-
}
128-
instanceSpec.Networks = nets
103+
instanceSpec.Networks = openStackMachine.Spec.Networks
104+
instanceSpec.Ports = openStackMachine.Spec.Ports
129105

130-
return s.createInstance(openStackMachine, clusterName, &instanceSpec, retryInterval)
106+
return s.createInstance(openStackMachine, openStackCluster, clusterName, &instanceSpec, retryInterval)
131107
}
132108

133-
// constructNetworks builds an array of networks from the network, subnet and ports items in the machine spec.
109+
// constructNetworks builds an array of networks from the network, subnet and ports items in the instance spec.
134110
// If no networks or ports are in the spec, returns a single network item for a network connection to the default cluster network.
135-
func (s *Service) constructNetworks(openStackCluster *infrav1.OpenStackCluster, openStackMachine *infrav1.OpenStackMachine) ([]infrav1.Network, error) {
136-
var nets []infrav1.Network
137-
if len(openStackMachine.Spec.Networks) > 0 {
138-
var err error
139-
nets, err = s.getServerNetworks(openStackMachine.Spec.Networks)
140-
if err != nil {
141-
return nil, err
142-
}
111+
func (s *Service) constructNetworks(openStackCluster *infrav1.OpenStackCluster, instanceSpec *InstanceSpec) ([]infrav1.Network, error) {
112+
trunkRequired := false
113+
114+
nets, err := s.getServerNetworks(instanceSpec.Networks)
115+
if err != nil {
116+
return nil, err
143117
}
144-
for i, port := range openStackMachine.Spec.Ports {
145-
pOpts := &openStackMachine.Spec.Ports[i]
118+
119+
for i := range instanceSpec.Ports {
120+
port := &instanceSpec.Ports[i]
146121
// No Trunk field specified for the port, inherit openStackMachine.Spec.Trunk.
147-
if pOpts.Trunk == nil {
148-
pOpts.Trunk = &openStackMachine.Spec.Trunk
122+
if port.Trunk == nil {
123+
port.Trunk = &instanceSpec.Trunk
124+
}
125+
if *port.Trunk {
126+
trunkRequired = true
149127
}
150128
if port.Network != nil {
151129
netID := port.Network.ID
@@ -164,18 +142,19 @@ func (s *Service) constructNetworks(openStackCluster *infrav1.OpenStackCluster,
164142
nets = append(nets, infrav1.Network{
165143
ID: netID,
166144
Subnet: &infrav1.Subnet{},
167-
PortOpts: pOpts,
145+
PortOpts: port,
168146
})
169147
} else {
170148
nets = append(nets, infrav1.Network{
171149
ID: openStackCluster.Status.Network.ID,
172150
Subnet: &infrav1.Subnet{
173151
ID: openStackCluster.Status.Network.Subnet.ID,
174152
},
175-
PortOpts: pOpts,
153+
PortOpts: port,
176154
})
177155
}
178156
}
157+
179158
// no networks or ports found in the spec, so create a port on the cluster network
180159
if len(nets) == 0 {
181160
nets = []infrav1.Network{{
@@ -184,14 +163,26 @@ func (s *Service) constructNetworks(openStackCluster *infrav1.OpenStackCluster,
184163
ID: openStackCluster.Status.Network.Subnet.ID,
185164
},
186165
PortOpts: &infrav1.PortOpts{
187-
Trunk: &openStackMachine.Spec.Trunk,
166+
Trunk: &instanceSpec.Trunk,
188167
},
189168
}}
169+
trunkRequired = instanceSpec.Trunk
170+
}
171+
172+
if trunkRequired {
173+
trunkSupported, err := s.isTrunkExtSupported()
174+
if err != nil {
175+
return nil, err
176+
}
177+
if !trunkSupported {
178+
return nil, fmt.Errorf("there is no trunk support. please ensure that the trunk extension is enabled in your OpenStack deployment")
179+
}
190180
}
181+
191182
return nets, nil
192183
}
193184

194-
func (s *Service) createInstance(eventObject runtime.Object, clusterName string, instanceSpec *InstanceSpec, retryInterval time.Duration) (*InstanceStatus, error) {
185+
func (s *Service) createInstance(eventObject runtime.Object, openStackCluster *infrav1.OpenStackCluster, clusterName string, instanceSpec *InstanceSpec, retryInterval time.Duration) (*InstanceStatus, error) {
195186
var server *ServerExt
196187
accessIPv4 := ""
197188
portList := []servers.Network{}
@@ -221,7 +212,17 @@ func (s *Service) createInstance(eventObject runtime.Object, clusterName string,
221212
}
222213
}()
223214

224-
for i, network := range instanceSpec.Networks {
215+
nets, err := s.constructNetworks(openStackCluster, instanceSpec)
216+
if err != nil {
217+
return nil, err
218+
}
219+
220+
securityGroups, err := s.networkingService.GetSecurityGroups(instanceSpec.SecurityGroups)
221+
if err != nil {
222+
return nil, fmt.Errorf("error getting security groups: %v", err)
223+
}
224+
225+
for i, network := range nets {
225226
if network.ID == "" {
226227
return nil, fmt.Errorf("no network was found or provided. Please check your machine configuration and try again")
227228
}
@@ -230,7 +231,7 @@ func (s *Service) createInstance(eventObject runtime.Object, clusterName string,
230231
iTags = instanceSpec.Tags
231232
}
232233
portName := getPortName(instanceSpec.Name, network.PortOpts, i)
233-
port, err := s.networkingService.GetOrCreatePort(eventObject, clusterName, portName, network, &instanceSpec.SecurityGroups, iTags)
234+
port, err := s.networkingService.GetOrCreatePort(eventObject, clusterName, portName, network, &securityGroups, iTags)
234235
if err != nil {
235236
return nil, err
236237
}
@@ -253,7 +254,7 @@ func (s *Service) createInstance(eventObject runtime.Object, clusterName string,
253254
AvailabilityZone: instanceSpec.FailureDomain,
254255
Networks: portList,
255256
UserData: []byte(instanceSpec.UserData),
256-
SecurityGroups: instanceSpec.SecurityGroups,
257+
SecurityGroups: securityGroups,
257258
Tags: instanceSpec.Tags,
258259
Metadata: instanceSpec.Metadata,
259260
ConfigDrive: &instanceSpec.ConfigDrive,
@@ -791,19 +792,3 @@ func (s *Service) isTrunkExtSupported() (trunknSupported bool, err error) {
791792
}
792793
return true, nil
793794
}
794-
795-
// isTrunkConfigured verifies trunk configuration at instance and port levels, useful for avoiding multple api calls to verify trunk support.
796-
func (s *Service) isTrunkConfigured(nets []infrav1.Network, instanceLevelTrunk bool) bool {
797-
if instanceLevelTrunk {
798-
return true
799-
}
800-
for _, net := range nets {
801-
port := net.PortOpts
802-
if port != nil {
803-
if port.Trunk != nil && *port.Trunk {
804-
return true
805-
}
806-
}
807-
}
808-
return false
809-
}

pkg/cloud/services/compute/instance_types.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ type InstanceSpec struct {
4646
ServerGroupID string
4747
Trunk bool
4848
Tags []string
49-
SecurityGroups []string
50-
Networks []infrav1.Network
49+
SecurityGroups []infrav1.SecurityGroupParam
50+
Networks []infrav1.NetworkParam
51+
Ports []infrav1.PortOpts
5152
}
5253

5354
// InstanceIdentifier describes an instance which has not necessarily been fetched.

0 commit comments

Comments
 (0)