import java.awt.Color
import java.util.concurrent.Callable
import java.util.concurrent.Executors
import java.util.concurrent.atomic.AtomicBoolean
import static Services.*
import static ServiceControl.*
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
group 'com.att.ecomp'
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
}
//env variables
//fill YOUR_WINDOWS_USER_HOME
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", NEW_VAG ? System.getenv("NEW_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", NEW_VAG ? '/opt/app/jetty/base/be' : '/home/vagrant/catalog-be' )
project.ext.set("FE_REMOTE", NEW_VAG ? '/opt/app/jetty/base/fe' : '/home/vagrant/catalog-fe' )
project.ext.set("VAGRANT_USER", NEW_VAG ? 'm11981' : 'vagrant' )
project.ext.set("RSA_PRIVATE_KEY_PATH", NEW_VAG ? "$VAGRANT_HOME/id_rsa" : '' )
project.ext.set("VAGRANT_PASSWORD", NEW_VAG ? '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) : { NEW_VAG ? 'sudo curl -i http://localhost:8181/sdc1/rest/healthCheck' : 'curl -i localhost:8080/sdc2/rest/healthCheck' } ,
(KILL) : { NEW_VAG ? 'sudo pkill java' : 'pkill java'} ] , // TODO: refine kill only for services
(BACKEND) : [ (START) : { NEW_VAG ? 'sudo service jettyBE start' : 'service catalog-be start'} ,
(STOP) : { NEW_VAG ? 'sudo service jettyBE stop' : 'service catalog-be stop'} ,
(RESTART) : { NEW_VAG ? 'sudo service jettyBE restart' : 'service catalog-be restart'}] ,
(DB) : [ (START) : { NEW_VAG ? 'sudo service cassandra start' : 'start-asdc-storage.sh' } ,
(STOP) : { NEW_VAG ? 'sudo service cassandra stop' : 'service cassandra stop'} ,
(RESTART) : { NEW_VAG ? 'sudo service cassandra restart' : 'service cassandra restart'} ] ,
(FRONTEND): [ (START) : { NEW_VAG ? 'sudo service jettyFE start' : 'service catalog-fe start' } ,
(STOP) : { NEW_VAG ? 'sudo service jettyFE stop' : 'service catalog-fe stop'} ,
(RESTART) : { NEW_VAG ? 'sudo service jettyFE restart' : 'service catalog-fe restart' } ] ,
(CACHING): [ (START) : { NEW_VAG ? 'sudo service elasticsearch start' : 'echo "starting es is not yet supported"' } ],
(SECURITY): [ (START) : { NEW_VAG ? 'sudo docker start sdc-WebSeal-Simulator' : 'service webseal-simulator start' } ,
(STOP) : { NEW_VAG ? 'sudo docker stop sdc-WebSeal-Simulator' : 'service webseal-simulator stop'} ,
(RESTART) : { NEW_VAG ? 'sudo docker restart sdc-WebSeal-Simulator' : '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() )
/*compile?.doLast {
println "2. hello compile2"
}*/
/*def post(String host , String serviceName,String msg){
// POST
def post = new URL("$host/$serviceName").openConnection();
def message = '{"message":"this is a message"}'
post.setRequestMethod("POST")
post.setDoOutput(true)
post.setRequestProperty("Content-Type", "application/json")
post.getOutputStream().write(message.getBytes("UTF-8"));
def postRC = post.getResponseCode();
println(postRC);
if( postRC.equals(200)) {
println(post.getInputStream().getText());
}
}
def postStat( long operationTime, String user , String meta ){
def host = 'http://135.76.123.70:8888'
def params = "user=$user&meta=$meta"
post host , "UserStats" , params
}*/
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<Object>(){
@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 = [ : ] //<old,new>
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 = NEW_VAG ? new File(RSA_PRIVATE_KEY_PATH) : null
}
}
def gitLatest(){
}
def newEcoSystem(){
//cleanTitan()
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 titan
createSchemaPostStep()
}
def cleanTitan(){
execSafe{
ssh.settings {
knownHosts = allowAnyHosts
}
ssh.run {
session(remotes.vagrant) {
execute "cqlsh -e 'DROP KEYSPACE titan;'"
println "[MasterD][DB_DROP]-> Dropped 'titan' KEYSPACE."
}
}
}
}
task cleanTitan {
doLast{
cleanTitan()
}
}
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) {
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) {
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 sever")
execute command[BACKEND][RESTART]()
}
}
}
println """[MasterD]-> finished !!
"""
}
//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 "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 ( NEW_VAG ){
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");
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 ))
}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);
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);
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
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;
popup.add(hotswapItem);
popup?.addSeparator();
popup.add(deployMasterMenu);
popup?.addSeparator();
popup.add(backendMenu)
popup.add(frontendMenu)
popup.add(dbMenu)
popup?.addSeparator();
popup.add(startAllItem);
popup.add(killItem);
popup?.addSeparator();
popup.add(toggleHealthItem);
popup.add(healthInfoItem);
popup?.addSeparator();
popup.add(importItem);
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 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);
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
************************************************************************************************
************************************************************************************************
"""} )