import java.util.concurrent.Callable import java.util.concurrent.Executors import java.util.concurrent.atomic.AtomicBoolean import java.awt.AWTException import java.awt.Font import java.awt.Image import java.awt.Menu import java.awt.MenuItem import java.awt.PopupMenu import java.awt.SystemTray import java.awt.TrayIcon import java.awt.event.ActionEvent import java.awt.event.ActionListener import javax.swing.JOptionPane import javax.imageio.ImageIO import static Services.* import static ServiceControl.* /* * open CMD -> gradle health * * */ group 'org.onap.sdc' version '1.01-SNAPSHOT' apply plugin: 'groovy' apply plugin: 'java' apply plugin: "org.hidetake.ssh" apply plugin: 'java-gradle-plugin' apply plugin: 'idea' sourceCompatibility = 1.8 buildscript { repositories { jcenter() mavenCentral() } dependencies { classpath 'org.codehaus.groovy:groovy-all:2.4.12' classpath "org.hidetake:gradle-ssh-plugin:2.9.0" } } enum Services { BACKEND , //be FRONTEND , //fe DB , //cassandra CACHING , //elawsrticsearch SECURITY , //webseal ALL //all services } enum ServiceControl { HEALTH , START , RESTART , STOP , KILL } enum Environment { OLD_VAGRANT , PROD_VAGRANT , ONAP_VAGRANT } //env variables //fill YOUR_WINDOWS_USER_HOME project.ext.set("VM_TYPE", Environment.ONAP_VAGRANT) //flags to use new vagrant configuration //project.ext.set("NEW_VAG",Boolean.FALSE) //flags to use new vagrant configuration project.ext.set("IS_HOTSWAP",Boolean.FALSE) //flags to use new vagrant configuration project.ext.set("PROJECT_PATH", System.getenv("SDC")) //ex. 'C:\\GIT_WORK\\asdc\\sdc') project.ext.set("VAGRANT_HOME", isProductionVM() ? System.getenv("NEW_VAG") : isOnapVM() ? System.getenv("ONAP_VAG") :System.getenv("VAG")) //ex. 'C:\\GIT_WORK\\vagrant-asdc-all-in-one') project.ext.set("USER_HOME", "${System.getenv("USERPROFILE")}\\.ssh") project.ext.set("BE_REMOTE", isProductionVM() ? '/opt/app/jetty/base/be' : '/home/vagrant/catalog-be' ) project.ext.set("FE_REMOTE", isProductionVM() ? '/opt/app/jetty/base/fe' : '/home/vagrant/catalog-fe' ) project.ext.set("VAGRANT_USER", isProductionVM() ? 'm11981' : 'vagrant' ) project.ext.set("RSA_PRIVATE_KEY_PATH", isProductionVM() ? "$VAGRANT_HOME/id_rsa" : '' ) project.ext.set("VAGRANT_PASSWORD", isProductionVM() ? 'Aa123456' : 'vagrant' ) project.ext.set("X_FOLDER",'/xFolder' ) project.ext.set("BE_DEPENDENCIES", 'common-be,common-app-api,catalog-dao,catalog-model,security-utils' ) project.ext.set("command", [ (ALL) : [ (HEALTH) : { isProductionVM() ? 'sudo curl -i http://localhost:8181/sdc1/rest/healthCheck' : isOnapVM() ? 'sudo -i /data/scripts/docker_health.sh' : 'curl -i localhost:8080/sdc2/rest/healthCheck' } , (KILL) : { isProductionVM() ? 'sudo pkill java' : isOnapVM() ? 'sudo -i docker kill $(docker ps -q)' : 'pkill java'} ] , // TODO: refine kill only for services (BACKEND) : [ (START) : { isProductionVM() ? 'sudo service jettyBE start' : isOnapVM() ? 'sudo -i docker start sdc-BE' : 'service catalog-be start'} , (STOP) : { isProductionVM() ? 'sudo service jettyBE stop' : isOnapVM() ? 'sudo -i docker stop sdc-BE' : 'service catalog-be stop'} , (RESTART) : { isProductionVM() ? 'sudo service jettyBE restart' : isOnapVM() ? 'sudo -i docker restart sdc-BE' : 'service catalog-be restart'}] , (DB) : [ (START) : { isProductionVM() ? 'sudo service cassandra start' : isOnapVM() ? 'sudo -i docker start sdc-cs' : 'start-asdc-storage.sh' } , (STOP) : { isProductionVM() ? 'sudo service cassandra stop' : isOnapVM() ? 'sudo -i docker stop sdc-cs' : 'service cassandra stop'} , (RESTART) : { isProductionVM() ? 'sudo service cassandra restart' : isOnapVM() ? 'sudo -i docker restart sdc-cs' : 'service cassandra restart'} ] , (FRONTEND): [ (START) : { isProductionVM() ? 'sudo service jettyFE start' : isOnapVM() ? 'sudo -i docker start sdc-FE' : 'service catalog-fe start' } , (STOP) : { isProductionVM() ? 'sudo service jettyFE stop' : isOnapVM() ? 'sudo -i docker stop sdc-FE' : 'service catalog-fe stop'} , (RESTART) : { isProductionVM() ? 'sudo service jettyFE restart' : isOnapVM() ? 'sudo -i docker restart sdc-FE' : 'service catalog-fe restart' } ] , (CACHING): [ (START) : { isProductionVM() ? 'sudo service elasticsearch start' : isOnapVM() ? 'sudo -i docker start sdc-es' : 'echo "starting es is not yet supported"' } ], (SECURITY): [ (START) : { isProductionVM() ? 'sudo docker start sdc-WebSeal-Simulator' : isOnapVM() ? 'sudo -i /data/scripts/simulator_docker_run.sh -r $(echo $(sudo -i docker images onap/sdc-simulator | grep onap/sdc-simulator | head -1 | awk \'{print $2}\'))' : 'service webseal-simulator start' } , (STOP) : { isProductionVM() ? 'sudo docker stop sdc-WebSeal-Simulator' : isOnapVM() ? 'sudo -i docker stop sdc-sim' : 'service webseal-simulator stop'} , (RESTART) : { isProductionVM() ? 'sudo docker restart sdc-WebSeal-Simulator' : isOnapVM() ? 'sudo -i docker restart sdc-sim' : 'service webseal-simulator restart'}] ] ) //abstraction level to shell scripts , support old and new vagrant bash commands //icons project.ext.set("warnImg",'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAADvSURBVDhPY2RgYPgPxGQDiAGLXkB4UMD56DuD9YFUhj179oD5Li4uDEcdZjN8l+ME8+EgTgLTAJDm7zWKYPb/enUwzdh4E0xzttxHNQRoABOUCQYYmj+9QrCBACQHUoMM4AYga74ZDiRAmvnEwHwQGywGBOiGgA1A16wmJYjQDAJANkgMmyEosYBVMzIAuuTWs/cM6iuhfCCAGwDWrAHxKyFw68ZNuCE40wGygcga0AEkEEHRiIxxASzqUKKRHIAwAJgo4BgXwKIGxQUgf8MwOsAlh+EFUMDBMAxgE0MGoLwAignSMFQPzmgkDjAwAACSmn13nChk1QAAAABJRU5ErkJggg==') project.ext.set("okImg1",'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAD4SURBVDhPY2RgYPgPxGQDiAGLXkB4UMD56DuD9YFUhj179oD5Li4uDEcdZjN8l+ME8+EgTgLTAJDm7zWKYLbSRh8wfc9/C5jmbLmPagjQACYoEwwwNLMxgzHMIJAcSA0ygBuArFm81gyi+ddfCAaywWJAgG4I2AB0zdxWkhCNMABkg8SwGYISC1g1IwOgS74ee87wsvkUVADJAJjpyIDbRAxMfz3zCkwjA5ghONMB2DVIBiDbigwggQiKRmSMC2BRhxKN5ACEAcBEAce4ABY1LFAaDLAFJAwgyyGHB4YXQAEHwzCATQwZgPICKCZIw1A9OKOROMDAAAA4gXvZorg7ZgAAAABJRU5ErkJggg==') project.ext.set("okImg2" , 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAADjSURBVDhPY2RgYPgPxGQDiAGLXkB4UMD56DuD9YFUhj179oD5Li4uDEcdZjN8l+ME8+EgTgLTAJDm7zWKYPbWZ7Jg2lvqMZjmbLmPagjQACYoEwywaQYBGBskB1KDDOAGIGuetFsUTCMDmBi6IWAD0DUra3OA2cgAJIbNEJRYwKUZGdy9+oMhz/U1lIdkADZnwwwDaUIHMENwpgNk16DbigwggQiKRmSMC2BRhxKN5ACEAcBEAce4ABY1LFAaDLAFJAwgyyGHB4YXQAEHwzCATQwZgPICKCZIw1A9OKOROMDAAAAZD3X55epfOAAAAABJRU5ErkJggg==') project.ext.set("errorImg" , 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAADlSURBVDhPY2RgYPgPxGQDiAGLXkB4UMD56DuD9YFUhj179oD5Li4uDEcdZjN8l+ME8+EgTgLTAJDm7zWKYPZbGRUwLfzkDpjmbLmPagjQACYoEwywaQYBGBskB1KDDOAGIGtexisCppEBTAzdELAB6Jrd+QXAbGQAEsNmCEos4NKMDHZ+/MAQ9fkNlIdkADZnwwwDaUIHyIaADMDAQAP/AwMPjEFsbGpAGGs6AEUPsnfgzsaiDiUayQUgF2A4jaAXoHpQXAByNgyjA1xyGF4A+RuGYQCbGDLA6gWCGKoHJSGRDhgYAL/hkunRq+joAAAAAElFTkSuQmCC') project.ext.set("unavailableImg" , 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABJ0AAASdAHeZh94AAAAB3RJTUUH4QwNDgEDrNoaqgAAAOhJREFUOMulkz8OgjAUhz8MQ7mBkwnnkBAH4mbCCdxcXLwAoxdwYXHjBCRupoMheg4TJ29QNhwshMofSfpLOry2v6/vta8OUGEhF4DsbUx6L8XytkNKCUAURTxWZ9TCM93buQb8mFXiI4E43gCQ5xeQPt7x2YG4fWa0OQwDhBANRCVdyGyKOQyDJhuV+HgvZQLGzABCiEGI036FPnNbZVlSFPfvnWg1gJpea72OjPh6lUZcQ5yhPkjTkxHv94fpfcB23t81PftmWMr9e+pQZjobd6zuobX2fViXAFCRvSv9GtOH9ji23/kDswRrCVqtQOAAAAAASUVORK5CYII=') //health params project.ext.set("trayIcon", null) project.ext.set("lastStatus", null) project.ext.set("isStopHealthCheck", false) project.ext.set("isHaltHealth", new AtomicBoolean(false) ) project.ext.set("startedAwait", Long.MAX_VALUE) project.ext.set("logFile", 'C:/ProgramData/all.log') 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 project.ext.set("pomChangesMap" , [:] ) project.ext.set("beConfigFilesToCopyMapping" , [ 'src/main/resources/config/*.yaml' : 'config/catalog-be/' , 'src/main/resources/config/*.properties' : 'config/catalog-be/'] ) //menu item strings project.ext.set("toggleHealthString" , "Halt Health" ) //menu item project.ext.set("toggleHealthItemView" , null ) //other project.ext.set("IS_MVN_INSTALL",false) project.ext.set("executor" , null ) project.ext.set("lockObj" , new Object() ) def hash( List list ){ def map = list?.collectEntries { File file -> [(file?.absolutePath) : file?.text?.hashCode() ]} map } def pomChanges(){ long started = System.currentTimeMillis() if ( !pomList ) listPom() //find hash changes def changes = pomList?.findAll { def File file = new File(it); pomChangesMap[it] != file?.text?.hashCode() } println "\n\n[MasterD][POM]--> detected changes for -> $changes" //update changes in map changes?.each { pomChangesMap[it] = new File(it)?.text?.hashCode() } println "\n\n[MasterD][POM]--> pom map -> $pomChangesMap" println """ ****** POM changes detection finished after -> ${System.currentTimeMillis()- started}ms ****** """ changes } //list pom with updated file hashes def listPom(){ long started = System.currentTimeMillis() if (!pomList) { def tree = fileTree( PROJECT_PATH ).include '**/pom.xml'//.filter { it.isFile() && it?.toString()?.toLowerCase()?.endsWith('pom.xml') } //println "$PROJECT_PATH list is ->${ list?.collect { it?.absolutePath } }" //flatten and filter openecomp poms pomList = tree?.flatten()?.findAll { File file -> file?.text?.contains('org.openecomp.sdc') }?.collect {File file -> file?.absolutePath } } pomChangesMap = pomList.collectEntries { absolutePath ->[ ( absolutePath ) : new File(absolutePath)?.text?.hashCode() ] } println """ [MasterD][Init] intializing POM detector ********* POM listing finished after -> ${System.currentTimeMillis()- started}ms ********* """ return pomList } task initialization(){ listPom() executor = Executors.newCachedThreadPool(); } def parallel( closure ){ executor?.submit(new Callable(){ @Override public Object call() { closure(); return null; } }) } /*class Preferences { def String Username def String IsNewVagrant def String IsRapidMode } def initXFolder(){ def folder = new File(X_FOLDER); folder?.exists() ?: folder?.mkdirs() new File("${folder?.absolutePath}/$PREFERENCES_FILENAME") }*/ task tester{ /*doLast{ //postStat(10000, "shay" , "report/index") listPom() new File('catalog-be\\pom.xml') << "#hello" pomChanges() }*/ } def fetchFilesByExtention(remote, local , ext ){ ssh.run { def started = System.currentTimeMillis() println "folder diff" session(remotes.vagrant) { //execute "cd /home/vagrant/catalog-be/tmp ; ls -lt | grep catalog-be" //todo- use my dates to filter get from: remote , into: local , filter: { it?.absolutePath =~ /jetty.*catalog-be.*\.dir.*\.$ext/ } // { it?.absolutePath =~ /.*catalog-be.*dir.*classes.*/ } } println "fetched files in ${System.currentTimeMillis() - started} ms" } } def updateRemoteFile(String remote , String local){ ssh.run { def to = "$BE_REMOTE${remote[remote?.indexOf("tmp\\")..remote.size()-1].replaceAll("\\\\","/")}" println "copying $local \nto\n $to" session(remotes.vagrant) { put from: local , into: to } } } def compareAndSwap(){ def final LIMIT = 10 def newClasses = new File("$PROJECT_PATH\\catalog-be\\target\\classes") def File jettyClasses ; //locate classes println "traversing.." new File("build/hotswap").traverse { if (it?.directory && it?.name?.equals("classes")){ jettyClasses = it return; } } def jettyClassesList = [] jettyClasses?.traverse { jettyClassesList << it } println "$jettyClasses" //Sort compiled classes def files = [] newClasses?.traverse { files << it } def result = files.sort{ a,b -> b.lastModified() <=> a.lastModified() } println "show only last $LIMIT changes" result[0..LIMIT]?.each{ println it?.lastModified() +" | "+ it?.name + (it?.directory ? "[Directory]" : "") } //show only last 10 changes //update def changesMap = [ : ] // println "updating changes" result[0..LIMIT]?.each { File f -> def File other = jettyClassesList.find{ File other-> other?.absolutePath?.endsWith(f?.name) }; if ( !(f.directory) && f?.text?.hashCode() != other?.text?.hashCode() ) updateRemoteFile( other?.getAbsolutePath() , f?.getAbsolutePath() ) } //use hashing } task hotswap(){ doLast { new File("build/hotswap")?.deleteDir() new File("build/hotswap")?.mkdirs() ssh.settings { knownHosts = allowAnyHosts } fetchFilesByExtention( "$BE_REMOTE/tmp/" , 'build/hotswap' , "class") compareAndSwap() } } remotes { vagrant { host = '127.0.0.1' port = 2222 user = VAGRANT_USER password = VAGRANT_PASSWORD identity = isProductionVM() ? new File(RSA_PRIVATE_KEY_PATH) : null } } def isProductionVM(){ return VM_TYPE?.equals(Environment.PROD_VAGRANT) } def isOnapVM(){ return VM_TYPE?.equals(Environment.ONAP_VAGRANT) } def gitLatest(){ } def newEcoSystem(){ //cleanJanusGraph() backupDB() //and clean all //restoreDB() //restore latest createSchema() fillSchema() postCreate() startAll() //todo- conside updating from git updaterBEFull() updaterFE() } def importHeatTypes(){ //todo- impl } def postCreate(){ importNormative() importHeatTypes() } def fillSchema(){ // add conformence level } def createSchemaPreStep(){ //todo- DB up } def createSchemaPostStep(){ ////todo- impl create amdocs dox } def createSchema(){ createSchemaPreStep() //todo- create schema //todo- create JanusGraph createSchemaPostStep() } def cleanJanusGraph(){ execSafe{ ssh.settings { knownHosts = allowAnyHosts } ssh.run { session(remotes.vagrant) { execute "sudo cqlsh -e 'DROP KEYSPACE titan;'" println "[MasterD][DB_DROP]-> Dropped 'titan' KEYSPACE." } } } } task cleanJanusGraph { doLast{ cleanJanusGraph() } } task fetchE2EDB(){ doLast{ fetchE2EDB() } } def fetchE2EDB(){ execSafe{ ssh.settings { knownHosts = allowAnyHosts } ssh.run { session(remotes.vagrant) { def tmp = '$CASSANDRA_HOME/backup/e2e' //execute 'mkdir $CASSANDRA_HOME/backup/e2e/' //execute 'wget http://135.76.210.202:8080/ETE_backup_files/latest_ETE_backup_file.zip -P /vagrant/db' println "[MasterD] download finished, unzipping.." execute "unzip -u $tmp/latest_ETE_backup_file.zip" //execute 'unzip -u /vagrant/db/latest_ETE_backup_file.zip'//' def folder = execute "cd $tmp; ls -d -- */" println "[MasterD] unzipping finished into -> $folder , untaring.." execute "tar zxf $tmp/$folder/* --strip 3 -C" +'$CASSANDRA_HOME/data | pv -l >/dev/null' println "[MasterD][E2E_DB]-> Downloaded & unzipped e2e data successfully." } } } } def copyExplodedBE() { execSafe{ println "[MasterD][BackEnd] copying exploded war." ssh.settings { knownHosts = allowAnyHosts } long started = System.currentTimeMillis() def dirPath = "${PROJECT_PATH}/catalog-be/target/catalog-be-1.1.0-SNAPSHOT" def dir = new File(dirPath); println "[MasterD][BackEnd] copying ${dir?.directorySize()/(1024*1024)} MB, from ${dir?.name} to $BE_REMOTE/webapps" ssh.run { session(remotes.vagrant) { execute "rm -R $BE_REMOTE/webapps/catalog-be-1.1.0-SNAPSHOT" put from: dir?.absolutePath , into: "$BE_REMOTE/webapps" } } println "[MasterD][BackEnd] Successfully copied exploded war in ${System.currentTimeMillis()-started}ms." } } task copyExplodedBE(){ doLast{ copyExplodedBE() } } def backupDB() { execSafe{ ssh.settings { knownHosts = allowAnyHosts } ssh.run { session(remotes.vagrant) { execute 'mkdir -p $CASSANDRA_HOME/backup' def res = execute 'mv $CASSANDRA_HOME/data $CASSANDRA_HOME/backup/data_$(date +\'%Y_%m_%d__%H:%M:%S\')' println "[MasterD][DB_BACKUP]-> snapshot DB finished. $res" } } } } task backupDB{ doLast{ backupDB() } } def restoreDB(){ execSafe{ ssh.settings { knownHosts = allowAnyHosts } ssh.run { session(remotes.vagrant) { println "[MasterD]-> restoring DB" execute 'mkdir -p $CASSANDRA_HOME/data' def res = execute 'mv $CASSANDRA_HOME/backup/data_*/* $CASSANDRA_HOME/data' println "[MasterD]-> DB restore FINISHED!! $res" } } } } task restoreDB() { doLast { restoreDB() } } def vm( ){ exec{ if (VAGRANT_HOME){ workingDir VAGRANT_HOME //vagrant path println "*****************\nworking dir -> $VAGRANT_HOME" commandLine "cmd","/c", "vagrant up" //args = [ ] } else { println "[MasterD]--> please define windows enviroment variable VAG pointing to vagrant project" } } } task vm{ doLast{ vm() } } def copyFE() { println "[MasterD][FrontEnd] starting war copy." ssh.settings { knownHosts = allowAnyHosts } long started = System.currentTimeMillis() def target = "${PROJECT_PATH}/catalog-fe/target/" def files = GFileUtils.listFiles( new File(target) , ["war"] as String[] , false); files?.each{ File file -> if (!file?.name?.contains('classes')){ println "[MasterD][FrontEnd] copying ${file.length()/(1024*1024)} MB, from ${file?.name} to $FE_REMOTE/webapps" ssh.run { session(remotes.vagrant) { if ( isProductionVM() ) execute 'sudo chmod -R 777 /opt/app/jetty/base/fe/webapps' put from: file?.absolutePath , into: "$FE_REMOTE/webapps" } } } } println "[MasterD][FrontEnd] Successfully copied war in ${System.currentTimeMillis()-started}ms." } task deployFE{ doLast { copyFE() } } def copyBE(){ println "[MasterD][BackEnd] starting war copy." ssh.settings { knownHosts = allowAnyHosts } def target = "${PROJECT_PATH}/catalog-be/target/" def files = GFileUtils.listFiles( new File(target) , ["war"] as String[] , false); long started = System.currentTimeMillis() files?.each{ File file -> if (!file?.name?.contains('classes')){ println "[MasterD][BackEnd] copying ${file.length()/(1024*1024)} MB, from ${file?.name} to $BE_REMOTE/webapps" ssh.run { session(remotes.vagrant) { if (isProductionVM()) execute 'sudo chmod -R 777 /opt/app/jetty/base/be/webapps' put from: file?.absolutePath , into: "$BE_REMOTE/webapps" } } } } println "[MasterD][BackEnd] SUCCESSFULY copied be war in ${System.currentTimeMillis()-started}ms." } task deployBE { doLast { copyBE() } } def compileFE(){ exec{ println "[MasterD][FE]--> compiling project at -> ${PROJECT_PATH}\\catalog-fe" workingDir "${PROJECT_PATH}" //vagrant path commandLine 'cmd','/c','mvn -T 2 compile -pl catalog-fe,catalog-ui -am -Pcatalog -Dmaven.test.skip' } } task compileFE(){ doLast{ compileFE() } } def compileBE(){ exec{ println "[MasterD][BE]--> compiling project at -> ${PROJECT_PATH}\\catalog-be" workingDir "${PROJECT_PATH}" //vagrant path commandLine 'cmd','/c','mvn -T 2 compile -pl catalog-be -Pcatalog -Dmaven.test.skip' } } task compileBE{ doLast{ compileBE() } } def compile(){ exec{ println "[MasterD]--> compiling project at -> ${PROJECT_PATH}" workingDir "${PROJECT_PATH}" //vagrant path commandLine 'cmd','/c','mvn -T 2 compile -am -Pcatalog -Dmaven.test.skip' } } task compile{ doLast{ compile() } } def compileDependencies(){ def cmd = IS_MVN_INSTALL ? 'install' : 'compile' exec{ println "[MasterD]--> compiling BE dependencies -> $BE_DEPENDENCIES [ SKIPPING TESTS!! ]" workingDir "${PROJECT_PATH}" //vagrant path 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' } } task compileDependencies { doLast{ compileDependencies() } } def compileWar(){ def cmd = IS_MVN_INSTALL ? 'install' : 'compile' exec{ println "--> compiling project at -> ${PROJECT_PATH}\\catalog-be" workingDir "${PROJECT_PATH}" //vagrant path 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' } } task compileWar(){ doLast{ compileWar() } } //deprecated - use deployBE() task be() { doLast{ def started = System.currentTimeMillis(); exec{ println "[MasterD]--> copying be... [from $VAGRANT_HOME]" workingDir VAGRANT_HOME //vagrant path commandLine 'cmd','/c', 'copy_war_be.bat','localhost' , "$PROJECT_PATH\\catalog-be\\target\\catalog-be*.war" , "$BE_REMOTE/webapps" //args = [ ] } println """ **** copying finished in -> ${System.currentTimeMillis() - started}ms **** """ } } task beConfig( ) { doLast{ exec{ workingDir "${System.env.VAG}" //vagrant path commandLine 'cmd','/c','copy_war_be_with_configuration','localhost' , "$PROJECT_PATH\\catalog-be\\target\\catalog-be*.war" , "$BE_REMOTE/webapps" //args = [ ] } } } task feConfig( ) { doLast{ exec{ workingDir "${System.env.VAG}" //vagrant path commandLine 'cmd','/c','copy_war_fe_with_configuration','localhost' , "$PROJECT_PATH\\catalog-fe\\target\\catalog-fe*.war" , "$FE_REMOTE/webapps" //args = [ ] } } } task fe() { doLast{ exec { workingDir "${System.env.VAG}" //vagrant path commandLine 'cmd','/c', 'copy_war_fe.bat', 'localhost', "$PROJECT_PATH\\catalog-fe\\target\\catalog-fe*.war", "$FE_REMOTE/webapps" //args = [ ] } } } def installAllProject(){ exec{ println "[MasterD]--> Compiling&Installing project at -> ${PROJECT_PATH}" workingDir "${PROJECT_PATH}" //vagrant path commandLine 'cmd','/c','mvn -T 2 clean install -U -Pcatalog -Dmaven.test.skip' } } task installAllProject { doLast { installAllProject() } } task installAll { doLast{ println '[MasterD]--> Finished!!' } } installAll.dependsOn { tasks.findAll { task -> task.name.startsWith('install_') } } def install_BE(){ exec { println '[MasterD][Install]--> Installing BE!!' workingDir "${PROJECT_PATH}" commandLine 'cmd','/c', 'mvn clean install -pl catalog-be -am -Pcatalog -Dmaven.test.skip' //args = [ ] } } task install_BE() { doLast{ install_BE() } } def install_FE() { exec { workingDir "${PROJECT_PATH}" commandLine 'cmd','/c', 'mvn clean install -pl catalog-ui,catalog-fe -am -Pcatalog -Dmaven.test.skip' } } task install_FE() { doLast { install_FE() } } def updaterBERapid(){ /* if ( ticket() > PREVIOUS_BUILD_VAR ){ PREVIOUS_BUILD_VAR = ticket()*/ def started = System.currentTimeMillis(); println "[MasterD][Rapid]--> compiling changes using maven" compileWar() println "[MasterD][Rapid]--> copying war" copyBE() //use this if you want to deploy entire war //hotswap.execute() restartBackend() println msg(" redeploy finished in -> ${System.currentTimeMillis() - started}ms ") } task updaterBERapid(){ doLast { updaterBERapid() } } def updaterBE(){ def started = System.currentTimeMillis(); IS_MVN_INSTALL = pomChanges() ? true : false println "[MasterD]--> compiling changes using maven" compileDependencies() compileWar() println "[MasterD]--> copying war" IS_HOTSWAP ? copyExplodedBE() : copyBE() //execute() //use this if you want to deploy entire war //hotswap.execute() restartBackend() println msg("redeploy finished in -> ${System.currentTimeMillis() - started}ms ") } task updaterBE(){ doLast { updaterBE() } } def copyBEConfiguration(){ /* execSafe { ssh.settings { knownHosts = allowAnyHosts } ssh.run { session(remotes.vagrant) { println msg("Stopping BackEnd Server") execute command[BACKEND][STOP]() } } }*/ } def updaterBEFull(){ def started = System.currentTimeMillis(); compile() println "[MasterD]--> copying war" copyBE() //use this if you want to deploy entire war //hotswap.execute() copyBEConfiguration() println msg("redeploy finished in -> ${System.currentTimeMillis() - started}ms ") } task updaterBEFull(){ doLast { updaterBEFull() } } def copyFEConfiguration(){ //todo- implement } def updaterFE(){ def started = System.currentTimeMillis(); println "[MasterD]--> compiling changes using maven" compileFE() println "[MasterD]--> copying war" copyFE() //.execute() //use this if you want to deploy entire war //hotswap.execute() copyFEConfiguration() println msg("redeploy finished in -> ${System.currentTimeMillis() - started}ms ") } task updaterFE(){ doLast { updaterFE() } } def stopBackend(){ execSafe { ssh.settings { knownHosts = allowAnyHosts } ssh.run { session(remotes.vagrant) { println msg("Stopping BackEnd Server") execute command[BACKEND][STOP]() } } } } task stopBackend(){ doLast { stopBackend() } } def startBackend(){ execSafe { ssh.settings { knownHosts = allowAnyHosts } ssh.run { session(remotes.vagrant) { println msg("[MasterD] starting backend sever") execute command[BACKEND][START]() } } } println """[MasterD]-> finished !! """ } task startBackend(){ doLast{ startBackend() } } def restartBackend(){ execSafe { ssh.settings { knownHosts = allowAnyHosts } ssh.run { session(remotes.vagrant) { println msg("[MasterD] restarting backend server") execute command[BACKEND][RESTART]() } } } println """[MasterD]-> finished !! """ } def startSecurity(){ println "[MasterD] starting security&simulator engine" execSafe { ssh.settings { knownHosts = allowAnyHosts } ssh.run { session(remotes.vagrant) { execute command[SECURITY][START]() } } } println """[MasterD]-> finished !! """ } task startSecurity(){ doLast { startSecurity() } } def stopSecurity(){ println "[MasterD] stopping security&simulator engine" execSafe { ssh.settings { knownHosts = allowAnyHosts } ssh.run { session(remotes.vagrant) { execute command[SECURITY][STOP]() } } } println """[MasterD]-> finished !! """ } task stopSecurity(){ doLast { stopSecurity() } } //todo- remove this if you want to auto-deploy on every file save /* compileJava.doFirst{ updater?.execute() }*/ enum STATUS { UP, DOWN , UNKNOWN , UNAVAILABLE } task health(){ doLast { prepareTray() } } def execSafe( closure){ if (!lockObj) { [0..4].forEach( {println "Critical ERROR : lock object is not initialized\n\nCritical ERROR : cannot run tasks\n"}() ) return; } synchronized (lockObj){ boolean prev = isHaltHealth.get() try { isHaltHealth.set(true) closure() } catch (Exception e) { println e } finally { isHaltHealth.set(prev) } } } def fetchFiles( remote, local ){ ssh.run { session(remotes.vagrant) { //execute "cd /home/vagrant/catalog-be/tmp ; ls -lt | grep catalog-be" //todo- use my dates to filter def f = get from: remote , into: local println f?.name //return f } //println "fetched files in ${System.currentTimeMillis() - started} ms" } //return null } def killJava(){ execSafe { def res ssh.run { session( remotes.vagrant ) { println """ *-*-****************************-*-* killing all java proccesses *-*-****************************-*-* """ res = execute command[ALL][KILL]() } } println res?.toString() } } def importNormative(){ execSafe { ssh.run { session(remotes.vagrant) { println """ *-*-************************************-*-* importNormative *-*-************************************-*-* """ execute "sudo python -v $BE_REMOTE/scripts/import/tosca/importNormativeAll.py" } } } } def startAll(){ def startCassandra = """ #!/bin/bash cassandra& elasticsearch -d #Wait until ES is up until curl localhost:9200/_cluster/health; do printf "." sleep 3 done # Create Elastic Mapping if not exist in ES createESMapping.sh """ execSafe { ssh.run { session(remotes.vagrant) { println """ *-*-************************************-*-* starting all SDC services(DB,BE,FE,Webseal) *-*-************************************-*-* """ if ( isProductionVM() ){ execute command[DB][START]() Thread.sleep(5000) execute command[CACHING][START]() } else execute startCassandra //[0..4]?.forEach( Thread?.sleep(2000) ) Thread?.sleep(10000) Thread?.sleep(10000) execute command[BACKEND][START]() execute command[FRONTEND][START]() execute command[SECURITY][START]() } } } } /*def clearLog(type: Delete){ delete{ delete 'C:/ProgramData/all.log' followSymlinks = true } }*/ task clearLog(type: Delete){ doLast{ delete 'C:/ProgramData/all.log' followSymlinks = true } } def logBE(){ try{ println "\n*** logging BE all.log ***\n" ssh.run { session( remotes.vagrant ) { //String now = execute 'echo \"\$(date +\'%Y_%m_%d\')\"' //println "\n\n*******************************************************\n\n"+now?.toString() clearLog?.execute() //todo- remove this .execute() fetchFiles( '/home/vagrant/catalog-be/logs/SDC/SDC-BE/all.log' , 'C:/ProgramData') //"%USERPROFILE%\AppData\Local\") //project.ext.set( "logFile" , 'C:/ProgramData/all.log' ) // -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*' } } parallel { exec { //if ( logFile ){ String notepad = 'C:\\Program Files (x86)\\Notepad++\\notepad++.exe' println "logging $logFile to notepad++ [$notepad]" commandLine 'cmd','/c' , notepad ,logFile } } }catch(Exception e){ println "cannot open logs!!!" e.printStackTrace() } } task logBE(){ doLast{ logBE() } } def toggleHealthPolling(){ isHaltHealth.set(!isHaltHealth.get()) } //converts predefined icon to Image def Image convert( imageName ){ String encodedimage = project.ext.get(imageName); byte[] byteImage = encodedimage?.split(',')[1]?.decodeBase64() Image image = ImageIO.read(new ByteArrayInputStream(byteImage)); } def refreshMenu(String imageName){ switch( imageName ) { case 'unavailableImg' : toggleHealthString = "Resume Health"; break; default : toggleHealthString = "Halt Health"; } if (((MenuItem)toggleHealthItemView).getLabel() != toggleHealthString) ((MenuItem)toggleHealthItemView).setLabel(toggleHealthString); } def startDB(){ println "[MasterD] Starting database.." execSafe { ssh.settings { knownHosts = allowAnyHosts } ssh.run { session(remotes.vagrant) { execute command[DB][START]() } } } } task startDB(){ doLast { startDB() } } def stopDB(){ execSafe { ssh.settings { knownHosts = allowAnyHosts } ssh.run { session(remotes.vagrant) { execute command[DB][STOP]() } } } } task stopDB(){ doLast { stopDB() } } def startFE(){ execSafe { ssh.settings { knownHosts = allowAnyHosts } ssh.run { session(remotes.vagrant) { execute command[FRONTEND][START]() } } } } task startFE(){ doLast { startFE() } } def stopFE(){ execSafe { ssh.settings { knownHosts = allowAnyHosts } ssh.run { session(remotes.vagrant) { execute command[FRONTEND][STOP]() } } } } task stopFE(){ doLast { stopFE() } } def ActionListener newListener( closure ){ ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent e) { try { closure() } catch (AWTException e1) { System.err.println(e1); } } } listener } ext.updateTray = { STATUS status -> lastStatus = status if (SystemTray.isSupported()) { // get the SystemTray instance SystemTray tray = SystemTray.getSystemTray(); // load an image String imageName = status==STATUS.UP ? (Math.random()>0.5 ?'okImg1':'okImg2') : status==STATUS.UNAVAILABLE ? 'unavailableImg' : status==STATUS.DOWN ? 'errorImg' : 'warnImg' Image image = convert imageName if (trayIcon != null) { trayIcon.setImage(image) refreshMenu(imageName); return ; } //region -> Menu UI // create a popup menu PopupMenu popup = new PopupMenu(); // create menu item for the default action MenuItem hotswapItem = new MenuItem("===> WAR <==="); hotswapItem.setFont(new Font("MONOSPACED" , Font.BOLD ,15f )) //region Multilevel Menus Menu deployMasterMenu = new Menu("DeployMaster"); Menu backendMenu = new Menu("Backend"); Menu frontendMenu = new Menu("Frontend"); Menu dbMenu = new Menu("Database"); Menu securityMenu = new Menu("Security"); try{ deployMasterMenu.setFont(new Font("Cooper Black" ,Font.BOLD ,14f )) backendMenu.setFont(new Font("Cooper Black" ,Font.PLAIN ,13f )) frontendMenu.setFont(new Font("Cooper Black" ,Font.PLAIN ,13f )) dbMenu.setFont(new Font("Cooper Black" ,Font.PLAIN ,13f )) securityMenu.setFont(new Font("Cooper Black" ,Font.PLAIN ,13f )) }catch(Exception e){ println e } //DeployMaster Menu MenuItem updaterBeWithDependenciesItem = new MenuItem("[BE] Quick Compile -> Deploy"); MenuItem updaterFullBeItem = new MenuItem("[BE] Full Install -> Deploy"); MenuItem updaterFeItem = new MenuItem("[FE] Quick Compile -> Deploy"); MenuItem updaterFullFeItem = new MenuItem("[FE] Full Install -> Deploy"); //Menu UI build deployMasterMenu.add(updaterFullBeItem); deployMasterMenu.add(updaterBeWithDependenciesItem); deployMasterMenu.addSeparator(); deployMasterMenu.add(updaterFullFeItem); deployMasterMenu.add(updaterFeItem); //BE menu MenuItem startItem = new MenuItem("[BE] Start"); MenuItem stopItem = new MenuItem("[BE] Stop BackEnd"); MenuItem copyBeWarItem = new MenuItem("[BE] Copy War"); backendMenu.add(startItem); backendMenu.add(stopItem); (isOnapVM()) ?: backendMenu.add(copyBeWarItem); //FE menu MenuItem startFEItem = new MenuItem("[FE] Start"); MenuItem stopFEItem = new MenuItem("[FE] Stop"); MenuItem copyFeWarItem = new MenuItem("[FE] Copy War"); frontendMenu.add(startFEItem); frontendMenu.add(stopFEItem); (isOnapVM()) ?: frontendMenu.add(copyFeWarItem); //DB menu MenuItem startDBItem = new MenuItem("[DB] Start"); MenuItem stopDBItem = new MenuItem("[DB] Stop"); MenuItem backupDBItem = new MenuItem("[DB] Backup"); MenuItem restoreDBItem = new MenuItem("[DB] Restore"); dbMenu.add(startDBItem); dbMenu.add(stopDBItem); dbMenu.add(backupDBItem); dbMenu.add(restoreDBItem); //endregion //Security Menu MenuItem startSecurityItem = new MenuItem("[Security] Start"); MenuItem stopSecurityItem = new MenuItem("[Security] Stop"); securityMenu.add(startSecurityItem) securityMenu.add(stopSecurityItem) MenuItem killItem = new MenuItem("Kill All"); MenuItem startAllItem = new MenuItem("Start All"); MenuItem importItem = new MenuItem("Import Normative"); MenuItem healthInfoItem = new MenuItem("[Info] Health"); MenuItem toggleHealthItem = new MenuItem(toggleHealthString); MenuItem logsItem = new MenuItem("Logs [Beta]"); MenuItem exitItem = new MenuItem("Exit"); toggleHealthItemView = toggleHealthItem; (isOnapVM()) ?: popup.add(hotswapItem); (isOnapVM()) ?:popup?.addSeparator(); (isOnapVM()) ?: popup.add(deployMasterMenu); (isOnapVM()) ?:popup?.addSeparator(); popup.add(backendMenu) popup.add(frontendMenu) (isOnapVM()) ?: popup.add(dbMenu) popup?.addSeparator(); popup?.add(securityMenu) popup?.addSeparator(); popup.add(startAllItem); popup.add(killItem); popup?.addSeparator(); popup.add(toggleHealthItem); popup.add(healthInfoItem); (isOnapVM()) ?:popup?.addSeparator(); (isOnapVM()) ?: popup.add(importItem); (isOnapVM()) ?: popup.add(logsItem); popup?.addSeparator(); popup.add(exitItem); //endregion UI // construct a TrayIcon trayIcon = new TrayIcon(image, "HealthTray", popup); //region -> Button actions def listenerHotswap = newListener { project.ext.set("IS_HOTSWAP", !IS_HOTSWAP); hotswapItem?.setLabel( IS_HOTSWAP ? "==> HotSwap <==" : "===> WAR <===") } // create a action listener to listen for default action executed on the tray icon def listenerFullBE = newListener { parallel { install_BE(); IS_HOTSWAP ? copyExplodedBE() : copyBE(); restartBackend() } } def listenerFullFE = newListener { parallel { install_FE(); copyFE() } } ActionListener listenerFE = newListener { parallel { updaterFE() } } ActionListener listenerBE = newListener { parallel { updaterBE() } } ActionListener exitListener = newListener { executor?.isShutdown() ?: executor?.shutdown() tray.remove(trayIcon); project.ext.set("isStopHealthCheck", true) println "Shutting down.. bye bye.." } ActionListener stopBackendListener = newListener { stopBackend() } ActionListener startBEListener = newListener { parallel { startBackend() } } ActionListener killJavaListener = newListener { killJava() } ActionListener startAllListener = newListener { parallel { startAll() } } ActionListener startSecurityListener = newListener { startSecurity() } ActionListener stopSecurityListener = newListener { stopSecurity() } ActionListener listener5 = new ActionListener() { public void actionPerformed(ActionEvent e) { try { parallel { importNormative() } } catch (AWTException e1) { System.err.println(e1); } } }; ActionListener listener6 = new ActionListener() { public void actionPerformed(ActionEvent e) { try { parallel { healthPopup() } } catch (AWTException e1) { System.err.println(e1); } } }; ActionListener listener7 = new ActionListener() { public void actionPerformed(ActionEvent e) { try { logBE()//tasks.logger.execute() } catch (AWTException e1) { System.err.println(e1); } } }; ActionListener listener8 = new ActionListener() { public void actionPerformed(ActionEvent e) { try { toggleHealthPolling()//tasks.logger.execute() } catch (AWTException e1) { System.err.println(e1); } } }; ActionListener copyBeWarListener = new ActionListener() { public void actionPerformed(ActionEvent e) { try { parallel { copyBE() }//.execute()//tasks.logger.execute() } catch (AWTException e1) { System.err.println(e1); } } }; ActionListener startDBListener = new ActionListener() { public void actionPerformed(ActionEvent e) { try { parallel { startDB() }//tasks.logger.execute() } catch (AWTException e1) { System.err.println(e1); } } } ActionListener stopDBListener = new ActionListener() { public void actionPerformed(ActionEvent e) { try { stopDB()//tasks.logger.execute() } catch (AWTException e1) { System.err.println(e1); } } } ActionListener dbBackupListener = new ActionListener() { public void actionPerformed(ActionEvent e) { try { parallel { backupDB()//tasks.logger.execute() } } catch (AWTException e1) { System.err.println(e1); } } } ActionListener feStartListener = new ActionListener() { public void actionPerformed(ActionEvent e) { try { parallel { startFE() }//tasks.logger.execute() } catch (AWTException e1) { System.err.println(e1); } } } ActionListener feStopListener = new ActionListener() { public void actionPerformed(ActionEvent e) { try { stopFE()//tasks.logger.execute() } catch (AWTException e1) { System.err.println(e1); } } } ActionListener feCopyListener = new ActionListener() { public void actionPerformed(ActionEvent e) { try { parallel { copyFE() //.execute()//tasks.logger.execute() } } catch (AWTException e1) { System.err.println(e1); } } } //def listenerFullModules = newListener { parallel { installAllProject() } } //region -> Button<=Listener hotswapItem.addActionListener(listenerHotswap) updaterFeItem.addActionListener(listenerFE) updaterFullBeItem.addActionListener( listenerFullBE ) updaterBeWithDependenciesItem.addActionListener( listenerBE ) updaterFullFeItem.addActionListener( listenerFullFE ) stopItem.addActionListener(stopBackendListener) startItem.addActionListener(startBEListener) copyBeWarItem.addActionListener(copyBeWarListener); startSecurityItem.addActionListener(startSecurityListener) stopSecurityItem.addActionListener(stopSecurityListener) killItem.addActionListener(killJavaListener) startAllItem.addActionListener(startAllListener) importItem.addActionListener(listener5) healthInfoItem.addActionListener(listener6) toggleHealthItem.addActionListener(listener8) logsItem.addActionListener(listener7) exitItem.addActionListener(exitListener) startDBItem.addActionListener( startDBListener ) stopDBItem.addActionListener( stopDBListener ) backupDBItem.addActionListener( dbBackupListener ) copyFeWarItem.addActionListener( feCopyListener ) startFEItem.addActionListener( feStartListener ) stopFEItem.addActionListener( feStopListener ) //endregion //endregion // set the TrayIcon properties // ... // add the tray image try { tray.add(trayIcon); } catch (AWTException e) { System.err.println(e); } // ... } else { println "Java TrayIcon Option is not supported in your System, try enabling it. Bye Bye" } } def prepareTray(){ long UPDATE_THRESHOLD = 3500 float SCALAR = 1 ssh.settings { knownHosts = allowAnyHosts } while(!isStopHealthCheck) { if (!isHaltHealth.get()) { //if await or await is more then 60 second return health check ssh.run { session(remotes.vagrant) { try { def healthOutput = execute command[ALL][HEALTH]() if (healthOutput?.contains("Failed command .* with status 7") || healthOutput?.contains("Problem accessing /sdc2/rest/healthCheck")) updateTray(STATUS.DOWN) def statusCollecion = healthOutput?.findAll "\"healthCheckStatus\": \".*\"" def upCount = statusCollecion?.count { it?.contains("UP") } def downCount = statusCollecion?.count { it?.contains("DOWN") } def uknownCount = (statusCollecion?.size() - upCount) - downCount println " UP -> $upCount | downCount=$downCount | uknownCount=$uknownCount " (uknownCount > 0 || (downCount > 0 && upCount > 0)) ? updateTray(STATUS.UNKNOWN) : ((upCount > 0) ? updateTray(STATUS.UP) : updateTray(STATUS.DOWN)) SCALAR = 1 } catch (Exception e) { updateTray(STATUS.DOWN) println e SCALAR = Math.min(SCALAR * 1.1, 5) //slow down on errors } //green color effects if (lastStatus && lastStatus == STATUS.UP) { trayIcon.setImage(convert(Math.random() > 0.5 ? 'okImg1' : 'okImg2')) //randomly green change color } Thread.yield() Thread?.sleep((long) (UPDATE_THRESHOLD * SCALAR)) } } }else{ updateTray(STATUS.UNAVAILABLE) Thread.yield() } } } def healthPopup(){ ssh.run { session(remotes.vagrant) { def healthOutput = execute command[ALL][HEALTH]() JOptionPane.showMessageDialog(null, healthOutput, "HEALTH", JOptionPane.INFORMATION_MESSAGE); } } } project.ext.set("msg", { content -> """ ************************************************************************************************ ************************************************************************************************ ******* ********* ************** **************** $content ************************************************************************************************ ************************************************************************************************ """} )