Azure / ResourceModules

This repository includes a CI platform for and collection of mature and curated Bicep modules. The platform supports both ARM and Bicep and can be leveraged using GitHub actions as well as Azure DevOps pipelines.
https://aka.ms/carml
MIT License
725 stars 461 forks source link

RSV: Failes template spec publish #1172

Closed AlexanderSehr closed 1 year ago

AlexanderSehr commented 2 years ago

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

rahalan commented 2 years ago

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

AlexanderSehr commented 2 years ago

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 ```PowerShell $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.

rahalan commented 2 years ago

@mblant please add your idea

rahalan commented 1 year ago

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

rahalan commented 1 year ago

Team decides to go with @MrMCake solution