in pkg/validate/dynamic/dynamic.go [813:905]
func (dv *dynamic) ValidateSubnets(ctx context.Context, oc *api.OpenShiftCluster, subnets []Subnet) error {
dv.log.Printf("validateSubnet")
subnetByID, err := dv.createSubnetMapByID(ctx, subnets)
if err != nil {
return err
}
if oc.Properties.ProvisioningState == api.ProvisioningStateCreating {
if oc.Properties.NetworkProfile.PreconfiguredNSG == api.PreconfiguredNSGEnabled {
dv.log.Info("cluster creation with preconfigured-nsg")
err = dv.checkPreconfiguredNSG(subnetByID)
if err != nil {
return err
}
}
}
// we're parsing through the subnets slice, not the map because we'll return consistent error messages on creation
for _, s := range subnets {
ss := subnetByID[s.ID]
if oc.Properties.ProvisioningState == api.ProvisioningStateCreating {
if subnetHasNSGAttached(ss) && oc.Properties.NetworkProfile.PreconfiguredNSG != api.PreconfiguredNSGEnabled {
expectedNsgID, err := apisubnet.NetworkSecurityGroupID(oc, s.ID)
if err != nil {
return err
}
if !isTheSameNSG(*ss.Properties.NetworkSecurityGroup.ID, expectedNsgID) {
return api.NewCloudError(
http.StatusBadRequest,
api.CloudErrorCodeInvalidLinkedVNet,
s.Path, fmt.Sprintf(errMsgNSGAttached, s.ID))
}
}
} else {
nsgID, err := apisubnet.NetworkSecurityGroupID(oc, *ss.ID)
if err != nil {
return err
}
if oc.Properties.NetworkProfile.PreconfiguredNSG == api.PreconfiguredNSGDisabled {
if !subnetHasNSGAttached(ss) ||
!isTheSameNSG(*ss.Properties.NetworkSecurityGroup.ID, nsgID) {
return api.NewCloudError(
http.StatusBadRequest,
api.CloudErrorCodeInvalidLinkedVNet,
s.Path,
fmt.Sprintf(
errMsgOriginalNSGNotAttached,
s.ID,
nsgID,
))
}
} else {
if !subnetHasNSGAttached(ss) {
return api.NewCloudError(
http.StatusBadRequest,
api.CloudErrorCodeInvalidLinkedVNet,
s.Path,
fmt.Sprintf(
errMsgNSGNotAttached,
s.ID,
))
}
}
}
if ss.Properties == nil || ss.Properties.ProvisioningState == nil || *ss.Properties.ProvisioningState != sdknetwork.ProvisioningStateSucceeded {
return api.NewCloudError(
http.StatusBadRequest,
api.CloudErrorCodeInvalidLinkedVNet,
s.Path,
fmt.Sprintf(
errMsgSubnetNotInSucceededState,
s.ID,
))
}
// Handle both addressPrefix & addressPrefixes
if ss.Properties.AddressPrefix == nil {
for _, address := range ss.Properties.AddressPrefixes {
if err = validateSubnetSize(s, *address); err != nil {
return err
}
}
} else {
if err = validateSubnetSize(s, *ss.Properties.AddressPrefix); err != nil {
return err
}
}
}
return nil
}