in controllers/manager/gatewayvmconfiguration_controller.go [466:541]
func (r *GatewayVMConfigurationReconciler) reconcileVMSS(
ctx context.Context,
vmConfig *egressgatewayv1alpha1.GatewayVMConfiguration,
vmss *compute.VirtualMachineScaleSet,
ipPrefixID string,
wantIPConfig bool,
) ([]string, error) {
log := log.FromContext(ctx)
ipConfigName := managedSubresourceName(vmConfig)
vmssRG := getVMSSResourceGroup(vmConfig)
needUpdate := false
if vmss.Properties == nil || vmss.Properties.VirtualMachineProfile == nil ||
vmss.Properties.VirtualMachineProfile.NetworkProfile == nil {
return nil, fmt.Errorf("vmss has empty network profile")
}
lbBackendpoolID := r.GetLBBackendAddressPoolID(to.Val(vmss.Properties.UniqueID))
interfaces := vmss.Properties.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations
needUpdate, err := r.reconcileVMSSNetworkInterface(ctx, ipConfigName, ipPrefixID, to.Val(lbBackendpoolID), wantIPConfig, interfaces)
if err != nil {
return nil, fmt.Errorf("failed to reconcile vmss interface(%s): %w", to.Val(vmss.Name), err)
}
if needUpdate {
log.Info("Updating vmss", "vmssName", to.Val(vmss.Name))
newVmss := compute.VirtualMachineScaleSet{
Location: vmss.Location,
Properties: &compute.VirtualMachineScaleSetProperties{
VirtualMachineProfile: &compute.VirtualMachineScaleSetVMProfile{
NetworkProfile: vmss.Properties.VirtualMachineProfile.NetworkProfile,
},
},
}
if _, err := r.CreateOrUpdateVMSS(ctx, vmssRG, to.Val(vmss.Name), newVmss); err != nil {
return nil, fmt.Errorf("failed to update vmss(%s): %w", to.Val(vmss.Name), err)
}
}
// check and update VMSS instances
var privateIPs []string
instances, err := r.ListVMSSInstances(ctx, vmssRG, to.Val(vmss.Name))
if err != nil {
return nil, fmt.Errorf("failed to get vm instances from vmss(%s): %w", to.Val(vmss.Name), err)
}
for _, instance := range instances {
privateIP, err := r.reconcileVMSSVM(ctx, vmConfig, to.Val(vmss.Name), instance, ipPrefixID, to.Val(lbBackendpoolID), wantIPConfig)
if err != nil {
return nil, err
}
if wantIPConfig && ipPrefixID == "" {
privateIPs = append(privateIPs, privateIP)
}
}
// clean up VMProfiles for deleted nodes
var vmprofiles []egressgatewayv1alpha1.GatewayVMProfile
if vmConfig.Status != nil {
for i := range vmConfig.Status.GatewayVMProfiles {
profile := vmConfig.Status.GatewayVMProfiles[i]
for _, instance := range instances {
if profile.NodeName == to.Val(instance.Properties.OSProfile.ComputerName) {
vmprofiles = append(vmprofiles, profile)
break
}
}
}
vmConfig.Status.GatewayVMProfiles = vmprofiles
}
err = r.Status().Update(ctx, vmConfig)
if err != nil {
return nil, fmt.Errorf("failed to update vm config status: %w", err)
}
return privateIPs, nil
}