@@ -3,13 +3,15 @@ import ROS20190910, {
33 CreateStackRequest ,
44 CreateStackRequestParameters ,
55 CreateStackRequestTags ,
6+ GetStackRequest ,
67 ListStacksRequest ,
78 UpdateStackRequest ,
89 UpdateStackRequestParameters ,
910} from '@alicloud/ros20190910' ;
1011import { Config } from '@alicloud/openapi-client' ;
1112import { ActionContext } from '../types' ;
1213import { logger } from './logger' ;
14+ import { lang } from '../lang' ;
1315
1416const 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
4749const 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
6982const 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+
86122export 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} ;
0 commit comments