ResourceModules icon indicating copy to clipboard operation
ResourceModules copied to clipboard

RSV: Failes template spec publish

Open AlexanderSehr opened this issue 3 years ago • 5 comments

The name of the template spec publish for MS.RecoveryServices.vaults.replicationFabrics.replicationProtectionContainers.replicationProtectionContainerMappings

is too long. The maximum is 90 characters and the above name has 116 characters (26 too many). We must find a way to shorten this.

For example by removing substrings: MS.RecoveryServices.vaults.replicationFabrics.replicationProtectionContainers.Mappings

Reference: https://github.com/Azure/ResourceModules/runs/5631937120?check_suite_focus=true

AlexanderSehr avatar Mar 21 '22 17:03 AlexanderSehr

shorten name: last element in the string (split '/') in case of duplication, add one element up the tree

please add other ideas how to do that

rahalan avatar May 19 '22 15:05 rahalan

I wrote a little snipped to generate all names using the structure I proposed above - that is, to remove leading duplicates in the path (if they start with the name term).

Script
$path = 'C:\dev\ip\Azure-ResourceModules\ResourceModules\arm'

$moduleFolderPaths = (Get-ChildItem $path -Recurse -Directory -Force).FullName | Where-Object {
    (Get-ChildItem $_ -File -Depth 0 -Include @('deploy.json', 'deploy.bicep') -Force).Count -gt 0
}

$shortedNames = @()

foreach ($moduleFolderPath in $moduleFolderPaths) {
    $moduleFolderPath = $moduleFolderPath -replace '\\', '/'
    $moduleFolderPath = ($moduleFolderPath -Split '/arm/')[1]
    $moduleFolderPath = $moduleFolderPath -replace 'Microsoft', 'MS'
    $moduleFolderPath = $moduleFolderPath -replace '/', '.'

    $updated = $false
    $nameElems = $moduleFolderPath.Split('.')
    for ($index = 0; $index -lt $nameElems.Count; $index++) {
        if ($index -lt ($nameElems.count - 1)) {
            $stringToRemove = $nameElems[($index)]
            $stringToCheck = $nameElems[($index + 1)]

            if ($stringToRemove.EndsWith('s') -and $stringToCheck.StartsWith($stringToRemove.Substring(0, $stringToRemove.length - 1))) {
                $singularString = $stringToRemove.Substring(0, $stringToRemove.length - 1)
                $rest = $stringToCheck.length - $singularString.Length
                $shortenedString = $stringToCheck.Substring($singularString.length, $rest)
                $camelCaseString = [Regex]::Replace($shortenedString , '\b.', { $args[0].Value.Tolower() })
                $nameElems[($index + 1)] = $camelCaseString
                $updated = $true
            } elseif ($stringToCheck.StartsWith($stringToRemove)) {
                $nameElems[($index + 1)] = $stringToCheck.Substring($stringToRemove.length, $stringToCheck.length)
                $updated = $true
            }
        }
    }

    $templateSpecName = $nameElems -join '.'
    $templateSpecName

    if ($updated) {
        $null = $shortedNames +=
        [PSCustomObject]@{
            'Old name' = $moduleFolderPath
            'New name' = $templateSpecName
        }
    }
}
$shortedNames
Resulting names
MS.AAD.DomainServices
MS.AnalysisServices.servers
MS.ApiManagement.service
MS.ApiManagement.service.apis
MS.ApiManagement.service.apiVersionSets
MS.ApiManagement.service.authorizationServers
MS.ApiManagement.service.backends
MS.ApiManagement.service.caches
MS.ApiManagement.service.identityProviders
MS.ApiManagement.service.namedValues
MS.ApiManagement.service.policies
MS.ApiManagement.service.portalsettings
MS.ApiManagement.service.products
MS.ApiManagement.service.subscriptions
MS.ApiManagement.service.apis.policies
MS.ApiManagement.service.products.apis
MS.ApiManagement.service.products.groups
MS.Authorization.policyAssignments
MS.Authorization.policyDefinitions
MS.Authorization.policyExemptions
MS.Authorization.policySetDefinitions
MS.Authorization.roleAssignments
MS.Authorization.roleDefinitions
MS.Authorization.policyAssignments.managementGroup
MS.Authorization.policyAssignments.resourceGroup
MS.Authorization.policyAssignments.subscription
MS.Authorization.policyDefinitions.managementGroup
MS.Authorization.policyDefinitions.subscription
MS.Authorization.policyExemptions.managementGroup
MS.Authorization.policyExemptions.resourceGroup
MS.Authorization.policyExemptions.subscription
MS.Authorization.policySetDefinitions.managementGroup
MS.Authorization.policySetDefinitions.subscription
MS.Authorization.roleAssignments.managementGroup
MS.Authorization.roleAssignments.resourceGroup
MS.Authorization.roleAssignments.subscription
MS.Authorization.roleDefinitions.managementGroup
MS.Authorization.roleDefinitions.resourceGroup
MS.Authorization.roleDefinitions.subscription
MS.Automation.automationAccounts
MS.Automation.automationAccounts.jobSchedules
MS.Automation.automationAccounts.modules
MS.Automation.automationAccounts.runbooks
MS.Automation.automationAccounts.schedules
MS.Automation.automationAccounts.softwareUpdateConfigurations
MS.Automation.automationAccounts.variables
MS.Batch.batchAccounts
MS.CognitiveServices.accounts
MS.Compute.availabilitySets
MS.Compute.diskEncryptionSets
MS.Compute.disks
MS.Compute.galleries
MS.Compute.images
MS.Compute.proximityPlacementGroups
MS.Compute.virtualMachines
MS.Compute.virtualMachineScaleSets
MS.Compute.galleries.images
MS.Compute.virtualMachines.extensions
MS.Compute.virtualMachineScaleSets.extensions
MS.Consumption.budgets
MS.ContainerInstance.containerGroups
MS.ContainerRegistry.registries
MS.ContainerRegistry.registries.replications
MS.ContainerService.managedClusters
MS.ContainerService.managedClusters.agentPools
MS.Databricks.workspaces
MS.DataFactory.factories
MS.DataFactory.factories.integrationRuntime
MS.DataFactory.factories.managedVirtualNetwork
MS.DesktopVirtualization.applicationgroups
MS.DesktopVirtualization.hostpools
MS.DesktopVirtualization.scalingplans
MS.DesktopVirtualization.workspaces
MS.DesktopVirtualization.applicationgroups.applications
MS.DocumentDB.databaseAccounts
MS.DocumentDB.databaseAccounts.mongodbDatabases
MS.DocumentDB.databaseAccounts.sqlDatabases
MS.DocumentDB.databaseAccounts.mongodbDatabases.collections
MS.DocumentDB.databaseAccounts.sqlDatabases.containers
MS.EventGrid.systemTopics
MS.EventGrid.topics
MS.EventHub.namespaces
MS.EventHub.namespaces.authorizationRules
MS.EventHub.namespaces.disasterRecoveryConfigs
MS.EventHub.namespaces.eventhubs
MS.EventHub.namespaces.networkRuleSets
MS.EventHub.namespaces.eventhubs.authorizationRules
MS.EventHub.namespaces.eventhubs.consumergroups
MS.HealthBot.healthBots
MS.Insights.actionGroups
MS.Insights.activityLogAlerts
MS.Insights.components
MS.Insights.diagnosticSettings
MS.Insights.metricAlerts
MS.Insights.privateLinkScopes
MS.Insights.scheduledQueryRules
MS.Insights.privateLinkScopes.scopedResources
MS.KeyVault.vaults
MS.KeyVault.vaults.accessPolicies
MS.KeyVault.vaults.keys
MS.KeyVault.vaults.secrets
MS.KubernetesConfiguration.extensions
MS.KubernetesConfiguration.fluxConfigurations
MS.Logic.workflows
MS.MachineLearningServices.workspaces
MS.MachineLearningServices.workspaces.computes
MS.ManagedIdentity.userAssignedIdentities
MS.ManagedServices.registrationDefinitions
MS.Management.managementGroups
MS.NetApp.netAppAccounts
MS.NetApp.netAppAccounts.capacityPools
MS.NetApp.netAppAccounts.capacityPools.volumes
MS.Network.applicationGateways
MS.Network.applicationSecurityGroups
MS.Network.azureFirewalls
MS.Network.bastionHosts
MS.Network.connections
MS.Network.ddosProtectionPlans
MS.Network.expressRouteCircuits
MS.Network.firewallPolicies
MS.Network.frontDoors
MS.Network.ipGroups
MS.Network.loadBalancers
MS.Network.localNetworkGateways
MS.Network.natGateways
MS.Network.networkSecurityGroups
MS.Network.networkWatchers
MS.Network.privateDnsZones
MS.Network.privateEndpoints
MS.Network.publicIPAddresses
MS.Network.publicIPPrefixes
MS.Network.routeTables
MS.Network.trafficmanagerprofiles
MS.Network.virtualHubs
MS.Network.virtualNetworkGateways
MS.Network.virtualNetworks
MS.Network.virtualWans
MS.Network.vpnGateways
MS.Network.vpnSites
MS.Network.firewallPolicies.ruleCollectionGroups
MS.Network.loadBalancers.backendAddressPools
MS.Network.loadBalancers.inboundNatRules
MS.Network.networkSecurityGroups.securityRules
MS.Network.networkWatchers.connectionMonitors
MS.Network.networkWatchers.flowLogs
MS.Network.privateDnsZones.A
MS.Network.privateDnsZones.AAAA
MS.Network.privateDnsZones.CNAME
MS.Network.privateDnsZones.MX
MS.Network.privateDnsZones.PTR
MS.Network.privateDnsZones.SOA
MS.Network.privateDnsZones.SRV
MS.Network.privateDnsZones.TXT
MS.Network.privateDnsZones.virtualNetworkLinks
MS.Network.privateEndpoints.privateDnsZoneGroups
MS.Network.virtualHubs.hubRouteTables
MS.Network.virtualHubs.hubVirtualNetworkConnections
MS.Network.virtualNetworks.subnets
MS.Network.virtualNetworks.peerings
MS.Network.vpnGateways.connections
MS.Network.vpnGateways.natRules
MS.OperationalInsights.workspaces
MS.OperationalInsights.workspaces.dataSources
MS.OperationalInsights.workspaces.linkedServices
MS.OperationalInsights.workspaces.savedSearches
MS.OperationalInsights.workspaces.storageInsightConfigs
MS.RecoveryServices.vaults
MS.RecoveryServices.vaults.backupConfig
MS.RecoveryServices.vaults.backupPolicies
MS.RecoveryServices.vaults.backupStorageConfig
MS.RecoveryServices.vaults.protectionContainers
MS.RecoveryServices.vaults.replicationFabrics
MS.RecoveryServices.vaults.replicationPolicies
MS.RecoveryServices.vaults.protectionContainers.protectedItems
MS.RecoveryServices.vaults.replicationFabrics.replicationProtectionContainers
MS.RecoveryServices.vaults.replicationFabrics.replicationProtectionContainers.mappings
MS.Resources.deploymentScripts
MS.Resources.resourceGroups
MS.Resources.tags
MS.Resources.tags.resourceGroups
MS.Resources.tags.subscriptions
MS.Security.azureSecurityCenter
MS.ServiceBus.namespaces
MS.ServiceBus.namespaces.authorizationRules
MS.ServiceBus.namespaces.disasterRecoveryConfigs
MS.ServiceBus.namespaces.ipFilterRules
MS.ServiceBus.namespaces.migrationConfigurations
MS.ServiceBus.namespaces.queues
MS.Sql.servers.databases
MS.Sql.servers.firewallRules
MS.Sql.servers.securityAlertPolicies
MS.Sql.servers.vulnerabilityAssessments
MS.Storage.storageAccounts
MS.Storage.storageAccounts.blobServices
MS.Storage.storageAccounts.fileServices
MS.Storage.storageAccounts.managementPolicies
MS.Storage.storageAccounts.queueServices
MS.Storage.storageAccounts.tableServices
MS.Storage.storageAccounts.blobServices.containers
MS.Storage.storageAccounts.blobServices.containers.immutabilityPolicies
MS.Storage.storageAccounts.fileServices.shares
MS.Storage.storageAccounts.queueServices.queues
MS.Storage.storageAccounts.tableServices.tables
MS.Synapse.privateLinkHubs
MS.VirtualMachineImages.imageTemplates
MS.Web.connections
MS.Web.hostingEnvironments
MS.Web.serverfarms
MS.Web.sites
MS.Web.staticSites
MS.Web.sites.config-appsettings
MS.Web.sites.config-authsettingsv2

With the result:

Old name                                                                                                             New name
--------                                                                                                             --------
MS.Network.virtualNetworks.virtualNetworkPeerings                                                                    MS.Network.virtualNetworks.peerings
MS.RecoveryServices.vaults.replicationFabrics.replicationProtectionContainers.replicationProtectionContainerMappings MS.RecoveryServices.vaults.replicationFabrics.replicationProtectionContainers.mappings

Note: The RSV example would now be '86' instead of '116' characters (i.e. 30 less) but still close to the limit.

AlexanderSehr avatar May 19 '22 17:05 AlexanderSehr

@mblant please add your idea

rahalan avatar Jun 02 '22 15:06 rahalan

@mblant any updates? Or can you alternatively please provide us with a contact in the template specs PG? Thanks, Rainer

rahalan avatar Aug 04 '22 15:08 rahalan

Team decides to go with @MrMCake solution

rahalan avatar Aug 09 '22 16:08 rahalan