Skip to content

Commit 7fd615b

Browse files
openstack: Validate additionalSecurityGroupIDs
Add a pre-flight check that verifies that the security groups listed in the machine-pool property `additionalSecurityGroupIDs` actually exist on the cloud.
1 parent ceba5ba commit 7fd615b

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

pkg/asset/installconfig/openstack/validation/cloudinfo.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/gophercloud/gophercloud/v2/openstack/image/v2/images"
1818
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/floatingips"
1919
networkquotasets "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/quotas"
20+
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/groups"
2021
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/networks"
2122
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/subnets"
2223
azutils "github.com/gophercloud/utils/v2/openstack/compute/v2/availabilityzones"
@@ -47,6 +48,7 @@ type CloudInfo struct {
4748
NetworkExtensions []extensions.Extension
4849
Quotas []quota.Quota
4950
Networks []string
51+
SecurityGroups []string
5052

5153
clients *clients
5254
}
@@ -244,6 +246,11 @@ func (ci *CloudInfo) collectInfo(ctx context.Context, ic *types.InstallConfig) e
244246
return err
245247
}
246248

249+
ci.SecurityGroups, err = ci.getSecurityGroups(ctx)
250+
if err != nil {
251+
return err
252+
}
253+
247254
return nil
248255
}
249256

@@ -321,6 +328,26 @@ func (ci *CloudInfo) getNetworks(ctx context.Context) ([]string, error) {
321328
return networkIDs, nil
322329
}
323330

331+
// getSecurityGroups returns all the security group IDs available on the cloud.
332+
func (ci *CloudInfo) getSecurityGroups(ctx context.Context) ([]string, error) {
333+
pages, err := groups.List(ci.clients.networkClient, groups.ListOpts{}).AllPages(ctx)
334+
if err != nil {
335+
return nil, err
336+
}
337+
338+
groups, err := groups.ExtractGroups(pages)
339+
if err != nil {
340+
return nil, err
341+
}
342+
343+
sgIDs := make([]string, len(groups))
344+
for i := range groups {
345+
sgIDs[i] = groups[i].ID
346+
}
347+
348+
return sgIDs, nil
349+
}
350+
324351
func (ci *CloudInfo) getNetworkByName(ctx context.Context, networkName string) (*networks.Network, error) {
325352
if networkName == "" {
326353
return nil, nil

pkg/asset/installconfig/openstack/validation/machinepool.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ func ValidateMachinePool(p *openstack.MachinePool, ci *CloudInfo, controlPlane b
6969
allErrs = append(allErrs, validateUUIDV4s(p.AdditionalNetworkIDs, fldPath.Child("additionalNetworkIDs"))...)
7070
allErrs = append(allErrs, validateUUIDV4s(p.AdditionalSecurityGroupIDs, fldPath.Child("additionalSecurityGroupIDs"))...)
7171
allErrs = append(allErrs, validateAdditionalNetworks(p.AdditionalNetworkIDs, ci.Networks, fldPath.Child("additionalNetworkIDs"))...)
72+
allErrs = append(allErrs, validateAdditionalSecurityGroups(p.AdditionalSecurityGroupIDs, ci.SecurityGroups, fldPath.Child("additionalSecurityGroupIDs"))...)
7273

7374
return allErrs
7475
}
@@ -87,6 +88,20 @@ func validateAdditionalNetworks(additionalNetworkIDs, availableNetworks []string
8788
return allErrs
8889
}
8990

91+
func validateAdditionalSecurityGroups(additionalSecurityGroupIDs, availableSecurityGroups []string, fldPath *field.Path) field.ErrorList {
92+
allErrs := field.ErrorList{}
93+
sgSet := make(map[string]struct{}, len(availableSecurityGroups))
94+
for i := range availableSecurityGroups {
95+
sgSet[availableSecurityGroups[i]] = struct{}{}
96+
}
97+
for i, n := range additionalSecurityGroupIDs {
98+
if _, ok := sgSet[n]; !ok {
99+
allErrs = append(allErrs, field.Invalid(fldPath.Index(i), n, "Security group either does not exist in this cloud, or is not available"))
100+
}
101+
}
102+
return allErrs
103+
}
104+
90105
func validateZones(input []string, available []string, fldPath *field.Path) field.ErrorList {
91106
// check if machinepool default
92107
if len(input) == 1 && input[0] == "" {

0 commit comments

Comments
 (0)