Skip to content
This repository was archived by the owner on Jan 15, 2025. It is now read-only.

Commit 2de55d9

Browse files
author
JSpru
authored
Adding '--wait' flag to luis:train:run' to print completion status (#511)
* Adding '--wait' flag to luis:train:run' to print completion status * Use string template instead of operator
1 parent 489e4d9 commit 2de55d9

2 files changed

Lines changed: 54 additions & 9 deletions

File tree

packages/luis/src/commands/luis/train/run.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@ export default class LuisTrainRun extends Command {
2020
subscriptionKey: flags.string({description: '(required) LUIS cognitive services subscription key (default: config:LUIS:subscriptionKey)'}),
2121
appId: flags.string({description: '(required) LUIS application Id (defaults to config:LUIS:appId)'}),
2222
versionId: flags.string({description: '(required) Version to show training status (defaults to config:LUIS:versionId)'}),
23+
wait: flags.boolean({description: 'Wait until training complete and then display status'}),
2324
}
2425

2526
async run() {
2627
const {flags} = this.parse(LuisTrainRun)
2728
const flagLabels = Object.keys(LuisTrainRun.flags)
2829
const configDir = this.config.configDir
2930

30-
let {endpoint, subscriptionKey, appId, versionId} = await utils.processInputs(flags, flagLabels, configDir)
31+
let {endpoint, subscriptionKey, appId, versionId, wait} = await utils.processInputs(flags, flagLabels, configDir)
3132

3233
const requiredProps = {endpoint, subscriptionKey, appId, versionId}
3334
utils.validateRequiredProps(requiredProps)
@@ -40,9 +41,43 @@ export default class LuisTrainRun extends Command {
4041
await utils.writeToConsole(trainingRequestStatus)
4142
this.log('\nTraining request successfully issued')
4243
}
44+
if (wait) {
45+
this.log('checking training status...')
46+
return this.checkTrainingStatus(client, appId, versionId)
47+
}
4348
} catch (err) {
4449
throw new CLIError(`Failed to issue training request: ${err}`)
4550
}
4651
}
4752

53+
timeout(ms: number) {
54+
// tslint:disable-next-line no-string-based-set-timeout
55+
return new Promise((resolve: any) => setTimeout(resolve, ms))
56+
}
57+
58+
async checkTrainingStatus(client: any, appId: string, versionId: string) {
59+
try {
60+
const trainingStatusData = await client.train.getStatus(appId, versionId)
61+
const inProgress = trainingStatusData.filter((model: any) => {
62+
if (model.details && model.details.status) {
63+
return model.details.status === 'InProgress' || model.details.status === 'Queued'
64+
}
65+
})
66+
if (inProgress.length > 0) {
67+
await this.timeout(1000)
68+
await this.checkTrainingStatus(client, appId, versionId)
69+
} else {
70+
let completionMssg = ''
71+
trainingStatusData.map((model: any) => {
72+
if (model.details && model.details.status && model.details.status === 'Fail') {
73+
completionMssg += `Training failed for model id ${model.modelId}. Failure reason: ${model.details.failureReason}\n`
74+
}
75+
})
76+
this.log(`${completionMssg} Training is complete`)
77+
}
78+
} catch (err) {
79+
throw new CLIError(err)
80+
}
81+
}
82+
4883
}

packages/luis/test/commands/luis/train/run.test.ts

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,34 @@ describe('luis:train:run', () => {
2323
})
2424

2525
test
26+
.nock('https://westus.api.cognitive.microsoft.com', api => api
27+
.post(uri => uri.includes('train'))
28+
.reply(202, {"statusId": 2,"status": "UpToDate"})
29+
)
2630
.stdout()
27-
.stderr()
28-
.command(['luis:train:run', '--appId', uuidv1(), '--endpoint', 'https://westus.api.cognitive.microsoft.com', '--versionId', '0.1'])
29-
.it('displays an error if any required input parameters are missing', ctx => {
30-
expect(ctx.stderr).to.contain(`Required input property 'subscriptionKey' missing.`)
31+
.command(['luis:train:run', '--appId', uuidv1(), '--versionId', '0.1', '--subscriptionKey', uuidv1(), '--endpoint', 'https://westus.api.cognitive.microsoft.com'])
32+
.it('issues an asynchronous training request and reports when complete', ctx => {
33+
expect(ctx.stdout).to.contain('Training request successfully issued')
3134
})
3235

3336
test
3437
.nock('https://westus.api.cognitive.microsoft.com', api => api
38+
.get(uri => uri.includes('train'))
39+
.reply(202, [{
40+
"modelId": "99999",
41+
"details": {
42+
"statusId": 0,
43+
"status": "Success"
44+
}
45+
}])
3546
.post(uri => uri.includes('train'))
3647
.reply(202, {"statusId": 2,"status": "UpToDate"})
3748
)
3849
.stdout()
39-
.command(['luis:train:run', '--appId', uuidv1(), '--versionId', '0.1', '--subscriptionKey', uuidv1(), '--endpoint', 'https://westus.api.cognitive.microsoft.com'])
40-
.it('issues an asynchronous training request', ctx => {
50+
.command(['luis:train:run', '--appId', uuidv1(), '--versionId', '0.1', '--subscriptionKey', uuidv1(), '--endpoint', 'https://westus.api.cognitive.microsoft.com', '--wait'])
51+
.it('issues an asynchronous training request and reports when complete', ctx => {
4152
expect(ctx.stdout).to.contain('Training request successfully issued')
42-
expect(ctx.stdout).to.contain('statusId')
43-
expect(ctx.stdout).to.contain('status')
53+
expect(ctx.stdout).to.contain('checking training status...')
4454
})
4555

4656
})

0 commit comments

Comments
 (0)