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(){ //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 "sudo 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
.. This work is licensed under a Creative Commons Attribution 4.0 International License.

=============
Release Notes
=============

Version: 1.1.0
==============

:Release Date: 2017-11-15



SDC SDKs Versions
-----------------

-  sdc-distribution-client

   :Version: 1.1.32

|

-  sdc-tosca

   :Version: 1.1.32
   

Release Purpose
----------------
The Amsterdam release is the first OMAP release.
This release is focused on creating a merged architecture between the OpenECOMP and OpenO comonents.
In addition, the release enhances the list of supported use cases to support the `VoLTE <https://wiki.onap.org/pages/viewpage.action?pageId=6593603>`_ snd 'vCPE <https://wiki.onap.org/pages/viewpage.action?pageId=3246168>`_ use cases.

New Features
------------

Main Fetures
-  Full and comprehensive VNF/Software Application(VF) and service design
-  Collaborative design
-  VNF/VF/SERVICE testing and certification
-  Distribution to ONAP
-  External API- for VNF/VF and  service 
-  Integration with BSS / Customer ordering.

**Epics**

-  [`SDC-52 <https://jira.onap.org/browse/SDC-52>`__\ ] - SDC Opensource
   tech gaps
-  [`SDC-53 <https://jira.onap.org/browse/SDC-53>`__\ ] - F28350/302244
   [MVP] SDC 1710 - Increment Conformance Level
-  [`SDC-54 <https://jira.onap.org/browse/SDC-54>`__\ ] - F36419/299760
   [EPIC] - [MVP] SDC 1710 – Introduce a new Asset Type: PNF
-  [`SDC-55 <https://jira.onap.org/browse/SDC-55>`__\ ] - F34117/305092
   [EPIC] - [MVP] SDC 1710 – Enhance the CP
-  [`SDC-56 <https://jira.onap.org/browse/SDC-56>`__\ ] - F36795/298830
   [EPIC] – Provide a new Capability to Onboard non-HEAT VNFs based on a
   Questionnaire.
-  [`SDC-57 <https://jira.onap.org/browse/SDC-57>`__\ ] - F36795/150093
   [EPIC] – Enhance the VNF Model to include VNFC (VFC)
-  [`SDC-58 <https://jira.onap.org/browse/SDC-58>`__\ ] - F36795/291353
   EPIC] - [MVP] ASDC 1710 -TOSCA Parser - Stand alone
-  [`SDC-59 <https://jira.onap.org/browse/SDC-59>`__\ ] - F36795/296771
   [EPIC] - [MVP] SDC 1710 - TOSCA Parser – Support Complex Inputs
-  [`SDC-60 <https://jira.onap.org/browse/SDC-60>`__\ ] - F36795/309319
   EPIC] – Provide Additional Artifact type relevant for VNF Onboarding.
-  [`SDC-61 <https://jira.onap.org/browse/SDC-61>`__\ ] - F36797/291413
   [EPIC] - Enhance the VFC Model with additional Properties for VFC
   characterization
-  [`SDC-62 <https://jira.onap.org/browse/SDC-62>`__\ ] - F36801/152151
   [EPIC] - [MVP] ASDC 1707 - Tosca Schema files
-  [`SDC-63 <https://jira.onap.org/browse/SDC-63>`__\ ] - F36257/292814
   EPIC] - [MVP] SDC 1710 NFR – Enhance the System Health Check API
-  [`SDC-64 <https://jira.onap.org/browse/SDC-64>`__\ ] - 306915 EPIC:
   [DevOps] - SSL Certificates separation of certificates for the
   deployment code
-  [`SDC-66 <https://jira.onap.org/browse/SDC-66>`__\ ] - Workflow
   Designer
-  [`SDC-71 <https://jira.onap.org/browse/SDC-71>`__\ ] - Workflow
   Management
-  [`SDC-99 <https://jira.onap.org/browse/SDC-99>`__\ ] - Onbording
   Tosca VNF
-  [`SDC-111 <https://jira.onap.org/browse/SDC-111>`__\ ] - swagger
   restful interface support
-  [`SDC-116 <https://jira.onap.org/browse/SDC-116>`__\ ] - bpmn
   workflow modeler
-  [`SDC-218 <https://jira.onap.org/browse/SDC-218>`__\ ] - support
   integration with VFC
-  [`SDC-219 <https://jira.onap.org/browse/SDC-219>`__\ ] - Support for
   uCPE usecase
-  [`SDC-287 <https://jira.onap.org/browse/SDC-287>`__\ ] - catalog
   support TOSCA CSAR import and distribution
-  [`SDC-326 <https://jira.onap.org/browse/SDC-326>`__\ ] - Support work
   flows in SDC

**Stories**

-  [`SDC-28 <https://jira.onap.org/browse/SDC-28>`__\ ] - TDP 291354 -
   JTOSCA repo initial commit
-  [`SDC-67 <https://jira.onap.org/browse/SDC-67>`__\ ] - Workflow
   designer support json object type
-  [`SDC-68 <https://jira.onap.org/browse/SDC-68>`__\ ] - Workflow
   designer support Swagger definition
-  [`SDC-69 <https://jira.onap.org/browse/SDC-69>`__\ ] - WorkFlow Input
   Parameter Designer
-  [`SDC-70 <https://jira.onap.org/browse/SDC-70>`__\ ] - WorkFlow
   Diagram Editor
-  [`SDC-72 <https://jira.onap.org/browse/SDC-72>`__\ ] - Export
   WorkFlow
-  [`SDC-74 <https://jira.onap.org/browse/SDC-74>`__\ ] - Delete
   WorkFlow
-  [`SDC-75 <https://jira.onap.org/browse/SDC-75>`__\ ] - Modify
   WorkFlow
-  [`SDC-76 <https://jira.onap.org/browse/SDC-76>`__\ ] - Add WorkFlow
-  [`SDC-81 <https://jira.onap.org/browse/SDC-81>`__\ ] - Support VNF
   Package Specification
-  [`SDC-92 <https://jira.onap.org/browse/SDC-92>`__\ ] - Topology
   Diagram Editor
-  [`SDC-94 <https://jira.onap.org/browse/SDC-94>`__\ ] - Support
   Package draft
-  [`SDC-95 <https://jira.onap.org/browse/SDC-95>`__\ ] - Support
   Package draft
-  [`SDC-96 <https://jira.onap.org/browse/SDC-96>`__\ ] - Package
   multiple-versions support
-  [`SDC-97 <https://jira.onap.org/browse/SDC-97>`__\ ] - CLI Package
   Validation and Packaging tool
-  [`SDC-98 <https://jira.onap.org/browse/SDC-98>`__\ ] - Template
   management
-  [`SDC-112 <https://jira.onap.org/browse/SDC-112>`__\ ] - support
   swagger specification interface definition
-  [`SDC-113 <https://jira.onap.org/browse/SDC-113>`__\ ] - support set
   swagger info by swagger string
-  [`SDC-114 <https://jira.onap.org/browse/SDC-114>`__\ ] - support set
   swagger info by url
-  [`SDC-115 <https://jira.onap.org/browse/SDC-115>`__\ ] - support
   invoke restful interfaces defined by swagger specification
-  [`SDC-117 <https://jira.onap.org/browse/SDC-117>`__\ ] - support bpmn
   workflow nodes(start, end, exclusive gateway, parallel gateway)
-  [`SDC-119 <https://jira.onap.org/browse/SDC-119>`__\ ] - support set
   conditoin for gateway
-  [`SDC-120 <https://jira.onap.org/browse/SDC-120>`__\ ] - support set
   input and output params for start event and end event
-  [`SDC-121 <https://jira.onap.org/browse/SDC-121>`__\ ] - support
   quote output of previous workflow node for params
-  [`SDC-122 <https://jira.onap.org/browse/SDC-122>`__\ ] - support
   quote input of start event for params
-  [`SDC-161 <https://jira.onap.org/browse/SDC-161>`__\ ] - Remove
   MojoHaus Maven plug-in from pom file
-  [`SDC-223 <https://jira.onap.org/browse/SDC-223>`__\ ] - Attachment
   display changes - UI
-  [`SDC-224 <https://jira.onap.org/browse/SDC-224>`__\ ] - Tosca based
   onbaording enrichment - BE
-  [`SDC-225 <https://jira.onap.org/browse/SDC-225>`__\ ] - Tosca
   validation in the attachment - BE
-  [`SDC-226 <https://jira.onap.org/browse/SDC-226>`__\ ] - Support
   TOSCA CSAR attachments and validation in overview display - BE
-  [`SDC-227 <https://jira.onap.org/browse/SDC-227>`__\ ] - Create new
   VSP, onboard from TOSCA file - BE
-  [`SDC-228 <https://jira.onap.org/browse/SDC-228>`__\ ] - Tosca based
   onbaording enrichment - UI
-  [`SDC-229 <https://jira.onap.org/browse/SDC-229>`__\ ] - Support
   TOSCA attachments in overview display - UI
-  [`SDC-230 <https://jira.onap.org/browse/SDC-230>`__\ ] - Create new
   VSP, onboard from TOSCA file - UI
-  [`SDC-231 <https://jira.onap.org/browse/SDC-231>`__\ ] - VNF package
   manifest file parsing - BE
-  [`SDC-232 <https://jira.onap.org/browse/SDC-232>`__\ ] - Import TOSCA
   YAML CSAR - BE
-  [`SDC-240 <https://jira.onap.org/browse/SDC-240>`__\ ] - WorkFlow
   Deisigner seed code
-  [`SDC-248 <https://jira.onap.org/browse/SDC-248>`__\ ] - add verify
   job for workflow-designer in ci-manager
-  [`SDC-255 <https://jira.onap.org/browse/SDC-255>`__\ ] - support add
   workflow node
-  [`SDC-257 <https://jira.onap.org/browse/SDC-257>`__\ ] - save and
   query workflow definition data from catalog
-  [`SDC-269 <https://jira.onap.org/browse/SDC-269>`__\ ] - support set
   microservice info
-  [`SDC-276 <https://jira.onap.org/browse/SDC-276>`__\ ] - add dynamic
   dox scheme creation
-  [`SDC-282 <https://jira.onap.org/browse/SDC-282>`__\ ] - support rest
   task node
-  [`SDC-288 <https://jira.onap.org/browse/SDC-288>`__\ ] - Independent
   Versioning and Release Process
-  [`SDC-294 <https://jira.onap.org/browse/SDC-294>`__\ ] - support bpmn
   timer element
-  [`SDC-295 <https://jira.onap.org/browse/SDC-295>`__\ ] - delete node
   or connection by keyboard
-  [`SDC-299 <https://jira.onap.org/browse/SDC-299>`__\ ] - Port
   mirorring
-  [`SDC-306 <https://jira.onap.org/browse/SDC-306>`__\ ] - Replace
   Dockefiles with new baselines
-  [`SDC-318 <https://jira.onap.org/browse/SDC-318>`__\ ] - Provide
   preset definitions for the enitity types standardized by the
   tosca-nfv specification.
-  [`SDC-325 <https://jira.onap.org/browse/SDC-325>`__\ ] - Add “Network
   Service” and “E2E Service” to the predefined list of SDC categories.
-  [`SDC-327 <https://jira.onap.org/browse/SDC-327>`__\ ] - add new
   artifact type to SDC
-  [`SDC-329 <https://jira.onap.org/browse/SDC-329>`__\ ] - add
   categories to define SDC service
-  [`SDC-339 <https://jira.onap.org/browse/SDC-339>`__\ ] - project
   package and create dockfile
-  [`SDC-355 <https://jira.onap.org/browse/SDC-355>`__\ ] - support set
   value for branch node
-  [`SDC-360 <https://jira.onap.org/browse/SDC-360>`__\ ] - Import New
   VF vCSCF
-  [`SDC-370 <https://jira.onap.org/browse/SDC-370>`__\ ] - sdc
   documentation
-  [`SDC-379 <https://jira.onap.org/browse/SDC-379>`__\ ] - Write
   functional test cases based on the functionality tested by sanity
   docker
-  [`SDC-476 <https://jira.onap.org/browse/SDC-476>`__\ ] - add sonar
   branch to sdc project pom
-  [`SDC-481 <https://jira.onap.org/browse/SDC-481>`__\ ] - update
   swager
-  [`SDC-498 <https://jira.onap.org/browse/SDC-498>`__\ ] - Support and
   align CSAR's for VOLTE
-  [`SDC-506 <https://jira.onap.org/browse/SDC-506>`__\ ] - Fill SDC
   read the docs sections
-  [`SDC-517 <https://jira.onap.org/browse/SDC-517>`__\ ] - ONAP support
-  [`SDC-521 <https://jira.onap.org/browse/SDC-521>`__\ ] - CSIT and
   sanity stabilization
-  [`SDC-522 <https://jira.onap.org/browse/SDC-522>`__\ ] - sync 1710
   defacts into ONAP
-  [`SDC-586 <https://jira.onap.org/browse/SDC-586>`__\ ] - Support and
   align CSAR's for VOLTE
-  [`SDC-594 <https://jira.onap.org/browse/SDC-594>`__\ ] - Fill SDC
   read the docs sections
-  [`SDC-608 <https://jira.onap.org/browse/SDC-608>`__\ ] - CSIT and
   sanity stabilization
-  [`SDC-615 <https://jira.onap.org/browse/SDC-615>`__\ ] - add new
   artifact type to SDC
-  [`SDC-619 <https://jira.onap.org/browse/SDC-619>`__\ ] - ONAP support
-  [`SDC-623 <https://jira.onap.org/browse/SDC-623>`__\ ] - Independent
   Versioning and Release Process




Bug Fixes
---------

**Bugs**

-  [`SDC-160 <https://jira.onap.org/browse/SDC-160>`__\ ] - substitution
   mapping problem
-  [`SDC-256 <https://jira.onap.org/browse/SDC-256>`__\ ] - modify
   workflow version in package.json
-  [`SDC-263 <https://jira.onap.org/browse/SDC-263>`__\ ] - Exception is
   not showing the correct error
-  [`SDC-270 <https://jira.onap.org/browse/SDC-270>`__\ ] - The node
   template name in the capability/requirement mapping map is not
   synchronized while modify a node template' name.
-  [`SDC-273 <https://jira.onap.org/browse/SDC-273>`__\ ] - Error:
   Internal Server Error. Please try again later
-  [`SDC-280 <https://jira.onap.org/browse/SDC-280>`__\ ] - SDC
   healthcheck 500 on Rackspace deployment
-  [`SDC-283 <https://jira.onap.org/browse/SDC-283>`__\ ] - jjb daily
   build fail
-  [`SDC-289 <https://jira.onap.org/browse/SDC-289>`__\ ] - UI shows
   {length} and {maxLength} instead of actual limit values
-  [`SDC-290 <https://jira.onap.org/browse/SDC-290>`__\ ] - discrepancy
   between the BE and FE on the “Create New License Agreement” Wizard
-  [`SDC-296 <https://jira.onap.org/browse/SDC-296>`__\ ] - The default
   value of the VF input parameter is incorrect.
-  [`SDC-297 <https://jira.onap.org/browse/SDC-297>`__\ ] - adjust
   textarea component style
-  [`SDC-298 <https://jira.onap.org/browse/SDC-298>`__\ ] - The exported
   CSAR package of VFC lacks the definition of capability types
   standardized in the tosca-nfv specification.
-  [`SDC-300 <https://jira.onap.org/browse/SDC-300>`__\ ] - GET query to
   metadata fails requested service not found
-  [`SDC-307 <https://jira.onap.org/browse/SDC-307>`__\ ] - add sequence
   flow after refresh
-  [`SDC-308 <https://jira.onap.org/browse/SDC-308>`__\ ] - save new
   position after node dragged
-  [`SDC-309 <https://jira.onap.org/browse/SDC-309>`__\ ] - The exported
   CSAR package of VF lacks the definition of relationship types
   standardized in the tosca-nfv specification.
-  [`SDC-310 <https://jira.onap.org/browse/SDC-310>`__\ ] - The exported
   CSAR package of VFC lacks the definition of data types standardized
   in the tosca-nfv specification.
-  [`SDC-313 <https://jira.onap.org/browse/SDC-313>`__\ ] - requirement
   id is not correct
-  [`SDC-323 <https://jira.onap.org/browse/SDC-323>`__\ ] - The scalar
   unit type value is in correctly created
-  [`SDC-335 <https://jira.onap.org/browse/SDC-335>`__\ ] - swagger
   convert error
-  [`SDC-337 <https://jira.onap.org/browse/SDC-337>`__\ ] - add missing
   global type
-  [`SDC-338 <https://jira.onap.org/browse/SDC-338>`__\ ] - submit fails
   when uploading CSAR file
-  [`SDC-344 <https://jira.onap.org/browse/SDC-344>`__\ ] - move jtosca
   version to main pom
-  [`SDC-349 <https://jira.onap.org/browse/SDC-349>`__\ ] - add global
   type for import tosca
-  [`SDC-351 <https://jira.onap.org/browse/SDC-351>`__\ ] - enable port
   mirroring
-  [`SDC-353 <https://ji