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

feat: Added feature to specify Azure subcription ID in CLI before deployment #203

Merged
merged 5 commits into from
Jul 17, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/plugins/azureBasePlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ import { Guard } from "../shared/guard";
import Serverless from "serverless";
import { Utils } from "../shared/utils";

export abstract class AzureBasePlugin {
export abstract class AzureBasePlugin<TOptions=Serverless.Options> {
public constructor(
protected serverless: Serverless,
protected options: Serverless.Options,
protected options: TOptions,
) {
Guard.null(serverless);
}
Expand Down
10 changes: 7 additions & 3 deletions src/plugins/deploy/azureDeployPlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ import { FunctionAppService } from "../../services/functionAppService";
import { ResourceService } from "../../services/resourceService";
import { Utils } from "../../shared/utils";
import { AzureBasePlugin } from "../azureBasePlugin";
import { AzureLoginOptions } from "../../services/loginService";


export class AzureDeployPlugin extends AzureBasePlugin {
export class AzureDeployPlugin extends AzureBasePlugin<AzureLoginOptions> {
public hooks: { [eventName: string]: Promise<any> };
public commands: any;

public constructor(serverless: Serverless, options: Serverless.Options) {
public constructor(serverless: Serverless, options: AzureLoginOptions) {
super(serverless, options);

this.hooks = {
Expand All @@ -31,6 +31,10 @@ export class AzureDeployPlugin extends AzureBasePlugin {
"resourceGroup": {
usage: "Resource group for the service",
shortcut: "g",
},
subscriptionId: {
usage: "Sets the Azure subscription ID",
shortcut: "i",
}
}
}
Expand Down
28 changes: 23 additions & 5 deletions src/plugins/login/azureLoginPlugin.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,12 @@ describe("Login Plugin", () => {
const envVariables = MockFactory.createTestServicePrincipalEnvVariables()
const credentials = MockFactory.createTestVariables().azureCredentials;

function createPlugin(hasCreds = false, serverless?: Serverless): AzureLoginPlugin {
function createPlugin(hasCreds = false, serverless?: Serverless, options?: Serverless.Options): AzureLoginPlugin {
const sls = serverless || MockFactory.createTestServerless();
if (!hasCreds) {
delete sls.variables["azureCredentials"];
}
const options = MockFactory.createTestServerlessOptions();
return new AzureLoginPlugin(sls, options);
return new AzureLoginPlugin(sls, options || MockFactory.createTestServerlessOptions());
}

function createMockLoginFunction() {
Expand All @@ -31,8 +30,8 @@ describe("Login Plugin", () => {
unsetEnvVariables(envVariables);
}

async function invokeLoginHook(hasCreds = false, serverless?: Serverless) {
const plugin = createPlugin(hasCreds, serverless);
async function invokeLoginHook(hasCreds = false, serverless?: Serverless, options?: Serverless.Options) {
const plugin = createPlugin(hasCreds, serverless, options);
await invokeHook(plugin, "before:package:initialize");
}

Expand Down Expand Up @@ -92,4 +91,23 @@ describe("Login Plugin", () => {
expect(sls.cli.log).lastCalledWith(`Error: ${errorMessage}`);
expect(process.exit).toBeCalledWith(0);
});

it("Uses the user specified subscription ID", async () => {
const sls = MockFactory.createTestServerless();
const opt = MockFactory.createTestServerlessOptions();
opt["subscriptionId"] = "test-subs-id";
await invokeLoginHook(false, sls, opt);
expect(AzureLoginService.interactiveLogin).toBeCalled()
expect(sls.variables["subscriptionId"]).toEqual("test-subs-id");
expect(sls.cli.log).toBeCalledWith("Using subscription ID: test-subs-id");
})

it("Uses the default subscription ID" , async () => {
const sls = MockFactory.createTestServerless();
const opt = MockFactory.createTestServerlessOptions();
await invokeLoginHook(false, sls, opt);
expect(AzureLoginService.interactiveLogin).toBeCalled()
expect(sls.variables["subscriptionId"]).toEqual("azureSubId");
expect(sls.cli.log).toBeCalledWith("Using subscription ID: azureSubId");
});
});
8 changes: 5 additions & 3 deletions src/plugins/login/azureLoginPlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@ import Serverless from "serverless";
import AzureProvider from "../../provider/azureProvider";
import { AzureLoginService } from "../../services/loginService";
import { AzureBasePlugin } from "../azureBasePlugin";
import { AzureLoginOptions } from "../../services/loginService";

export class AzureLoginPlugin extends AzureBasePlugin {
export class AzureLoginPlugin extends AzureBasePlugin<AzureLoginOptions> {
private provider: AzureProvider;
public hooks: { [eventName: string]: Promise<any> };

public constructor(serverless: Serverless, options: Serverless.Options) {
public constructor(serverless: Serverless, options: AzureLoginOptions) {
super(serverless, options);
this.provider = (this.serverless.getProvider("azure") as any) as AzureProvider;

Expand All @@ -32,7 +33,8 @@ export class AzureLoginPlugin extends AzureBasePlugin {
this.serverless.variables["azureCredentials"] = authResult.credentials;
// Use environment variable for sub ID or use the first subscription in the list (service principal can
// have access to more than one subscription)
this.serverless.variables["subscriptionId"] = process.env.azureSubId || authResult.subscriptions[0].id;
this.serverless.variables["subscriptionId"] = this.options.subscriptionId || process.env.azureSubId || authResult.subscriptions[0].id;
this.serverless.cli.log(`Using subscription ID: ${this.serverless.variables["subscriptionId"]}`);
}
catch (e) {
this.log("Error logging into azure");
Expand Down
5 changes: 5 additions & 0 deletions src/services/loginService.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import open from "open";
import Serverless from "serverless";
import {
interactiveLoginWithAuthResponse,
loginWithServicePrincipalSecretWithAuthResponse,
Expand All @@ -7,6 +8,10 @@ import {
InteractiveLoginOptions,
} from "@azure/ms-rest-nodeauth";

export interface AzureLoginOptions extends Serverless.Options {
subscriptionId?: string;
}

export class AzureLoginService {

/**
Expand Down