ARM process is done.
This commit is contained in:
parent
5ecf922999
commit
ecf2ba35ef
7 changed files with 50 additions and 31 deletions
13
package-lock.json
generated
13
package-lock.json
generated
|
@ -4542,6 +4542,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
|
||||||
"integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0="
|
"integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0="
|
||||||
},
|
},
|
||||||
|
"is-wsl": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
|
||||||
|
"integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
|
||||||
|
},
|
||||||
"isarray": {
|
"isarray": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||||
|
@ -5629,6 +5634,14 @@
|
||||||
"resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz",
|
||||||
"integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4="
|
"integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4="
|
||||||
},
|
},
|
||||||
|
"opn": {
|
||||||
|
"version": "5.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz",
|
||||||
|
"integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==",
|
||||||
|
"requires": {
|
||||||
|
"is-wsl": "^1.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"optimist": {
|
"optimist": {
|
||||||
"version": "0.6.1",
|
"version": "0.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
|
||||||
|
|
|
@ -71,6 +71,7 @@
|
||||||
"ms-rest-azure": "2.5.9",
|
"ms-rest-azure": "2.5.9",
|
||||||
"nexmo": "2.4.0",
|
"nexmo": "2.4.0",
|
||||||
"ngrok": "^3.1.0",
|
"ngrok": "^3.1.0",
|
||||||
|
"opn": "^5.4.0",
|
||||||
"pragmatismo-io-framework": "1.0.17",
|
"pragmatismo-io-framework": "1.0.17",
|
||||||
"process-exists": "^3.1.0",
|
"process-exists": "^3.1.0",
|
||||||
"public-ip": "^2.4.0",
|
"public-ip": "^2.4.0",
|
||||||
|
|
|
@ -40,6 +40,9 @@ const msRestAzure = require("ms-rest-azure");
|
||||||
const PasswordGenerator = require("strict-password-generator").default;
|
const PasswordGenerator = require("strict-password-generator").default;
|
||||||
|
|
||||||
export class GBAdminService {
|
export class GBAdminService {
|
||||||
|
|
||||||
|
static GB_PROMPT: string = "GeneralBots: "
|
||||||
|
|
||||||
static generateUuid(): string {
|
static generateUuid(): string {
|
||||||
return msRestAzure.generateUuid();
|
return msRestAzure.generateUuid();
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@ import { AppServicePlan } from "azure-arm-website/lib/models";
|
||||||
import { GBConfigService } from "../../../packages/core.gbapp/services/GBConfigService";
|
import { GBConfigService } from "../../../packages/core.gbapp/services/GBConfigService";
|
||||||
import { GBAdminService } from "../../../packages/admin.gbapp/services/GBAdminService";
|
import { GBAdminService } from "../../../packages/admin.gbapp/services/GBAdminService";
|
||||||
import { GBCorePackage } from "../../../packages/core.gbapp";
|
import { GBCorePackage } from "../../../packages/core.gbapp";
|
||||||
|
import { GBDeployer } from "packages/core.gbapp/services/GBDeployer";
|
||||||
|
|
||||||
const Spinner = require("cli-spinner").Spinner;
|
const Spinner = require("cli-spinner").Spinner;
|
||||||
const scanf = require("scanf");
|
const scanf = require("scanf");
|
||||||
|
@ -72,7 +73,12 @@ export class AzureDeployerService extends GBService {
|
||||||
public subscriptionId: string;
|
public subscriptionId: string;
|
||||||
static apiVersion = "2017-12-01";
|
static apiVersion = "2017-12-01";
|
||||||
farmName: any;
|
farmName: any;
|
||||||
|
deployer: GBDeployer;
|
||||||
|
|
||||||
|
constructor(deployer: GBDeployer){
|
||||||
|
super();
|
||||||
|
this.deployer = deployer;
|
||||||
|
}
|
||||||
public static async getSubscriptions(credentials) {
|
public static async getSubscriptions(credentials) {
|
||||||
let subscriptionClient = new SubscriptionClient.default(credentials);
|
let subscriptionClient = new SubscriptionClient.default(credentials);
|
||||||
return subscriptionClient.subscriptions.list();
|
return subscriptionClient.subscriptions.list();
|
||||||
|
@ -97,16 +103,6 @@ export class AzureDeployerService extends GBService {
|
||||||
logger.info(`Deploying Deploy Group (It may take a few minutes)...`);
|
logger.info(`Deploying Deploy Group (It may take a few minutes)...`);
|
||||||
await this.createDeployGroup(name, instance.cloudLocation);
|
await this.createDeployGroup(name, instance.cloudLocation);
|
||||||
|
|
||||||
instance = await this.deployBootBot(
|
|
||||||
instance,
|
|
||||||
name,
|
|
||||||
`${proxyAddress}/api/messages/${name}`,
|
|
||||||
instance.nlpAppId,
|
|
||||||
instance.nlpKey,
|
|
||||||
instance.cloudSubscriptionId
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
logger.info(`Deploying Bot Server...`);
|
logger.info(`Deploying Bot Server...`);
|
||||||
let serverFarm = await this.createHostingPlan(
|
let serverFarm = await this.createHostingPlan(
|
||||||
name,
|
name,
|
||||||
|
@ -155,7 +151,8 @@ export class AzureDeployerService extends GBService {
|
||||||
instance.searchHost = `${searchName}.search.windows.net`;
|
instance.searchHost = `${searchName}.search.windows.net`;
|
||||||
instance.searchIndex = "azuresql-index";
|
instance.searchIndex = "azuresql-index";
|
||||||
instance.searchIndexer = "azuresql-indexer";
|
instance.searchIndexer = "azuresql-indexer";
|
||||||
instance.searchKey = searchKeys[0].key;
|
instance.searchKey = searchKeys.primaryKey;
|
||||||
|
this.deployer.rebuildIndex(instance);
|
||||||
|
|
||||||
logger.info(`Deploying Speech...`);
|
logger.info(`Deploying Speech...`);
|
||||||
let speech = await this.createSpeech(
|
let speech = await this.createSpeech(
|
||||||
|
@ -218,6 +215,7 @@ export class AzureDeployerService extends GBService {
|
||||||
instance.cloudSubscriptionId
|
instance.cloudSubscriptionId
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
spinner.stop();
|
spinner.stop();
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
@ -262,32 +260,32 @@ export class AzureDeployerService extends GBService {
|
||||||
}
|
}
|
||||||
let retriveUsername = () => {
|
let retriveUsername = () => {
|
||||||
if (!username) {
|
if (!username) {
|
||||||
process.stdout.write("CLOUD_USERNAME:");
|
process.stdout.write(`${GBAdminService.GB_PROMPT}CLOUD_USERNAME:`);
|
||||||
username = scanf("%s").replace(/(\n|\r)+$/, "");
|
username = scanf("%s").replace(/(\n|\r)+$/, "");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let retrivePassword = () => {
|
let retrivePassword = () => {
|
||||||
if (!password) {
|
if (!password) {
|
||||||
process.stdout.write("CLOUD_PASSWORD:");
|
process.stdout.write(`${GBAdminService.GB_PROMPT}CLOUD_PASSWORD:`);
|
||||||
password = scanf("%s").replace(/(\n|\r)+$/, "");
|
password = scanf("%s").replace(/(\n|\r)+$/, "");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let retrieveBotId = () => {
|
let retrieveBotId = () => {
|
||||||
if (!botId) {
|
if (!botId) {
|
||||||
process.stdout.write(
|
process.stdout.write(
|
||||||
"Bot Id must only contain lowercase letters, digits or dashes, cannot start or end with or contain consecutive dashes and is limited from 4 to 42 characters long.\n"
|
`${GBAdminService.GB_PROMPT}Bot Id must only contain lowercase letters, digits or dashes, cannot start or end with or contain consecutive dashes and is limited from 4 to 42 characters long.\n`
|
||||||
);
|
);
|
||||||
process.stdout.write("BOT_ID:");
|
process.stdout.write(`${GBAdminService.GB_PROMPT}BOT_ID:`);
|
||||||
botId = scanf("%s").replace(/(\n|\r)+$/, "");
|
botId = scanf("%s").replace(/(\n|\r)+$/, ""); // TODO: Update this regexp to match description of it.
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let authoringKey = GBConfigService.get("NLP_AUTHORING_KEY");
|
let authoringKey = GBConfigService.get("NLP_AUTHORING_KEY");
|
||||||
let retriveAuthoringKey = () => {
|
let retriveAuthoringKey = () => {
|
||||||
if (!authoringKey) {
|
if (!authoringKey) {
|
||||||
process.stdout.write(
|
process.stdout.write(
|
||||||
"Due to this opened issue: https://github.com/Microsoft/botbuilder-tools/issues/550\n"
|
`${GBAdminService.GB_PROMPT}Due to this opened issue: https://github.com/Microsoft/botbuilder-tools/issues/550\n`
|
||||||
);
|
);
|
||||||
process.stdout.write("Please enter your LUIS Authoring Key:");
|
process.stdout.write(`${GBAdminService.GB_PROMPT}Please enter your LUIS Authoring Key:`);
|
||||||
authoringKey = scanf("%s").replace(/(\n|\r)+$/, "");
|
authoringKey = scanf("%s").replace(/(\n|\r)+$/, "");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -380,8 +378,8 @@ export class AzureDeployerService extends GBService {
|
||||||
nlpKey,
|
nlpKey,
|
||||||
subscriptionId
|
subscriptionId
|
||||||
) {
|
) {
|
||||||
let appId = GBConfigService.get("MSAPP_ID");
|
let appId = GBConfigService.get("MARKETPLACE_ID");
|
||||||
let appPassword = GBConfigService.get("MSAPP_PASSWORD");
|
let appPassword = GBConfigService.get("MARKETPLACE_SECRET");
|
||||||
|
|
||||||
if (!appId || !appPassword) {
|
if (!appId || !appPassword) {
|
||||||
process.stdout.write(
|
process.stdout.write(
|
||||||
|
@ -391,14 +389,14 @@ export class AzureDeployerService extends GBService {
|
||||||
|
|
||||||
let retriveAppId = () => {
|
let retriveAppId = () => {
|
||||||
if (!appId) {
|
if (!appId) {
|
||||||
process.stdout.write("Generated Application Id (MSAPP_ID):");
|
process.stdout.write("Generated Application Id (MARKETPLACE_ID):");
|
||||||
appId = scanf("%s").replace(/(\n|\r)+$/, "");
|
appId = scanf("%s").replace(/(\n|\r)+$/, "");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let retriveAppPassword = () => {
|
let retriveAppPassword = () => {
|
||||||
if (!appPassword) {
|
if (!appPassword) {
|
||||||
process.stdout.write("Generated Password (MSAPP_PASSWORD):");
|
process.stdout.write("Generated Password (MARKETPLACE_SECRET):");
|
||||||
appPassword = scanf("%s").replace(/(\n|\r)+$/, "");
|
appPassword = scanf("%s").replace(/(\n|\r)+$/, "");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -307,8 +307,8 @@ export class GBCoreService implements IGBCoreService {
|
||||||
`CLOUD_GROUP=${instance.botId}\n` +
|
`CLOUD_GROUP=${instance.botId}\n` +
|
||||||
`CLOUD_USERNAME=${instance.cloudUsername}\n` +
|
`CLOUD_USERNAME=${instance.cloudUsername}\n` +
|
||||||
`CLOUD_PASSWORD=${instance.cloudPassword}\n` +
|
`CLOUD_PASSWORD=${instance.cloudPassword}\n` +
|
||||||
`MSAPP_ID=${instance.marketplaceId}\n`+
|
`MARKETPLACE_ID=${instance.marketplaceId}\n`+
|
||||||
`MSAPP_PASSWORD=${instance.marketplacePassword}\n`+
|
`MARKETPLACE_SECRET=${instance.marketplacePassword}\n`+
|
||||||
`NLP_AUTHORING_KEY=${instance.nlpAuthoringKey}\n`+
|
`NLP_AUTHORING_KEY=${instance.nlpAuthoringKey}\n`+
|
||||||
`STORAGE_DIALECT=${instance.storageDialect}\n` +
|
`STORAGE_DIALECT=${instance.storageDialect}\n` +
|
||||||
`STORAGE_SERVER=${instance.storageServer}.database.windows.net\n` +
|
`STORAGE_SERVER=${instance.storageServer}.database.windows.net\n` +
|
||||||
|
|
|
@ -500,7 +500,7 @@ export class GBMinService {
|
||||||
let json = await request(options);
|
let json = await request(options);
|
||||||
return Promise.resolve(JSON.parse(json));
|
return Promise.resolve(JSON.parse(json));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
let msg = `Error calling Direct Line client, verify Bot endpoint on the cloud. Error is: ${error}.`;
|
let msg = `[botId:${instance.botId}] Error calling Direct Line client, verify Bot endpoint on the cloud. Error is: ${error}.`;
|
||||||
return Promise.reject(new Error(msg));
|
return Promise.reject(new Error(msg));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
16
src/app.ts
16
src/app.ts
|
@ -36,6 +36,7 @@
|
||||||
const logger = require("./logger");
|
const logger = require("./logger");
|
||||||
const express = require("express");
|
const express = require("express");
|
||||||
const bodyParser = require("body-parser");
|
const bodyParser = require("body-parser");
|
||||||
|
const opn = require('opn');
|
||||||
|
|
||||||
import { GBConfigService } from "../packages/core.gbapp/services/GBConfigService";
|
import { GBConfigService } from "../packages/core.gbapp/services/GBConfigService";
|
||||||
import { GBConversationalService } from "../packages/core.gbapp/services/GBConversationalService";
|
import { GBConversationalService } from "../packages/core.gbapp/services/GBConversationalService";
|
||||||
|
@ -101,7 +102,8 @@ export class GBServer {
|
||||||
logger.info(`Establishing a development local proxy (ngrok)...`);
|
logger.info(`Establishing a development local proxy (ngrok)...`);
|
||||||
let proxyAddress = await core.ensureProxy(port);
|
let proxyAddress = await core.ensureProxy(port);
|
||||||
|
|
||||||
let azureDeployer = new AzureDeployerService();
|
let deployer = new GBDeployer(core, new GBImporter(core));
|
||||||
|
let azureDeployer = new AzureDeployerService(deployer);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await core.initDatabase();
|
await core.initDatabase();
|
||||||
|
@ -111,7 +113,7 @@ export class GBServer {
|
||||||
bootInstance = await azureDeployer.deployFarm(proxyAddress);
|
bootInstance = await azureDeployer.deployFarm(proxyAddress);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.warn(
|
logger.warn(
|
||||||
"In case of error, please cleanup any infrastructure objects created during this procedure before running again."
|
"In case of error, please cleanup any infrastructure objects created during this procedure and .env before running again."
|
||||||
);
|
);
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
@ -132,7 +134,7 @@ export class GBServer {
|
||||||
|
|
||||||
if (!GBAdminService.StrongRegex.test(password)) {
|
if (!GBAdminService.StrongRegex.test(password)) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"STOP: Please, define a really strong password in ADMIN_PASS environment variable before running the server."
|
"Please, define a really strong password in ADMIN_PASS environment variable before running the server."
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,8 +204,6 @@ export class GBServer {
|
||||||
// Deploy packages and format object store according to .gbapp storage models.
|
// Deploy packages and format object store according to .gbapp storage models.
|
||||||
|
|
||||||
logger.info(`Deploying packages...`);
|
logger.info(`Deploying packages...`);
|
||||||
let deployer = new GBDeployer(core, new GBImporter(core));
|
|
||||||
await deployer.rebuildIndex(instances[0]);
|
|
||||||
await deployer.deployPackages(core, server, appPackages);
|
await deployer.deployPackages(core, server, appPackages);
|
||||||
|
|
||||||
// If instances is undefined here it's because storage has been formatted.
|
// If instances is undefined here it's because storage has been formatted.
|
||||||
|
@ -216,7 +216,7 @@ export class GBServer {
|
||||||
|
|
||||||
// Setup server dynamic (per bot instance) resources and listeners.
|
// Setup server dynamic (per bot instance) resources and listeners.
|
||||||
|
|
||||||
logger.info(`Building instances.`);
|
logger.info(`Mouting instances...`);
|
||||||
let minService = new GBMinService(
|
let minService = new GBMinService(
|
||||||
core,
|
core,
|
||||||
conversationalService,
|
conversationalService,
|
||||||
|
@ -226,6 +226,10 @@ export class GBServer {
|
||||||
await minService.buildMin(server, appPackages, instances);
|
await minService.buildMin(server, appPackages, instances);
|
||||||
logger.info(`The Bot Server is in RUNNING mode...`);
|
logger.info(`The Bot Server is in RUNNING mode...`);
|
||||||
|
|
||||||
|
if (process.env.NODE_ENV === "development") {
|
||||||
|
opn('http://localhost:4242');
|
||||||
|
}
|
||||||
|
|
||||||
return core;
|
return core;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error(`STOP: ${err} ${err.stack ? err.stack : ""}`);
|
logger.error(`STOP: ${err} ${err.stack ? err.stack : ""}`);
|
||||||
|
|
Loading…
Add table
Reference in a new issue