func()

in pkg/engine/transform/transform.go [434:562]


func (t *Transformer) NormalizeResourcesForK8sMasterUpgrade(logger *logrus.Entry, templateMap map[string]interface{}, isMasterManagedDisk bool, agentPoolsToPreserve map[string]bool) error {
	resources := templateMap[resourcesFieldName].([]interface{})
	resourceTypeToProcess := map[string]bool{
		vmResourceType: true, vmExtensionType: true, nicResourceType: true,
		vnetResourceType: true, nsgResourceType: true, lbResourceType: true,
		vmssResourceType: true, vmasResourceType: true, roleResourceType: true,
		publicIPAddressResourceType: true, storageAccountsResourceType: true,
		keyVaultResourceType: true, rtResourceType: true,
		userAssignedIdentityResourceType: true}
	logger.Infoln(fmt.Sprintf("Resource count before running NormalizeResourcesForK8sMasterUpgrade: %d", len(resources)))

	filteredResources := resources[:0]

	// remove agent nodes resources if needed and set dataDisk createOption to attach
	for _, resource := range resources {
		filteredResources = append(filteredResources, resource)
		resourceMap, ok := resource.(map[string]interface{})
		if !ok {
			logger.Warnf("Template improperly formatted for field name: %s", resourcesFieldName)
			continue
		}

		resourceType, ok := resourceMap[typeFieldName].(string)
		if !ok {
			continue
		}

		_, process := resourceTypeToProcess[resourceType]
		if !process {
			continue
		}

		filteredResources = removeVMAS(logger, filteredResources, resourceMap)

		resourceName, ok := resourceMap[nameFieldName].(string)
		if !ok {
			logger.Warnf("Template improperly formatted for field name: %s", nameFieldName)
			continue
		}

		switch resourceType {
		case vmssResourceType, vmResourceType, vmExtensionType, roleResourceType, nicResourceType:
			if !strings.Contains(resourceName, "variables('masterVMNamePrefix')") {
				filteredResources = filteredResources[:len(filteredResources)-1]
				continue
			}
			if resourceType == nicResourceType {
				delete(resourceMap, dependsOnFieldName)
			}
		case nsgResourceType:
			if strings.Contains(resourceName, "variables('nsgName')") {
				filteredResources = filteredResources[:len(filteredResources)-1]
				continue
			}
		case publicIPAddressResourceType, rtResourceType, userAssignedIdentityResourceType:
			filteredResources = filteredResources[:len(filteredResources)-1]
			continue
		case lbResourceType:
			if strings.Contains(resourceName, "variables('masterInternalLbName')") || strings.Contains(resourceName, "variables('masterLbName')") {
				filteredResources = filteredResources[:len(filteredResources)-1]
				continue
			}
		case vnetResourceType:
			if strings.Contains(resourceName, "variables('virtualNetworkName')") {
				filteredResources = filteredResources[:len(filteredResources)-1]
				continue
			}
		case storageAccountsResourceType:
			if !strings.Contains(resourceName, "variables('clusterKeyVaultName')") {
				filteredResources = filteredResources[:len(filteredResources)-1]
				continue
			}
		case keyVaultResourceType:
			if !strings.Contains(resourceName, "variables('clusterKeyVaultName')") {
				filteredResources = filteredResources[:len(filteredResources)-1]
				continue
			}
		}

		if resourceType == vmssResourceType || resourceType == vnetResourceType {
			RemoveNsgDependency(logger, resourceName, resourceMap)
			continue
		}

		if strings.EqualFold(resourceType, vmResourceType) &&
			strings.Contains(resourceName, "variables('masterVMNamePrefix')") {
			resourceProperties, ok := resourceMap[propertiesFieldName].(map[string]interface{})
			if !ok {
				logger.Warnf("Template improperly formatted for field name: %s, resource name: %s", propertiesFieldName, resourceName)
				continue
			}

			storageProfile, ok := resourceProperties[storageProfileFieldName].(map[string]interface{})
			if !ok {
				logger.Warnf("Template improperly formatted: %s", storageProfileFieldName)
				continue
			}

			dataDisks, ok := storageProfile[dataDisksFieldName].([]interface{})
			if !ok {
				logger.Warnf("Template improperly formatted for field name: %s, property name: %s", storageProfileFieldName, dataDisksFieldName)
				continue
			}

			dataDisk, ok := dataDisks[0].(map[string]interface{})
			if !ok {
				logger.Warnf("Template improperly formatted for field name: %s, there is no data disks defined", dataDisksFieldName)
				continue
			}

			dataDisk[createOptionFieldName] = "attach"

			if isMasterManagedDisk {
				managedDisk := compute.ManagedDiskParameters{}
				id := "[concat('/subscriptions/', variables('subscriptionId'), '/resourceGroups/', variables('resourceGroup'),'/providers/Microsoft.Compute/disks/', variables('masterVMNamePrefix'), copyIndex(variables('masterOffset')),'-etcddisk')]"
				managedDisk.ID = &id
				diskInterface := &managedDisk
				dataDisk[managedDiskFieldName] = diskInterface
			}
		}
	}

	templateMap[resourcesFieldName] = filteredResources
	delete(templateMap, outputsFieldName)

	logger.Infoln(fmt.Sprintf("Resource count after running NormalizeResourcesForK8sMasterUpgrade: %d",
		len(templateMap[resourcesFieldName].([]interface{}))))
	return nil
}