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

Commit 36578d1

Browse files
committed
feat: ConfigService for centralizing configuration and simplifying BaseService (#338)
`ConfigService` and its usage. This removes the configuration logic from `BaseService` and keeps it all in one place. Also adds some constants for default configuration.
1 parent 9c57fa8 commit 36578d1

18 files changed

+478
-351
lines changed

.vscode/launch.json

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"version": "0.2.0",
3+
"configurations": [
4+
{
5+
"type": "node",
6+
"request": "launch",
7+
"name": "Jest All",
8+
"program": "${workspaceFolder}/node_modules/.bin/jest",
9+
"args": ["--runInBand"],
10+
"console": "integratedTerminal",
11+
"internalConsoleOptions": "neverOpen",
12+
"disableOptimisticBPs": true,
13+
"windows": {
14+
"program": "${workspaceFolder}/node_modules/jest/bin/jest",
15+
}
16+
},
17+
{
18+
"type": "node",
19+
"request": "launch",
20+
"name": "Jest Current File",
21+
"program": "${workspaceFolder}/node_modules/.bin/jest",
22+
"args": [
23+
"${fileBasenameNoExtension}",
24+
"--config",
25+
"jest.config.js"
26+
],
27+
"console": "integratedTerminal",
28+
"internalConsoleOptions": "neverOpen",
29+
"disableOptimisticBPs": true,
30+
"windows": {
31+
"program": "${workspaceFolder}/node_modules/jest/bin/jest",
32+
}
33+
}
34+
]
35+
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "serverless-azure-functions",
3-
"version": "1.0.0",
3+
"version": "1.0.1",
44
"description": "Provider plugin for the Serverless Framework v1.x which adds support for Azure Functions.",
55
"license": "MIT",
66
"main": "./lib/index.js",

src/config.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,13 @@ export const configConstants = {
3434
scmVfsPath: "/api/vfs/site/wwwroot/",
3535
scmZipDeployApiPath: "/api/zipdeploy",
3636
resourceGroupHashLength: 6,
37-
defaultLocalPort: 7071,
37+
defaults: {
38+
awsRegion: "us-east-1",
39+
region: "westus",
40+
stage: "dev",
41+
prefix: "sls",
42+
localPort: 7071,
43+
},
3844
};
3945

4046
export default configConstants;

src/models/serverless.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ export interface ServerlessAzureProvider {
3535
stage: string;
3636
name: string;
3737
subscriptionId?: string;
38+
tenantId?: string;
39+
appId?: string;
3840
environment?: {
3941
[key: string]: any;
4042
};

src/services/apimService.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ describe("APIM Service", () => {
7070
const apimConfigName = MockFactory.createTestApimConfig(true);
7171
(serverless.service.provider as any).apim = apimConfigName;
7272

73-
const service = new ApimService(serverless);
74-
const expectedRegionName = AzureNamingService.createShortAzureRegionName(service.getRegion());
73+
new ApimService(serverless);
74+
const expectedRegionName = AzureNamingService.createShortAzureRegionName(serverless.service.provider.region);
7575
expect(apimConfigName.name.includes(expectedRegionName)).toBeTruthy();
7676
});
7777

src/services/baseService.test.ts

Lines changed: 4 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import fs from "fs";
22
import mockFs from "mock-fs";
33
import Serverless from "serverless";
4-
import { ServerlessAzureOptions, ServerlessAzureConfig } from "../models/serverless";
4+
import { ServerlessAzureOptions } from "../models/serverless";
55
import { MockFactory } from "../test/mockFactory";
66
import { BaseService } from "./baseService";
7-
import { AzureNamingService } from "./namingService";
87

98
jest.mock("axios", () => jest.fn());
109
import axios from "axios";
@@ -40,11 +39,9 @@ class MockService extends BaseService {
4039
describe("Base Service", () => {
4140
let service: MockService;
4241
let serverless: Serverless;
43-
const serviceName = "my-custom-service"
44-
const loginResultSubscriptionId = "ABC123";
45-
const envVarSubscriptionId = "env var sub id";
46-
4742

43+
const serviceName = "my-custom-service";
44+
4845
const slsConfig = {
4946
service: serviceName,
5047
provider: {
@@ -59,7 +56,6 @@ describe("Base Service", () => {
5956

6057
function createMockService(sls: Serverless, options?: Serverless.Options) {
6158
sls.variables["azureCredentials"] = MockFactory.createTestAzureCredentials();
62-
sls.variables["subscriptionId"] = loginResultSubscriptionId;
6359
Object.assign(sls.service, slsConfig);
6460

6561
return new MockService(sls, options);
@@ -87,65 +83,7 @@ describe("Base Service", () => {
8783
expect(mockService).not.toBeNull();
8884
expect(serverless.service.provider.region).toEqual("westus");
8985
expect(serverless.service.provider.stage).toEqual("dev");
90-
});
91-
92-
it("returns region and stage based on CLI options", () => {
93-
const cliOptions = {
94-
stage: "prod",
95-
region: "eastus2",
96-
};
97-
const mockService = new MockService(serverless, cliOptions);
98-
99-
expect(mockService.getRegion()).toEqual(cliOptions.region);
100-
expect(mockService.getStage()).toEqual(cliOptions.stage);
101-
});
102-
103-
it("use the resource group name specified in CLI", () => {
104-
const resourceGroupName = "cliResourceGroupName"
105-
const cliOptions = {
106-
stage: "prod",
107-
region: "eastus2",
108-
resourceGroup: resourceGroupName
109-
};
110-
111-
const mockService = new MockService(serverless, cliOptions);
112-
const actualResourceGroupName = mockService.getResourceGroupName();
113-
114-
expect(actualResourceGroupName).toEqual(resourceGroupName);
115-
});
116-
117-
it("use the resource group name from sls yaml config", () => {
118-
const mockService = new MockService(serverless);
119-
const actualResourceGroupName = mockService.getResourceGroupName();
120-
121-
expect(actualResourceGroupName).toEqual(serverless.service.provider["resourceGroup"]);
122-
});
123-
124-
it("Generates resource group from convention when NOT defined in sls yaml", () => {
125-
serverless.service.provider["resourceGroup"] = null;
126-
const mockService = new MockService(serverless);
127-
const actualResourceGroupName = mockService.getResourceGroupName();
128-
const expectedRegion = AzureNamingService.createShortAzureRegionName(mockService.getRegion());
129-
const expectedStage = AzureNamingService.createShortStageName(mockService.getStage());
130-
const expectedResourceGroupName = `sls-${expectedRegion}-${expectedStage}-${serverless.service["service"]}-rg`;
131-
132-
expect(actualResourceGroupName).toEqual(expectedResourceGroupName);
133-
});
134-
135-
it("set default prefix when one is not defined in yaml config", () => {
136-
const mockService = new MockService(serverless);
137-
const actualPrefix = mockService.getPrefix();
138-
expect(actualPrefix).toEqual("sls");
139-
});
140-
141-
it("use the prefix defined in sls yaml config", () => {
142-
const expectedPrefix = "testPrefix"
143-
serverless.service.provider["prefix"] = expectedPrefix;
144-
const mockService = new MockService(serverless);
145-
const actualPrefix = mockService.getPrefix();
146-
147-
expect(actualPrefix).toEqual(expectedPrefix);
148-
});
86+
});
14987

15088
it("Fails if credentials have not been set in serverless config", () => {
15189
serverless.variables["azureCredentials"] = null;
@@ -202,91 +140,4 @@ describe("Base Service", () => {
202140

203141
readStreamSpy.mockRestore();
204142
});
205-
206-
it("sets stage name from CLI", async () => {
207-
const stage = "test";
208-
delete (serverless.service as any as ServerlessAzureConfig).provider.resourceGroup;
209-
expect(serverless.service.provider.stage).not.toEqual(stage);
210-
service = new MockService(serverless, { stage } as any);
211-
expect(service.getStage()).toEqual(stage);
212-
expect(service.getResourceGroupName()).toEqual(`sls-wus-${stage}-${serviceName}-rg`);
213-
});
214-
215-
it("sets region name from CLI", async () => {
216-
const region = "East US";
217-
delete (serverless.service as any as ServerlessAzureConfig).provider.resourceGroup;
218-
expect(serverless.service.provider.region).not.toEqual(region);
219-
service = new MockService(serverless, { region } as any);
220-
expect(service.getRegion()).toEqual(region);
221-
expect(service.getResourceGroupName()).toEqual(`sls-eus-dev-${serviceName}-rg`);
222-
});
223-
224-
it("sets prefix from CLI", async () => {
225-
const prefix = "prefix";
226-
delete (serverless.service as any as ServerlessAzureConfig).provider.resourceGroup;
227-
expect(serverless.service.provider["prefix"]).not.toEqual(prefix);
228-
service = new MockService(serverless, { prefix } as any);
229-
expect(service.getPrefix()).toEqual(prefix);
230-
expect(service.getResourceGroupName()).toEqual(`${prefix}-wus-dev-${serviceName}-rg`);
231-
});
232-
233-
it("sets resource group from CLI", async () => {
234-
const resourceGroup = "resourceGroup";
235-
delete (serverless.service as any as ServerlessAzureConfig).provider.resourceGroup;
236-
expect(serverless.service.provider["resourceGroup"]).not.toEqual(resourceGroup);
237-
service = new MockService(serverless, { resourceGroup } as any);
238-
expect(service.getResourceGroupName()).toEqual(resourceGroup);
239-
});
240-
241-
const cliSubscriptionId = "cli sub id";
242-
const configSubscriptionId = "config sub id";
243-
244-
it("sets subscription ID from CLI", async () => {
245-
process.env.AZURE_SUBSCRIPTION_ID = envVarSubscriptionId;
246-
serverless.service.provider["subscriptionId"] = configSubscriptionId;
247-
serverless.variables["subscriptionId"] = loginResultSubscriptionId
248-
service = new MockService(serverless, { subscriptionId: cliSubscriptionId } as any);
249-
expect(service.getSubscriptionId()).toEqual(cliSubscriptionId);
250-
expect(serverless.service.provider["subscriptionId"]).toEqual(cliSubscriptionId);
251-
});
252-
253-
it("sets subscription ID from environment variable", async () => {
254-
process.env.AZURE_SUBSCRIPTION_ID = envVarSubscriptionId;
255-
serverless.service.provider["subscriptionId"] = configSubscriptionId;
256-
serverless.variables["subscriptionId"] = loginResultSubscriptionId
257-
service = new MockService(serverless, { } as any);
258-
expect(service.getSubscriptionId()).toEqual(envVarSubscriptionId);
259-
expect(serverless.service.provider["subscriptionId"]).toEqual(envVarSubscriptionId);
260-
});
261-
262-
it("sets subscription ID from config", async () => {
263-
delete process.env.AZURE_SUBSCRIPTION_ID;
264-
serverless.service.provider["subscriptionId"] = configSubscriptionId;
265-
serverless.variables["subscriptionId"] = loginResultSubscriptionId
266-
service = new MockService(serverless, { } as any);
267-
expect(service.getSubscriptionId()).toEqual(configSubscriptionId);
268-
expect(serverless.service.provider["subscriptionId"]).toEqual(configSubscriptionId);
269-
});
270-
271-
it("sets subscription ID from login result", async () => {
272-
delete process.env.AZURE_SUBSCRIPTION_ID;
273-
serverless.variables["subscriptionId"] = loginResultSubscriptionId
274-
service = new MockService(serverless, { } as any);
275-
expect(service.getSubscriptionId()).toEqual(loginResultSubscriptionId);
276-
expect(serverless.service.provider["subscriptionId"]).toEqual(loginResultSubscriptionId);
277-
});
278-
279-
it("sets region to be value from location property if region not set", () => {
280-
const slsService = MockFactory.createTestService();
281-
delete slsService.provider.region;
282-
const location = "East US";
283-
slsService.provider["location"] = location;
284-
285-
const sls = MockFactory.createTestServerless({
286-
service: slsService
287-
});
288-
289-
service = new MockService(sls, {} as any);
290-
expect(service.getRegion()).toEqual(location);
291-
});
292143
});

0 commit comments

Comments
 (0)