Skip to content

Commit f9c3574

Browse files
committed
feat: wait stack deploy finish #5
Signed-off-by: seven <[email protected]>
1 parent 8b52fec commit f9c3574

File tree

2 files changed

+58
-12
lines changed

2 files changed

+58
-12
lines changed

src/common/rosClient.ts

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ import ROS20190910, {
33
CreateStackRequest,
44
CreateStackRequestParameters,
55
CreateStackRequestTags,
6+
GetStackRequest,
67
ListStacksRequest,
78
UpdateStackRequest,
89
UpdateStackRequestParameters,
910
} from '@alicloud/ros20190910';
1011
import { Config } from '@alicloud/openapi-client';
1112
import { ActionContext } from '../types';
1213
import { logger } from './logger';
14+
import { lang } from '../lang';
1315

1416
const client = new ROS20190910(
1517
new Config({
@@ -31,17 +33,17 @@ const createStack = async (stackName: string, templateBody: unknown, context: Ac
3133

3234
const createStackRequest = new CreateStackRequest({
3335
regionId: context.region,
36+
sync: true,
3437
stackName,
3538
templateBody: JSON.stringify(templateBody),
3639
parameters,
3740
tags: context.tags?.map((tag) => new CreateStackRequestTags(tag)),
3841
});
3942

40-
console.log('createStackRequest:', createStackRequest);
41-
4243
const response = await client.createStack(createStackRequest);
43-
console.log(`创建中,资源栈ID:${response.body?.stackId}`);
44-
return response.body?.stackId;
44+
logger.info(`创建中,资源栈ID:${response.body?.stackId}`);
45+
// wait for stack create complete
46+
return await getStackActionResult(response.body?.stackId || '', context.region);
4547
};
4648

4749
const updateStack = async (stackId: string, templateBody: unknown, context: ActionContext) => {
@@ -53,17 +55,28 @@ const updateStack = async (stackId: string, templateBody: unknown, context: Acti
5355
}),
5456
);
5557

56-
const createStackRequest = new UpdateStackRequest({
58+
const updateStackRequest = new UpdateStackRequest({
5759
regionId: context.region,
5860
stackId,
5961
templateBody: JSON.stringify(templateBody),
6062
parameters,
6163
tags: context.tags?.map((tag) => new CreateStackRequestTags(tag)),
6264
});
63-
64-
const response = await client.updateStack(createStackRequest);
65-
console.log(`更新中,资源栈ID:${response.body?.stackId}`);
66-
return response.body?.stackId;
65+
try {
66+
const response = await client.updateStack(updateStackRequest);
67+
logger.info(`更新中,资源栈ID:${response.body?.stackId}`);
68+
// wait for stack update complete
69+
return await getStackActionResult(response.body?.stackId || '', context.region);
70+
} catch (err) {
71+
const { Message: message, statusCode } =
72+
(err as { data: { Message: string; statusCode: number } })?.data || {};
73+
if (statusCode === 400 && message.includes('Update the completely same stack')) {
74+
logger.warn(`${lang.__('UPDATE_COMPLETELY_SAME_STACK')}`);
75+
return null;
76+
} else {
77+
throw err;
78+
}
79+
}
6780
};
6881

6982
const getStackByName = async (stackName: string, region: string) => {
@@ -83,6 +96,29 @@ const getStackByName = async (stackName: string, region: string) => {
8396
}
8497
};
8598

99+
const getStackActionResult = async (stackId: string, region: string) => {
100+
return new Promise((resolve, reject) => {
101+
const interval = setInterval(async () => {
102+
try {
103+
const result = await client.getStack(
104+
new GetStackRequest({
105+
regionId: region,
106+
stackId,
107+
}),
108+
);
109+
logger.info(`stack status: ${result.body?.stackStatus}`);
110+
if (result.body?.stackStatus?.indexOf('IN_PROGRESS') < 0) {
111+
clearInterval(interval);
112+
resolve(result.body);
113+
}
114+
} catch (error) {
115+
clearInterval(interval);
116+
reject(error);
117+
}
118+
}, 5000); // 5 seconds interval
119+
});
120+
};
121+
86122
export const rosStackDeploy = async (
87123
stackName: string,
88124
templateBody: unknown,
@@ -97,10 +133,14 @@ export const rosStackDeploy = async (
97133
}
98134

99135
logger.info(`Update stack: ${stackName} deploying... `);
100-
return await updateStack(stackInfo.stackId as string, templateBody, context);
136+
const stack = await updateStack(stackInfo.stackId as string, templateBody, context);
137+
138+
logger.info(`updateStack: ${JSON.stringify(stack)}`);
101139
} else {
102140
// create stack
103141
logger.info(`Create stack: ${stackName} deploying... `);
104-
return await createStack(stackName, templateBody, context);
142+
const stack = await createStack(stackName, templateBody, context);
143+
144+
logger.info(`createStack: ${JSON.stringify(stack)}`);
105145
}
106146
};

src/lang/index.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@ import { I18n } from 'i18n';
22

33
const lang = new I18n({
44
locales: ['en', 'cn'],
5-
register: [{ hello: 'hello' }, { hello: '你好' }],
5+
register: [
6+
{
7+
hello: 'hello',
8+
UPDATE_COMPLETELY_SAME_STACK: 'The stack is completely the same, update SKIPPED',
9+
},
10+
{ hello: '你好', UPDATE_COMPLETELY_SAME_STACK: '栈完全相同,更新跳过' },
11+
],
612
});
713

814
export { lang };

0 commit comments

Comments
 (0)