1 import javax.imageio.ImageIO
4 import java.awt.event.ActionEvent
5 import java.awt.event.ActionListener
7 import java.util.concurrent.Callable
8 import java.util.concurrent.Executors
9 import java.util.concurrent.atomic.AtomicBoolean
11 import static ServiceControl.*
12 import static Services.*
15 version '1.01-SNAPSHOT'
17 apply plugin: 'groovy'
19 apply plugin: "org.hidetake.ssh"
20 apply plugin: 'java-gradle-plugin'
23 sourceCompatibility = 1.8
31 classpath 'org.codehaus.groovy:groovy-all:2.4.12'
32 classpath "org.hidetake:gradle-ssh-plugin:2.9.0"
40 CACHING , //elawsrticsearch
52 //fill YOUR_WINDOWS_USER_HOME
53 project.ext.set("NEW_VAG",Boolean.FALSE) //flags to use new vagrant configuration
54 project.ext.set("IS_HOTSWAP",Boolean.FALSE) //flags to use new vagrant configuration
55 project.ext.set("PROJECT_PATH", System.getenv("SDC")) //ex. 'C:\\GIT_WORK\\asdc\\sdc')
56 project.ext.set("VAGRANT_HOME", NEW_VAG ? System.getenv("NEW_VAG") : System.getenv("VAG")) //ex. 'C:\\GIT_WORK\\vagrant-asdc-all-in-one')
57 project.ext.set("USER_HOME", "${System.getenv("USERPROFILE")}\\.ssh")
58 project.ext.set("BE_REMOTE", NEW_VAG ? '/opt/app/jetty/base/be' : '/home/vagrant/catalog-be' )
59 project.ext.set("FE_REMOTE", NEW_VAG ? '/opt/app/jetty/base/fe' : '/home/vagrant/catalog-fe' )
60 project.ext.set("VAGRANT_USER", NEW_VAG ? 'm11981' : 'vagrant' )
61 project.ext.set("RSA_PRIVATE_KEY_PATH", NEW_VAG ? "$VAGRANT_HOME/id_rsa" : '' )
62 project.ext.set("VAGRANT_PASSWORD", NEW_VAG ? 'Aa123456' : 'vagrant' )
63 project.ext.set("X_FOLDER",'/xFolder' )
64 project.ext.set("BE_DEPENDENCIES", 'common-be,common-app-api,catalog-dao,catalog-model,security-utils' )
65 project.ext.set("command", [ (ALL) : [ (HEALTH) : { NEW_VAG ? 'sudo curl -i http://localhost:8181/sdc1/rest/healthCheck' : 'curl -i localhost:8080/sdc2/rest/healthCheck' } ,
66 (KILL) : { NEW_VAG ? 'sudo pkill java' : 'pkill java'} ] , // TODO: refine kill only for services
67 (BACKEND) : [ (START) : { NEW_VAG ? 'sudo service jettyBE start' : 'service catalog-be start'} ,
68 (STOP) : { NEW_VAG ? 'sudo service jettyBE stop' : 'service catalog-be stop'} ,
69 (RESTART) : { NEW_VAG ? 'sudo service jettyBE restart' : 'service catalog-be restart'}] ,
70 (DB) : [ (START) : { NEW_VAG ? 'sudo service cassandra start' : 'start-asdc-storage.sh' } ,
71 (STOP) : { NEW_VAG ? 'sudo service cassandra stop' : 'service cassandra stop'} ,
72 (RESTART) : { NEW_VAG ? 'sudo service cassandra restart' : 'service cassandra restart'} ] ,
73 (FRONTEND): [ (START) : { NEW_VAG ? 'sudo service jettyFE start' : 'service catalog-fe start' } ,
74 (STOP) : { NEW_VAG ? 'sudo service jettyFE stop' : 'service catalog-fe stop'} ,
75 (RESTART) : { NEW_VAG ? 'sudo service jettyFE restart' : 'service catalog-fe restart' } ] ,
76 (CACHING): [ (START) : { NEW_VAG ? 'sudo service elasticsearch start' : 'echo "starting es is not yet supported"' } ],
77 (SECURITY): [ (START) : { NEW_VAG ? 'sudo docker start sdc-WebSeal-Simulator' : 'service webseal-simulator start' } ,
78 (STOP) : { NEW_VAG ? 'sudo docker stop sdc-WebSeal-Simulator' : 'service webseal-simulator stop'} ,
79 (RESTART) : { NEW_VAG ? 'sudo docker restart sdc-WebSeal-Simulator' : 'service webseal-simulator restart'}]
80 ] ) //abstraction level to shell scripts , support old and new vagrant bash commands
83 project.ext.set("warnImg",'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAADvSURBVDhPY2RgYPgPxGQDiAGLXkB4UMD56DuD9YFUhj179oD5Li4uDEcdZjN8l+ME8+EgTgLTAJDm7zWKYPb/enUwzdh4E0xzttxHNQRoABOUCQYYmj+9QrCBACQHUoMM4AYga74ZDiRAmvnEwHwQGywGBOiGgA1A16wmJYjQDAJANkgMmyEosYBVMzIAuuTWs/cM6iuhfCCAGwDWrAHxKyFw68ZNuCE40wGygcga0AEkEEHRiIxxASzqUKKRHIAwAJgo4BgXwKIGxQUgf8MwOsAlh+EFUMDBMAxgE0MGoLwAignSMFQPzmgkDjAwAACSmn13nChk1QAAAABJRU5ErkJggg==')
84 project.ext.set("okImg1",'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAD4SURBVDhPY2RgYPgPxGQDiAGLXkB4UMD56DuD9YFUhj179oD5Li4uDEcdZjN8l+ME8+EgTgLTAJDm7zWKYLbSRh8wfc9/C5jmbLmPagjQACYoEwwwNLMxgzHMIJAcSA0ygBuArFm81gyi+ddfCAaywWJAgG4I2AB0zdxWkhCNMABkg8SwGYISC1g1IwOgS74ee87wsvkUVADJAJjpyIDbRAxMfz3zCkwjA5ghONMB2DVIBiDbigwggQiKRmSMC2BRhxKN5ACEAcBEAce4ABY1LFAaDLAFJAwgyyGHB4YXQAEHwzCATQwZgPICKCZIw1A9OKOROMDAAAA4gXvZorg7ZgAAAABJRU5ErkJggg==')
85 project.ext.set("okImg2" , 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAADjSURBVDhPY2RgYPgPxGQDiAGLXkB4UMD56DuD9YFUhj179oD5Li4uDEcdZjN8l+ME8+EgTgLTAJDm7zWKYPbWZ7Jg2lvqMZjmbLmPagjQACYoEwywaQYBGBskB1KDDOAGIGuetFsUTCMDmBi6IWAD0DUra3OA2cgAJIbNEJRYwKUZGdy9+oMhz/U1lIdkADZnwwwDaUIHMENwpgNk16DbigwggQiKRmSMC2BRhxKN5ACEAcBEAce4ABY1LFAaDLAFJAwgyyGHB4YXQAEHwzCATQwZgPICKCZIw1A9OKOROMDAAAAZD3X55epfOAAAAABJRU5ErkJggg==')
86 project.ext.set("errorImg" , 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAADlSURBVDhPY2RgYPgPxGQDiAGLXkB4UMD56DuD9YFUhj179oD5Li4uDEcdZjN8l+ME8+EgTgLTAJDm7zWKYPZbGRUwLfzkDpjmbLmPagjQACYoEwywaQYBGBskB1KDDOAGIGtexisCppEBTAzdELAB6Jrd+QXAbGQAEsNmCEos4NKMDHZ+/MAQ9fkNlIdkADZnwwwDaUIHyIaADMDAQAP/AwMPjEFsbGpAGGs6AEUPsnfgzsaiDiUayQUgF2A4jaAXoHpQXAByNgyjA1xyGF4A+RuGYQCbGDLA6gWCGKoHJSGRDhgYAL/hkunRq+joAAAAAElFTkSuQmCC')
87 project.ext.set("unavailableImg" , 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABJ0AAASdAHeZh94AAAAB3RJTUUH4QwNDgEDrNoaqgAAAOhJREFUOMulkz8OgjAUhz8MQ7mBkwnnkBAH4mbCCdxcXLwAoxdwYXHjBCRupoMheg4TJ29QNhwshMofSfpLOry2v6/vta8OUGEhF4DsbUx6L8XytkNKCUAURTxWZ9TCM93buQb8mFXiI4E43gCQ5xeQPt7x2YG4fWa0OQwDhBANRCVdyGyKOQyDJhuV+HgvZQLGzABCiEGI036FPnNbZVlSFPfvnWg1gJpea72OjPh6lUZcQ5yhPkjTkxHv94fpfcB23t81PftmWMr9e+pQZjobd6zuobX2fViXAFCRvSv9GtOH9ji23/kDswRrCVqtQOAAAAAASUVORK5CYII=')
91 project.ext.set("trayIcon", null)
92 project.ext.set("lastStatus", null)
93 project.ext.set("isStopHealthCheck", false)
94 project.ext.set("isHaltHealth", new AtomicBoolean(false) )
95 project.ext.set("startedAwait", Long.MAX_VALUE)
96 project.ext.set("logFile", 'C:/ProgramData/all.log')
97 project.ext.set("pomList" , ["${System?.getenv('SDC')}/catalog-fe/pom.xml" ,"${System?.getenv('SDC')}/catalog-be/pom.xml" ] ) //empty list will scan all openecomp poms
98 project.ext.set("pomChangesMap" , [:] )
99 project.ext.set("beConfigFilesToCopyMapping" , [ 'src/main/resources/config/*.yaml' : 'config/catalog-be/' ,
100 'src/main/resources/config/*.properties' : 'config/catalog-be/'] )
103 project.ext.set("toggleHealthString" , "Halt Health" )
105 project.ext.set("toggleHealthItemView" , null )
108 project.ext.set("IS_MVN_INSTALL",false)
109 project.ext.set("executor" , null )
110 project.ext.set("lockObj" , new Object() )
112 println "2. hello compile2"
115 /*def post(String host , String serviceName,String msg){
117 def post = new URL("$host/$serviceName").openConnection();
118 def message = '{"message":"this is a message"}'
119 post.setRequestMethod("POST")
120 post.setDoOutput(true)
121 post.setRequestProperty("Content-Type", "application/json")
122 post.getOutputStream().write(message.getBytes("UTF-8"));
123 def postRC = post.getResponseCode();
125 if( postRC.equals(200)) {
126 println(post.getInputStream().getText());
130 def postStat( long operationTime, String user , String meta ){
131 def host = 'http://135.76.123.70:8888'
132 def params = "user=$user&meta=$meta"
133 post host , "UserStats" , params
137 def hash( List list ){
138 def map = list?.collectEntries { File file -> [(file?.absolutePath) : file?.text?.hashCode() ]}
144 long started = System.currentTimeMillis()
148 def changes = pomList?.findAll {
149 def File file = new File(it);
150 pomChangesMap[it] != file?.text?.hashCode()
152 println "\n\n[MasterD][POM]--> detected changes for -> $changes"
153 //update changes in map
154 changes?.each { pomChangesMap[it] = new File(it)?.text?.hashCode() }
155 println "\n\n[MasterD][POM]--> pom map -> $pomChangesMap"
158 ****** POM changes detection finished after -> ${System.currentTimeMillis()- started}ms ******
163 //list pom with updated file hashes
165 long started = System.currentTimeMillis()
167 def tree = fileTree( PROJECT_PATH ).include '**/pom.xml'//.filter { it.isFile() && it?.toString()?.toLowerCase()?.endsWith('pom.xml') }
168 //println "$PROJECT_PATH list is ->${ list?.collect { it?.absolutePath } }"
169 //flatten and filter openecomp poms
170 pomList = tree?.flatten()?.findAll { File file -> file?.text?.contains('org.openecomp.sdc') }?.collect {File file -> file?.absolutePath }
172 pomChangesMap = pomList.collectEntries { absolutePath ->[ ( absolutePath ) : new File(absolutePath)?.text?.hashCode() ] }
174 println """ [MasterD][Init] intializing POM detector
176 ********* POM listing finished after -> ${System.currentTimeMillis()- started}ms *********
182 task initialization(){
184 executor = Executors.newCachedThreadPool();
187 def parallel( closure ){
188 executor?.submit(new Callable<Object>(){
190 public Object call() {
196 /*class Preferences {
198 def String IsNewVagrant
199 def String IsRapidMode
203 def folder = new File(X_FOLDER);
204 folder?.exists() ?: folder?.mkdirs()
206 new File("${folder?.absolutePath}/$PREFERENCES_FILENAME")
211 //postStat(10000, "shay" , "report/index")
213 new File('catalog-be\\pom.xml') << "#hello"
219 def fetchFilesByExtention(remote, local , ext ){
221 def started = System.currentTimeMillis()
222 println "folder diff"
223 session(remotes.vagrant) {
224 //execute "cd /home/vagrant/catalog-be/tmp ; ls -lt | grep catalog-be" //todo- use my dates to filter
225 get from: remote , into: local , filter: { it?.absolutePath =~ /jetty.*catalog-be.*\.dir.*\.$ext/ } // { it?.absolutePath =~ /.*catalog-be.*dir.*classes.*/ }
227 println "fetched files in ${System.currentTimeMillis() - started} ms"
231 def updateRemoteFile(String remote , String local){
233 def to = "$BE_REMOTE${remote[remote?.indexOf("tmp\\")..remote.size()-1].replaceAll("\\\\","/")}"
234 println "copying $local \nto\n $to"
235 session(remotes.vagrant) {
236 put from: local , into: to }
240 def compareAndSwap(){
242 def newClasses = new File("$PROJECT_PATH\\catalog-be\\target\\classes")
243 def File jettyClasses ;
245 println "traversing.."
246 new File("build/hotswap").traverse { if (it?.directory && it?.name?.equals("classes")){
250 def jettyClassesList = []
251 jettyClasses?.traverse { jettyClassesList << it }
253 println "$jettyClasses"
254 //Sort compiled classes
256 newClasses?.traverse { files << it }
257 def result = files.sort{ a,b -> b.lastModified() <=> a.lastModified() }
258 println "show only last $LIMIT changes"
259 result[0..LIMIT]?.each{ println it?.lastModified() +" | "+ it?.name + (it?.directory ? "[Directory]" : "") } //show only last 10 changes
262 def changesMap = [ : ] //<old,new>
263 println "updating changes"
264 result[0..LIMIT]?.each { File f -> def File other = jettyClassesList.find{ File other-> other?.absolutePath?.endsWith(f?.name) };
265 if ( !(f.directory) && f?.text?.hashCode() != other?.text?.hashCode() )
266 updateRemoteFile( other?.getAbsolutePath() , f?.getAbsolutePath() )
272 new File("build/hotswap")?.deleteDir()
273 new File("build/hotswap")?.mkdirs()
275 knownHosts = allowAnyHosts
277 fetchFilesByExtention( "$BE_REMOTE/tmp/" , 'build/hotswap' , "class")
287 password = VAGRANT_PASSWORD
288 identity = NEW_VAG ? new File(RSA_PRIVATE_KEY_PATH) : null
299 backupDB() //and clean all
300 //restoreDB() //restore latest
305 //todo- conside updating from git
309 def importHeatTypes(){
317 // add conformence level
319 def createSchemaPreStep(){
322 def createSchemaPostStep(){
323 ////todo- impl create amdocs dox
326 createSchemaPreStep()
327 //todo- create schema
329 createSchemaPostStep()
335 knownHosts = allowAnyHosts
338 session(remotes.vagrant) {
339 execute "cqlsh -e 'DROP KEYSPACE titan;'"
340 println "[MasterD][DB_DROP]-> Dropped 'titan' KEYSPACE."
359 knownHosts = allowAnyHosts
362 session(remotes.vagrant) {
363 def tmp = '$CASSANDRA_HOME/backup/e2e'
364 //execute 'mkdir $CASSANDRA_HOME/backup/e2e/'
365 //execute 'wget http://135.76.210.202:8080/ETE_backup_files/latest_ETE_backup_file.zip -P /vagrant/db'
366 println "[MasterD] download finished, unzipping.."
367 execute "unzip -u $tmp/latest_ETE_backup_file.zip" //execute 'unzip -u /vagrant/db/latest_ETE_backup_file.zip'//'
368 def folder = execute "cd $tmp; ls -d -- */"
369 println "[MasterD] unzipping finished into -> $folder , untaring.."
370 execute "tar zxf $tmp/$folder/* --strip 3 -C" +'$CASSANDRA_HOME/data | pv -l >/dev/null'
371 println "[MasterD][E2E_DB]-> Downloaded & unzipped e2e data successfully."
376 def copyExplodedBE() {
378 println "[MasterD][BackEnd] copying exploded war."
380 knownHosts = allowAnyHosts
382 long started = System.currentTimeMillis()
383 def dirPath = "${PROJECT_PATH}/catalog-be/target/catalog-be-1.1.0-SNAPSHOT"
384 def dir = new File(dirPath);
385 println "[MasterD][BackEnd] copying ${dir?.directorySize()/(1024*1024)} MB, from ${dir?.name} to $BE_REMOTE/webapps"
387 session(remotes.vagrant) {
388 execute "rm -R $BE_REMOTE/webapps/catalog-be-1.1.0-SNAPSHOT"
389 put from: dir?.absolutePath , into: "$BE_REMOTE/webapps"
392 println "[MasterD][BackEnd] Successfully copied exploded war in ${System.currentTimeMillis()-started}ms."
395 task copyExplodedBE(){
403 knownHosts = allowAnyHosts
406 session(remotes.vagrant) {
407 execute 'mkdir -p $CASSANDRA_HOME/backup'
408 def res = execute 'mv $CASSANDRA_HOME/data $CASSANDRA_HOME/backup/data_$(date +\'%Y_%m_%d__%H:%M:%S\')'
409 println "[MasterD][DB_BACKUP]-> snapshot DB finished. $res"
423 knownHosts = allowAnyHosts
426 session(remotes.vagrant) {
427 println "[MasterD]-> restoring DB"
428 execute 'mkdir -p $CASSANDRA_HOME/data'
429 def res = execute 'mv $CASSANDRA_HOME/backup/data_*/* $CASSANDRA_HOME/data'
430 println "[MasterD]-> DB restore FINISHED!! $res"
444 workingDir VAGRANT_HOME //vagrant path
445 println "*****************\nworking dir -> $VAGRANT_HOME"
446 commandLine "cmd","/c", "vagrant up"
449 println "[MasterD]--> please define windows enviroment variable VAG pointing to vagrant project"
461 println "[MasterD][FrontEnd] starting war copy."
463 knownHosts = allowAnyHosts
465 long started = System.currentTimeMillis()
466 def target = "${PROJECT_PATH}/catalog-fe/target/"
467 def files = GFileUtils.listFiles( new File(target) , ["war"] as String[] , false);
468 files?.each{ File file ->
469 if (!file?.name?.contains('classes')){
470 println "[MasterD][FrontEnd] copying ${file.length()/(1024*1024)} MB, from ${file?.name} to $FE_REMOTE/webapps"
472 session(remotes.vagrant) {
473 put from: file?.absolutePath , into: "$FE_REMOTE/webapps"
479 println "[MasterD][FrontEnd] Successfully copied war in ${System.currentTimeMillis()-started}ms."
490 println "[MasterD][BackEnd] starting war copy."
492 knownHosts = allowAnyHosts
494 def target = "${PROJECT_PATH}/catalog-be/target/"
495 def files = GFileUtils.listFiles( new File(target) , ["war"] as String[] , false);
496 long started = System.currentTimeMillis()
497 files?.each{ File file ->
498 if (!file?.name?.contains('classes')){
499 println "[MasterD][BackEnd] copying ${file.length()/(1024*1024)} MB, from ${file?.name} to $BE_REMOTE/webapps"
501 session(remotes.vagrant) {
502 put from: file?.absolutePath , into: "$BE_REMOTE/webapps"
507 println "[MasterD][BackEnd] SUCCESSFULY copied be war in ${System.currentTimeMillis()-started}ms."
517 println "[MasterD][FE]--> compiling project at -> ${PROJECT_PATH}\\catalog-fe"
518 workingDir "${PROJECT_PATH}" //vagrant path
519 commandLine 'cmd','/c','mvn -T 2 compile -pl catalog-fe,catalog-ui -am -Pcatalog -Dmaven.test.skip'
529 println "[MasterD][BE]--> compiling project at -> ${PROJECT_PATH}\\catalog-be"
530 workingDir "${PROJECT_PATH}" //vagrant path
531 commandLine 'cmd','/c','mvn -T 2 compile -pl catalog-be -Pcatalog -Dmaven.test.skip'
542 println "[MasterD]--> compiling project at -> ${PROJECT_PATH}"
543 workingDir "${PROJECT_PATH}" //vagrant path
544 commandLine 'cmd','/c','mvn -T 2 compile -am -Pcatalog -Dmaven.test.skip'
553 def compileDependencies(){
554 def cmd = IS_MVN_INSTALL ? 'install' : 'compile'
556 println "[MasterD]--> compiling BE dependencies -> $BE_DEPENDENCIES [ SKIPPING TESTS!! ]"
557 workingDir "${PROJECT_PATH}" //vagrant path
558 commandLine 'cmd','/c',"mvn $cmd -pl $BE_DEPENDENCIES -Pcatalog -Dmaven.test.skip" //commandLine 'cmd', '/c','mvn -T 1C package -pl catalog-model,catalog-dao,catalog-be -P catalog -Dmaven.test.skip'
561 task compileDependencies {
563 compileDependencies()
567 def cmd = IS_MVN_INSTALL ? 'install' : 'compile'
569 println "--> compiling project at -> ${PROJECT_PATH}\\catalog-be"
570 workingDir "${PROJECT_PATH}" //vagrant path
571 commandLine 'cmd','/c',"mvn -T 1 $cmd war:war -pl catalog-be -Pcatalog -Dmaven.test.skip" //commandLine 'cmd', '/c','mvn -T 1C package -pl catalog-model,catalog-dao,catalog-be -P catalog -Dmaven.test.skip'
580 //deprecated - use deployBE()
583 def started = System.currentTimeMillis();
585 println "[MasterD]--> copying be... [from $VAGRANT_HOME]"
586 workingDir VAGRANT_HOME //vagrant path
587 commandLine 'cmd','/c', 'copy_war_be.bat','localhost' , "$PROJECT_PATH\\catalog-be\\target\\catalog-be*.war" , "$BE_REMOTE/webapps"
591 **** copying finished in -> ${System.currentTimeMillis() - started}ms ****
599 workingDir "${System.env.VAG}" //vagrant path
600 commandLine 'cmd','/c','copy_war_be_with_configuration','localhost' , "$PROJECT_PATH\\catalog-be\\target\\catalog-be*.war" , "$BE_REMOTE/webapps"
609 workingDir "${System.env.VAG}" //vagrant path
610 commandLine 'cmd','/c','copy_war_fe_with_configuration','localhost' , "$PROJECT_PATH\\catalog-fe\\target\\catalog-fe*.war" , "$FE_REMOTE/webapps"
620 workingDir "${System.env.VAG}" //vagrant path
621 commandLine 'cmd','/c', 'copy_war_fe.bat', 'localhost', "$PROJECT_PATH\\catalog-fe\\target\\catalog-fe*.war", "$FE_REMOTE/webapps"
627 def installAllProject(){
629 println "[MasterD]--> Compiling&Installing project at -> ${PROJECT_PATH}"
630 workingDir "${PROJECT_PATH}" //vagrant path
631 commandLine 'cmd','/c','mvn -T 2 clean install -U -Pcatalog -Dmaven.test.skip'
634 task installAllProject {
642 println '[MasterD]--> Finished!!'
645 installAll.dependsOn { tasks.findAll { task -> task.name.startsWith('install_') } }
649 println '[MasterD][Install]--> Installing BE!!'
650 workingDir "${PROJECT_PATH}"
651 commandLine 'cmd','/c', 'mvn clean install -pl catalog-be -am -Pcatalog -Dmaven.test.skip'
664 workingDir "${PROJECT_PATH}"
665 commandLine 'cmd','/c', 'mvn clean install -pl catalog-ui,catalog-fe -am -Pcatalog -Dmaven.test.skip'
674 def updaterBERapid(){
675 /* if ( ticket() > PREVIOUS_BUILD_VAR ){
676 PREVIOUS_BUILD_VAR = ticket()*/
677 def started = System.currentTimeMillis();
678 println "[MasterD][Rapid]--> compiling changes using maven"
680 println "[MasterD][Rapid]--> copying war"
681 copyBE() //use this if you want to deploy entire war //hotswap.execute()
683 println msg(" redeploy finished in -> ${System.currentTimeMillis() - started}ms ")
685 task updaterBERapid(){
691 def started = System.currentTimeMillis();
692 IS_MVN_INSTALL = pomChanges() ? true : false
693 println "[MasterD]--> compiling changes using maven"
694 compileDependencies()
696 println "[MasterD]--> copying war"
697 IS_HOTSWAP ? copyExplodedBE() : copyBE() //execute() //use this if you want to deploy entire war //hotswap.execute()
699 println msg("redeploy finished in -> ${System.currentTimeMillis() - started}ms ")
706 def copyBEConfiguration(){
709 knownHosts = allowAnyHosts
712 session(remotes.vagrant) {
713 println msg("Stopping BackEnd Server")
714 execute command[BACKEND][STOP]()
720 def started = System.currentTimeMillis();
722 println "[MasterD]--> copying war"
723 copyBE() //use this if you want to deploy entire war //hotswap.execute()
724 copyBEConfiguration()
725 println msg("redeploy finished in -> ${System.currentTimeMillis() - started}ms ")
727 task updaterBEFull(){
732 def copyFEConfiguration(){
736 def started = System.currentTimeMillis();
737 println "[MasterD]--> compiling changes using maven"
739 println "[MasterD]--> copying war"
740 copyFE() //.execute() //use this if you want to deploy entire war //hotswap.execute()
741 copyFEConfiguration()
742 println msg("redeploy finished in -> ${System.currentTimeMillis() - started}ms ")
752 knownHosts = allowAnyHosts
755 session(remotes.vagrant) {
756 println msg("Stopping BackEnd Server")
757 execute command[BACKEND][STOP]()
771 knownHosts = allowAnyHosts
774 session(remotes.vagrant) {
775 println msg("[MasterD] starting backend sever")
777 execute command[BACKEND][START]()
781 println """[MasterD]-> finished !!
790 def restartBackend(){
793 knownHosts = allowAnyHosts
796 session(remotes.vagrant) {
797 println msg("[MasterD] restarting backend sever")
799 execute command[BACKEND][RESTART]()
803 println """[MasterD]-> finished !!
806 //todo- remove this if you want to auto-deploy on every file save
812 enum STATUS { UP, DOWN , UNKNOWN , UNAVAILABLE }
820 def execSafe( closure){
822 [0..4].forEach( {println "Critical ERROR : lock object is not initialized\n\nCritical ERROR : cannot run tasks\n"}() )
825 synchronized (lockObj){
826 boolean prev = isHaltHealth.get()
828 isHaltHealth.set(true)
830 } catch (Exception e) {
833 isHaltHealth.set(prev)
838 def fetchFiles( remote, local ){
840 session(remotes.vagrant) {
841 //execute "cd /home/vagrant/catalog-be/tmp ; ls -lt | grep catalog-be" //todo- use my dates to filter
842 def f = get from: remote , into: local
846 //println "fetched files in ${System.currentTimeMillis() - started} ms"
857 session( remotes.vagrant ) {
858 println """ *-*-****************************-*-*
859 killing all java proccesses
860 *-*-****************************-*-*
862 res = execute command[ALL][KILL]()
865 println res?.toString()
869 def importNormative(){
872 session(remotes.vagrant) {
873 println """ *-*-************************************-*-*
875 *-*-************************************-*-*
877 execute "python -v $BE_REMOTE/scripts/import/tosca/importNormativeAll.py"
884 def startCassandra = """
891 until curl localhost:9200/_cluster/health;
897 # Create Elastic Mapping if not exist in ES
902 session(remotes.vagrant) {
903 println """ *-*-************************************-*-*
904 starting all SDC services(DB,BE,FE,Webseal)
905 *-*-************************************-*-*
908 execute command[DB][START]()
910 execute command[CACHING][START]()
913 execute startCassandra
914 //[0..4]?.forEach( Thread?.sleep(2000) )
917 execute command[BACKEND][START]()
918 execute command[FRONTEND][START]()
919 execute command[SECURITY][START]()
926 /*def clearLog(type: Delete){
928 delete 'C:/ProgramData/all.log'
929 followSymlinks = true
932 task clearLog(type: Delete){
934 delete 'C:/ProgramData/all.log'
935 followSymlinks = true
940 println "\n*** logging BE all.log ***\n"
943 session( remotes.vagrant ) {
944 //String now = execute 'echo \"\$(date +\'%Y_%m_%d\')\"'
945 //println "\n\n*******************************************************\n\n"+now?.toString()
946 clearLog?.execute() //todo- remove this .execute()
947 fetchFiles( '/home/vagrant/catalog-be/logs/SDC/SDC-BE/all.log' , 'C:/ProgramData') //"%USERPROFILE%\AppData\Local\")
948 //project.ext.set( "logFile" , 'C:/ProgramData/all.log' )
950 // -f /home/vagrant/catalog-fe/logs/*$now.stderrout.log -f /home/vagrant/catalog-be/logs/*$now.stderrout.log -f /home/vagrant/catalog-be/logs/ASDC/ASDC-BE/debug.log*'
957 String notepad = 'C:\\Program Files (x86)\\Notepad++\\notepad++.exe'
958 println "logging $logFile to notepad++ [$notepad]"
959 commandLine 'cmd','/c' , notepad ,logFile
963 println "cannot open logs!!!"
973 def toggleHealthPolling(){
974 isHaltHealth.set(!isHaltHealth.get())
976 //converts predefined icon to Image
977 def Image convert( imageName ){
978 String encodedimage = project.ext.get(imageName);
979 byte[] byteImage = encodedimage?.split(',')[1]?.decodeBase64()
980 Image image = ImageIO.read(new ByteArrayInputStream(byteImage));
983 def refreshMenu(String imageName){
984 switch( imageName ) {
985 case 'unavailableImg' : toggleHealthString = "Resume Health"; break;
986 default : toggleHealthString = "Halt Health";
988 if (((MenuItem)toggleHealthItemView).getLabel() != toggleHealthString)
989 ((MenuItem)toggleHealthItemView).setLabel(toggleHealthString);
992 println "[MasterD] Starting database.."
995 knownHosts = allowAnyHosts
998 session(remotes.vagrant) {
999 execute command[DB][START]()
1012 knownHosts = allowAnyHosts
1015 session(remotes.vagrant) {
1016 execute command[DB][STOP]()
1029 knownHosts = allowAnyHosts
1032 session(remotes.vagrant) {
1033 execute command[FRONTEND][START]()
1046 knownHosts = allowAnyHosts
1049 session(remotes.vagrant) {
1050 execute command[FRONTEND][STOP]()
1061 def ActionListener newListener( closure ){
1062 ActionListener listener = new ActionListener() {
1063 public void actionPerformed(ActionEvent e) {
1066 } catch (AWTException e1) {
1067 System.err.println(e1);
1075 ext.updateTray = { STATUS status ->
1077 if (SystemTray.isSupported()) {
1078 // get the SystemTray instance
1079 SystemTray tray = SystemTray.getSystemTray();
1081 String imageName = status==STATUS.UP ? (Math.random()>0.5 ?'okImg1':'okImg2') : status==STATUS.UNAVAILABLE ? 'unavailableImg' : status==STATUS.DOWN ? 'errorImg' : 'warnImg'
1082 Image image = convert imageName
1083 if (trayIcon != null) {
1084 trayIcon.setImage(image)
1085 refreshMenu(imageName);
1089 // create a popup menu
1090 PopupMenu popup = new PopupMenu();
1091 // create menu item for the default action
1093 MenuItem hotswapItem = new MenuItem("===> WAR <===");
1094 hotswapItem.setFont(new Font("MONOSPACED" , Font.BOLD ,15f ))
1096 //region Multilevel Menus
1097 Menu deployMasterMenu = new Menu("DeployMaster");
1098 Menu backendMenu = new Menu("Backend");
1099 Menu frontendMenu = new Menu("Frontend");
1100 Menu dbMenu = new Menu("Database");
1102 deployMasterMenu.setFont(new Font("Cooper Black" ,Font.BOLD ,14f ))
1103 backendMenu.setFont(new Font("Cooper Black" ,Font.PLAIN ,13f ))
1104 frontendMenu.setFont(new Font("Cooper Black" ,Font.PLAIN ,13f ))
1105 dbMenu.setFont(new Font("Cooper Black" ,Font.PLAIN ,13f ))
1106 }catch(Exception e){
1111 MenuItem updaterBeWithDependenciesItem = new MenuItem("[BE] Quick Compile -> Deploy");
1112 MenuItem updaterFullBeItem = new MenuItem("[BE] Full Install -> Deploy");
1113 MenuItem updaterFeItem = new MenuItem("[FE] Quick Compile -> Deploy");
1114 MenuItem updaterFullFeItem = new MenuItem("[FE] Full Install -> Deploy");
1118 deployMasterMenu.add(updaterFullBeItem);
1119 deployMasterMenu.add(updaterBeWithDependenciesItem);
1121 deployMasterMenu.addSeparator();
1122 deployMasterMenu.add(updaterFullFeItem);
1123 deployMasterMenu.add(updaterFeItem);
1127 MenuItem startItem = new MenuItem("[BE] Start");
1128 MenuItem stopItem = new MenuItem("[BE] Stop BackEnd");
1129 MenuItem copyBeWarItem = new MenuItem("[BE] Copy War");
1130 backendMenu.add(startItem);
1131 backendMenu.add(stopItem);
1132 backendMenu.add(copyBeWarItem);
1135 MenuItem startFEItem = new MenuItem("[FE] Start");
1136 MenuItem stopFEItem = new MenuItem("[FE] Stop");
1137 MenuItem copyFeWarItem = new MenuItem("[FE] Copy War");
1138 frontendMenu.add(startFEItem);
1139 frontendMenu.add(stopFEItem);
1140 frontendMenu.add(copyFeWarItem);
1143 MenuItem startDBItem = new MenuItem("[DB] Start");
1144 MenuItem stopDBItem = new MenuItem("[DB] Stop");
1145 MenuItem backupDBItem = new MenuItem("[DB] Backup");
1146 MenuItem restoreDBItem = new MenuItem("[DB] Restore");
1147 dbMenu.add(startDBItem);
1148 dbMenu.add(stopDBItem);
1149 dbMenu.add(backupDBItem);
1150 dbMenu.add(restoreDBItem);
1154 MenuItem killItem = new MenuItem("Kill All");
1155 MenuItem startAllItem = new MenuItem("Start All");
1156 MenuItem importItem = new MenuItem("Import Normative");
1157 MenuItem healthInfoItem = new MenuItem("[Info] Health");
1158 MenuItem toggleHealthItem = new MenuItem(toggleHealthString);
1159 MenuItem logsItem = new MenuItem("Logs [Beta]");
1160 MenuItem exitItem = new MenuItem("Exit");
1162 toggleHealthItemView = toggleHealthItem;
1164 popup.add(hotswapItem);
1165 popup?.addSeparator();
1166 popup.add(deployMasterMenu);
1167 popup?.addSeparator();
1168 popup.add(backendMenu)
1169 popup.add(frontendMenu)
1171 popup?.addSeparator();
1172 popup.add(startAllItem);
1173 popup.add(killItem);
1174 popup?.addSeparator();
1175 popup.add(toggleHealthItem);
1176 popup.add(healthInfoItem);
1177 popup?.addSeparator();
1178 popup.add(importItem);
1179 popup.add(logsItem);
1180 popup?.addSeparator();
1181 popup.add(exitItem);
1183 // construct a TrayIcon
1184 trayIcon = new TrayIcon(image, "HealthTray", popup);
1186 //region -> Button actions
1187 def listenerHotswap = newListener { project.ext.set("IS_HOTSWAP", !IS_HOTSWAP); hotswapItem?.setLabel( IS_HOTSWAP ? "==> HotSwap <==" : "===> WAR <===") }
1188 // create a action listener to listen for default action executed on the tray icon
1189 def listenerFullBE = newListener { parallel { install_BE(); IS_HOTSWAP ? copyExplodedBE() : copyBE(); restartBackend() } }
1190 def listenerFullFE = newListener { parallel { install_FE(); copyFE() } }
1191 ActionListener listenerFE = newListener { parallel { updaterFE() } }
1192 ActionListener listenerBE = newListener { parallel { updaterBE() } }
1193 ActionListener exitListener = newListener {
1194 executor?.isShutdown() ?: executor?.shutdown()
1195 tray.remove(trayIcon);
1196 project.ext.set("isStopHealthCheck", true)
1197 println "Shutting down.. bye bye.."
1199 ActionListener stopBackendListener = newListener { stopBackend() }
1200 ActionListener startBEListener = newListener { parallel { startBackend() } }
1201 ActionListener killJavaListener = newListener { killJava() }
1203 ActionListener startAllListener = newListener { parallel { startAll() } }
1205 ActionListener listener5 = new ActionListener() {
1206 public void actionPerformed(ActionEvent e) {
1208 parallel { importNormative() }
1209 } catch (AWTException e1) {
1210 System.err.println(e1);
1215 ActionListener listener6 = new ActionListener() {
1216 public void actionPerformed(ActionEvent e) {
1218 parallel { healthPopup() }
1219 } catch (AWTException e1) {
1220 System.err.println(e1);
1225 ActionListener listener7 = new ActionListener() {
1226 public void actionPerformed(ActionEvent e) {
1228 logBE()//tasks.logger.execute()
1229 } catch (AWTException e1) {
1230 System.err.println(e1);
1234 ActionListener listener8 = new ActionListener() {
1235 public void actionPerformed(ActionEvent e) {
1237 toggleHealthPolling()//tasks.logger.execute()
1238 } catch (AWTException e1) {
1239 System.err.println(e1);
1243 ActionListener copyBeWarListener = new ActionListener() {
1244 public void actionPerformed(ActionEvent e) {
1246 parallel { copyBE() }//.execute()//tasks.logger.execute()
1247 } catch (AWTException e1) {
1248 System.err.println(e1);
1253 ActionListener startDBListener = new ActionListener() {
1254 public void actionPerformed(ActionEvent e) {
1258 }//tasks.logger.execute()
1259 } catch (AWTException e1) {
1260 System.err.println(e1);
1265 ActionListener stopDBListener = new ActionListener() {
1266 public void actionPerformed(ActionEvent e) {
1268 stopDB()//tasks.logger.execute()
1269 } catch (AWTException e1) {
1270 System.err.println(e1);
1275 ActionListener dbBackupListener = new ActionListener() {
1276 public void actionPerformed(ActionEvent e) {
1279 backupDB()//tasks.logger.execute()
1281 } catch (AWTException e1) {
1282 System.err.println(e1);
1287 ActionListener feStartListener = new ActionListener() {
1288 public void actionPerformed(ActionEvent e) {
1292 }//tasks.logger.execute()
1293 } catch (AWTException e1) {
1294 System.err.println(e1);
1299 ActionListener feStopListener = new ActionListener() {
1300 public void actionPerformed(ActionEvent e) {
1302 stopFE()//tasks.logger.execute()
1303 } catch (AWTException e1) {
1304 System.err.println(e1);
1309 ActionListener feCopyListener = new ActionListener() {
1310 public void actionPerformed(ActionEvent e) {
1313 copyFE() //.execute()//tasks.logger.execute()
1315 } catch (AWTException e1) {
1316 System.err.println(e1);
1322 //def listenerFullModules = newListener { parallel { installAllProject() } }
1323 //region -> Button<=Listener
1324 hotswapItem.addActionListener(listenerHotswap)
1325 updaterFeItem.addActionListener(listenerFE)
1326 updaterFullBeItem.addActionListener( listenerFullBE )
1327 updaterBeWithDependenciesItem.addActionListener( listenerBE )
1328 updaterFullFeItem.addActionListener( listenerFullFE )
1329 stopItem.addActionListener(stopBackendListener)
1330 startItem.addActionListener(startBEListener)
1331 copyBeWarItem.addActionListener(copyBeWarListener);
1332 killItem.addActionListener(killJavaListener)
1333 startAllItem.addActionListener(startAllListener)
1334 importItem.addActionListener(listener5)
1335 healthInfoItem.addActionListener(listener6)
1336 toggleHealthItem.addActionListener(listener8)
1337 logsItem.addActionListener(listener7)
1338 exitItem.addActionListener(exitListener)
1340 startDBItem.addActionListener( startDBListener )
1341 stopDBItem.addActionListener( stopDBListener )
1342 backupDBItem.addActionListener( dbBackupListener )
1343 copyFeWarItem.addActionListener( feCopyListener )
1344 startFEItem.addActionListener( feStartListener )
1345 stopFEItem.addActionListener( feStopListener )
1348 // set the TrayIcon properties
1351 // add the tray image
1355 } catch (AWTException e) {
1356 System.err.println(e);
1360 println "Java TrayIcon Option is not supported in your System, try enabling it. Bye Bye"
1366 long UPDATE_THRESHOLD = 3500
1369 knownHosts = allowAnyHosts
1371 while(!isStopHealthCheck) {
1372 if (!isHaltHealth.get()) { //if await or await is more then 60 second return health check
1374 session(remotes.vagrant) {
1376 def healthOutput = execute command[ALL][HEALTH]()
1377 if (healthOutput?.contains("Failed command .* with status 7") || healthOutput?.contains("Problem accessing /sdc2/rest/healthCheck"))
1378 updateTray(STATUS.DOWN)
1379 def statusCollecion = healthOutput?.findAll "\"healthCheckStatus\": \".*\""
1380 def upCount = statusCollecion?.count { it?.contains("UP") }
1381 def downCount = statusCollecion?.count { it?.contains("DOWN") }
1382 def uknownCount = (statusCollecion?.size() - upCount) - downCount
1383 println " UP -> $upCount | downCount=$downCount | uknownCount=$uknownCount "
1384 (uknownCount > 0 || (downCount > 0 && upCount > 0)) ? updateTray(STATUS.UNKNOWN) : ((upCount > 0) ? updateTray(STATUS.UP) : updateTray(STATUS.DOWN))
1386 } catch (Exception e) {
1387 updateTray(STATUS.DOWN)
1389 SCALAR = Math.min(SCALAR * 1.1, 5) //slow down on errors
1391 //green color effects
1392 if (lastStatus && lastStatus == STATUS.UP) {
1393 trayIcon.setImage(convert(Math.random() > 0.5 ? 'okImg1' : 'okImg2'))
1394 //randomly green change color
1397 Thread?.sleep((long) (UPDATE_THRESHOLD * SCALAR))
1401 updateTray(STATUS.UNAVAILABLE)
1409 session(remotes.vagrant) {
1410 def healthOutput = execute command[ALL][HEALTH]()
1411 JOptionPane.showMessageDialog(null,
1414 JOptionPane.INFORMATION_MESSAGE);
1419 project.ext.set("msg", { content -> """
1420 ************************************************************************************************
1421 ************************************************************************************************
1423 ************** ****************
1426 ************************************************************************************************
1427 ************************************************************************************************