in controllers/manager/gatewayvmconfiguration_controller.go [369:440]
func (r *GatewayVMConfigurationReconciler) ensurePublicIPPrefix(
ctx context.Context,
ipPrefixLength int32,
vmConfig *egressgatewayv1alpha1.GatewayVMConfiguration,
) (string, string, bool, error) {
log := log.FromContext(ctx)
// no need to provision public ip prefix is only private egress is needed
if !vmConfig.Spec.ProvisionPublicIps {
// return isManaged as false so that previously created managed public ip prefix can be deleted
return "", "", false, nil
}
if vmConfig.Spec.PublicIpPrefixId != "" {
// if there is public prefix ip specified, prioritize this one
matches := publicIPPrefixRE.FindStringSubmatch(vmConfig.Spec.PublicIpPrefixId)
if len(matches) != 4 {
return "", "", false, fmt.Errorf("failed to parse public ip prefix id: %s", vmConfig.Spec.PublicIpPrefixId)
}
subscriptionID, resourceGroupName, publicIpPrefixName := matches[1], matches[2], matches[3]
if subscriptionID != r.SubscriptionID() {
return "", "", false, fmt.Errorf("public ip prefix subscription(%s) is not in the same subscription(%s)", subscriptionID, r.SubscriptionID())
}
ipPrefix, err := r.GetPublicIPPrefix(ctx, resourceGroupName, publicIpPrefixName)
if err != nil {
return "", "", false, fmt.Errorf("failed to get public ip prefix(%s): %w", vmConfig.Spec.PublicIpPrefixId, err)
}
if ipPrefix.Properties == nil {
return "", "", false, fmt.Errorf("public ip prefix(%s) has empty properties", vmConfig.Spec.PublicIpPrefixId)
}
if to.Val(ipPrefix.Properties.PrefixLength) != ipPrefixLength {
return "", "", false, fmt.Errorf("provided public ip prefix has invalid length(%d), required(%d)", to.Val(ipPrefix.Properties.PrefixLength), ipPrefixLength)
}
log.Info("Found existing unmanaged public ip prefix", "public ip prefix", to.Val(ipPrefix.Properties.IPPrefix))
return to.Val(ipPrefix.Properties.IPPrefix), to.Val(ipPrefix.ID), false, nil
} else {
// check if there's managed public prefix ip
publicIpPrefixName := managedSubresourceName(vmConfig)
ipPrefix, err := r.GetPublicIPPrefix(ctx, "", publicIpPrefixName)
if err == nil {
if ipPrefix.Properties == nil {
return "", "", false, fmt.Errorf("managed public ip prefix has empty properties")
} else {
log.Info("Found existing managed public ip prefix", "public ip prefix", to.Val(ipPrefix.Properties.IPPrefix))
return to.Val(ipPrefix.Properties.IPPrefix), to.Val(ipPrefix.ID), true, nil
}
} else {
if !isErrorNotFound(err) {
return "", "", false, fmt.Errorf("failed to get managed public ip prefix: %w", err)
}
// create new public ip prefix
newIPPrefix := network.PublicIPPrefix{
Name: to.Ptr(publicIpPrefixName),
Location: to.Ptr(r.Location()),
Properties: &network.PublicIPPrefixPropertiesFormat{
PrefixLength: to.Ptr(ipPrefixLength),
PublicIPAddressVersion: to.Ptr(network.IPVersionIPv4),
},
SKU: &network.PublicIPPrefixSKU{
Name: to.Ptr(network.PublicIPPrefixSKUNameStandard),
Tier: to.Ptr(network.PublicIPPrefixSKUTierRegional),
},
}
log.Info("Creating new managed public ip prefix")
ipPrefix, err := r.CreateOrUpdatePublicIPPrefix(ctx, "", publicIpPrefixName, newIPPrefix)
if err != nil {
return "", "", false, fmt.Errorf("failed to create managed public ip prefix: %w", err)
}
return to.Val(ipPrefix.Properties.IPPrefix), to.Val(ipPrefix.ID), true, nil
}
}
}