Skip to content

Commit 823ed32

Browse files
hannah-taub-1taub
andauthored
Don't exit command on undeploy error (#902)
* only warn on undeploy error, don't error out entirely --------- Co-authored-by: taub <taub@adobe.com>
1 parent d28deaf commit 823ed32

2 files changed

Lines changed: 55 additions & 54 deletions

File tree

src/commands/app/undeploy.js

Lines changed: 43 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -50,65 +50,60 @@ class Undeploy extends BaseCommand {
5050
}
5151

5252
const spinner = ora()
53-
try {
54-
const { aio: aioConfig, packagejson: packageJson } = await this.getFullConfig({}, flags)
55-
const cliDetails = await getAccessToken({ useCachedToken: !flags.unpublish })
56-
const appInfo = {
57-
name: packageJson.name,
58-
version: packageJson.version,
59-
project: aioConfig?.project,
60-
runtimeNamespace: aioConfig?.runtime?.namespace
53+
54+
const { aio: aioConfig, packagejson: packageJson } = await this.getFullConfig({}, flags)
55+
const cliDetails = await getAccessToken({ useCachedToken: !flags.unpublish })
56+
const appInfo = {
57+
name: packageJson.name,
58+
version: packageJson.version,
59+
project: aioConfig?.project,
60+
runtimeNamespace: aioConfig?.runtime?.namespace
61+
}
62+
63+
if (cliDetails?.accessToken) {
64+
try {
65+
// send audit log at start (don't wait for deployment to finish)
66+
await sendAppUndeployAuditLog({
67+
accessToken: cliDetails?.accessToken,
68+
cliCommandFlags: flags,
69+
appInfo,
70+
env: cliDetails.env
71+
})
72+
} catch (error) {
73+
if (flags.verbose) {
74+
this.warn('Error: Audit Log Service Error: Failed to send audit log event for deployment.')
75+
this.warn(error.message)
76+
}
6177
}
78+
}
6279

80+
for (let i = 0; i < keys.length; ++i) {
81+
const k = keys[i]
82+
// TODO: remove this check once the deploy service is enabled by default
83+
const v = setRuntimeApiHostAndAuthHandler(values[i])
84+
85+
await this.undeployOneExt(k, v, flags, spinner)
6386
if (cliDetails?.accessToken) {
87+
// send logs for case of web-assets undeployment
6488
try {
65-
// send audit log at start (don't wait for deployment to finish)
66-
await sendAppUndeployAuditLog({
89+
await sendAppAssetsUndeployedAuditLog({
6790
accessToken: cliDetails?.accessToken,
6891
cliCommandFlags: flags,
6992
appInfo,
7093
env: cliDetails.env
7194
})
7295
} catch (error) {
73-
if (flags.verbose) {
74-
this.warn('Error: Audit Log Service Error: Failed to send audit log event for deployment.')
75-
this.warn(error.message)
76-
}
77-
}
78-
}
79-
80-
for (let i = 0; i < keys.length; ++i) {
81-
const k = keys[i]
82-
// TODO: remove this check once the deploy service is enabled by default
83-
const v = setRuntimeApiHostAndAuthHandler(values[i])
84-
85-
await this.undeployOneExt(k, v, flags, spinner)
86-
if (cliDetails?.accessToken) {
87-
// send logs for case of web-assets undeployment
88-
try {
89-
await sendAppAssetsUndeployedAuditLog({
90-
accessToken: cliDetails?.accessToken,
91-
cliCommandFlags: flags,
92-
appInfo,
93-
env: cliDetails.env
94-
})
95-
} catch (error) {
96-
this.warn('Warning: Audit Log Service Error: Failed to send audit log event for un-deployment.')
97-
}
96+
this.warn('Warning: Audit Log Service Error: Failed to send audit log event for un-deployment.')
9897
}
9998
}
99+
}
100100

101-
// 1.2. unpublish extension manifest
102-
if (flags.unpublish) {
103-
const payload = await this.unpublishExtensionPoints(libConsoleCLI, undeployConfigs, aioConfig, flags['force-unpublish'])
104-
this.log(chalk.blue(chalk.bold(`New Extension Point(s) in Workspace '${aioConfig.project.workspace.name}': '${Object.keys(payload.endpoints)}'`)))
105-
} else {
106-
this.log('skipping unpublish phase...')
107-
}
108-
} catch (error) {
109-
spinner.stop()
110-
// delegate to top handler
111-
throw error
101+
// 1.2. unpublish extension manifest
102+
if (flags.unpublish) {
103+
const payload = await this.unpublishExtensionPoints(libConsoleCLI, undeployConfigs, aioConfig, flags['force-unpublish'])
104+
this.log(chalk.blue(chalk.bold(`New Extension Point(s) in Workspace '${aioConfig.project.workspace.name}': '${Object.keys(payload.endpoints)}'`)))
105+
} else {
106+
this.log('skipping unpublish phase...')
112107
}
113108

114109
const command = await this.config.findCommand('app:clean')
@@ -151,8 +146,7 @@ class Undeploy extends BaseCommand {
151146
}
152147
spinner.succeed(chalk.green(`Un-deploying actions for ${extName}`))
153148
} catch (err) {
154-
spinner.fail(chalk.green(`Un-deploying actions for ${extName}`))
155-
throw err
149+
spinner.warn(chalk.yellow(`Error when un-deploying actions for ${extName}: ${err.message}`))
156150
}
157151
} else {
158152
this.log('no manifest file, skipping action undeploy')
@@ -168,8 +162,7 @@ class Undeploy extends BaseCommand {
168162

169163
spinner.succeed(chalk.green(`Un-Deploying web assets for ${extName}`))
170164
} catch (err) {
171-
spinner.fail(chalk.green(`Un-Deploying web assets for ${extName}`))
172-
throw err
165+
spinner.warn(chalk.yellow(`Error when un-deploying web assets for ${extName}: ${err.message}`))
173166
}
174167
} else {
175168
this.log('no frontend, skipping frontend undeploy')

test/commands/app/undeploy.test.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ describe('run', () => {
158158
mockFS.existsSync.mockReset()
159159
command = new TheCommand([])
160160
command.error = jest.fn()
161+
command.warn = jest.fn()
161162
command.log = jest.fn()
162163
command.appConfig = cloneDeep(mockConfigData)
163164
command.appConfig.actions = { dist: 'actions' }
@@ -325,27 +326,34 @@ describe('run', () => {
325326
expect(command.log).toHaveBeenCalledWith('no frontend, skipping frontend undeploy')
326327
})
327328

328-
test('should fail if scripts.undeployActions fails', async () => {
329+
test('should not fail if scripts.undeployActions fails', async () => {
329330
command.getAppExtConfigs.mockResolvedValueOnce(createAppConfig())
330331

331332
const error = new Error('mock failure Actions')
332333
mockRuntimeLib.undeployActions.mockRejectedValue(error)
333334

334-
await expect(command.run()).rejects.toThrow(error)
335+
await expect(command.run()).resolves.toBeUndefined()
336+
337+
// multiple check lines because error wraps text
338+
expect(stdout.output).toContain('Error when un-deploying actions for application: mock failure Actions')
335339

336340
expect(command.error).toHaveBeenCalledTimes(0)
337341
expect(mockRuntimeLib.undeployActions).toHaveBeenCalledTimes(1)
342+
expect(mockWebLib.undeployWeb).toHaveBeenCalledTimes(1)
338343
})
339344

340-
test('should fail if scripts.undeployWeb fails', async () => {
345+
test('should not fail if scripts.undeployWeb fails', async () => {
341346
command.getAppExtConfigs.mockResolvedValueOnce(createAppConfig())
342347

343348
const error = new Error('mock failure UI')
344349
mockWebLib.undeployWeb.mockRejectedValue(error)
345350

346-
await expect(command.run()).rejects.toThrow(error)
351+
await expect(command.run()).resolves.toBeUndefined()
352+
353+
expect(stdout.output).toContain('Error when un-deploying web assets for application: mock failure UI')
347354

348355
expect(command.error).toHaveBeenCalledTimes(0)
356+
expect(mockRuntimeLib.undeployActions).toHaveBeenCalledTimes(1)
349357
expect(mockWebLib.undeployWeb).toHaveBeenCalledTimes(1)
350358
})
351359

0 commit comments

Comments
 (0)