From 8231a5a37e4793e47e99c7ef09589bc36906f6e7 Mon Sep 17 00:00:00 2001 From: Eugenio Romano Date: Fri, 26 Apr 2019 18:15:31 +0100 Subject: [PATCH] Improve recovery strategy Activiti 7 --- e2e/resources/activiti7/subProcessApp.zip | Bin 2815 -> 2852 bytes e2e/util/resources.js | 4 +- scripts/check-activiti-env.js | 121 ++++++++++++++++++---- 3 files changed, 101 insertions(+), 24 deletions(-) diff --git a/e2e/resources/activiti7/subProcessApp.zip b/e2e/resources/activiti7/subProcessApp.zip index 6bf3c95510f26e636584d1fab5e2af858dae28e9..938393d4928612cca03618ac71f065f5c773fefa 100644 GIT binary patch delta 1952 zcmb7Fc{J2(AOD%bjIlJBA+8c4*)lP*Rw6gX*q3mv5wZ+3T!bdnoni>TA^X0>WQ+>8 z#dZ;4D28kyFGX(I@}jt2(|OPB-h0mb$NPQGbDr~jzt3~NpYu7N&-w15%ftk&a8Pa( z0Efc?@mo1*f@V<8;p{%>CoXKzjZn^`mY;L?yxEy0UjtoP6Cv z%QUhm-Z`oNlZ#0Im>!P zkQIu|&`x-nCUr7Xzz*B{z~Y&ZZm8rvO)kr(+%pFBUn&Be2h@kjmCN9wxtex@YNw#v z2wKxebM;P!L;{x;@?%w3Maqpf9x6 zG~f@KCWpBn%YQL^#9#z1=_nEVxE05)bA@Oa#|t8gSgckp)3|qseoiUZODS#c7v_)R zrSY~Fypr^be`Y||k0?vHl#$pyAMQ1E7*zwpQPQPH&Ih=mIujt8Nd_IpB=?z8TA_q9 zrLjQ2Ijzhy{rTY&hI2}<5u;)s#vB}-wi#7fvAs4@hsF?VU%H1MW&BGwQ$^UV<3fRW zo{m|Zx>~kH<4n*&qTC;8Uf)t@7swK52un>M+&S(%M*uXGsg5$=cf~4^`c{vc@IW9 zpR4v}eA02tB#Lbf!AJBLr&>9ZD#eRUhB~t zsE6)~osWaaF_0Q7V;M*1yY@;vv&*h|nYrbMb0^fibt)l`)>jSia}pP| z)4XV_&$m7Wl!Wc|6&>oxPRlZkE3* zV`E@9W^?V~p`5kc6HENt4G!P{#io3^PI>pquJmW=@Q;RqU9Pdi*ozgr%M8yCFbY15 z_{BbBZfoAO+Yl3(TI?!v>GT=m(q>LHc4@O{J+M;#sWnM$BPX417+x_aLUahLtyusA z=`|Xjg|ta+G11Db>@HIJ9@ai!58p-RvckdODVADH5hwt>L;%3w+ykK&rV?j3%J+G?7L$6`VfTVga@YFhsb>=U zWWTjO?LjkUJf*cR(8DT)|F=ky_?FrhR`d$<*KE-zzImqTqXIW)WVx$oK7gm|YlpOB z4%YHkG*o*R>kH45hD#F>4A^Tjxnv#@mQ^Gi7*8i)`|5*W%{7iLd4p2fRQ}uA6~3r# zNi4UV%9ypVfebI@d52FwrF%r-_ouPO15gVd;T?=hqDfIDW&v~-eYu`h{8g^F_E@B# z-nQEydiDjE{AWF|81H2LDtOda(N`rrYdX%k- zJ9UJs&39PY;$JUQhu^2Uhe^|0ZqpUcF&EV>kN1u%d5u}cq$>8a^Y07UIa-Ia-#HSa z%6|G_GcgqU{(7fWK`oZ7JZk%j5?q+jkbAF`VN30QO3&J)n)siRm}UDN>ZQI*?5KAZ zhzTnxWM;38Ror_vqapmeoh9s3h1b8g?M!x!V0Sv>L_N!B@>OPGOO2MEtXt+3BT>je zsLPT8H^WyMm+VbFop$4{N;KwedCr@Id(!z=iEkHJt~*eUKqbukg0r`{0N@_aKQsfr z;|(X{aSzo`V$Cr_Se%8{5Ei3>8>!bcJvoFoF<6niW! zRMjk06s-oWm2j#`{e1(_o`XQt@v6=j=d*d_k;4B)qwbQ!Jh_kL)HgI-5ESs|+yYJD z7lif)m&JE)f_d;DI48w15Gc$i1{sHf47dci0X+*|LkLK7YJVk)W1;WS0M_t1^KssM zBLPGr(2!#=kimBlJcGdba0-9L!{Ok2Ov8ZxhY>=s6^@6O^PP8pl|TR>5YD;%2ih)3 A+yDRo literal 2815 zcmWIWW@Zs#;Nak3`06pyj{ymAF$gmh6y+zU78j=$>z5YrGcbPqF3W}xVrB^NX6FFu zV1jB3z-gEggEo?30T5#Y5{pvvO7xNna`TJ~^eS?5N(Ab}T zB6q)QPx#*A&QZBy%Pg~%CPBA5)nqfvPTb(D;A%Ulrc!VJOpvK%%gdy)8~eV`dtCgE zHShiRz!h&iPGz2vN$4qAAkdcNGxL2ze7^rHo;&yN-l_6Da)wnc`qYXE3u7i$_UM0` zW2GRV6qyk<@A={yo37w^h{~@2RJCL2s*}^($QeGdd;(R;2leQnQiwa3g;{MwEzxWOpn=IIgQvvB?) z4h^Pdc7p2-lx!M1OpbO*_hhX37&NO$Q_(UuMEbm8)1ohrxL;`;owu_8n@sa=Y1fr+ zy)H=zp7XByy4lLz__Xrvm0jB}ug!|Q5wLfqZ7Am@-sGfN7p~bZFz~$1_*yHSH~3J? z9@Y4_oTpg6I8|y~>Y0+jE7KP!cJjoe{fkP^E&0DP;_Z{nlWCWAVi)UOYB@IZL-NhK za_LXzllOYeJ7iJLE4W8qV(--|N70UJ?k}6RbA^6jp4xcmv5xB#^_$;*Tn(GXoy<#XXa>tB`myuWqT=xL0;<+tx_h_=q31(OYfq*m*a~ zocDfTZ2N?XYMWw2d&6DklpYHez9YDu?Iw%CN{2gXFSl9UeZ$Ddw^FC`;v>a#64UN8 zut&7{SX&&}@?^U5@(30_iQ5jG9AB9OZL@i$*ZQY-Jm>oTGrnc=@fOe4i+%E8 z!ijyNs)^ZQg7eNqond?Q%(-x`w1|tn*sqPIQtJ}W9N&GwYQN+1k9u6SPm<3_EqrSJ zV96Js|C=tUFZwHHuU=VL_uJ*|;sgKpDzB3Kw?_Gu=l(ZeQZBswY*D?TSg*t-eYebu z%i4>7H%+JyzjgEd)w^fyL0Qh|d!YOeV4j=B$pFlPxbm+$g8{BAr<+<)lA2eXnV(mz zmsOmfS6ZOMz&QJu@}bg63Q^W;!DwFS!q#q=T%>{SlmC4D(y{sXJ5 zr#1gx{bdIEZBtg({BU4#k_5!K{ievEh3PlvjLe)Al+r|vfpOaU=d~EVLRUF87*?3* zyg#^SmYT+rAa6G*&6h4-+NI)_+qkD4PIT31;2C zmg~Gd%SfbRUVq&7*|sMmJ7x8j9BMMK*wAyUC4A~k#Z$8czihZ|m&tkmb6zt?ZvE2N zXJ>f+EMNKZJa_-3^Ol)bNj6c(#Px*T-YZt>_+IgK-C(r(Pk+Gzdv2TUlSP>Pgf$8y z#m_91N$1s54A^mUM%5wJ$);*&y1w5osBArVZ&~YVX@<7ft7dl@X!bq{u-~gb#$-$T=%A6m*L+z7vtYoeq{$G zo{)?6xknfo7`RyQB_1^feH@7gJ)M^pXfrTgRN3c(Jq4jFUmbSJCva1cmc}W6KV7|R zrlvkVCVpFeF8Uf8dtWm(^fSG@)yL4_qOXzp#tlBkW(M0mi~?7&f@@Jh?nf@>z$9;q zH`z-uC^G;n#H`fhlJLxujNsBFAP-bQLvyh_1Ec*4m6f=a0A1*P#y50R5SPZO^IpDs zoac2;a_IRoeVP>9-95Er%Bi64F5}Oi8?<;D_Ds3*=*glpO+p0BSg(0z~j(X+{KiqZ)-=x`CPv2;d83B8-B1osvcby4A>q52*M= zfCJ1ptwv7;q!y;=jzCVtpmGiY<^Yp5hX2vaveE)#OFeXpk<%b3k08KJHe42CdY+^l mgYE?6BnC?C2r!u)n58L6`T^doKwmI0umRyFU{W;)w_E`j^F=EF diff --git a/e2e/util/resources.js b/e2e/util/resources.js index b831d960b8..f5f0da2254 100644 --- a/e2e/util/resources.js +++ b/e2e/util/resources.js @@ -527,7 +527,7 @@ exports.ACTIVITI7_APPS = { } }, SUB_PROCESS_APP: { - name: "subprocess-app", - file_location: "/resources/activiti7/subProcessApp.zip", + name: "subprocessapp", + file_location: "/resources/activiti7/subprocessapp.zip", } }; diff --git a/scripts/check-activiti-env.js b/scripts/check-activiti-env.js index e74b1af6e3..2b763fb99e 100755 --- a/scripts/check-activiti-env.js +++ b/scripts/check-activiti-env.js @@ -63,7 +63,7 @@ async function main() { if (notRunningSecondAttempt && notRunningSecondAttempt.length > 0) { let notRunningAppAfterWaitSecondAttempt = await waitPossibleStaleApps(this.alfrescoJsApi, notRunningSecondAttempt); - if (notRunningAppAfterWaitSecondAttempt && notRunningAppAfterWaitSecondAttempt.legnth > 0) { + if (notRunningAppAfterWaitSecondAttempt && notRunningAppAfterWaitSecondAttempt.length > 0) { console.log(`Not possible to recover the following apps in the environment`); notRunningAppAfterWaitSecondAttempt.forEach((currentApp) => { @@ -72,8 +72,8 @@ async function main() { process.exit(1); } - }else{ - console.log(`Activiti 7 all ok :)`); + } else { + console.log(`Activiti 7 all ok :)`); } } else { console.log(`Activiti 7 all ok :)`); @@ -89,7 +89,6 @@ async function deleteStaleApps(alfrescoJsApi, notRunningAppAfterWait) { } async function waitPossibleStaleApps(alfrescoJsApi, notRunning) { - do { console.log(`Wait stale app ${TIMEOUT}`); @@ -125,6 +124,7 @@ async function getNotRunningApps(alfrescoJsApi) { Object.keys(ACTIVITI7_APPS).forEach((key) => { let isNotRunning = allStatusApps.find((currentApp) => { + //console.log(currentApp.entry.name + ' ' +currentApp.entry.status); return ACTIVITI7_APPS[key].name === currentApp.entry.name && currentApp.entry.status !== 'Running'; }); @@ -146,7 +146,6 @@ async function getNotRunningApps(alfrescoJsApi) { } async function deployAbsentApps(alfrescoJsApi) { - let deployedApps = await getDeployedApplicationsByStatus(alfrescoJsApi, ''); Object.keys(ACTIVITI7_APPS).forEach((key) => { @@ -178,37 +177,44 @@ async function checkIfAppIsReleased(apiService, absentApps) { if (!app) { - let uploadedApp = await importApp(apiService, currentAbsentApp); + console.log('Missing project, create the project for ' + currentAbsentApp.name); + + let uploadedApp = await importProjectApp(apiService, currentAbsentApp); + + console.log('Project uploaded ' + currentAbsentApp.name); + if (uploadedApp) { await releaseApp(apiService, uploadedApp); - await deployApp(apiService, uploadedApp); + await deployApp(apiService, uploadedApp, currentAbsentApp.name); } } else { - let appRelease = undefined; - let appReleaseList = await getReleaseAppyProjectId(apiService, app.entry.id); + console.log('Project for ' + currentAbsentApp.name + 'present'); - if (!appReleaseList) { + let appRelease = undefined; + let appReleaseList = await getReleaseAppProjectId(apiService, app.entry.id); + + if (appReleaseList.list.entries.length === 0) { + console.log('1 '); appRelease = await releaseApp(apiService, app); } else { - appRelease = appReleaseList.list.entries.find((currentRelease) => { return currentRelease.entry.version === 'latest'; }); } - console.log('App to deploy ' + appRelease.entry.projectName + ' app release id ' + JSON.stringify(appRelease.entry.id)); + console.log('App to deploy app release id ' + JSON.stringify(appRelease)); - await deployApp(apiService, appRelease); + await deployApp(apiService, appRelease, currentAbsentApp.name); } } } -async function deployApp(apiService, app) { +async function deployApp(apiService, app, name) { const url = `${config.hostBpm}/alfresco-deployment-service/v1/applications`; const pathParams = {}; const bodyParam = { - "name": app.entry.projectName, + "name": name, "releaseId": app.entry.id, "version": app.entry.name, "security": [{"role": "APS_ADMIN", "groups": [], "users": ["admin.adf"]}, { @@ -225,12 +231,12 @@ async function deployApp(apiService, app) { return await apiService.oauth2Auth.callCustomApi(url, 'POST', pathParams, queryParams, headerParams, formParams, bodyParam, contentTypes, accepts); } catch (error) { - console.log(`Not possible to deploy the project ${app.entry.projectName} status : ${JSON.stringify(error.status)} ${JSON.stringify(error)}`); + console.log(`Not possible to deploy the project ${app.entry.projectName} status : ${JSON.stringify(error.status)} ${JSON.stringify(error.response.text)}`); process.exit(1); } } -async function importApp(apiService, app) { +async function importProjectApp(apiService, app) { const pathFile = path.join('./e2e/' + app.file_location); const file = fs.createReadStream(pathFile); @@ -241,18 +247,22 @@ async function importApp(apiService, app) { contentTypes = ['multipart/form-data'], accepts = ['application/json']; try { + console.log('import app ' + app.file_location); return await apiService.oauth2Auth.callCustomApi(url, 'POST', pathParams, queryParams, headerParams, formParams, bodyParam, contentTypes, accepts); } catch (error) { if (error.status !== 409) { - console.log(`Not possible to upload the project ${app.name} status : ${JSON.stringify(error.status)} ${JSON.stringify(error.text)}`); + console.log(`Not possible to upload the project ${app.name} status : ${JSON.stringify(error.status)} ${JSON.stringify(error.response.text)}`); process.exit(1); + } else { + console.log(`Not possible to upload the project because inconsistency CS - Modelling try to delete manually the node`); + await deleteSiteByName(app.name); + await importProjectApp(apiService, app); } } - } -async function getReleaseAppyProjectId(apiService, projectId) { +async function getReleaseAppProjectId(apiService, projectId) { const url = `${config.hostBpm}/alfresco-modeling-service/v1/projects/${projectId}/releases`; const pathParams = {}, queryParams = {}, @@ -281,7 +291,7 @@ async function releaseApp(apiService, app) { return await apiService.oauth2Auth.callCustomApi(url, 'POST', pathParams, queryParams, headerParams, formParams, bodyParam, contentTypes, accepts); } catch (error) { - console.log(`Not possible to release the project ${app.entry.name} status : ${JSON.stringify(error.status)} ${JSON.stringify(error.text)}`); + console.log(`Not possible to release the project ${app.entry.name} status : $ ${JSON.stringify(error.status)} ${JSON.stringify(error.response.text)}`); process.exit(1); } @@ -301,7 +311,7 @@ async function getDeployedApplicationsByStatus(apiService, status) { return data.list.entries; } catch (error) { - console.log(`Not possible get the applicationsfrom alfresco-deployment-service ${JSON.stringify(error)} `); + console.log(`Not possible get the applications from alfresco-deployment-service ${JSON.stringify(error)} `); process.exit(1); } @@ -353,4 +363,71 @@ function sleep(delay) { while (new Date().getTime() < start + delay) ; } +async function deleteChildrenNodeByName(alfrescoJsApi, nameNodeToDelete, nodeId) { + let childrenNodes = await alfrescoJsApi.core.nodesApi.getNodeChildren(nodeId); + + let childrenToDelete = childrenNodes.list.entries.find((currentNode) => { + console.log(currentNode.entry.name); + return currentNode.entry.name === nameNodeToDelete; + }); + + console.log('childrenToDelete ' + childrenToDelete); + + if (childrenToDelete) { + await alfrescoJsApi.core.nodesApi.deleteNode(childrenToDelete.entry.id); + } + + +} + +async function deleteSiteByName(name) { + + console.log(`====== Delete Site ${name} ${program.host} ======`); + + let alfrescoJsApi = new alfrescoApi.AlfrescoApiCompatibility({ + provider: 'ECM', + hostEcm: `http://${program.host}` + }); + + await alfrescoJsApi.login(program.username, program.password); + + let listSites = []; + + try { + listSites = await alfrescoJsApi.core.sitesApi.getSites(); + } catch (error) { + console.log('error get list sites' + JSON.stringify(error)); + process.exit(1); + } + + let apsModelingNodeId; + let apsReleaseNodeId; + + if (listSites && listSites.list.entries.length > 0) { + for (let i = 0; i < listSites.list.entries.length; i++) { + if (listSites.list.entries[i].entry.id === name) { + try { + await alfrescoJsApi.core.sitesApi.deleteSite(listSites.list.entries[i].entry.id, {options: {permanent: true}}); + } catch (error) { + console.log('error' + JSON.stringify(error)); + } + } + + if (listSites.list.entries[i].entry.id === 'ApsModeling') { + apsModelingNodeId = listSites.list.entries[i].entry.guid; + } + + if (listSites.list.entries[i].entry.id === 'ApsRelease') { + apsReleaseNodeId = listSites.list.entries[i].entry.guid; + } + } + } + + console.log(`====== Delete Folder in apsModeling`); + await deleteChildrenNodeByName(alfrescoJsApi, name, apsModelingNodeId); + + console.log(`====== Delete Folder in apsRelease`); + await deleteChildrenNodeByName(alfrescoJsApi, name, apsReleaseNodeId); +} + main();