Skip to content
This repository has been archived by the owner on Dec 9, 2024. It is now read-only.

Commit

Permalink
fix: add resource group name hash to resource names (#310)
Browse files Browse the repository at this point in the history
* Add hashed resource name to resource name

* Fix tests

* Fix resource group name test issues

* Add test

* Add naming service test

* test: APIM resource test (#311)

* Add test to validate resource naming

* Add service options and refactor

* Address pr feedback
  • Loading branch information
PIC123 authored Sep 6, 2019
1 parent e53d499 commit 5ba9508
Show file tree
Hide file tree
Showing 17 changed files with 526 additions and 100 deletions.
55 changes: 55 additions & 0 deletions src/armTemplates/resources/apim.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { ApimResource } from "./apim";
import { ServerlessAzureConfig } from "../../models/serverless";
import md5 from "md5";
import configConstants from "../../config";

describe("APIM Resource", () => {
const resourceGroupName = "myResourceGroup";
const prefix = "prefix";
const region = "eastus2";
const stage = "prod";

it("generates the correct resource name", () => {
const resourceGroupHash = md5(resourceGroupName).substr(
0,
configConstants.resourceGroupHashLength
);

const config: ServerlessAzureConfig = {
provider: {
name: "azure",
prefix,
region,
stage,
resourceGroup: resourceGroupName,
runtime: "nodejs10.x"
},
service: ""
} as any;

expect(ApimResource.getResourceName(config)).toEqual(
`${prefix}-eus2-${stage}-${resourceGroupHash}-apim`
);
});

it("uses the specified name from the azure provider", () => {
const apimName = "myAPIM";

const config: ServerlessAzureConfig = {
provider: {
apim: {
name: apimName
},
name: "azure",
prefix,
region,
stage,
resourceGroup: resourceGroupName,
runtime: "nodejs10.x"
},
service: ""
} as any;

expect(ApimResource.getResourceName(config)).toEqual(apimName);
});
});
9 changes: 7 additions & 2 deletions src/armTemplates/resources/apim.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import { ApiManagementConfig } from "../../models/apiManagement";
import { ArmResourceTemplate, ArmResourceTemplateGenerator } from "../../models/armTemplates";
import { ServerlessAzureConfig } from "../../models/serverless";
import { AzureNamingService } from "../../services/namingService";
import { AzureNamingService, AzureNamingServiceOptions } from "../../services/namingService";

export class ApimResource implements ArmResourceTemplateGenerator {
public static getResourceName(config: ServerlessAzureConfig) {
return AzureNamingService.getResourceName(config, config.provider.apim, "apim");
const options: AzureNamingServiceOptions = {
config,
resourceConfig: config.provider.apim,
suffix: "apim",
}
return AzureNamingService.getResourceName(options);
}

public getTemplate(): ArmResourceTemplate {
Expand Down
55 changes: 55 additions & 0 deletions src/armTemplates/resources/appInsights.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { AppInsightsResource } from "./appInsights";
import { ServerlessAzureConfig } from "../../models/serverless";
import md5 from "md5";
import configConstants from "../../config";

describe("App Insights Resource", () => {
const resourceGroupName = "myResourceGroup";
const prefix = "prefix";
const region = "eastus2";
const stage = "prod";

it("generates the correct resource name", () => {
const resourceGroupHash = md5(resourceGroupName).substr(
0,
configConstants.resourceGroupHashLength
);

const config: ServerlessAzureConfig = {
provider: {
name: "azure",
prefix,
region,
stage,
resourceGroup: resourceGroupName,
runtime: "nodejs10.x"
},
service: ""
} as any;

expect(AppInsightsResource.getResourceName(config)).toEqual(
`${prefix}-eus2-${stage}-${resourceGroupHash}-appinsights`
);
});

it("uses the specified name from the azure provider", () => {
const appInsightsName = "myAppInsights";

const config: ServerlessAzureConfig = {
provider: {
name: "azure",
prefix,
region,
stage,
resourceGroup: resourceGroupName,
runtime: "nodejs10.x",
appInsights: {
name: appInsightsName,
},
},
service: "myapp",
} as any;

expect(AppInsightsResource.getResourceName(config)).toEqual(appInsightsName);
});
});
9 changes: 7 additions & 2 deletions src/armTemplates/resources/appInsights.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
import { ArmResourceTemplate, ArmResourceTemplateGenerator } from "../../models/armTemplates";
import { ServerlessAzureConfig } from "../../models/serverless";
import { AzureNamingService } from "../../services/namingService";
import { AzureNamingService, AzureNamingServiceOptions } from "../../services/namingService";

export class AppInsightsResource implements ArmResourceTemplateGenerator {
public static getResourceName(config: ServerlessAzureConfig) {
return AzureNamingService.getResourceName(config, config.provider.appInsights, "appinsights");
const options: AzureNamingServiceOptions = {
config,
resourceConfig: config.provider.appInsights,
suffix: "appinsights",
}
return AzureNamingService.getResourceName(options);
}

public getTemplate(): ArmResourceTemplate {
Expand Down
55 changes: 55 additions & 0 deletions src/armTemplates/resources/appServicePlan.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { AppServicePlanResource } from "./appServicePlan";
import { ServerlessAzureConfig } from "../../models/serverless";
import md5 from "md5";
import configConstants from "../../config";

describe("App Service Plan Resource", () => {
const resourceGroupName = "myResourceGroup";
const prefix = "prefix";
const region = "eastus2";
const stage = "prod";

it("generates the correct resource name", () => {
const resourceGroupHash = md5(resourceGroupName).substr(
0,
configConstants.resourceGroupHashLength
);

const config: ServerlessAzureConfig = {
provider: {
name: "azure",
prefix,
region,
stage,
resourceGroup: resourceGroupName,
runtime: "nodejs10.x"
},
service: ""
} as any;

expect(AppServicePlanResource.getResourceName(config)).toEqual(
`${prefix}-eus2-${stage}-${resourceGroupHash}-asp`
);
});

it("uses the specified name from the azure provider", () => {
const appServicePlanName = "myAppServicePlan";

const config: ServerlessAzureConfig = {
provider: {
name: "azure",
prefix,
region,
stage,
resourceGroup: resourceGroupName,
runtime: "nodejs10.x",
appServicePlan: {
name: appServicePlanName,
},
},
service: "myapp",
} as any;

expect(AppServicePlanResource.getResourceName(config)).toEqual(appServicePlanName);
});
});
9 changes: 7 additions & 2 deletions src/armTemplates/resources/appServicePlan.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
import { ArmResourceTemplate, ArmResourceTemplateGenerator } from "../../models/armTemplates";
import { ResourceConfig, ServerlessAzureConfig } from "../../models/serverless";
import { AzureNamingService } from "../../services/namingService";
import { AzureNamingService, AzureNamingServiceOptions } from "../../services/namingService";

export class AppServicePlanResource implements ArmResourceTemplateGenerator {
public static getResourceName(config: ServerlessAzureConfig) {
return AzureNamingService.getResourceName(config, config.provider.appServicePlan, "asp");
const options: AzureNamingServiceOptions = {
config,
resourceConfig: config.provider.appServicePlan,
suffix: "asp",
}
return AzureNamingService.getResourceName(options);
}

public getTemplate(): ArmResourceTemplate {
Expand Down
51 changes: 51 additions & 0 deletions src/armTemplates/resources/functionApp.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { FunctionAppResource } from "./functionApp";
import { ServerlessAzureConfig } from "../../models/serverless";

describe("Function App Resource", () => {
const resourceGroupName = "myResourceGroup";
const prefix = "prefix";
const region = "westus";
const stage = "prod";

it("generates the correct resource name", () => {
const config: ServerlessAzureConfig = {
provider: {
name: "azure",
prefix,
region,
stage,
resourceGroup: resourceGroupName,
runtime: "nodejs10.x"
},
service: ""
} as any;

expect(FunctionAppResource.getResourceName(config)).toEqual(
`${config.provider.prefix}-wus-${config.provider.stage}`
);
});

it("uses the specified name from the azure provider", () => {
const serviceName = "myapp";

const config: ServerlessAzureConfig = {
provider: {
apim: {
name: ""
},
name: "azure",
prefix,
region,
stage,
resourceGroup: resourceGroupName,
runtime: "nodejs10.x",
functionApp: {
name: serviceName,
},
},
service: serviceName
} as any;

expect(FunctionAppResource.getResourceName(config)).toEqual(serviceName);
});
});
10 changes: 8 additions & 2 deletions src/armTemplates/resources/functionApp.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ArmResourceTemplate, ArmResourceTemplateGenerator } from "../../models/armTemplates";
import { FunctionAppConfig, ServerlessAzureConfig } from "../../models/serverless";
import { AzureNamingService } from "../../services/namingService";
import { AzureNamingService, AzureNamingServiceOptions } from "../../services/namingService";

//Runtime versions found at " https://<sitename>.scm.azurewebsites.net/api/diagnostics/runtime".
import runtimeVersionsJson from "../../services/runtimeVersions.json";
Expand All @@ -9,8 +9,14 @@ import semver from "semver";
export class FunctionAppResource implements ArmResourceTemplateGenerator {
public static getResourceName(config: ServerlessAzureConfig) {
const safeServiceName = config.service.replace(/\s/g, "-");
const options: AzureNamingServiceOptions = {
config,
resourceConfig: config.provider.functionApp,
suffix: safeServiceName,
includeHash: false,
}

return AzureNamingService.getResourceName(config, config.provider.functionApp, safeServiceName);
return AzureNamingService.getResourceName(options);
}

public getTemplate(): ArmResourceTemplate {
Expand Down
55 changes: 55 additions & 0 deletions src/armTemplates/resources/hostingEnvironment.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { HostingEnvironmentResource } from "./hostingEnvironment";
import { ServerlessAzureConfig } from "../../models/serverless";
import md5 from "md5";
import configConstants from "../../config";

describe("Azure Hosting Environment Resource", () => {
const resourceGroupName = "myResourceGroup";
const prefix = "prefix";
const region = "eastus2";
const stage = "prod";

it("generates the correct resource name", () => {
const resourceGroupHash = md5(resourceGroupName).substr(
0,
configConstants.resourceGroupHashLength
);

const config: ServerlessAzureConfig = {
provider: {
name: "azure",
prefix,
region,
stage,
resourceGroup: resourceGroupName,
runtime: "nodejs10.x"
},
service: ""
} as any;

expect(HostingEnvironmentResource.getResourceName(config)).toEqual(
`${prefix}-eus2-${stage}-${resourceGroupHash}-ase`
);
});

it("uses the specified name from the azure provider", () => {
const hostingEnvironmentName = "myHostingEnv";

const config: ServerlessAzureConfig = {
provider: {
hostingEnvironment: {
name: hostingEnvironmentName
},
name: "azure",
prefix,
region,
stage,
resourceGroup: resourceGroupName,
runtime: "nodejs10.x"
},
service: ""
} as any;

expect(HostingEnvironmentResource.getResourceName(config)).toEqual(hostingEnvironmentName);
});
});
9 changes: 7 additions & 2 deletions src/armTemplates/resources/hostingEnvironment.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
import { ArmResourceTemplate, ArmResourceTemplateGenerator } from "../../models/armTemplates";
import { ServerlessAzureConfig } from "../../models/serverless";
import { AzureNamingService } from "../../services/namingService";
import { AzureNamingService, AzureNamingServiceOptions } from "../../services/namingService";

export class HostingEnvironmentResource implements ArmResourceTemplateGenerator {
public static getResourceName(config: ServerlessAzureConfig) {
return AzureNamingService.getResourceName(config, config.provider.hostingEnvironment, "ase");
const options: AzureNamingServiceOptions = {
config,
resourceConfig: config.provider.hostingEnvironment,
suffix: "ase",
}
return AzureNamingService.getResourceName(options);
}

public getTemplate(): ArmResourceTemplate {
Expand Down
5 changes: 3 additions & 2 deletions src/armTemplates/resources/storageAccount.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@ describe("Storage Account Resource", () => {
name: "azure",
region: "westus",
stage: "dev",
resourceGroup
resourceGroup,
runtime: "nodejs10.x"
},
service: "test-api"
}
} as any;

it("Generates safe storage account name with short parts", () => {
const testConfig: ServerlessAzureConfig = {
Expand Down
Loading

0 comments on commit 5ba9508

Please sign in to comment.