aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitattributes1
-rw-r--r--.gitignore22
-rw-r--r--.gitreview4
-rw-r--r--README.md4
-rw-r--r--plans/aaf/aafapi/setup.sh77
-rw-r--r--plans/aaf/aafapi/teardown.sh24
-rw-r--r--plans/aaf/aafapi/testplan.txt2
-rwxr-xr-xplans/aaf/sms-test-plan/setup.sh71
-rw-r--r--plans/aaf/sms-test-plan/teardown.sh25
-rw-r--r--plans/aaf/sms-test-plan/testplan.txt3
-rw-r--r--plans/aai/esr-server/setup.sh63
-rw-r--r--plans/aai/esr-server/teardown.sh22
-rw-r--r--plans/aai/esr-server/testplan.txt4
-rw-r--r--plans/aai/resources/aai-resources/appconfig/aai_keystorebin0 -> 3811 bytes
-rw-r--r--plans/aai/resources/aai-resources/appconfig/aaiconfig.properties119
-rw-r--r--plans/aai/resources/aai-resources/appconfig/application.properties72
-rw-r--r--plans/aai/resources/aai-resources/appconfig/janusgraph-cached.properties43
-rw-r--r--plans/aai/resources/aai-resources/appconfig/janusgraph-realtime.properties40
-rw-r--r--plans/aai/resources/aai-resources/appconfig/localhost-access-logback.xml62
-rw-r--r--plans/aai/resources/aai-resources/appconfig/logback.xml391
-rw-r--r--plans/aai/resources/aai-resources/appconfig/realm.properties12
-rw-r--r--plans/aai/resources/aai-traversal/appconfig/aai_keystorebin0 -> 3811 bytes
-rw-r--r--plans/aai/resources/aai-traversal/appconfig/aaiconfig.properties114
-rw-r--r--plans/aai/resources/aai-traversal/appconfig/application.properties72
-rw-r--r--plans/aai/resources/aai-traversal/appconfig/janusgraph-cached.properties43
-rw-r--r--plans/aai/resources/aai-traversal/appconfig/janusgraph-realtime.properties40
-rw-r--r--plans/aai/resources/aai-traversal/appconfig/localhost-access-logback.xml62
-rw-r--r--plans/aai/resources/aai-traversal/appconfig/logback.xml391
-rw-r--r--plans/aai/resources/aai-traversal/appconfig/realm.properties12
-rw-r--r--plans/aai/resources/docker-compose.yml86
-rw-r--r--plans/aai/resources/setup.sh113
-rw-r--r--plans/aai/resources/teardown.sh27
-rw-r--r--plans/aai/resources/testplan.txt6
-rw-r--r--plans/aai/search-data-service/appconfig/analysis-config.json32
-rw-r--r--plans/aai/search-data-service/appconfig/auth/search_policy.json18
-rw-r--r--plans/aai/search-data-service/appconfig/auth/tomcat_keystorebin0 -> 2214 bytes
-rw-r--r--plans/aai/search-data-service/appconfig/elastic-search.properties6
-rw-r--r--plans/aai/search-data-service/appconfig/filter-config.json7
-rw-r--r--plans/aai/search-data-service/docker-compose.yml26
-rw-r--r--plans/aai/search-data-service/setup.sh37
-rw-r--r--plans/aai/search-data-service/teardown.sh32
-rw-r--r--plans/aai/search-data-service/testplan.txt3
-rw-r--r--plans/aai/traversal/aai-resources/appconfig/aai_keystorebin0 -> 3811 bytes
-rw-r--r--plans/aai/traversal/aai-resources/appconfig/aaiconfig.properties119
-rw-r--r--plans/aai/traversal/aai-resources/appconfig/application.properties72
-rw-r--r--plans/aai/traversal/aai-resources/appconfig/janusgraph-cached.properties43
-rw-r--r--plans/aai/traversal/aai-resources/appconfig/janusgraph-realtime.properties40
-rw-r--r--plans/aai/traversal/aai-resources/appconfig/localhost-access-logback.xml62
-rw-r--r--plans/aai/traversal/aai-resources/appconfig/logback.xml391
-rw-r--r--plans/aai/traversal/aai-resources/appconfig/realm.properties12
-rw-r--r--plans/aai/traversal/aai-traversal/appconfig/aai_keystorebin0 -> 3811 bytes
-rw-r--r--plans/aai/traversal/aai-traversal/appconfig/aaiconfig.properties114
-rw-r--r--plans/aai/traversal/aai-traversal/appconfig/application.properties72
-rw-r--r--plans/aai/traversal/aai-traversal/appconfig/janusgraph-cached.properties43
-rw-r--r--plans/aai/traversal/aai-traversal/appconfig/janusgraph-realtime.properties40
-rw-r--r--plans/aai/traversal/aai-traversal/appconfig/localhost-access-logback.xml62
-rw-r--r--plans/aai/traversal/aai-traversal/appconfig/logback.xml391
-rw-r--r--plans/aai/traversal/aai-traversal/appconfig/realm.properties12
-rw-r--r--plans/aai/traversal/docker-compose.yml86
-rw-r--r--plans/aai/traversal/setup.sh119
-rw-r--r--plans/aai/traversal/teardown.sh27
-rw-r--r--plans/aai/traversal/testplan.txt3
-rwxr-xr-xplans/appc/healthcheck/bundle_query.sh35
-rwxr-xr-xplans/appc/healthcheck/db_query.sh66
-rwxr-xr-xplans/appc/healthcheck/health_check.sh28
-rwxr-xr-xplans/appc/healthcheck/setup.sh85
-rwxr-xr-xplans/appc/healthcheck/teardown.sh25
-rw-r--r--plans/appc/healthcheck/testplan.txt5
-rw-r--r--plans/ccsdk/healthcheck/health_check.sh30
-rw-r--r--plans/ccsdk/healthcheck/setup.sh125
-rw-r--r--plans/ccsdk/healthcheck/teardown.sh24
-rw-r--r--plans/ccsdk/healthcheck/testplan.txt4
-rwxr-xr-xplans/clamp/APIs/setup.sh27
-rwxr-xr-xplans/clamp/APIs/teardown.sh22
-rw-r--r--plans/clamp/APIs/testplan.txt4
-rwxr-xr-xplans/clamp/UIs/setup.sh27
-rwxr-xr-xplans/clamp/UIs/teardown.sh22
-rw-r--r--plans/clamp/UIs/testplan.txt4
-rw-r--r--plans/cli/sanity-check/setup.sh55
-rw-r--r--plans/cli/sanity-check/teardown.sh17
-rw-r--r--plans/cli/sanity-check/testplan.txt18
-rw-r--r--plans/dcaegen2-collectors-hv-ves/testsuites/docker-compose.yml100
-rwxr-xr-xplans/dcaegen2-collectors-hv-ves/testsuites/setup.sh40
-rw-r--r--plans/dcaegen2-collectors-hv-ves/testsuites/ssl/.gitignore6
-rw-r--r--plans/dcaegen2-collectors-hv-ves/testsuites/ssl/Makefile-openssl41
-rw-r--r--plans/dcaegen2-collectors-hv-ves/testsuites/ssl/README.md54
-rwxr-xr-xplans/dcaegen2-collectors-hv-ves/testsuites/ssl/gen-certs.sh59
-rwxr-xr-xplans/dcaegen2-collectors-hv-ves/testsuites/teardown.sh16
-rw-r--r--plans/dcaegen2-collectors-hv-ves/testsuites/testplan.txt4
-rw-r--r--plans/dcaegen2/prh-testsuites/setup.sh36
-rw-r--r--plans/dcaegen2/prh-testsuites/teardown.sh20
-rw-r--r--plans/dcaegen2/prh-testsuites/testplan.txt3
-rwxr-xr-xplans/dcaegen2/testsuites/setup.sh39
-rwxr-xr-xplans/dcaegen2/testsuites/teardown.sh18
-rwxr-xr-xplans/dcaegen2/testsuites/testplan.txt3
-rwxr-xr-xplans/dmaap-buscontroller/mock_downstream/setup.sh45
-rw-r--r--plans/dmaap-buscontroller/mock_downstream/teardown.sh26
-rw-r--r--plans/dmaap-buscontroller/mock_downstream/testplan.txt4
-rwxr-xr-xplans/dmaap-buscontroller/ssl/setup.sh45
-rw-r--r--plans/dmaap-buscontroller/ssl/teardown.sh26
-rw-r--r--plans/dmaap-buscontroller/ssl/testplan.txt4
-rwxr-xr-xplans/dmaap-buscontroller/with_dr/setup.sh57
-rwxr-xr-xplans/dmaap-buscontroller/with_dr/teardown.sh26
-rwxr-xr-xplans/dmaap-buscontroller/with_dr/testplan.txt2
-rwxr-xr-xplans/dmaap-buscontroller/with_mr/setup.sh54
-rw-r--r--plans/dmaap-buscontroller/with_mr/teardown.sh30
-rw-r--r--plans/dmaap-buscontroller/with_mr/testplan.txt3
-rwxr-xr-xplans/dmaap-datarouter/dr-suite/setup.sh45
-rwxr-xr-xplans/dmaap-datarouter/dr-suite/teardown.sh4
-rwxr-xr-xplans/dmaap-datarouter/dr-suite/testplan.txt2
-rwxr-xr-xplans/dmaap/mrpubsub/setup.sh97
-rwxr-xr-xplans/dmaap/mrpubsub/teardown.sh22
-rw-r--r--plans/dmaap/mrpubsub/testplan.txt2
-rw-r--r--plans/externalapi-nbi/healthcheck/setup.sh17
-rw-r--r--plans/externalapi-nbi/healthcheck/teardown.sh17
-rw-r--r--plans/externalapi-nbi/healthcheck/testplan.txt3
-rw-r--r--plans/holmes-rule-management/sanity-check/setup.sh72
-rw-r--r--plans/holmes-rule-management/sanity-check/teardown.sh25
-rw-r--r--plans/holmes-rule-management/sanity-check/testplan.txt5
-rwxr-xr-xplans/integration/functionality1/setup.sh34
-rwxr-xr-xplans/integration/functionality1/teardown.sh20
-rw-r--r--plans/integration/functionality1/testplan.txt5
-rwxr-xr-xplans/integration/vCPE/setup.sh21
-rwxr-xr-xplans/integration/vCPE/teardown.sh18
-rw-r--r--plans/integration/vCPE/testplan.txt3
-rw-r--r--plans/modeling-toscaparsers-javatoscachecker/APIs/setup.sh22
-rw-r--r--plans/modeling-toscaparsers-javatoscachecker/APIs/teardown.sh21
-rw-r--r--plans/modeling-toscaparsers-javatoscachecker/APIs/testplan.txt3
-rw-r--r--plans/msb/iag-redirect-discovery/setup.sh55
-rw-r--r--plans/msb/iag-redirect-discovery/teardown.sh21
-rw-r--r--plans/msb/iag-redirect-discovery/testplan.txt4
-rw-r--r--plans/msb/rest-service/setup.sh55
-rw-r--r--plans/msb/rest-service/teardown.sh21
-rw-r--r--plans/msb/rest-service/testplan.txt4
-rw-r--r--plans/msb/sanity-check/setup.sh44
-rw-r--r--plans/msb/sanity-check/teardown.sh20
-rw-r--r--plans/msb/sanity-check/testplan.txt3
-rw-r--r--plans/msb/tcp-service/setup.sh53
-rw-r--r--plans/msb/tcp-service/teardown.sh21
-rw-r--r--plans/msb/tcp-service/testplan.txt4
-rw-r--r--plans/multicloud-ocata/functionality1/setup.sh34
-rw-r--r--plans/multicloud-ocata/functionality1/teardown.sh15
-rw-r--r--plans/multicloud-ocata/functionality1/testplan.txt3
-rw-r--r--plans/multicloud-ocata/hpa-discovery/setup.sh60
-rw-r--r--plans/multicloud-ocata/hpa-discovery/teardown.sh18
-rw-r--r--plans/multicloud-ocata/hpa-discovery/testplan.txt3
-rw-r--r--plans/multicloud-pike/functionality1/setup.sh34
-rw-r--r--plans/multicloud-pike/functionality1/teardown.sh15
-rw-r--r--plans/multicloud-pike/functionality1/testplan.txt3
-rw-r--r--plans/multicloud-pike/hpa-discovery/setup.sh60
-rw-r--r--plans/multicloud-pike/hpa-discovery/teardown.sh18
-rw-r--r--plans/multicloud-pike/hpa-discovery/testplan.txt3
-rwxr-xr-xplans/multicloud-vmware/functionality1/setup.sh33
-rwxr-xr-xplans/multicloud-vmware/functionality1/teardown.sh19
-rw-r--r--plans/multicloud-vmware/functionality1/testplan.txt13
-rw-r--r--plans/multicloud-windriver/functionality1/setup.sh34
-rw-r--r--plans/multicloud-windriver/functionality1/teardown.sh15
-rw-r--r--plans/multicloud-windriver/functionality1/testplan.txt3
-rwxr-xr-xplans/multicloud/functionality1/setup.sh35
-rwxr-xr-xplans/multicloud/functionality1/teardown.sh20
-rw-r--r--plans/multicloud/functionality1/testplan.txt3
-rw-r--r--plans/music/music-distributed-kv-store-test-plan/setup.sh60
-rw-r--r--plans/music/music-distributed-kv-store-test-plan/teardown.sh21
-rw-r--r--plans/music/music-distributed-kv-store-test-plan/testplan.txt3
-rwxr-xr-xplans/music/music-test-plan/setup.sh164
-rwxr-xr-xplans/music/music-test-plan/teardown.sh63
-rw-r--r--plans/music/music-test-plan/testplan.txt3
-rwxr-xr-xplans/optf-has/has/setup.sh58
-rwxr-xr-xplans/optf-has/has/teardown.sh34
-rw-r--r--plans/optf-has/has/testplan.txt3
-rw-r--r--plans/optf-has/osdf/sample.txt1
-rw-r--r--plans/policy/apex-pdp/setup.sh31
-rw-r--r--plans/policy/apex-pdp/teardown.sh20
-rw-r--r--plans/policy/apex-pdp/testplan.txt3
-rw-r--r--plans/policy/distribution/setup.sh31
-rw-r--r--plans/policy/distribution/teardown.sh20
-rw-r--r--plans/policy/distribution/testplan.txt3
-rwxr-xr-xplans/policy/health/setup.sh45
-rwxr-xr-xplans/policy/health/teardown.sh36
-rw-r--r--plans/policy/health/testplan.txt3
-rw-r--r--plans/portal-sdk/testsuite/.env42
-rw-r--r--plans/portal-sdk/testsuite/docker-compose.yml151
-rw-r--r--plans/portal-sdk/testsuite/setup.sh184
-rw-r--r--plans/portal-sdk/testsuite/teardown.sh20
-rw-r--r--plans/portal-sdk/testsuite/testplan.txt3
-rw-r--r--plans/portal/testsuite/.env42
-rw-r--r--plans/portal/testsuite/docker-compose.yml151
-rw-r--r--plans/portal/testsuite/setup.sh184
-rw-r--r--plans/portal/testsuite/teardown.sh20
-rw-r--r--plans/portal/testsuite/testplan.txt3
-rw-r--r--plans/sdc/nightly/setup.sh11
-rw-r--r--plans/sdc/nightly/teardown.sh3
-rw-r--r--plans/sdc/nightly/testplan.txt3
-rw-r--r--plans/sdc/sanity/setup.sh11
-rw-r--r--plans/sdc/sanity/teardown.sh3
-rw-r--r--plans/sdc/sanity/testplan.txt3
-rw-r--r--plans/sdc/uiSanity/setup.sh11
-rw-r--r--plans/sdc/uiSanity/teardown.sh3
-rw-r--r--plans/sdc/uiSanity/testplan.txt3
-rw-r--r--plans/sdnc/healthcheck/health_check.sh30
-rw-r--r--plans/sdnc/healthcheck/setup.sh139
-rw-r--r--plans/sdnc/healthcheck/teardown.sh27
-rw-r--r--plans/sdnc/healthcheck/testplan.txt4
-rw-r--r--plans/so/integration-testing/setup.sh38
-rw-r--r--plans/so/integration-testing/teardown.sh19
-rw-r--r--plans/so/integration-testing/testplan.txt3
-rw-r--r--plans/usecase-ui-server/testsuite/setup.sh58
-rw-r--r--plans/usecase-ui-server/testsuite/teardown.sh22
-rw-r--r--plans/usecase-ui-server/testsuite/testplan.txt3
-rw-r--r--plans/usecases/5G-bulkpm/assets/addSubscriber.json18
-rw-r--r--plans/usecases/5G-bulkpm/assets/createFeed.json18
-rw-r--r--plans/usecases/5G-bulkpm/assets/datafile_endpoints.json28
-rw-r--r--plans/usecases/5G-bulkpm/assets/xNF.pm.xml.gzbin0 -> 63 bytes
-rw-r--r--plans/usecases/5G-bulkpm/composefile/docker-compose-e2e.yml81
-rw-r--r--plans/usecases/5G-bulkpm/setup.sh141
-rw-r--r--plans/usecases/5G-bulkpm/teardown.sh12
-rw-r--r--plans/usecases/5G-bulkpm/testplan.txt3
-rwxr-xr-xplans/vfc-gvnfm-vnflcm/sanity-check/setup.sh75
-rwxr-xr-xplans/vfc-gvnfm-vnflcm/sanity-check/teardown.sh23
-rw-r--r--plans/vfc-gvnfm-vnflcm/sanity-check/testplan.txt3
-rwxr-xr-xplans/vfc-gvnfm-vnfmgr/sanity-check/setup.sh67
-rwxr-xr-xplans/vfc-gvnfm-vnfmgr/sanity-check/teardown.sh23
-rw-r--r--plans/vfc-gvnfm-vnfmgr/sanity-check/testplan.txt3
-rwxr-xr-xplans/vfc-gvnfm-vnfres/sanity-check/setup.sh67
-rwxr-xr-xplans/vfc-gvnfm-vnfres/sanity-check/teardown.sh23
-rw-r--r--plans/vfc-gvnfm-vnfres/sanity-check/testplan.txt3
-rw-r--r--plans/vfc-nfvo-catalog/sanity-check/setup.sh68
-rw-r--r--plans/vfc-nfvo-catalog/sanity-check/teardown.sh23
-rw-r--r--plans/vfc-nfvo-catalog/sanity-check/testplan.txt3
-rwxr-xr-xplans/vfc-nfvo-driver-ems/sanity-check/setup.sh62
-rwxr-xr-xplans/vfc-nfvo-driver-ems/sanity-check/teardown.sh22
-rw-r--r--plans/vfc-nfvo-driver-ems/sanity-check/testplan.txt3
-rwxr-xr-xplans/vfc-nfvo-driver-sfc/sanity-check/setup.sh62
-rwxr-xr-xplans/vfc-nfvo-driver-sfc/sanity-check/teardown.sh22
-rw-r--r--plans/vfc-nfvo-driver-sfc/sanity-check/testplan.txt3
-rw-r--r--plans/vfc-nfvo-driver-vnfm-gvnfm/sanity-check/setup.sh67
-rw-r--r--plans/vfc-nfvo-driver-vnfm-gvnfm/sanity-check/teardown.sh24
-rw-r--r--plans/vfc-nfvo-driver-vnfm-gvnfm/sanity-check/testplan.txt6
-rw-r--r--plans/vfc-nfvo-driver-vnfm-svnfm/sanity-check/setup.sh67
-rw-r--r--plans/vfc-nfvo-driver-vnfm-svnfm/sanity-check/teardown.sh24
-rw-r--r--plans/vfc-nfvo-driver-vnfm-svnfm/sanity-check/testplan.txt6
-rwxr-xr-xplans/vfc-nfvo-lcm/sanity-check/setup.sh85
-rwxr-xr-xplans/vfc-nfvo-lcm/sanity-check/teardown.sh23
-rw-r--r--plans/vfc-nfvo-lcm/sanity-check/testplan.txt3
-rw-r--r--plans/vfc-nfvo-multivimproxy/sanity-check/setup.sh44
-rw-r--r--plans/vfc-nfvo-multivimproxy/sanity-check/teardown.sh22
-rw-r--r--plans/vfc-nfvo-multivimproxy/sanity-check/testplan.txt3
-rw-r--r--plans/vfc-nfvo-resmanagement/sanity-check/setup.sh44
-rw-r--r--plans/vfc-nfvo-resmanagement/sanity-check/teardown.sh22
-rw-r--r--plans/vfc-nfvo-resmanagement/sanity-check/testplan.txt3
-rw-r--r--plans/vfc-nfvo-wfengine/sanity-check/setup.sh91
-rw-r--r--plans/vfc-nfvo-wfengine/sanity-check/teardown.sh29
-rw-r--r--plans/vfc-nfvo-wfengine/sanity-check/testplan.txt4
-rw-r--r--plans/vid/healthCheck/setup.sh34
-rw-r--r--plans/vid/healthCheck/teardown.sh22
-rw-r--r--plans/vid/healthCheck/testplan.txt4
-rw-r--r--plans/vnfsdk-ice/sanity-check/setup.sh34
-rw-r--r--plans/vnfsdk-ice/sanity-check/teardown.sh22
-rw-r--r--plans/vnfsdk-ice/sanity-check/testplan.txt3
-rw-r--r--plans/vnfsdk-marketplace/sanity-check/enterprise2DC.csarbin0 -> 4622 bytes
-rw-r--r--plans/vnfsdk-marketplace/sanity-check/setup.sh30
-rw-r--r--plans/vnfsdk-marketplace/sanity-check/teardown.sh21
-rw-r--r--plans/vnfsdk-marketplace/sanity-check/testplan.txt3
-rw-r--r--plans/vnfsdk-marketplace/sanity-check/uploadCSAR.sh138
-rwxr-xr-xplans/vnfsdk-pkgtools/sanity-check/setup.sh35
-rwxr-xr-xplans/vnfsdk-pkgtools/sanity-check/teardown.sh16
-rw-r--r--plans/vnfsdk-pkgtools/sanity-check/testplan.txt4
-rw-r--r--plans/vnfsdk-refrepo/sanity-check/enterprise2DC.csarbin0 -> 4622 bytes
-rw-r--r--plans/vnfsdk-refrepo/sanity-check/setup.sh40
-rw-r--r--plans/vnfsdk-refrepo/sanity-check/teardown.sh23
-rw-r--r--plans/vnfsdk-refrepo/sanity-check/testplan.txt3
-rw-r--r--plans/vnfsdk-refrepo/sanity-check/uploadCSAR.sh138
-rw-r--r--plans/vvp/sanity/setup.sh36
-rw-r--r--plans/vvp/sanity/teardown.sh20
-rw-r--r--plans/vvp/sanity/testplan.txt3
-rwxr-xr-xrun-all-tests.sh34
-rwxr-xr-xrun-csit.sh177
-rw-r--r--scripts/aai/esr-server/startup.sh21
-rwxr-xr-xscripts/appc/script1.sh20
-rw-r--r--scripts/ccsdk/script1.sh20
-rwxr-xr-xscripts/clamp/clone_clamp_and_change_dockercompose.sh45
-rwxr-xr-xscripts/clamp/kill_and_remove_clamp_and_db_containers.sh26
-rwxr-xr-xscripts/clamp/python-lib/CustomSeleniumLibrary.py20
-rwxr-xr-xscripts/clamp/start_clamp_containers.sh70
-rw-r--r--scripts/cli/startup.sh18
-rwxr-xr-xscripts/common_functions.sh263
-rw-r--r--scripts/dmaap-buscontroller/.mock-aaf.sh.swpbin0 -> 12288 bytes
-rwxr-xr-xscripts/dmaap-buscontroller/dmaapbc-init.sh76
-rwxr-xr-xscripts/dmaap-buscontroller/dmaapbc-launch.sh34
-rw-r--r--scripts/dmaap-buscontroller/dr-launch.sh59
-rwxr-xr-xscripts/dmaap-buscontroller/init-mock-aaf.sh53
-rwxr-xr-xscripts/dmaap-buscontroller/init-mock-drps.sh17
-rwxr-xr-xscripts/dmaap-buscontroller/init-mock-mrc.sh17
-rw-r--r--scripts/dmaap-buscontroller/onapCSIT.env18
-rwxr-xr-xscripts/dmaap-buscontroller/start-mock.sh48
-rwxr-xr-xscripts/dmaap-message-router/dmaap-mr-launch.sh114
-rwxr-xr-xscripts/dmaap-message-router/dmaap-mr-teardown.sh24
-rw-r--r--scripts/externalapi-nbi/delete_nbi_containers.sh33
-rw-r--r--scripts/externalapi-nbi/start_nbi_containers.sh70
-rwxr-xr-xscripts/get-instance-ip.sh17
-rw-r--r--scripts/holmes/engine-management/startup.sh23
-rw-r--r--scripts/holmes/rule-management/startup.sh22
-rwxr-xr-xscripts/integration/mock-hello.sh31
-rwxr-xr-xscripts/integration/script1.sh17
-rwxr-xr-xscripts/kill-instance.sh24
-rw-r--r--scripts/modeling-toscaparsers-javatoscachecker/setup_containers.sh49
-rw-r--r--scripts/modeling-toscaparsers-javatoscachecker/teardown_containers.sh27
-rw-r--r--scripts/multicloud-ocata/generic_sim/Dockerfile12
-rw-r--r--scripts/multicloud-ocata/generic_sim/aai/responses.yml189
-rw-r--r--scripts/multicloud-ocata/generic_sim/cinder/responses.yml5
-rw-r--r--scripts/multicloud-ocata/generic_sim/generic_sim.py109
-rw-r--r--scripts/multicloud-ocata/generic_sim/glance/responses.yml73
-rw-r--r--scripts/multicloud-ocata/generic_sim/keystone/responses.yml44
-rw-r--r--scripts/multicloud-ocata/generic_sim/log_parser.py61
-rw-r--r--scripts/multicloud-ocata/generic_sim/nova/responses.yml177
-rw-r--r--scripts/multicloud-ocata/generic_sim/requirements.txt2
-rw-r--r--scripts/multicloud-pike/generic_sim/Dockerfile12
-rw-r--r--scripts/multicloud-pike/generic_sim/aai/responses.yml189
-rw-r--r--scripts/multicloud-pike/generic_sim/cinder/responses.yml5
-rw-r--r--scripts/multicloud-pike/generic_sim/generic_sim.py109
-rw-r--r--scripts/multicloud-pike/generic_sim/glance/responses.yml73
-rw-r--r--scripts/multicloud-pike/generic_sim/keystone/responses.yml44
-rw-r--r--scripts/multicloud-pike/generic_sim/log_parser.py61
-rw-r--r--scripts/multicloud-pike/generic_sim/nova/responses.yml177
-rw-r--r--scripts/multicloud-pike/generic_sim/requirements.txt2
-rw-r--r--scripts/music/cql/admin.cql34
-rw-r--r--scripts/music/cql/admin_pw.cql2
-rw-r--r--scripts/music/cql/extra/test.cql1
-rw-r--r--scripts/music/music-properties/log4j.properties3
-rw-r--r--scripts/music/music-properties/music.properties17
-rwxr-xr-xscripts/music/music-scripts/music_script.sh25
-rwxr-xr-xscripts/music/music-scripts/wait_for_port.sh18
-rw-r--r--scripts/nfvo-wfengine/demo.bpmn20.xml11
-rw-r--r--scripts/optf-has/has/has-properties/cert.cer36
-rw-r--r--scripts/optf-has/has/has-properties/cert.key28
-rw-r--r--scripts/optf-has/has/has-properties/cert.pem36
-rw-r--r--scripts/optf-has/has/has-properties/conductor.conf.onap378
-rw-r--r--scripts/optf-has/has/has-properties/log.conf.onap65
-rwxr-xr-xscripts/optf-has/has/has_proxy_settings.sh31
-rwxr-xr-xscripts/optf-has/has/has_script.sh97
-rwxr-xr-xscripts/optf-has/has/has_teardown_script.sh34
-rw-r--r--scripts/optf-has/has/music-properties/log4j.properties3
-rw-r--r--scripts/optf-has/has/music-properties/music.properties17
-rwxr-xr-xscripts/optf-has/has/music_script.sh100
-rwxr-xr-xscripts/optf-has/has/music_teardown_script.sh39
-rwxr-xr-xscripts/optf-has/has/simulator_script.sh85
-rwxr-xr-xscripts/optf-has/has/simulator_teardown_script.sh22
-rwxr-xr-xscripts/optf-has/has/wait_for_port.sh18
-rw-r--r--scripts/optf-has/osdf/testsample.txt1
-rwxr-xr-xscripts/policy/mock-hello.sh31
-rwxr-xr-xscripts/policy/script1.sh174
-rwxr-xr-xscripts/policy/wait_for_port.sh18
-rwxr-xr-xscripts/run-instance.sh23
-rw-r--r--scripts/sdc/docker_health.sh23
-rw-r--r--scripts/sdc/kill_containers_and_remove_dataFolders.sh39
-rw-r--r--scripts/sdc/setup_sdc_for_apis_sanity.sh85
-rw-r--r--scripts/sdc/setup_sdc_for_ui_sanity.sh85
-rw-r--r--scripts/sdc/start_sdc_containers.sh116
-rw-r--r--scripts/sdc/start_sdc_sanity.sh71
-rw-r--r--scripts/sdnc/script1.sh20
-rw-r--r--scripts/so/chef-config/aai.crt27
-rw-r--r--scripts/so/chef-config/mso-docker.json230
-rw-r--r--scripts/so/mariadb/conf.d/mariadb1.cnf193
-rw-r--r--scripts/so/mariadb/docker-entrypoint-initdb.d/01-load-default-sql-files.sh25
-rw-r--r--scripts/so/mariadb/docker-entrypoint-initdb.d/02-load-additional-changes.sh27
-rw-r--r--scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/automated-tests/create_mso_db-tests.sql49
-rw-r--r--scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/default/create_mso_db-default.sql128
-rw-r--r--scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-dns/create_mso_db-demo-dns.sql77
-rw-r--r--scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-infra.sql70
-rw-r--r--scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vbng.sql69
-rw-r--r--scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vbrgemu.sql58
-rw-r--r--scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vgmux.sql71
-rw-r--r--scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vgw.sql67
-rw-r--r--scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vfw/create_mso_db-demo-vfw.sql59
-rw-r--r--scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/camunda/mariadb_engine_7.7.3-ee.sql1195
-rw-r--r--scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/camunda/mysql_create_camunda_admin.sql25
-rw-r--r--scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/main-schemas/MySQL-Catalog-schema.sql462
-rw-r--r--scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/main-schemas/MySQL-Requests-schema.sql84
-rw-r--r--scripts/vid/clone_and_setup_vid_data.sh37
-rw-r--r--scripts/vid/kill_containers_and_remove_dataFolders.sh31
-rw-r--r--scripts/vid/start_vid_containers.sh51
-rw-r--r--scripts/vvp/clone_and_setup_vvp_data.sh110
-rw-r--r--scripts/vvp/docker_health.sh33
-rw-r--r--scripts/vvp/kill_containers_and_remove_dataFolders.sh31
-rw-r--r--scripts/vvp/start_vvp_containers.sh93
-rw-r--r--scripts/vvp/start_vvp_sanity.sh26
-rw-r--r--tests/aaf/aaf-sms-suite/__init__.robot2
-rw-r--r--tests/aaf/aaf-sms-suite/aaf-sms-test.robot94
-rw-r--r--tests/aaf/aaf-sms-suite/data/create_domain.json3
-rw-r--r--tests/aaf/aaf-sms-suite/data/create_secret.json12
-rw-r--r--tests/aaf/aafapi/aafapi.robot63
-rw-r--r--tests/aai/esr-server/startup/__init__.robot2
-rw-r--r--tests/aai/esr-server/startup/test1.robot15
-rw-r--r--tests/aai/resources/api_suite/__init__.robot2
-rw-r--r--tests/aai/resources/api_suite/aai.crt70
-rw-r--r--tests/aai/resources/api_suite/aai.key32
-rw-r--r--tests/aai/resources/api_suite/complex.robot72
-rw-r--r--tests/aai/resources/api_suite/ems.robot65
-rw-r--r--tests/aai/resources/api_suite/get_all.robot105
-rw-r--r--tests/aai/resources/api_suite/get_with_depth.robot105
-rw-r--r--tests/aai/resources/api_suite/patch.robot86
-rw-r--r--tests/aai/resources/api_suite/pserver.robot65
-rw-r--r--tests/aai/resources/api_suite/thirdparty_sdnc.robot65
-rw-r--r--tests/aai/resources/api_suite/vim.robot65
-rw-r--r--tests/aai/resources/api_suite/vnfm.robot65
-rw-r--r--tests/aai/resources/db_edge_rule/__init__.robot2
-rw-r--r--tests/aai/resources/db_edge_rule/aai.crt70
-rw-r--r--tests/aai/resources/db_edge_rule/aai.key32
-rw-r--r--tests/aai/resources/db_edge_rule/delete_other_v.robot95
-rw-r--r--tests/aai/resources/db_edge_rule/edge_multiplicity_one_2_one.robot224
-rw-r--r--tests/aai/resources/db_edge_rule/prevent_delete.robot131
-rw-r--r--tests/aai/resources/error_handling_suite/__init__.robot2
-rw-r--r--tests/aai/resources/error_handling_suite/aai.crt70
-rw-r--r--tests/aai/resources/error_handling_suite/aai.key32
-rw-r--r--tests/aai/resources/error_handling_suite/error_403.robot47
-rw-r--r--tests/aai/resources/error_handling_suite/error_412_404.robot78
-rw-r--r--tests/aai/resources/relationship_suite/__init__.robot2
-rw-r--r--tests/aai/resources/relationship_suite/aai.crt70
-rw-r--r--tests/aai/resources/relationship_suite/aai.key32
-rw-r--r--tests/aai/resources/relationship_suite/complex_l3_network.robot110
-rw-r--r--tests/aai/resources/relationship_suite/pserver_complex_rel_api.robot119
-rw-r--r--tests/aai/resources/relationship_suite/relationship_using_related_link.robot110
-rw-r--r--tests/aai/search-data-service/suite1/__init__.robot2
-rw-r--r--tests/aai/search-data-service/suite1/private.key27
-rw-r--r--tests/aai/search-data-service/suite1/publickey.crt25
-rw-r--r--tests/aai/search-data-service/suite1/test1.robot59
-rw-r--r--tests/aai/traversal/suite1/__init__.robot2
-rw-r--r--tests/aai/traversal/suite1/aai.crt70
-rw-r--r--tests/aai/traversal/suite1/aai.key32
-rw-r--r--tests/aai/traversal/suite1/custom_query_1.robot131
-rw-r--r--tests/aai/traversal/suite1/custom_query_all_formats.robot190
-rw-r--r--tests/appc/cdt/__init__.robot15
-rw-r--r--tests/appc/cdt/cdt.robot194
-rw-r--r--tests/appc/cdt/common.robot60
-rwxr-xr-xtests/appc/cdt/data/pd_Configure_vUSP - Revenue Assurance_0.0.1V.yaml13
-rwxr-xr-xtests/appc/cdt/data/reference_AllAction_HealthCheckAnsible_0.0.1V.json48
-rwxr-xr-xtests/appc/cdt/data/reference_AllAction_vUSP - Revenue Assurance_0.0.1V.json125
-rwxr-xr-xtests/appc/cdt/data/template_Configure_vUSP - Revenue Assurance_0.0.1V.json5
-rwxr-xr-xtests/appc/cdt/data/vUSP_User Input Spreadsheet v.07.xlsxbin0 -> 609997 bytes
-rw-r--r--tests/appc/healthcheck/APPC_GLOBAL_VARIABLES.robot10
-rw-r--r--tests/appc/healthcheck/APPC_Netstat.robot8
-rw-r--r--tests/appc/healthcheck/LCM_HEALTHCHECK_TIMESTAMP.robot52
-rw-r--r--tests/appc/healthcheck/LCM_VM_HEALTHCHECK_REQUEST.txt25
-rw-r--r--tests/appc/healthcheck/LCM_VM_RESTART_REQUEST.txt24
-rw-r--r--tests/appc/healthcheck/LCM_VM_RESTART_TIMESTAMP.robot47
-rw-r--r--tests/appc/healthcheck/LCM_VNF_RESTART_REQUEST.txt24
-rw-r--r--tests/appc/healthcheck/LCM_VNF_RESTART_TIMESTAMP.robot50
-rw-r--r--tests/appc/healthcheck/__init__.robot2
-rw-r--r--tests/appc/healthcheck/gettime.robot40
-rw-r--r--tests/appc/healthcheck/test1.robot27
-rw-r--r--tests/ccsdk/healthcheck/__init__.robot2
-rw-r--r--tests/ccsdk/healthcheck/test1.robot16
-rw-r--r--tests/clamp/APIs/01__Create_CL_Holmes.robot47
-rw-r--r--tests/clamp/APIs/02__Create_CL_TCA.robot40
-rw-r--r--tests/clamp/APIs/03__VariousApis.robot37
-rw-r--r--tests/clamp/APIs/04__Verify_API_Models.robot67
-rw-r--r--tests/clamp/APIs/__init__.robot2
-rw-r--r--tests/clamp/APIs/data/createClHolmes1.json10
-rw-r--r--tests/clamp/APIs/data/createClHolmes2.json10
-rw-r--r--tests/clamp/APIs/data/createClTCA1.json10
-rw-r--r--tests/clamp/APIs/data/createClTCA2.json10
-rw-r--r--tests/clamp/UIs/01__Create_Holmes_model.robot95
-rw-r--r--tests/clamp/UIs/02__Create_TCA_model.robot95
-rw-r--r--tests/clamp/UIs/03__Verify_UI_Models.robot52
-rw-r--r--tests/clamp/UIs/04__Submit_deploy_chain_Holmes.robot131
-rw-r--r--tests/clamp/UIs/05__Submit_deploy_chain_TCA.robot131
-rw-r--r--tests/clamp/UIs/__init__.robot2
-rw-r--r--tests/clamp/UIs/data/TCA_template_properties.yml82
-rw-r--r--tests/cli/startup/__init__.robot2
-rw-r--r--tests/cli/startup/startup_check.robot104
-rw-r--r--tests/common.robot30
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/__init__.robot56
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/authorization.robot62
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/libraries/ConsulLibrary.py16
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/libraries/DcaeAppSimulatorLibrary.py46
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/libraries/HttpRequests.py19
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/libraries/VesHvContainersUtilsLibrary.py69
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/libraries/XnfSimulatorLibrary.py166
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/message-routing.robot93
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/multiple-clients.robot35
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/resources/common-keywords.robot48
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/authorization/xnf-valid-messages-request.json24
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/fixed-payload/dcae-fixed-payload-request.json24
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/fixed-payload/xnf-fixed-payload-request.json24
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-gpb-data/dcae-invalid-gpb-data-request.json24
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-gpb-data/xnf-invalid-gpb-data-request.json68
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-wire-frame/dcae-invalid-wire-frame-request.json24
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-wire-frame/xnf-invalid-wire-frame-request.json68
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/multiple-simulators-payload/dcae-smaller-valid-request.json24
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/multiple-simulators-payload/xnf-simulator-smaller-valid-request.json24
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/too-big-payload/xnf-too-big-payload-request.json68
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/unsupported-domain/dcae-unsupported-domain-request.json24
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/unsupported-domain/xnf-unsupported-domain-request.json68
-rw-r--r--tests/dcaegen2-collectors-hv-ves/testcases/resources/ves-hv-configuration.json9
-rw-r--r--tests/dcaegen2/prh-testcases/__init__.robot2
-rw-r--r--tests/dcaegen2/prh-testcases/assets/json_events/event_with_IPV4.json11
-rw-r--r--tests/dcaegen2/prh-testcases/assets/json_events/event_with_IPV6.json11
-rw-r--r--tests/dcaegen2/prh-testcases/assets/json_events/event_with_all_fields.json11
-rw-r--r--tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_IPV4_and_IPV6.json11
-rw-r--r--tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName.json11
-rw-r--r--tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName_IPV4_and_IPV6.json11
-rw-r--r--tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName_and_IPV4.json11
-rw-r--r--tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName_and_IPV6.json11
-rw-r--r--tests/dcaegen2/prh-testcases/assets/json_events/not_json_format.json11
-rw-r--r--tests/dcaegen2/prh-testcases/prh_tests.robot65
-rw-r--r--tests/dcaegen2/prh-testcases/resources/PrhLibrary.py46
-rw-r--r--tests/dcaegen2/prh-testcases/resources/docker-compose.yml41
-rw-r--r--tests/dcaegen2/prh-testcases/resources/prh_library.robot56
-rw-r--r--tests/dcaegen2/prh-testcases/resources/simulator/AAI.py56
-rw-r--r--tests/dcaegen2/prh-testcases/resources/simulator/AAI_simulator15
-rw-r--r--tests/dcaegen2/prh-testcases/resources/simulator/DMaaP.py65
-rw-r--r--tests/dcaegen2/prh-testcases/resources/simulator/DMaaP_simulator15
-rw-r--r--tests/dcaegen2/testcases/__init__.robot0
-rw-r--r--tests/dcaegen2/testcases/assets/json_events/CommonEventFormat_28.3.json1866
-rw-r--r--tests/dcaegen2/testcases/assets/json_events/dcae_healthcheck.json5
-rw-r--r--tests/dcaegen2/testcases/assets/json_events/ves_pnf_registration_event.json34
-rw-r--r--tests/dcaegen2/testcases/assets/json_events/ves_vfirewall_measurement.json36
-rw-r--r--tests/dcaegen2/testcases/assets/json_events/ves_volte_fault_eventlist_batch.json62
-rw-r--r--tests/dcaegen2/testcases/assets/json_events/ves_volte_single_fault_event.json34
-rw-r--r--tests/dcaegen2/testcases/assets/json_events/ves_volte_single_fault_event_bad.json34
-rw-r--r--tests/dcaegen2/testcases/dcae_ves.robot171
-rw-r--r--tests/dcaegen2/testcases/resources/CommonEventFormat_28.3.json1866
-rw-r--r--tests/dcaegen2/testcases/resources/DMaaP.py431
-rw-r--r--tests/dcaegen2/testcases/resources/DcaeLibrary.py173
-rw-r--r--tests/dcaegen2/testcases/resources/DcaeVariables.py17
-rw-r--r--tests/dcaegen2/testcases/resources/VES-4.27.2-dataformat.json1161
-rw-r--r--tests/dcaegen2/testcases/resources/VES-5.28.4-dataformat.json1995
-rwxr-xr-xtests/dcaegen2/testcases/resources/collector.properties74
-rw-r--r--tests/dcaegen2/testcases/resources/dcae_keywords.robot145
-rw-r--r--tests/dcaegen2/testcases/resources/dcae_properties.robot14
-rw-r--r--tests/dcaegen2/testcases/resources/index.htm1
-rwxr-xr-xtests/dcaegen2/testcases/resources/vesc_enable_https_auth.sh23
-rw-r--r--tests/dmaap-buscontroller/single-mr-suite/__init__.robot3
-rw-r--r--tests/dmaap-buscontroller/single-mr-suite/test1.robot104
-rw-r--r--tests/dmaap-buscontroller/ssl_suite/__init__.robot3
-rw-r--r--tests/dmaap-buscontroller/ssl_suite/test1.robot77
-rw-r--r--tests/dmaap-buscontroller/suite1/__init__.robot3
-rw-r--r--tests/dmaap-buscontroller/suite1/test1.robot42
-rwxr-xr-xtests/dmaap-buscontroller/with_dr/orig116
-rw-r--r--tests/dmaap-buscontroller/with_dr/test1.robot143
-rwxr-xr-xtests/dmaap-datarouter/dr-suite/dr-suite.robot116
-rwxr-xr-xtests/dmaap/mrpubsub/mrpubsub.robot73
-rw-r--r--tests/externalapi-nbi/healthcheck/__init__.robot2
-rw-r--r--tests/externalapi-nbi/healthcheck/healthcheck.robot33
-rw-r--r--tests/holmes/testcase/CommonKeywords/HttpRequest.robot37
-rw-r--r--tests/holmes/testcase/EngineMgt/Engine-Keywords.robot34
-rw-r--r--tests/holmes/testcase/EngineMgt/Engine-Mgt.robot41
-rw-r--r--tests/holmes/testcase/EngineMgt/EngineAddr.robot3
-rw-r--r--tests/holmes/testcase/EngineMgt/__init__.txt2
-rw-r--r--tests/holmes/testcase/RuleMgt/Rule-Keywords.robot80
-rw-r--r--tests/holmes/testcase/RuleMgt/Rule-Mgt.robot127
-rw-r--r--tests/holmes/testcase/RuleMgt/RuleAddr.robot3
-rw-r--r--tests/holmes/testcase/RuleMgt/__init__.txt0
-rw-r--r--tests/integration/suite1/__init__.robot2
-rw-r--r--tests/integration/suite1/test1.robot30
-rw-r--r--tests/integration/suite2/__init__.robot2
-rw-r--r--tests/integration/suite2/test1.robot35
-rw-r--r--tests/integration/vCPE/__init__.robot2
-rw-r--r--tests/integration/vCPE/test1.robot60
-rw-r--r--tests/modeling-toscaparsers-javatoscachecker/APIs/__init__.robot2
-rw-r--r--tests/modeling-toscaparsers-javatoscachecker/APIs/basics.robot62
-rw-r--r--tests/modeling-toscaparsers-javatoscachecker/APIs/data/standalone.yaml21
-rw-r--r--tests/modeling-toscaparsers-javatoscachecker/APIs/data/standalone_with_errors.yaml23
-rw-r--r--tests/modeling-toscaparsers-javatoscachecker/APIs/data/test_schema.yaml17
-rw-r--r--tests/modeling-toscaparsers-javatoscachecker/APIs/data/test_template.yaml11
-rw-r--r--tests/msb/rest-service-api-gateway/__init__.robot2
-rw-r--r--tests/msb/rest-service-api-gateway/test1.robot9
-rw-r--r--tests/msb/rest-service-discovery/__init__.robot2
-rw-r--r--tests/msb/rest-service-discovery/test1.robot14
-rw-r--r--tests/msb/startup/__init__.robot2
-rw-r--r--tests/msb/startup/test1.robot16
-rw-r--r--tests/msb/tcp-service-access/__init__.robot2
-rw-r--r--tests/msb/tcp-service-access/test1.robot16
-rw-r--r--tests/msb/tcp-service-access/test2.robot15
-rw-r--r--tests/msb/tcp-service-discovery/__init__.robot2
-rw-r--r--tests/msb/tcp-service-discovery/test1.robot14
-rw-r--r--tests/multicloud-ocata/provision/hpa_multicloud.robot17
-rw-r--r--tests/multicloud-ocata/provision/sanity_test_multicloud.robot22
-rw-r--r--tests/multicloud-pike/provision/hpa_multicloud.robot17
-rw-r--r--tests/multicloud-pike/provision/sanity_test_multicloud.robot22
-rw-r--r--tests/multicloud-vmware/hosts/sanity-host.robot24
-rw-r--r--tests/multicloud-vmware/images/sanity-image.robot24
-rw-r--r--tests/multicloud-vmware/networks/sanity-network.robot24
-rw-r--r--tests/multicloud-vmware/nova/jsoninput/multicloud_create_server.json16
-rw-r--r--tests/multicloud-vmware/nova/sanity-flavor.robot62
-rw-r--r--tests/multicloud-vmware/nova/sanity-host.robot83
-rwxr-xr-xtests/multicloud-vmware/nova/sanity-server.robot105
-rw-r--r--tests/multicloud-vmware/provision/jsoninput/auth_info.json10
-rw-r--r--tests/multicloud-vmware/provision/jsoninput/image_file.json7
-rw-r--r--tests/multicloud-vmware/provision/sanity_test_image.robot110
-rw-r--r--tests/multicloud-vmware/provision/sanity_test_neutron.robot62
-rw-r--r--tests/multicloud-vmware/provision/sanity_test_tenant.robot59
-rw-r--r--tests/multicloud-vmware/provision/sanity_test_vio.robot22
-rw-r--r--tests/multicloud-vmware/samples/sanity-sample.robot25
-rw-r--r--tests/multicloud-windriver/provision/sanity_test_multicloud.robot22
-rw-r--r--tests/multicloud/provision/data/capacity.json6
-rw-r--r--tests/multicloud/provision/sanity_test_multivim.robot33
-rw-r--r--tests/music/music-distributed-kv-store-suite/__init__.robot2
-rw-r--r--tests/music/music-distributed-kv-store-suite/data/register_domain.json3
-rw-r--r--tests/music/music-distributed-kv-store-suite/music-distributed-kv-store-test.robot53
-rw-r--r--tests/music/music-suite/__init__.robot4
-rw-r--r--tests/music/music-suite/data/createkeyspace-network.json6
-rw-r--r--tests/music/music-suite/data/createkeyspace-simple.json6
-rw-r--r--tests/music/music-suite/data/createkeyspace.json6
-rw-r--r--tests/music/music-suite/data/createtable.json12
-rw-r--r--tests/music/music-suite/data/deleterow_eventual.json5
-rw-r--r--tests/music/music-suite/data/dropkeyspace.json1
-rw-r--r--tests/music/music-suite/data/droptable.json12
-rw-r--r--tests/music/music-suite/data/getrow_atomic.json3
-rw-r--r--tests/music/music-suite/data/insertrow_eventual.json8
-rw-r--r--tests/music/music-suite/data/onboard.json6
-rw-r--r--tests/music/music-suite/data/updaterow_atomic.json7
-rw-r--r--tests/music/music-suite/data/updaterow_eventual.json7
-rw-r--r--tests/music/music-suite/music-test.robot208
-rw-r--r--tests/optf-has/has/__init__.robot4
-rw-r--r--tests/optf-has/has/data/healthcheck.json19
-rw-r--r--tests/optf-has/has/data/onboard.json6
-rw-r--r--tests/optf-has/has/data/plan_with_hpa.json260
-rw-r--r--tests/optf-has/has/data/plan_with_hpa_requirements_mandatory.json193
-rw-r--r--tests/optf-has/has/data/plan_with_hpa_requirements_optionals.json247
-rw-r--r--tests/optf-has/has/data/plan_with_hpa_score_multi_objective.json267
-rw-r--r--tests/optf-has/has/data/plan_with_hpa_simple.json156
-rw-r--r--tests/optf-has/has/data/plan_with_hpa_unmatched.json143
-rw-r--r--tests/optf-has/has/data/plan_with_lati_and_longi.json41
-rw-r--r--tests/optf-has/has/data/plan_with_short_distance_constraint.json64
-rw-r--r--tests/optf-has/has/data/plan_with_vim_fit.json89
-rw-r--r--tests/optf-has/has/data/plan_with_wrong_distance_constraint.json63
-rw-r--r--tests/optf-has/has/data/plan_with_wrong_version.json41
-rw-r--r--tests/optf-has/has/data/plan_without_demand_section.json33
-rw-r--r--tests/optf-has/has/optf_has_test.robot523
-rw-r--r--tests/optf-has/osdf/data/sampletest.txt1
-rw-r--r--tests/policy/apex-pdp/apex-pdp-test.robot14
-rw-r--r--tests/policy/apex-pdp/data/event.json11
-rw-r--r--tests/policy/distribution/distribution-test.robot17
-rw-r--r--tests/policy/suite1/Policy-CSIT.robot360
-rw-r--r--tests/policy/suite1/__init__.robot2
-rw-r--r--tests/policy/suite1/configpolicy_vCPE.template6
-rw-r--r--tests/policy/suite1/configpolicy_vCPE_R1.template7
-rw-r--r--tests/policy/suite1/configpolicy_vDNS.template6
-rw-r--r--tests/policy/suite1/configpolicy_vDNS_R1.template7
-rw-r--r--tests/policy/suite1/configpolicy_vFW.template6
-rw-r--r--tests/policy/suite1/configpolicy_vFW_R1.template7
-rw-r--r--tests/policy/suite1/createpolicy.template21
-rw-r--r--tests/policy/suite1/deletepolicy.template5
-rw-r--r--tests/policy/suite1/getconfigpolicy.template8
-rw-r--r--tests/policy/suite1/getoofpolicy.template6
-rw-r--r--tests/policy/suite1/global_properties.robot30
-rw-r--r--tests/policy/suite1/json_templater.robot21
-rw-r--r--tests/policy/suite1/oofpolicy_HPA_R1.template6
-rw-r--r--tests/policy/suite1/opspolicy_VDNS.template26
-rw-r--r--tests/policy/suite1/opspolicy_VDNS_R1.template16
-rw-r--r--tests/policy/suite1/opspolicy_VFW.template24
-rw-r--r--tests/policy/suite1/opspolicy_VFW_R1.template16
-rw-r--r--tests/policy/suite1/opspolicy_vCPE.template16
-rw-r--r--tests/policy/suite1/opspolicy_vCPE_R1.template16
-rw-r--r--tests/policy/suite1/opspolicy_vOLTE.template16
-rw-r--r--tests/policy/suite1/opspolicy_vOLTE_R1.template16
-rw-r--r--tests/policy/suite1/policy_interface.robot60
-rw-r--r--tests/policy/suite1/pushpolicy.template5
-rw-r--r--tests/policy/suite1/sdncnamingpolicy_vFW.template11
-rw-r--r--tests/policy/suite1/sdncnamingpolicy_vPG.template11
-rw-r--r--tests/portal-sdk/testsuites/__init__.robot2
-rw-r--r--tests/portal-sdk/testsuites/test1.robot140
-rw-r--r--tests/portal/testsuites/__init__.robot2
-rw-r--r--tests/portal/testsuites/browser_setup.robot43
-rw-r--r--tests/portal/testsuites/integration_robot_properties.py83
-rw-r--r--tests/portal/testsuites/json_templater.robot21
-rw-r--r--tests/portal/testsuites/news_widget.zipbin0 -> 5125 bytes
-rw-r--r--tests/portal/testsuites/portal.template34
-rw-r--r--tests/portal/testsuites/portal_VID.robot741
-rw-r--r--tests/portal/testsuites/test1.robot1185
-rw-r--r--tests/portal/testsuites/widget_news.zipbin0 -> 4593 bytes
-rw-r--r--tests/sdc/nightly/__init__.robot2
-rw-r--r--tests/sdc/nightly/test1.robot16
-rw-r--r--tests/sdc/sanity/__init__.robot2
-rw-r--r--tests/sdc/sanity/test1.robot16
-rw-r--r--tests/sdc/uiSanity/__init__.robot2
-rw-r--r--tests/sdc/uiSanity/test1.robot16
-rw-r--r--tests/sdnc/healthcheck/__init__.robot2
-rw-r--r--tests/sdnc/healthcheck/data/data.json4
-rw-r--r--tests/sdnc/healthcheck/data/preload.json41
-rw-r--r--tests/sdnc/healthcheck/test1.robot44
-rw-r--r--tests/so/sanity-check/data/activateService.json23
-rw-r--r--tests/so/sanity-check/data/createE2eservice.json100
-rw-r--r--tests/so/sanity-check/data/createE2eserviceInvalid.json30
-rw-r--r--tests/so/sanity-check/data/createNetwork.json35
-rw-r--r--tests/so/sanity-check/data/createService.json29
-rw-r--r--tests/so/sanity-check/data/createService_null_input.json0
-rw-r--r--tests/so/sanity-check/data/createVF.json59
-rw-r--r--tests/so/sanity-check/data/createVG.json47
-rw-r--r--tests/so/sanity-check/data/createVnf.json35
-rw-r--r--tests/so/sanity-check/data/deactivateService.json23
-rw-r--r--tests/so/sanity-check/data/deleteE2eservice.json4
-rw-r--r--tests/so/sanity-check/data/deleteE2eserviceInvalid.json30
-rw-r--r--tests/so/sanity-check/data/deleteNetwork.json15
-rw-r--r--tests/so/sanity-check/data/deleteService.json13
-rw-r--r--tests/so/sanity-check/data/deleteVF.json17
-rw-r--r--tests/so/sanity-check/data/deleteVG.json15
-rw-r--r--tests/so/sanity-check/data/deleteVnf.json20
-rw-r--r--tests/so/sanity-check/data/replaceVF.json60
-rw-r--r--tests/so/sanity-check/data/replaceVnf.json36
-rw-r--r--tests/so/sanity-check/data/updateNetwork.json34
-rw-r--r--tests/so/sanity-check/data/updateVF.json61
-rw-r--r--tests/so/sanity-check/data/updateVnf.json39
-rw-r--r--tests/so/sanity-check/sanity_test_so.robot210
-rw-r--r--tests/usecase-ui/server/test.robot14
-rw-r--r--tests/usecases/5G-bulkpm/BulkpmE2E.robot69
-rw-r--r--tests/usecases/5G-bulkpm/__init__.robot2
-rw-r--r--tests/usecases/5G-bulkpm/assets/json_events/FileExistNotification.json33
-rw-r--r--tests/usecases/5G-bulkpm/resources/bulkpm_keywords.robot38
-rw-r--r--tests/usecases/5G-bulkpm/resources/xNFLibrary.py25
-rw-r--r--tests/vfc/gvnfm-vnflcm/jsoninput/create_vnf.json5
-rw-r--r--tests/vfc/gvnfm-vnflcm/test.robot31
-rw-r--r--tests/vfc/gvnfm-vnfmgr/test.robot14
-rw-r--r--tests/vfc/gvnfm-vnfres/test.robot21
-rw-r--r--tests/vfc/nfvo-catalog/test.robot19
-rwxr-xr-xtests/vfc/nfvo-driver-ems/test.robot31
-rw-r--r--tests/vfc/nfvo-driver-gvnfm/gvnfmdriver.robot21
-rw-r--r--tests/vfc/nfvo-driver-gvnfm/jujudriver.robot16
-rw-r--r--tests/vfc/nfvo-driver-sfc/test.robot21
-rw-r--r--tests/vfc/nfvo-driver-svnfm/huawei.robot39
-rw-r--r--tests/vfc/nfvo-driver-svnfm/jsoninput/hwvnfm_createtoken.json13
-rw-r--r--tests/vfc/nfvo-driver-svnfm/ztevmanager.robot21
-rw-r--r--tests/vfc/nfvo-lcm/jsoninput/create_ns.json6
-rw-r--r--tests/vfc/nfvo-lcm/test.robot64
-rw-r--r--tests/vfc/nfvo-multivimproxy/test.robot24
-rw-r--r--tests/vfc/nfvo-resmanagement/test.robot24
-rw-r--r--tests/vfc/nfvo-wfengine/workflow.robot113
-rw-r--r--tests/vid/healthCheck/__init__.robot2
-rw-r--r--tests/vid/healthCheck/test1.robot15
-rw-r--r--tests/vid/login/__init__.robot2
-rw-r--r--tests/vid/login/test1.robot78
-rw-r--r--tests/vid/resources/docker-compose.yml34
-rw-r--r--tests/vid/resources/simulators/SDC.py37
-rw-r--r--tests/vid/resources/simulators/SDC_simulator15
-rw-r--r--tests/vid/resources/simulators/cert.pem74
-rw-r--r--tests/vid/resources/simulators/key.pem28
-rw-r--r--tests/vid/resources/simulators/sdc_get_response.json301
-rw-r--r--tests/vnfsdk-ice/ice-server/heat_template_empty.zipbin0 -> 166 bytes
-rw-r--r--tests/vnfsdk-ice/ice-server/heat_template_ok.zipbin0 -> 1120 bytes
-rw-r--r--tests/vnfsdk-ice/ice-server/validation_test.robot69
-rw-r--r--tests/vnfsdk-marketplace/provision/enterprise2DC.csarbin0 -> 4622 bytes
-rw-r--r--tests/vnfsdk-marketplace/provision/sanity_test_vnfsdktestfunction.robot55
-rw-r--r--tests/vnfsdk-marketplace/provision/uploadCSAR.sh132
-rw-r--r--tests/vnfsdk-pkgtools/tosca-metadata/create_open.robot24
-rw-r--r--tests/vnfsdk-pkgtools/tosca-metadata/create_validate_digest_signing.robot21
-rw-r--r--tests/vnfsdk-pkgtools/tosca-metadata/csar/ChangeLog.txt0
-rw-r--r--tests/vnfsdk-pkgtools/tosca-metadata/csar/Licenses/LICENSE.txt202
-rw-r--r--tests/vnfsdk-pkgtools/tosca-metadata/csar/Tests/test0
-rw-r--r--tests/vnfsdk-pkgtools/tosca-metadata/csar/test.crt19
-rw-r--r--tests/vnfsdk-pkgtools/tosca-metadata/csar/test_entry.mf5
-rw-r--r--tests/vnfsdk-pkgtools/tosca-metadata/csar/test_entry.yaml23
-rw-r--r--tests/vnfsdk-pkgtools/tosca-metadata/test.key27
-rw-r--r--tests/vvp/sanity/__init__.robot2
-rw-r--r--tests/vvp/sanity/test1.robot19
755 files changed, 43084 insertions, 0 deletions
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..6313b56c
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+* text=auto eol=lf
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..2bc829e4
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,22 @@
+.idea/
+.project
+.classpath
+.settings/
+target/
+autorelease/build/*/
+autorelease/dist
+log.html
+output.xml
+report.html
+env.properties
+.vagrant
+/archives/
+*.log
+.vagrant
+*~
+.checkstyle
+.DS_Store
+.idea
+*.iml
+
+/bin/
diff --git a/.gitreview b/.gitreview
new file mode 100644
index 00000000..e6c21d17
--- /dev/null
+++ b/.gitreview
@@ -0,0 +1,4 @@
+[gerrit]
+host=gerrit.onap.org
+port=29418
+project=integration/csit.git
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..a05fb075
--- /dev/null
+++ b/README.md
@@ -0,0 +1,4 @@
+# Manual CSIT Scripts
+The scripts in this directory are to help developers manually
+kick off test flows on their own dev environments in order to
+help debug any test failures.
diff --git a/plans/aaf/aafapi/setup.sh b/plans/aaf/aafapi/setup.sh
new file mode 100644
index 00000000..add9ae17
--- /dev/null
+++ b/plans/aaf/aafapi/setup.sh
@@ -0,0 +1,77 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# ONAP AAF
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+# Place the scripts in run order:
+source ${SCRIPTS}/common_functions.sh
+
+# Clone AAF Authz repo
+mkdir -p $WORKSPACE/archives/aafcsit
+cd $WORKSPACE/archives/aafcsit
+#unset http_proxy https_proxy
+git clone --depth 1 http://gerrit.onap.org/r/aaf/authz -b master
+git pull
+cd $WORKSPACE/archives/aafcsit/authz/auth/auth-service/src/main/resources/docker-compose
+pwd
+chmod -R 777 $WORKSPACE/archives/aafcsit/authz/auth/auth-service/src/main/resources/docker-compose
+
+
+# start aaf containers with docker compose and configuration from docker-compose.yml
+docker-compose up -d
+export aaf_service=$(get_docker_compose_service aaf_container)
+export cassandra_service=$(get_docker_compose_service cassandra_container)
+
+# Wait for initialization of Docker container for AAF & Cassandra
+for i in {1..12}; do
+
+ if [ $(docker inspect --format '{{ .State.Running }}' $aaf_service) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' $cassandra_service) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' $aaf_service) ]
+ then
+ echo "AAF Service Running"
+ break
+ else
+ echo sleep $i
+ sleep $i
+ fi
+done
+
+
+AAF_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $aaf_service)
+CASSANDRA_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $cassandra_service)
+
+bypass_ip_adress $AAF_IP
+bypass_ip_adress $CASSANDRA_IP
+
+echo AAF_IP=${AAF_IP}
+echo CASSANDRA_IP=${CASSANDRA_IP}
+
+
+# Wait for initialization of docker services
+for i in {1..12}; do
+ curl -sS -m 1 ${AAF_IP}:8101 && break
+ echo sleep $i
+ sleep $i
+done
+
+#Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v AAF_IP:${AAF_IP}"
diff --git a/plans/aaf/aafapi/teardown.sh b/plans/aaf/aafapi/teardown.sh
new file mode 100644
index 00000000..41e0b00e
--- /dev/null
+++ b/plans/aaf/aafapi/teardown.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+kill-instance.sh $aaf_service
+kill-instance.sh $cassandra_service
+
+unset aaf_service
+unset cassandra_service
diff --git a/plans/aaf/aafapi/testplan.txt b/plans/aaf/aafapi/testplan.txt
new file mode 100644
index 00000000..ea18ca6d
--- /dev/null
+++ b/plans/aaf/aafapi/testplan.txt
@@ -0,0 +1,2 @@
+# Place the suites in run order.
+aaf/aafapi
diff --git a/plans/aaf/sms-test-plan/setup.sh b/plans/aaf/sms-test-plan/setup.sh
new file mode 100755
index 00000000..9b57d64c
--- /dev/null
+++ b/plans/aaf/sms-test-plan/setup.sh
@@ -0,0 +1,71 @@
+#!/bin/bash
+#
+# Copyright 2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Not sure why this is needed.
+source ${SCRIPTS}/common_functions.sh
+
+CONFIG_FILE=$(pwd)/config/smsconfig.json
+
+mkdir -p $(pwd)/config
+
+docker login -u docker -p docker nexus3.onap.org:10001
+docker pull nexus3.onap.org:10001/onap/aaf/sms
+docker pull docker.io/vault:0.10.0
+
+#
+# Running vault in dev server mode here for CSIT
+# In HELM it runs in production mode
+#
+docker run -e "VAULT_DEV_ROOT_TOKEN_ID=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" \
+ -e SKIP_SETCAP=true \
+ --name vault -d -p 8200:8200 vault:0.10.0
+
+SMSDB_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' vault)
+cat << EOF > $CONFIG_FILE
+{
+ "cafile": "auth/selfsignedca.pem",
+ "servercert": "auth/server.cert",
+ "serverkey": "auth/server.key",
+
+ "smsdbaddress": "http://$SMSDB_IP:8200",
+ "vaulttoken": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
+ "disable_tls": true
+}
+EOF
+
+cat $CONFIG_FILE
+
+docker run --workdir /sms -v $CONFIG_FILE:/sms/smsconfig.json \
+ --name sms -d -p 10443:10443 nexus3.onap.org:10001/onap/aaf/sms
+
+SMS_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' sms)
+
+echo "###### WAITING FOR ALL CONTAINERS TO COME UP"
+sleep 20
+for i in {1..20}; do
+ curl -sS -m 1 http://${SMSDB_IP}:8200/v1/sys/seal-status && break
+ echo sleep $i
+ sleep $i
+done
+
+#
+# add here all ROBOT_VARIABLES settings
+#
+echo "# sms robot variables settings";
+ROBOT_VARIABLES="-v SMS_HOSTNAME:http://${SMS_IP} -v SMS_PORT:10443"
+
+echo ${ROBOT_VARIABLES}
diff --git a/plans/aaf/sms-test-plan/teardown.sh b/plans/aaf/sms-test-plan/teardown.sh
new file mode 100644
index 00000000..2c8b3e89
--- /dev/null
+++ b/plans/aaf/sms-test-plan/teardown.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+#
+# Copyright 2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+docker cp sms:/sms/sms.log .
+cat sms.log
+rm sms.log
+rm -rf config
+docker stop sms vault
+docker rm sms vault
+docker rmi nexus3.onap.org:10001/onap/aaf/sms
+docker rmi docker.io/vault:0.10.0
diff --git a/plans/aaf/sms-test-plan/testplan.txt b/plans/aaf/sms-test-plan/testplan.txt
new file mode 100644
index 00000000..c2b3b7b1
--- /dev/null
+++ b/plans/aaf/sms-test-plan/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+aaf/aaf-sms-suite \ No newline at end of file
diff --git a/plans/aai/esr-server/setup.sh b/plans/aai/esr-server/setup.sh
new file mode 100644
index 00000000..42d9676d
--- /dev/null
+++ b/plans/aai/esr-server/setup.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+#
+# Copyright 2017-2018 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+
+
+#login to the onap nexus docker repo
+docker login -u docker -p docker nexus3.onap.org:10001
+
+# Start MSB
+docker run -d -p 8500:8500 --name msb_consul nexus3.onap.org:10001/onap/msb/msb_base
+CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo CONSUL_IP=${CONSUL_IP}
+docker run -d -p 10081:10081 -e CONSUL_IP=$CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${DISCOVERY_IP}
+docker run -d -p 80:80 -e CONSUL_IP=$CONSUL_IP -e SDCLIENT_IP=$DISCOVERY_IP --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IP=${MSB_IP}
+
+# Start esr-server
+#docker run -d --name esr-server --env msbDiscoveryIp=${DISCOVERY_IP} --env msbDiscoveryPort=10081 nexus3.onap.org:10001/onap/aai/esr-server
+#sudo docker run -e MSB_ADDR=${MSB_IP}:80 nexus3.onap.org:10001/onap/aai/esr-server -p 9518:9518 -d --net=host --name esr-server
+docker run -d --name esr-server -e MSB_ADDR=${MSB_IP}:80 nexus3.onap.org:10001/onap/aai/esr-server
+#source ${SCRIPTS}/aai/esr-server/startup.sh i-esrserver ${MSB_IP} 80
+ESRSERVER_IP=`get-instance-ip.sh esr-server`
+echo ESRSERVER_IP=${ESRSERVER_IP}
+
+# Wait for initialization
+for i in {1..20}; do
+ curl -sS -m 1 ${ESRSERVER_IP}:9518 && curl -sS -m 1 ${MSB_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Wait for initialization
+for i in {1..20}; do
+ HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${MSB_IP}:80/api/aai-esr-server/v1/test"`
+ if [ ${HTTP_CODE} -eq 200 ]; then
+ break;
+ else
+ sleep $i
+ fi
+done
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IP:${MSB_IP} -v ESRSERVER_IP:${ESRSERVER_IP}"
+
+
+
diff --git a/plans/aai/esr-server/teardown.sh b/plans/aai/esr-server/teardown.sh
new file mode 100644
index 00000000..93f41383
--- /dev/null
+++ b/plans/aai/esr-server/teardown.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This script is sourced by run-csit.sh after Robot test completion.
+
+kill-instance.sh esr-server
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh msb_discovery
+kill-instance.sh msb_consul
diff --git a/plans/aai/esr-server/testplan.txt b/plans/aai/esr-server/testplan.txt
new file mode 100644
index 00000000..43ed23e9
--- /dev/null
+++ b/plans/aai/esr-server/testplan.txt
@@ -0,0 +1,4 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+aai/esr-server/startup
+
diff --git a/plans/aai/resources/aai-resources/appconfig/aai_keystore b/plans/aai/resources/aai-resources/appconfig/aai_keystore
new file mode 100644
index 00000000..1ddef0c9
--- /dev/null
+++ b/plans/aai/resources/aai-resources/appconfig/aai_keystore
Binary files differ
diff --git a/plans/aai/resources/aai-resources/appconfig/aaiconfig.properties b/plans/aai/resources/aai-resources/appconfig/aaiconfig.properties
new file mode 100644
index 00000000..435507a8
--- /dev/null
+++ b/plans/aai/resources/aai-resources/appconfig/aaiconfig.properties
@@ -0,0 +1,119 @@
+#
+# ============LICENSE_START=======================================================
+# org.onap.aai
+# ================================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+####################################################################
+# REMEMBER TO THINK ABOUT ENVIRONMENTAL DIFFERENCES AND CHANGE THE
+# TEMPLATE AND *ALL* DATAFILES
+####################################################################
+
+####################################################################
+# REMEMBER TO THINK ABOUT ENVIRONMENTAL DIFFERENCES AND CHANGE THE
+# TEMPLATE AND *ALL* DATAFILES
+####################################################################
+
+aai.config.checktime=1000
+
+# this could come from siteconfig.pl?
+aai.config.nodename=AutomaticallyOverwritten
+
+
+
+aai.auth.cspcookies_on=false
+aai.dbmodel.filename=ex5.json
+
+aai.server.url.base=https://aai.api.simpledemo.onap.org:8443/aai/
+aai.server.url=https://aai.api.simpledemo.onap.org:8443/aai/v11/
+aai.global.callback.url=https://aai.api.simpledemo.onap.org:8443/aai/
+
+aai.tools.enableBasicAuth=true
+aai.tools.username=AAI
+aai.tools.password=AAI
+
+aai.truststore.filename=aai_keystore
+aai.truststore.passwd.x=OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0
+aai.keystore.filename=aai_keystore
+aai.keystore.passwd.x=OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0
+
+
+aai.notification.current.version=v11
+aai.notificationEvent.default.status=UNPROCESSED
+aai.notificationEvent.default.eventType=AAI-EVENT
+aai.notificationEvent.default.domain=dev
+aai.notificationEvent.default.sourceName=aai
+aai.notificationEvent.default.sequenceNumber=0
+aai.notificationEvent.default.severity=NORMAL
+aai.notificationEvent.default.version=v11
+# This one lets us enable/disable resource-version checking on updates/deletes
+aai.resourceversion.enableflag=true
+aai.logging.maxStackTraceEntries=10
+aai.default.api.version=v11
+
+
+
+# Used by Model-processing code
+aai.model.delete.sleep.per.vtx.msec=500
+aai.model.query.resultset.maxcount=50
+aai.model.query.timeout.sec=90
+
+# Used by Data Grooming
+aai.grooming.default.max.file=150
+aai.grooming.default.sleep.minutes=7
+
+aai.model.proc.max.levels=50
+aai.edgeTag.proc.max.levels=50
+
+# for transaction log
+aai.logging.hbase.interceptor=true
+aai.logging.hbase.enabled=true
+aai.logging.hbase.logrequest=true
+aai.logging.hbase.logresponse=true
+
+# for gremlin server
+aai.server.rebind=g
+hbase.table.name=aailogging.dev
+hbase.table.timestamp.format=YYYYMMdd-HH:mm:ss:SSS
+hbase.zookeeper.quorum=localhost
+hbase.zookeeper.property.clientPort=2181
+hbase.zookeeper.znode.parent=/hbase
+
+aai.logging.trace.enabled=true
+aai.logging.trace.logrequest=false
+aai.logging.trace.logresponse=false
+
+aai.transaction.logging=true
+aai.transaction.logging.get=false
+aai.transaction.logging.post=false
+
+#timeout for crud enabled flag
+aai.crud.timeoutenabled=true
+
+#timeout app specific -1 to bypass for that app id, a whole number to override the timeout with that value (in ms)
+aai.crud.timeout.appspecific=JUNITTESTAPP1,1|JUNITTESTAPP2,-1|DCAE-CCS,-1|DCAES,-1|AAIRctFeed,-1|NewvceCreator,-1|IANewvceCreator,-1|AAI-CSIOVALS,-1
+
+#default timeout limit added for crud if not overridden (in ms)
+aai.crud.timeoutlimit=100000
+#limit set for bulk consumer APIS
+aai.bulkconsumer.payloadlimit=30
+
+#uncomment and use header X-OverrideLimit with the value to override the bulk api limit
+#aai.bulkconsumer.payloadoverride=E6F04B93462CB5B0EDF41C05A9DDF5C3FE59748F
+aai.bulkconsumer.payloadoverride=false
diff --git a/plans/aai/resources/aai-resources/appconfig/application.properties b/plans/aai/resources/aai-resources/appconfig/application.properties
new file mode 100644
index 00000000..b9c51eaf
--- /dev/null
+++ b/plans/aai/resources/aai-resources/appconfig/application.properties
@@ -0,0 +1,72 @@
+# The following info parameters are being referenced by ajsc6
+info.build.artifact=aai-resources
+info.build.name=resources
+info.build.description=Resources Microservice
+info.build.version=1.2.0
+
+spring.application.name=aai-resources
+spring.jersey.type=filter
+
+server.contextPath=/
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
+
+spring.profiles.active=production,dmaap
+#The max number of active threads in this pool
+server.tomcat.max-threads=200
+#The minimum number of threads always kept alive
+server.tomcat.min-Spare-Threads=25
+#The number of milliseconds before an idle thread shutsdown, unless the number of active threads are less or equal to minSpareThreads
+server.tomcat.max-idle-time=60000
+
+
+#Add this properties only if you want to change the URL, AJSC Framework interceptors will intercept
+#com.att.ajsc.common.interceptors.PreInterceptor.url=/**
+#com.att.ajsc.common.interceptors.PostInterceptor.url=/**
+
+#Servlet context parameters
+server.context_parameters.p-name=value #context parameter with p-name as key and value as value.
+kubernetes.namespace=org-onap-aai
+
+# If you get an application startup failure that the port is already taken
+# If thats not it, please check if the key-store file path makes sense
+server.local.startpath=aai-resources/src/main/resources/
+server.basic.auth.location=${server.local.startpath}etc/auth/realm.properties
+
+server.port=8447
+server.ssl.enabled-protocols=TLSv1.1,TLSv1.2
+server.ssl.key-store=${server.local.startpath}etc/auth/aai_keystore
+server.ssl.key-store-password=password(OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0)
+server.ssl.trust-store=${server.local.startpath}etc/auth/aai_keystore
+server.ssl.trust-store-password=password(OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0)
+server.ssl.client-auth=want
+server.ssl.key-store-type=JKS
+
+# JMS bind address host port
+jms.bind.address=tcp://localhost:61647
+dmaap.ribbon.eureka.enabled=false
+dmaap.ribbon.listOfServers=mr.api.simpledemo.onap.org:3904
+# Number of milliseconds to wait before making ping requests again
+dmaap.ribbon.ServerListRefreshInterval=75000
+dmaap.ribbon.NFLoadBalancerPingInterval=75000
+dmaap.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.AvailabilityFilteringRule
+dmaap.ribbon.NFLoadBalancerPingClassName=org.onap.aai.config.HttpPingImpl
+dmaap.ribbon.EnableMarkingServerDownOnReachingFailureLimit=true
+dmaap.ribbon.ServerDownFailureLimit=1
+# This needs to be verified but it seems that adding this property should automatically
+# Make the dmaap client change the url from http to https depending on the server
+dmaap.ribbon.securePorts=3905
+
+# Custom Dmaap Specific Configuration
+dmaap.ribbon.username=
+dmaap.ribbon.password=
+dmaap.ribbon.health.endpoint=/topics/AAI-EVENT
+# Number of seconds to wait for the ping to work and might need to increase this if the pings are all failing
+dmaap.ribbon.pingport.timeout=3
+
+niws.loadbalancer.dmaap.filterCircuitTripped=true
+niws.loadbalancer.dmaap.connectionFailureCountThreshold=3
+niws.loadbalancer.dmaap.circuitTripMaxTimeoutSeconds=180
+#dmaap.ribbon.retryableStatusCodes=404,503
+#dmaap.ribbon.retryableStatusCodes.MaxAutoRetriesNextServer=2
+#dmaap.ribbon.retryableStatusCodes.MaxAutoRetries=2
+#dmaap.ribbon.retryableStatusCodes.OkToRetryOnAllOperations=true
diff --git a/plans/aai/resources/aai-resources/appconfig/janusgraph-cached.properties b/plans/aai/resources/aai-resources/appconfig/janusgraph-cached.properties
new file mode 100644
index 00000000..c2110f77
--- /dev/null
+++ b/plans/aai/resources/aai-resources/appconfig/janusgraph-cached.properties
@@ -0,0 +1,43 @@
+#
+# ============LICENSE_START=======================================================
+# org.onap.aai
+# ================================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+query.fast-property=true
+query.smart-limit=false
+
+# the following parameters are not reloaded automatically and require a manual bounce
+storage.backend=cassandra
+storage.hostname=aai.hbase.simpledemo.onap.org
+
+storage.cassandra.keyspace=aaigraph
+
+#schema.default=none
+storage.lock.wait-time=300
+storage.hbase.table=aaigraph-dev1.dev
+storage.hbase.ext.zookeeper.znode.parent=/hbase
+#caching on
+cache.db-cache = true
+cache.db-cache-clean-wait = 20
+cache.db-cache-time = 180000
+cache.db-cache-size = 0.3
+
+#load graphson file on startup
+load.snapshot.file=false
diff --git a/plans/aai/resources/aai-resources/appconfig/janusgraph-realtime.properties b/plans/aai/resources/aai-resources/appconfig/janusgraph-realtime.properties
new file mode 100644
index 00000000..4791431a
--- /dev/null
+++ b/plans/aai/resources/aai-resources/appconfig/janusgraph-realtime.properties
@@ -0,0 +1,40 @@
+#
+# ============LICENSE_START=======================================================
+# org.onap.aai
+# ================================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+query.fast-property=true
+query.smart-limit=false
+
+# the following parameters are not reloaded automatically and require a manual bounce
+storage.backend=cassandra
+storage.hostname=aai.hbase.simpledemo.onap.org
+
+storage.cassandra.keyspace=aaigraph
+
+#schema.default=none
+storage.lock.wait-time=300
+storage.hbase.table=aaigraph-dev1.dev
+storage.hbase.ext.zookeeper.znode.parent=/hbase
+# Setting db-cache to false ensure the fastest propagation of changes across servers
+cache.db-cache = false
+
+#load graphson file on startup
+load.snapshot.file=false
diff --git a/plans/aai/resources/aai-resources/appconfig/localhost-access-logback.xml b/plans/aai/resources/aai-resources/appconfig/localhost-access-logback.xml
new file mode 100644
index 00000000..a318796c
--- /dev/null
+++ b/plans/aai/resources/aai-resources/appconfig/localhost-access-logback.xml
@@ -0,0 +1,62 @@
+<!--
+
+ ============LICENSE_START=======================================================
+ org.onap.aai
+ ================================================================================
+ Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+
+ ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+-->
+<configuration>
+ <property name="AJSC_HOME" value="${AJSC_HOME:-.}" />
+ <appender name="ACCESS"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${AJSC_HOME}/logs/ajsc-jetty/localhost_access.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${AJSC_HOME}/logs/ajsc-jetty/localhost_access.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.CustomLogPatternLayoutEncoder">
+ <Pattern>%a %u %z [%t] "%m %U%q" %s %b %y %i{X-TransactionId} %i{X-FromAppId} %i{X-Forwarded-For} %i{X-AAI-SSL-Client-CN} %i{X-AAI-SSL-Client-OU} %i{X-AAI-SSL-Client-O} %i{X-AAI-SSL-Client-L} %i{X-AAI-SSL-Client-ST} %i{X-AAI-SSL-Client-C} %i{X-AAI-SSL-Client-NotBefore} %i{X-AAI-SSL-Client-NotAfter} %i{X-AAI-SSL-Client-DN} %D</Pattern>
+ </encoder>
+ </appender>
+ <appender-ref ref="ACCESS" />
+</configuration>
+
+<!--
+%a - Remote IP address
+%A - Local IP address
+%b - Bytes sent, excluding HTTP headers, or '-' if no bytes were sent
+%B - Bytes sent, excluding HTTP headers
+%h - Remote host name
+%H - Request protocol
+%l - Remote logical username from identd (always returns '-')
+%m - Request method
+%p - Local port
+%q - Query string (prepended with a '?' if it exists, otherwise an empty string
+%r - First line of the request
+%s - HTTP status code of the response
+%S - User session ID
+%t - Date and time, in Common Log Format format
+%u - Remote user that was authenticated
+%U - Requested URL path
+%v - Local server name
+%I - current request thread name (can compare later with stacktraces)
+
+%z - Custom pattern that parses the cert for the subject
+%y - Custom pattern determines rest or dme2
+ --> \ No newline at end of file
diff --git a/plans/aai/resources/aai-resources/appconfig/logback.xml b/plans/aai/resources/aai-resources/appconfig/logback.xml
new file mode 100644
index 00000000..ee7ee61a
--- /dev/null
+++ b/plans/aai/resources/aai-resources/appconfig/logback.xml
@@ -0,0 +1,391 @@
+<!--
+
+ ============LICENSE_START=======================================================
+ org.onap.aai
+ ================================================================================
+ Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+
+ ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+-->
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+ <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
+
+ <property resource="application.properties" />
+
+ <property name="namespace" value="aai-resources"/>
+
+ <property name="AJSC_HOME" value="${AJSC_HOME:-.}" />
+ <jmxConfigurator />
+ <property name="logDirectory" value="${AJSC_HOME}/logs" />
+ <property name="eelfLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <property name="eelfAuditLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n|\r\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <property name="eelfMetricLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{targetEntity}|%X{targetServiceName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{targetVirtualEntity}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <!-- <property name="eelfErrorLogPattern" value="%ecompStartTime|%X{requestId}|%-10t|%X{serviceName}|%X{partnerName}|%X{targetEntity}|%X{targetServiceName}|%ecompErrorCategory|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n|\r\n', '^'}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/> -->
+ <property name="eelfErrorLogPattern" value="%ecompStartTime|%X{requestId}|%-10t|%X{serviceName}|%X{partnerName}|%X{targetEntity}|%X{targetServiceName}|%ecompErrorCategory|%ecompResponseCode|%ecompResponseDescription|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <property name="eelfTransLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{partnerName}:%m%n"/>
+
+ <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
+ <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
+ <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>
+ %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
+ </pattern>
+ </encoder>
+ </appender>
+
+ <appender name="SANE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/rest/sane.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/sane.log.%d{yyyy-MM-dd}</fileNamePattern>
+ </rollingPolicy>
+ <encoder>
+ <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n
+ </pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncSANE" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="SANE" />
+ </appender>
+
+ <appender name="METRIC"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>INFO</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <file>${logDirectory}/rest/metrics.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/metrics.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfMetricLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncMETRIC" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="METRIC" />
+ </appender>
+
+ <appender name="DEBUG"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>DEBUG</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <file>${logDirectory}/rest/debug.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/debug.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncDEBUG" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="DEBUG" />
+ </appender>
+
+ <appender name="ERROR"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>WARN</level>
+ </filter>
+ <file>${logDirectory}/rest/error.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/error.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfErrorLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncERROR" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="ERROR" />
+ </appender>
+
+ <appender name="AUDIT"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/rest/audit.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/audit.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfAuditLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncAUDIT" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="AUDIT" />
+ </appender>
+
+ <appender name="translog"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>DEBUG</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <file>${logDirectory}/rest/translog.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/translog.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfTransLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asynctranslog" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="translog" />
+ </appender>
+
+ <appender name="dmaapAAIEventConsumer"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>WARN</level>
+ </filter>
+ <File>${logDirectory}/dmaapAAIEventConsumer/error.log</File>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/dmaapAAIEventConsumer/error.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="dmaapAAIEventConsumerDebug"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>DEBUG</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <File>${logDirectory}/dmaapAAIEventConsumer/debug.log</File>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/dmaapAAIEventConsumer/debug.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="dmaapAAIEventConsumerMetric"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>INFO</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <File>${logDirectory}/dmaapAAIEventConsumer/metrics.log</File>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/dmaapAAIEventConsumer/metrics.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfMetricLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="external"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>WARN</level>
+ </filter>
+ <file>${logDirectory}/external/external.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/external/external.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <logger name="org.onap.aai" level="DEBUG" additivity="false">
+ <appender-ref ref="asyncDEBUG" />
+ <appender-ref ref="asyncERROR" />
+ <appender-ref ref="asyncMETRIC" />
+ <appender-ref ref="asyncSANE" />
+ </logger>
+
+ <!-- Spring related loggers -->
+ <logger name="org.springframework" level="WARN" />
+ <logger name="org.springframework.beans" level="WARN" />
+ <logger name="org.springframework.web" level="WARN" />
+ <logger name="com.blog.spring.jms" level="WARN" />
+ <logger name="com.jayway.jsonpath" level="WARN" />
+
+ <!-- AJSC Services (bootstrap services) -->
+ <logger name="ajsc" level="WARN" />
+ <logger name="ajsc.RouteMgmtService" level="WARN" />
+ <logger name="ajsc.ComputeService" level="WARN" />
+ <logger name="ajsc.VandelayService" level="WARN" />
+ <logger name="ajsc.FilePersistenceService" level="WARN" />
+ <logger name="ajsc.UserDefinedJarService" level="WARN" />
+ <logger name="ajsc.UserDefinedBeansDefService" level="WARN" />
+ <logger name="ajsc.LoggingConfigurationService" level="WARN" />
+
+ <!-- AJSC related loggers (DME2 Registration, csi logging, restlet, servlet
+ logging) -->
+ <logger name="org.codehaus.groovy" level="WARN" />
+ <logger name="com.att.scamper" level="WARN" />
+ <logger name="ajsc.utils" level="WARN" />
+ <logger name="ajsc.utils.DME2Helper" level="WARN" />
+ <logger name="ajsc.filters" level="WARN" />
+ <logger name="ajsc.beans.interceptors" level="WARN" />
+ <logger name="ajsc.restlet" level="WARN" />
+ <logger name="ajsc.servlet" level="WARN" />
+ <logger name="com.att.ajsc" level="WARN" />
+ <logger name="com.att.ajsc.csi.logging" level="WARN" />
+ <logger name="com.att.ajsc.filemonitor" level="WARN" />
+ <logger name="com.netflix.loadbalancer" level="WARN" />
+
+ <logger name="org.apache.zookeeper" level="OFF" />
+
+ <!-- Other Loggers that may help troubleshoot -->
+ <logger name="net.sf" level="WARN" />
+ <logger name="org.apache.commons.httpclient" level="WARN" />
+ <logger name="org.apache.commons" level="WARN" />
+ <logger name="org.apache.coyote" level="WARN" />
+ <logger name="org.apache.jasper" level="WARN" />
+
+ <!-- Camel Related Loggers (including restlet/servlet/jaxrs/cxf logging.
+ May aid in troubleshooting) -->
+ <logger name="org.apache.camel" level="WARN" />
+ <logger name="org.apache.cxf" level="WARN" />
+ <logger name="org.apache.camel.processor.interceptor" level="WARN" />
+ <logger name="org.apache.cxf.jaxrs.interceptor" level="WARN" />
+ <logger name="org.apache.cxf.service" level="WARN" />
+ <logger name="org.restlet" level="WARN" />
+ <logger name="org.apache.camel.component.restlet" level="WARN" />
+
+ <logger name="org.hibernate.validator" level="WARN" />
+ <logger name="org.hibernate" level="WARN" />
+ <logger name="org.hibernate.ejb" level="OFF" />
+
+ <!-- logback internals logging -->
+ <logger name="ch.qos.logback.classic" level="WARN" />
+ <logger name="ch.qos.logback.core" level="WARN" />
+
+ <logger name="org.eclipse.jetty" level="WARN" />
+
+ <!-- logback jms appenders & loggers definition starts here -->
+ <appender name="auditLogs"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter" />
+ <file>${logDirectory}/perf-audit/Audit-${lrmRVer}-${lrmRO}-${Pid}.log
+ </file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/perf-audit/Audit-${lrmRVer}-${lrmRO}-${Pid}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>"%d [%thread] %-5level %logger{1024} - %msg%n"</pattern>
+ </encoder>
+ </appender>
+ <appender name="perfLogs"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter" />
+ <file>${logDirectory}/perf-audit/Perform-${lrmRVer}-${lrmRO}-${Pid}.log
+ </file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/perf-audit/Perform-${lrmRVer}-${lrmRO}-${Pid}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>"%d [%thread] %-5level %logger{1024} - %msg%n"</pattern>
+ </encoder>
+ </appender>
+ <logger name="AuditRecord" level="INFO" additivity="false">
+ <appender-ref ref="auditLogs" />
+ </logger>
+ <logger name="AuditRecord_DirectCall" level="INFO" additivity="false">
+ <appender-ref ref="auditLogs" />
+ </logger>
+ <logger name="PerfTrackerRecord" level="INFO" additivity="false">
+ <appender-ref ref="perfLogs" />
+ </logger>
+ <!-- logback jms appenders & loggers definition ends here -->
+
+ <logger name="org.onap.aai.interceptors.post" level="DEBUG"
+ additivity="false">
+ <appender-ref ref="asynctranslog" />
+ </logger>
+
+ <logger name="org.onap.aai.interceptors.pre.SetLoggingContext" level="DEBUG">
+ <appender-ref ref="asyncAUDIT"/>
+ </logger>
+
+ <logger name="org.onap.aai.interceptors.post.ResetLoggingContext" level="DEBUG">
+ <appender-ref ref="asyncAUDIT"/>
+ </logger>
+
+ <logger name="org.onap.aai.dmaap" level="DEBUG" additivity="false">
+ <appender-ref ref="dmaapAAIEventConsumer" />
+ <appender-ref ref="dmaapAAIEventConsumerDebug" />
+ <appender-ref ref="dmaapAAIEventConsumerMetric" />
+ </logger>
+
+ <logger name="org.apache" level="OFF" />
+ <logger name="org.zookeeper" level="OFF" />
+ <logger name="com.thinkaurelius" level="WARN" />
+ <logger name="com.att.aft.dme2" level="WARN" />
+
+ <!-- ============================================================================ -->
+ <!-- General EELF logger -->
+ <!-- ============================================================================ -->
+ <logger name="com.att.eelf" level="WARN" additivity="false">
+ <appender-ref ref="asyncDEBUG" />
+ <appender-ref ref="asyncERROR" />
+ <appender-ref ref="asyncMETRIC" />
+ </logger>
+
+ <root level="DEBUG">
+ <appender-ref ref="external" />
+ </root>
+</configuration>
diff --git a/plans/aai/resources/aai-resources/appconfig/realm.properties b/plans/aai/resources/aai-resources/appconfig/realm.properties
new file mode 100644
index 00000000..fb692cc3
--- /dev/null
+++ b/plans/aai/resources/aai-resources/appconfig/realm.properties
@@ -0,0 +1,12 @@
+# format : username: password[,rolename ...]
+# default username/password: AAI/AAI, MSO/MSO, ModelLoader/ModelLoader...
+AAI:OBF:1gfr1ev31gg7,admin
+MSO:OBF:1jzx1lz31k01,admin
+SDNC:OBF:1itr1i0l1i151isv,admin
+DCAE:OBF:1g8u1f9d1f991g8w,admin
+POLICY:OBF:1mk61i171ima1im41i0j1mko,admin
+ASDC:OBF:1f991j0u1j001f9d,admin
+VID:OBF:1jm91i0v1jl9,admin
+APPC:OBF:1f991ksf1ksf1f9d,admin
+ModelLoader:OBF:1qvu1v2h1sov1sar1wfw1j7j1wg21saj1sov1v1x1qxw,admin
+AaiUI:OBF:1gfr1p571unz1p4j1gg7,admin
diff --git a/plans/aai/resources/aai-traversal/appconfig/aai_keystore b/plans/aai/resources/aai-traversal/appconfig/aai_keystore
new file mode 100644
index 00000000..1ddef0c9
--- /dev/null
+++ b/plans/aai/resources/aai-traversal/appconfig/aai_keystore
Binary files differ
diff --git a/plans/aai/resources/aai-traversal/appconfig/aaiconfig.properties b/plans/aai/resources/aai-traversal/appconfig/aaiconfig.properties
new file mode 100644
index 00000000..cef10903
--- /dev/null
+++ b/plans/aai/resources/aai-traversal/appconfig/aaiconfig.properties
@@ -0,0 +1,114 @@
+#
+# ============LICENSE_START=======================================================
+# org.onap.aai
+# ================================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+####################################################################
+# REMEMBER TO THINK ABOUT ENVIRONMENTAL DIFFERENCES AND CHANGE THE
+# TEMPLATE AND *ALL* DATAFILES
+####################################################################
+
+####################################################################
+# REMEMBER TO THINK ABOUT ENVIRONMENTAL DIFFERENCES AND CHANGE THE
+# TEMPLATE AND *ALL* DATAFILES
+####################################################################
+
+aai.config.checktime=1000
+
+# this could come from siteconfig.pl?
+aai.config.nodename=AutomaticallyOverwritten
+
+
+
+aai.auth.cspcookies_on=false
+aai.dbmodel.filename=ex5.json
+
+aai.server.url.base=https://aai.api.simpledemo.onap.org:8443/aai/
+aai.server.url=https://aai.api.simpledemo.onap.org:8443/aai/v11/
+aai.global.callback.url=https://aai.api.simpledemo.onap.org:8443/aai/
+
+aai.tools.enableBasicAuth=true
+aai.tools.username=AAI
+aai.tools.password=AAI
+
+aai.truststore.filename=aai_keystore
+aai.truststore.passwd.x=OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0
+aai.keystore.filename=aai_keystore
+aai.keystore.passwd.x=OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0
+
+
+aai.notification.current.version=v11
+aai.notificationEvent.default.status=UNPROCESSED
+aai.notificationEvent.default.eventType=AAI-EVENT
+aai.notificationEvent.default.domain=dev
+aai.notificationEvent.default.sourceName=aai
+aai.notificationEvent.default.sequenceNumber=0
+aai.notificationEvent.default.severity=NORMAL
+aai.notificationEvent.default.version=v11
+# This one lets us enable/disable resource-version checking on updates/deletes
+aai.resourceversion.enableflag=true
+aai.logging.maxStackTraceEntries=10
+aai.default.api.version=v11
+
+
+
+# Used by Model-processing code
+aai.model.delete.sleep.per.vtx.msec=500
+aai.model.query.resultset.maxcount=50
+aai.model.query.timeout.sec=90
+
+# Used by Data Grooming
+aai.grooming.default.max.file=150
+aai.grooming.default.sleep.minutes=7
+
+aai.model.proc.max.levels=50
+aai.edgeTag.proc.max.levels=50
+
+# for transaction log
+aai.logging.hbase.interceptor=true
+aai.logging.hbase.enabled=true
+aai.logging.hbase.logrequest=true
+aai.logging.hbase.logresponse=true
+
+# for gremlin server
+aai.server.rebind=g
+hbase.table.name=aailogging.dev
+hbase.table.timestamp.format=YYYYMMdd-HH:mm:ss:SSS
+hbase.zookeeper.quorum=localhost
+hbase.zookeeper.property.clientPort=2181
+hbase.zookeeper.znode.parent=/hbase
+
+aai.logging.trace.enabled=true
+aai.logging.trace.logrequest=false
+aai.logging.trace.logresponse=false
+
+aai.transaction.logging=true
+aai.transaction.logging.get=false
+aai.transaction.logging.post=false
+
+#timeout for traversal enabled flag
+aai.traversal.timeoutenabled=true
+
+#timeout app specific
+aai.traversal.timeout.appspecific=JUNITTESTAPP1,1|JUNITTESTAPP2,-1|DCAE-CCS,-1|DCAES,-1|AAI-FILEGEN-GFPIP,-1
+
+#default timeout limit added for traversal if not overridden (in ms)
+aai.traversal.timeoutlimit=180000
+
diff --git a/plans/aai/resources/aai-traversal/appconfig/application.properties b/plans/aai/resources/aai-traversal/appconfig/application.properties
new file mode 100644
index 00000000..0292512c
--- /dev/null
+++ b/plans/aai/resources/aai-traversal/appconfig/application.properties
@@ -0,0 +1,72 @@
+# The following info parameters are being referenced by ajsc6
+info.build.artifact=aai-traversal
+info.build.name=traversal
+info.build.description=Traversal Microservice
+info.build.version=1.2.0
+
+spring.application.name=aai-traversal
+spring.jersey.type=filter
+
+server.contextPath=/
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
+
+spring.profiles.active=production,dmaap
+#The max number of active threads in this pool
+server.tomcat.max-threads=200
+#The minimum number of threads always kept alive
+server.tomcat.min-Spare-Threads=25
+#The number of milliseconds before an idle thread shutsdown, unless the number of active threads are less or equal to minSpareThreads
+server.tomcat.max-idle-time=60000
+
+
+#Add this properties only if you want to change the URL, AJSC Framework interceptors will intercept
+#com.att.ajsc.common.interceptors.PreInterceptor.url=/**
+#com.att.ajsc.common.interceptors.PostInterceptor.url=/**
+
+#Servlet context parameters
+server.context_parameters.p-name=value #context parameter with p-name as key and value as value.
+kubernetes.namespace=org-onap-aai
+
+# If you get an application startup failure that the port is already taken
+# If thats not it, please check if the key-store file path makes sense
+server.local.startpath=aai-traversal/src/main/resources/
+server.basic.auth.location=${server.local.startpath}etc/auth/realm.properties
+
+server.port=8446
+server.ssl.enabled-protocols=TLSv1.1,TLSv1.2
+server.ssl.key-store=${server.local.startpath}etc/auth/aai_keystore
+server.ssl.key-store-password=password(OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0)
+server.ssl.trust-store=${server.local.startpath}etc/auth/aai_keystore
+server.ssl.trust-store-password=password(OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0)
+server.ssl.client-auth=want
+server.ssl.key-store-type=JKS
+
+# JMS bind address host port
+jms.bind.address=tcp://localhost:61647
+dmaap.ribbon.eureka.enabled=false
+dmaap.ribbon.listOfServers=mr.api.simpledemo.onap.org:3904
+# Number of milliseconds to wait before making ping requests again
+dmaap.ribbon.ServerListRefreshInterval=75000
+dmaap.ribbon.NFLoadBalancerPingInterval=75000
+dmaap.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.AvailabilityFilteringRule
+dmaap.ribbon.NFLoadBalancerPingClassName=org.onap.aai.config.HttpPingImpl
+dmaap.ribbon.EnableMarkingServerDownOnReachingFailureLimit=true
+dmaap.ribbon.ServerDownFailureLimit=1
+# This needs to be verified but it seems that adding this property should automatically
+# Make the dmaap client change the url from http to https depending on the server
+dmaap.ribbon.securePorts=3905
+
+# Custom Dmaap Specific Configuration
+dmaap.ribbon.username=
+dmaap.ribbon.password=
+dmaap.ribbon.health.endpoint=/topics/AAI-EVENT
+# Number of seconds to wait for the ping to work and might need to increase this if the pings are all failing
+dmaap.ribbon.pingport.timeout=3
+
+niws.loadbalancer.dmaap.filterCircuitTripped=true
+niws.loadbalancer.dmaap.connectionFailureCountThreshold=3
+niws.loadbalancer.dmaap.circuitTripMaxTimeoutSeconds=180
+#dmaap.ribbon.retryableStatusCodes=404,503
+#dmaap.ribbon.retryableStatusCodes.MaxAutoRetriesNextServer=2
+#dmaap.ribbon.retryableStatusCodes.MaxAutoRetries=2
+#dmaap.ribbon.retryableStatusCodes.OkToRetryOnAllOperations=true
diff --git a/plans/aai/resources/aai-traversal/appconfig/janusgraph-cached.properties b/plans/aai/resources/aai-traversal/appconfig/janusgraph-cached.properties
new file mode 100644
index 00000000..c2110f77
--- /dev/null
+++ b/plans/aai/resources/aai-traversal/appconfig/janusgraph-cached.properties
@@ -0,0 +1,43 @@
+#
+# ============LICENSE_START=======================================================
+# org.onap.aai
+# ================================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+query.fast-property=true
+query.smart-limit=false
+
+# the following parameters are not reloaded automatically and require a manual bounce
+storage.backend=cassandra
+storage.hostname=aai.hbase.simpledemo.onap.org
+
+storage.cassandra.keyspace=aaigraph
+
+#schema.default=none
+storage.lock.wait-time=300
+storage.hbase.table=aaigraph-dev1.dev
+storage.hbase.ext.zookeeper.znode.parent=/hbase
+#caching on
+cache.db-cache = true
+cache.db-cache-clean-wait = 20
+cache.db-cache-time = 180000
+cache.db-cache-size = 0.3
+
+#load graphson file on startup
+load.snapshot.file=false
diff --git a/plans/aai/resources/aai-traversal/appconfig/janusgraph-realtime.properties b/plans/aai/resources/aai-traversal/appconfig/janusgraph-realtime.properties
new file mode 100644
index 00000000..4791431a
--- /dev/null
+++ b/plans/aai/resources/aai-traversal/appconfig/janusgraph-realtime.properties
@@ -0,0 +1,40 @@
+#
+# ============LICENSE_START=======================================================
+# org.onap.aai
+# ================================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+query.fast-property=true
+query.smart-limit=false
+
+# the following parameters are not reloaded automatically and require a manual bounce
+storage.backend=cassandra
+storage.hostname=aai.hbase.simpledemo.onap.org
+
+storage.cassandra.keyspace=aaigraph
+
+#schema.default=none
+storage.lock.wait-time=300
+storage.hbase.table=aaigraph-dev1.dev
+storage.hbase.ext.zookeeper.znode.parent=/hbase
+# Setting db-cache to false ensure the fastest propagation of changes across servers
+cache.db-cache = false
+
+#load graphson file on startup
+load.snapshot.file=false
diff --git a/plans/aai/resources/aai-traversal/appconfig/localhost-access-logback.xml b/plans/aai/resources/aai-traversal/appconfig/localhost-access-logback.xml
new file mode 100644
index 00000000..a318796c
--- /dev/null
+++ b/plans/aai/resources/aai-traversal/appconfig/localhost-access-logback.xml
@@ -0,0 +1,62 @@
+<!--
+
+ ============LICENSE_START=======================================================
+ org.onap.aai
+ ================================================================================
+ Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+
+ ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+-->
+<configuration>
+ <property name="AJSC_HOME" value="${AJSC_HOME:-.}" />
+ <appender name="ACCESS"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${AJSC_HOME}/logs/ajsc-jetty/localhost_access.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${AJSC_HOME}/logs/ajsc-jetty/localhost_access.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.CustomLogPatternLayoutEncoder">
+ <Pattern>%a %u %z [%t] "%m %U%q" %s %b %y %i{X-TransactionId} %i{X-FromAppId} %i{X-Forwarded-For} %i{X-AAI-SSL-Client-CN} %i{X-AAI-SSL-Client-OU} %i{X-AAI-SSL-Client-O} %i{X-AAI-SSL-Client-L} %i{X-AAI-SSL-Client-ST} %i{X-AAI-SSL-Client-C} %i{X-AAI-SSL-Client-NotBefore} %i{X-AAI-SSL-Client-NotAfter} %i{X-AAI-SSL-Client-DN} %D</Pattern>
+ </encoder>
+ </appender>
+ <appender-ref ref="ACCESS" />
+</configuration>
+
+<!--
+%a - Remote IP address
+%A - Local IP address
+%b - Bytes sent, excluding HTTP headers, or '-' if no bytes were sent
+%B - Bytes sent, excluding HTTP headers
+%h - Remote host name
+%H - Request protocol
+%l - Remote logical username from identd (always returns '-')
+%m - Request method
+%p - Local port
+%q - Query string (prepended with a '?' if it exists, otherwise an empty string
+%r - First line of the request
+%s - HTTP status code of the response
+%S - User session ID
+%t - Date and time, in Common Log Format format
+%u - Remote user that was authenticated
+%U - Requested URL path
+%v - Local server name
+%I - current request thread name (can compare later with stacktraces)
+
+%z - Custom pattern that parses the cert for the subject
+%y - Custom pattern determines rest or dme2
+ --> \ No newline at end of file
diff --git a/plans/aai/resources/aai-traversal/appconfig/logback.xml b/plans/aai/resources/aai-traversal/appconfig/logback.xml
new file mode 100644
index 00000000..31bfe10c
--- /dev/null
+++ b/plans/aai/resources/aai-traversal/appconfig/logback.xml
@@ -0,0 +1,391 @@
+<!--
+
+ ============LICENSE_START=======================================================
+ org.onap.aai
+ ================================================================================
+ Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+
+ ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+-->
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+ <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
+
+ <property resource="application.properties" />
+
+ <property name="namespace" value="aai-traversal"/>
+
+ <property name="AJSC_HOME" value="${AJSC_HOME:-.}" />
+ <jmxConfigurator />
+ <property name="logDirectory" value="${AJSC_HOME}/logs" />
+ <property name="eelfLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <property name="eelfAuditLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n|\r\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <property name="eelfMetricLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{targetEntity}|%X{targetServiceName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{targetVirtualEntity}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <!-- <property name="eelfErrorLogPattern" value="%ecompStartTime|%X{requestId}|%-10t|%X{serviceName}|%X{partnerName}|%X{targetEntity}|%X{targetServiceName}|%ecompErrorCategory|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n|\r\n', '^'}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/> -->
+ <property name="eelfErrorLogPattern" value="%ecompStartTime|%X{requestId}|%-10t|%X{serviceName}|%X{partnerName}|%X{targetEntity}|%X{targetServiceName}|%ecompErrorCategory|%ecompResponseCode|%ecompResponseDescription|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <property name="eelfTransLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{partnerName}:%m%n"/>
+
+ <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
+ <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
+ <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>
+ %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
+ </pattern>
+ </encoder>
+ </appender>
+
+ <appender name="SANE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/rest/sane.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/sane.log.%d{yyyy-MM-dd}</fileNamePattern>
+ </rollingPolicy>
+ <encoder>
+ <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n
+ </pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncSANE" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="SANE" />
+ </appender>
+
+ <appender name="METRIC"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>INFO</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <file>${logDirectory}/rest/metrics.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/metrics.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfMetricLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncMETRIC" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="METRIC" />
+ </appender>
+
+ <appender name="DEBUG"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>DEBUG</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <file>${logDirectory}/rest/debug.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/debug.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncDEBUG" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="DEBUG" />
+ </appender>
+
+ <appender name="ERROR"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>WARN</level>
+ </filter>
+ <file>${logDirectory}/rest/error.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/error.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfErrorLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncERROR" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="ERROR" />
+ </appender>
+
+ <appender name="AUDIT"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/rest/audit.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/audit.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfAuditLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncAUDIT" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="AUDIT" />
+ </appender>
+
+ <appender name="translog"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>DEBUG</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <file>${logDirectory}/rest/translog.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/translog.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfTransLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asynctranslog" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="translog" />
+ </appender>
+
+ <appender name="dmaapAAIEventConsumer"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>WARN</level>
+ </filter>
+ <File>${logDirectory}/dmaapAAIEventConsumer/error.log</File>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/dmaapAAIEventConsumer/error.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="dmaapAAIEventConsumerDebug"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>DEBUG</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <File>${logDirectory}/dmaapAAIEventConsumer/debug.log</File>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/dmaapAAIEventConsumer/debug.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="dmaapAAIEventConsumerMetric"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>INFO</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <File>${logDirectory}/dmaapAAIEventConsumer/metrics.log</File>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/dmaapAAIEventConsumer/metrics.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfMetricLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="external"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>WARN</level>
+ </filter>
+ <file>${logDirectory}/external/external.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/external/external.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <logger name="org.onap.aai" level="DEBUG" additivity="false">
+ <appender-ref ref="asyncDEBUG" />
+ <appender-ref ref="asyncERROR" />
+ <appender-ref ref="asyncMETRIC" />
+ <appender-ref ref="asyncSANE" />
+ </logger>
+
+ <!-- Spring related loggers -->
+ <logger name="org.springframework" level="WARN" />
+ <logger name="org.springframework.beans" level="WARN" />
+ <logger name="org.springframework.web" level="WARN" />
+ <logger name="com.blog.spring.jms" level="WARN" />
+ <logger name="com.jayway.jsonpath" level="WARN" />
+
+ <!-- AJSC Services (bootstrap services) -->
+ <logger name="ajsc" level="WARN" />
+ <logger name="ajsc.RouteMgmtService" level="WARN" />
+ <logger name="ajsc.ComputeService" level="WARN" />
+ <logger name="ajsc.VandelayService" level="WARN" />
+ <logger name="ajsc.FilePersistenceService" level="WARN" />
+ <logger name="ajsc.UserDefinedJarService" level="WARN" />
+ <logger name="ajsc.UserDefinedBeansDefService" level="WARN" />
+ <logger name="ajsc.LoggingConfigurationService" level="WARN" />
+
+ <!-- AJSC related loggers (DME2 Registration, csi logging, restlet, servlet
+ logging) -->
+ <logger name="org.codehaus.groovy" level="WARN" />
+ <logger name="com.att.scamper" level="WARN" />
+ <logger name="ajsc.utils" level="WARN" />
+ <logger name="ajsc.utils.DME2Helper" level="WARN" />
+ <logger name="ajsc.filters" level="WARN" />
+ <logger name="ajsc.beans.interceptors" level="WARN" />
+ <logger name="ajsc.restlet" level="WARN" />
+ <logger name="ajsc.servlet" level="WARN" />
+ <logger name="com.att.ajsc" level="WARN" />
+ <logger name="com.att.ajsc.csi.logging" level="WARN" />
+ <logger name="com.att.ajsc.filemonitor" level="WARN" />
+ <logger name="com.netflix.loadbalancer" level="WARN" />
+
+ <logger name="org.apache.zookeeper" level="OFF" />
+
+ <!-- Other Loggers that may help troubleshoot -->
+ <logger name="net.sf" level="WARN" />
+ <logger name="org.apache.commons.httpclient" level="WARN" />
+ <logger name="org.apache.commons" level="WARN" />
+ <logger name="org.apache.coyote" level="WARN" />
+ <logger name="org.apache.jasper" level="WARN" />
+
+ <!-- Camel Related Loggers (including restlet/servlet/jaxrs/cxf logging.
+ May aid in troubleshooting) -->
+ <logger name="org.apache.camel" level="WARN" />
+ <logger name="org.apache.cxf" level="WARN" />
+ <logger name="org.apache.camel.processor.interceptor" level="WARN" />
+ <logger name="org.apache.cxf.jaxrs.interceptor" level="WARN" />
+ <logger name="org.apache.cxf.service" level="WARN" />
+ <logger name="org.restlet" level="WARN" />
+ <logger name="org.apache.camel.component.restlet" level="WARN" />
+
+ <logger name="org.hibernate.validator" level="WARN" />
+ <logger name="org.hibernate" level="WARN" />
+ <logger name="org.hibernate.ejb" level="OFF" />
+
+ <!-- logback internals logging -->
+ <logger name="ch.qos.logback.classic" level="WARN" />
+ <logger name="ch.qos.logback.core" level="WARN" />
+
+ <logger name="org.eclipse.jetty" level="WARN" />
+
+ <!-- logback jms appenders & loggers definition starts here -->
+ <appender name="auditLogs"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter" />
+ <file>${logDirectory}/perf-audit/Audit-${lrmRVer}-${lrmRO}-${Pid}.log
+ </file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/perf-audit/Audit-${lrmRVer}-${lrmRO}-${Pid}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>"%d [%thread] %-5level %logger{1024} - %msg%n"</pattern>
+ </encoder>
+ </appender>
+ <appender name="perfLogs"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter" />
+ <file>${logDirectory}/perf-audit/Perform-${lrmRVer}-${lrmRO}-${Pid}.log
+ </file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/perf-audit/Perform-${lrmRVer}-${lrmRO}-${Pid}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>"%d [%thread] %-5level %logger{1024} - %msg%n"</pattern>
+ </encoder>
+ </appender>
+ <logger name="AuditRecord" level="INFO" additivity="false">
+ <appender-ref ref="auditLogs" />
+ </logger>
+ <logger name="AuditRecord_DirectCall" level="INFO" additivity="false">
+ <appender-ref ref="auditLogs" />
+ </logger>
+ <logger name="PerfTrackerRecord" level="INFO" additivity="false">
+ <appender-ref ref="perfLogs" />
+ </logger>
+ <!-- logback jms appenders & loggers definition ends here -->
+
+ <logger name="org.onap.aai.interceptors.post" level="DEBUG"
+ additivity="false">
+ <appender-ref ref="asynctranslog" />
+ </logger>
+
+ <logger name="org.onap.aai.interceptors.pre.SetLoggingContext" level="DEBUG">
+ <appender-ref ref="asyncAUDIT"/>
+ </logger>
+
+ <logger name="org.onap.aai.interceptors.post.ResetLoggingContext" level="DEBUG">
+ <appender-ref ref="asyncAUDIT"/>
+ </logger>
+
+ <logger name="org.onap.aai.dmaap" level="DEBUG" additivity="false">
+ <appender-ref ref="dmaapAAIEventConsumer" />
+ <appender-ref ref="dmaapAAIEventConsumerDebug" />
+ <appender-ref ref="dmaapAAIEventConsumerMetric" />
+ </logger>
+
+ <logger name="org.apache" level="OFF" />
+ <logger name="org.zookeeper" level="OFF" />
+ <logger name="com.thinkaurelius" level="WARN" />
+ <logger name="com.att.aft.dme2" level="WARN" />
+
+ <!-- ============================================================================ -->
+ <!-- General EELF logger -->
+ <!-- ============================================================================ -->
+ <logger name="com.att.eelf" level="WARN" additivity="false">
+ <appender-ref ref="asyncDEBUG" />
+ <appender-ref ref="asyncERROR" />
+ <appender-ref ref="asyncMETRIC" />
+ </logger>
+
+ <root level="DEBUG">
+ <appender-ref ref="external" />
+ </root>
+</configuration>
diff --git a/plans/aai/resources/aai-traversal/appconfig/realm.properties b/plans/aai/resources/aai-traversal/appconfig/realm.properties
new file mode 100644
index 00000000..fb692cc3
--- /dev/null
+++ b/plans/aai/resources/aai-traversal/appconfig/realm.properties
@@ -0,0 +1,12 @@
+# format : username: password[,rolename ...]
+# default username/password: AAI/AAI, MSO/MSO, ModelLoader/ModelLoader...
+AAI:OBF:1gfr1ev31gg7,admin
+MSO:OBF:1jzx1lz31k01,admin
+SDNC:OBF:1itr1i0l1i151isv,admin
+DCAE:OBF:1g8u1f9d1f991g8w,admin
+POLICY:OBF:1mk61i171ima1im41i0j1mko,admin
+ASDC:OBF:1f991j0u1j001f9d,admin
+VID:OBF:1jm91i0v1jl9,admin
+APPC:OBF:1f991ksf1ksf1f9d,admin
+ModelLoader:OBF:1qvu1v2h1sov1sar1wfw1j7j1wg21saj1sov1v1x1qxw,admin
+AaiUI:OBF:1gfr1p571unz1p4j1gg7,admin
diff --git a/plans/aai/resources/docker-compose.yml b/plans/aai/resources/docker-compose.yml
new file mode 100644
index 00000000..6f62e6ef
--- /dev/null
+++ b/plans/aai/resources/docker-compose.yml
@@ -0,0 +1,86 @@
+version: '2'
+services:
+ aai-resources.api.simpledemo.onap.org:
+ image: ${DOCKER_REGISTRY}/onap/aai-resources
+ hostname: aai-resources.api.simpledemo.onap.org
+ environment:
+ - LOCAL_USER_ID=${USER_ID}
+ - LOCAL_GROUP_ID=${GROUP_ID}
+ - SKIP_CREATE_DB_SCHEMA_AT_STARTUP=true
+ ports:
+ - 8447:8447
+ volumes:
+ - ${CURRENT_PWD}/aai-resources/appconfig/janusgraph-realtime.properties:/opt/app/aai-resources/resources/etc/appprops/janusgraph-realtime.properties
+ - ${CURRENT_PWD}/aai-resources/appconfig/janusgraph-cached.properties:/opt/app/aai-resources/resources/etc/appprops/janusgraph-cached.properties
+ - ${CURRENT_PWD}/aai-resources/appconfig/aaiconfig.properties:/opt/app/aai-resources/resources/etc/appprops/aaiconfig.properties
+ - ${CURRENT_PWD}/aai-resources/appconfig/application.properties:/opt/app/aai-resources/resources/application.properties
+ - ${CURRENT_PWD}/aai-resources/appconfig/logback.xml:/opt/app/aai-resources/resources/logback.xml
+ - ${CURRENT_PWD}/aai-resources/appconfig/localhost-access-logback.xml:/opt/app/aai-resources/resources/localhost-access-logback.xml
+ - ${CURRENT_PWD}/aai-resources/appconfig/aai_keystore:/opt/app/aai-resources/resources/etc/auth/aai_keystore
+ - ${CURRENT_PWD}/aai-resources/appconfig/realm.properties:/opt/app/aai-resources/resources/etc/auth/realm.properties
+ logging:
+ driver: "json-file"
+ options:
+ max-size: "30m"
+ max-file: "5"
+ aai-traversal.api.simpledemo.onap.org:
+ image: ${DOCKER_REGISTRY}/onap/aai-traversal
+ hostname: aai-traversal.api.simpledemo.onap.org
+ environment:
+ - LOCAL_USER_ID=${USER_ID}
+ - LOCAL_GROUP_ID=${GROUP_ID}
+ - DISABLE_UPDATE_QUERY=true
+ volumes:
+ - ${CURRENT_PWD}/aai-traversal/appconfig/janusgraph-realtime.properties:/opt/app/aai-traversal/resources/etc/appprops/janusgraph-realtime.properties
+ - ${CURRENT_PWD}/aai-traversal/appconfig/janusgraph-cached.properties:/opt/app/aai-traversal/resources/etc/appprops/janusgraph-cached.properties
+ - ${CURRENT_PWD}/aai-traversal/appconfig/aaiconfig.properties:/opt/app/aai-traversal/resources/etc/appprops/aaiconfig.properties
+ - ${CURRENT_PWD}/aai-traversal/appconfig/application.properties:/opt/app/aai-traversal/resources/application.properties
+ - ${CURRENT_PWD}/aai-traversal/appconfig/logback.xml:/opt/app/aai-traversal/resources/logback.xml
+ - ${CURRENT_PWD}/aai-traversal/appconfig/localhost-access-logback.xml:/opt/app/aai-traversal/resources/localhost-access-logback.xml
+ - ${CURRENT_PWD}/aai-traversal/appconfig/aai_keystore:/opt/app/aai-traversal/resources/etc/auth/aai_keystore
+ - ${CURRENT_PWD}/aai-traversal/appconfig/realm.properties:/opt/app/aai-traversal/resources/etc/auth/realm.properties
+ ports:
+ - 8446:8446
+ logging:
+ driver: "json-file"
+ options:
+ max-size: "30m"
+ max-file: "5"
+ aai.api.simpledemo.onap.org:
+ image: ${AAI_HAPROXY_IMAGE}:${HAPROXY_VERSION}
+ hostname: aai.api.simpledemo.onap.org
+ ports:
+ - 8443:8443
+ links:
+ - aai-resources.api.simpledemo.onap.org
+ - aai-traversal.api.simpledemo.onap.org
+ volumes:
+ - /dev/log:/dev/log
+ logging:
+ driver: "json-file"
+ options:
+ max-size: "30m"
+ max-file: "5"
+ aai.hbase.simpledemo.onap.org:
+ image: cassandra:2.1
+ hostname: aai.hbase.simpledemo.onap.org
+ ports:
+ - 7000:7000
+ - 7001:7001
+ - 7199:7199
+ - 9042:9042
+ environment:
+ - CASSANDRA_SEEDS=aai.hbase.simpledemo.onap.org
+ - CASSANDRA_DC=Heat
+ - CASSANDRA_RACK=Rack1
+ - CASSANDRA_AUTO_BOOTSTRAP=true
+ logging:
+ driver: "json-file"
+ options:
+ max-size: "30m"
+ max-file: "5"
+networks:
+ default:
+ driver: bridge
+ driver_opts:
+ com.docker.network.driver.mtu: ${MTU}
diff --git a/plans/aai/resources/setup.sh b/plans/aai/resources/setup.sh
new file mode 100644
index 00000000..bd5cb521
--- /dev/null
+++ b/plans/aai/resources/setup.sh
@@ -0,0 +1,113 @@
+#!/bin/bash
+#
+# Copyright © 2017 AT&T Intellectual Property.
+# All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+source ${SCRIPTS}/common_functions.sh
+
+NEXUS_USERNAME=$(cat /opt/config/nexus_username.txt)
+NEXUS_PASSWD=$(cat /opt/config/nexus_password.txt)
+NEXUS_DOCKER_REPO=$(cat /opt/config/nexus_docker_repo.txt)
+DOCKER_IMAGE_VERSION=$(cat /opt/config/docker_version.txt)
+DOCKER_REGISTRY=${NEXUS_DOCKER_REPO}
+DOCKER_IMAGE_VERSION=1.2-STAGING-latest
+
+export CURRENT_PWD=$(pwd);
+
+function wait_for_container() {
+
+ CONTAINER_NAME="$1";
+ START_TEXT="$2";
+
+ TIMEOUT=360
+
+ # wait for the real startup
+ AMOUNT_STARTUP=$(docker logs ${CONTAINER_NAME} 2>&1 | grep "$START_TEXT" | wc -l)
+ while [[ ${AMOUNT_STARTUP} -ne 1 ]];
+ do
+ echo "Waiting for '$CONTAINER_NAME' deployment to finish ..."
+ AMOUNT_STARTUP=$(docker logs ${CONTAINER_NAME} 2>&1 | grep "$START_TEXT" | wc -l)
+ if [ "$TIMEOUT" = "0" ];
+ then
+ docker logs ${CONTAINER_NAME};
+ echo "ERROR: $CONTAINER_NAME deployment failed."
+ exit 1
+ fi
+ let TIMEOUT-=1
+ sleep 1
+ done
+}
+
+DOCKER_COMPOSE_CMD="docker-compose";
+export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' | sort -n | head -1);
+export DOCKER_REGISTRY="nexus3.onap.org:10001";
+export AAI_HAPROXY_IMAGE="${AAI_HAPROXY_IMAGE:-aaionap/haproxy}";
+export HAPROXY_VERSION="${HAPROXY_VERSION:-1.2.0}";
+export HBASE_IMAGE="${HBASE_IMAGE:-aaionap/hbase}";
+export HBASE_VERSION="${HBASE_VERSION:-1.2.0}";
+
+docker pull ${HBASE_IMAGE}:${HBASE_VERSION};
+
+docker pull ${HBASE_IMAGE}:${HBASE_VERSION};
+docker pull ${DOCKER_REGISTRY}/onap/aai-resources:${DOCKER_IMAGE_VERSION};
+docker tag ${DOCKER_REGISTRY}/onap/aai-resources:${DOCKER_IMAGE_VERSION} ${DOCKER_REGISTRY}/onap/aai-resources:latest;
+
+docker pull ${DOCKER_REGISTRY}/onap/aai-traversal:${DOCKER_IMAGE_VERSION};
+docker tag ${DOCKER_REGISTRY}/onap/aai-traversal:${DOCKER_IMAGE_VERSION} ${DOCKER_REGISTRY}/onap/aai-traversal:latest;
+
+${DOCKER_COMPOSE_CMD} stop
+${DOCKER_COMPOSE_CMD} rm -f -v
+
+# Start the hbase where the data will be stored
+CASSANDRA_CONTAINER_NAME=$(${DOCKER_COMPOSE_CMD} up -d aai.hbase.simpledemo.onap.org 2>&1 | grep 'Creating' | grep -v 'volume' | grep -v 'network' | awk '{ print $2; }' | head -1);
+wait_for_container $CASSANDRA_CONTAINER_NAME 'Listening for thrift clients';
+
+USER_EXISTS=$(check_if_user_exists aaiadmin);
+
+function check_if_user_exists(){
+ local user_id=$1;
+
+ if [ -z "$user_id" ]; then
+ echo "Needs to provide at least one argument for check_if_user_exists func";
+ exit 1;
+ fi;
+
+ id -u ${user_id} > /dev/null 2>&1 && {
+ echo "1";
+ } || {
+ echo "0";
+ }
+}
+
+
+if [ "${USER_EXISTS}" -eq 0 ]; then
+ export USER_ID=9000;
+else
+ export USER_ID=$(id -u aaiadmin);
+fi;
+
+$DOCKER_COMPOSE_CMD run --rm aai-resources.api.simpledemo.onap.org createDBSchema.sh
+
+RESOURCES_CONTAINER_NAME=$(${DOCKER_COMPOSE_CMD} up -d aai-resources.api.simpledemo.onap.org 2>&1 | grep 'Creating' | grep -v 'volume' | grep -v 'network' | awk '{ print $2; }' | head -1);
+wait_for_container $RESOURCES_CONTAINER_NAME 'Resources Microservice Started';
+
+docker logs ${RESOURCES_CONTAINER_NAME};
+
+${DOCKER_COMPOSE_CMD} up -d aai-traversal.api.simpledemo.onap.org aai.api.simpledemo.onap.org
+echo "A&AI Microservices, resources and traversal, are up and running along with HAProxy";
+# Set the host ip for robot from the haproxy
+ROBOT_VARIABLES="-v HOST_IP:`ip addr show docker0 | head -3 | tail -1 | cut -d' ' -f6 | cut -d'/' -f1`"
diff --git a/plans/aai/resources/teardown.sh b/plans/aai/resources/teardown.sh
new file mode 100644
index 00000000..8dd6358d
--- /dev/null
+++ b/plans/aai/resources/teardown.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+#
+# Copyright © 2017 AT&T Intellectual Property.
+# Copyright © 2017 Amdocs
+# All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+DOCKER_COMPOSE_CMD="docker-compose";
+export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' | sort -n | head -1);
+export DOCKER_REGISTRY="nexus3.onap.org:10001";
+
+$DOCKER_COMPOSE_CMD stop
+$DOCKER_COMPOSE_CMD rm -f -v
+
diff --git a/plans/aai/resources/testplan.txt b/plans/aai/resources/testplan.txt
new file mode 100644
index 00000000..1e8902a5
--- /dev/null
+++ b/plans/aai/resources/testplan.txt
@@ -0,0 +1,6 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+aai/resources/api_suite
+aai/resources/relationship_suite
+aai/resources/error_handling_suite
+aai/resources/db_edge_rule \ No newline at end of file
diff --git a/plans/aai/search-data-service/appconfig/analysis-config.json b/plans/aai/search-data-service/appconfig/analysis-config.json
new file mode 100644
index 00000000..f98ea379
--- /dev/null
+++ b/plans/aai/search-data-service/appconfig/analysis-config.json
@@ -0,0 +1,32 @@
+[
+ {
+ "name": "whitespace_analyzer",
+ "description": "A standard whitespace analyzer.",
+ "behaviours": [
+ "Tokenize the text using white space characters as delimeters.",
+ "Convert all characters to lower case.",
+ "Convert all alphanumeric and symbolic Unicode characters above the first 127 ASCII characters into their ASCII equivalents."
+ ],
+ "tokenizer": "whitespace",
+ "filters": [
+ "lowercase",
+ "asciifolding"
+ ]
+ },
+ {
+ "name": "ngram_analyzer",
+ "description": "An analyzer which performs ngram filtering on the data stream.",
+ "behaviours": [
+ "Tokenize the text using white space characters as delimeters.",
+ "Convert all characters to lower case.",
+ "Convert all alphanumeric and symbolic Unicode characters above the first 127 ASCII characters into their ASCII equivalents.",
+ "Apply ngram filtering using the following values for minimum and maximum size in codepoints of a single n-gram: minimum = 1, maximum = 2."
+ ],
+ "tokenizer": "whitespace",
+ "filters": [
+ "lowercase",
+ "asciifolding",
+ "ngram_filter"
+ ]
+ }
+] \ No newline at end of file
diff --git a/plans/aai/search-data-service/appconfig/auth/search_policy.json b/plans/aai/search-data-service/appconfig/auth/search_policy.json
new file mode 100644
index 00000000..72d8902f
--- /dev/null
+++ b/plans/aai/search-data-service/appconfig/auth/search_policy.json
@@ -0,0 +1,18 @@
+{
+ "roles": [
+ {
+ "name": "admin",
+ "functions": [
+ {
+ "name": "search", "methods": [ { "name": "GET" },{ "name": "DELETE" }, { "name": "PUT" }, { "name": "POST" } ]
+ }
+ ],
+
+ "users": [
+ {
+ "username": "CN=ONAP, OU=ONAP, O=ONAP, L=Ottawa, ST=Ontario, C=CA"
+ }
+ ]
+ }
+ ]
+}
diff --git a/plans/aai/search-data-service/appconfig/auth/tomcat_keystore b/plans/aai/search-data-service/appconfig/auth/tomcat_keystore
new file mode 100644
index 00000000..9eec841a
--- /dev/null
+++ b/plans/aai/search-data-service/appconfig/auth/tomcat_keystore
Binary files differ
diff --git a/plans/aai/search-data-service/appconfig/elastic-search.properties b/plans/aai/search-data-service/appconfig/elastic-search.properties
new file mode 100644
index 00000000..5d9a37c0
--- /dev/null
+++ b/plans/aai/search-data-service/appconfig/elastic-search.properties
@@ -0,0 +1,6 @@
+# ElasticSearch Configuration
+
+es.cluster-name=ES_AAI
+es.http-port=9200
+
+## The IP address will be injected by the csit setup script
diff --git a/plans/aai/search-data-service/appconfig/filter-config.json b/plans/aai/search-data-service/appconfig/filter-config.json
new file mode 100644
index 00000000..e2d52858
--- /dev/null
+++ b/plans/aai/search-data-service/appconfig/filter-config.json
@@ -0,0 +1,7 @@
+[
+ {
+ "name": "ngram_filter",
+ "description": "Custom NGram Filter.",
+ "configuration": " \"type\": \"nGram\", \"min_gram\": 1, \"max_gram\": 50, \"token_chars\": [ \"letter\", \"digit\", \"punctuation\", \"symbol\" ]"
+ }
+] \ No newline at end of file
diff --git a/plans/aai/search-data-service/docker-compose.yml b/plans/aai/search-data-service/docker-compose.yml
new file mode 100644
index 00000000..d48c9fa0
--- /dev/null
+++ b/plans/aai/search-data-service/docker-compose.yml
@@ -0,0 +1,26 @@
+version: '2'
+services:
+ aai.searchservice.simpledemo.openecomp.org:
+ image: ${DOCKER_REGISTRY}/openecomp/search-data-service
+ hostname: aai.searchservice.simpledemo.openecomp.org
+ container_name: search-service-container
+ volumes:
+ - ${SEARCH_LOGS}:/logs
+ - ./appconfig:/opt/app/search-data-service/config
+ ports:
+ - 9509:9509
+ environment:
+ - CONFIG_HOME=/opt/app/search-data-service/config/
+ - KEY_STORE_PASSWORD=OBF:1y0q1uvc1uum1uvg1pil1pjl1uuq1uvk1uuu1y10
+ - KEY_MANAGER_PASSWORD=OBF:1y0q1uvc1uum1uvg1pil1pjl1uuq1uvk1uuu1y10
+ logging:
+ driver: "json-file"
+ options:
+ max-size: "30m"
+ max-file: "5"
+
+networks:
+ default:
+ driver: bridge
+ driver_opts:
+ com.docker.network.driver.mtu: ${MTU}
diff --git a/plans/aai/search-data-service/setup.sh b/plans/aai/search-data-service/setup.sh
new file mode 100644
index 00000000..60703b65
--- /dev/null
+++ b/plans/aai/search-data-service/setup.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+#
+# Copyright © 2017 AT&T Intellectual Property.
+# Copyright © 2017 Amdocs
+# All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+echo search service setup script running
+
+export SEARCH_LOGS="/opt/aai/logroot/AAI-SEARCH";
+export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' | sort -n | head -1);
+export DOCKER_REGISTRY="nexus3.onap.org:10001";
+
+# inject the current IP to the elastic-search config file
+echo "es.ip-address="`ip addr show docker0 | head -3 | tail -1 | cut -d' ' -f6 | cut -d'/' -f1` >> appconfig/elastic-search.properties
+
+docker run -d --name "stretchy" -p 9200:9200 -e "http.host=0.0.0.0" -e "transport.host=127.0.0.1" elasticsearch:2.4.6
+docker-compose -f docker-compose.yml up -d aai.searchservice.simpledemo.openecomp.org
+
+echo sleeping for 10 seconds while services start up
+sleep 10
+
+ROBOT_VARIABLES="-v HOST_IP:`ip addr show docker0 | head -3 | tail -1 | cut -d' ' -f6 | cut -d'/' -f1`"
+
diff --git a/plans/aai/search-data-service/teardown.sh b/plans/aai/search-data-service/teardown.sh
new file mode 100644
index 00000000..36d3e1da
--- /dev/null
+++ b/plans/aai/search-data-service/teardown.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+#
+# Copyright © 2017 AT&T Intellectual Property.
+# Copyright © 2017 Amdocs
+# All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+
+export SEARCH_LOGS="/opt/aai/logroot/AAI-SEARCH";
+export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' | sort -n | head -1);
+export DOCKER_REGISTRY="nexus3.onap.org:10001";
+
+docker-compose -f docker-compose.yml stop
+docker stop stretchy
+docker-compose -f docker-compose.yml rm -f -v
+docker rm stretchy
+
+# remove the line we injected into the elastic-search config
+sed -i '$ d' appconfig/elastic-search.properties
diff --git a/plans/aai/search-data-service/testplan.txt b/plans/aai/search-data-service/testplan.txt
new file mode 100644
index 00000000..b0a72a0f
--- /dev/null
+++ b/plans/aai/search-data-service/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+aai/search-data-service/suite1
diff --git a/plans/aai/traversal/aai-resources/appconfig/aai_keystore b/plans/aai/traversal/aai-resources/appconfig/aai_keystore
new file mode 100644
index 00000000..1ddef0c9
--- /dev/null
+++ b/plans/aai/traversal/aai-resources/appconfig/aai_keystore
Binary files differ
diff --git a/plans/aai/traversal/aai-resources/appconfig/aaiconfig.properties b/plans/aai/traversal/aai-resources/appconfig/aaiconfig.properties
new file mode 100644
index 00000000..435507a8
--- /dev/null
+++ b/plans/aai/traversal/aai-resources/appconfig/aaiconfig.properties
@@ -0,0 +1,119 @@
+#
+# ============LICENSE_START=======================================================
+# org.onap.aai
+# ================================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+####################################################################
+# REMEMBER TO THINK ABOUT ENVIRONMENTAL DIFFERENCES AND CHANGE THE
+# TEMPLATE AND *ALL* DATAFILES
+####################################################################
+
+####################################################################
+# REMEMBER TO THINK ABOUT ENVIRONMENTAL DIFFERENCES AND CHANGE THE
+# TEMPLATE AND *ALL* DATAFILES
+####################################################################
+
+aai.config.checktime=1000
+
+# this could come from siteconfig.pl?
+aai.config.nodename=AutomaticallyOverwritten
+
+
+
+aai.auth.cspcookies_on=false
+aai.dbmodel.filename=ex5.json
+
+aai.server.url.base=https://aai.api.simpledemo.onap.org:8443/aai/
+aai.server.url=https://aai.api.simpledemo.onap.org:8443/aai/v11/
+aai.global.callback.url=https://aai.api.simpledemo.onap.org:8443/aai/
+
+aai.tools.enableBasicAuth=true
+aai.tools.username=AAI
+aai.tools.password=AAI
+
+aai.truststore.filename=aai_keystore
+aai.truststore.passwd.x=OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0
+aai.keystore.filename=aai_keystore
+aai.keystore.passwd.x=OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0
+
+
+aai.notification.current.version=v11
+aai.notificationEvent.default.status=UNPROCESSED
+aai.notificationEvent.default.eventType=AAI-EVENT
+aai.notificationEvent.default.domain=dev
+aai.notificationEvent.default.sourceName=aai
+aai.notificationEvent.default.sequenceNumber=0
+aai.notificationEvent.default.severity=NORMAL
+aai.notificationEvent.default.version=v11
+# This one lets us enable/disable resource-version checking on updates/deletes
+aai.resourceversion.enableflag=true
+aai.logging.maxStackTraceEntries=10
+aai.default.api.version=v11
+
+
+
+# Used by Model-processing code
+aai.model.delete.sleep.per.vtx.msec=500
+aai.model.query.resultset.maxcount=50
+aai.model.query.timeout.sec=90
+
+# Used by Data Grooming
+aai.grooming.default.max.file=150
+aai.grooming.default.sleep.minutes=7
+
+aai.model.proc.max.levels=50
+aai.edgeTag.proc.max.levels=50
+
+# for transaction log
+aai.logging.hbase.interceptor=true
+aai.logging.hbase.enabled=true
+aai.logging.hbase.logrequest=true
+aai.logging.hbase.logresponse=true
+
+# for gremlin server
+aai.server.rebind=g
+hbase.table.name=aailogging.dev
+hbase.table.timestamp.format=YYYYMMdd-HH:mm:ss:SSS
+hbase.zookeeper.quorum=localhost
+hbase.zookeeper.property.clientPort=2181
+hbase.zookeeper.znode.parent=/hbase
+
+aai.logging.trace.enabled=true
+aai.logging.trace.logrequest=false
+aai.logging.trace.logresponse=false
+
+aai.transaction.logging=true
+aai.transaction.logging.get=false
+aai.transaction.logging.post=false
+
+#timeout for crud enabled flag
+aai.crud.timeoutenabled=true
+
+#timeout app specific -1 to bypass for that app id, a whole number to override the timeout with that value (in ms)
+aai.crud.timeout.appspecific=JUNITTESTAPP1,1|JUNITTESTAPP2,-1|DCAE-CCS,-1|DCAES,-1|AAIRctFeed,-1|NewvceCreator,-1|IANewvceCreator,-1|AAI-CSIOVALS,-1
+
+#default timeout limit added for crud if not overridden (in ms)
+aai.crud.timeoutlimit=100000
+#limit set for bulk consumer APIS
+aai.bulkconsumer.payloadlimit=30
+
+#uncomment and use header X-OverrideLimit with the value to override the bulk api limit
+#aai.bulkconsumer.payloadoverride=E6F04B93462CB5B0EDF41C05A9DDF5C3FE59748F
+aai.bulkconsumer.payloadoverride=false
diff --git a/plans/aai/traversal/aai-resources/appconfig/application.properties b/plans/aai/traversal/aai-resources/appconfig/application.properties
new file mode 100644
index 00000000..b9c51eaf
--- /dev/null
+++ b/plans/aai/traversal/aai-resources/appconfig/application.properties
@@ -0,0 +1,72 @@
+# The following info parameters are being referenced by ajsc6
+info.build.artifact=aai-resources
+info.build.name=resources
+info.build.description=Resources Microservice
+info.build.version=1.2.0
+
+spring.application.name=aai-resources
+spring.jersey.type=filter
+
+server.contextPath=/
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
+
+spring.profiles.active=production,dmaap
+#The max number of active threads in this pool
+server.tomcat.max-threads=200
+#The minimum number of threads always kept alive
+server.tomcat.min-Spare-Threads=25
+#The number of milliseconds before an idle thread shutsdown, unless the number of active threads are less or equal to minSpareThreads
+server.tomcat.max-idle-time=60000
+
+
+#Add this properties only if you want to change the URL, AJSC Framework interceptors will intercept
+#com.att.ajsc.common.interceptors.PreInterceptor.url=/**
+#com.att.ajsc.common.interceptors.PostInterceptor.url=/**
+
+#Servlet context parameters
+server.context_parameters.p-name=value #context parameter with p-name as key and value as value.
+kubernetes.namespace=org-onap-aai
+
+# If you get an application startup failure that the port is already taken
+# If thats not it, please check if the key-store file path makes sense
+server.local.startpath=aai-resources/src/main/resources/
+server.basic.auth.location=${server.local.startpath}etc/auth/realm.properties
+
+server.port=8447
+server.ssl.enabled-protocols=TLSv1.1,TLSv1.2
+server.ssl.key-store=${server.local.startpath}etc/auth/aai_keystore
+server.ssl.key-store-password=password(OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0)
+server.ssl.trust-store=${server.local.startpath}etc/auth/aai_keystore
+server.ssl.trust-store-password=password(OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0)
+server.ssl.client-auth=want
+server.ssl.key-store-type=JKS
+
+# JMS bind address host port
+jms.bind.address=tcp://localhost:61647
+dmaap.ribbon.eureka.enabled=false
+dmaap.ribbon.listOfServers=mr.api.simpledemo.onap.org:3904
+# Number of milliseconds to wait before making ping requests again
+dmaap.ribbon.ServerListRefreshInterval=75000
+dmaap.ribbon.NFLoadBalancerPingInterval=75000
+dmaap.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.AvailabilityFilteringRule
+dmaap.ribbon.NFLoadBalancerPingClassName=org.onap.aai.config.HttpPingImpl
+dmaap.ribbon.EnableMarkingServerDownOnReachingFailureLimit=true
+dmaap.ribbon.ServerDownFailureLimit=1
+# This needs to be verified but it seems that adding this property should automatically
+# Make the dmaap client change the url from http to https depending on the server
+dmaap.ribbon.securePorts=3905
+
+# Custom Dmaap Specific Configuration
+dmaap.ribbon.username=
+dmaap.ribbon.password=
+dmaap.ribbon.health.endpoint=/topics/AAI-EVENT
+# Number of seconds to wait for the ping to work and might need to increase this if the pings are all failing
+dmaap.ribbon.pingport.timeout=3
+
+niws.loadbalancer.dmaap.filterCircuitTripped=true
+niws.loadbalancer.dmaap.connectionFailureCountThreshold=3
+niws.loadbalancer.dmaap.circuitTripMaxTimeoutSeconds=180
+#dmaap.ribbon.retryableStatusCodes=404,503
+#dmaap.ribbon.retryableStatusCodes.MaxAutoRetriesNextServer=2
+#dmaap.ribbon.retryableStatusCodes.MaxAutoRetries=2
+#dmaap.ribbon.retryableStatusCodes.OkToRetryOnAllOperations=true
diff --git a/plans/aai/traversal/aai-resources/appconfig/janusgraph-cached.properties b/plans/aai/traversal/aai-resources/appconfig/janusgraph-cached.properties
new file mode 100644
index 00000000..c2110f77
--- /dev/null
+++ b/plans/aai/traversal/aai-resources/appconfig/janusgraph-cached.properties
@@ -0,0 +1,43 @@
+#
+# ============LICENSE_START=======================================================
+# org.onap.aai
+# ================================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+query.fast-property=true
+query.smart-limit=false
+
+# the following parameters are not reloaded automatically and require a manual bounce
+storage.backend=cassandra
+storage.hostname=aai.hbase.simpledemo.onap.org
+
+storage.cassandra.keyspace=aaigraph
+
+#schema.default=none
+storage.lock.wait-time=300
+storage.hbase.table=aaigraph-dev1.dev
+storage.hbase.ext.zookeeper.znode.parent=/hbase
+#caching on
+cache.db-cache = true
+cache.db-cache-clean-wait = 20
+cache.db-cache-time = 180000
+cache.db-cache-size = 0.3
+
+#load graphson file on startup
+load.snapshot.file=false
diff --git a/plans/aai/traversal/aai-resources/appconfig/janusgraph-realtime.properties b/plans/aai/traversal/aai-resources/appconfig/janusgraph-realtime.properties
new file mode 100644
index 00000000..4791431a
--- /dev/null
+++ b/plans/aai/traversal/aai-resources/appconfig/janusgraph-realtime.properties
@@ -0,0 +1,40 @@
+#
+# ============LICENSE_START=======================================================
+# org.onap.aai
+# ================================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+query.fast-property=true
+query.smart-limit=false
+
+# the following parameters are not reloaded automatically and require a manual bounce
+storage.backend=cassandra
+storage.hostname=aai.hbase.simpledemo.onap.org
+
+storage.cassandra.keyspace=aaigraph
+
+#schema.default=none
+storage.lock.wait-time=300
+storage.hbase.table=aaigraph-dev1.dev
+storage.hbase.ext.zookeeper.znode.parent=/hbase
+# Setting db-cache to false ensure the fastest propagation of changes across servers
+cache.db-cache = false
+
+#load graphson file on startup
+load.snapshot.file=false
diff --git a/plans/aai/traversal/aai-resources/appconfig/localhost-access-logback.xml b/plans/aai/traversal/aai-resources/appconfig/localhost-access-logback.xml
new file mode 100644
index 00000000..a318796c
--- /dev/null
+++ b/plans/aai/traversal/aai-resources/appconfig/localhost-access-logback.xml
@@ -0,0 +1,62 @@
+<!--
+
+ ============LICENSE_START=======================================================
+ org.onap.aai
+ ================================================================================
+ Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+
+ ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+-->
+<configuration>
+ <property name="AJSC_HOME" value="${AJSC_HOME:-.}" />
+ <appender name="ACCESS"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${AJSC_HOME}/logs/ajsc-jetty/localhost_access.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${AJSC_HOME}/logs/ajsc-jetty/localhost_access.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.CustomLogPatternLayoutEncoder">
+ <Pattern>%a %u %z [%t] "%m %U%q" %s %b %y %i{X-TransactionId} %i{X-FromAppId} %i{X-Forwarded-For} %i{X-AAI-SSL-Client-CN} %i{X-AAI-SSL-Client-OU} %i{X-AAI-SSL-Client-O} %i{X-AAI-SSL-Client-L} %i{X-AAI-SSL-Client-ST} %i{X-AAI-SSL-Client-C} %i{X-AAI-SSL-Client-NotBefore} %i{X-AAI-SSL-Client-NotAfter} %i{X-AAI-SSL-Client-DN} %D</Pattern>
+ </encoder>
+ </appender>
+ <appender-ref ref="ACCESS" />
+</configuration>
+
+<!--
+%a - Remote IP address
+%A - Local IP address
+%b - Bytes sent, excluding HTTP headers, or '-' if no bytes were sent
+%B - Bytes sent, excluding HTTP headers
+%h - Remote host name
+%H - Request protocol
+%l - Remote logical username from identd (always returns '-')
+%m - Request method
+%p - Local port
+%q - Query string (prepended with a '?' if it exists, otherwise an empty string
+%r - First line of the request
+%s - HTTP status code of the response
+%S - User session ID
+%t - Date and time, in Common Log Format format
+%u - Remote user that was authenticated
+%U - Requested URL path
+%v - Local server name
+%I - current request thread name (can compare later with stacktraces)
+
+%z - Custom pattern that parses the cert for the subject
+%y - Custom pattern determines rest or dme2
+ --> \ No newline at end of file
diff --git a/plans/aai/traversal/aai-resources/appconfig/logback.xml b/plans/aai/traversal/aai-resources/appconfig/logback.xml
new file mode 100644
index 00000000..ee7ee61a
--- /dev/null
+++ b/plans/aai/traversal/aai-resources/appconfig/logback.xml
@@ -0,0 +1,391 @@
+<!--
+
+ ============LICENSE_START=======================================================
+ org.onap.aai
+ ================================================================================
+ Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+
+ ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+-->
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+ <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
+
+ <property resource="application.properties" />
+
+ <property name="namespace" value="aai-resources"/>
+
+ <property name="AJSC_HOME" value="${AJSC_HOME:-.}" />
+ <jmxConfigurator />
+ <property name="logDirectory" value="${AJSC_HOME}/logs" />
+ <property name="eelfLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <property name="eelfAuditLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n|\r\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <property name="eelfMetricLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{targetEntity}|%X{targetServiceName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{targetVirtualEntity}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <!-- <property name="eelfErrorLogPattern" value="%ecompStartTime|%X{requestId}|%-10t|%X{serviceName}|%X{partnerName}|%X{targetEntity}|%X{targetServiceName}|%ecompErrorCategory|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n|\r\n', '^'}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/> -->
+ <property name="eelfErrorLogPattern" value="%ecompStartTime|%X{requestId}|%-10t|%X{serviceName}|%X{partnerName}|%X{targetEntity}|%X{targetServiceName}|%ecompErrorCategory|%ecompResponseCode|%ecompResponseDescription|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <property name="eelfTransLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{partnerName}:%m%n"/>
+
+ <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
+ <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
+ <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>
+ %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
+ </pattern>
+ </encoder>
+ </appender>
+
+ <appender name="SANE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/rest/sane.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/sane.log.%d{yyyy-MM-dd}</fileNamePattern>
+ </rollingPolicy>
+ <encoder>
+ <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n
+ </pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncSANE" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="SANE" />
+ </appender>
+
+ <appender name="METRIC"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>INFO</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <file>${logDirectory}/rest/metrics.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/metrics.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfMetricLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncMETRIC" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="METRIC" />
+ </appender>
+
+ <appender name="DEBUG"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>DEBUG</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <file>${logDirectory}/rest/debug.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/debug.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncDEBUG" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="DEBUG" />
+ </appender>
+
+ <appender name="ERROR"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>WARN</level>
+ </filter>
+ <file>${logDirectory}/rest/error.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/error.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfErrorLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncERROR" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="ERROR" />
+ </appender>
+
+ <appender name="AUDIT"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/rest/audit.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/audit.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfAuditLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncAUDIT" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="AUDIT" />
+ </appender>
+
+ <appender name="translog"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>DEBUG</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <file>${logDirectory}/rest/translog.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/translog.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfTransLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asynctranslog" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="translog" />
+ </appender>
+
+ <appender name="dmaapAAIEventConsumer"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>WARN</level>
+ </filter>
+ <File>${logDirectory}/dmaapAAIEventConsumer/error.log</File>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/dmaapAAIEventConsumer/error.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="dmaapAAIEventConsumerDebug"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>DEBUG</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <File>${logDirectory}/dmaapAAIEventConsumer/debug.log</File>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/dmaapAAIEventConsumer/debug.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="dmaapAAIEventConsumerMetric"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>INFO</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <File>${logDirectory}/dmaapAAIEventConsumer/metrics.log</File>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/dmaapAAIEventConsumer/metrics.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfMetricLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="external"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>WARN</level>
+ </filter>
+ <file>${logDirectory}/external/external.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/external/external.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <logger name="org.onap.aai" level="DEBUG" additivity="false">
+ <appender-ref ref="asyncDEBUG" />
+ <appender-ref ref="asyncERROR" />
+ <appender-ref ref="asyncMETRIC" />
+ <appender-ref ref="asyncSANE" />
+ </logger>
+
+ <!-- Spring related loggers -->
+ <logger name="org.springframework" level="WARN" />
+ <logger name="org.springframework.beans" level="WARN" />
+ <logger name="org.springframework.web" level="WARN" />
+ <logger name="com.blog.spring.jms" level="WARN" />
+ <logger name="com.jayway.jsonpath" level="WARN" />
+
+ <!-- AJSC Services (bootstrap services) -->
+ <logger name="ajsc" level="WARN" />
+ <logger name="ajsc.RouteMgmtService" level="WARN" />
+ <logger name="ajsc.ComputeService" level="WARN" />
+ <logger name="ajsc.VandelayService" level="WARN" />
+ <logger name="ajsc.FilePersistenceService" level="WARN" />
+ <logger name="ajsc.UserDefinedJarService" level="WARN" />
+ <logger name="ajsc.UserDefinedBeansDefService" level="WARN" />
+ <logger name="ajsc.LoggingConfigurationService" level="WARN" />
+
+ <!-- AJSC related loggers (DME2 Registration, csi logging, restlet, servlet
+ logging) -->
+ <logger name="org.codehaus.groovy" level="WARN" />
+ <logger name="com.att.scamper" level="WARN" />
+ <logger name="ajsc.utils" level="WARN" />
+ <logger name="ajsc.utils.DME2Helper" level="WARN" />
+ <logger name="ajsc.filters" level="WARN" />
+ <logger name="ajsc.beans.interceptors" level="WARN" />
+ <logger name="ajsc.restlet" level="WARN" />
+ <logger name="ajsc.servlet" level="WARN" />
+ <logger name="com.att.ajsc" level="WARN" />
+ <logger name="com.att.ajsc.csi.logging" level="WARN" />
+ <logger name="com.att.ajsc.filemonitor" level="WARN" />
+ <logger name="com.netflix.loadbalancer" level="WARN" />
+
+ <logger name="org.apache.zookeeper" level="OFF" />
+
+ <!-- Other Loggers that may help troubleshoot -->
+ <logger name="net.sf" level="WARN" />
+ <logger name="org.apache.commons.httpclient" level="WARN" />
+ <logger name="org.apache.commons" level="WARN" />
+ <logger name="org.apache.coyote" level="WARN" />
+ <logger name="org.apache.jasper" level="WARN" />
+
+ <!-- Camel Related Loggers (including restlet/servlet/jaxrs/cxf logging.
+ May aid in troubleshooting) -->
+ <logger name="org.apache.camel" level="WARN" />
+ <logger name="org.apache.cxf" level="WARN" />
+ <logger name="org.apache.camel.processor.interceptor" level="WARN" />
+ <logger name="org.apache.cxf.jaxrs.interceptor" level="WARN" />
+ <logger name="org.apache.cxf.service" level="WARN" />
+ <logger name="org.restlet" level="WARN" />
+ <logger name="org.apache.camel.component.restlet" level="WARN" />
+
+ <logger name="org.hibernate.validator" level="WARN" />
+ <logger name="org.hibernate" level="WARN" />
+ <logger name="org.hibernate.ejb" level="OFF" />
+
+ <!-- logback internals logging -->
+ <logger name="ch.qos.logback.classic" level="WARN" />
+ <logger name="ch.qos.logback.core" level="WARN" />
+
+ <logger name="org.eclipse.jetty" level="WARN" />
+
+ <!-- logback jms appenders & loggers definition starts here -->
+ <appender name="auditLogs"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter" />
+ <file>${logDirectory}/perf-audit/Audit-${lrmRVer}-${lrmRO}-${Pid}.log
+ </file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/perf-audit/Audit-${lrmRVer}-${lrmRO}-${Pid}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>"%d [%thread] %-5level %logger{1024} - %msg%n"</pattern>
+ </encoder>
+ </appender>
+ <appender name="perfLogs"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter" />
+ <file>${logDirectory}/perf-audit/Perform-${lrmRVer}-${lrmRO}-${Pid}.log
+ </file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/perf-audit/Perform-${lrmRVer}-${lrmRO}-${Pid}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>"%d [%thread] %-5level %logger{1024} - %msg%n"</pattern>
+ </encoder>
+ </appender>
+ <logger name="AuditRecord" level="INFO" additivity="false">
+ <appender-ref ref="auditLogs" />
+ </logger>
+ <logger name="AuditRecord_DirectCall" level="INFO" additivity="false">
+ <appender-ref ref="auditLogs" />
+ </logger>
+ <logger name="PerfTrackerRecord" level="INFO" additivity="false">
+ <appender-ref ref="perfLogs" />
+ </logger>
+ <!-- logback jms appenders & loggers definition ends here -->
+
+ <logger name="org.onap.aai.interceptors.post" level="DEBUG"
+ additivity="false">
+ <appender-ref ref="asynctranslog" />
+ </logger>
+
+ <logger name="org.onap.aai.interceptors.pre.SetLoggingContext" level="DEBUG">
+ <appender-ref ref="asyncAUDIT"/>
+ </logger>
+
+ <logger name="org.onap.aai.interceptors.post.ResetLoggingContext" level="DEBUG">
+ <appender-ref ref="asyncAUDIT"/>
+ </logger>
+
+ <logger name="org.onap.aai.dmaap" level="DEBUG" additivity="false">
+ <appender-ref ref="dmaapAAIEventConsumer" />
+ <appender-ref ref="dmaapAAIEventConsumerDebug" />
+ <appender-ref ref="dmaapAAIEventConsumerMetric" />
+ </logger>
+
+ <logger name="org.apache" level="OFF" />
+ <logger name="org.zookeeper" level="OFF" />
+ <logger name="com.thinkaurelius" level="WARN" />
+ <logger name="com.att.aft.dme2" level="WARN" />
+
+ <!-- ============================================================================ -->
+ <!-- General EELF logger -->
+ <!-- ============================================================================ -->
+ <logger name="com.att.eelf" level="WARN" additivity="false">
+ <appender-ref ref="asyncDEBUG" />
+ <appender-ref ref="asyncERROR" />
+ <appender-ref ref="asyncMETRIC" />
+ </logger>
+
+ <root level="DEBUG">
+ <appender-ref ref="external" />
+ </root>
+</configuration>
diff --git a/plans/aai/traversal/aai-resources/appconfig/realm.properties b/plans/aai/traversal/aai-resources/appconfig/realm.properties
new file mode 100644
index 00000000..fb692cc3
--- /dev/null
+++ b/plans/aai/traversal/aai-resources/appconfig/realm.properties
@@ -0,0 +1,12 @@
+# format : username: password[,rolename ...]
+# default username/password: AAI/AAI, MSO/MSO, ModelLoader/ModelLoader...
+AAI:OBF:1gfr1ev31gg7,admin
+MSO:OBF:1jzx1lz31k01,admin
+SDNC:OBF:1itr1i0l1i151isv,admin
+DCAE:OBF:1g8u1f9d1f991g8w,admin
+POLICY:OBF:1mk61i171ima1im41i0j1mko,admin
+ASDC:OBF:1f991j0u1j001f9d,admin
+VID:OBF:1jm91i0v1jl9,admin
+APPC:OBF:1f991ksf1ksf1f9d,admin
+ModelLoader:OBF:1qvu1v2h1sov1sar1wfw1j7j1wg21saj1sov1v1x1qxw,admin
+AaiUI:OBF:1gfr1p571unz1p4j1gg7,admin
diff --git a/plans/aai/traversal/aai-traversal/appconfig/aai_keystore b/plans/aai/traversal/aai-traversal/appconfig/aai_keystore
new file mode 100644
index 00000000..1ddef0c9
--- /dev/null
+++ b/plans/aai/traversal/aai-traversal/appconfig/aai_keystore
Binary files differ
diff --git a/plans/aai/traversal/aai-traversal/appconfig/aaiconfig.properties b/plans/aai/traversal/aai-traversal/appconfig/aaiconfig.properties
new file mode 100644
index 00000000..cef10903
--- /dev/null
+++ b/plans/aai/traversal/aai-traversal/appconfig/aaiconfig.properties
@@ -0,0 +1,114 @@
+#
+# ============LICENSE_START=======================================================
+# org.onap.aai
+# ================================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+####################################################################
+# REMEMBER TO THINK ABOUT ENVIRONMENTAL DIFFERENCES AND CHANGE THE
+# TEMPLATE AND *ALL* DATAFILES
+####################################################################
+
+####################################################################
+# REMEMBER TO THINK ABOUT ENVIRONMENTAL DIFFERENCES AND CHANGE THE
+# TEMPLATE AND *ALL* DATAFILES
+####################################################################
+
+aai.config.checktime=1000
+
+# this could come from siteconfig.pl?
+aai.config.nodename=AutomaticallyOverwritten
+
+
+
+aai.auth.cspcookies_on=false
+aai.dbmodel.filename=ex5.json
+
+aai.server.url.base=https://aai.api.simpledemo.onap.org:8443/aai/
+aai.server.url=https://aai.api.simpledemo.onap.org:8443/aai/v11/
+aai.global.callback.url=https://aai.api.simpledemo.onap.org:8443/aai/
+
+aai.tools.enableBasicAuth=true
+aai.tools.username=AAI
+aai.tools.password=AAI
+
+aai.truststore.filename=aai_keystore
+aai.truststore.passwd.x=OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0
+aai.keystore.filename=aai_keystore
+aai.keystore.passwd.x=OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0
+
+
+aai.notification.current.version=v11
+aai.notificationEvent.default.status=UNPROCESSED
+aai.notificationEvent.default.eventType=AAI-EVENT
+aai.notificationEvent.default.domain=dev
+aai.notificationEvent.default.sourceName=aai
+aai.notificationEvent.default.sequenceNumber=0
+aai.notificationEvent.default.severity=NORMAL
+aai.notificationEvent.default.version=v11
+# This one lets us enable/disable resource-version checking on updates/deletes
+aai.resourceversion.enableflag=true
+aai.logging.maxStackTraceEntries=10
+aai.default.api.version=v11
+
+
+
+# Used by Model-processing code
+aai.model.delete.sleep.per.vtx.msec=500
+aai.model.query.resultset.maxcount=50
+aai.model.query.timeout.sec=90
+
+# Used by Data Grooming
+aai.grooming.default.max.file=150
+aai.grooming.default.sleep.minutes=7
+
+aai.model.proc.max.levels=50
+aai.edgeTag.proc.max.levels=50
+
+# for transaction log
+aai.logging.hbase.interceptor=true
+aai.logging.hbase.enabled=true
+aai.logging.hbase.logrequest=true
+aai.logging.hbase.logresponse=true
+
+# for gremlin server
+aai.server.rebind=g
+hbase.table.name=aailogging.dev
+hbase.table.timestamp.format=YYYYMMdd-HH:mm:ss:SSS
+hbase.zookeeper.quorum=localhost
+hbase.zookeeper.property.clientPort=2181
+hbase.zookeeper.znode.parent=/hbase
+
+aai.logging.trace.enabled=true
+aai.logging.trace.logrequest=false
+aai.logging.trace.logresponse=false
+
+aai.transaction.logging=true
+aai.transaction.logging.get=false
+aai.transaction.logging.post=false
+
+#timeout for traversal enabled flag
+aai.traversal.timeoutenabled=true
+
+#timeout app specific
+aai.traversal.timeout.appspecific=JUNITTESTAPP1,1|JUNITTESTAPP2,-1|DCAE-CCS,-1|DCAES,-1|AAI-FILEGEN-GFPIP,-1
+
+#default timeout limit added for traversal if not overridden (in ms)
+aai.traversal.timeoutlimit=180000
+
diff --git a/plans/aai/traversal/aai-traversal/appconfig/application.properties b/plans/aai/traversal/aai-traversal/appconfig/application.properties
new file mode 100644
index 00000000..0292512c
--- /dev/null
+++ b/plans/aai/traversal/aai-traversal/appconfig/application.properties
@@ -0,0 +1,72 @@
+# The following info parameters are being referenced by ajsc6
+info.build.artifact=aai-traversal
+info.build.name=traversal
+info.build.description=Traversal Microservice
+info.build.version=1.2.0
+
+spring.application.name=aai-traversal
+spring.jersey.type=filter
+
+server.contextPath=/
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
+
+spring.profiles.active=production,dmaap
+#The max number of active threads in this pool
+server.tomcat.max-threads=200
+#The minimum number of threads always kept alive
+server.tomcat.min-Spare-Threads=25
+#The number of milliseconds before an idle thread shutsdown, unless the number of active threads are less or equal to minSpareThreads
+server.tomcat.max-idle-time=60000
+
+
+#Add this properties only if you want to change the URL, AJSC Framework interceptors will intercept
+#com.att.ajsc.common.interceptors.PreInterceptor.url=/**
+#com.att.ajsc.common.interceptors.PostInterceptor.url=/**
+
+#Servlet context parameters
+server.context_parameters.p-name=value #context parameter with p-name as key and value as value.
+kubernetes.namespace=org-onap-aai
+
+# If you get an application startup failure that the port is already taken
+# If thats not it, please check if the key-store file path makes sense
+server.local.startpath=aai-traversal/src/main/resources/
+server.basic.auth.location=${server.local.startpath}etc/auth/realm.properties
+
+server.port=8446
+server.ssl.enabled-protocols=TLSv1.1,TLSv1.2
+server.ssl.key-store=${server.local.startpath}etc/auth/aai_keystore
+server.ssl.key-store-password=password(OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0)
+server.ssl.trust-store=${server.local.startpath}etc/auth/aai_keystore
+server.ssl.trust-store-password=password(OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0)
+server.ssl.client-auth=want
+server.ssl.key-store-type=JKS
+
+# JMS bind address host port
+jms.bind.address=tcp://localhost:61647
+dmaap.ribbon.eureka.enabled=false
+dmaap.ribbon.listOfServers=mr.api.simpledemo.onap.org:3904
+# Number of milliseconds to wait before making ping requests again
+dmaap.ribbon.ServerListRefreshInterval=75000
+dmaap.ribbon.NFLoadBalancerPingInterval=75000
+dmaap.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.AvailabilityFilteringRule
+dmaap.ribbon.NFLoadBalancerPingClassName=org.onap.aai.config.HttpPingImpl
+dmaap.ribbon.EnableMarkingServerDownOnReachingFailureLimit=true
+dmaap.ribbon.ServerDownFailureLimit=1
+# This needs to be verified but it seems that adding this property should automatically
+# Make the dmaap client change the url from http to https depending on the server
+dmaap.ribbon.securePorts=3905
+
+# Custom Dmaap Specific Configuration
+dmaap.ribbon.username=
+dmaap.ribbon.password=
+dmaap.ribbon.health.endpoint=/topics/AAI-EVENT
+# Number of seconds to wait for the ping to work and might need to increase this if the pings are all failing
+dmaap.ribbon.pingport.timeout=3
+
+niws.loadbalancer.dmaap.filterCircuitTripped=true
+niws.loadbalancer.dmaap.connectionFailureCountThreshold=3
+niws.loadbalancer.dmaap.circuitTripMaxTimeoutSeconds=180
+#dmaap.ribbon.retryableStatusCodes=404,503
+#dmaap.ribbon.retryableStatusCodes.MaxAutoRetriesNextServer=2
+#dmaap.ribbon.retryableStatusCodes.MaxAutoRetries=2
+#dmaap.ribbon.retryableStatusCodes.OkToRetryOnAllOperations=true
diff --git a/plans/aai/traversal/aai-traversal/appconfig/janusgraph-cached.properties b/plans/aai/traversal/aai-traversal/appconfig/janusgraph-cached.properties
new file mode 100644
index 00000000..c2110f77
--- /dev/null
+++ b/plans/aai/traversal/aai-traversal/appconfig/janusgraph-cached.properties
@@ -0,0 +1,43 @@
+#
+# ============LICENSE_START=======================================================
+# org.onap.aai
+# ================================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+query.fast-property=true
+query.smart-limit=false
+
+# the following parameters are not reloaded automatically and require a manual bounce
+storage.backend=cassandra
+storage.hostname=aai.hbase.simpledemo.onap.org
+
+storage.cassandra.keyspace=aaigraph
+
+#schema.default=none
+storage.lock.wait-time=300
+storage.hbase.table=aaigraph-dev1.dev
+storage.hbase.ext.zookeeper.znode.parent=/hbase
+#caching on
+cache.db-cache = true
+cache.db-cache-clean-wait = 20
+cache.db-cache-time = 180000
+cache.db-cache-size = 0.3
+
+#load graphson file on startup
+load.snapshot.file=false
diff --git a/plans/aai/traversal/aai-traversal/appconfig/janusgraph-realtime.properties b/plans/aai/traversal/aai-traversal/appconfig/janusgraph-realtime.properties
new file mode 100644
index 00000000..4791431a
--- /dev/null
+++ b/plans/aai/traversal/aai-traversal/appconfig/janusgraph-realtime.properties
@@ -0,0 +1,40 @@
+#
+# ============LICENSE_START=======================================================
+# org.onap.aai
+# ================================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+query.fast-property=true
+query.smart-limit=false
+
+# the following parameters are not reloaded automatically and require a manual bounce
+storage.backend=cassandra
+storage.hostname=aai.hbase.simpledemo.onap.org
+
+storage.cassandra.keyspace=aaigraph
+
+#schema.default=none
+storage.lock.wait-time=300
+storage.hbase.table=aaigraph-dev1.dev
+storage.hbase.ext.zookeeper.znode.parent=/hbase
+# Setting db-cache to false ensure the fastest propagation of changes across servers
+cache.db-cache = false
+
+#load graphson file on startup
+load.snapshot.file=false
diff --git a/plans/aai/traversal/aai-traversal/appconfig/localhost-access-logback.xml b/plans/aai/traversal/aai-traversal/appconfig/localhost-access-logback.xml
new file mode 100644
index 00000000..a318796c
--- /dev/null
+++ b/plans/aai/traversal/aai-traversal/appconfig/localhost-access-logback.xml
@@ -0,0 +1,62 @@
+<!--
+
+ ============LICENSE_START=======================================================
+ org.onap.aai
+ ================================================================================
+ Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+
+ ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+-->
+<configuration>
+ <property name="AJSC_HOME" value="${AJSC_HOME:-.}" />
+ <appender name="ACCESS"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${AJSC_HOME}/logs/ajsc-jetty/localhost_access.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${AJSC_HOME}/logs/ajsc-jetty/localhost_access.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.CustomLogPatternLayoutEncoder">
+ <Pattern>%a %u %z [%t] "%m %U%q" %s %b %y %i{X-TransactionId} %i{X-FromAppId} %i{X-Forwarded-For} %i{X-AAI-SSL-Client-CN} %i{X-AAI-SSL-Client-OU} %i{X-AAI-SSL-Client-O} %i{X-AAI-SSL-Client-L} %i{X-AAI-SSL-Client-ST} %i{X-AAI-SSL-Client-C} %i{X-AAI-SSL-Client-NotBefore} %i{X-AAI-SSL-Client-NotAfter} %i{X-AAI-SSL-Client-DN} %D</Pattern>
+ </encoder>
+ </appender>
+ <appender-ref ref="ACCESS" />
+</configuration>
+
+<!--
+%a - Remote IP address
+%A - Local IP address
+%b - Bytes sent, excluding HTTP headers, or '-' if no bytes were sent
+%B - Bytes sent, excluding HTTP headers
+%h - Remote host name
+%H - Request protocol
+%l - Remote logical username from identd (always returns '-')
+%m - Request method
+%p - Local port
+%q - Query string (prepended with a '?' if it exists, otherwise an empty string
+%r - First line of the request
+%s - HTTP status code of the response
+%S - User session ID
+%t - Date and time, in Common Log Format format
+%u - Remote user that was authenticated
+%U - Requested URL path
+%v - Local server name
+%I - current request thread name (can compare later with stacktraces)
+
+%z - Custom pattern that parses the cert for the subject
+%y - Custom pattern determines rest or dme2
+ --> \ No newline at end of file
diff --git a/plans/aai/traversal/aai-traversal/appconfig/logback.xml b/plans/aai/traversal/aai-traversal/appconfig/logback.xml
new file mode 100644
index 00000000..31bfe10c
--- /dev/null
+++ b/plans/aai/traversal/aai-traversal/appconfig/logback.xml
@@ -0,0 +1,391 @@
+<!--
+
+ ============LICENSE_START=======================================================
+ org.onap.aai
+ ================================================================================
+ Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+
+ ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+-->
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+ <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
+
+ <property resource="application.properties" />
+
+ <property name="namespace" value="aai-traversal"/>
+
+ <property name="AJSC_HOME" value="${AJSC_HOME:-.}" />
+ <jmxConfigurator />
+ <property name="logDirectory" value="${AJSC_HOME}/logs" />
+ <property name="eelfLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <property name="eelfAuditLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n|\r\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <property name="eelfMetricLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{targetEntity}|%X{targetServiceName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{targetVirtualEntity}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <!-- <property name="eelfErrorLogPattern" value="%ecompStartTime|%X{requestId}|%-10t|%X{serviceName}|%X{partnerName}|%X{targetEntity}|%X{targetServiceName}|%ecompErrorCategory|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n|\r\n', '^'}|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/> -->
+ <property name="eelfErrorLogPattern" value="%ecompStartTime|%X{requestId}|%-10t|%X{serviceName}|%X{partnerName}|%X{targetEntity}|%X{targetServiceName}|%ecompErrorCategory|%ecompResponseCode|%ecompResponseDescription|co=%X{component}:%replace(%replace(%m){'\\|', '!'}){'\r|\n', '^'}%n"/>
+ <property name="eelfTransLogPattern" value="%ecompStartTime|%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ, UTC}|%X{requestId}|%X{serviceInstanceId}|%-10t|%X{serverName}|%X{serviceName}|%X{partnerName}|%X{statusCode}|%X{responseCode}|%replace(%replace(%X{responseDescription}){'\\|', '!'}){'\r|\n', '^'}|%X{instanceUUID}|%level|%X{severity}|%X{serverIpAddress}|%ecompElapsedTime|%X{server}|%X{clientIpAddress}|%eelfClassOfCaller|%X{unused}|%X{processKey}|%X{customField1}|%X{customField2}|%X{customField3}|%X{customField4}|co=%X{partnerName}:%m%n"/>
+
+ <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
+ <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
+ <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>
+ %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
+ </pattern>
+ </encoder>
+ </appender>
+
+ <appender name="SANE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/rest/sane.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/sane.log.%d{yyyy-MM-dd}</fileNamePattern>
+ </rollingPolicy>
+ <encoder>
+ <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n
+ </pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncSANE" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="SANE" />
+ </appender>
+
+ <appender name="METRIC"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>INFO</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <file>${logDirectory}/rest/metrics.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/metrics.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfMetricLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncMETRIC" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="METRIC" />
+ </appender>
+
+ <appender name="DEBUG"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>DEBUG</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <file>${logDirectory}/rest/debug.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/debug.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncDEBUG" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="DEBUG" />
+ </appender>
+
+ <appender name="ERROR"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>WARN</level>
+ </filter>
+ <file>${logDirectory}/rest/error.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/error.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfErrorLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncERROR" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="ERROR" />
+ </appender>
+
+ <appender name="AUDIT"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/rest/audit.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/audit.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfAuditLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncAUDIT" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="AUDIT" />
+ </appender>
+
+ <appender name="translog"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>DEBUG</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <file>${logDirectory}/rest/translog.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/rest/translog.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfTransLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asynctranslog" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>1000</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="translog" />
+ </appender>
+
+ <appender name="dmaapAAIEventConsumer"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>WARN</level>
+ </filter>
+ <File>${logDirectory}/dmaapAAIEventConsumer/error.log</File>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/dmaapAAIEventConsumer/error.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="dmaapAAIEventConsumerDebug"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>DEBUG</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <File>${logDirectory}/dmaapAAIEventConsumer/debug.log</File>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/dmaapAAIEventConsumer/debug.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="dmaapAAIEventConsumerMetric"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>INFO</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <File>${logDirectory}/dmaapAAIEventConsumer/metrics.log</File>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/dmaapAAIEventConsumer/metrics.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfMetricLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="external"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>WARN</level>
+ </filter>
+ <file>${logDirectory}/external/external.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${logDirectory}/external/external.log.%d{yyyy-MM-dd}
+ </fileNamePattern>
+ </rollingPolicy>
+ <encoder class="org.onap.aai.logging.EcompEncoder">
+ <pattern>${eelfLogPattern}</pattern>
+ </encoder>
+ </appender>
+ <logger name="org.onap.aai" level="DEBUG" additivity="false">
+ <appender-ref ref="asyncDEBUG" />
+ <appender-ref ref="asyncERROR" />
+ <appender-ref ref="asyncMETRIC" />
+ <appender-ref ref="asyncSANE" />
+ </logger>
+
+ <!-- Spring related loggers -->
+ <logger name="org.springframework" level="WARN" />
+ <logger name="org.springframework.beans" level="WARN" />
+ <logger name="org.springframework.web" level="WARN" />
+ <logger name="com.blog.spring.jms" level="WARN" />
+ <logger name="com.jayway.jsonpath" level="WARN" />
+
+ <!-- AJSC Services (bootstrap services) -->
+ <logger name="ajsc" level="WARN" />
+ <logger name="ajsc.RouteMgmtService" level="WARN" />
+ <logger name="ajsc.ComputeService" level="WARN" />
+ <logger name="ajsc.VandelayService" level="WARN" />
+ <logger name="ajsc.FilePersistenceService" level="WARN" />
+ <logger name="ajsc.UserDefinedJarService" level="WARN" />
+ <logger name="ajsc.UserDefinedBeansDefService" level="WARN" />
+ <logger name="ajsc.LoggingConfigurationService" level="WARN" />
+
+ <!-- AJSC related loggers (DME2 Registration, csi logging, restlet, servlet
+ logging) -->
+ <logger name="org.codehaus.groovy" level="WARN" />
+ <logger name="com.att.scamper" level="WARN" />
+ <logger name="ajsc.utils" level="WARN" />
+ <logger name="ajsc.utils.DME2Helper" level="WARN" />
+ <logger name="ajsc.filters" level="WARN" />
+ <logger name="ajsc.beans.interceptors" level="WARN" />
+ <logger name="ajsc.restlet" level="WARN" />
+ <logger name="ajsc.servlet" level="WARN" />
+ <logger name="com.att.ajsc" level="WARN" />
+ <logger name="com.att.ajsc.csi.logging" level="WARN" />
+ <logger name="com.att.ajsc.filemonitor" level="WARN" />
+ <logger name="com.netflix.loadbalancer" level="WARN" />
+
+ <logger name="org.apache.zookeeper" level="OFF" />
+
+ <!-- Other Loggers that may help troubleshoot -->
+ <logger name="net.sf" level="WARN" />
+ <logger name="org.apache.commons.httpclient" level="WARN" />
+ <logger name="org.apache.commons" level="WARN" />
+ <logger name="org.apache.coyote" level="WARN" />
+ <logger name="org.apache.jasper" level="WARN" />
+
+ <!-- Camel Related Loggers (including restlet/servlet/jaxrs/cxf logging.
+ May aid in troubleshooting) -->
+ <logger name="org.apache.camel" level="WARN" />
+ <logger name="org.apache.cxf" level="WARN" />
+ <logger name="org.apache.camel.processor.interceptor" level="WARN" />
+ <logger name="org.apache.cxf.jaxrs.interceptor" level="WARN" />
+ <logger name="org.apache.cxf.service" level="WARN" />
+ <logger name="org.restlet" level="WARN" />
+ <logger name="org.apache.camel.component.restlet" level="WARN" />
+
+ <logger name="org.hibernate.validator" level="WARN" />
+ <logger name="org.hibernate" level="WARN" />
+ <logger name="org.hibernate.ejb" level="OFF" />
+
+ <!-- logback internals logging -->
+ <logger name="ch.qos.logback.classic" level="WARN" />
+ <logger name="ch.qos.logback.core" level="WARN" />
+
+ <logger name="org.eclipse.jetty" level="WARN" />
+
+ <!-- logback jms appenders & loggers definition starts here -->
+ <appender name="auditLogs"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter" />
+ <file>${logDirectory}/perf-audit/Audit-${lrmRVer}-${lrmRO}-${Pid}.log
+ </file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/perf-audit/Audit-${lrmRVer}-${lrmRO}-${Pid}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>"%d [%thread] %-5level %logger{1024} - %msg%n"</pattern>
+ </encoder>
+ </appender>
+ <appender name="perfLogs"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter" />
+ <file>${logDirectory}/perf-audit/Perform-${lrmRVer}-${lrmRO}-${Pid}.log
+ </file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/perf-audit/Perform-${lrmRVer}-${lrmRO}-${Pid}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>"%d [%thread] %-5level %logger{1024} - %msg%n"</pattern>
+ </encoder>
+ </appender>
+ <logger name="AuditRecord" level="INFO" additivity="false">
+ <appender-ref ref="auditLogs" />
+ </logger>
+ <logger name="AuditRecord_DirectCall" level="INFO" additivity="false">
+ <appender-ref ref="auditLogs" />
+ </logger>
+ <logger name="PerfTrackerRecord" level="INFO" additivity="false">
+ <appender-ref ref="perfLogs" />
+ </logger>
+ <!-- logback jms appenders & loggers definition ends here -->
+
+ <logger name="org.onap.aai.interceptors.post" level="DEBUG"
+ additivity="false">
+ <appender-ref ref="asynctranslog" />
+ </logger>
+
+ <logger name="org.onap.aai.interceptors.pre.SetLoggingContext" level="DEBUG">
+ <appender-ref ref="asyncAUDIT"/>
+ </logger>
+
+ <logger name="org.onap.aai.interceptors.post.ResetLoggingContext" level="DEBUG">
+ <appender-ref ref="asyncAUDIT"/>
+ </logger>
+
+ <logger name="org.onap.aai.dmaap" level="DEBUG" additivity="false">
+ <appender-ref ref="dmaapAAIEventConsumer" />
+ <appender-ref ref="dmaapAAIEventConsumerDebug" />
+ <appender-ref ref="dmaapAAIEventConsumerMetric" />
+ </logger>
+
+ <logger name="org.apache" level="OFF" />
+ <logger name="org.zookeeper" level="OFF" />
+ <logger name="com.thinkaurelius" level="WARN" />
+ <logger name="com.att.aft.dme2" level="WARN" />
+
+ <!-- ============================================================================ -->
+ <!-- General EELF logger -->
+ <!-- ============================================================================ -->
+ <logger name="com.att.eelf" level="WARN" additivity="false">
+ <appender-ref ref="asyncDEBUG" />
+ <appender-ref ref="asyncERROR" />
+ <appender-ref ref="asyncMETRIC" />
+ </logger>
+
+ <root level="DEBUG">
+ <appender-ref ref="external" />
+ </root>
+</configuration>
diff --git a/plans/aai/traversal/aai-traversal/appconfig/realm.properties b/plans/aai/traversal/aai-traversal/appconfig/realm.properties
new file mode 100644
index 00000000..fb692cc3
--- /dev/null
+++ b/plans/aai/traversal/aai-traversal/appconfig/realm.properties
@@ -0,0 +1,12 @@
+# format : username: password[,rolename ...]
+# default username/password: AAI/AAI, MSO/MSO, ModelLoader/ModelLoader...
+AAI:OBF:1gfr1ev31gg7,admin
+MSO:OBF:1jzx1lz31k01,admin
+SDNC:OBF:1itr1i0l1i151isv,admin
+DCAE:OBF:1g8u1f9d1f991g8w,admin
+POLICY:OBF:1mk61i171ima1im41i0j1mko,admin
+ASDC:OBF:1f991j0u1j001f9d,admin
+VID:OBF:1jm91i0v1jl9,admin
+APPC:OBF:1f991ksf1ksf1f9d,admin
+ModelLoader:OBF:1qvu1v2h1sov1sar1wfw1j7j1wg21saj1sov1v1x1qxw,admin
+AaiUI:OBF:1gfr1p571unz1p4j1gg7,admin
diff --git a/plans/aai/traversal/docker-compose.yml b/plans/aai/traversal/docker-compose.yml
new file mode 100644
index 00000000..6f62e6ef
--- /dev/null
+++ b/plans/aai/traversal/docker-compose.yml
@@ -0,0 +1,86 @@
+version: '2'
+services:
+ aai-resources.api.simpledemo.onap.org:
+ image: ${DOCKER_REGISTRY}/onap/aai-resources
+ hostname: aai-resources.api.simpledemo.onap.org
+ environment:
+ - LOCAL_USER_ID=${USER_ID}
+ - LOCAL_GROUP_ID=${GROUP_ID}
+ - SKIP_CREATE_DB_SCHEMA_AT_STARTUP=true
+ ports:
+ - 8447:8447
+ volumes:
+ - ${CURRENT_PWD}/aai-resources/appconfig/janusgraph-realtime.properties:/opt/app/aai-resources/resources/etc/appprops/janusgraph-realtime.properties
+ - ${CURRENT_PWD}/aai-resources/appconfig/janusgraph-cached.properties:/opt/app/aai-resources/resources/etc/appprops/janusgraph-cached.properties
+ - ${CURRENT_PWD}/aai-resources/appconfig/aaiconfig.properties:/opt/app/aai-resources/resources/etc/appprops/aaiconfig.properties
+ - ${CURRENT_PWD}/aai-resources/appconfig/application.properties:/opt/app/aai-resources/resources/application.properties
+ - ${CURRENT_PWD}/aai-resources/appconfig/logback.xml:/opt/app/aai-resources/resources/logback.xml
+ - ${CURRENT_PWD}/aai-resources/appconfig/localhost-access-logback.xml:/opt/app/aai-resources/resources/localhost-access-logback.xml
+ - ${CURRENT_PWD}/aai-resources/appconfig/aai_keystore:/opt/app/aai-resources/resources/etc/auth/aai_keystore
+ - ${CURRENT_PWD}/aai-resources/appconfig/realm.properties:/opt/app/aai-resources/resources/etc/auth/realm.properties
+ logging:
+ driver: "json-file"
+ options:
+ max-size: "30m"
+ max-file: "5"
+ aai-traversal.api.simpledemo.onap.org:
+ image: ${DOCKER_REGISTRY}/onap/aai-traversal
+ hostname: aai-traversal.api.simpledemo.onap.org
+ environment:
+ - LOCAL_USER_ID=${USER_ID}
+ - LOCAL_GROUP_ID=${GROUP_ID}
+ - DISABLE_UPDATE_QUERY=true
+ volumes:
+ - ${CURRENT_PWD}/aai-traversal/appconfig/janusgraph-realtime.properties:/opt/app/aai-traversal/resources/etc/appprops/janusgraph-realtime.properties
+ - ${CURRENT_PWD}/aai-traversal/appconfig/janusgraph-cached.properties:/opt/app/aai-traversal/resources/etc/appprops/janusgraph-cached.properties
+ - ${CURRENT_PWD}/aai-traversal/appconfig/aaiconfig.properties:/opt/app/aai-traversal/resources/etc/appprops/aaiconfig.properties
+ - ${CURRENT_PWD}/aai-traversal/appconfig/application.properties:/opt/app/aai-traversal/resources/application.properties
+ - ${CURRENT_PWD}/aai-traversal/appconfig/logback.xml:/opt/app/aai-traversal/resources/logback.xml
+ - ${CURRENT_PWD}/aai-traversal/appconfig/localhost-access-logback.xml:/opt/app/aai-traversal/resources/localhost-access-logback.xml
+ - ${CURRENT_PWD}/aai-traversal/appconfig/aai_keystore:/opt/app/aai-traversal/resources/etc/auth/aai_keystore
+ - ${CURRENT_PWD}/aai-traversal/appconfig/realm.properties:/opt/app/aai-traversal/resources/etc/auth/realm.properties
+ ports:
+ - 8446:8446
+ logging:
+ driver: "json-file"
+ options:
+ max-size: "30m"
+ max-file: "5"
+ aai.api.simpledemo.onap.org:
+ image: ${AAI_HAPROXY_IMAGE}:${HAPROXY_VERSION}
+ hostname: aai.api.simpledemo.onap.org
+ ports:
+ - 8443:8443
+ links:
+ - aai-resources.api.simpledemo.onap.org
+ - aai-traversal.api.simpledemo.onap.org
+ volumes:
+ - /dev/log:/dev/log
+ logging:
+ driver: "json-file"
+ options:
+ max-size: "30m"
+ max-file: "5"
+ aai.hbase.simpledemo.onap.org:
+ image: cassandra:2.1
+ hostname: aai.hbase.simpledemo.onap.org
+ ports:
+ - 7000:7000
+ - 7001:7001
+ - 7199:7199
+ - 9042:9042
+ environment:
+ - CASSANDRA_SEEDS=aai.hbase.simpledemo.onap.org
+ - CASSANDRA_DC=Heat
+ - CASSANDRA_RACK=Rack1
+ - CASSANDRA_AUTO_BOOTSTRAP=true
+ logging:
+ driver: "json-file"
+ options:
+ max-size: "30m"
+ max-file: "5"
+networks:
+ default:
+ driver: bridge
+ driver_opts:
+ com.docker.network.driver.mtu: ${MTU}
diff --git a/plans/aai/traversal/setup.sh b/plans/aai/traversal/setup.sh
new file mode 100644
index 00000000..70dda84b
--- /dev/null
+++ b/plans/aai/traversal/setup.sh
@@ -0,0 +1,119 @@
+#!/bin/bash
+#
+# Copyright © 2017 AT&T Intellectual Property.
+# All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+source ${SCRIPTS}/common_functions.sh
+
+NEXUS_USERNAME=$(cat /opt/config/nexus_username.txt)
+NEXUS_PASSWD=$(cat /opt/config/nexus_password.txt)
+NEXUS_DOCKER_REPO=$(cat /opt/config/nexus_docker_repo.txt)
+DOCKER_IMAGE_VERSION=$(cat /opt/config/docker_version.txt)
+DOCKER_REGISTRY=${NEXUS_DOCKER_REPO}
+DOCKER_IMAGE_VERSION=1.2-STAGING-latest
+
+export CURRENT_PWD=$(pwd);
+
+function wait_for_container() {
+
+ CONTAINER_NAME="$1";
+ START_TEXT="$2";
+
+ TIMEOUT=360
+
+ # wait for the real startup
+ AMOUNT_STARTUP=$(docker logs ${CONTAINER_NAME} 2>&1 | grep "$START_TEXT" | wc -l)
+ while [[ ${AMOUNT_STARTUP} -ne 1 ]];
+ do
+ echo "Waiting for '$CONTAINER_NAME' deployment to finish ..."
+ AMOUNT_STARTUP=$(docker logs ${CONTAINER_NAME} 2>&1 | grep "$START_TEXT" | wc -l)
+ if [ "$TIMEOUT" = "0" ];
+ then
+ docker logs ${CONTAINER_NAME};
+ echo "ERROR: $CONTAINER_NAME deployment failed."
+ exit 1
+ fi
+ let TIMEOUT-=1
+ sleep 1
+ done
+}
+
+DOCKER_COMPOSE_CMD="docker-compose";
+export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' | sort -n | head -1);
+export DOCKER_REGISTRY="nexus3.onap.org:10001";
+export AAI_HAPROXY_IMAGE="${AAI_HAPROXY_IMAGE:-aaionap/haproxy}";
+export HAPROXY_VERSION="${HAPROXY_VERSION:-1.2.0}";
+export HBASE_IMAGE="${HBASE_IMAGE:-aaionap/hbase}";
+export HBASE_VERSION="${HBASE_VERSION:-1.2.0}";
+
+docker pull ${HBASE_IMAGE}:${HBASE_VERSION};
+
+docker pull ${DOCKER_REGISTRY}/onap/aai-resources:${DOCKER_IMAGE_VERSION};
+docker tag ${DOCKER_REGISTRY}/onap/aai-resources:${DOCKER_IMAGE_VERSION} ${DOCKER_REGISTRY}/onap/aai-resources:latest;
+
+docker pull ${DOCKER_REGISTRY}/onap/aai-traversal:${DOCKER_IMAGE_VERSION};
+docker tag ${DOCKER_REGISTRY}/onap/aai-traversal:${DOCKER_IMAGE_VERSION} ${DOCKER_REGISTRY}/onap/aai-traversal:latest;
+
+${DOCKER_COMPOSE_CMD} stop
+${DOCKER_COMPOSE_CMD} rm -f -v
+
+# Start the hbase where the data will be stored
+CASSANDRA_CONTAINER_NAME=$(${DOCKER_COMPOSE_CMD} up -d aai.hbase.simpledemo.onap.org 2>&1 | grep 'Creating' | grep -v 'volume' | grep -v 'network' | awk '{ print $2; }' | head -1);
+wait_for_container $CASSANDRA_CONTAINER_NAME 'Listening for thrift clients';
+
+USER_EXISTS=$(check_if_user_exists aaiadmin);
+
+function check_if_user_exists(){
+ local user_id=$1;
+
+ if [ -z "$user_id" ]; then
+ echo "Needs to provide at least one argument for check_if_user_exists func";
+ exit 1;
+ fi;
+
+ id -u ${user_id} > /dev/null 2>&1 && {
+ echo "1";
+ } || {
+ echo "0";
+ }
+}
+
+
+if [ "${USER_EXISTS}" -eq 0 ]; then
+ export USER_ID=9000;
+ export GROUP_ID=9000;
+else
+ export USER_ID=$(id -u aaiadmin);
+ export GROUP_ID=$(id -g aaiadmin);
+fi;
+
+$DOCKER_COMPOSE_CMD run --rm aai-resources.api.simpledemo.onap.org createDBSchema.sh
+
+RESOURCES_CONTAINER_NAME=$(${DOCKER_COMPOSE_CMD} up -d aai-resources.api.simpledemo.onap.org 2>&1 | grep 'Creating' | grep -v 'volume' | grep -v 'network' | awk '{ print $2; }' | head -1);
+wait_for_container $RESOURCES_CONTAINER_NAME 'Resources Microservice Started';
+
+${DOCKER_COMPOSE_CMD} up -d aai-traversal.api.simpledemo.onap.org aai.api.simpledemo.onap.org
+TRAVERSAL_CONTAINER_NAME=$(echo $RESOURCES_CONTAINER_NAME | sed 's/aai-resources/aai-traversal/g');
+
+$DOCKER_COMPOSE_CMD run --rm aai-traversal.api.simpledemo.onap.org install/updateQueryData.sh
+
+echo "A&AI Microservices, resources and traversal, are up and running along with HAProxy";
+
+wait_for_container $TRAVERSAL_CONTAINER_NAME 'Traversal Microservice Started';
+
+# Set the host ip for robot from the haproxy
+ROBOT_VARIABLES="-v HOST_IP:`ip addr show docker0 | head -3 | tail -1 | cut -d' ' -f6 | cut -d'/' -f1`"
diff --git a/plans/aai/traversal/teardown.sh b/plans/aai/traversal/teardown.sh
new file mode 100644
index 00000000..8dd6358d
--- /dev/null
+++ b/plans/aai/traversal/teardown.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+#
+# Copyright © 2017 AT&T Intellectual Property.
+# Copyright © 2017 Amdocs
+# All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+DOCKER_COMPOSE_CMD="docker-compose";
+export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' | sort -n | head -1);
+export DOCKER_REGISTRY="nexus3.onap.org:10001";
+
+$DOCKER_COMPOSE_CMD stop
+$DOCKER_COMPOSE_CMD rm -f -v
+
diff --git a/plans/aai/traversal/testplan.txt b/plans/aai/traversal/testplan.txt
new file mode 100644
index 00000000..9b48bf9b
--- /dev/null
+++ b/plans/aai/traversal/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+aai/traversal/suite1
diff --git a/plans/appc/healthcheck/bundle_query.sh b/plans/appc/healthcheck/bundle_query.sh
new file mode 100755
index 00000000..3801d0a1
--- /dev/null
+++ b/plans/appc/healthcheck/bundle_query.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+###############################################################################
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+###############################################################################
+SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+echo $SCRIPTS
+
+
+num_bundles=$(docker exec appc_controller_container /opt/opendaylight/current/bin/client bundle:list | tail -1 | cut -d\| -f1)
+#num_failed_bundles=$(docker exec appc_controller_container /opt/opendaylight/current/bin/client bundle:list | grep Failure | wc -l)
+num_failed_bundles=$(docker exec appc_controller_container /opt/opendaylight/current/bin/client bundle:list | grep Failure | wc -l)
+failed_bundles=$(docker exec appc_controller_container /opt/opendaylight/current/bin/client bundle:list | grep Failure)
+
+echo "There are $num_failed_bundles failed bundles out of $num_bundles installed bundles."
+
+if [ "$num_failed_bundles" -ge 1 ] || [ "$num_bundles" == "" ]; then
+ echo "There are $num_bundles bundles with $num_failed_bundles in a failed state. "
+ echo "The following bundle(s) are in a failed state: "
+ echo " $failed_bundles"
+ exit 1;
+fi
+
+exit 0
diff --git a/plans/appc/healthcheck/db_query.sh b/plans/appc/healthcheck/db_query.sh
new file mode 100755
index 00000000..70829a13
--- /dev/null
+++ b/plans/appc/healthcheck/db_query.sh
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+###############################################################################
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+###############################################################################
+SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+echo $SCRIPTS
+
+sdnctl_num_tables=$(docker exec -i sdnc_db_container mysql -s -D sdnctl -u sdnctl -pgamma <<<'show tables;' 2>/dev/null | grep -v ERROR | wc -l)
+
+appcctl_num_tables=$(docker exec -i sdnc_db_container mysql -s -D appcctl -u appcctl -pappcctl <<<'show tables;' 2>/dev/null | grep -v ERROR | wc -l)
+
+
+
+docker exec -i sdnc_db_container mysql -s -D sdnctl -u sdnctl -pgamma <<<"show tables" 2>/dev/null | ( while read table_name; do
+export $table_name="$(docker exec -i sdnc_db_container mysql -s -D sdnctl -u sdnctl -pgamma <<<"select count(*) from $table_name" 2>/dev/null)"
+done
+
+if [ "$sdnctl_num_tables" -ge "1" ]; then
+ echo "There are $sdnctl_num_tables tables in the sdnctl database. "
+else
+ echo "Database sdnctl is not available."
+ exit 1;
+fi
+
+if [ "$appcctl_num_tables" -ge "1" ]; then
+ echo "There is $appcctl_num_tables table in the appcctl database. "
+else
+ echo "Database appcctl is not available."
+ exit 1;
+fi
+
+#if [ "$NODE_TYPES" -eq "0" ]; then
+# echo "There is no data in table NODE_TYPES. "
+# exit 1;
+#fi
+
+#if [ "$SVC_LOGIC" -eq "0" ] ; then
+# echo "There is no data in table SVC_LOGIC. "
+# exit 1;
+#fi
+
+#if [ "$VNF_DG_MAPPING" -eq "0" ]; then
+# echo "There is no data in table VNF_DG_MAPPING. "
+# exit 1;
+#fi
+
+echo "Expected table data is present."
+exit 0 )
+
+if [ "$?" -eq "1" ]; then
+ exit 1;
+fi
+
+exit 0
diff --git a/plans/appc/healthcheck/health_check.sh b/plans/appc/healthcheck/health_check.sh
new file mode 100755
index 00000000..775188f6
--- /dev/null
+++ b/plans/appc/healthcheck/health_check.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+###############################################################################
+# Copyright 2018 AT&T
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+###############################################################################
+SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+echo $SCRIPTS
+
+response=$(curl --write-out '%{http_code}' --silent --output /dev/null -H "Authorization: Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ==" -X POST -H "X-FromAppId: csit-appc" -H "X-TransactionId: csit-appc" -H "Accept: application/json" -H "Content-Type: application/json" http://localhost:8282/restconf/operations/SLI-API:healthcheck )
+
+if [ "$response" == "200" ]; then
+ echo "APPC health check passed."
+ exit 0;
+fi
+
+echo "APPC health check failed with response code ${response}."
+exit 1
diff --git a/plans/appc/healthcheck/setup.sh b/plans/appc/healthcheck/setup.sh
new file mode 100755
index 00000000..da441ea5
--- /dev/null
+++ b/plans/appc/healthcheck/setup.sh
@@ -0,0 +1,85 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+# Place the scripts in run order:
+SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+source ${WORKSPACE}/test/csit/scripts/appc/script1.sh
+
+export APPC_DOCKER_IMAGE_VERSION=1.4.0-SNAPSHOT-latest
+export CCSDK_DOCKER_IMAGE_VERSION=0.2-STAGING-latest
+export BRANCH=master
+export SOLUTION_NAME=onap
+
+export NEXUS_USERNAME=docker
+export NEXUS_PASSWD=docker
+export NEXUS_DOCKER_REPO=nexus3.onap.org:10001
+export DMAAP_TOPIC=AUTO
+
+export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' | sort -n | head -1)
+
+if [ "$MTU" == "" ]; then
+ export MTU="1450"
+fi
+
+
+# Clone APPC repo to get docker-compose for APPC
+mkdir -p $WORKSPACE/archives/appc
+cd $WORKSPACE/archives
+git clone -b $BRANCH --single-branch http://gerrit.onap.org/r/appc/deployment.git appc
+cd $WORKSPACE/archives/appc
+git pull
+cd $WORKSPACE/archives/appc/docker-compose
+sed -i "s/DMAAP_TOPIC_ENV=.*/DMAAP_TOPIC_ENV="$DMAAP_TOPIC"/g" docker-compose.yml
+docker login -u $NEXUS_USERNAME -p $NEXUS_PASSWD $NEXUS_DOCKER_REPO
+docker pull $NEXUS_DOCKER_REPO/${SOLUTION_NAME}/appc-image:$APPC_DOCKER_IMAGE_VERSION
+docker tag $NEXUS_DOCKER_REPO/${SOLUTION_NAME}/appc-image:$APPC_DOCKER_IMAGE_VERSION ${SOLUTION_NAME}/appc-image:latest
+docker pull $NEXUS_DOCKER_REPO/${SOLUTION_NAME}/ccsdk-dgbuilder-image:$CCSDK_DOCKER_IMAGE_VERSION
+docker tag $NEXUS_DOCKER_REPO/${SOLUTION_NAME}/ccsdk-dgbuilder-image:$CCSDK_DOCKER_IMAGE_VERSION ${SOLUTION_NAME}/ccsdk-dgbuilder-image:latest
+docker pull $NEXUS_DOCKER_REPO/${SOLUTION_NAME}/appc-cdt-image:$APPC_DOCKER_IMAGE_VERSION
+docker tag $NEXUS_DOCKER_REPO/${SOLUTION_NAME}/appc-cdt-image:$APPC_DOCKER_IMAGE_VERSION ${SOLUTION_NAME}/appc-cdt-image:latest
+
+# start APPC containers with docker compose and configuration from docker-compose.yml
+docker-compose up -d
+# WAIT 5 minutes maximum and test every 5 seconds if APPC is up using HealthCheck API
+TIME_OUT=2000
+INTERVAL=30
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+
+startODL_status=$(docker exec appc_controller_container ps -e | grep startODL | wc -l)
+waiting_bundles=$(docker exec appc_controller_container /opt/opendaylight/current/bin/client bundle:list | grep Waiting | wc -l)
+run_level=$(docker exec appc_controller_container /opt/opendaylight/current/bin/client system:start-level)
+
+ if [ "$run_level" == "Level 100" ] && [ "$startODL_status" -lt "1" ] && [ "$waiting_bundles" -lt "1" ] ; then
+ echo APPC started in $TIME seconds
+ break;
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if APPC is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]; then
+ echo TIME OUT: Docker containers not started in $TIME_OUT seconds... Could cause problems for testing activities...
+fi
+
+sleep 300
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v SCRIPTS:${SCRIPTS}"
diff --git a/plans/appc/healthcheck/teardown.sh b/plans/appc/healthcheck/teardown.sh
new file mode 100755
index 00000000..94d1bc77
--- /dev/null
+++ b/plans/appc/healthcheck/teardown.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+kill-instance.sh appc_controller_container
+kill-instance.sh ccsdk_dgbuilder_container
+kill-instance.sh appc_cdt_container
+kill-instance.sh sdnc_db_container
+
+# $WORKSPACE/archives/appc deleted with archives folder when tests starts so we keep it at the end for debugging
diff --git a/plans/appc/healthcheck/testplan.txt b/plans/appc/healthcheck/testplan.txt
new file mode 100644
index 00000000..97d82786
--- /dev/null
+++ b/plans/appc/healthcheck/testplan.txt
@@ -0,0 +1,5 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+appc/healthcheck
+appc/cdt
+
diff --git a/plans/ccsdk/healthcheck/health_check.sh b/plans/ccsdk/healthcheck/health_check.sh
new file mode 100644
index 00000000..ffc766fe
--- /dev/null
+++ b/plans/ccsdk/healthcheck/health_check.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+###############################################################################
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+###############################################################################
+SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+echo $SCRIPTS
+
+unset http_proxy https_proxy
+
+response=$(curl --write-out '%{http_code}' --silent --output /dev/null -H "Authorization: Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ==" -X POST -H "X-FromAppId: csit-sdnc" -H "X-TransactionId: csit-ccsdk" -H "Accept: application/json" -H "Content-Type: application/json" http://localhost:8383/restconf/operations/SLI-API:healthcheck )
+
+if [ "$response" == "200" ]; then
+ echo "CCSDK health check passed."
+ exit 0;
+fi
+
+echo "CCSDK health check failed with response code ${response}."
+exit 1
diff --git a/plans/ccsdk/healthcheck/setup.sh b/plans/ccsdk/healthcheck/setup.sh
new file mode 100644
index 00000000..bdb5b550
--- /dev/null
+++ b/plans/ccsdk/healthcheck/setup.sh
@@ -0,0 +1,125 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+# Place the scripts in run order:
+SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+source ${WORKSPACE}/test/csit/scripts/ccsdk/script1.sh
+
+export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' | sort -n | head -1)
+export NEXUS_DOCKER_REPO="nexus3.onap.org:10001"
+export NEXUS_USERNAME=docker
+export NEXUS_PASSWD=docker
+export DMAAP_TOPIC=AUTO
+export CCSDK_DOCKER_IMAGE_VERSION=0.3-STAGING-latest
+
+if [ "$MTU" == "" ]; then
+ export MTU="1450"
+fi
+
+
+# Clone CCSDK repo to get docker-compose for CCSDK
+mkdir -p $WORKSPACE/archives/ccsdk
+cd $WORKSPACE/archives
+git clone -b master --single-branch http://gerrit.onap.org/r/ccsdk/distribution.git ccsdk
+cd $WORKSPACE/archives/ccsdk
+git pull
+unset http_proxy https_proxy
+cd $WORKSPACE/archives/ccsdk/src/main/yaml
+
+sed -i "s/DMAAP_TOPIC_ENV=.*/DMAAP_TOPIC_ENV="AUTO"/g" docker-compose.yml
+docker login -u $NEXUS_USERNAME -p $NEXUS_PASSWD $NEXUS_DOCKER_REPO
+
+docker pull $NEXUS_DOCKER_REPO/onap/ccsdk-odl-image:$CCSDK_DOCKER_IMAGE_VERSION
+docker tag $NEXUS_DOCKER_REPO/onap/ccsdk-odl-image:$CCSDK_DOCKER_IMAGE_VERSION onap/ccsdk-odl-image:0.3-STAGING-latest
+
+docker pull $NEXUS_DOCKER_REPO/onap/ccsdk-dgbuilder-image:$CCSDK_DOCKER_IMAGE_VERSION
+docker tag $NEXUS_DOCKER_REPO/onap/ccsdk-dgbuilder-image:$CCSDK_DOCKER_IMAGE_VERSION onap/ccsdk-dgbuilder-image:0.3-STAGING-latest
+
+docker pull $NEXUS_DOCKER_REPO/onap/ccsdk-odlsli-image:$CCSDK_DOCKER_IMAGE_VERSION
+docker tag $NEXUS_DOCKER_REPO/onap/ccsdk-odlsli-image:$CCSDK_DOCKER_IMAGE_VERSION onap/ccsdk-odlsli-image:0.3-STAGING-latest
+
+# start CCSDK containers with docker compose and configuration from docker-compose.yml
+curl -L https://github.com/docker/compose/releases/download/1.9.0/docker-compose-`uname -s`-`uname -m` > docker-compose
+chmod +x docker-compose
+./docker-compose up -d
+
+# WAIT 5 minutes maximum and test every 5 seconds if CCSDK is up using HealthCheck API
+TIME_OUT=500
+INTERVAL=30
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+ response=$(curl --write-out '%{http_code}' --silent --output /dev/null -H "Authorization: Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ==" -X POST -H "X-FromAppId: csit-ccsdk" -H "X-TransactionId: csit-ccsdk" -H "Accept: application/json" -H "Content-Type: application/json" http://localhost:8383/restconf/operations/SLI-API:healthcheck ); echo $response
+
+ if [ "$response" == "200" ]; then
+ echo CCSDK started in $TIME seconds
+ break;
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if CCSDK is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]; then
+ echo TIME OUT: Docker containers not started in $TIME_OUT seconds... Could cause problems for testing activities...
+fi
+
+#sleep 800
+
+TIME_OUT=1500
+INTERVAL=60
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+
+docker exec ccsdk_odlsli_container rm -f /opt/opendaylight/current/etc/host.key
+response=$(docker exec ccsdk_odlsli_container /opt/opendaylight/current/bin/client system:start-level)
+docker exec ccsdk_odlsli_container rm -f /opt/opendaylight/current/etc/host.key
+num_bundles=$(docker exec ccsdk_odlsli_container /opt/opendaylight/current/bin/client bundle:list | tail -1 | cut -d\| -f1)
+
+ if [ "$response" == "Level 100" ] && [ "$num_bundles" -ge 333 ]; then
+ echo CCSDK karaf started in $TIME seconds
+ break;
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if CCSDK is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]; then
+ echo TIME OUT: karaf session not started in $TIME_OUT seconds... Could cause problems for testing activities...
+fi
+
+response=$(docker exec ccsdk_odlsli_container /opt/opendaylight/current/bin/client system:start-level)
+num_bundles=$(docker exec ccsdk_odlsli_container /opt/opendaylight/current/bin/client bundle:list | tail -1 | cut -d\| -f1)
+
+ if [ "$response" == "Level 100" ] && [ "$num_bundles" -ge 333 ]; then
+ num_bundles=$(docker exec ccsdk_odlsli_container /opt/opendaylight/current/bin/client bundle:list | tail -1 | cut -d\| -f1)
+ num_failed_bundles=$(docker exec ccsdk_odlsli_container /opt/opendaylight/current/bin/client bundle:list | grep Failure | wc -l)
+ failed_bundles=$(docker exec ccsdk_odlsli_container /opt/opendaylight/current/bin/client bundle:list | grep Failure)
+ echo There is/are $num_failed_bundles failed bundles out of $num_bundles installed bundles.
+ fi
+
+if [ "$num_failed_bundles" -ge 1 ]; then
+ echo "The following bundle(s) are in a failed state: "
+ echo " $failed_bundles"
+fi
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v SCRIPTS:${SCRIPTS}"
+
diff --git a/plans/ccsdk/healthcheck/teardown.sh b/plans/ccsdk/healthcheck/teardown.sh
new file mode 100644
index 00000000..56820786
--- /dev/null
+++ b/plans/ccsdk/healthcheck/teardown.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+kill-instance.sh ccsdk_db_container
+kill-instance.sh ccsdk_dgbuilder_container
+kill-instance.sh ccsdk_odlsli_container
+
+# $WORKSPACE/archives/appc deleted with archives folder when tests starts so we keep it at the end for debugging
diff --git a/plans/ccsdk/healthcheck/testplan.txt b/plans/ccsdk/healthcheck/testplan.txt
new file mode 100644
index 00000000..affe635b
--- /dev/null
+++ b/plans/ccsdk/healthcheck/testplan.txt
@@ -0,0 +1,4 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+ccsdk/healthcheck
+
diff --git a/plans/clamp/APIs/setup.sh b/plans/clamp/APIs/setup.sh
new file mode 100755
index 00000000..bb7a8144
--- /dev/null
+++ b/plans/clamp/APIs/setup.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+# Place the scripts in run order:
+
+source ${WORKSPACE}/test/csit/scripts/clamp/clone_clamp_and_change_dockercompose.sh
+
+source ${WORKSPACE}/test/csit/scripts/clamp/start_clamp_containers.sh
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+#ROBOT_VARIABLES="-v TEST:${TEST}"
+
diff --git a/plans/clamp/APIs/teardown.sh b/plans/clamp/APIs/teardown.sh
new file mode 100755
index 00000000..07067e60
--- /dev/null
+++ b/plans/clamp/APIs/teardown.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+source ${WORKSPACE}/test/csit/scripts/clamp/kill_and_remove_clamp_and_db_containers.sh
+
+# $WORKSPACE/archives/clamp-clone deleted with archives folder when tests starts so we keep it at the end for debugging
diff --git a/plans/clamp/APIs/testplan.txt b/plans/clamp/APIs/testplan.txt
new file mode 100644
index 00000000..9d328f52
--- /dev/null
+++ b/plans/clamp/APIs/testplan.txt
@@ -0,0 +1,4 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+clamp/APIs
+
diff --git a/plans/clamp/UIs/setup.sh b/plans/clamp/UIs/setup.sh
new file mode 100755
index 00000000..bb7a8144
--- /dev/null
+++ b/plans/clamp/UIs/setup.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+# Place the scripts in run order:
+
+source ${WORKSPACE}/test/csit/scripts/clamp/clone_clamp_and_change_dockercompose.sh
+
+source ${WORKSPACE}/test/csit/scripts/clamp/start_clamp_containers.sh
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+#ROBOT_VARIABLES="-v TEST:${TEST}"
+
diff --git a/plans/clamp/UIs/teardown.sh b/plans/clamp/UIs/teardown.sh
new file mode 100755
index 00000000..07067e60
--- /dev/null
+++ b/plans/clamp/UIs/teardown.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+source ${WORKSPACE}/test/csit/scripts/clamp/kill_and_remove_clamp_and_db_containers.sh
+
+# $WORKSPACE/archives/clamp-clone deleted with archives folder when tests starts so we keep it at the end for debugging
diff --git a/plans/clamp/UIs/testplan.txt b/plans/clamp/UIs/testplan.txt
new file mode 100644
index 00000000..9ec5b953
--- /dev/null
+++ b/plans/clamp/UIs/testplan.txt
@@ -0,0 +1,4 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+clamp/UIs
+
diff --git a/plans/cli/sanity-check/setup.sh b/plans/cli/sanity-check/setup.sh
new file mode 100644
index 00000000..7945ff56
--- /dev/null
+++ b/plans/cli/sanity-check/setup.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+#
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+source ${SCRIPTS}/common_functions.sh
+
+#start msb
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+MSB_CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo MSB_CONSUL_IP=${MSB_CONSUL_IP}
+
+docker run -d -p 10081:10081 -e CONSUL_IP=$MSB_CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+MSB_DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${MSB_DISCOVERY_IP}
+
+docker run -d -p 80:80 -e CONSUL_IP=$MSB_CONSUL_IP -e SDCLIENT_IP=$MSB_DISCOVERY_IP -e "ROUTE_LABELS=visualRange:1" --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IAG_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IAG_IP=${MSB_IAG_IP}
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${MSB_CONSUL_IP}:8500 && curl -sS -m 1 ${MSB_DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IAG_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+#Need some time for the initialization of MSB services
+sleep 60
+
+# Start cli
+docker run -d --name cli -e CLI_MODE=daemon nexus3.onap.org:10001/onap/cli:v1.1.0
+
+# Wait for cli initialization
+echo Wait for CLI initialization
+for i in {1..40}; do
+ sleep 1
+done
+
+CLI_IP=`get-instance-ip.sh cli`
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v CLI_IP:${CLI_IP} -v MSB_IAG_IP:${MSB_IAG_IP}"
diff --git a/plans/cli/sanity-check/teardown.sh b/plans/cli/sanity-check/teardown.sh
new file mode 100644
index 00000000..2135d001
--- /dev/null
+++ b/plans/cli/sanity-check/teardown.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+#
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+kill-instance.sh cli msb_consul msb_discovery msb_internal_apigateway
diff --git a/plans/cli/sanity-check/testplan.txt b/plans/cli/sanity-check/testplan.txt
new file mode 100644
index 00000000..477ddab1
--- /dev/null
+++ b/plans/cli/sanity-check/testplan.txt
@@ -0,0 +1,18 @@
+#
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+cli/startup/startup_check.robot
diff --git a/plans/dcaegen2-collectors-hv-ves/testsuites/docker-compose.yml b/plans/dcaegen2-collectors-hv-ves/testsuites/docker-compose.yml
new file mode 100644
index 00000000..2a928217
--- /dev/null
+++ b/plans/dcaegen2-collectors-hv-ves/testsuites/docker-compose.yml
@@ -0,0 +1,100 @@
+version: "3"
+
+networks:
+ ves-hv-default:
+ external:
+ name: $CONTAINERS_NETWORK
+
+services:
+ zookeeper:
+ image: wurstmeister/zookeeper
+ ports:
+ - "2181:2181"
+ networks:
+ - ves-hv-default
+
+ kafka:
+ image: wurstmeister/kafka
+ ports:
+ - "9092:9092"
+ environment:
+ KAFKA_ADVERTISED_HOST_NAME: "kafka"
+ KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true'
+ KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
+ KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka:9092"
+ volumes:
+ - /var/run/docker.sock:/var/run/docker.sock
+ depends_on:
+ - zookeeper
+ networks:
+ - ves-hv-default
+
+ consul:
+ image: progrium/consul
+ ports:
+ - "8500:8500"
+ environment:
+ - CONSUL_BIND_INTERFACE=eth0
+ networks:
+ ves-hv-default:
+ aliases:
+ - consul
+ command: ["-server", "-bootstrap"]
+
+ ves-hv-collector:
+ image: ${DOCKER_REGISTRY_PREFIX}onap/org.onap.dcaegen2.collectors.hv-ves.hv-collector-main:latest
+ ports:
+ - "6060:6060"
+ - "6061:6061/tcp"
+ entrypoint: ["java", "-Dio.netty.leakDetection.level=paranoid", "-cp", "*:", "org.onap.dcae.collectors.veshv.main.MainKt"]
+ command: ["--listen-port", "6061",
+ "--config-url", "http://consul:8500/v1/kv/veshv-config",
+ "--key-store-password", "onaponap",
+ "--trust-store-password", "onaponap"]
+ healthcheck:
+ interval: 10s
+ timeout: 5s
+ retries: 2
+ test: "curl --request GET --fail --silent --show-error localhost:6060/health/ready && nc -vz localhost 6061"
+ depends_on:
+ - kafka
+ volumes:
+ - ./ssl/:/etc/ves-hv/
+ networks:
+ - ves-hv-default
+
+ unencrypted-ves-hv-collector:
+ image: ${DOCKER_REGISTRY_PREFIX}onap/org.onap.dcaegen2.collectors.hv-ves.hv-collector-main:latest
+ ports:
+ - "7060:6060"
+ - "7061:6061/tcp"
+ entrypoint: ["java", "-Dio.netty.leakDetection.level=paranoid", "-cp", "*:", "org.onap.dcae.collectors.veshv.main.MainKt"]
+ command: ["--listen-port", "6061","--config-url", "http://consul:8500/v1/kv/veshv-config", "--ssl-disable"]
+ healthcheck:
+ interval: 10s
+ timeout: 5s
+ retries: 2
+ test: "curl --request GET --fail --silent --show-error localhost:6060/health/ready && nc -vz localhost 6061"
+ depends_on:
+ - kafka
+ volumes:
+ - ./ssl/:/etc/ves-hv/
+ networks:
+ - ves-hv-default
+
+ dcae-app-simulator:
+ image: ${DOCKER_REGISTRY_PREFIX}onap/org.onap.dcaegen2.collectors.hv-ves.hv-collector-dcae-app-simulator:latest
+ ports:
+ - "6063:6063/tcp"
+ command: ["--listen-port", "6063", "--kafka-bootstrap-servers", "kafka:9092", "--kafka-topics", "ves_hvRanMeas"]
+ healthcheck:
+ interval: 10s
+ timeout: 5s
+ retries: 2
+ test: "curl --request GET --fail --silent --show-error localhost:6063/healthcheck"
+ depends_on:
+ - kafka
+ networks:
+ ves-hv-default:
+ aliases:
+ - dcae-app-simulator \ No newline at end of file
diff --git a/plans/dcaegen2-collectors-hv-ves/testsuites/setup.sh b/plans/dcaegen2-collectors-hv-ves/testsuites/setup.sh
new file mode 100755
index 00000000..6f72521a
--- /dev/null
+++ b/plans/dcaegen2-collectors-hv-ves/testsuites/setup.sh
@@ -0,0 +1,40 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+if [[ $# -eq 1 ]] && [[ $1 == "local-test-run" ]]; then
+ echo "Building locally - assuming all dependencies are installed"
+ export DOCKER_REGISTRY=""
+ export DOCKER_REGISTRY_PREFIX=""
+ export WORKSPACE=$(git rev-parse --show-toplevel)
+else
+ echo "Default run - install all dependencies"
+
+ pip uninstall -y docker-py
+ pip install docker
+
+ COMPOSE_VERSION=1.22.0
+ COMPOSE_LOCATION='/usr/local/bin/docker-compose'
+ sudo curl -L https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m) -o ${COMPOSE_LOCATION}
+ sudo chmod +x ${COMPOSE_LOCATION}
+
+ export DOCKER_REGISTRY="nexus3.onap.org:10001"
+ export DOCKER_REGISTRY_PREFIX="${DOCKER_REGISTRY}/"
+fi
+
+echo "Removing not used docker networks"
+docker network prune -f
+
+export CONTAINERS_NETWORK=ves-hv-default
+echo "Creating network for containers: ${CONTAINERS_NETWORK}"
+docker network create ${CONTAINERS_NETWORK}
+
+cd ssl
+./gen-certs.sh
+cd ..
+
+docker-compose up -d
+
+mkdir -p ${WORKSPACE}/archives/containers_logs
+
+export ROBOT_VARIABLES="--pythonpath ${WORKSPACE}/test/csit/tests/dcaegen2-collectors-hv-ves/testcases/libraries"
diff --git a/plans/dcaegen2-collectors-hv-ves/testsuites/ssl/.gitignore b/plans/dcaegen2-collectors-hv-ves/testsuites/ssl/.gitignore
new file mode 100644
index 00000000..0729569c
--- /dev/null
+++ b/plans/dcaegen2-collectors-hv-ves/testsuites/ssl/.gitignore
@@ -0,0 +1,6 @@
+*.crt
+*.key
+*.srl
+*.csr
+*.pkcs12
+*.p12
diff --git a/plans/dcaegen2-collectors-hv-ves/testsuites/ssl/Makefile-openssl b/plans/dcaegen2-collectors-hv-ves/testsuites/ssl/Makefile-openssl
new file mode 100644
index 00000000..a32d30dd
--- /dev/null
+++ b/plans/dcaegen2-collectors-hv-ves/testsuites/ssl/Makefile-openssl
@@ -0,0 +1,41 @@
+FILE=sample
+PASSWD=onaponap
+CA_PASSWD=onaponap
+SUBJ=/C=PL/ST=DL/L=Wroclaw/O=Nokia/OU=MANO
+CA=trust
+
+sign: $(FILE).crt
+
+clean:
+ rm -f *.crt *.key *.srl *.csr *.pkcs12
+
+generate-ca-certificate: $(CA).crt
+
+generate-private-key: $(FILE).key
+
+create-public-key: $(FILE).pub
+
+create-sign-request: $(FILE).csr
+
+create-key-store: $(FILE).ks.pkcs12
+
+create-trust-store: $(CA).crt
+ openssl pkcs12 -export -in $(CA).crt -CAfile $(CA).crt -out $(CA).pkcs12 -nokeys -noiter -nomaciter -passout pass:$(PASSWD)
+
+$(CA).crt:
+ openssl req -new -x509 -keyout $(CA).key -out $(CA).crt -days 365 -passout pass:$(CA_PASSWD) -subj "$(SUBJ)"
+
+$(FILE).key:
+ openssl genpkey -algorithm RSA -out $(FILE).key -pkeyopt rsa_keygen_bits:2048
+
+$(FILE).pub: $(FILE).key
+ openssl x509 -req -days 360 -in client.csr -CA $(CA).crt -CAkey $(CA).key -CAcreateserial -out client.crt
+
+$(FILE).csr: $(FILE).key
+ openssl req -new -sha256 -key $(FILE).key -out $(FILE).csr -subj "$(SUBJ)"
+
+$(FILE).crt: $(CA).crt $(FILE).csr
+ openssl x509 -req -days 360 -in $(FILE).csr -CA $(CA).crt -CAkey $(CA).key -out $(FILE).crt -CAcreateserial -passin pass:$(CA_PASSWD)
+
+$(FILE).ks.pkcs12: $(FILE).key $(FILE).crt $(CA).crt
+ openssl pkcs12 -export -in $(FILE).crt -inkey $(FILE).key -CAfile $(CA).crt -out $(FILE).ks.pkcs12 -noiter -nomaciter -passout pass:$(PASSWD)
diff --git a/plans/dcaegen2-collectors-hv-ves/testsuites/ssl/README.md b/plans/dcaegen2-collectors-hv-ves/testsuites/ssl/README.md
new file mode 100644
index 00000000..c2819d24
--- /dev/null
+++ b/plans/dcaegen2-collectors-hv-ves/testsuites/ssl/README.md
@@ -0,0 +1,54 @@
+# Generating SSL certificates
+
+## Java keytool way (recommended)
+
+To generate:
+
+```shell
+./gen-certs.sh
+```
+
+To clean (remove generated files):
+
+```shell
+./gen-certs.sh clean
+```
+
+## OpenSSL way (currently might not work)
+
+> Add `-f Makefile-openssl` to each command
+
+Typical usage:
+
+```shell
+make FILE=client
+make FILE=server
+```
+
+or (to generate PKCS12 key and trust stores):
+
+```shell
+make create-key-store FILE=client
+make create-key-store FILE=server
+make create-trust-store
+```
+
+Will generate CA certificate and signed client and server certificates.
+
+More "low-level" usage:
+
+```shell
+make generate-ca-certificate
+make generate-private-key FILE=client
+make sign FILE=client
+```
+
+# Connecting to a server
+
+First generate *client* and *server* certificates. Then start a server with it's cert and make ca.crt a trusted certification authority.
+
+After that you can:
+
+```shell
+./connect.sh client localhost:8600 < file_with_a_data_to_be_sent.dat
+```
diff --git a/plans/dcaegen2-collectors-hv-ves/testsuites/ssl/gen-certs.sh b/plans/dcaegen2-collectors-hv-ves/testsuites/ssl/gen-certs.sh
new file mode 100755
index 00000000..34572f7a
--- /dev/null
+++ b/plans/dcaegen2-collectors-hv-ves/testsuites/ssl/gen-certs.sh
@@ -0,0 +1,59 @@
+#!/usr/bin/env bash
+
+set -eu -o pipefail -o xtrace
+
+STORE_PASS=onaponap
+CN_PREFIX=dcaegen2-hvves
+DNAME_PREFIX="C=PL,ST=DL,L=Wroclaw,O=Nokia,OU=MANO,CN=${CN_PREFIX}"
+
+store_opts="-storetype PKCS12 -storepass ${STORE_PASS} -noprompt"
+
+function gen_key() {
+ local key_name="$1"
+ local ca="$2"
+ local keystore="-keystore ${key_name}.p12 ${store_opts}"
+ keytool -genkey -alias ${key_name} \
+ ${keystore} \
+ -keyalg RSA \
+ -validity 730 \
+ -keysize 2048 \
+ -dname "${DNAME_PREFIX}-${key_name}"
+ keytool -import -trustcacerts -alias ${ca} -file ${ca}.crt ${keystore}
+
+ keytool -certreq -alias ${key_name} -keyalg RSA ${keystore} | \
+ keytool -alias ${ca} -gencert -ext "san=dns:${CN_PREFIX}-${ca}" ${store_opts} -keystore ${ca}.p12 | \
+ keytool -alias ${key_name} -importcert ${keystore}
+}
+
+
+function gen_ca() {
+ local ca="$1"
+ keytool -genkeypair ${store_opts} -alias ${ca} -dname "${DNAME_PREFIX}-${ca}" -keystore ${ca}.p12
+ keytool -export -alias ${ca} -file ${ca}.crt ${store_opts} -keystore ${ca}.p12
+}
+
+function gen_truststore() {
+ local name="$1"
+ local trusted_ca="$2"
+ keytool -import -trustcacerts -alias ca -file ${trusted_ca}.crt ${store_opts} -keystore ${name}.p12
+}
+
+function clean() {
+ rm -f *.crt *.p12
+}
+
+if [[ $# -eq 0 ]]; then
+ gen_ca ca
+ gen_ca untrustedca
+ gen_truststore trust ca
+ gen_truststore untrustedtrust untrustedca
+ gen_key client ca
+ gen_key server ca
+ gen_key untrustedclient untrustedca
+elif [[ $1 == "clean" ]]; then
+ clean
+else
+ echo "usage: $0 [clean]"
+ exit 1
+fi
+
diff --git a/plans/dcaegen2-collectors-hv-ves/testsuites/teardown.sh b/plans/dcaegen2-collectors-hv-ves/testsuites/teardown.sh
new file mode 100755
index 00000000..fe922ed0
--- /dev/null
+++ b/plans/dcaegen2-collectors-hv-ves/testsuites/teardown.sh
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+cd ssl
+./gen-certs.sh clean
+cd ..
+
+COMPOSE_LOGS_FILE=${WORKSPACE}/archives/containers_logs/docker-compose.log
+docker-compose logs > ${COMPOSE_LOGS_FILE}
+docker-compose down
+docker-compose rm -f
+
+docker network rm ${CONTAINERS_NETWORK}
+
+if grep "LEAK:" ${COMPOSE_LOGS_FILE}; then
+ echo "WARNING: Memory leak detected in docker-compose logs."
+fi
diff --git a/plans/dcaegen2-collectors-hv-ves/testsuites/testplan.txt b/plans/dcaegen2-collectors-hv-ves/testsuites/testplan.txt
new file mode 100644
index 00000000..e9a7f636
--- /dev/null
+++ b/plans/dcaegen2-collectors-hv-ves/testsuites/testplan.txt
@@ -0,0 +1,4 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+dcaegen2-collectors-hv-ves/testcases
+
diff --git a/plans/dcaegen2/prh-testsuites/setup.sh b/plans/dcaegen2/prh-testsuites/setup.sh
new file mode 100644
index 00000000..52167bf5
--- /dev/null
+++ b/plans/dcaegen2/prh-testsuites/setup.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+source ${SCRIPTS}/common_functions.sh
+
+export PRH_SERVICE="prh"
+export DMAAP_SIMULATOR="dmaap_simulator"
+export AAI_SIMULATOR="aai_simulator"
+
+cd ${WORKSPACE}/test/csit/tests/dcaegen2/prh-testcases/resources/
+
+pip uninstall -y docker-py
+pip uninstall -y docker
+pip install -U docker
+docker-compose up -d --build
+
+PRH_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${PRH_SERVICE})
+DMAAP_SIMULATOR_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${DMAAP_SIMULATOR})
+AAI_SIMULATOR_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${AAI_SIMULATOR})
+
+bypass_ip_adress ${PRH_IP}
+bypass_ip_adress ${DMAAP_SIMULATOR_IP}
+bypass_ip_adress ${AAI_SIMULATOR_IP}
+
+echo PRH_IP=${PRH_IP}
+echo DMAAP_SIMULATOR_IP=${DMAAP_SIMULATOR_IP}
+echo AAI_SIMULATOR_IP=${AAI_SIMULATOR_IP}
+
+# Wait for initialization of PRH services
+for i in {1..10}; do
+ curl -sS -m 1 localhost:8100/heartbeat && break
+ echo sleep ${i}
+ sleep ${i}
+done
+
+# #Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v DMAAP_SIMULATOR:${DMAAP_SIMULATOR_IP}:2222 -v AAI_SIMULATOR:${AAI_SIMULATOR_IP}:3333 -v PRH:${PRH_IP}:8100"
diff --git a/plans/dcaegen2/prh-testsuites/teardown.sh b/plans/dcaegen2/prh-testsuites/teardown.sh
new file mode 100644
index 00000000..bd1e5ba0
--- /dev/null
+++ b/plans/dcaegen2/prh-testsuites/teardown.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Copyright 2017 Nokia, Inc. and others.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+kill-instance.sh prh
+kill-instance.sh dmaap_simulator
+kill-instance.sh aai_simulator
diff --git a/plans/dcaegen2/prh-testsuites/testplan.txt b/plans/dcaegen2/prh-testsuites/testplan.txt
new file mode 100644
index 00000000..9007a64b
--- /dev/null
+++ b/plans/dcaegen2/prh-testsuites/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+dcaegen2/prh-testcases
diff --git a/plans/dcaegen2/testsuites/setup.sh b/plans/dcaegen2/testsuites/setup.sh
new file mode 100755
index 00000000..8ee1309b
--- /dev/null
+++ b/plans/dcaegen2/testsuites/setup.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+#Make sure python-uuid is installed
+
+
+#get current host IP addres
+HOST_IP=$(ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}')
+
+VESC_IMAGE=nexus3.onap.org:10001/onap/org.onap.dcaegen2.collectors.ves.vescollector:1.2-latest
+echo VESC_IMAGE=${VESC_IMAGE}
+
+# Start DCAE VES Collector
+docker run -d -p 8080:8080/tcp -p 8443:8443/tcp -P --name vesc -e DMAAPHOST=${HOST_IP} ${VESC_IMAGE}
+
+VESC_IP=`get-instance-ip.sh vesc`
+export VESC_IP=${VESC_IP}
+export HOST_IP=${HOST_IP}
+
+export ROBOT_VARIABLES="--pythonpath ${WORKSPACE}/test/csit/tests/dcaegen2/testcases/resources"
+
+pip install jsonschema uuid
+# Wait container ready
+sleep 5
+
diff --git a/plans/dcaegen2/testsuites/teardown.sh b/plans/dcaegen2/testsuites/teardown.sh
new file mode 100755
index 00000000..2dc14870
--- /dev/null
+++ b/plans/dcaegen2/testsuites/teardown.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE, Inc. and others.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+kill-instance.sh vesc \ No newline at end of file
diff --git a/plans/dcaegen2/testsuites/testplan.txt b/plans/dcaegen2/testsuites/testplan.txt
new file mode 100755
index 00000000..fbf08839
--- /dev/null
+++ b/plans/dcaegen2/testsuites/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+dcaegen2/testcases
diff --git a/plans/dmaap-buscontroller/mock_downstream/setup.sh b/plans/dmaap-buscontroller/mock_downstream/setup.sh
new file mode 100755
index 00000000..d5c77b0b
--- /dev/null
+++ b/plans/dmaap-buscontroller/mock_downstream/setup.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# org.onap.dmaap
+# ================================================================================
+# Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+#
+
+
+# Place the scripts in run order:
+source ${WORKSPACE}/test/csit/scripts/dmaap-buscontroller/start-mock.sh
+start_mock "aaf"
+AAF_IP=${IP}
+start_mock "mrc" 3904
+MRC_IP=${IP}
+start_mock "drps"
+DRPS_IP=${IP}
+
+source ${WORKSPACE}/test/csit/scripts/dmaap-buscontroller/dmaapbc-launch.sh
+dmaapbc_launch $AAF_IP $MRC_IP $DRPS_IP
+DMAAPBC_IP=${IP}
+
+
+echo "AAF_IP=$AAF_IP MRC_IP=$MRC_IP DRPS_IP=$DRPS_IP DMAAPBC_IP=$DMAAPBC_IP"
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v AAF_IP:${AAF_IP} -v MRC_IP:${MRC_IP} -v DRPS_IP:${DRPS_IP} -v DMAAPBC_IP:${DMAAPBC_IP}"
+
+set -x
+${WORKSPACE}/test/csit/scripts/dmaap-buscontroller/dmaapbc-init.sh ${DMAAPBC_IP} ${DRPS_IP} ${MRC_IP}
+set +x
diff --git a/plans/dmaap-buscontroller/mock_downstream/teardown.sh b/plans/dmaap-buscontroller/mock_downstream/teardown.sh
new file mode 100644
index 00000000..1b041a42
--- /dev/null
+++ b/plans/dmaap-buscontroller/mock_downstream/teardown.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# org.onap.dmaap
+# ================================================================================
+# Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+#
+kill-instance.sh aaf-mock
+kill-instance.sh drps-mock
+kill-instance.sh mrc-mock
+kill-instance.sh dmaapbc
+
diff --git a/plans/dmaap-buscontroller/mock_downstream/testplan.txt b/plans/dmaap-buscontroller/mock_downstream/testplan.txt
new file mode 100644
index 00000000..39a2f449
--- /dev/null
+++ b/plans/dmaap-buscontroller/mock_downstream/testplan.txt
@@ -0,0 +1,4 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+dmaap-buscontroller/suite1
+
diff --git a/plans/dmaap-buscontroller/ssl/setup.sh b/plans/dmaap-buscontroller/ssl/setup.sh
new file mode 100755
index 00000000..e40f62de
--- /dev/null
+++ b/plans/dmaap-buscontroller/ssl/setup.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# org.onap.dmaap
+# ================================================================================
+# Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+#
+
+
+# Place the scripts in run order:
+source ${WORKSPACE}/test/csit/scripts/dmaap-buscontroller/start-mock.sh
+start_mock "aaf"
+AAF_IP=${IP}
+start_mock "mrc" 3905
+MRC_IP=${IP}
+start_mock "drps" 8443
+DRPS_IP=${IP}
+
+source ${WORKSPACE}/test/csit/scripts/dmaap-buscontroller/dmaapbc-launch.sh
+dmaapbc_launch $AAF_IP $MRC_IP $DRPS_IP
+DMAAPBC_IP=${IP}
+
+
+echo "AAF_IP=$AAF_IP MRC_IP=$MRC_IP DRPS_IP=$DRPS_IP DMAAPBC_IP=$DMAAPBC_IP"
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v AAF_IP:${AAF_IP} -v MRC_IP:${MRC_IP} -v DRPS_IP:${DRPS_IP} -v DMAAPBC_IP:${DMAAPBC_IP}"
+
+set -x
+${WORKSPACE}/test/csit/scripts/dmaap-buscontroller/dmaapbc-init.sh ${DMAAPBC_IP} ${DRPS_IP} ${MRC_IP} https
+set +x
diff --git a/plans/dmaap-buscontroller/ssl/teardown.sh b/plans/dmaap-buscontroller/ssl/teardown.sh
new file mode 100644
index 00000000..1b041a42
--- /dev/null
+++ b/plans/dmaap-buscontroller/ssl/teardown.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# org.onap.dmaap
+# ================================================================================
+# Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+#
+kill-instance.sh aaf-mock
+kill-instance.sh drps-mock
+kill-instance.sh mrc-mock
+kill-instance.sh dmaapbc
+
diff --git a/plans/dmaap-buscontroller/ssl/testplan.txt b/plans/dmaap-buscontroller/ssl/testplan.txt
new file mode 100644
index 00000000..e106e7b6
--- /dev/null
+++ b/plans/dmaap-buscontroller/ssl/testplan.txt
@@ -0,0 +1,4 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+dmaap-buscontroller/ssl_suite
+
diff --git a/plans/dmaap-buscontroller/with_dr/setup.sh b/plans/dmaap-buscontroller/with_dr/setup.sh
new file mode 100755
index 00000000..7cefa727
--- /dev/null
+++ b/plans/dmaap-buscontroller/with_dr/setup.sh
@@ -0,0 +1,57 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# org.onap.dmaap
+# ================================================================================
+# Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+#
+
+source ${SCRIPTS}/common_functions.sh
+
+
+if [ "$USE_EXISTING_DMAAP" = "Y" ]
+then
+ ROBOT_VARIABLES="-v AAF_IP:0.0.0 -v MRC_IP:0.0.0.0 -v DRPS_IP:172.17.0.3 -v DMAAPBC_IP:172.17.0.4"
+else
+
+ # Place the scripts in run order:
+ source ${WORKSPACE}/test/csit/scripts/dmaap-buscontroller/dr-launch.sh
+ dmaap_dr_launch
+ DRPS_IP=${IP}
+
+ #source ${WORKSPACE}/test/csit/scripts/dmaap-buscontroller/start-mock.sh
+ #start_mock "aaf"
+ #AAF_IP=${IP}
+ AAF_IP=0.0.0.0
+ #start_mock "drps"
+ #DRPS_IP=${IP}
+ MRC_IP=0.0.0.0
+
+ source ${WORKSPACE}/test/csit/scripts/dmaap-buscontroller/dmaapbc-launch.sh
+ dmaapbc_launch $AAF_IP $MRC_IP $DRPS_IP
+ DMAAPBC_IP=${IP}
+
+
+ echo "AAF_IP=$AAF_IP MRC_IP=$MRC_IP DRPS_IP=$DRPS_IP DMAAPBC_IP=$DMAAPBC_IP"
+
+ # Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ ROBOT_VARIABLES="-v AAF_IP:${AAF_IP} -v MRC_IP:${MRC_IP} -v DRPS_IP:${DRPS_IP} -v DMAAPBC_IP:${DMAAPBC_IP}"
+ set -x
+ ${WORKSPACE}/test/csit/scripts/dmaap-buscontroller/dmaapbc-init.sh ${DMAAPBC_IP} ${DRPS_IP} ${MRC_IP} https
+ set +x
+fi
+
diff --git a/plans/dmaap-buscontroller/with_dr/teardown.sh b/plans/dmaap-buscontroller/with_dr/teardown.sh
new file mode 100755
index 00000000..23ae60a1
--- /dev/null
+++ b/plans/dmaap-buscontroller/with_dr/teardown.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# org.onap.dmaap
+# ================================================================================
+# Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+
+if [ "$KEEP_DMAAP" != "Y" ]
+then
+kill-instance.sh dmaapbc
+cd $WORKSPACE/archives/dmaapdr/datarouter/docker-compose/
+docker-compose down -v
+fi
diff --git a/plans/dmaap-buscontroller/with_dr/testplan.txt b/plans/dmaap-buscontroller/with_dr/testplan.txt
new file mode 100755
index 00000000..04c6838d
--- /dev/null
+++ b/plans/dmaap-buscontroller/with_dr/testplan.txt
@@ -0,0 +1,2 @@
+# Place the suites in run order.
+dmaap-buscontroller/with_dr
diff --git a/plans/dmaap-buscontroller/with_mr/setup.sh b/plans/dmaap-buscontroller/with_mr/setup.sh
new file mode 100755
index 00000000..bcd19b5a
--- /dev/null
+++ b/plans/dmaap-buscontroller/with_mr/setup.sh
@@ -0,0 +1,54 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# org.onap.dmaap
+# ================================================================================
+# Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+#
+
+if [ "$USE_EXISTING_DMAAP" = "Y" ]
+then
+ ROBOT_VARIABLES="-v AAF_IP:0.0.0 -v MRC_IP:172.18.0.3 -v DRPS_IP:0.0.0.0 -v DMAAPBC_IP:172.17.0.4"
+else
+
+ # Place the scripts in run order:
+ source ${WORKSPACE}/test/csit/scripts/dmaap-message-router/dmaap-mr-launch.sh
+ dmaap_mr_launch
+ MRC_IP=${IP}
+
+ source ${WORKSPACE}/test/csit/scripts/dmaap-buscontroller/start-mock.sh
+ start_mock "aaf"
+ AAF_IP=${IP}
+ #AAF_IP=0.0.0.0
+ #start_mock "drps"
+ #DRPS_IP=${IP}
+ DRPS_IP=0.0.0.0
+
+ source ${WORKSPACE}/test/csit/scripts/dmaap-buscontroller/dmaapbc-launch.sh
+ dmaapbc_launch $AAF_IP $MRC_IP $DRPS_IP
+ DMAAPBC_IP=${IP}
+
+
+ echo "AAF_IP=$AAF_IP MRC_IP=$MRC_IP DRPS_IP=$DRPS_IP DMAAPBC_IP=$DMAAPBC_IP"
+
+ # Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ ROBOT_VARIABLES="-v AAF_IP:${AAF_IP} -v MRC_IP:${MRC_IP} -v DRPS_IP:${DRPS_IP} -v DMAAPBC_IP:${DMAAPBC_IP}"
+ set -x
+ ${WORKSPACE}/test/csit/scripts/dmaap-buscontroller/dmaapbc-init.sh ${DMAAPBC_IP} ${DRPS_IP} ${MRC_IP}
+ set +x
+fi
+
diff --git a/plans/dmaap-buscontroller/with_mr/teardown.sh b/plans/dmaap-buscontroller/with_mr/teardown.sh
new file mode 100644
index 00000000..3feebe07
--- /dev/null
+++ b/plans/dmaap-buscontroller/with_mr/teardown.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# org.onap.dmaap
+# ================================================================================
+# Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+#
+source ${WORKSPACE}/test/csit/scripts/dmaap-message-router/dmaap-mr-teardown.sh
+
+if [ "$KEEP_DMAAP" != "Y" ]
+then
+dmaap_mr_teardown
+kill-instance.sh dmaapbc
+kill-instance.sh aaf-mock
+fi
+
diff --git a/plans/dmaap-buscontroller/with_mr/testplan.txt b/plans/dmaap-buscontroller/with_mr/testplan.txt
new file mode 100644
index 00000000..4f4ff717
--- /dev/null
+++ b/plans/dmaap-buscontroller/with_mr/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+dmaap-buscontroller/single-mr-suite
diff --git a/plans/dmaap-datarouter/dr-suite/setup.sh b/plans/dmaap-datarouter/dr-suite/setup.sh
new file mode 100755
index 00000000..e5debfc2
--- /dev/null
+++ b/plans/dmaap-datarouter/dr-suite/setup.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+
+source ${SCRIPTS}/common_functions.sh
+
+# Clone DMaaP Data Router repo
+mkdir -p $WORKSPACE/archives/dmaapdr
+cd $WORKSPACE/archives/dmaapdr
+
+git clone --depth 1 https://gerrit.onap.org/r/dmaap/datarouter -b master
+cd datarouter
+git pull
+cd $WORKSPACE/archives/dmaapdr/datarouter/docker-compose/
+
+sed -i 's/10003/10001/g' docker-compose.yml
+# start DMaaP DR containers with docker compose and configuration from docker-compose.yml
+docker login -u docker -p docker nexus3.onap.org:10001
+docker-compose up -d
+
+# Wait for initialization of Docker container for datarouter-node, datarouter-prov and mariadb
+for i in {1..50}; do
+ if [ $(docker inspect --format '{{ .State.Running }}' datarouter-node) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' datarouter-prov) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' mariadb) ]
+ then
+ echo "DR Service Running"
+ break
+ else
+ echo sleep $i
+ sleep $i
+ fi
+done
+
+DR_PROV_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' datarouter-prov)
+DR_NODE_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' datarouter-node)
+DR_GATEWAY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}' datarouter-prov)
+
+echo DR_PROV_IP=${DR_PROV_IP}
+echo DR_NODE_IP=${DR_NODE_IP}
+echo DR_GATEWAY_IP=${DR_GATEWAY_IP}
+
+docker exec -i datarouter-prov sh -c "curl -k -X PUT https://$DR_PROV_IP:8443/internal/api/NODES?val=dmaap-dr-node\|$DR_GATEWAY_IP"
+docker exec -i datarouter-prov sh -c "curl -k -X PUT https://$DR_PROV_IP:8443/internal/api/PROV_AUTH_ADDRESSES?val=dmaap-dr-prov\|$DR_GATEWAY_IP"
+
+#Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v DR_PROV_IP:${DR_PROV_IP} -v DR_NODE_IP:${DR_NODE_IP}"
diff --git a/plans/dmaap-datarouter/dr-suite/teardown.sh b/plans/dmaap-datarouter/dr-suite/teardown.sh
new file mode 100755
index 00000000..033a0015
--- /dev/null
+++ b/plans/dmaap-datarouter/dr-suite/teardown.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+cd $WORKSPACE/archives/dmaapdr/datarouter/docker-compose/
+docker-compose down -v
diff --git a/plans/dmaap-datarouter/dr-suite/testplan.txt b/plans/dmaap-datarouter/dr-suite/testplan.txt
new file mode 100755
index 00000000..8349a056
--- /dev/null
+++ b/plans/dmaap-datarouter/dr-suite/testplan.txt
@@ -0,0 +1,2 @@
+# Place the suites in run order.
+dmaap-datarouter/dr-suite
diff --git a/plans/dmaap/mrpubsub/setup.sh b/plans/dmaap/mrpubsub/setup.sh
new file mode 100755
index 00000000..0a1f9d35
--- /dev/null
+++ b/plans/dmaap/mrpubsub/setup.sh
@@ -0,0 +1,97 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# ONAP DMAAP MR
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+# Place the scripts in run order:
+source ${SCRIPTS}/common_functions.sh
+
+# Clone DMaaP Message Router repo
+mkdir -p $WORKSPACE/archives/dmaapmr
+cd $WORKSPACE/archives/dmaapmr
+#unset http_proxy https_proxy
+git clone --depth 1 http://gerrit.onap.org/r/dmaap/messagerouter/messageservice -b master
+git pull
+cd $WORKSPACE/archives/dmaapmr/messageservice/src/main/resources/docker-compose
+cp $WORKSPACE/archives/dmaapmr/messageservice/bundleconfig-local/etc/appprops/MsgRtrApi.properties /var/tmp/
+
+
+# start DMaaP MR containers with docker compose and configuration from docker-compose.yml
+docker login -u docker -p docker nexus3.onap.org:10001
+docker-compose up -d
+
+# Wait for initialization of Docker contaienr for DMaaP MR, Kafka and Zookeeper
+for i in {1..50}; do
+ if [ $(docker inspect --format '{{ .State.Running }}' dockercompose_dmaap_1) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' dockercompose_zookeeper_1) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' dockercompose_dmaap_1) ]
+ then
+ echo "DMaaP Service Running"
+ break
+ else
+ echo sleep $i
+ sleep $i
+ fi
+done
+
+
+DMAAP_MR_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' dockercompose_dmaap_1)
+KAFKA_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' dockercompose_kafka_1)
+ZOOKEEPER_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' dockercompose_zookeeper_1)
+
+echo DMAAP_MR_IP=${DMAAP_MR_IP}
+echo KAFKA_IP=${KAFKA_IP}
+echo ZOOKEEPER_IP=${ZOOKEEPER_IP}
+
+# Initial docker-compose up and down is for populating kafka and zookeeper IPs in /var/tmp/MsgRtrApi.properites
+docker-compose down
+
+# Update kafkfa and zookeeper properties in MsgRtrApi.propeties which will be copied to DMaaP Container
+sed -i -e 's/<zookeeper_host>/'$ZOOKEEPER_IP'/' /var/tmp/MsgRtrApi.properties
+sed -i -e 's/<kafka_host>:<kafka_port>/'$KAFKA_IP':9092/' /var/tmp/MsgRtrApi.properties
+
+docker-compose build
+docker login -u docker -p docker nexus3.onap.org:10001
+docker-compose up -d
+
+# Wait for initialization of Docker containers
+for i in {1..50}; do
+ if [ $(docker inspect --format '{{ .State.Running }}' dockercompose_dmaap_1) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' dockercompose_zookeeper_1) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' dockercompose_dmaap_1) ]
+ then
+ echo "DMaaP Service Running"
+ break
+ else
+ echo sleep $i
+ sleep $i
+ fi
+done
+
+# Wait for initialization of docker services
+for i in {1..50}; do
+ curl -sS -m 1 ${DMAAP_MR_IP}:3904/events/TestTopic && break
+ echo sleep $i
+ sleep $i
+done
+
+#Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v DMAAP_MR_IP:${DMAAP_MR_IP}"
diff --git a/plans/dmaap/mrpubsub/teardown.sh b/plans/dmaap/mrpubsub/teardown.sh
new file mode 100755
index 00000000..1b430324
--- /dev/null
+++ b/plans/dmaap/mrpubsub/teardown.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+kill-instance.sh dockercompose_dmaap_1
+kill-instance.sh dockercompose_kafka_1
+kill-instance.sh dockercompose_zookeeper_1
diff --git a/plans/dmaap/mrpubsub/testplan.txt b/plans/dmaap/mrpubsub/testplan.txt
new file mode 100644
index 00000000..6a98eb79
--- /dev/null
+++ b/plans/dmaap/mrpubsub/testplan.txt
@@ -0,0 +1,2 @@
+# Place the suites in run order.
+dmaap/mrpubsub
diff --git a/plans/externalapi-nbi/healthcheck/setup.sh b/plans/externalapi-nbi/healthcheck/setup.sh
new file mode 100644
index 00000000..50da7ad6
--- /dev/null
+++ b/plans/externalapi-nbi/healthcheck/setup.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# ========================================================================
+# Copyright (c) 2018 Orange
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ========================================================================
+
+source ${WORKSPACE}/test/csit/scripts/externalapi-nbi/start_nbi_containers.sh
diff --git a/plans/externalapi-nbi/healthcheck/teardown.sh b/plans/externalapi-nbi/healthcheck/teardown.sh
new file mode 100644
index 00000000..83929723
--- /dev/null
+++ b/plans/externalapi-nbi/healthcheck/teardown.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# ========================================================================
+# Copyright (c) 2018 Orange
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ========================================================================
+
+source ${WORKSPACE}/test/csit/scripts/externalapi-nbi/delete_nbi_containers.sh \ No newline at end of file
diff --git a/plans/externalapi-nbi/healthcheck/testplan.txt b/plans/externalapi-nbi/healthcheck/testplan.txt
new file mode 100644
index 00000000..06622ae7
--- /dev/null
+++ b/plans/externalapi-nbi/healthcheck/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+externalapi-nbi/healthcheck
diff --git a/plans/holmes-rule-management/sanity-check/setup.sh b/plans/holmes-rule-management/sanity-check/setup.sh
new file mode 100644
index 00000000..89688eea
--- /dev/null
+++ b/plans/holmes-rule-management/sanity-check/setup.sh
@@ -0,0 +1,72 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+
+# Download and start MySQL
+docker pull postgres:9.5
+docker run --name postgres-holmes -p 5432:5432 -e POSTGRES_USER=holmes -e POSTGRES_PASSWORD=holmespwd -d postgres:9.5
+DB_IP=`get-instance-ip.sh postgres-holmes`
+echo DB_IP=${DB_IP}
+
+#login to the onap nexus docker repo
+docker login -u docker -p docker nexus3.onap.org:10001
+
+# Start MSB
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo CONSUL_IP=${CONSUL_IP}
+docker run -d -p 10081:10081 -e CONSUL_IP=$CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${DISCOVERY_IP}
+docker run -d -p 80:80 -e CONSUL_IP=$CONSUL_IP -e SDCLIENT_IP=$DISCOVERY_IP --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IP=${MSB_IP}
+
+# Start rulemgt
+source ${SCRIPTS}/holmes/rule-management/startup.sh i-rulemgt ${DB_IP} ${MSB_IP} 1
+RULEMGT_IP=`get-instance-ip.sh i-rulemgt`
+echo RULEMGT_IP=${RULEMGT_IP}
+
+# Wait for initialization
+for i in {1..20}; do
+ curl -sS -m 1 ${RULEMGT_IP}:9101 && curl -sS -m 1 ${MSB_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Start engine-d
+source ${SCRIPTS}/holmes/engine-management/startup.sh i-engine-d ${DB_IP} ${MSB_IP} 1
+ENGINE_D_IP=`get-instance-ip.sh i-engine-d`
+echo ENGINE_D_IP=${ENGINE_D_IP}
+
+
+# Wait for initialization
+for i in {1..10}; do
+ curl -sS -m 1 ${ENGINE_D_IP}:9102 && break
+ echo sleep $i
+ sleep $i
+done
+
+echo sleep 30s for service registration
+sleep 30
+
+docker logs i-rulemgt
+docker logs i-engine-d
+
+#Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IP:${MSB_IP} -v RULEMGT_IP:${RULEMGT_IP} -v ENGINE_D_IP:${ENGINE_D_IP}"
+
diff --git a/plans/holmes-rule-management/sanity-check/teardown.sh b/plans/holmes-rule-management/sanity-check/teardown.sh
new file mode 100644
index 00000000..77652271
--- /dev/null
+++ b/plans/holmes-rule-management/sanity-check/teardown.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#kill-instance.sh i-rulemgt
+#kill-instance.sh i-engine-d
+#kill-instance.sh msb_internal_apigateway
+#kill-instance.sh msb_discovery
+#kill-instance.sh msb_consul
+#kill-instance.sh mysql-holmes
+
+
diff --git a/plans/holmes-rule-management/sanity-check/testplan.txt b/plans/holmes-rule-management/sanity-check/testplan.txt
new file mode 100644
index 00000000..e699512d
--- /dev/null
+++ b/plans/holmes-rule-management/sanity-check/testplan.txt
@@ -0,0 +1,5 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+
+holmes/testcase/EngineMgt
+holmes/testcase/RuleMgt
diff --git a/plans/integration/functionality1/setup.sh b/plans/integration/functionality1/setup.sh
new file mode 100755
index 00000000..c18f6220
--- /dev/null
+++ b/plans/integration/functionality1/setup.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+source ${WORKSPACE}/test/csit/scripts/integration/script1.sh
+
+docker run --name i-mock -d jamesdbloom/mockserver
+MOCK_IP=`get-instance-ip.sh i-mock`
+
+# Wait for initialization
+for i in {1..10}; do
+ curl -sS ${MOCK_IP}:1080 && break
+ echo sleep $i
+ sleep $i
+done
+
+${WORKSPACE}/test/csit/scripts/integration/mock-hello.sh ${MOCK_IP}
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MOCK_IP:${MOCK_IP}"
+
diff --git a/plans/integration/functionality1/teardown.sh b/plans/integration/functionality1/teardown.sh
new file mode 100755
index 00000000..acf2d097
--- /dev/null
+++ b/plans/integration/functionality1/teardown.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+kill-instance.sh i-mock
+
+
diff --git a/plans/integration/functionality1/testplan.txt b/plans/integration/functionality1/testplan.txt
new file mode 100644
index 00000000..9221b475
--- /dev/null
+++ b/plans/integration/functionality1/testplan.txt
@@ -0,0 +1,5 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+# Temporary change to trigger verify job.
+integration/suite1
+integration/suite2
diff --git a/plans/integration/vCPE/setup.sh b/plans/integration/vCPE/setup.sh
new file mode 100755
index 00000000..1b9cc343
--- /dev/null
+++ b/plans/integration/vCPE/setup.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES=""
+
diff --git a/plans/integration/vCPE/teardown.sh b/plans/integration/vCPE/teardown.sh
new file mode 100755
index 00000000..8beb6e1f
--- /dev/null
+++ b/plans/integration/vCPE/teardown.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+
diff --git a/plans/integration/vCPE/testplan.txt b/plans/integration/vCPE/testplan.txt
new file mode 100644
index 00000000..2b3d4ad5
--- /dev/null
+++ b/plans/integration/vCPE/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+integration/vCPE
diff --git a/plans/modeling-toscaparsers-javatoscachecker/APIs/setup.sh b/plans/modeling-toscaparsers-javatoscachecker/APIs/setup.sh
new file mode 100644
index 00000000..03d07def
--- /dev/null
+++ b/plans/modeling-toscaparsers-javatoscachecker/APIs/setup.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Copyright 2017 AT&T
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+# Place the scripts in run order:
+
+source ${WORKSPACE}/test/csit/scripts/modeling-toscaparsers-javatoscachecker/setup_containers.sh
+
diff --git a/plans/modeling-toscaparsers-javatoscachecker/APIs/teardown.sh b/plans/modeling-toscaparsers-javatoscachecker/APIs/teardown.sh
new file mode 100644
index 00000000..1ecaad4d
--- /dev/null
+++ b/plans/modeling-toscaparsers-javatoscachecker/APIs/teardown.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+source ${WORKSPACE}/test/csit/scripts/modeling-toscaparsers-javatoscachecker/teardown_containers.sh
+
diff --git a/plans/modeling-toscaparsers-javatoscachecker/APIs/testplan.txt b/plans/modeling-toscaparsers-javatoscachecker/APIs/testplan.txt
new file mode 100644
index 00000000..f59237bd
--- /dev/null
+++ b/plans/modeling-toscaparsers-javatoscachecker/APIs/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+modeling-toscaparsers-javatoscachecker/APIs
diff --git a/plans/msb/iag-redirect-discovery/setup.sh b/plans/msb/iag-redirect-discovery/setup.sh
new file mode 100644
index 00000000..70614c5c
--- /dev/null
+++ b/plans/msb/iag-redirect-discovery/setup.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE, Inc. and others.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+source ${SCRIPTS}/common_functions.sh
+
+#start msb
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+MSB_CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo MSB_CONSUL_IP=${MSB_CONSUL_IP}
+
+docker run -d -p 10081:10081 -e CONSUL_IP=$MSB_CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+MSB_DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${MSB_DISCOVERY_IP}
+
+docker run -d -p 80:80 -e CONSUL_IP=$MSB_CONSUL_IP -e SDCLIENT_IP=$MSB_DISCOVERY_IP -e "ROUTE_LABELS=visualRange:1" --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IAG_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IAG_IP=${MSB_IAG_IP}
+
+# Start rest example service
+docker run -d -p 9090:9090 --name i-rest-example zhaohuabing/rest-example
+REST_EXAMPLE_IP=`get-instance-ip.sh i-rest-example`
+echo REST_EXAMPLE_IP=${REST_EXAMPLE_IP}
+
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${MSB_CONSUL_IP}:8500 && curl -sS -m 1 ${MSB_DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IAG_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+#Need some time for the initialization of MSB services
+sleep 60
+
+curl -X POST \
+ -H "Content-Type: application/json" \
+ -d '{"serviceName": "test", "version": "v1", "url": "/","protocol": "REST", "lb_policy":"round-robin","nodes": [ {"ip": "'${REST_EXAMPLE_IP}'","port": "9090"}]}' \
+ "http://${MSB_IAG_IP}:80/api/microservices/v1/services"
+
+# Pass any variables required by Robot suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IAG_IP:${MSB_IAG_IP} -v MSB_DISCOVERY_IP:${MSB_DISCOVERY_IP} -v REST_EXAMPLE_IP:${REST_EXAMPLE_IP}" \ No newline at end of file
diff --git a/plans/msb/iag-redirect-discovery/teardown.sh b/plans/msb/iag-redirect-discovery/teardown.sh
new file mode 100644
index 00000000..b7945673
--- /dev/null
+++ b/plans/msb/iag-redirect-discovery/teardown.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE, Inc. and others.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+kill-instance.sh msb_consul
+kill-instance.sh msb_discovery
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh i-rest-example
diff --git a/plans/msb/iag-redirect-discovery/testplan.txt b/plans/msb/iag-redirect-discovery/testplan.txt
new file mode 100644
index 00000000..54bb307b
--- /dev/null
+++ b/plans/msb/iag-redirect-discovery/testplan.txt
@@ -0,0 +1,4 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+msb/rest-service-discovery
+msb/rest-service-api-gateway \ No newline at end of file
diff --git a/plans/msb/rest-service/setup.sh b/plans/msb/rest-service/setup.sh
new file mode 100644
index 00000000..8d344db8
--- /dev/null
+++ b/plans/msb/rest-service/setup.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE, Inc. and others.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+source ${SCRIPTS}/common_functions.sh
+
+#start msb
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+MSB_CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo MSB_CONSUL_IP=${MSB_CONSUL_IP}
+
+docker run -d -p 10081:10081 -e CONSUL_IP=$MSB_CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+MSB_DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${MSB_DISCOVERY_IP}
+
+docker run -d -p 80:80 -e CONSUL_IP=$MSB_CONSUL_IP -e SDCLIENT_IP=$MSB_DISCOVERY_IP -e "ROUTE_LABELS=visualRange:1" --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IAG_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IAG_IP=${MSB_IAG_IP}
+
+# Start rest example service
+docker run -d -p 9090:9090 --name i-rest-example zhaohuabing/rest-example
+REST_EXAMPLE_IP=`get-instance-ip.sh i-rest-example`
+echo REST_EXAMPLE_IP=${REST_EXAMPLE_IP}
+
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${MSB_CONSUL_IP}:8500 && curl -sS -m 1 ${MSB_DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IAG_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+#Need some time for the initialization of MSB services
+sleep 60
+
+curl -X POST \
+ -H "Content-Type: application/json" \
+ -d '{"serviceName": "test", "version": "v1", "url": "/","protocol": "REST", "lb_policy":"round-robin","nodes": [ {"ip": "'${REST_EXAMPLE_IP}'","port": "9090"}]}' \
+ "http://${MSB_DISCOVERY_IP}:10081/api/microservices/v1/services"
+
+# Pass any variables required by Robot suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IAG_IP:${MSB_IAG_IP} -v MSB_DISCOVERY_IP:${MSB_DISCOVERY_IP} -v REST_EXAMPLE_IP:${REST_EXAMPLE_IP}" \ No newline at end of file
diff --git a/plans/msb/rest-service/teardown.sh b/plans/msb/rest-service/teardown.sh
new file mode 100644
index 00000000..b7945673
--- /dev/null
+++ b/plans/msb/rest-service/teardown.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE, Inc. and others.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+kill-instance.sh msb_consul
+kill-instance.sh msb_discovery
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh i-rest-example
diff --git a/plans/msb/rest-service/testplan.txt b/plans/msb/rest-service/testplan.txt
new file mode 100644
index 00000000..54bb307b
--- /dev/null
+++ b/plans/msb/rest-service/testplan.txt
@@ -0,0 +1,4 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+msb/rest-service-discovery
+msb/rest-service-api-gateway \ No newline at end of file
diff --git a/plans/msb/sanity-check/setup.sh b/plans/msb/sanity-check/setup.sh
new file mode 100644
index 00000000..e44f4371
--- /dev/null
+++ b/plans/msb/sanity-check/setup.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE, Inc. and others.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+source ${SCRIPTS}/common_functions.sh
+
+#start msb
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+MSB_CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo MSB_CONSUL_IP=${MSB_CONSUL_IP}
+
+docker run -d -p 10081:10081 -e CONSUL_IP=$MSB_CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+MSB_DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${MSB_DISCOVERY_IP}
+
+docker run -d -p 80:80 -e CONSUL_IP=$MSB_CONSUL_IP -e SDCLIENT_IP=$MSB_DISCOVERY_IP --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IAG_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IAG_IP=${MSB_IAG_IP}
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${MSB_CONSUL_IP}:8500 && curl -sS -m 1 ${MSB_DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IAG_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+#wait for container initalization
+sleep 30
+
+#Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IAG_IP:${MSB_IAG_IP}"
diff --git a/plans/msb/sanity-check/teardown.sh b/plans/msb/sanity-check/teardown.sh
new file mode 100644
index 00000000..609eaf66
--- /dev/null
+++ b/plans/msb/sanity-check/teardown.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE, Inc. and others.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+kill-instance.sh msb_consul
+kill-instance.sh msb_discovery
+kill-instance.sh msb_internal_apigateway \ No newline at end of file
diff --git a/plans/msb/sanity-check/testplan.txt b/plans/msb/sanity-check/testplan.txt
new file mode 100644
index 00000000..0ef75071
--- /dev/null
+++ b/plans/msb/sanity-check/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+msb/startup
diff --git a/plans/msb/tcp-service/setup.sh b/plans/msb/tcp-service/setup.sh
new file mode 100644
index 00000000..ea2bafdf
--- /dev/null
+++ b/plans/msb/tcp-service/setup.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE, Inc. and others.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+source ${SCRIPTS}/common_functions.sh
+
+#start msb
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+MSB_CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo MSB_CONSUL_IP=${MSB_CONSUL_IP}
+
+docker run -d -p 10081:10081 -e CONSUL_IP=$MSB_CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+MSB_DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${MSB_DISCOVERY_IP}
+
+docker run -d -p 80:80 -e CONSUL_IP=$MSB_CONSUL_IP -e SDCLIENT_IP=$MSB_DISCOVERY_IP --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IAG_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IAG_IP=${MSB_IAG_IP}
+
+# Start Message Broker
+docker run -d -p 61616:61616 --name i-activemq webcenter/activemq
+
+ACTIVEMQ_IP=`get-instance-ip.sh i-activemq`
+echo ACTIVEMQ_IP=${ACTIVEMQ_IP}
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${MSB_CONSUL_IP}:8500 && curl -sS -m 1 ${MSB_DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IAG_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+#wait for container initalization
+sleep 30
+
+curl -H "Content-Type: application/json" -X POST -d '{"serviceName": "ActiveMQ","protocol": "TCP","nodes": [{"ip": "'${ACTIVEMQ_IP}'","port": "61616"}]}' http://${MSB_DISCOVERY_IP}:10081/api/microservices/v1/services
+
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IAG_IP:${MSB_IAG_IP} -v MSB_DISCOVERY_IP:${MSB_DISCOVERY_IP} -v ACTIVEMQ_IP:${ACTIVEMQ_IP}" \ No newline at end of file
diff --git a/plans/msb/tcp-service/teardown.sh b/plans/msb/tcp-service/teardown.sh
new file mode 100644
index 00000000..36ee889f
--- /dev/null
+++ b/plans/msb/tcp-service/teardown.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE, Inc. and others.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+kill-instance.sh msb_consul
+kill-instance.sh msb_discovery
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh i-activemq
diff --git a/plans/msb/tcp-service/testplan.txt b/plans/msb/tcp-service/testplan.txt
new file mode 100644
index 00000000..ba8f6f28
--- /dev/null
+++ b/plans/msb/tcp-service/testplan.txt
@@ -0,0 +1,4 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+msb/tcp-service-discovery
+msb/tcp-service-access \ No newline at end of file
diff --git a/plans/multicloud-ocata/functionality1/setup.sh b/plans/multicloud-ocata/functionality1/setup.sh
new file mode 100644
index 00000000..3cba6813
--- /dev/null
+++ b/plans/multicloud-ocata/functionality1/setup.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+#
+# Copyright (c) 2017 Wind River Systems, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+pushd ${SCRIPTS}
+
+# start multicloud-ocata
+./run-instance.sh nexus3.onap.org:10001/onap/multicloud/openstack/openstack-ocata:latest multicloud-ocata
+SERVICE_IP=$(./get-instance-ip.sh multicloud-ocata)
+SERVICE_PORT=9006
+popd
+
+if [[ $no_proxy && $no_proxy != *$SERVICE_IP* ]]; then
+ export no_proxy+=$no_proxy,$SERVICE_IP
+fi
+
+for i in {1..50}; do
+ curl -sS ${SERVICE_IP}:${SERVICE_PORT} && break
+ echo sleep $i
+ sleep $i
+done
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES+="-v SERVICE_IP:${SERVICE_IP} "
+ROBOT_VARIABLES+="-v SERVICE_PORT:${SERVICE_PORT} "
diff --git a/plans/multicloud-ocata/functionality1/teardown.sh b/plans/multicloud-ocata/functionality1/teardown.sh
new file mode 100644
index 00000000..6ecb74eb
--- /dev/null
+++ b/plans/multicloud-ocata/functionality1/teardown.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+#
+# Copyright (c) 2017 Wind River Systems, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh multicloud-ocata
diff --git a/plans/multicloud-ocata/functionality1/testplan.txt b/plans/multicloud-ocata/functionality1/testplan.txt
new file mode 100644
index 00000000..fcd795da
--- /dev/null
+++ b/plans/multicloud-ocata/functionality1/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+multicloud-ocata/provision/sanity_test_multicloud.robot
diff --git a/plans/multicloud-ocata/hpa-discovery/setup.sh b/plans/multicloud-ocata/hpa-discovery/setup.sh
new file mode 100644
index 00000000..d17bec12
--- /dev/null
+++ b/plans/multicloud-ocata/hpa-discovery/setup.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+#
+# Copyright 2018 Intel Corporation, Inc
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cd ${SCRIPTS}
+
+source common_functions.sh
+
+generic_sim_path=${WORKSPACE}/test/csit/scripts/multicloud-ocata/generic_sim
+multicloud_provision_path=${WORKSPACE}/test/csit/tests/multicloud-ocata/provision
+# start generic simulator for openstack mock and AAI mock
+if [[ -z $(docker images -q generic_sim) ]]; then
+ pushd $generic_sim_path
+ docker build -t generic_sim .
+ popd
+fi
+
+function start_simulator ()
+{
+ local service_name=$1
+ local service_port=$2
+
+ ./run-instance.sh generic_sim $service_name "-v ${multicloud_provision_path}/${service_name}/:/tmp/generic_sim/ -v ${generic_sim_path}/${service_name}/:/etc/generic_sim/ -p $service_port:8080"
+ wait_for_service_init localhost:$service_port
+ bypass_ip_adress $service_name
+}
+
+start_simulator nova 8774
+start_simulator glance 9292
+start_simulator cinder 8776
+start_simulator keystone 5000
+start_simulator aai 8443
+
+# start multicloud-ocata
+./run-instance.sh nexus3.onap.org:10001/onap/multicloud/openstack/openstack-ocata multicloud-ocata "-t -e AAI_SERVICE_URL=http://aai:8080/aai -e no_proxy=$no_proxy -p 9006:9006"
+SERVICE_IP=$(./get-instance-ip.sh multicloud-ocata)
+SERVICE_PORT=9006
+
+docker network create hpa-net
+for container in aai keystone glance cinder nova multicloud-ocata; do
+ docker network connect hpa-net $container
+done
+
+bypass_ip_adress $SERVICE_IP
+wait_for_service_init ${SERVICE_IP}:${SERVICE_PORT}
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES+="-v SERVICE_IP:${SERVICE_IP} "
+ROBOT_VARIABLES+="-v SERVICE_PORT:${SERVICE_PORT} "
diff --git a/plans/multicloud-ocata/hpa-discovery/teardown.sh b/plans/multicloud-ocata/hpa-discovery/teardown.sh
new file mode 100644
index 00000000..b80f2e45
--- /dev/null
+++ b/plans/multicloud-ocata/hpa-discovery/teardown.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+#
+# Copyright 2018 Intel Corporation, Inc
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+for container in aai keystone cinder glance nova multicloud-ocata; do
+ kill-instance.sh $container
+done
+docker network rm hpa-net
diff --git a/plans/multicloud-ocata/hpa-discovery/testplan.txt b/plans/multicloud-ocata/hpa-discovery/testplan.txt
new file mode 100644
index 00000000..9394379e
--- /dev/null
+++ b/plans/multicloud-ocata/hpa-discovery/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+multicloud-ocata/provision/hpa_multicloud.robot
diff --git a/plans/multicloud-pike/functionality1/setup.sh b/plans/multicloud-pike/functionality1/setup.sh
new file mode 100644
index 00000000..57e81812
--- /dev/null
+++ b/plans/multicloud-pike/functionality1/setup.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+#
+# Copyright (c) 2017-2018 Intel, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+pushd ${SCRIPTS}
+
+# start multicloud-pike
+./run-instance.sh nexus3.onap.org:10001/onap/multicloud/openstack-pike:latest multicloud-pike
+SERVICE_IP=$(./get-instance-ip.sh multicloud-pike)
+SERVICE_PORT=9007
+popd
+
+if [[ $no_proxy && $no_proxy != *$SERVICE_IP* ]]; then
+ export no_proxy+=$no_proxy,$SERVICE_IP
+fi
+
+for i in {1..50}; do
+ curl -sS ${SERVICE_IP}:${SERVICE_PORT} && break
+ echo sleep $i
+ sleep $i
+done
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES+="-v SERVICE_IP:${SERVICE_IP} "
+ROBOT_VARIABLES+="-v SERVICE_PORT:${SERVICE_PORT} "
diff --git a/plans/multicloud-pike/functionality1/teardown.sh b/plans/multicloud-pike/functionality1/teardown.sh
new file mode 100644
index 00000000..13b70628
--- /dev/null
+++ b/plans/multicloud-pike/functionality1/teardown.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+#
+# Copyright (c) 2017-2018 Intel, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh multicloud-pike
diff --git a/plans/multicloud-pike/functionality1/testplan.txt b/plans/multicloud-pike/functionality1/testplan.txt
new file mode 100644
index 00000000..7f460164
--- /dev/null
+++ b/plans/multicloud-pike/functionality1/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+multicloud-pike/provision/sanity_test_multicloud.robot
diff --git a/plans/multicloud-pike/hpa-discovery/setup.sh b/plans/multicloud-pike/hpa-discovery/setup.sh
new file mode 100644
index 00000000..cbcc302e
--- /dev/null
+++ b/plans/multicloud-pike/hpa-discovery/setup.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+#
+# Copyright 2018 Intel Corporation, Inc
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cd ${SCRIPTS}
+
+source common_functions.sh
+
+generic_sim_path=${WORKSPACE}/test/csit/scripts/multicloud-pike/generic_sim
+multicloud_provision_path=${WORKSPACE}/test/csit/tests/multicloud-pike/provision
+# start generic simulator for openstack mock and AAI mock
+if [[ -z $(docker images -q generic_sim) ]]; then
+ pushd $generic_sim_path
+ docker build -t generic_sim .
+ popd
+fi
+
+function start_simulator ()
+{
+ local service_name=$1
+ local service_port=$2
+
+ ./run-instance.sh generic_sim $service_name "-v ${multicloud_provision_path}/${service_name}/:/tmp/generic_sim/ -v ${generic_sim_path}/${service_name}/:/etc/generic_sim/ -p $service_port:8080"
+ wait_for_service_init localhost:$service_port
+ bypass_ip_adress $service_name
+}
+
+start_simulator nova 8774
+start_simulator glance 9292
+start_simulator cinder 8776
+start_simulator keystone 5000
+start_simulator aai 8443
+
+# start multicloud-pike
+./run-instance.sh nexus3.onap.org:10001/onap/multicloud/openstack-pike multicloud-pike "-t -e AAI_SERVICE_URL=http://aai:8080/aai -e no_proxy=$no_proxy -p 9007:9007"
+SERVICE_IP=$(./get-instance-ip.sh multicloud-pike)
+SERVICE_PORT=9007
+
+docker network create hpa-net
+for container in aai keystone glance cinder nova multicloud-pike; do
+ docker network connect hpa-net $container
+done
+
+bypass_ip_adress $SERVICE_IP
+wait_for_service_init ${SERVICE_IP}:${SERVICE_PORT}
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES+="-v SERVICE_IP:${SERVICE_IP} "
+ROBOT_VARIABLES+="-v SERVICE_PORT:${SERVICE_PORT} "
diff --git a/plans/multicloud-pike/hpa-discovery/teardown.sh b/plans/multicloud-pike/hpa-discovery/teardown.sh
new file mode 100644
index 00000000..7d6c9535
--- /dev/null
+++ b/plans/multicloud-pike/hpa-discovery/teardown.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+#
+# Copyright 2018 Intel Corporation, Inc
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+for container in aai keystone cinder glance nova multicloud-pike; do
+ kill-instance.sh $container
+done
+docker network rm hpa-net
diff --git a/plans/multicloud-pike/hpa-discovery/testplan.txt b/plans/multicloud-pike/hpa-discovery/testplan.txt
new file mode 100644
index 00000000..5914cbba
--- /dev/null
+++ b/plans/multicloud-pike/hpa-discovery/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+multicloud-pike/provision/hpa_multicloud.robot
diff --git a/plans/multicloud-vmware/functionality1/setup.sh b/plans/multicloud-vmware/functionality1/setup.sh
new file mode 100755
index 00000000..d71d5c42
--- /dev/null
+++ b/plans/multicloud-vmware/functionality1/setup.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+source ${SCRIPTS}/common_functions.sh
+
+# start multicloud-vio
+docker run -d --name multicloud-vio nexus3.onap.org:10001/onap/multicloud/vio
+VIO_IP=`get-instance-ip.sh multicloud-vio`
+for i in {1..50}; do
+ curl -sS ${VIO_IP}:9004 && break
+ echo sleep $i
+ sleep $i
+done
+
+echo SCRIPTS
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v VIO_IP:${VIO_IP} -v SCRIPTS:${SCRIPTS}"
diff --git a/plans/multicloud-vmware/functionality1/teardown.sh b/plans/multicloud-vmware/functionality1/teardown.sh
new file mode 100755
index 00000000..546e0126
--- /dev/null
+++ b/plans/multicloud-vmware/functionality1/teardown.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh multicloud-vio
diff --git a/plans/multicloud-vmware/functionality1/testplan.txt b/plans/multicloud-vmware/functionality1/testplan.txt
new file mode 100644
index 00000000..0a2ad45a
--- /dev/null
+++ b/plans/multicloud-vmware/functionality1/testplan.txt
@@ -0,0 +1,13 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+multicloud-vmware/provision/sanity_test_vio.robot
+multicloud-vmware/provision/sanity_test_tenant.robot
+multicloud-vmware/provision/sanity_test_image.robot
+multicloud-vmware/provision/sanity_test_neutron.robot
+multicloud-vmware/nova/sanity-flavor.robot
+multicloud-vmware/nova/sanity-host.robot
+multicloud-vmware/nova/sanity-server.robot
+multicloud-vmware/samples/sanity-sample.robot
+multicloud-vmware/hosts/sanity-host.robot
+multicloud-vmware/networks/sanity-network.robot
+multicloud-vmware/images/sanity-image.robot
diff --git a/plans/multicloud-windriver/functionality1/setup.sh b/plans/multicloud-windriver/functionality1/setup.sh
new file mode 100644
index 00000000..f2025c98
--- /dev/null
+++ b/plans/multicloud-windriver/functionality1/setup.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+#
+# Copyright (c) 2017 Wind River Systems, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+source ${SCRIPTS}/common_functions.sh
+
+# start multicloud-windriver
+docker run -d --name multicloud-windriver nexus3.onap.org:10001/onap/multicloud/openstack-windriver
+SERVICE_IP=`get-instance-ip.sh multicloud-windriver`
+SERVICE_PORT=9005
+
+for i in {1..50}; do
+ curl -sS ${SERVICE_IP}:${SERVICE_PORT} && break
+ echo sleep $i
+ sleep $i
+done
+
+echo SCRIPTS
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES+="-v SERVICE_IP:${SERVICE_IP} "
+ROBOT_VARIABLES+="-v SERVICE_PORT:${SERVICE_PORT} "
diff --git a/plans/multicloud-windriver/functionality1/teardown.sh b/plans/multicloud-windriver/functionality1/teardown.sh
new file mode 100644
index 00000000..10a6bc05
--- /dev/null
+++ b/plans/multicloud-windriver/functionality1/teardown.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+#
+# Copyright (c) 2017 Wind River Systems, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh multicloud-windriver
diff --git a/plans/multicloud-windriver/functionality1/testplan.txt b/plans/multicloud-windriver/functionality1/testplan.txt
new file mode 100644
index 00000000..e59320b1
--- /dev/null
+++ b/plans/multicloud-windriver/functionality1/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+multicloud-windriver/provision/sanity_test_multicloud.robot
diff --git a/plans/multicloud/functionality1/setup.sh b/plans/multicloud/functionality1/setup.sh
new file mode 100755
index 00000000..50118a54
--- /dev/null
+++ b/plans/multicloud/functionality1/setup.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+source ${SCRIPTS}/common_functions.sh
+
+# start multivim-broker
+docker run -d --name multivim-vio nexus3.onap.org:10001/onap/multicloud/vio
+docker run -d --name multivim-broker --link multivim-vio -e MSB_ADDR=multivim-vio -e MSB_PORT=9004 nexus3.onap.org:10001/onap/multicloud/framework
+
+BROKER_IP=`get-instance-ip.sh multivim-broker`
+for i in {1..50}; do
+ curl -sS ${BROKER_IP}:9001 && break
+ echo sleep $i
+ sleep $i
+done
+
+echo SCRIPTS
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v BROKER_IP:${BROKER_IP}"
diff --git a/plans/multicloud/functionality1/teardown.sh b/plans/multicloud/functionality1/teardown.sh
new file mode 100755
index 00000000..a2ef0e35
--- /dev/null
+++ b/plans/multicloud/functionality1/teardown.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh multivim-vio
+kill-instance.sh multivim-broker
diff --git a/plans/multicloud/functionality1/testplan.txt b/plans/multicloud/functionality1/testplan.txt
new file mode 100644
index 00000000..f515c64d
--- /dev/null
+++ b/plans/multicloud/functionality1/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+multicloud/provision/sanity_test_multivim.robot
diff --git a/plans/music/music-distributed-kv-store-test-plan/setup.sh b/plans/music/music-distributed-kv-store-test-plan/setup.sh
new file mode 100644
index 00000000..88becf69
--- /dev/null
+++ b/plans/music/music-distributed-kv-store-test-plan/setup.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+#
+# Copyright 2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Not sure why this is needed.
+source ${SCRIPTS}/common_functions.sh
+
+# Initial Configuration.
+DATASTORE="consul"
+DATASTORE_IP="localhost"
+
+MOUNTPATH="/dkv_mount_path/configs/"
+DEFAULT_CONFIGS=$(pwd)/mountpath/default
+
+mkdir -p mountpath/default
+
+pushd mountpath/default
+cat << EOF > sampleConfig1.properties
+foo1=bar1
+hello1=world1
+key1=value1
+EOF
+cat << EOF > sampleConfig2.properties
+foo2=bar2
+hello2=world2
+key2=value2
+EOF
+popd
+
+docker login -u docker -p docker nexus3.onap.org:10001
+docker pull nexus3.onap.org:10001/onap/music/distributed-kv-store
+docker run -e DATASTORE=$DATASTORE -e DATASTORE_IP=$DATASTORE_IP -e MOUNTPATH=$MOUNTPATH -d \
+ --name dkv \
+ -v $DEFAULT_CONFIGS:/dkv_mount_path/configs/default \
+ -p 8200:8200 -p 8080:8080 nexus3.onap.org:10001/onap/music/distributed-kv-store
+
+
+echo "###### WAITING FOR DISTRIBUTED KV STORE CONTAINER TO COME UP"
+sleep 10
+
+#
+# add here all ROBOT_VARIABLES settings
+#
+echo "# music robot variables settings";
+ROBOT_VARIABLES="-v DKV_HOSTNAME:http://localhost -v DKV_PORT:8080"
+
+echo ${ROBOT_VARIABLES} \ No newline at end of file
diff --git a/plans/music/music-distributed-kv-store-test-plan/teardown.sh b/plans/music/music-distributed-kv-store-test-plan/teardown.sh
new file mode 100644
index 00000000..0abf3a62
--- /dev/null
+++ b/plans/music/music-distributed-kv-store-test-plan/teardown.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# Copyright 2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+rm -rf mountpath
+docker stop dkv
+docker rm dkv
+docker rmi nexus3.onap.org:10001/onap/music/distributed-kv-store
diff --git a/plans/music/music-distributed-kv-store-test-plan/testplan.txt b/plans/music/music-distributed-kv-store-test-plan/testplan.txt
new file mode 100644
index 00000000..ac37bc5a
--- /dev/null
+++ b/plans/music/music-distributed-kv-store-test-plan/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+music/music-distributed-kv-store-suite \ No newline at end of file
diff --git a/plans/music/music-test-plan/setup.sh b/plans/music/music-test-plan/setup.sh
new file mode 100755
index 00000000..7775bc52
--- /dev/null
+++ b/plans/music/music-test-plan/setup.sh
@@ -0,0 +1,164 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# add here eventual scripts needed for music
+#
+echo "########## music scripts calling ##########";
+source ${WORKSPACE}/test/csit/scripts/music/music-scripts/music_script.sh
+
+#
+# add here all the configuration steps eventually needed to be carried out for music CSIT testing
+#
+echo "########## music configuration step ##########";
+CASS_IMG=nexus3.onap.org:10001/onap/music/cassandra_3_11:latest
+CASS_IMG_JOB=nexus3.onap.org:10001/onap/music/cassandra_job:latest
+TOMCAT_IMG=nexus3.onap.org:10001/library/tomcat:8.5
+ZK_IMG=nexus3.onap.org:10001/library/zookeeper:3.4
+BUSYBOX_IMG=nexus3.onap.org:10001/library/busybox:latest
+MUSIC_IMG=nexus3.onap.org:10001/onap/music/music:latest
+TT=10
+WORK_DIR=/tmp/music
+CASS_USERNAME=nelson24
+CASS_PASSWORD=winman123
+MUSIC_SOURCE_PROPERTIES=${WORKSPACE}/test/csit/scripts/music/music-properties
+MUSIC_PROPERTIES=/tmp/music/properties
+MUSIC_LOGS=/tmp/music/logs
+CQL_FILES=${WORKSPACE}/test/csit/scripts/music/cql
+MUSIC_TRIGGER_DIR=/tmp/triggers
+TRIGGER_JAR=musictrigger-0.1.0.jar
+TRIGGER_JAR_URL=https://nexus.onap.org/service/local/repositories/autorelease-72298/content/org/onap/music/musictrigger/0.1.0/musictrigger-0.1.0.jar
+
+mkdir -p ${MUSIC_PROPERTIES}
+mkdir -p ${MUSIC_LOGS}
+mkdir -p ${MUSIC_LOGS}/MUSIC
+mkdir -p /tmp/triggers
+
+# Get Trigger
+echo "########## Get Trigger Jar ##########"
+curl -o $MUSIC_TRIGGER_DIR/$TRIGGER_JAR $TRIGGER_JAR_URL
+
+cp ${MUSIC_SOURCE_PROPERTIES}/* ${WORK_DIR}/properties
+
+# Create Volume for mapping war file and tomcat
+echo "########## create music-vol ##########"
+docker volume create --name music-vol;
+
+# Create a network for all the containers to run in.
+echo "########## create music-net ##########"
+docker network create music-net;
+
+# Start Cassandra
+echo "########## Start Cassandra (music-db) ##########"
+docker run -d --name music-db --network music-net -p "7000:7000" -p "7001:7001" -p "7199:7199" -p "9042:9042" -p "9160:9160" \
+-v $MUSIC_TRIGGER_DIR/$TRIGGER_JAR:/etc/cassandra/triggers/$TRIGGER_JAR \
+${CASS_IMG};
+
+CASSA_IP=`docker inspect -f '{{ $network := index .NetworkSettings.Networks "music-net" }}{{ $network.IPAddress}}' music-db`
+echo "CASSANDRA_IP=${CASSA_IP}"
+${WORKSPACE}/test/csit/scripts/optf-has/has/wait_for_port.sh ${CASSA_IP} 9042
+
+# See if cassandra is up.
+echo "########## Running Test to see if Cassandra is up ##########"
+docker run --name music-casstest --network music-net \
+$BUSYBOX_IMG sh -c "until nc -z music-db 9042 && echo "success"; do echo 'No connection .. Sleeping for $TT seconds';sleep $TT; done;"
+
+# Check to see if Keyspaces are there.
+docker exec music-db cqlsh -u cassandra -p cassandra -e "DESCRIBE keyspaces;"
+
+sleep 10;
+
+# Load data into Cassandra via Cassandra Job
+echo "########## Running Cassandra Job (music-job) to load cql files ##########"
+docker run -d --name music-job --network music-net \
+-v $CQL_FILES/admin.cql:/cql/admin.cql \
+-v $CQL_FILES/admin_pw.cql:/cql/admin_pw.cql \
+-v $CQL_FILES/extra:/cql/extra \
+-e PORT=9042 \
+-e CASS_HOSTNAME=music-db \
+-e USERNAME=$CASS_USERNAME \
+-e PASSWORD=$CASS_PASSWORD \
+$CASS_IMG_JOB
+# Logs
+echo "########## Cassandra Job logs ##########"
+docker logs music-job
+
+# Start Music war
+echo "########## Start music-war ##########"
+docker run -d --name music-war -v music-vol:/app ${MUSIC_IMG};
+
+# Start Zookeeper
+echo "########## Start zookeeper (music-zk) ##########"
+docker run -d --name music-zk --network music-net -p "2181:2181" -p "2888:2888" -p "3888:3888" ${ZK_IMG};
+
+ZOO_IP=`docker inspect -f '{{ $network := index .NetworkSettings.Networks "music-net" }}{{ $network.IPAddress}}' music-zk`
+echo "ZOOKEEPER_IP=${ZOO_IP}"
+
+# Delay between Cassandra/Zookeeper and Tomcat
+sleep 10;
+
+# Start Up tomcat - Needs to have properties,logs dir and war file volume mapped.
+echo "########## Start Tomcat (music-tomcat) ##########"
+docker run -d --name music-tomcat --network music-net -p "8080:8080" -v music-vol:/usr/local/tomcat/webapps -v ${WORK_DIR}/properties:/opt/app/music/etc:ro -v ${WORK_DIR}/logs:/opt/app/music/logs ${TOMCAT_IMG};
+
+# Connect tomcat to host bridge network so that its port can be seen.
+echo "########## Create Bridge for Tomcat ##########"
+docker network connect bridge music-tomcat;
+
+TOMCAT_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' music-tomcat`
+echo "TOMCAT_IP=${TOMCAT_IP}"
+
+${WORKSPACE}/test/csit/scripts/music/music-scripts/wait_for_port.sh ${TOMCAT_IP} 8080
+
+sleep 20;
+echo "########## TOMCAT Logs ##########"
+docker logs music-tomcat
+# Needed only if we need to look at localhost logs.
+echo "########## MUSIC localhost Log ##########"
+docker exec music-tomcat /bin/bash -c "cat /usr/local/tomcat/logs/localhost*"
+
+echo "########## MUSIC Log ##########"
+ls -al $MUSIC_LOGS/MUSIC
+docker exec music-tomcat /bin/bash -c "cat /opt/app/music/logs/MUSIC/music.log"
+#echo "########## MUSIC error log ##########"
+#docker exec music-tomcat /bin/bash -c "cat /opt/app/music/logs/MUSIC/error.log"
+
+echo "########## inspect docker things for tracing purpose ##########"
+docker inspect music-db
+docker inspect music-zk
+docker inspect music-tomcat
+docker inspect music-war
+docker volume inspect music-vol
+docker network inspect music-net
+
+echo "########## dump music content just after music is started ##########"
+docker exec music-db /usr/bin/nodetool status
+docker exec music-db /usr/bin/cqlsh -unelson24 -pwinman123 -e 'SELECT * FROM system_schema.keyspaces'
+docker exec music-db /usr/bin/cqlsh -unelson24 -pwinman123 -e 'DESCRIBE keyspace admin'
+docker exec music-db /usr/bin/cqlsh -unelson24 -pwinman123 -e 'SELECT * FROM admin.keyspace_master'
+
+
+#
+# add here all ROBOT_VARIABLES settings
+#
+echo "########## music robot variables settings ##########";
+ROBOT_VARIABLES="-v MUSIC_HOSTNAME:http://${TOMCAT_IP} -v MUSIC_PORT:8080 -v COND_HOSTNAME:http://localhost -v COND_PORT:8091"
+
+echo ${ROBOT_VARIABLES}
+
+
+
diff --git a/plans/music/music-test-plan/teardown.sh b/plans/music/music-test-plan/teardown.sh
new file mode 100755
index 00000000..e05ef9d1
--- /dev/null
+++ b/plans/music/music-test-plan/teardown.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+
+#
+# add here below the killing of all docker containers used for music CSIT testing
+#
+echo "dump music.log files"
+ls -alF /tmp/music
+ls -alFR /tmp/music
+ls -alF /tmp/music/properties
+cat /tmp/music/properties/music.properties
+echo "===== MUSIC log =================="
+docker exec music-tomcat /bin/bash -c "cat /opt/app/music/logs/MUSIC/music.log"
+#cat /tmp/music/logs/MUSIC/music.log
+echo "===== MUSIC error log =================="
+docker exec music-tomcat /bin/bash -c "cat /opt/app/music/logs/MUSIC/error.log"
+#cat /tmp/music/logs/MUSIC/error.log
+
+echo "##########################################################";
+echo "#";
+echo "# music scripts docker containers killing";
+echo "#";
+echo "##########################################################";
+docker stop music-tomcat
+docker stop music-war
+docker stop music-zk
+docker stop music-job
+docker stop music-casstest
+docker stop music-db
+
+docker rm music-zk
+docker rm music-tomcat
+docker rm music-war
+docker rm music-job
+docker rm music-casstest
+docker rm music-db
+
+docker network rm music-net;
+sleep 5;
+
+docker volume rm music-vol
+
+#rm -Rf /tmp/music
+
+
+
+
+
diff --git a/plans/music/music-test-plan/testplan.txt b/plans/music/music-test-plan/testplan.txt
new file mode 100644
index 00000000..e53f3267
--- /dev/null
+++ b/plans/music/music-test-plan/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+music/music-suite
diff --git a/plans/optf-has/has/setup.sh b/plans/optf-has/has/setup.sh
new file mode 100755
index 00000000..a0bef71d
--- /dev/null
+++ b/plans/optf-has/has/setup.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+
+#
+# add here eventual scripts needed for music
+#
+echo "# music scripts calling";
+source ${WORKSPACE}/test/csit/scripts/optf-has/has/music_script.sh
+
+
+#
+echo "# simulator scripts calling";
+source ${WORKSPACE}/test/csit/scripts/optf-has/has/simulator_script.sh
+
+# add here eventual scripts needed for optf/has
+#
+echo "# optf/has scripts calling";
+source ${WORKSPACE}/test/csit/scripts/optf-has/has/has_script.sh
+
+#
+# add here below the start of all docker containers needed for optf/has CSIT testing
+#
+echo "# optf/has scripts docker containers spinoff";
+
+#
+# add here all the configuration steps eventually needed to be carried out for optf/has CSIT testing
+#
+echo "# optf/has configuration step";
+
+
+#
+# add here all ROBOT_VARIABLES settings
+#
+echo "# optf/has robot variables settings";
+echo "conductor ip = ${COND_IP}"
+echo "music ip = ${TOMCAT_IP}"
+
+ROBOT_VARIABLES="-v MUSIC_HOSTNAME:http://${TOMCAT_IP} -v MUSIC_PORT:8080 -v COND_HOSTNAME:http://${COND_IP} -v COND_PORT:8091"
+
+echo ${ROBOT_VARIABLES}
+
+
+
diff --git a/plans/optf-has/has/teardown.sh b/plans/optf-has/has/teardown.sh
new file mode 100755
index 00000000..41d7aff2
--- /dev/null
+++ b/plans/optf-has/has/teardown.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+
+#
+# add here below the killing of all docker containers used for optf/has CSIT testing
+#
+
+#
+# optf/has scripts docker containers killing";
+#
+echo "# optf/has has scripts calling";
+source ${WORKSPACE}/test/csit/scripts/optf-has/has/has_teardown_script.sh
+
+echo "# optf/has simulator scripts calling";
+source ${WORKSPACE}/test/csit/scripts/optf-has/has/simulator_teardown_script.sh
+
+echo "# optf/has music scripts calling";
+source ${WORKSPACE}/test/csit/scripts/optf-has/has/music_teardown_script.sh
+
diff --git a/plans/optf-has/has/testplan.txt b/plans/optf-has/has/testplan.txt
new file mode 100644
index 00000000..980050c9
--- /dev/null
+++ b/plans/optf-has/has/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+optf-has/has
diff --git a/plans/optf-has/osdf/sample.txt b/plans/optf-has/osdf/sample.txt
new file mode 100644
index 00000000..9f4e8d7d
--- /dev/null
+++ b/plans/optf-has/osdf/sample.txt
@@ -0,0 +1 @@
+#test
diff --git a/plans/policy/apex-pdp/setup.sh b/plans/policy/apex-pdp/setup.sh
new file mode 100644
index 00000000..7ab5b9e2
--- /dev/null
+++ b/plans/policy/apex-pdp/setup.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+# ============LICENSE_START=======================================================
+# Copyright (C) 2018 Ericsson. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+docker run -d --name apex -p 12561:12561 -p 23324:23324 -it nexus3.onap.org:10001/onap/policy-apex-pdp:2.0-SNAPSHOT-latest /bin/bash -c "/opt/app/policy/apex-pdp/bin/apexEngine.sh -c /opt/app/policy/apex-pdp/examples/config/SampleDomain/RESTServerJsonEvent.json"
+
+APEX_IP=`get-instance-ip.sh apex`
+echo APEX IP IS ${APEX_IP}
+Wait for initialization
+for i in {1..10}; do
+ curl -sS ${APEX_IP}:23324 && break
+ echo sleep $i
+ sleep $i
+done
+
+ROBOT_VARIABLES="-v APEX_IP:${APEX_IP}"
diff --git a/plans/policy/apex-pdp/teardown.sh b/plans/policy/apex-pdp/teardown.sh
new file mode 100644
index 00000000..ca8e92e6
--- /dev/null
+++ b/plans/policy/apex-pdp/teardown.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+# ============LICENSE_START=======================================================
+# Copyright (C) 2018 Ericsson. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+kill-instance.sh apex
diff --git a/plans/policy/apex-pdp/testplan.txt b/plans/policy/apex-pdp/testplan.txt
new file mode 100644
index 00000000..cee9abda
--- /dev/null
+++ b/plans/policy/apex-pdp/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+policy/apex-pdp/apex-pdp-test.robot
diff --git a/plans/policy/distribution/setup.sh b/plans/policy/distribution/setup.sh
new file mode 100644
index 00000000..9b894e3d
--- /dev/null
+++ b/plans/policy/distribution/setup.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+# ============LICENSE_START=======================================================
+# Copyright (C) 2018 Ericsson. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+docker run -d --name policy-distribution -p 6969:6969 -it nexus3.onap.org:10001/onap/policy-distribution:2.0.0-SNAPSHOT-latest
+
+POLICY_DISTRIBUTION_IP=`get-instance-ip.sh policy-distribution`
+echo DISTRIBUTION IP IS ${POLICY_DISTRIBUTION_IP}
+Wait for initialization
+for i in {1..10}; do
+ curl -sS ${POLICY_DISTRIBUTION_IP}:6969 && break
+ echo sleep $i
+ sleep $i
+done
+
+ROBOT_VARIABLES="-v POLICY_DISTRIBUTION_IP:${POLICY_DISTRIBUTION_IP}"
diff --git a/plans/policy/distribution/teardown.sh b/plans/policy/distribution/teardown.sh
new file mode 100644
index 00000000..562df6b3
--- /dev/null
+++ b/plans/policy/distribution/teardown.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+# ============LICENSE_START=======================================================
+# Copyright (C) 2018 Ericsson. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+kill-instance.sh policy-distribution
diff --git a/plans/policy/distribution/testplan.txt b/plans/policy/distribution/testplan.txt
new file mode 100644
index 00000000..6f74cce4
--- /dev/null
+++ b/plans/policy/distribution/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+policy/distribution/distribution-test.robot
diff --git a/plans/policy/health/setup.sh b/plans/policy/health/setup.sh
new file mode 100755
index 00000000..21f58eb6
--- /dev/null
+++ b/plans/policy/health/setup.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+#
+# Copyright 2017 AT&T Intellectual Property. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+source ${SCRIPTS}/common_functions.sh
+
+docker run --name i-mock -d jamesdbloom/mockserver
+MOCK_IP=`get-instance-ip.sh i-mock`
+echo ${MOCK_IP}
+
+docker inspect i-mock
+
+# Wait for initialization
+for i in {1..10}; do
+ curl -sS ${MOCK_IP}:1080 && break
+ echo sleep $i
+ sleep $i
+done
+
+${WORKSPACE}/test/csit/scripts/policy/mock-hello.sh ${MOCK_IP}
+
+source ${WORKSPACE}/test/csit/scripts/policy/script1.sh
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MOCK_IP:${MOCK_IP} -v IP:${IP} -v POLICY_IP:${POLICY_IP} -v PDP_IP:${PDP_IP} -v DOCKER_IP:${DOCKER_IP}"
+export PDP_IP=${PDP_IP}
+export POLICY_IP=${POLICY_IP}
+export DOCKER_IP=${DOCKER_IP}
+
+#Get current IP of VM
+HOST_IP=$(ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}')
+export HOST_IP=${HOST_IP}
diff --git a/plans/policy/health/teardown.sh b/plans/policy/health/teardown.sh
new file mode 100755
index 00000000..f1f0b21c
--- /dev/null
+++ b/plans/policy/health/teardown.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+#
+# Copyright 2017 AT&T Intellectual Property. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+function kill_instance() {
+local name=$1
+docker logs "${name}" >> "${WORKSPACE}"/archives/"${name}".log
+docker kill "${name}"
+docker rm -v "${name}"
+}
+
+mkdir -p "${WORKSPACE}"/archives
+
+kill_instance i-mock
+kill_instance drools
+kill_instance pdp
+kill_instance brmsgw
+kill_instance pap
+kill_instance nexus
+kill_instance mariadb
+
+rm -fr "${WORK_DIR}"
+
diff --git a/plans/policy/health/testplan.txt b/plans/policy/health/testplan.txt
new file mode 100644
index 00000000..bb858748
--- /dev/null
+++ b/plans/policy/health/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+policy/suite1
diff --git a/plans/portal-sdk/testsuite/.env b/plans/portal-sdk/testsuite/.env
new file mode 100644
index 00000000..27e9aa3f
--- /dev/null
+++ b/plans/portal-sdk/testsuite/.env
@@ -0,0 +1,42 @@
+# Environment settings
+# used by docker-compose AND by other shell scripts
+# Host directory with config files
+
+# Following are ALSO used in demo/boot/portal_vm_init.sh
+EP_IMG_NAME=onap/portal-app
+SDK_IMG_NAME=onap/portal-sdk
+DB_IMG_NAME=onap/portal-db
+CDR_IMG_NAME=onap/music/cassandra_music
+ZK_IMG_NAME=zookeeper
+WMS_IMG_NAME=onap/portal-wms
+# Deployed with portal; built elsewhere
+CLI_IMG_NAME=onap/cli
+
+# Tag all images with this
+DOCKER_IMAGE_VERSION=2.1-STAGING-latest
+CLI_DOCKER_VERSION=1.1-STAGING-latest
+CDR_IMAGE_VERSION=latest
+ZK_IMAGE_VERSION=3.4
+NEXUS_DOCKER_REPO=nexus3.onap.org:10003
+
+# This is used during builds and in docker-compose;
+# it is never published to the ONAP registry.
+PORTAL_TAG=beijing
+
+# Name of directory in apps container (NOT host)
+WEBAPPS_DIR=/opt/apache-tomcat-8.0.37/webapps
+
+# Required settings with default values.
+# Export shell environment variables on ALL hosts.
+LOGS_DIR=./logs
+PROPS_DIR=./properties
+
+# Optional settings with no defaults.
+EXTRA_HOST_IP=""
+EXTRA_HOST_NAME=""
+# Export shell environment variables on hosts with no DNS;
+# a line is added to docker container's /etc/hosts.
+# For example:
+#EXTRA_HOST_IP="-i ${HOST_IP}"
+#EXTRA_HOST_NAME="-n portal.api.simpledemo.openecomp.org"
+
diff --git a/plans/portal-sdk/testsuite/docker-compose.yml b/plans/portal-sdk/testsuite/docker-compose.yml
new file mode 100644
index 00000000..dda74c91
--- /dev/null
+++ b/plans/portal-sdk/testsuite/docker-compose.yml
@@ -0,0 +1,151 @@
+# docker-compose for ONAP portal containers: database, microservice, portal apps.
+# Relies on .env file, which CANNOT be specified via command-line option
+# Works in multiple environments; does not pull from a Nexus registry.
+# Exposes the portal apps docker (but not DB nor WMS dockers) on the host network.
+# Images must be pulled from ONAP Nexus registry after logging in like this:
+# docker login -u USER -p PASS nexus3.onap.org:10001
+# Uses healthcheck feature added in docker-compose v2.1
+
+version: '2.1'
+
+services:
+
+ cli:
+ image: ${CLI_IMG_NAME}:${PORTAL_TAG}
+ environment:
+ CLI_MODE: 'daemon'
+ ports:
+ - 8080:80
+ - 9090:8080
+ logging:
+ driver: json-file
+
+ # Config files may use hostname "portal-db"
+ portal-db:
+ image: ${DB_IMG_NAME}:${PORTAL_TAG}
+ environment:
+ MYSQL_ROOT_PASSWORD: 'Aa123456'
+ expose:
+ - 3306
+ volumes:
+ # Just specify a path and let the Engine create a volume
+ - /var/lib/mysql
+ # Inject the onboarding script at start time
+ - ./Apps_Users_OnBoarding_Script.sql:/docker-entrypoint-initdb.d/zzz_apps_users_onboarding.sql
+ logging:
+ driver: json-file
+ healthcheck:
+ test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ]
+ timeout: 10s
+ retries: 30
+
+ # Config files may use hostname "portal-cassandra"
+ portal-cassandra:
+ image: ${CDR_IMG_NAME}:${PORTAL_TAG}
+ environment:
+ - CASSUSER=root
+ - CASSPASS=Aa123456
+ expose:
+ - 7000
+ - 7001
+ - 7199
+ - 9042
+ - 9160
+ ports:
+ - 7000:7000
+ - 7001:7001
+ - 7199:7199
+ - 9042:9042
+ - 9160:9160
+ volumes:
+ - ./portal.cql:/docker-entrypoint-initdb.d/zzz_portal.cql
+ - ./portalsdk.cql:/docker-entrypoint-initdb.d/zzz_portalsdk.cql
+ links:
+ - portal-db
+ depends_on:
+ portal-db:
+ condition: service_healthy
+
+ # Config files may use hostname "portal-zk"
+ portal-zk:
+ image: ${ZK_IMG_NAME}:${PORTAL_TAG}
+ expose:
+ - 2181
+ ports:
+ - 2181:2181
+
+ # The app config file uses the docker name above
+ portal-wms:
+ image: ${WMS_IMG_NAME}:${PORTAL_TAG}
+ expose:
+ - 8082
+ links:
+ - portal-db
+ depends_on:
+ portal-db:
+ condition: service_healthy
+ volumes:
+ - ${PROPS_DIR}/ONAPWIDGETMS/application.properties:/application.properties
+ - ${PROPS_DIR}/ONAPWIDGETMS/application.yml:/application.yml
+ command:
+ - /start-wms.sh
+ logging:
+ driver: json-file
+
+ portal-app:
+ image: ${EP_IMG_NAME}:${PORTAL_TAG}
+ ports:
+ - 8989:8080
+ - 8010:8009
+ - 8006:8005
+ links:
+ - portal-db
+ - portal-wms
+ - portal-zk
+ - portal-cassandra
+ depends_on:
+ portal-db:
+ condition: service_healthy
+ portal-wms:
+ condition: service_started
+ volumes:
+ - ${PROPS_DIR}/ONAPPORTAL/system.properties:${WEBAPPS_DIR}/ONAPPORTAL/WEB-INF/conf/system.properties
+ - ${PROPS_DIR}/ONAPPORTAL/fusion.properties:${WEBAPPS_DIR}/ONAPPORTAL/WEB-INF/fusion/conf/fusion.properties
+ - ${PROPS_DIR}/ONAPPORTAL/portal.properties:${WEBAPPS_DIR}/ONAPPORTAL/WEB-INF/classes/portal.properties
+ - ${PROPS_DIR}/ONAPPORTAL/music.properties:${WEBAPPS_DIR}/ONAPPORTAL/WEB-INF/classes/music.properties
+ - ${PROPS_DIR}/ONAPPORTAL/openid-connect.properties:${WEBAPPS_DIR}/ONAPPORTAL/WEB-INF/classes/openid-connect.properties
+ - ${PROPS_DIR}/ONAPPORTAL/logback.xml:${WEBAPPS_DIR}/ONAPPORTAL/WEB-INF/classes/logback.xml
+ - ${LOGS_DIR}:/opt/apache-tomcat-8.0.37/logs
+ command:
+ - /start-apache-tomcat.sh
+ # see comments in .env file
+ - -i
+ - $EXTRA_HOST_IP
+ - -n
+ - $EXTRA_HOST_NAME
+ logging:
+ driver: json-file
+
+ portal-sdk:
+ image: ${SDK_IMG_NAME}:${PORTAL_TAG}
+ ports:
+ - 8990:8080
+ links:
+ - portal-db
+ - portal-wms
+ - portal-zk
+ - portal-cassandra
+ depends_on:
+ portal-db:
+ condition: service_healthy
+ volumes:
+ - ${PROPS_DIR}/ONAPPORTALSDK/fusion.properties:${WEBAPPS_DIR}/ONAPPORTALSDK/WEB-INF/fusion/conf/fusion.properties
+ - ${PROPS_DIR}/ONAPPORTALSDK/system.properties:${WEBAPPS_DIR}/ONAPPORTALSDK/WEB-INF/conf/system.properties
+ - ${PROPS_DIR}/ONAPPORTALSDK/portal.properties:${WEBAPPS_DIR}/ONAPPORTALSDK/WEB-INF/classes/portal.properties
+ - ${PROPS_DIR}/ONAPPORTALSDK/music.properties:${WEBAPPS_DIR}/ONAPPORTALSDK/WEB-INF/classes/music.properties
+ - ${PROPS_DIR}/ONAPPORTALSDK/logback.xml:${WEBAPPS_DIR}/ONAPPORTALSDK/WEB-INF/classes/logback.xml
+ - ${LOGS_DIR}:/opt/apache-tomcat-8.0.37/logs
+ command:
+ - /start-apache-tomcat.sh
+ logging:
+ driver: json-file
diff --git a/plans/portal-sdk/testsuite/setup.sh b/plans/portal-sdk/testsuite/setup.sh
new file mode 100644
index 00000000..6510311c
--- /dev/null
+++ b/plans/portal-sdk/testsuite/setup.sh
@@ -0,0 +1,184 @@
+#!/bin/bash
+# Starts docker containers for ONAP Portal
+# This version for Amsterdam/R1 of Portal, uses docker-compose.
+# Temporarily maintained in portal/deliveries area;
+# replicated from the ONAP demo/boot area due to release concerns.
+
+# Start Xvfb
+echo -e "Starting Xvfb on display ${DISPLAY} with res ${RES}"
+Xvfb ${DISPLAY} -ac -screen 0 ${RES} +extension RANDR &
+XVFBPID=$!
+# Get pid of this spawned process to make sure we kill the correct process later
+
+#Get current IP of VM
+HOST_IP=$(ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}')
+export HOST_IP=${HOST_IP}
+
+
+
+if ! ifconfig docker0; then
+if ! ifconfig ens3; then
+echo "Could not determine IP address"
+exit 1
+fi
+export DOCKER_IP_IP=`ifconfig ens3 | awk -F: '/inet addr/ {gsub(/ .*/,"",$2); print $2}'`
+else
+export DOCKER_IP=`ifconfig docker0 | awk -F: '/inet addr/ {gsub(/ .*/,"",$2); print $2}'`
+fi
+echo $DOCKER_IP
+
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+#ROBOT_VARIABLES="-v MOCK_IP:${MOCK_IP} -v IP:${IP} -v POLICY_IP:${POLICY_IP} -v DOCKER_IP:${DOCKER_IP}"
+#export PORTAL_IP=${PORTAL_IP}
+ROBOT_VARIABLES="-v MOCK_IP:${MOCK_IP} -v IP:${IP} -v DOCKER_IP:${DOCKER_IP}"
+export DOCKER_IP=${DOCKER_IP}
+
+
+
+
+# be verbose
+set -x
+
+# Establish environment variables
+NEXUS_USERNAME=docker
+NEXUS_PASSWD=docker
+NEXUS_DOCKER_REPO=nexus3.onap.org:10003
+
+
+
+CURR="$(pwd)"
+git clone http://gerrit.onap.org/r/portal -b "master"
+
+# Refresh configuration and scripts
+cd portal
+git pull
+cd deliveries
+rm .env
+#rm docker-compose.yml
+cp $CURR/.env .
+#cp $CURR/docker-compose.yml .
+#cd properties_simpledemo/ECOMPPORTALAPP
+#rm system.properties
+#cp $CURR/system.properties .
+#cd ../..
+# Get image names used below from docker-compose environment file
+source $CURR/.env
+#source .env
+
+# Make inter-app communication work in CSIT
+export EXTRA_HOST_IP="-i ${HOST_IP}"
+export EXTRA_HOST_NAME="-n portal.api.simpledemo.onap.org"
+
+
+# Copy property files to new directory
+mkdir -p $PROPS_DIR
+cp -r properties_simpledemo/* $PROPS_DIR
+# Also create logs directory
+mkdir -p $LOGS_DIR
+
+
+# Refresh images
+docker login -u $NEXUS_USERNAME -p $NEXUS_PASSWD $NEXUS_DOCKER_REPO
+docker pull $NEXUS_DOCKER_REPO/$DB_IMG_NAME:$DOCKER_IMAGE_VERSION
+docker pull $NEXUS_DOCKER_REPO/$EP_IMG_NAME:$DOCKER_IMAGE_VERSION
+docker pull $NEXUS_DOCKER_REPO/$SDK_IMG_NAME:$DOCKER_IMAGE_VERSION
+docker pull $NEXUS_DOCKER_REPO/$CDR_IMG_NAME:$CDR_IMAGE_VERSION
+docker pull $ZK_IMG_NAME:$ZK_IMAGE_VERSION
+docker pull $NEXUS_DOCKER_REPO/$WMS_IMG_NAME:$DOCKER_IMAGE_VERSION
+docker pull $NEXUS_DOCKER_REPO/$CLI_IMG_NAME:$CLI_DOCKER_VERSION
+
+# Tag them as expected by docker-compose file
+docker tag $NEXUS_DOCKER_REPO/$DB_IMG_NAME:$DOCKER_IMAGE_VERSION $DB_IMG_NAME:$PORTAL_TAG
+docker tag $NEXUS_DOCKER_REPO/$EP_IMG_NAME:$DOCKER_IMAGE_VERSION $EP_IMG_NAME:$PORTAL_TAG
+docker tag $NEXUS_DOCKER_REPO/$SDK_IMG_NAME:$DOCKER_IMAGE_VERSION $SDK_IMG_NAME:$PORTAL_TAG
+docker tag $NEXUS_DOCKER_REPO/$CDR_IMG_NAME:$CDR_IMAGE_VERSION $CDR_IMG_NAME:$PORTAL_TAG
+docker tag $ZK_IMG_NAME:$ZK_IMAGE_VERSION $ZK_IMG_NAME:$PORTAL_TAG
+docker tag $NEXUS_DOCKER_REPO/$WMS_IMG_NAME:$DOCKER_IMAGE_VERSION $WMS_IMG_NAME:$PORTAL_TAG
+docker tag $NEXUS_DOCKER_REPO/$CLI_IMG_NAME:$CLI_DOCKER_VERSION $CLI_IMG_NAME:$PORTAL_TAG
+
+
+# compose is not in /usr/bin
+docker-compose down
+docker-compose up -d
+
+#${HOSTNAME}="portal.api.simpledemo.openecomp.org"
+#echo "$HOST_IP ${HOSTNAME}" >> /etc/hosts
+
+#echo "$HOST_IP portal.api.simpledemo.openecomp.org" >> /etc/hosts
+#sudo sed -i "2i$HOST_IP portal.api.simpledemo.openecomp.org" /etc/hosts
+
+#HOST="portal.api.simpledemo.openecomp.org"
+#sudo sed -i "/$HOST/ s/.*/$HOST_IP\t$HOST/g" /etc/hosts
+
+# insert/update hosts entry
+ip_address=$HOST_IP
+host_name="portal.api.simpledemo.onap.org"
+# find existing instances in the host file and save the line numbers
+matches_in_hosts="$(grep -n $host_name /etc/hosts | cut -f1 -d:)"
+host_entry="${ip_address} ${host_name}"
+
+echo "$host_entry"
+
+if [ ! -z "$matches_in_hosts" ]
+then
+echo "Updating existing hosts entry."
+# iterate over the line numbers on which matches were found
+while read -r line_number; do
+# replace the text of each line with the desired host entry
+sudo sed -i '' "${line_number}s/.*/${host_entry} /" /etc/hosts
+echo "${line_number} ${host_entry}"
+done <<< "$matches_in_hosts"
+else
+echo "Adding new hosts entry."
+echo "$host_entry" | sudo tee -a /etc/hosts > /dev/null
+fi
+
+
+
+sleep 6m
+
+# WAIT 5 minutes maximum and test every 5 seconds if Portal up using HealthCheck API
+TIME_OUT=500
+INTERVAL=20
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+ response=$(curl --write-out '%{http_code}' --silent --output /dev/null http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/portalApi/healthCheck); echo $response
+
+ if [ "$response" == "200" ]; then
+ echo Portal and its database well started in $TIME seconds
+ break;
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if Portal is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]; then
+ echo TIME OUT: Docker containers not started in $TIME_OUT seconds... Could cause problems for tests...
+fi
+
+#sleep 3m
+
+
+
+#if [ "$TIME" -ge "$TIME_OUT" ]; then
+# echo TIME OUT: Docker containers not started in $TIME_OUT seconds... Could cause problems for tests...
+#fi
+
+
+
+
+
+#Get current IP of VM
+HOST_IP=$(ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}')
+export HOST_IP=${HOST_IP}
+
+#docker logs deliveries_portal-db_1
+docker logs deliveries_portal-app_1
+docker logs deliveries_portal-wms_1
+
+
+
+
diff --git a/plans/portal-sdk/testsuite/teardown.sh b/plans/portal-sdk/testsuite/teardown.sh
new file mode 100644
index 00000000..e0431a72
--- /dev/null
+++ b/plans/portal-sdk/testsuite/teardown.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Copyright 2017 AT&T Intellectual Property. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+docker kill $(docker ps -q)
+
+
diff --git a/plans/portal-sdk/testsuite/testplan.txt b/plans/portal-sdk/testsuite/testplan.txt
new file mode 100644
index 00000000..27f8af34
--- /dev/null
+++ b/plans/portal-sdk/testsuite/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+portal-sdk/testsuites
diff --git a/plans/portal/testsuite/.env b/plans/portal/testsuite/.env
new file mode 100644
index 00000000..27e9aa3f
--- /dev/null
+++ b/plans/portal/testsuite/.env
@@ -0,0 +1,42 @@
+# Environment settings
+# used by docker-compose AND by other shell scripts
+# Host directory with config files
+
+# Following are ALSO used in demo/boot/portal_vm_init.sh
+EP_IMG_NAME=onap/portal-app
+SDK_IMG_NAME=onap/portal-sdk
+DB_IMG_NAME=onap/portal-db
+CDR_IMG_NAME=onap/music/cassandra_music
+ZK_IMG_NAME=zookeeper
+WMS_IMG_NAME=onap/portal-wms
+# Deployed with portal; built elsewhere
+CLI_IMG_NAME=onap/cli
+
+# Tag all images with this
+DOCKER_IMAGE_VERSION=2.1-STAGING-latest
+CLI_DOCKER_VERSION=1.1-STAGING-latest
+CDR_IMAGE_VERSION=latest
+ZK_IMAGE_VERSION=3.4
+NEXUS_DOCKER_REPO=nexus3.onap.org:10003
+
+# This is used during builds and in docker-compose;
+# it is never published to the ONAP registry.
+PORTAL_TAG=beijing
+
+# Name of directory in apps container (NOT host)
+WEBAPPS_DIR=/opt/apache-tomcat-8.0.37/webapps
+
+# Required settings with default values.
+# Export shell environment variables on ALL hosts.
+LOGS_DIR=./logs
+PROPS_DIR=./properties
+
+# Optional settings with no defaults.
+EXTRA_HOST_IP=""
+EXTRA_HOST_NAME=""
+# Export shell environment variables on hosts with no DNS;
+# a line is added to docker container's /etc/hosts.
+# For example:
+#EXTRA_HOST_IP="-i ${HOST_IP}"
+#EXTRA_HOST_NAME="-n portal.api.simpledemo.openecomp.org"
+
diff --git a/plans/portal/testsuite/docker-compose.yml b/plans/portal/testsuite/docker-compose.yml
new file mode 100644
index 00000000..dda74c91
--- /dev/null
+++ b/plans/portal/testsuite/docker-compose.yml
@@ -0,0 +1,151 @@
+# docker-compose for ONAP portal containers: database, microservice, portal apps.
+# Relies on .env file, which CANNOT be specified via command-line option
+# Works in multiple environments; does not pull from a Nexus registry.
+# Exposes the portal apps docker (but not DB nor WMS dockers) on the host network.
+# Images must be pulled from ONAP Nexus registry after logging in like this:
+# docker login -u USER -p PASS nexus3.onap.org:10001
+# Uses healthcheck feature added in docker-compose v2.1
+
+version: '2.1'
+
+services:
+
+ cli:
+ image: ${CLI_IMG_NAME}:${PORTAL_TAG}
+ environment:
+ CLI_MODE: 'daemon'
+ ports:
+ - 8080:80
+ - 9090:8080
+ logging:
+ driver: json-file
+
+ # Config files may use hostname "portal-db"
+ portal-db:
+ image: ${DB_IMG_NAME}:${PORTAL_TAG}
+ environment:
+ MYSQL_ROOT_PASSWORD: 'Aa123456'
+ expose:
+ - 3306
+ volumes:
+ # Just specify a path and let the Engine create a volume
+ - /var/lib/mysql
+ # Inject the onboarding script at start time
+ - ./Apps_Users_OnBoarding_Script.sql:/docker-entrypoint-initdb.d/zzz_apps_users_onboarding.sql
+ logging:
+ driver: json-file
+ healthcheck:
+ test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ]
+ timeout: 10s
+ retries: 30
+
+ # Config files may use hostname "portal-cassandra"
+ portal-cassandra:
+ image: ${CDR_IMG_NAME}:${PORTAL_TAG}
+ environment:
+ - CASSUSER=root
+ - CASSPASS=Aa123456
+ expose:
+ - 7000
+ - 7001
+ - 7199
+ - 9042
+ - 9160
+ ports:
+ - 7000:7000
+ - 7001:7001
+ - 7199:7199
+ - 9042:9042
+ - 9160:9160
+ volumes:
+ - ./portal.cql:/docker-entrypoint-initdb.d/zzz_portal.cql
+ - ./portalsdk.cql:/docker-entrypoint-initdb.d/zzz_portalsdk.cql
+ links:
+ - portal-db
+ depends_on:
+ portal-db:
+ condition: service_healthy
+
+ # Config files may use hostname "portal-zk"
+ portal-zk:
+ image: ${ZK_IMG_NAME}:${PORTAL_TAG}
+ expose:
+ - 2181
+ ports:
+ - 2181:2181
+
+ # The app config file uses the docker name above
+ portal-wms:
+ image: ${WMS_IMG_NAME}:${PORTAL_TAG}
+ expose:
+ - 8082
+ links:
+ - portal-db
+ depends_on:
+ portal-db:
+ condition: service_healthy
+ volumes:
+ - ${PROPS_DIR}/ONAPWIDGETMS/application.properties:/application.properties
+ - ${PROPS_DIR}/ONAPWIDGETMS/application.yml:/application.yml
+ command:
+ - /start-wms.sh
+ logging:
+ driver: json-file
+
+ portal-app:
+ image: ${EP_IMG_NAME}:${PORTAL_TAG}
+ ports:
+ - 8989:8080
+ - 8010:8009
+ - 8006:8005
+ links:
+ - portal-db
+ - portal-wms
+ - portal-zk
+ - portal-cassandra
+ depends_on:
+ portal-db:
+ condition: service_healthy
+ portal-wms:
+ condition: service_started
+ volumes:
+ - ${PROPS_DIR}/ONAPPORTAL/system.properties:${WEBAPPS_DIR}/ONAPPORTAL/WEB-INF/conf/system.properties
+ - ${PROPS_DIR}/ONAPPORTAL/fusion.properties:${WEBAPPS_DIR}/ONAPPORTAL/WEB-INF/fusion/conf/fusion.properties
+ - ${PROPS_DIR}/ONAPPORTAL/portal.properties:${WEBAPPS_DIR}/ONAPPORTAL/WEB-INF/classes/portal.properties
+ - ${PROPS_DIR}/ONAPPORTAL/music.properties:${WEBAPPS_DIR}/ONAPPORTAL/WEB-INF/classes/music.properties
+ - ${PROPS_DIR}/ONAPPORTAL/openid-connect.properties:${WEBAPPS_DIR}/ONAPPORTAL/WEB-INF/classes/openid-connect.properties
+ - ${PROPS_DIR}/ONAPPORTAL/logback.xml:${WEBAPPS_DIR}/ONAPPORTAL/WEB-INF/classes/logback.xml
+ - ${LOGS_DIR}:/opt/apache-tomcat-8.0.37/logs
+ command:
+ - /start-apache-tomcat.sh
+ # see comments in .env file
+ - -i
+ - $EXTRA_HOST_IP
+ - -n
+ - $EXTRA_HOST_NAME
+ logging:
+ driver: json-file
+
+ portal-sdk:
+ image: ${SDK_IMG_NAME}:${PORTAL_TAG}
+ ports:
+ - 8990:8080
+ links:
+ - portal-db
+ - portal-wms
+ - portal-zk
+ - portal-cassandra
+ depends_on:
+ portal-db:
+ condition: service_healthy
+ volumes:
+ - ${PROPS_DIR}/ONAPPORTALSDK/fusion.properties:${WEBAPPS_DIR}/ONAPPORTALSDK/WEB-INF/fusion/conf/fusion.properties
+ - ${PROPS_DIR}/ONAPPORTALSDK/system.properties:${WEBAPPS_DIR}/ONAPPORTALSDK/WEB-INF/conf/system.properties
+ - ${PROPS_DIR}/ONAPPORTALSDK/portal.properties:${WEBAPPS_DIR}/ONAPPORTALSDK/WEB-INF/classes/portal.properties
+ - ${PROPS_DIR}/ONAPPORTALSDK/music.properties:${WEBAPPS_DIR}/ONAPPORTALSDK/WEB-INF/classes/music.properties
+ - ${PROPS_DIR}/ONAPPORTALSDK/logback.xml:${WEBAPPS_DIR}/ONAPPORTALSDK/WEB-INF/classes/logback.xml
+ - ${LOGS_DIR}:/opt/apache-tomcat-8.0.37/logs
+ command:
+ - /start-apache-tomcat.sh
+ logging:
+ driver: json-file
diff --git a/plans/portal/testsuite/setup.sh b/plans/portal/testsuite/setup.sh
new file mode 100644
index 00000000..76cf5f37
--- /dev/null
+++ b/plans/portal/testsuite/setup.sh
@@ -0,0 +1,184 @@
+#!/bin/bash
+# Starts docker containers for ONAP Portal
+# This version for Amsterdam/R1 of Portal, uses docker-compose.
+# Temporarily maintained in portal/deliveries area;
+# replicated from the ONAP demo/boot area due to release concerns.
+
+# Start Xvfb
+echo -e "Starting Xvfb on display ${DISPLAY} with res ${RES}"
+Xvfb ${DISPLAY} -ac -screen 0 ${RES} +extension RANDR &
+XVFBPID=$!
+# Get pid of this spawned process to make sure we kill the correct process later
+
+#Get current IP of VM
+HOST_IP=$(ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}')
+export HOST_IP=${HOST_IP}
+
+
+
+if ! ifconfig docker0; then
+if ! ifconfig ens3; then
+echo "Could not determine IP address"
+exit 1
+fi
+export DOCKER_IP_IP=`ifconfig ens3 | awk -F: '/inet addr/ {gsub(/ .*/,"",$2); print $2}'`
+else
+export DOCKER_IP=`ifconfig docker0 | awk -F: '/inet addr/ {gsub(/ .*/,"",$2); print $2}'`
+fi
+echo $DOCKER_IP
+
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+#ROBOT_VARIABLES="-v MOCK_IP:${MOCK_IP} -v IP:${IP} -v POLICY_IP:${POLICY_IP} -v DOCKER_IP:${DOCKER_IP}"
+#export PORTAL_IP=${PORTAL_IP}
+ROBOT_VARIABLES="-v MOCK_IP:${MOCK_IP} -v IP:${IP} -v DOCKER_IP:${DOCKER_IP}"
+export DOCKER_IP=${DOCKER_IP}
+
+
+
+
+# be verbose
+set -x
+
+# Establish environment variables
+NEXUS_USERNAME=docker
+NEXUS_PASSWD=docker
+NEXUS_DOCKER_REPO=nexus3.onap.org:10003
+
+
+
+CURR="$(pwd)"
+git clone http://gerrit.onap.org/r/portal -b "master"
+
+# Refresh configuration and scripts
+cd portal
+git pull
+cd deliveries
+rm .env
+#rm docker-compose.yml
+cp $CURR/.env .
+#cp $CURR/docker-compose.yml .
+#cd properties_simpledemo/ECOMPPORTALAPP
+#rm system.properties
+#cp $CURR/system.properties .
+#cd ../..
+# Get image names used below from docker-compose environment file
+source $CURR/.env
+#source .env
+
+# Make inter-app communication work in CSIT
+export EXTRA_HOST_IP="-i ${HOST_IP}"
+export EXTRA_HOST_NAME="-n portal.api.simpledemo.onap.org"
+
+
+# Copy property files to new directory
+mkdir -p $PROPS_DIR
+cp -r properties_simpledemo/* $PROPS_DIR
+# Also create logs directory
+mkdir -p $LOGS_DIR
+
+
+# Refresh images
+docker login -u $NEXUS_USERNAME -p $NEXUS_PASSWD $NEXUS_DOCKER_REPO
+docker pull $NEXUS_DOCKER_REPO/$DB_IMG_NAME:$DOCKER_IMAGE_VERSION
+docker pull $NEXUS_DOCKER_REPO/$EP_IMG_NAME:$DOCKER_IMAGE_VERSION
+docker pull $NEXUS_DOCKER_REPO/$SDK_IMG_NAME:$DOCKER_IMAGE_VERSION
+docker pull $NEXUS_DOCKER_REPO/$CDR_IMG_NAME:$CDR_IMAGE_VERSION
+docker pull $ZK_IMG_NAME:$ZK_IMAGE_VERSION
+docker pull $NEXUS_DOCKER_REPO/$WMS_IMG_NAME:$DOCKER_IMAGE_VERSION
+docker pull $NEXUS_DOCKER_REPO/$CLI_IMG_NAME:$CLI_DOCKER_VERSION
+
+# Tag them as expected by docker-compose file
+docker tag $NEXUS_DOCKER_REPO/$DB_IMG_NAME:$DOCKER_IMAGE_VERSION $DB_IMG_NAME:$PORTAL_TAG
+docker tag $NEXUS_DOCKER_REPO/$EP_IMG_NAME:$DOCKER_IMAGE_VERSION $EP_IMG_NAME:$PORTAL_TAG
+docker tag $NEXUS_DOCKER_REPO/$SDK_IMG_NAME:$DOCKER_IMAGE_VERSION $SDK_IMG_NAME:$PORTAL_TAG
+docker tag $NEXUS_DOCKER_REPO/$CDR_IMG_NAME:$CDR_IMAGE_VERSION $CDR_IMG_NAME:$PORTAL_TAG
+docker tag $ZK_IMG_NAME:$ZK_IMAGE_VERSION $ZK_IMG_NAME:$PORTAL_TAG
+docker tag $NEXUS_DOCKER_REPO/$WMS_IMG_NAME:$DOCKER_IMAGE_VERSION $WMS_IMG_NAME:$PORTAL_TAG
+docker tag $NEXUS_DOCKER_REPO/$CLI_IMG_NAME:$CLI_DOCKER_VERSION $CLI_IMG_NAME:$PORTAL_TAG
+
+
+# compose is not in /usr/bin
+docker-compose down
+docker-compose up -d
+
+#${HOSTNAME}="portal.api.simpledemo.openecomp.org"
+#echo "$HOST_IP ${HOSTNAME}" >> /etc/hosts
+
+#echo "$HOST_IP portal.api.simpledemo.openecomp.org" >> /etc/hosts
+#sudo sed -i "2i$HOST_IP portal.api.simpledemo.openecomp.org" /etc/hosts
+
+#HOST="portal.api.simpledemo.openecomp.org"
+#sudo sed -i "/$HOST/ s/.*/$HOST_IP\t$HOST/g" /etc/hosts
+
+# insert/update hosts entry
+ip_address=$HOST_IP
+host_name="portal.api.simpledemo.onap.org"
+# find existing instances in the host file and save the line numbers
+matches_in_hosts="$(grep -n $host_name /etc/hosts | cut -f1 -d:)"
+host_entry="${ip_address} ${host_name}"
+
+echo "$host_entry"
+
+if [ ! -z "$matches_in_hosts" ]
+then
+echo "Updating existing hosts entry."
+# iterate over the line numbers on which matches were found
+while read -r line_number; do
+# replace the text of each line with the desired host entry
+sudo sed -i '' "${line_number}s/.*/${host_entry} /" /etc/hosts
+echo "${line_number} ${host_entry}"
+done <<< "$matches_in_hosts"
+else
+echo "Adding new hosts entry."
+echo "$host_entry" | sudo tee -a /etc/hosts > /dev/null
+fi
+
+
+
+sleep 6m
+
+# WAIT 5 minutes maximum and test every 5 seconds if Portal up using HealthCheck API
+TIME_OUT=500
+INTERVAL=20
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+ response=$(curl --write-out '%{http_code}' --silent --output /dev/null http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/portalApi/healthCheck); echo $response
+
+ if [ "$response" == "200" ]; then
+ echo Portal and its database well started in $TIME seconds
+ break;
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if Portal is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]; then
+ echo TIME OUT: Docker containers not started in $TIME_OUT seconds... Could cause problems for tests...
+fi
+
+#sleep 3m
+
+
+
+#if [ "$TIME" -ge "$TIME_OUT" ]; then
+# echo TIME OUT: Docker containers not started in $TIME_OUT seconds... Could cause problems for tests...
+#fi
+
+
+
+
+
+#Get current IP of VM
+HOST_IP=$(ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}')
+export HOST_IP=${HOST_IP}
+
+docker logs deliveries_portal-db_1
+docker logs deliveries_portal-app_1
+docker logs deliveries_portal-wms_1
+
+
+
+
diff --git a/plans/portal/testsuite/teardown.sh b/plans/portal/testsuite/teardown.sh
new file mode 100644
index 00000000..e0431a72
--- /dev/null
+++ b/plans/portal/testsuite/teardown.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Copyright 2017 AT&T Intellectual Property. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+docker kill $(docker ps -q)
+
+
diff --git a/plans/portal/testsuite/testplan.txt b/plans/portal/testsuite/testplan.txt
new file mode 100644
index 00000000..d7b18a5c
--- /dev/null
+++ b/plans/portal/testsuite/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+portal/testsuites
diff --git a/plans/sdc/nightly/setup.sh b/plans/sdc/nightly/setup.sh
new file mode 100644
index 00000000..a7bbaa8e
--- /dev/null
+++ b/plans/sdc/nightly/setup.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+source ${WORKSPACE}/test/csit/scripts/sdc/setup_sdc_for_apis_sanity.sh
+
+BE_IP=`get-instance-ip.sh sdc-BE`
+echo BE_IP=${BE_IP}
+
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v BE_IP:${BE_IP}"
+
diff --git a/plans/sdc/nightly/teardown.sh b/plans/sdc/nightly/teardown.sh
new file mode 100644
index 00000000..2074d10f
--- /dev/null
+++ b/plans/sdc/nightly/teardown.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+source ${WORKSPACE}/test/csit/scripts/sdc/kill_containers_and_remove_dataFolders.sh
diff --git a/plans/sdc/nightly/testplan.txt b/plans/sdc/nightly/testplan.txt
new file mode 100644
index 00000000..3011ad5c
--- /dev/null
+++ b/plans/sdc/nightly/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+sdc/nightly
diff --git a/plans/sdc/sanity/setup.sh b/plans/sdc/sanity/setup.sh
new file mode 100644
index 00000000..a7bbaa8e
--- /dev/null
+++ b/plans/sdc/sanity/setup.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+source ${WORKSPACE}/test/csit/scripts/sdc/setup_sdc_for_apis_sanity.sh
+
+BE_IP=`get-instance-ip.sh sdc-BE`
+echo BE_IP=${BE_IP}
+
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v BE_IP:${BE_IP}"
+
diff --git a/plans/sdc/sanity/teardown.sh b/plans/sdc/sanity/teardown.sh
new file mode 100644
index 00000000..2074d10f
--- /dev/null
+++ b/plans/sdc/sanity/teardown.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+source ${WORKSPACE}/test/csit/scripts/sdc/kill_containers_and_remove_dataFolders.sh
diff --git a/plans/sdc/sanity/testplan.txt b/plans/sdc/sanity/testplan.txt
new file mode 100644
index 00000000..801f37d3
--- /dev/null
+++ b/plans/sdc/sanity/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+sdc/sanity
diff --git a/plans/sdc/uiSanity/setup.sh b/plans/sdc/uiSanity/setup.sh
new file mode 100644
index 00000000..8f2bafda
--- /dev/null
+++ b/plans/sdc/uiSanity/setup.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+source ${WORKSPACE}/test/csit/scripts/sdc/setup_sdc_for_ui_sanity.sh
+
+BE_IP=`get-instance-ip.sh sdc-BE`
+echo BE_IP=${BE_IP}
+
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v BE_IP:${BE_IP}"
+
diff --git a/plans/sdc/uiSanity/teardown.sh b/plans/sdc/uiSanity/teardown.sh
new file mode 100644
index 00000000..2074d10f
--- /dev/null
+++ b/plans/sdc/uiSanity/teardown.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+source ${WORKSPACE}/test/csit/scripts/sdc/kill_containers_and_remove_dataFolders.sh
diff --git a/plans/sdc/uiSanity/testplan.txt b/plans/sdc/uiSanity/testplan.txt
new file mode 100644
index 00000000..801f37d3
--- /dev/null
+++ b/plans/sdc/uiSanity/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+sdc/sanity
diff --git a/plans/sdnc/healthcheck/health_check.sh b/plans/sdnc/healthcheck/health_check.sh
new file mode 100644
index 00000000..e8b5056d
--- /dev/null
+++ b/plans/sdnc/healthcheck/health_check.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+###############################################################################
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+###############################################################################
+SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+echo $SCRIPTS
+
+unset http_proxy https_proxy
+
+response=$(curl --write-out '%{http_code}' --silent --output /dev/null -H "Authorization: Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ==" -X POST -H "X-FromAppId: csit-sdnc" -H "X-TransactionId: csit-sdnc" -H "Accept: application/json" -H "Content-Type: application/json" http://localhost:8282/restconf/operations/SLI-API:healthcheck )
+
+if [ "$response" == "200" ]; then
+ echo "SDNC health check passed."
+ exit 0;
+fi
+
+echo "SDNC health check failed with response code ${response}."
+exit 1
diff --git a/plans/sdnc/healthcheck/setup.sh b/plans/sdnc/healthcheck/setup.sh
new file mode 100644
index 00000000..991ba18b
--- /dev/null
+++ b/plans/sdnc/healthcheck/setup.sh
@@ -0,0 +1,139 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+# Place the scripts in run order:
+SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+source ${WORKSPACE}/test/csit/scripts/sdnc/script1.sh
+
+export NEXUS_USERNAME=docker
+export NEXUS_PASSWD=docker
+export NEXUS_DOCKER_REPO=nexus3.onap.org:10001
+export DMAAP_TOPIC=AUTO
+export DOCKER_IMAGE_VERSION=1.4-STAGING-latest
+export CCSDK_DOCKER_IMAGE_VERSION=0.3-STAGING-latest
+
+export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' | sort -n | head -1)
+
+if [ "$MTU" == "" ]; then
+ export MTU="1450"
+fi
+
+
+# Clone SDNC repo to get docker-compose for SDNC
+mkdir -p $WORKSPACE/archives/sdnc
+cd $WORKSPACE/archives
+git clone -b master --single-branch --depth=1 http://gerrit.onap.org/r/sdnc/oam.git sdnc
+cd $WORKSPACE/archives/sdnc
+git pull
+unset http_proxy https_proxy
+cd $WORKSPACE/archives/sdnc/installation/src/main/yaml
+
+sed -i "s/DMAAP_TOPIC_ENV=.*/DMAAP_TOPIC_ENV="AUTO"/g" docker-compose.yml
+docker login -u $NEXUS_USERNAME -p $NEXUS_PASSWD $NEXUS_DOCKER_REPO
+
+docker pull $NEXUS_DOCKER_REPO/onap/sdnc-image:$DOCKER_IMAGE_VERSION
+docker tag $NEXUS_DOCKER_REPO/onap/sdnc-image:$DOCKER_IMAGE_VERSION onap/sdnc-image:latest
+
+docker pull $NEXUS_DOCKER_REPO/onap/sdnc-ansible-server-image:$DOCKER_IMAGE_VERSION
+docker tag $NEXUS_DOCKER_REPO/onap/sdnc-ansible-server-image:$DOCKER_IMAGE_VERSION onap/sdnc-ansible-server-image:latest
+
+docker pull $NEXUS_DOCKER_REPO/onap/ccsdk-dgbuilder-image:$CCSDK_DOCKER_IMAGE_VERSION
+docker tag $NEXUS_DOCKER_REPO/onap/ccsdk-dgbuilder-image:$CCSDK_DOCKER_IMAGE_VERSION onap/ccsdk-dgbuilder-image:latest
+
+docker pull $NEXUS_DOCKER_REPO/onap/admportal-sdnc-image:$DOCKER_IMAGE_VERSION
+docker tag $NEXUS_DOCKER_REPO/onap/admportal-sdnc-image:$DOCKER_IMAGE_VERSION onap/admportal-sdnc-image:latest
+
+docker pull $NEXUS_DOCKER_REPO/onap/sdnc-ueb-listener-image:$DOCKER_IMAGE_VERSION
+docker tag $NEXUS_DOCKER_REPO/onap/sdnc-ueb-listener-image:$DOCKER_IMAGE_VERSION onap/sdnc-ueb-listener-image:latest
+
+docker pull $NEXUS_DOCKER_REPO/onap/sdnc-dmaap-listener-image:$DOCKER_IMAGE_VERSION
+
+docker tag $NEXUS_DOCKER_REPO/onap/sdnc-dmaap-listener-image:$DOCKER_IMAGE_VERSION onap/sdnc-dmaap-listener-image:latest
+
+
+# start SDNC containers with docker compose and configuration from docker-compose.yml
+docker-compose up -d
+
+# WAIT 10 minutes maximum and test every 5 seconds if SDNC is up using HealthCheck API
+TIME_OUT=1000
+INTERVAL=30
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+ response=$(curl --write-out '%{http_code}' --silent --output /dev/null -H "Authorization: Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ==" -X POST -H "X-FromAppId: csit-sdnc" -H "X-TransactionId: csit-sdnc" -H "Accept: application/json" -H "Content-Type: application/json" http://localhost:8282/restconf/operations/SLI-API:healthcheck ); echo $response
+
+ if [ "$response" == "200" ]; then
+ echo SDNC started in $TIME seconds
+ break;
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if SDNC is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]; then
+ echo TIME OUT: Docker containers not started in $TIME_OUT seconds... Could cause problems for testing activities...
+fi
+
+#sleep 800
+
+TIME_OUT=1500
+INTERVAL=60
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+
+docker exec sdnc_controller_container rm -f /opt/opendaylight/current/etc/host.key
+response=$(docker exec sdnc_controller_container /opt/opendaylight/current/bin/client system:start-level)
+docker exec sdnc_controller_container rm -f /opt/opendaylight/current/etc/host.key
+num_bundles=$(docker exec sdnc_controller_container /opt/opendaylight/current/bin/client bundle:list | tail -1 | cut -d\| -f1)
+
+ if [ "$response" == "Level 100" ] && [ "$num_bundles" -ge 333 ]; then
+ echo SDNC karaf started in $TIME seconds
+ break;
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if SDNC is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]; then
+ echo TIME OUT: karaf session not started in $TIME_OUT seconds... Could cause problems for testing activities...
+fi
+
+response=$(docker exec sdnc_controller_container /opt/opendaylight/current/bin/client system:start-level)
+num_bundles=$(docker exec sdnc_controller_container /opt/opendaylight/current/bin/client bundle:list | tail -1 | cut -d\| -f1)
+
+ if [ "$response" == "Level 100" ] && [ "$num_bundles" -ge 333 ]; then
+ num_bundles=$(docker exec sdnc_controller_container /opt/opendaylight/current/bin/client bundle:list | tail -1 | cut -d\| -f1)
+ num_failed_bundles=$(docker exec sdnc_controller_container /opt/opendaylight/current/bin/client bundle:list | grep Failure | wc -l)
+ failed_bundles=$(docker exec sdnc_controller_container /opt/opendaylight/current/bin/client bundle:list | grep Failure)
+ echo There is/are $num_failed_bundles failed bundles out of $num_bundles installed bundles.
+ fi
+
+if [ "$num_failed_bundles" -ge 1 ]; then
+ echo "The following bundle(s) are in a failed state: "
+ echo " $failed_bundles"
+fi
+
+# Sleep additional 5 minutes (300 secs) to give application time to finish
+sleep 300
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v SCRIPTS:${SCRIPTS}"
+
diff --git a/plans/sdnc/healthcheck/teardown.sh b/plans/sdnc/healthcheck/teardown.sh
new file mode 100644
index 00000000..dd465bb3
--- /dev/null
+++ b/plans/sdnc/healthcheck/teardown.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+kill-instance.sh sdnc_controller_container
+kill-instance.sh sdnc_dgbuilder_container
+kill-instance.sh sdnc_portal_container
+kill-instance.sh sdnc_db_container
+kill-instance.sh sdnc_ueblistener_container
+kill-instance.sh sdnc_dmaaplistener_container
+
+# $WORKSPACE/archives/appc deleted with archives folder when tests starts so we keep it at the end for debugging
diff --git a/plans/sdnc/healthcheck/testplan.txt b/plans/sdnc/healthcheck/testplan.txt
new file mode 100644
index 00000000..3fa8dde5
--- /dev/null
+++ b/plans/sdnc/healthcheck/testplan.txt
@@ -0,0 +1,4 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+sdnc/healthcheck
+
diff --git a/plans/so/integration-testing/setup.sh b/plans/so/integration-testing/setup.sh
new file mode 100644
index 00000000..cd0cbdc3
--- /dev/null
+++ b/plans/so/integration-testing/setup.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+#start mariadb
+docker run -d --name mariadb -h db.mso.testlab.openecomp.org -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 -v ${WORKSPACE}/test/csit/scripts/mariadb/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d -v ${WORKSPACE}/test/csit/scripts/mariadb/conf.d:/etc/mysql/conf.d nexus3.onap.org:10001/mariadb
+
+#start so
+docker run -d --name so -h mso.mso.testlab.openecomp.org -e MYSQL_ROOT_PASSWORD=password --link=mariadb:db.mso.testlab.openecomp.org -p 8080:8080 -v ${WORKSPACE}/test/csit/scripts/so/chef-config:/shared nexus3.onap.org:10001/openecomp/mso:1.1-STAGING-latest
+
+
+SO_IP=`get-instance-ip.sh so`
+# Wait for initialization
+for i in {1..10}; do
+ curl -sS ${SO_IP}:1080 && break
+ echo sleep $i
+ sleep $i
+done
+
+#REPO_IP=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' so`
+REPO_IP='127.0.0.1'
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v REPO_IP:${REPO_IP}"
diff --git a/plans/so/integration-testing/teardown.sh b/plans/so/integration-testing/teardown.sh
new file mode 100644
index 00000000..1696c745
--- /dev/null
+++ b/plans/so/integration-testing/teardown.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+kill-instance.sh mariadb
+kill-instance.sh so
diff --git a/plans/so/integration-testing/testplan.txt b/plans/so/integration-testing/testplan.txt
new file mode 100644
index 00000000..761c75c0
--- /dev/null
+++ b/plans/so/integration-testing/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+so/sanity-check/sanity_test_so.robot \ No newline at end of file
diff --git a/plans/usecase-ui-server/testsuite/setup.sh b/plans/usecase-ui-server/testsuite/setup.sh
new file mode 100644
index 00000000..b2641bec
--- /dev/null
+++ b/plans/usecase-ui-server/testsuite/setup.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+#
+# Copyright (C) 2017 CMCC, Inc. and others. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+source ${SCRIPTS}/common_functions.sh
+
+#start msb
+docker run -d -p 8500:8500 --name msb_consul consul
+MSB_CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo MSB_CONSUL_IP=${MSB_CONSUL_IP}
+
+docker run -d -p 10081:10081 -e CONSUL_IP=$MSB_CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+MSB_DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${MSB_DISCOVERY_IP}
+
+docker run -d -p 80:80 -e CONSUL_IP=$MSB_CONSUL_IP -e SDCLIENT_IP=$MSB_DISCOVERY_IP -e "ROUTE_LABELS=visualRange:1" --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IAG_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IAG_IP=${MSB_IAG_IP}
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${MSB_CONSUL_IP}:8500 && curl -sS -m 1 ${MSB_DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IAG_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Need some time for the initialization of MSB services
+echo sleep 60
+sleep 60
+
+# start usecase-ui-server
+docker run -d --name usecase-ui-server -v /var/lib/mysql -e MSB_ADDR=${MSB_IAG_IP}:80 nexus3.onap.org:10001/onap/usecase-ui/usecase-ui-server
+USECASEUI_IP=`get-instance-ip.sh usecase-ui-server`
+
+# Wait for initialization
+for i in {1..10}; do
+ curl -sS -m 1 ${USECASEUI_IP}:8901 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IAG_IP:${MSB_IAG_IP} -v USECASEUI_IP:${USECASEUI_IP} -v SCRIPTS:${SCRIPTS}"
diff --git a/plans/usecase-ui-server/testsuite/teardown.sh b/plans/usecase-ui-server/testsuite/teardown.sh
new file mode 100644
index 00000000..46f5879b
--- /dev/null
+++ b/plans/usecase-ui-server/testsuite/teardown.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Copyright (C) 2017 CMCC, Inc. and others. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh msb_discovery
+kill-instance.sh msb_consul
+kill-instance.sh usecase-ui-server
diff --git a/plans/usecase-ui-server/testsuite/testplan.txt b/plans/usecase-ui-server/testsuite/testplan.txt
new file mode 100644
index 00000000..ec7f200a
--- /dev/null
+++ b/plans/usecase-ui-server/testsuite/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+usecase-ui/server/test.robot
diff --git a/plans/usecases/5G-bulkpm/assets/addSubscriber.json b/plans/usecases/5G-bulkpm/assets/addSubscriber.json
new file mode 100644
index 00000000..612c4626
--- /dev/null
+++ b/plans/usecases/5G-bulkpm/assets/addSubscriber.json
@@ -0,0 +1,18 @@
+{
+ "delivery":{
+ "url":"http://fileconsumer:7070",
+ "user":"LOGIN",
+ "password":"PASSWORD",
+ "use100":true
+ },
+ "follow_redirect":false,
+ "metadataOnly":false,
+ "suspend":false,
+ "groupid":0,
+ "links":{
+ "self": "https://dmaap-dr-prov/subscribe/1",
+ "log": "https://dmaap-dr-prov/feedlog/1",
+ "feed": "https://dmaap-dr-prov/feed/1"
+ },
+ "subscriber":"admin"
+ } \ No newline at end of file
diff --git a/plans/usecases/5G-bulkpm/assets/createFeed.json b/plans/usecases/5G-bulkpm/assets/createFeed.json
new file mode 100644
index 00000000..fdcc7eef
--- /dev/null
+++ b/plans/usecases/5G-bulkpm/assets/createFeed.json
@@ -0,0 +1,18 @@
+{
+ "name": "DefaultFeed",
+ "version": "m1.0",
+ "description": "Default feed",
+ "business_description": "Default Feed",
+ "suspend": false,
+ "deleted": false,
+ "changeowner": true,
+ "authorization": {
+ "classification": "unclassified",
+ "endpoint_addrs": [],
+ "endpoint_ids": [
+ {
+ "password": "dradmin",
+ "id": "dradmin"
+ }]
+ }
+ } \ No newline at end of file
diff --git a/plans/usecases/5G-bulkpm/assets/datafile_endpoints.json b/plans/usecases/5G-bulkpm/assets/datafile_endpoints.json
new file mode 100644
index 00000000..17c7078e
--- /dev/null
+++ b/plans/usecases/5G-bulkpm/assets/datafile_endpoints.json
@@ -0,0 +1,28 @@
+{
+ "configs": {
+ "dmaap": {
+ "dmaapConsumerConfiguration": {
+ "dmaapHostName": "dmaapmrhost",
+ "dmaapPortNumber": 3904,
+ "dmaapTopicName": "/events/unauthenticated.VES_NOTIFICATION_OUTPUT",
+ "dmaapProtocol": "http",
+ "dmaapUserName": "admin",
+ "dmaapUserPassword": "admin",
+ "dmaapContentType": "application/json",
+ "consumerId": "C12",
+ "consumerGroup": "OpenDcae-c12",
+ "timeoutMS": -1,
+ "messageLimit": 1
+ },
+ "dmaapProducerConfiguration": {
+ "dmaapHostName": "dmaapdrhost",
+ "dmaapPortNumber": 8443,
+ "dmaapTopicName": "publish",
+ "dmaapProtocol": "https",
+ "dmaapUserName": "dradmin",
+ "dmaapUserPassword": "dradmin",
+ "dmaapContentType": "application/octet-stream"
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/plans/usecases/5G-bulkpm/assets/xNF.pm.xml.gz b/plans/usecases/5G-bulkpm/assets/xNF.pm.xml.gz
new file mode 100644
index 00000000..2f527c27
--- /dev/null
+++ b/plans/usecases/5G-bulkpm/assets/xNF.pm.xml.gz
Binary files differ
diff --git a/plans/usecases/5G-bulkpm/composefile/docker-compose-e2e.yml b/plans/usecases/5G-bulkpm/composefile/docker-compose-e2e.yml
new file mode 100644
index 00000000..16db4afa
--- /dev/null
+++ b/plans/usecases/5G-bulkpm/composefile/docker-compose-e2e.yml
@@ -0,0 +1,81 @@
+version: '2.1'
+services:
+ datarouter-prov:
+ image: nexus3.onap.org:10001/onap/dmaap/datarouter-prov
+ container_name: datarouter-prov
+ hostname: dmaap-dr-prov
+ ports:
+ - "443:8443"
+ - "8443:8443"
+ - "8080:8080"
+ volumes:
+ - ./prov_data/provserver.properties:/opt/app/datartr/etc/provserver.properties
+ - ./prov_data/addSubscriber.txt:/opt/app/datartr/addSubscriber.txt
+ - ./prov_data/addFeed3.txt:/opt/app/datartr/addFeed3.txt
+ depends_on:
+ mariadb_container:
+ condition: service_healthy
+ healthcheck:
+ test: ["CMD", "curl", "-f", "http://dmaap-dr-prov:8080/internal/prov"]
+ interval: 10s
+ timeout: 10s
+ retries: 5
+
+ datarouter-node:
+ image: nexus3.onap.org:10001/onap/dmaap/datarouter-node
+ container_name: datarouter-node
+ hostname: dmaap-dr-node
+ ports:
+ - "9443:8443"
+ - "9090:8080"
+ volumes:
+ - ./node_data/node.properties:/opt/app/datartr/etc/node.properties
+ depends_on:
+ datarouter-prov:
+ condition: service_healthy
+
+ datarouter-subscriber:
+ image: nexus3.onap.org:10001/onap/dmaap/datarouter-subscriber
+ container_name: fileconsumer-node
+ hostname: subscriber.com
+ ports:
+ - "7070:7070"
+ volumes:
+ - ./subscriber_data/subscriber.properties:/opt/app/subscriber/etc/subscriber.properties
+
+ mariadb_container:
+ image: mariadb:10.2.14
+ container_name: mariadb
+ ports:
+ - "3306:3306"
+ environment:
+ MYSQL_ROOT_PASSWORD: datarouter
+ MYSQL_DATABASE: datarouter
+ MYSQL_USER: datarouter
+ MYSQL_PASSWORD: datarouter
+ healthcheck:
+ test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "--silent"]
+ interval: 10s
+ timeout: 30s
+ retries: 5
+
+ sftp:
+ container_name: sftp
+ image: atmoz/sftp
+ ports:
+ - "2222:22"
+ volumes:
+ - /host/upload:/home/admin
+ command: admin:admin:1001
+
+ dfc:
+ container_name: dfc
+ image: quay.io/martin_yan_seu/datafile
+ ports:
+ - "8433:8433"
+
+ ves:
+ container_name: vescollector
+ image: nexus3.onap.org:10001/onap/org.onap.dcaegen2.collectors.ves.vescollector:1.3.1
+ environment:
+ DMAAPHOST: \ No newline at end of file
diff --git a/plans/usecases/5G-bulkpm/setup.sh b/plans/usecases/5G-bulkpm/setup.sh
new file mode 100644
index 00000000..f27bfba5
--- /dev/null
+++ b/plans/usecases/5G-bulkpm/setup.sh
@@ -0,0 +1,141 @@
+#!/bin/bash
+# Place the scripts in run order:
+source ${SCRIPTS}/common_functions.sh
+
+# Clone DMaaP Message Router repo
+mkdir -p $WORKSPACE/archives/dmaapmr
+cd $WORKSPACE/archives/dmaapmr
+git clone --depth 1 http://gerrit.onap.org/r/dmaap/messagerouter/messageservice -b master
+git pull
+cd $WORKSPACE/archives/dmaapmr/messageservice/src/main/resources/docker-compose
+cp $WORKSPACE/archives/dmaapmr/messageservice/bundleconfig-local/etc/appprops/MsgRtrApi.properties /var/tmp/
+
+# start DMaaP MR containers with docker compose and configuration from docker-compose.yml
+docker login -u docker -p docker nexus3.onap.org:10001
+docker-compose up -d
+
+ZOOKEEPER=$(docker ps -a -q --filter="name=zookeeper_1")
+KAFKA=$(docker ps -a -q --filter="name=kafka_1")
+DMAAP=$(docker ps -a -q --filter="name=dmaap_1")
+
+# Wait for initialization of Docker contaienr for DMaaP MR, Kafka and Zookeeper
+for i in {1..50}; do
+if [ $(docker inspect --format '{{ .State.Running }}' $KAFKA) ] && \
+[ $(docker inspect --format '{{ .State.Running }}' $ZOOKEEPER) ] && \
+[ $(docker inspect --format '{{ .State.Running }}' $DMAAP) ]
+then
+ echo "DMaaP Service Running"
+ break
+else
+ echo sleep $i
+ sleep $i
+fi
+done
+
+# Get IP address of DMAAP, KAFKA, Zookeeper
+KAFKA_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $KAFKA)
+ZOOKEEPER_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $ZOOKEEPER)
+DMAAP_MR_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $DMAAP)
+
+sleep 2
+# Shutdown DMAAP Container
+docker kill $DMAAP
+
+# Initial docker-compose up and down is for populating kafka and zookeeper IPs in /var/tmp/MsgRtrApi.properites
+sed -i -e '/config.zk.servers=/ s/=.*/='$ZOOKEEPER_IP'/' /var/tmp/MsgRtrApi.properties
+sed -i -e '/kafka.metadata.broker.list=/ s/=.*/='$KAFKA_IP':9092/' /var/tmp/MsgRtrApi.properties
+
+# Start DMaaP MR containers with docker compose and configuration from docker-compose.yml
+docker login -u docker -p docker nexus3.onap.org:10001
+docker-compose up -d
+sleep 5
+
+# Clone DMaaP Data Router repo
+mkdir -p $WORKSPACE/archives/dmaapdr
+cd $WORKSPACE/archives/dmaapdr
+git clone --depth 1 https://gerrit.onap.org/r/dmaap/datarouter -b master
+cd datarouter
+cd $WORKSPACE/archives/dmaapdr/datarouter/docker-compose/
+rm -rf docker-compose.yml
+cp $WORKSPACE/test/csit/plans/usecases/5G-bulkpm/composefile/docker-compose-e2e.yml $WORKSPACE/archives/dmaapdr/datarouter/docker-compose/docker-compose.yml
+docker login -u docker -p docker nexus3.onap.org:10001
+docker-compose up -d
+docker kill datarouter-prov
+docker kill datarouter-node
+docker kill vescollector
+HOST_IP=$(ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}')
+sed -i -e '/DMAAPHOST:/ s/:.*/: '$HOST_IP'/' docker-compose.yml
+MARIADB=$(docker inspect '--format={{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mariadb )
+sed -i 's/172.100.0.2/'$MARIADB'/g' $WORKSPACE/archives/dmaapdr/datarouter/docker-compose/prov_data/provserver.properties
+docker-compose up -d
+
+# Wait for initialization of Docker container for datarouter-node, datarouter-prov and mariadb
+for i in {1..50}; do
+ if [ $(docker inspect --format '{{ .State.Running }}' datarouter-node) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' datarouter-prov) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' mariadb) ]
+ then
+ echo "DR Service Running"
+ break
+ else
+ echo sleep $i
+ sleep $i
+ fi
+done
+
+sleep 5
+
+# Get IP address of datarrouger-prov, datarouter-node, fileconsumer-node.
+DR_PROV_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' datarouter-prov)
+DR_NODE_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' datarouter-node)
+DR_SUBSCIBER_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' fileconsumer-node)
+DR_GATEWAY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}' datarouter-prov)
+
+echo DR_PROV_IP=${DR_PROV_IP}
+echo DR_NODE_IP=${DR_NODE_IP}
+echo DR_GATEWAY_IP=${DR_GATEWAY_IP}
+echo DR_SUBSCIBER_IP=${DR_SUBSCIBER_IP}
+
+docker exec -i datarouter-prov sh -c "curl -k -X PUT https://$DR_PROV_IP:8443/internal/api/NODES?val=dmaap-dr-node\|$DR_GATEWAY_IP"
+docker exec -i datarouter-prov sh -c "curl -k -X PUT https://$DR_PROV_IP:8443/internal/api/PROV_AUTH_ADDRESSES?val=dmaap-dr-prov\|$DR_GATEWAY_IP"
+docker exec datarouter-prov /bin/sh -c "echo '${DR_NODE_IP}' dmaap-dr-node >> /etc/hosts"
+docker exec datarouter-node /bin/sh -c "echo '${DR_PROV_IP}' dmaap-dr-prov >> /etc/hosts"
+docker exec datarouter-node /bin/sh -c "echo '${DR_SUBSCIBER_IP}' dmaap-dr-subscriber >> /etc/hosts"
+
+# Get IP address of DMAAP, KAFKA, Zookeeper
+DMAAP_MR_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $DMAAP)
+KAFKA_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $KAFKA)
+ZOOKEEPER_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $ZOOKEEPER)
+VESC_IP=$(docker inspect '--format={{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' vescollector)
+SFTP_IP=$(docker inspect '--format={{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' sftp)
+
+export VESC_IP=${VESC_IP}
+export HOST_IP=${HOST_IP}
+export DMAAP_MR_IP=${DMAAP_MR_IP}
+
+#Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v DR_PROV_IP:${DR_PROV_IP} -v DR_NODE_IP:${DR_NODE_IP} -v DMAAP_MR_IP:${DMAAP_MR_IP} -v VESC_IP:${VESC_IP} -v DR_SUBSCIBER_IP:${DR_SUBSCIBER_IP}"
+
+pip install jsonschema uuid
+# Wait container ready
+sleep 2
+
+# Data File Collector configuration :
+cp $WORKSPACE/test/csit/plans/usecases/5G-bulkpm/assets/datafile_endpoints.json /tmp/
+sed -i 's/dmaapmrhost/'${DMAAP_MR_IP}'/g' /tmp/datafile_endpoints.json
+sed -i 's/dmaapdrhost/'${DR_PROV_IP}'/g' /tmp/datafile_endpoints.json
+docker cp /tmp/datafile_endpoints.json dfc:/config/
+docker restart dfc
+
+# SFTP Configuration:
+# Update the File Ready Notification with actual sftp ip address and copy pm files to sftp server.
+cp $WORKSPACE/test/csit/tests/usecases/5G-bulkpm/assets/json_events/FileExistNotification.json $WORKSPACE/test/csit/tests/usecases/5G-bulkpm-bulkpm/testcases/assets/json_events/FileExistNotificationUpdated.json
+sed -i 's/sftpserver/'${SFTP_IP}'/g' $WORKSPACE/test/csit/tests/usecases/5G-bulkpm/assets/json_events/FileExistNotificationUpdated.json
+docker cp $WORKSPACE/test/csit/plans/usecases/5G-bulkpm/assets/xNF.pm.xml.gz sftp:/home/admin/
+
+# Data Router Configuration:
+# Create default feed and create file consumer subscriber on data router
+curl -v -X POST -H "Content-Type:application/vnd.att-dr.feed" -H "X-ATT-DR-ON-BEHALF-OF:dradmin" --data-ascii @$WORKSPACE/test/csit/plans/usecases/5G-bulkpm/assets/createFeed.json --post301 --location-trusted -k https://${DR_PROV_IP}:8443
+cp $WORKSPACE/test/csit/plans/usecases/5G-bulkpm/assets/addSubscriber.json /tmp/addSubscriber.json
+sed -i 's/fileconsumer/'${DR_SUBSCIBER_IP}'/g' /tmp/addSubscriber.json
+curl -v -X POST -H "Content-Type:application/vnd.att-dr.subscription" -H "X-ATT-DR-ON-BEHALF-OF:dradmin" --data-ascii @/tmp/addSubscriber.json --post301 --location-trusted -k https://${DR_PROV_IP}:8443/subscribe/1ii @/tmp/addSubscriber.json --post301 --location-trusted -k https://${DR_PROV_IP}:8443/subscribe/1 \ No newline at end of file
diff --git a/plans/usecases/5G-bulkpm/teardown.sh b/plans/usecases/5G-bulkpm/teardown.sh
new file mode 100644
index 00000000..c55f4398
--- /dev/null
+++ b/plans/usecases/5G-bulkpm/teardown.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+echo "Starting teardown script"
+kill-instance.sh $DMAAP
+kill-instance.sh $KAFKA
+kill-instance.sh $ZOOKEEPER
+kill-instance.sh vescollector
+kill-instance.sh datarouter-node
+kill-instance.sh datarouter-prov
+kill-instance.sh fileconsumer-node
+kill-instance.sh mariadb
+kill-instance.sh dfc
+kill-instance.sh sftp \ No newline at end of file
diff --git a/plans/usecases/5G-bulkpm/testplan.txt b/plans/usecases/5G-bulkpm/testplan.txt
new file mode 100644
index 00000000..c4e1c427
--- /dev/null
+++ b/plans/usecases/5G-bulkpm/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+usecases/5G-bulkpm
diff --git a/plans/vfc-gvnfm-vnflcm/sanity-check/setup.sh b/plans/vfc-gvnfm-vnflcm/sanity-check/setup.sh
new file mode 100755
index 00000000..f82f228a
--- /dev/null
+++ b/plans/vfc-gvnfm-vnflcm/sanity-check/setup.sh
@@ -0,0 +1,75 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+source ${SCRIPTS}/common_functions.sh
+
+#start msb
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+MSB_CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo MSB_CONSUL_IP=${MSB_CONSUL_IP}
+
+docker run -d -p 10081:10081 -e CONSUL_IP=$MSB_CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+MSB_DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${MSB_DISCOVERY_IP}
+
+docker run -d -p 80:80 -e CONSUL_IP=$MSB_CONSUL_IP -e SDCLIENT_IP=$MSB_DISCOVERY_IP --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IAG_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IAG_IP=${MSB_IAG_IP}
+
+docker run -d -p 3306:3306 --name vfc-db -v /var/lib/mysql nexus3.onap.org:10001/onap/vfc/db
+VFC_DB_IP=`get-instance-ip.sh vfc-db`
+echo VFC_DB_IP=${VFC_DB_IP}
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${MSB_CONSUL_IP}:8500 && curl -sS -m 1 ${MSB_DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IAG_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Wait for initialization(3306 DB)
+for i in {1..3}; do
+ curl -sS -m 1 ${VFC_DB_IP}:3306 && break
+ echo sleep $i
+ sleep $i
+done
+
+# wait for container initalization
+echo sleep 30
+sleep 30
+
+# start vfc-vnflcm
+docker run -d --name vfc-vnflcm -e MSB_ADDR=${MSB_IAG_IP}:80 -e MYSQL_ADDR=${VFC_DB_IP}:3306 nexus3.onap.org:10001/onap/vfc/vnflcm
+VNFLCM_IP=`get-instance-ip.sh vfc-vnflcm`
+
+# Wait for initialization
+for i in {1..10}; do
+ curl -sS -m 1 ${VNFLCM_IP}:8801 && break
+ echo sleep $i
+ sleep $i
+done
+
+docker cp vfc-vnflcm:/service/vfc/gvnfm/vnflcm/lcm/lcm/pub/config/config.py ./
+cat config.py
+
+docker cp vfc-vnflcm:/service/vfc/gvnfm/vnflcm/lcm/logs/runtime_lcm.log ./
+cat runtime_lcm.log
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IAG_IP:${MSB_IAG_IP} -v VNFLCM_IP:${VNFLCM_IP} -v SCRIPTS:${SCRIPTS}"
diff --git a/plans/vfc-gvnfm-vnflcm/sanity-check/teardown.sh b/plans/vfc-gvnfm-vnflcm/sanity-check/teardown.sh
new file mode 100755
index 00000000..aebb2523
--- /dev/null
+++ b/plans/vfc-gvnfm-vnflcm/sanity-check/teardown.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh msb_discovery
+kill-instance.sh msb_consul
+kill-instance.sh vfc-db
+kill-instance.sh vfc-vnflcm
diff --git a/plans/vfc-gvnfm-vnflcm/sanity-check/testplan.txt b/plans/vfc-gvnfm-vnflcm/sanity-check/testplan.txt
new file mode 100644
index 00000000..0aa2e3e2
--- /dev/null
+++ b/plans/vfc-gvnfm-vnflcm/sanity-check/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+vfc/gvnfm-vnflcm/test.robot
diff --git a/plans/vfc-gvnfm-vnfmgr/sanity-check/setup.sh b/plans/vfc-gvnfm-vnfmgr/sanity-check/setup.sh
new file mode 100755
index 00000000..3c985aaf
--- /dev/null
+++ b/plans/vfc-gvnfm-vnfmgr/sanity-check/setup.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+source ${SCRIPTS}/common_functions.sh
+
+#start msb
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+MSB_CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo MSB_CONSUL_IP=${MSB_CONSUL_IP}
+
+docker run -d -p 10081:10081 -e CONSUL_IP=$MSB_CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+MSB_DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${MSB_DISCOVERY_IP}
+
+docker run -d -p 80:80 -e CONSUL_IP=$MSB_CONSUL_IP -e SDCLIENT_IP=$MSB_DISCOVERY_IP --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IAG_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IAG_IP=${MSB_IAG_IP}
+
+docker run -d -p 3306:3306 --name vfc-db nexus3.onap.org:10001/onap/vfc/db
+VFC_DB_IP=`get-instance-ip.sh vfc-db`
+echo VFC_DB_IP=${VFC_DB_IP}
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${MSB_CONSUL_IP}:8500 && curl -sS -m 1 ${MSB_DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IAG_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Wait for initialization(3306 DB)
+for i in {1..3}; do
+ curl -sS -m 1 ${VFC_DB_IP}:3306 && break
+ echo sleep $i
+ sleep $i
+done
+
+# wait for container initalization
+echo sleep 30
+sleep 30
+
+# start vfc-vnfmgr
+docker run -d --name vfc-vnfmgr -e MSB_ADDR=${MSB_IAG_IP}:80 -e MYSQL_ADDR=${VFC_DB_IP}:3306 nexus3.onap.org:10001/onap/vfc/vnfmgr
+VNFMGR_IP=`get-instance-ip.sh vfc-vnfmgr`
+for i in {1..10}; do
+ curl -sS -m 1 ${VNFMGR_IP}:8803 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IAG_IP:${MSB_IAG_IP} -v VNFMGR_IP:${VNFMGR_IP} -v SCRIPTS:${SCRIPTS}"
diff --git a/plans/vfc-gvnfm-vnfmgr/sanity-check/teardown.sh b/plans/vfc-gvnfm-vnfmgr/sanity-check/teardown.sh
new file mode 100755
index 00000000..cfabe42d
--- /dev/null
+++ b/plans/vfc-gvnfm-vnfmgr/sanity-check/teardown.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh msb_discovery
+kill-instance.sh msb_consul
+kill-instance.sh vfc-db
+kill-instance.sh vfc-vnfmgr
diff --git a/plans/vfc-gvnfm-vnfmgr/sanity-check/testplan.txt b/plans/vfc-gvnfm-vnfmgr/sanity-check/testplan.txt
new file mode 100644
index 00000000..960f7325
--- /dev/null
+++ b/plans/vfc-gvnfm-vnfmgr/sanity-check/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+vfc/gvnfm-vnfmgr/test.robot
diff --git a/plans/vfc-gvnfm-vnfres/sanity-check/setup.sh b/plans/vfc-gvnfm-vnfres/sanity-check/setup.sh
new file mode 100755
index 00000000..a0ea986d
--- /dev/null
+++ b/plans/vfc-gvnfm-vnfres/sanity-check/setup.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+source ${SCRIPTS}/common_functions.sh
+
+
+#start msb
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+MSB_CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo MSB_CONSUL_IP=${MSB_CONSUL_IP}
+docker run -d -p 10081:10081 -e CONSUL_IP=$MSB_CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+MSB_DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo MSB_DISCOVERY_IP=${MSB_DISCOVERY_IP}
+docker run -d -p 80:80 -e CONSUL_IP=$MSB_CONSUL_IP -e SDCLIENT_IP=$MSB_DISCOVERY_IP -e "ROUTE_LABELS=visualRange:1" --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IAG_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IAG_IP=${MSB_IAG_IP}
+
+docker run -d -p 3306:3306 --name vfc-db nexus3.onap.org:10001/onap/vfc/db
+VFC_DB_IP=`get-instance-ip.sh vfc-db`
+echo VFC_DB_IP=${VFC_DB_IP}
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${MSB_CONSUL_IP}:8500 && curl -sS -m 1 ${MSB_DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IAG_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Wait for initialization(3306 DB)
+for i in {1..3}; do
+ curl -sS -m 1 ${VFC_DB_IP}:3306 && break
+ echo sleep $i
+ sleep $i
+done
+
+# wait for container initalization
+echo sleep 60
+sleep 60
+# start vfc-vnfres
+docker run -d --name vfc-vnfres -e MSB_ADDR=${MSB_IAG_IP}:80 -e MYSQL_ADDR=${VFC_DB_IP}:3306 nexus3.onap.org:10001/onap/vfc/vnfres
+VNFRES_IP=`get-instance-ip.sh vfc-vnfres`
+
+# Wait for initialization
+for i in {1..10}; do
+ curl -sS ${VNFRES_IP}:8802 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IAG_IP:${MSB_IAG_IP} -v VNFRES_IP:${VNFRES_IP} -v SCRIPTS:${SCRIPTS}"
diff --git a/plans/vfc-gvnfm-vnfres/sanity-check/teardown.sh b/plans/vfc-gvnfm-vnfres/sanity-check/teardown.sh
new file mode 100755
index 00000000..09db55b5
--- /dev/null
+++ b/plans/vfc-gvnfm-vnfres/sanity-check/teardown.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh msb_discovery
+kill-instance.sh msb_consul
+kill-instance.sh vfc-db
+kill-instance.sh vfc-vnfres
diff --git a/plans/vfc-gvnfm-vnfres/sanity-check/testplan.txt b/plans/vfc-gvnfm-vnfres/sanity-check/testplan.txt
new file mode 100644
index 00000000..e94e2946
--- /dev/null
+++ b/plans/vfc-gvnfm-vnfres/sanity-check/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+vfc/gvnfm-vnfres/test.robot
diff --git a/plans/vfc-nfvo-catalog/sanity-check/setup.sh b/plans/vfc-nfvo-catalog/sanity-check/setup.sh
new file mode 100644
index 00000000..d839fa55
--- /dev/null
+++ b/plans/vfc-nfvo-catalog/sanity-check/setup.sh
@@ -0,0 +1,68 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+#login to the onap nexus docker repo
+docker login -u docker -p docker nexus3.onap.org:10001
+
+# start msb
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo CONSUL_IP=${CONSUL_IP}
+
+docker run -d -p 10081:10081 -e CONSUL_IP=$CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${DISCOVERY_IP}
+
+docker run -d -p 80:80 -e CONSUL_IP=$CONSUL_IP -e SDCLIENT_IP=$DISCOVERY_IP -e "ROUTE_LABELS=visualRange:1" --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IP==`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IP=${MSB_IP}
+
+docker run -d -p 3306:3306 --name vfc-db -v /var/lib/mysql nexus3.onap.org:10001/onap/vfc/db
+VFC_DB_IP=`get-instance-ip.sh vfc-db`
+echo VFC_DB_IP=${VFC_DB_IP}
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${CONSUL_IP}:8500 && curl -sS -m 1 ${DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Wait for initialization(3306 DB)
+for i in {1..3}; do
+ curl -sS -m 1 ${VFC_DB_IP}:3306 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Need some time so service info can be synced from discovery to api gateway
+echo sleep 60
+sleep 60
+
+# start vfc-catalog
+docker run -d --name vfc-catalog -v /var/lib/mysql -e MSB_ADDR=${DISCOVERY_IP}:10081 -e MYSQL_ADDR=${VFC_DB_IP}:3306 nexus3.onap.org:10001/onap/vfc/catalog
+CATALOG_IP=`get-instance-ip.sh vfc-catalog`
+for i in {1..10}; do
+ curl -sS -m 1 ${CATALOG_IP}:8806 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IP:${MSB_IP} -v CATALOG_IP:${CATALOG_IP} -v MSB_DISCOVERY_IP:${DISCOVERY_IP}"
diff --git a/plans/vfc-nfvo-catalog/sanity-check/teardown.sh b/plans/vfc-nfvo-catalog/sanity-check/teardown.sh
new file mode 100644
index 00000000..d498e34c
--- /dev/null
+++ b/plans/vfc-nfvo-catalog/sanity-check/teardown.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh msb_discovery
+kill-instance.sh msb_consul
+kill-instance.sh vfc-db
+kill-instance.sh vfc-catalog
diff --git a/plans/vfc-nfvo-catalog/sanity-check/testplan.txt b/plans/vfc-nfvo-catalog/sanity-check/testplan.txt
new file mode 100644
index 00000000..6c8c54a9
--- /dev/null
+++ b/plans/vfc-nfvo-catalog/sanity-check/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+vfc/nfvo-catalog/test.robot
diff --git a/plans/vfc-nfvo-driver-ems/sanity-check/setup.sh b/plans/vfc-nfvo-driver-ems/sanity-check/setup.sh
new file mode 100755
index 00000000..d381f8f3
--- /dev/null
+++ b/plans/vfc-nfvo-driver-ems/sanity-check/setup.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+source ${SCRIPTS}/common_functions.sh
+
+#start msb
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+MSB_CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo MSB_CONSUL_IP=${MSB_CONSUL_IP}
+
+docker run -d -p 10081:10081 -e CONSUL_IP=$MSB_CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+MSB_DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${MSB_DISCOVERY_IP}
+
+docker run -d -p 80:80 -e CONSUL_IP=$MSB_CONSUL_IP -e SDCLIENT_IP=$MSB_DISCOVERY_IP -e "ROUTE_LABELS=visualRange:1" --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IAG_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IAG_IP=${MSB_IAG_IP}
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${MSB_CONSUL_IP}:8500 && curl -sS -m 1 ${MSB_DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IAG_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Need some time so service info can be synced from discovery to api gateway
+echo sleep 60
+sleep 60
+
+# start vfc-emsdriver
+docker run -d --name vfc-emsdriver -e MSB_ADDR=${MSB_IAG_IP}:80 nexus3.onap.org:10001/onap/vfc/emsdriver
+EMS_DRV_IP=`get-instance-ip.sh vfc-emsdriver`
+docker logs -f vfc-emsdriver > emsdriver.log &
+
+# Wait for initialization
+for i in {1..10}; do
+ curl -sS -m 1 ${EMS_DRV_IP}:8206 && break
+ echo sleep $i
+ sleep $i
+done
+
+echo "==============="
+cat emsdriver.log
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IAG_IP:${MSB_IAG_IP} -v EMS_DRV_IP:${EMS_DRV_IP}"
diff --git a/plans/vfc-nfvo-driver-ems/sanity-check/teardown.sh b/plans/vfc-nfvo-driver-ems/sanity-check/teardown.sh
new file mode 100755
index 00000000..aa676b2f
--- /dev/null
+++ b/plans/vfc-nfvo-driver-ems/sanity-check/teardown.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh msb_discovery
+kill-instance.sh msb_consul
+kill-instance.sh vfc-emsdriver
diff --git a/plans/vfc-nfvo-driver-ems/sanity-check/testplan.txt b/plans/vfc-nfvo-driver-ems/sanity-check/testplan.txt
new file mode 100644
index 00000000..747f8683
--- /dev/null
+++ b/plans/vfc-nfvo-driver-ems/sanity-check/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+vfc/nfvo-driver-ems/test.robot
diff --git a/plans/vfc-nfvo-driver-sfc/sanity-check/setup.sh b/plans/vfc-nfvo-driver-sfc/sanity-check/setup.sh
new file mode 100755
index 00000000..85a3e69f
--- /dev/null
+++ b/plans/vfc-nfvo-driver-sfc/sanity-check/setup.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+source ${SCRIPTS}/common_functions.sh
+
+#start msb
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+MSB_CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo MSB_CONSUL_IP=${MSB_CONSUL_IP}
+
+docker run -d -p 10081:10081 -e CONSUL_IP=$MSB_CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+MSB_DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${MSB_DISCOVERY_IP}
+
+docker run -d -p 80:80 -e CONSUL_IP=$MSB_CONSUL_IP -e SDCLIENT_IP=$MSB_DISCOVERY_IP -e "ROUTE_LABELS=visualRange:1" --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IAG_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IAG_IP=${MSB_IAG_IP}
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${MSB_CONSUL_IP}:8500 && curl -sS -m 1 ${MSB_DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IAG_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Need some time so service info can be synced from discovery to api gateway
+echo sleep 60
+sleep 60
+
+# start vfc-ztesdncdriver
+docker run -d --name vfc-ztesdncdriver -e MSB_ADDR=${MSB_IAG_IP}:80 nexus3.onap.org:10001/onap/vfc/ztesdncdriver
+SFC_DRV_IP=`get-instance-ip.sh vfc-ztesdncdriver`
+docker logs -f vfc-ztesdncdriver > ztesdncdriver.log &
+
+# Wait for initialization
+for i in {1..10}; do
+ curl -sS -m 1 ${SFC_DRV_IP}:8411 && break
+ echo sleep $i
+ sleep $i
+done
+
+echo "==============================="
+cat ztesdncdriver.log
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IAG_IP:${MSB_IAG_IP} -v SFC_DRV_IP:${SFC_DRV_IP}"
diff --git a/plans/vfc-nfvo-driver-sfc/sanity-check/teardown.sh b/plans/vfc-nfvo-driver-sfc/sanity-check/teardown.sh
new file mode 100755
index 00000000..ce5402ef
--- /dev/null
+++ b/plans/vfc-nfvo-driver-sfc/sanity-check/teardown.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh msb_discovery
+kill-instance.sh msb_consul
+kill-instance.sh vfc-ztesdncdriver
diff --git a/plans/vfc-nfvo-driver-sfc/sanity-check/testplan.txt b/plans/vfc-nfvo-driver-sfc/sanity-check/testplan.txt
new file mode 100644
index 00000000..9de2acce
--- /dev/null
+++ b/plans/vfc-nfvo-driver-sfc/sanity-check/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+vfc/nfvo-driver-sfc/test.robot
diff --git a/plans/vfc-nfvo-driver-vnfm-gvnfm/sanity-check/setup.sh b/plans/vfc-nfvo-driver-vnfm-gvnfm/sanity-check/setup.sh
new file mode 100644
index 00000000..bdc66d0e
--- /dev/null
+++ b/plans/vfc-nfvo-driver-vnfm-gvnfm/sanity-check/setup.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+source ${SCRIPTS}/common_functions.sh
+
+
+#start msb
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+MSB_CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo MSB_CONSUL_IP=${MSB_CONSUL_IP}
+docker run -d -p 10081:10081 -e CONSUL_IP=$MSB_CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+MSB_DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo MSB_DISCOVERY_IP=${MSB_DISCOVERY_IP}
+docker run -d -p 80:80 -e CONSUL_IP=$MSB_CONSUL_IP -e SDCLIENT_IP=$MSB_DISCOVERY_IP -e "ROUTE_LABELS=visualRange:1" --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IAG_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IAG_IP=${MSB_IAG_IP}
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${MSB_CONSUL_IP}:8500 && curl -sS -m 1 ${MSB_DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IAG_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+# wait for container initalization
+echo sleep 60
+sleep 60
+# start vfc-gvnfmdriver
+docker run -d --name vfc-gvnfmdriver -e MSB_ADDR=${MSB_IAG_IP}:80 nexus3.onap.org:10001/onap/vfc/gvnfmdriver
+GVNFMDRIVER_IP=`get-instance-ip.sh vfc-gvnfmdriver`
+
+# Wait for initialization
+for i in {1..10}; do
+ curl -sS -m 1 ${GVNFMDRIVER_IP}:8484 && break
+ echo sleep $i
+ sleep $i
+done
+
+# start vfc-jujudriver
+docker run -d --name vfc-jujudriver -e MSB_ADDR=${MSB_IAG_IP}:80 nexus3.onap.org:10001/onap/vfc/jujudriver
+JUJUDRIVER_IP=`get-instance-ip.sh vfc-jujudriver`
+
+# Wait for initialization
+for i in {1..10}; do
+ curl -sS ${JUJUDRIVER_IP}:8483 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IAG_IP:${MSB_IAG_IP} -v GVNFMDRIVER_IP:${GVNFMDRIVER_IP} -v JUJUDRIVER_IP:${JUJUDRIVER_IP}"
diff --git a/plans/vfc-nfvo-driver-vnfm-gvnfm/sanity-check/teardown.sh b/plans/vfc-nfvo-driver-vnfm-gvnfm/sanity-check/teardown.sh
new file mode 100644
index 00000000..78d7c5ad
--- /dev/null
+++ b/plans/vfc-nfvo-driver-vnfm-gvnfm/sanity-check/teardown.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+#
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh msb_discovery
+kill-instance.sh msb_consul
+kill-instance.sh vfc-gvnfmdriver
+
+kill-instance.sh vfc-jujudriver
diff --git a/plans/vfc-nfvo-driver-vnfm-gvnfm/sanity-check/testplan.txt b/plans/vfc-nfvo-driver-vnfm-gvnfm/sanity-check/testplan.txt
new file mode 100644
index 00000000..e7bee519
--- /dev/null
+++ b/plans/vfc-nfvo-driver-vnfm-gvnfm/sanity-check/testplan.txt
@@ -0,0 +1,6 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+
+vfc/nfvo-driver-gvnfm/gvnfmdriver.robot
+
+vfc/nfvo-driver-gvnfm/jujudriver.robot
diff --git a/plans/vfc-nfvo-driver-vnfm-svnfm/sanity-check/setup.sh b/plans/vfc-nfvo-driver-vnfm-svnfm/sanity-check/setup.sh
new file mode 100644
index 00000000..047c067e
--- /dev/null
+++ b/plans/vfc-nfvo-driver-vnfm-svnfm/sanity-check/setup.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+source ${SCRIPTS}/common_functions.sh
+
+
+#start msb
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+MSB_CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo MSB_CONSUL_IP=${MSB_CONSUL_IP}
+docker run -d -p 10081:10081 -e CONSUL_IP=$MSB_CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+MSB_DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo MSB_DISCOVERY_IP=${MSB_DISCOVERY_IP}
+docker run -d -p 80:80 -e CONSUL_IP=$MSB_CONSUL_IP -e SDCLIENT_IP=$MSB_DISCOVERY_IP -e "ROUTE_LABELS=visualRange:1" --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IAG_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IAG_IP=${MSB_IAG_IP}
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${MSB_CONSUL_IP}:8500 && curl -sS -m 1 ${MSB_DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IAG_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+# wait for container initalization
+echo sleep 60
+sleep 60
+
+# start vfc-ztevnfmdriver
+docker run -d --name vfc-ztevnfmdriver -p 8410:8410 -e MSB_ADDR=${MSB_IAG_IP}:80 nexus3.onap.org:10001/onap/vfc/ztevnfmdriver
+ZTEVNFMDRIVER_IP=`get-instance-ip.sh vfc-ztevnfmdriver`
+
+# Wait for initialization
+for i in {1..10}; do
+ curl -sS ${ZTEVNFMDRIVER_IP}:8410 && break
+ echo sleep $i
+ sleep $i
+done
+
+
+# Start svnfm-huawei
+docker run -d --name vfc-svnfm-huawei -p 8482:8482 -p 8443:8443 -e MSB_ADDR=${MSB_IAG_IP}:80 nexus3.onap.org:10001/onap/vfc/nfvo/svnfm/huawei
+SERVICE_IP=`get-instance-ip.sh vfc-svnfm-huawei`
+for i in {1..20}; do
+ curl -sS ${SERVICE_IP}:8482 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IAG_IP:${MSB_IAG_IP} -v ZTEVNFMDRIVER_IP:${ZTEVNFMDRIVER_IP} -v MSB_IP:${MSB_IAG_IP} -v SERVICE_IP:${SERVICE_IP} -v SCRIPTS:${SCRIPTS}"
diff --git a/plans/vfc-nfvo-driver-vnfm-svnfm/sanity-check/teardown.sh b/plans/vfc-nfvo-driver-vnfm-svnfm/sanity-check/teardown.sh
new file mode 100644
index 00000000..a7909581
--- /dev/null
+++ b/plans/vfc-nfvo-driver-vnfm-svnfm/sanity-check/teardown.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+#
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh msb_discovery
+kill-instance.sh msb_consul
+kill-instance.sh vfc-ztevnfmdriver
+
+kill-instance.sh vfc-svnfm-huawei
diff --git a/plans/vfc-nfvo-driver-vnfm-svnfm/sanity-check/testplan.txt b/plans/vfc-nfvo-driver-vnfm-svnfm/sanity-check/testplan.txt
new file mode 100644
index 00000000..7eb861ed
--- /dev/null
+++ b/plans/vfc-nfvo-driver-vnfm-svnfm/sanity-check/testplan.txt
@@ -0,0 +1,6 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+
+vfc/nfvo-driver-svnfm/ztevmanager.robot
+
+vfc/nfvo-driver-svnfm/huawei.robot
diff --git a/plans/vfc-nfvo-lcm/sanity-check/setup.sh b/plans/vfc-nfvo-lcm/sanity-check/setup.sh
new file mode 100755
index 00000000..7a739bad
--- /dev/null
+++ b/plans/vfc-nfvo-lcm/sanity-check/setup.sh
@@ -0,0 +1,85 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+source ${SCRIPTS}/common_functions.sh
+
+#start msb
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+MSB_CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo MSB_CONSUL_IP=${MSB_CONSUL_IP}
+
+docker run -d -p 10081:10081 -e CONSUL_IP=$MSB_CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+MSB_DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${MSB_DISCOVERY_IP}
+
+docker run -d -p 80:80 -e CONSUL_IP=$MSB_CONSUL_IP -e SDCLIENT_IP=$MSB_DISCOVERY_IP -e "ROUTE_LABELS=visualRange:1" --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IAG_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IAG_IP=${MSB_IAG_IP}
+
+docker run -d -p 3306:3306 --name vfc-db -v /var/lib/mysql nexus3.onap.org:10001/onap/vfc/db
+VFC_DB_IP=`get-instance-ip.sh vfc-db`
+echo VFC_DB_IP=${VFC_DB_IP}
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${MSB_CONSUL_IP}:8500 && curl -sS -m 1 ${MSB_DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IAG_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Wait for initialization(3306 DB)
+for i in {1..3}; do
+ curl -sS -m 1 ${VFC_DB_IP}:3306 && break
+ echo sleep $i
+ sleep $i
+done
+
+docker ps > 1.txt
+cat 1.txt
+echo "****************************"
+docker logs -f vfc-db > 2.txt &
+cat 2.txt
+
+# Need some time so service info can be synced from discovery to api gateway
+echo sleep 60
+sleep 60
+
+# start vfc-nslcm
+docker run -d --name vfc-nslcm -v /var/lib/mysql -e MSB_ADDR=${MSB_IAG_IP}:80 -e MYSQL_ADDR=${VFC_DB_IP}:3306 nexus3.onap.org:10001/onap/vfc/nslcm
+NSLCM_IP=`get-instance-ip.sh vfc-nslcm`
+
+# Wait for initialization
+for i in {1..10}; do
+ curl -sS -m 1 ${NSLCM_IP}:8403 && break
+ echo sleep $i
+ sleep $i
+done
+
+curl http://${NSLCM_IP}:8403/api/nslcm/v1/swagger.json
+
+docker logs -f vfc-nslcm > 3.txt &
+cat 3.txt
+
+docker cp vfc-nslcm:/service/vfc/nfvo/lcm/logs/runtime_lcm.log ./
+cat runtime_lcm.log
+
+
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IAG_IP:${MSB_IAG_IP} -v NSLCM_IP:${NSLCM_IP} -v SCRIPTS:${SCRIPTS}"
diff --git a/plans/vfc-nfvo-lcm/sanity-check/teardown.sh b/plans/vfc-nfvo-lcm/sanity-check/teardown.sh
new file mode 100755
index 00000000..6ddf7557
--- /dev/null
+++ b/plans/vfc-nfvo-lcm/sanity-check/teardown.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh msb_discovery
+kill-instance.sh msb_consul
+kill-instance.sh vfc-db
+kill-instance.sh vfc-nslcm
diff --git a/plans/vfc-nfvo-lcm/sanity-check/testplan.txt b/plans/vfc-nfvo-lcm/sanity-check/testplan.txt
new file mode 100644
index 00000000..fc261e13
--- /dev/null
+++ b/plans/vfc-nfvo-lcm/sanity-check/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+vfc/nfvo-lcm/test.robot
diff --git a/plans/vfc-nfvo-multivimproxy/sanity-check/setup.sh b/plans/vfc-nfvo-multivimproxy/sanity-check/setup.sh
new file mode 100644
index 00000000..4d97f33e
--- /dev/null
+++ b/plans/vfc-nfvo-multivimproxy/sanity-check/setup.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+#
+# Copyright 2018 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+#login to the onap nexus docker repo
+docker login -u docker -p docker nexus3.onap.org:10001
+
+# Start MSB
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo CONSUL_IP=${CONSUL_IP}
+docker run -d -p 10081:10081 -e CONSUL_IP=$CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${DISCOVERY_IP}
+docker run -d -p 80:80 -e CONSUL_IP=$CONSUL_IP -e SDCLIENT_IP=$DISCOVERY_IP --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IP==`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IP=${MSB_IP}
+
+# Start resmgr
+docker run -d --name vfc-multivimproxy -e MSB_ADDR=${MSB_IP}:80 nexus3.onap.org:10001/onap/vfc/multivimproxy
+RESMGR_IP=`get-instance-ip.sh vfc-multivimproxy`
+for i in {1..20}; do
+ curl -sS ${RESMGR_IP}:8486 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IP:${MSB_IP} -v RESMGR_IP:${RESMGR_IP}"
diff --git a/plans/vfc-nfvo-multivimproxy/sanity-check/teardown.sh b/plans/vfc-nfvo-multivimproxy/sanity-check/teardown.sh
new file mode 100644
index 00000000..c158d199
--- /dev/null
+++ b/plans/vfc-nfvo-multivimproxy/sanity-check/teardown.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Copyright 2018 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh msb_discovery
+kill-instance.sh msb_consul
+kill-instance.sh vfc-multivimproxy
diff --git a/plans/vfc-nfvo-multivimproxy/sanity-check/testplan.txt b/plans/vfc-nfvo-multivimproxy/sanity-check/testplan.txt
new file mode 100644
index 00000000..f81be8ec
--- /dev/null
+++ b/plans/vfc-nfvo-multivimproxy/sanity-check/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+vfc/nfvo-multivimproxy/test.robot \ No newline at end of file
diff --git a/plans/vfc-nfvo-resmanagement/sanity-check/setup.sh b/plans/vfc-nfvo-resmanagement/sanity-check/setup.sh
new file mode 100644
index 00000000..68b78431
--- /dev/null
+++ b/plans/vfc-nfvo-resmanagement/sanity-check/setup.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+#
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+#login to the onap nexus docker repo
+docker login -u docker -p docker nexus3.onap.org:10001
+
+# Start MSB
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo CONSUL_IP=${CONSUL_IP}
+docker run -d -p 10081:10081 -e CONSUL_IP=$CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${DISCOVERY_IP}
+docker run -d -p 80:80 -e CONSUL_IP=$CONSUL_IP -e SDCLIENT_IP=$DISCOVERY_IP --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IP==`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IP=${MSB_IP}
+
+# Start resmgr
+docker run -d --name vfc-resmanagement -e MSB_ADDR=${MSB_IP}:80 nexus3.onap.org:10001/onap/vfc/resmanagement
+RESMGR_IP=`get-instance-ip.sh vfc-resmanagement`
+for i in {1..20}; do
+ curl -sS ${RESMGR_IP}:8480 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IP:${MSB_IP} -v RESMGR_IP:${RESMGR_IP}"
diff --git a/plans/vfc-nfvo-resmanagement/sanity-check/teardown.sh b/plans/vfc-nfvo-resmanagement/sanity-check/teardown.sh
new file mode 100644
index 00000000..2ad95c6b
--- /dev/null
+++ b/plans/vfc-nfvo-resmanagement/sanity-check/teardown.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This script is sourced by run-csit.sh after Robot test completion.
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh msb_discovery
+kill-instance.sh msb_consul
+kill-instance.sh vfc-resmanagement
diff --git a/plans/vfc-nfvo-resmanagement/sanity-check/testplan.txt b/plans/vfc-nfvo-resmanagement/sanity-check/testplan.txt
new file mode 100644
index 00000000..98dac63b
--- /dev/null
+++ b/plans/vfc-nfvo-resmanagement/sanity-check/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+vfc/nfvo-resmanagement/test.robot \ No newline at end of file
diff --git a/plans/vfc-nfvo-wfengine/sanity-check/setup.sh b/plans/vfc-nfvo-wfengine/sanity-check/setup.sh
new file mode 100644
index 00000000..e7c755fa
--- /dev/null
+++ b/plans/vfc-nfvo-wfengine/sanity-check/setup.sh
@@ -0,0 +1,91 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+# Start all process required for executing test case
+
+source ${SCRIPTS}/common_functions.sh
+
+
+#start msb
+docker run -d -p 8500:8500 --name msb_consul consul:0.9.3
+MSB_CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo MSB_CONSUL_IP=${MSB_CONSUL_IP}
+docker run -d -p 10081:10081 -e CONSUL_IP=$MSB_CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery:1.1.0
+MSB_DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo MSB_DISCOVERY_IP=${MSB_DISCOVERY_IP}
+docker run -d -p 80:80 -e CONSUL_IP=$MSB_CONSUL_IP -e SDCLIENT_IP=$MSB_DISCOVERY_IP --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway:1.1.0
+MSB_IAG_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IAG_IP=${MSB_IAG_IP}
+
+# Wait for initialization(8500 Consul, 10081 Service Registration & Discovery, 80 api gateway)
+for i in {1..10}; do
+ curl -sS -m 1 ${MSB_CONSUL_IP}:8500 && curl -sS -m 1 ${MSB_DISCOVERY_IP}:10081 && curl -sS -m 1 ${MSB_IAG_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+# wait for container initalization
+echo sleep 30
+sleep 30
+
+ORG="onap"
+PROJECT="vfc"
+DOCKER_REPOSITORY="nexus3.onap.org:10001"
+IMAGE="wfengine-activiti"
+IMAGE_ACTIVITI_NAME="${DOCKER_REPOSITORY}/${ORG}/${PROJECT}/${IMAGE}"
+
+#get current host IP addres
+SERVICE_IP=$(ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}')
+
+# start wfengine-activiti
+# docker run -d --name vfc_wfengine_activiti -p 8804:8080 -e SERVICE_IP=$SERVICE_IP -e SERVICE_PORT=8804 -e OPENPALETTE_MSB_IP=${MSB_IAG_IP} -e OPENPALETTE_MSB_PORT=80 ${IMAGE_ACTIVITI_NAME}
+docker run -d --name vfc_wfengine_activiti -p 8804:8080 -e SERVICE_PORT=8080 -e OPENPALETTE_MSB_IP=${MSB_IAG_IP} -e OPENPALETTE_MSB_PORT=80 ${IMAGE_ACTIVITI_NAME}
+WFENGINE_ACTIVITI_IP=`get-instance-ip.sh vfc_wfengine_activiti`
+
+# Wait for initialization
+for i in {1..10}; do
+ curl -sS ${WFENGINE_ACTIVITI_IP}:8080 && break
+ echo sleep $i
+ sleep $i
+done
+for i in {1..10}; do
+ curl -sS ${SERVICE_IP}:8804 && break
+ echo sleep $i
+ sleep $i
+done
+docker logs vfc_wfengine_activiti
+
+IMAGE="wfengine-mgrservice"
+IMAGE_MGRSERVICE_NAME="${DOCKER_REPOSITORY}/${ORG}/${PROJECT}/${IMAGE}"
+
+# Start wfengine-mgrservice
+#docker run -d --name vfc_wfengine_mgrservice -p 8805:10550 -e SERVICE_IP=$SERVICE_IP -e SERVICE_PORT=8805 -e OPENPALETTE_MSB_IP=${MSB_IAG_IP} -e OPENPALETTE_MSB_PORT=80 ${IMAGE_MGRSERVICE_NAME}
+#docker run -d --name vfc_wfengine_mgrservice -p 8805:10550 -e SERVICE_PORT=10550 -e OPENPALETTE_MSB_IP=${MSB_IAG_IP} -e OPENPALETTE_MSB_PORT=80 ${IMAGE_MGRSERVICE_NAME}
+docker run -d --name vfc_wfengine_mgrservice -p 8805:10550 -e SERVICE_PORT=10550 -e OPENPALETTE_MSB_IP=${WFENGINE_ACTIVITI_IP} -e OPENPALETTE_MSB_PORT=8080 ${IMAGE_MGRSERVICE_NAME}
+
+##docker run -d --name ${IMAGE} -e OPENPALETTE_MSB_IP=${WFENGINEACTIVITIR_IP} -e OPENPALETTE_MSB_PORT=8080 ${IMAGE_MGRSERVICE_NAME}
+WFENGINE_MGRSERVICE_IP=`get-instance-ip.sh vfc_wfengine_mgrservice`
+for i in {1..10}; do
+ curl -sS ${WFENGINE_MGRSERVICE_IP}:10550 && break
+ echo sleep $i
+ sleep $i
+done
+docker logs vfc_wfengine_mgrservice
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IAG_IP:${MSB_IAG_IP} -v MSB_IP:${MSB_IAG_IP} -v MSB_PORT:80 -v MSB_DISCOVERY_IP:${MSB_DISCOVERY_IP} -v ACTIVITI_IP:${WFENGINE_ACTIVITI_IP} -v ACTIVITI_PORT:8080 -v MGRSERVICE_IP:${WFENGINE_MGRSERVICE_IP} -v MGRSERVICE_PORT:10550 -v SCRIPTS:${SCRIPTS}"
+##ROBOT_VARIABLES="-v MSB_IAG_IP:${WFENGINEACTIVITIR_IP} -v MSB_IP:${WFENGINEMGRSERVICE_IP} -v MSB_PORT:10550 -v MSB_DISCOVERY_IP:${WFENGINEACTIVITIR_IP} -v MSB_DISCOVERY_PORT:8080 -v WFENGINEACTIVITIR_IP:${WFENGINEACTIVITIR_IP} -v WFENGINEACTIVITIR_PORT:8080 -v WFENGINEMGRSERVICE_IP:${WFENGINEMGRSERVICE_IP} -v WFENGINEMGRSERVICE_PORT:10550 -v SCRIPTS:${SCRIPTS}" \ No newline at end of file
diff --git a/plans/vfc-nfvo-wfengine/sanity-check/teardown.sh b/plans/vfc-nfvo-wfengine/sanity-check/teardown.sh
new file mode 100644
index 00000000..bca33569
--- /dev/null
+++ b/plans/vfc-nfvo-wfengine/sanity-check/teardown.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+#
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This script is sourced by run-csit.sh after Robot test completion.
+echo === logs vfc_wfengine_activiti ===
+docker logs vfc_wfengine_activiti
+
+echo === logs vfc_wfengine_mgrservice ===
+docker logs vfc_wfengine_mgrservice
+
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh msb_discovery
+kill-instance.sh msb_consul
+kill-instance.sh vfc_wfengine_mgrservice
+kill-instance.sh vfc_wfengine_activiti
diff --git a/plans/vfc-nfvo-wfengine/sanity-check/testplan.txt b/plans/vfc-nfvo-wfengine/sanity-check/testplan.txt
new file mode 100644
index 00000000..ff9f4d5d
--- /dev/null
+++ b/plans/vfc-nfvo-wfengine/sanity-check/testplan.txt
@@ -0,0 +1,4 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+
+vfc/nfvo-wfengine/workflow.robot \ No newline at end of file
diff --git a/plans/vid/healthCheck/setup.sh b/plans/vid/healthCheck/setup.sh
new file mode 100644
index 00000000..ce308cfa
--- /dev/null
+++ b/plans/vid/healthCheck/setup.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+# Place the scripts in run order:
+
+/usr/bin/Xvfb :0 -screen 0 1024x768x24&
+export DISPLAY=:0
+
+source ${WORKSPACE}/test/csit/scripts/vid/clone_and_setup_vid_data.sh
+
+source ${WORKSPACE}/test/csit/scripts/vid/start_vid_containers.sh
+
+
+BE_IP=`get-instance-ip.sh vid-server`
+echo BE_IP=${BE_IP}
+
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v BE_IP:${BE_IP}"
diff --git a/plans/vid/healthCheck/teardown.sh b/plans/vid/healthCheck/teardown.sh
new file mode 100644
index 00000000..e82ef306
--- /dev/null
+++ b/plans/vid/healthCheck/teardown.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+source ${WORKSPACE}/test/csit/scripts/vid/kill_containers_and_remove_dataFolders.sh
+
+# $WORKSPACE/archives/clamp-clone deleted with archives folder when tests starts so we keep it at the end for debugging
diff --git a/plans/vid/healthCheck/testplan.txt b/plans/vid/healthCheck/testplan.txt
new file mode 100644
index 00000000..92d8b058
--- /dev/null
+++ b/plans/vid/healthCheck/testplan.txt
@@ -0,0 +1,4 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+vid/healthCheck
+vid/login
diff --git a/plans/vnfsdk-ice/sanity-check/setup.sh b/plans/vnfsdk-ice/sanity-check/setup.sh
new file mode 100644
index 00000000..22d9acdd
--- /dev/null
+++ b/plans/vnfsdk-ice/sanity-check/setup.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+#
+# Copyright 2018 Orange Labs.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# These scripts are sourced by run-csit.sh.
+
+
+#Start ice server
+docker run --name vnfsdk-ice -d -p 5000:5000 nexus3.onap.org:10001/onap/vnfsdk/ice:latest
+
+# Wait for server initialization
+echo Wait for vnfsdk-ice initialization
+until [ "`/usr/bin/docker inspect -f {{.State.Running}} vnfsdk-ice`"=="true" ]; do
+ sleep 1;
+done;
+ICE_IP=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' vnfsdk-ice`
+
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v SCRIPTS:${SCRIPTS} -v ICE_IP:${ICE_IP}"
+echo ${ROBOT_VARIABLES}
+
diff --git a/plans/vnfsdk-ice/sanity-check/teardown.sh b/plans/vnfsdk-ice/sanity-check/teardown.sh
new file mode 100644
index 00000000..c84ea757
--- /dev/null
+++ b/plans/vnfsdk-ice/sanity-check/teardown.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Copyright 2018 Orange Labs.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This script is sourced by run-csit.sh after Robot test completion.
+
+
+kill-instance.sh vnfsdk-ice
+
+
diff --git a/plans/vnfsdk-ice/sanity-check/testplan.txt b/plans/vnfsdk-ice/sanity-check/testplan.txt
new file mode 100644
index 00000000..c84eb031
--- /dev/null
+++ b/plans/vnfsdk-ice/sanity-check/testplan.txt
@@ -0,0 +1,3 @@
+## Test suites are relative paths under [integration.git]/test/csit/tests/.
+## Place the suites in run order.
+vnfsdk-ice/ice-server/validation_test.robot
diff --git a/plans/vnfsdk-marketplace/sanity-check/enterprise2DC.csar b/plans/vnfsdk-marketplace/sanity-check/enterprise2DC.csar
new file mode 100644
index 00000000..0960b20a
--- /dev/null
+++ b/plans/vnfsdk-marketplace/sanity-check/enterprise2DC.csar
Binary files differ
diff --git a/plans/vnfsdk-marketplace/sanity-check/setup.sh b/plans/vnfsdk-marketplace/sanity-check/setup.sh
new file mode 100644
index 00000000..85c6bc27
--- /dev/null
+++ b/plans/vnfsdk-marketplace/sanity-check/setup.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# These scripts are sourced by run-csit.sh.
+
+
+
+#Start market place
+docker run -d -i -t --name=vnfmarket -p 8702:8702 onap/vnfmarket
+
+REPO_IP=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' vnfmarket`
+
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v REPO_IP:${REPO_IP}"
+
+
diff --git a/plans/vnfsdk-marketplace/sanity-check/teardown.sh b/plans/vnfsdk-marketplace/sanity-check/teardown.sh
new file mode 100644
index 00000000..42d7b7fd
--- /dev/null
+++ b/plans/vnfsdk-marketplace/sanity-check/teardown.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This script is sourced by run-csit.sh after Robot test completion.
+
+
+kill-instance.sh vnfmarket
+
diff --git a/plans/vnfsdk-marketplace/sanity-check/testplan.txt b/plans/vnfsdk-marketplace/sanity-check/testplan.txt
new file mode 100644
index 00000000..730df014
--- /dev/null
+++ b/plans/vnfsdk-marketplace/sanity-check/testplan.txt
@@ -0,0 +1,3 @@
+## Test suites are relative paths under [integration.git]/test/csit/tests/.
+## Place the suites in run order.
+vnfsdk-marketplace/provision/sanity_test_vnfsdktestfunction.robot
diff --git a/plans/vnfsdk-marketplace/sanity-check/uploadCSAR.sh b/plans/vnfsdk-marketplace/sanity-check/uploadCSAR.sh
new file mode 100644
index 00000000..279912c3
--- /dev/null
+++ b/plans/vnfsdk-marketplace/sanity-check/uploadCSAR.sh
@@ -0,0 +1,138 @@
+#!/usr/bin/env bash
+###############################################################################
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+###############################################################################
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+echo $SCRIPT_DIR
+
+#CHECK IF MSB_ADDR IS GIVEN IN COMMAND
+if [ -z "$1" ]
+then
+ echo "There is no MSB_ADDR"
+ exit 1
+fi
+MSB_ADDR=$1
+CSAR_NAME=$2
+echo $MSB_ADDR
+echo $CSAR_NAME
+
+# Wait for MSB initialization
+echo Wait for MSB initialization
+for i in {1..20}; do
+ curl -sS -m 1 $MSB_ADDR > /dev/null && break
+ sleep $i
+done
+#MSB initialized
+###########################################
+###########################################
+###########################################
+###########################################
+###########################################
+###########################################
+############UOLOAD PACKAGE to MARKET PLACE######################
+echo
+echo "############## UOLOAD PACKAGE to MARKET PLACE STARTED ##############";
+UploadPackageResponse=$(curl -sS -X POST -H "Content-Type: multipart/form-data;" -F "file=@$CSAR_NAME" http://$MSB_ADDR/openoapi/vnfsdk-marketplace/v1/PackageResource/csars)
+if echo "$UploadPackageResponse" | grep -q "\"csarId\""; then
+ echo "UOLOAD PACKAGE TO MARKET PLACE SUCSSS !!!";
+else
+ echo "UploadPackageResponse :$UploadPackageResponse"
+ echo "UOLOAD PACKAGE TO MARKET PLACE FAILED !!!";
+ exit 1;
+fi
+UploadCsarId=$(echo ${UploadPackageResponse:11:36})
+echo "PACKAGE ID:$UploadCsarId"
+echo "############## UOLOAD PACKAGE to MARKET PLACE END ##################";
+#######UOLOAD PACKAGE to MARKET PLACE END#############
+###########################################
+###########################################
+###########################################
+###########################################
+###########################################
+###########################################
+###########################################
+################GET ON BOARD STATUS########
+echo
+echo "####################### GETTING ON-BOARDING STATUS ##################";
+#sleeping for 10 sec so thate ON Boarding operation should be happened at backend
+for pc in $(seq 1 10); do
+ status=$((${pc}*10));
+ echo -ne "ON_BOARDING Status (%): $status\033[0K\r"
+ sleep 1
+done
+echo
+
+#Three Retries for getting On Boarding Result
+#count=0
+#while [ $count -lt 3 ]
+#do
+# OnBoardStatusResponse=$(curl -sS -X GET "http://$MSB_ADDR/openoapi/vnfsdk-marketplace/v1/PackageResource/csars/$UploadCsarId/onboardstatus?operTypeId=functiontest&operId=functestexec" -H "Accept: application/json" -H "Content-Type: application/json")
+# echo $OnBoardStatusResponse
+# if echo "$OnBoardStatusResponse" | grep -q "\"status\":0"; then
+# break;
+# else
+# if [ $count -eq 3 ]
+# then
+# echo "ON-BOARDING OPERATION FAILED !!!";
+# fi
+# count=`expr $count + 1`;
+# sleep 3;
+# fi
+#done
+echo "GET ON-BOARDING RESULT OPERATION SUCESS ";
+echo "##################### GETTING ON-BOARDING STATUS END #################";
+####################GET ON BOARD STATUS END############
+##########################################
+##########################################
+##########################################
+##########################################
+##########################################
+#################DOWNLOAD PACKAGE#########
+echo
+echo "############## DOWNLOADED PACKAGE FROM MARKET STARTED #################";
+PACKAGE_NAME=market_temp.csar
+curl -sS -X GET "http://$MSB_ADDR/openoapi/vnfsdk-marketplace/v1/PackageResource/csars/$UploadCsarId/files" > $PACKAGE_NAME
+fileSize=$(du -b $PACKAGE_NAME | cut -f 1)
+if [ $fileSize -eq 0 ]
+then
+ echo "DOWNLOADED PACKAGE FROM MARKET NOT PROPER, ON-BOARDING OPERATION FAILED !!!";
+ exit 1;
+fi
+echo "DOWNLOADED PACKAGE FROM MARKET OPERATION SUCESS !!!";
+echo "MARKET PACKAGE NAME:$PACKAGE_NAME"
+echo "##################### DOWNLOADED PACKAGE FROM MARKET ##################";
+###################DOWNLOAD PACKAGE END#####################
+##########################################
+##########################################
+##########################################
+##########################################
+##########CATALOUGE START#################
+echo
+PACKAGE_NAME=$CSAR_NAME
+#Check if common-tosca-catalog is registered with MSB or not
+#curl -sS -X GET http://$MSB_ADDR/api/microservices/v1/services/catalog/version/v1 -H "Accept: application/json" -H "Content-Type: application/json"
+#check if common-tosca-aria is registered with MSB or not
+#curl -sS -X GET http://$MSB_ADDR/api/microservices/v1/services/tosca/version/v1 -H "Accept: application/json" -H "Content-Type: application/json"
+#echo Sending POST request to Catalog
+CsarIdString=$(curl -sS -X POST -H "Content-Type: multipart/form-data; boundary=-WebKitFormBoundary7MA4YWxkTrZu0gW" -H "Cache-Control: no-cache" -H "Postman-Token: abcb6497-b225-c592-01be-e9ff460ca188" -F "file=@$PACKAGE_NAME" http://$MSB_ADDR/openoapi/catalog/v1/csars)
+#getting csarId from the output of curl request
+CsarId=$(echo ${CsarIdString:11:36})
+echo $CsarId
+echo $CsarIdString
+#csarid is sucessfully stored in CsarId variable
+echo "====finished======"
+##########CATALOUGE END############
+echo "DELETING PACAKE LOCAL COPY:$PACKAGE_NAME";
+#rm $PACKAGE_NAME;
diff --git a/plans/vnfsdk-pkgtools/sanity-check/setup.sh b/plans/vnfsdk-pkgtools/sanity-check/setup.sh
new file mode 100755
index 00000000..3921bb0a
--- /dev/null
+++ b/plans/vnfsdk-pkgtools/sanity-check/setup.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Intel Corp., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+# Place the scripts in run order:
+
+# Clone vnfsdk/pkgtools repo and install it
+mkdir -p $WORKSPACE/archives/pkgtools
+cd $WORKSPACE/archives
+git clone -b master --single-branch http://gerrit.onap.org/r/vnfsdk/pkgtools.git pkgtools
+cd $WORKSPACE/archives/pkgtools
+git pull
+echo "To install vnfsdk pkgtools git head revision: $(git rev-parse HEAD)"
+python setup.py egg_info
+pip install .
+
+pip freeze | tee $WORKSPACE/archives/_pip-freeze-after-setup.txt
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v SCRIPTS:${SCRIPTS}"
+
diff --git a/plans/vnfsdk-pkgtools/sanity-check/teardown.sh b/plans/vnfsdk-pkgtools/sanity-check/teardown.sh
new file mode 100755
index 00000000..ce0ab6d9
--- /dev/null
+++ b/plans/vnfsdk-pkgtools/sanity-check/teardown.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
diff --git a/plans/vnfsdk-pkgtools/sanity-check/testplan.txt b/plans/vnfsdk-pkgtools/sanity-check/testplan.txt
new file mode 100644
index 00000000..05ff05a2
--- /dev/null
+++ b/plans/vnfsdk-pkgtools/sanity-check/testplan.txt
@@ -0,0 +1,4 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+vnfsdk-pkgtools/tosca-metadata/create_open.robot
+vnfsdk-pkgtools/tosca-metadata/create_validate_digest_signing.robot
diff --git a/plans/vnfsdk-refrepo/sanity-check/enterprise2DC.csar b/plans/vnfsdk-refrepo/sanity-check/enterprise2DC.csar
new file mode 100644
index 00000000..0960b20a
--- /dev/null
+++ b/plans/vnfsdk-refrepo/sanity-check/enterprise2DC.csar
Binary files differ
diff --git a/plans/vnfsdk-refrepo/sanity-check/setup.sh b/plans/vnfsdk-refrepo/sanity-check/setup.sh
new file mode 100644
index 00000000..ecee227f
--- /dev/null
+++ b/plans/vnfsdk-refrepo/sanity-check/setup.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# These scripts are sourced by run-csit.sh.
+
+
+#Start postgres database
+docker run -d -i -t --name=postgres -p 5432:5432 nexus3.onap.org:10001/onap/vnfsdk/refrepo/postgres:latest
+
+POSTGRES=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' postgres`
+
+#Start market place
+docker run -d -i -t --name=refrepo -e POSTGRES_SERVICE_HOST=$POSTGRES -p 8702:8702 nexus3.onap.org:10001/onap/vnfsdk/refrepo:1.1-STAGING-latest
+
+# Wait for Market place initialization
+echo Wait for VNF Repository initialization
+for i in {1..30}; do
+ sleep 1
+done
+
+REPO_IP=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' refrepo`
+
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v SCRIPTS:${SCRIPTS} -v REPO_IP:${REPO_IP}"
+echo ${ROBOT_VARIABLES}
+
diff --git a/plans/vnfsdk-refrepo/sanity-check/teardown.sh b/plans/vnfsdk-refrepo/sanity-check/teardown.sh
new file mode 100644
index 00000000..19440bc7
--- /dev/null
+++ b/plans/vnfsdk-refrepo/sanity-check/teardown.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This script is sourced by run-csit.sh after Robot test completion.
+
+
+kill-instance.sh refrepo
+kill-instance.sh postgres
+
+
diff --git a/plans/vnfsdk-refrepo/sanity-check/testplan.txt b/plans/vnfsdk-refrepo/sanity-check/testplan.txt
new file mode 100644
index 00000000..730df014
--- /dev/null
+++ b/plans/vnfsdk-refrepo/sanity-check/testplan.txt
@@ -0,0 +1,3 @@
+## Test suites are relative paths under [integration.git]/test/csit/tests/.
+## Place the suites in run order.
+vnfsdk-marketplace/provision/sanity_test_vnfsdktestfunction.robot
diff --git a/plans/vnfsdk-refrepo/sanity-check/uploadCSAR.sh b/plans/vnfsdk-refrepo/sanity-check/uploadCSAR.sh
new file mode 100644
index 00000000..279912c3
--- /dev/null
+++ b/plans/vnfsdk-refrepo/sanity-check/uploadCSAR.sh
@@ -0,0 +1,138 @@
+#!/usr/bin/env bash
+###############################################################################
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+###############################################################################
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+echo $SCRIPT_DIR
+
+#CHECK IF MSB_ADDR IS GIVEN IN COMMAND
+if [ -z "$1" ]
+then
+ echo "There is no MSB_ADDR"
+ exit 1
+fi
+MSB_ADDR=$1
+CSAR_NAME=$2
+echo $MSB_ADDR
+echo $CSAR_NAME
+
+# Wait for MSB initialization
+echo Wait for MSB initialization
+for i in {1..20}; do
+ curl -sS -m 1 $MSB_ADDR > /dev/null && break
+ sleep $i
+done
+#MSB initialized
+###########################################
+###########################################
+###########################################
+###########################################
+###########################################
+###########################################
+############UOLOAD PACKAGE to MARKET PLACE######################
+echo
+echo "############## UOLOAD PACKAGE to MARKET PLACE STARTED ##############";
+UploadPackageResponse=$(curl -sS -X POST -H "Content-Type: multipart/form-data;" -F "file=@$CSAR_NAME" http://$MSB_ADDR/openoapi/vnfsdk-marketplace/v1/PackageResource/csars)
+if echo "$UploadPackageResponse" | grep -q "\"csarId\""; then
+ echo "UOLOAD PACKAGE TO MARKET PLACE SUCSSS !!!";
+else
+ echo "UploadPackageResponse :$UploadPackageResponse"
+ echo "UOLOAD PACKAGE TO MARKET PLACE FAILED !!!";
+ exit 1;
+fi
+UploadCsarId=$(echo ${UploadPackageResponse:11:36})
+echo "PACKAGE ID:$UploadCsarId"
+echo "############## UOLOAD PACKAGE to MARKET PLACE END ##################";
+#######UOLOAD PACKAGE to MARKET PLACE END#############
+###########################################
+###########################################
+###########################################
+###########################################
+###########################################
+###########################################
+###########################################
+################GET ON BOARD STATUS########
+echo
+echo "####################### GETTING ON-BOARDING STATUS ##################";
+#sleeping for 10 sec so thate ON Boarding operation should be happened at backend
+for pc in $(seq 1 10); do
+ status=$((${pc}*10));
+ echo -ne "ON_BOARDING Status (%): $status\033[0K\r"
+ sleep 1
+done
+echo
+
+#Three Retries for getting On Boarding Result
+#count=0
+#while [ $count -lt 3 ]
+#do
+# OnBoardStatusResponse=$(curl -sS -X GET "http://$MSB_ADDR/openoapi/vnfsdk-marketplace/v1/PackageResource/csars/$UploadCsarId/onboardstatus?operTypeId=functiontest&operId=functestexec" -H "Accept: application/json" -H "Content-Type: application/json")
+# echo $OnBoardStatusResponse
+# if echo "$OnBoardStatusResponse" | grep -q "\"status\":0"; then
+# break;
+# else
+# if [ $count -eq 3 ]
+# then
+# echo "ON-BOARDING OPERATION FAILED !!!";
+# fi
+# count=`expr $count + 1`;
+# sleep 3;
+# fi
+#done
+echo "GET ON-BOARDING RESULT OPERATION SUCESS ";
+echo "##################### GETTING ON-BOARDING STATUS END #################";
+####################GET ON BOARD STATUS END############
+##########################################
+##########################################
+##########################################
+##########################################
+##########################################
+#################DOWNLOAD PACKAGE#########
+echo
+echo "############## DOWNLOADED PACKAGE FROM MARKET STARTED #################";
+PACKAGE_NAME=market_temp.csar
+curl -sS -X GET "http://$MSB_ADDR/openoapi/vnfsdk-marketplace/v1/PackageResource/csars/$UploadCsarId/files" > $PACKAGE_NAME
+fileSize=$(du -b $PACKAGE_NAME | cut -f 1)
+if [ $fileSize -eq 0 ]
+then
+ echo "DOWNLOADED PACKAGE FROM MARKET NOT PROPER, ON-BOARDING OPERATION FAILED !!!";
+ exit 1;
+fi
+echo "DOWNLOADED PACKAGE FROM MARKET OPERATION SUCESS !!!";
+echo "MARKET PACKAGE NAME:$PACKAGE_NAME"
+echo "##################### DOWNLOADED PACKAGE FROM MARKET ##################";
+###################DOWNLOAD PACKAGE END#####################
+##########################################
+##########################################
+##########################################
+##########################################
+##########CATALOUGE START#################
+echo
+PACKAGE_NAME=$CSAR_NAME
+#Check if common-tosca-catalog is registered with MSB or not
+#curl -sS -X GET http://$MSB_ADDR/api/microservices/v1/services/catalog/version/v1 -H "Accept: application/json" -H "Content-Type: application/json"
+#check if common-tosca-aria is registered with MSB or not
+#curl -sS -X GET http://$MSB_ADDR/api/microservices/v1/services/tosca/version/v1 -H "Accept: application/json" -H "Content-Type: application/json"
+#echo Sending POST request to Catalog
+CsarIdString=$(curl -sS -X POST -H "Content-Type: multipart/form-data; boundary=-WebKitFormBoundary7MA4YWxkTrZu0gW" -H "Cache-Control: no-cache" -H "Postman-Token: abcb6497-b225-c592-01be-e9ff460ca188" -F "file=@$PACKAGE_NAME" http://$MSB_ADDR/openoapi/catalog/v1/csars)
+#getting csarId from the output of curl request
+CsarId=$(echo ${CsarIdString:11:36})
+echo $CsarId
+echo $CsarIdString
+#csarid is sucessfully stored in CsarId variable
+echo "====finished======"
+##########CATALOUGE END############
+echo "DELETING PACAKE LOCAL COPY:$PACKAGE_NAME";
+#rm $PACKAGE_NAME;
diff --git a/plans/vvp/sanity/setup.sh b/plans/vvp/sanity/setup.sh
new file mode 100644
index 00000000..cab074c0
--- /dev/null
+++ b/plans/vvp/sanity/setup.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+# Place the scripts in run order:
+
+
+source ${WORKSPACE}/test/csit/scripts/vvp/clone_and_setup_vvp_data.sh
+
+source ${WORKSPACE}/test/csit/scripts/vvp/start_vvp_containers.sh
+
+source ${WORKSPACE}/test/csit/scripts/vvp/docker_health.sh
+
+source ${WORKSPACE}/test/csit/scripts/vvp/start_vvp_sanity.sh
+
+
+VVP_IP=`${WORKSPACE}/test/csit/scripts/get-instance-ip.sh vvp-engagementmgr`
+echo VVP_IP=${VVP_IP}
+
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v VVP_IP:${VVP_IP}"
diff --git a/plans/vvp/sanity/teardown.sh b/plans/vvp/sanity/teardown.sh
new file mode 100644
index 00000000..b0f33a64
--- /dev/null
+++ b/plans/vvp/sanity/teardown.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+source ${WORKSPACE}/test/csit/scripts/vvp/kill_containers_and_remove_dataFolders.sh
diff --git a/plans/vvp/sanity/testplan.txt b/plans/vvp/sanity/testplan.txt
new file mode 100644
index 00000000..0acb5083
--- /dev/null
+++ b/plans/vvp/sanity/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+vvp/sanity
diff --git a/run-all-tests.sh b/run-all-tests.sh
new file mode 100755
index 00000000..c41f0698
--- /dev/null
+++ b/run-all-tests.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+set -e
+
+ROOT=`git rev-parse --show-toplevel`
+CSIT=$ROOT/test/csit
+cd $CSIT
+
+# break the name up using the first dash, since run-csit.sh just join them anyway
+for file in plans/*/*/testplan.txt; do
+ testplan=`dirname $file`
+
+ echo
+ echo "#############################################################################"
+ echo "Running test plan $testplan"
+ echo "#############################################################################"
+ $CSIT/run-csit.sh $testplan
+ echo
+done
diff --git a/run-csit.sh b/run-csit.sh
new file mode 100755
index 00000000..40cd9ee6
--- /dev/null
+++ b/run-csit.sh
@@ -0,0 +1,177 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# $1 project/functionality
+# $2 robot options
+# $3 ci-management repo location
+
+
+function docker_stats(){
+ #General memory details
+ echo "> top -bn1 | head -3"
+ top -bn1 | head -3
+ echo
+
+ echo "> free -h"
+ free -h
+ echo
+
+ #Memory details per Docker
+ echo "> docker ps"
+ docker ps
+ echo
+
+ echo "> docker stats --no-stream"
+ docker stats --no-stream
+ echo
+}
+
+if [ $# -eq 0 ]
+then
+ echo
+ echo "Usage: $0 plans/<project>/<functionality> [<robot-options>] [<ci-management-dir>]"
+ echo
+ echo " <project>, <functionality>, <robot-options>: "
+ echo " The same values as for the '{project}-csit-{functionality}' JJB job template."
+ echo
+ echo " <ci-management-dir>: "
+ echo " Path to the ci-management repo checked out locally. It not specified, "
+ echo " assumed to be adjacent to the integration repo directory."
+ echo
+ exit 1
+fi
+
+if [ -z "$WORKSPACE" ]; then
+ export WORKSPACE=`git rev-parse --show-toplevel`
+fi
+rm -rf $WORKSPACE/archives
+mkdir -p $WORKSPACE/archives
+
+if [ -f ${WORKSPACE}/test/csit/${1}/testplan.txt ]; then
+ export TESTPLAN="${1}"
+else
+ echo "testplan not found: ${WORKSPACE}/test/csit/${TESTPLAN}/testplan.txt"
+ exit 2
+fi
+
+
+export TESTOPTIONS="${2}"
+
+if [ -z "$3" ]; then
+ CI=${WORKSPACE}/../ci-management
+else
+ CI=${3}
+fi
+
+
+
+
+TESTPLANDIR=${WORKSPACE}/test/csit/${TESTPLAN}
+
+# Assume that if ROBOT_VENV is set, we don't need to reinstall robot
+if [ -f ${WORKSPACE}/env.properties ]; then
+ source ${WORKSPACE}/env.properties
+ source ${ROBOT_VENV}/bin/activate
+fi
+if ! type pybot > /dev/null; then
+ rm -f ${WORKSPACE}/env.properties
+ source $CI/jjb/integration/include-raw-integration-install-robotframework.sh
+ source ${WORKSPACE}/env.properties
+ source ${ROBOT_VENV}/bin/activate
+fi
+
+# install required Robot libraries
+pip install robotframework-selenium2library==1.8.0 robotframework-extendedselenium2library==0.9.1
+
+# install eteutils
+mkdir -p ${ROBOT_VENV}/src/onap
+rm -rf ${ROBOT_VENV}/src/onap/testsuite
+git clone https://gerrit.onap.org/r/testsuite/python-testing-utils.git ${ROBOT_VENV}/src/onap/testsuite/python-testing-utils
+pip install --upgrade ${ROBOT_VENV}/src/onap/testsuite/python-testing-utils
+
+pip freeze
+
+# install chrome driver
+google-chrome --version
+if [ ! -x ${ROBOT_VENV}/bin/chromedriver ]; then
+ pushd ${ROBOT_VENV}/bin
+ wget -N http://chromedriver.storage.googleapis.com/2.35/chromedriver_linux64.zip
+ unzip chromedriver_linux64.zip
+ chmod +x chromedriver
+ popd
+fi
+
+
+WORKDIR=`mktemp -d --suffix=-robot-workdir`
+cd ${WORKDIR}
+
+
+set +u
+set -x
+
+
+# Add csit scripts to PATH
+export PATH=${PATH}:${WORKSPACE}/test/csit/docker/scripts:${WORKSPACE}/test/csit/scripts:${ROBOT_VENV}/bin
+export SCRIPTS=${WORKSPACE}/test/csit/scripts
+export ROBOT_VARIABLES=
+
+# Sign in to nexus3 docker repo
+docker login -u anonymous -p anonymous nexus3.onap.org:10001
+
+# Run setup script plan if it exists
+cd ${TESTPLANDIR}
+SETUP=${TESTPLANDIR}/setup.sh
+if [ -f ${SETUP} ]; then
+ echo "Running setup script ${SETUP}"
+ source ${SETUP}
+fi
+
+# show memory consumption after all docker instances initialized
+docker_stats | tee $WORKSPACE/archives/_sysinfo-1-after-setup.txt
+
+# Run test plan
+cd $WORKDIR
+echo "Reading the testplan:"
+cat ${TESTPLANDIR}/testplan.txt | egrep -v '(^[[:space:]]*#|^[[:space:]]*$)' | sed "s|^|${WORKSPACE}/test/csit/tests/|" > testplan.txt
+cat testplan.txt
+SUITES=$( xargs -a testplan.txt )
+
+echo ROBOT_VARIABLES=${ROBOT_VARIABLES}
+echo "Starting Robot test suites ${SUITES} ..."
+set +e
+python -m robot.run -N ${TESTPLAN} -v WORKSPACE:/tmp ${ROBOT_VARIABLES} ${TESTOPTIONS} ${SUITES}
+RESULT=$?
+set -e
+echo "RESULT: " $RESULT
+rsync -av $WORKDIR/ $WORKSPACE/archives
+
+# Record list of active docker containers
+docker ps --format "{{.Image}}" > $WORKSPACE/archives/_docker-images.log
+
+# show memory consumption after all docker instances initialized
+docker_stats | tee $WORKSPACE/archives/_sysinfo-2-after-robot.txt
+
+# Run teardown script plan if it exists
+cd ${TESTPLANDIR}
+TEARDOWN=${TESTPLANDIR}/teardown.sh
+if [ -f ${TEARDOWN} ]; then
+ echo "Running teardown script ${TEARDOWN}"
+ source ${TEARDOWN}
+fi
+
+# TODO: do something with the output
+
+exit $RESULT
diff --git a/scripts/aai/esr-server/startup.sh b/scripts/aai/esr-server/startup.sh
new file mode 100644
index 00000000..a4d335b7
--- /dev/null
+++ b/scripts/aai/esr-server/startup.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# $1 nickname for esr server
+
+docker login -u docker -p docker nexus3.onap.org:10001
+
+run-instance.sh nexus3.onap.org:10001/onap/aai/esr-server:latest $1 "-e MSB_IP=$2 -e MSB_Port=$3 -p 9518:9518" \ No newline at end of file
diff --git a/scripts/appc/script1.sh b/scripts/appc/script1.sh
new file mode 100755
index 00000000..1c3d92ee
--- /dev/null
+++ b/scripts/appc/script1.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+echo "This is ${WORKSPACE}/test/csit/scripts/appc/script1.sh"
diff --git a/scripts/ccsdk/script1.sh b/scripts/ccsdk/script1.sh
new file mode 100644
index 00000000..bb583f85
--- /dev/null
+++ b/scripts/ccsdk/script1.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+echo "This is ${WORKSPACE}/test/csit/scripts/ccsdk/script1.sh"
diff --git a/scripts/clamp/clone_clamp_and_change_dockercompose.sh b/scripts/clamp/clone_clamp_and_change_dockercompose.sh
new file mode 100755
index 00000000..e564e637
--- /dev/null
+++ b/scripts/clamp/clone_clamp_and_change_dockercompose.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# ONAP CLAMP
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+echo "This is ${WORKSPACE}/test/csit/scripts/clamp/clone_clamp_and_change_dockercompose.sh"
+
+firefox --version
+which firefox
+
+
+# Clone Clamp repo to get extra folder that has all needed to run docker with docker-compose to start DB and Clamp
+mkdir -p $WORKSPACE/archives/clamp-clone
+cd $WORKSPACE/archives/clamp-clone
+git clone --depth 1 http://gerrit.onap.org/r/clamp -b master
+cd clamp/extra/docker/clamp/
+
+# Pull the Clamp docker image from nexus instead of local image by default in the docker-compose.yml
+sed -i '/image: onap\/clamp/c\ image: nexus3.onap.org:10001\/onap\/clamp' docker-compose.yml
+
+# Change config to take third_party_proxy:8085 for SDC, Policy and DCAE simulator
+sed -i 's/}/,\"clamp.config.policy.pdpUrl1\":\"http:\/\/third_party_proxy:8085\/pdp\/ , testpdp, alpha123\",\"clamp.config.policy.pdpUrl2\":\"http:\/\/third_party_proxy:8085\/pdp\/ , testpdp, alpha123\",\"clamp.config.policy.papUrl\":\"http:\/\/third_party_proxy:8085\/pap\/ , testpap, alpha123\",\"clamp.config.policy.clientId\":\"python\",\"clamp.config.policy.clientKey\":\"dGVzdA==\",\"clamp.config.sdc.catalog.url\":\"http:\/\/third_party_proxy:8085\/sdc\/v1\/catalog\/\",\"clamp.config.sdc.hostUrl\":\"http:\/\/third_party_proxy:8085\",\"clamp.config.sdc.serviceUrl\":\"http:\/\/third_party_proxy:8085\/sdc\/v1\/catalog\/services\",\"clamp.config.dcae.inventory.url\":\"http:\/\/third_party_proxy:8085\",\"clamp.config.dcae.dispatcher.url\":\"http:\/\/third_party_proxy:8085\",\"spring.profiles.active\":\"clamp-default,clamp-default-user,clamp-sdc-controller\",\"server.ssl.client-auth\":\"want\"}/g' clamp.env
+
+# Add the sql to create template so it is played by docker-compose later
+cp ../../../src/test/resources/sql/four_templates_only.sql ../../sql/bulkload/
+echo 'mysql -uroot -p$MYSQL_ROOT_PASSWORD -f < four_templates_only.sql' >> ../../sql/load-sql-files-tests-automation.sh
diff --git a/scripts/clamp/kill_and_remove_clamp_and_db_containers.sh b/scripts/clamp/kill_and_remove_clamp_and_db_containers.sh
new file mode 100755
index 00000000..c94a40bc
--- /dev/null
+++ b/scripts/clamp/kill_and_remove_clamp_and_db_containers.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+echo "This is ${WORKSPACE}/test/csit/scripts/clamp/kill_and_remove_clamp_and_db_containers.sh"
+
+kill-instance.sh clamp_clamp_1
+kill-instance.sh clamp_db_1
+kill-instance.sh clamp_third_party_proxy_1
+
+# $WORKSPACE/archives/clamp-clone deleted with archives folder when tests starts so we keep it at the end for debugging
diff --git a/scripts/clamp/python-lib/CustomSeleniumLibrary.py b/scripts/clamp/python-lib/CustomSeleniumLibrary.py
new file mode 100755
index 00000000..ad11b115
--- /dev/null
+++ b/scripts/clamp/python-lib/CustomSeleniumLibrary.py
@@ -0,0 +1,20 @@
+from Selenium2Library import Selenium2Library
+from selenium.webdriver.common.keys import Keys
+import time
+
+class CustomSeleniumLibrary(Selenium2Library):
+ def insert_into_prompt(self, text):
+ alert = None
+ try:
+ time.sleep(5)
+ listOfFields = text.split(" ")
+ allInOneString=""
+ for temp in listOfFields:
+ allInOneString=allInOneString+temp+Keys.TAB
+
+ alert= self._current_browser().switch_to_alert()
+ alert.send_keys(allInOneString)
+ except WebDriverException:
+ raise RuntimeError('There were no alert')
+
+
diff --git a/scripts/clamp/start_clamp_containers.sh b/scripts/clamp/start_clamp_containers.sh
new file mode 100755
index 00000000..23b1705e
--- /dev/null
+++ b/scripts/clamp/start_clamp_containers.sh
@@ -0,0 +1,70 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# ONAP CLAMP
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+echo "This is ${WORKSPACE}/test/csit/scripts/clamp/start_clamp_containers.sh"
+
+# start Clamp and MariaDB containers with docker compose and configuration from clamp/extra/docker/clamp/docker-compose.yml
+docker-compose up -d
+
+# WAIT 5 minutes maximum and test every 5 seconds if Clamp up using HealthCheck API
+TIME_OUT=600
+INTERVAL=5
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+ response=$(curl --write-out '%{http_code}' --silent --output /dev/null -vk --key config/org.onap.clamp.keyfile https://localhost:8443/restservices/clds/v1/healthcheck); echo $response
+
+ if [ "$response" == "200" ]; then
+ echo Clamp and its database well started in $TIME seconds
+ break;
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if Clamp is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]; then
+ echo TIME OUT: Docker containers not started in $TIME_OUT seconds... Could cause problems for tests...
+ exit 1;
+fi
+
+# To avoid some problem because templates not yet read
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+ response=$(curl --write-out '%{http_code}' --silent --output /dev/null -u admin:password -vk --key config/org.onap.clamp.keyfile https://localhost:8443/restservices/clds/v1/cldsTempate/template-names); echo $response
+
+ if [ "$response" == "200" ]; then
+ echo Templates well available
+ break;
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if templates available. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]; then
+ echo TIME OUT: Templates not available in $TIME_OUT seconds... Could cause problems for tests...
+ exit 1;
+fi
diff --git a/scripts/cli/startup.sh b/scripts/cli/startup.sh
new file mode 100644
index 00000000..6e29a0e8
--- /dev/null
+++ b/scripts/cli/startup.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+#
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# $1 nickname for the MSB instance
+echo "This is ${WORKSPACE}/test/csit/scripts/cli/startup.sh"
diff --git a/scripts/common_functions.sh b/scripts/common_functions.sh
new file mode 100755
index 00000000..684c4184
--- /dev/null
+++ b/scripts/common_functions.sh
@@ -0,0 +1,263 @@
+#!/bin/bash
+
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+function memory_details(){
+ #General memory details
+ echo "> top -bn1 | head -3"
+ top -bn1 | head -3
+ echo
+
+ echo "> free -h"
+ free -h
+ echo
+
+ #Memory details per Docker
+ echo "> docker ps"
+ docker ps
+ echo
+
+ echo "> docker stats --no-stream"
+ docker stats --no-stream
+ echo
+}
+function fibonacci_number(){
+ set +x
+ if [ $1 -le 1 ]
+ then
+ echo "1"
+ elif [ $1 -le 10 ]
+ then
+ Num=$1
+ f1=0
+ f2=1
+ fn=-1
+ for i in `eval echo {1..$Num}`;do
+ fn=$((f1+f2))
+ f1=$f2
+ f2=$fn
+ done
+ echo $fn
+ else
+ echo "30"
+ fi
+}
+function wait_curl_driver(){
+ #Parameters:
+ #CURL_COMMAND - the URL on which the curl command will be executed
+ #GREP_STRING - Desired string to be found inside the body response of the
+ # previous curl command
+ #EXCLUDE_STRING - If the filtered string (GREP_STRING) must not exist in
+ # the body response of the curl
+ #WAIT_MESSAGE - the message to be displayed for logging purpose. (optional)
+ #REPEAT_NUMBER - the maximum number of tries before abandoning the curl
+ # command (optional, by default = 15)
+ #MAX_TIME - Maximum time allowed for the transfer (in seconds)
+ #STATUS_CODE - A HTTP status code desired to be found by getting the link
+ # /!\ IMPORTANT NOTICE: the usage of STATUS_CODE option turn GREP_STRING/
+ # /!\ EXCLUDE_STRING/and the MAX_TIME options becomes obsolete with no
+ # /!\ execution impact
+ #MEMORY_USAGE - If Parameters exists shows the memory usage after curl
+ # execution(s)
+
+ repeat_max=15
+ parameters="$@"
+
+ #WAIT_MESSAGE
+ if [[ $parameters == *"WAIT_MESSAGE"* ]]
+ then
+ wait_message=`echo $parameters | sed -e "s/.*WAIT_MESSAGE=//g"`
+ wait_message=`echo $wait_message | sed -e "s/ .*//g"`
+ else
+ wait_message="wait ..."
+ fi
+
+ #REPEAT_NUMBER
+ if [[ $parameters == *"REPEAT_NUMBER"* ]]
+ then
+ repeat_max=`echo $parameters | sed -e "s/.*REPEAT_NUMBER=//g"`
+ repeat_max=`echo $repeat_max | sed -e "s/ .*//g"`
+ fi
+
+ #CURL_COMMAND
+ if [[ $parameters == *"CURL_COMMAND"* ]]
+ then
+ curl_command=`echo $parameters | sed -e 's/.*CURL_COMMAND=//g'`
+ curl_command=`echo $curl_command | sed -e 's/ .*//g'`
+ else
+ echo "-Curl is empty-" # Or no parameterseter passed.
+ return 0
+ fi
+
+ #MAX_TIME
+ if [[ $parameters == *"MAX_TIME"* ]]
+ then
+ max_time=`echo $parameters | sed -e 's/.*MAX_TIME=//g'`
+ max_time=`echo $max_time | sed -e 's/ .*//g'`
+ else
+ max_time="5"
+ fi
+
+ exclude_string=""
+ #EXCLUDE_STRING
+ if [[ $parameters == *"EXCLUDE_STRING"* ]]
+ then
+ exclude_string="-v"
+ fi
+
+ status_code=""
+ #STATUS_CODE
+ if [[ $parameters == *"STATUS_CODE"* ]]
+ then
+ status_code=`echo $parameters | sed -e 's/.*STATUS_CODE=//g'`
+ status_code=`echo $status_code | sed -e 's/ .*//g'`
+ fi
+
+ for i in `eval echo {1..$repeat_max}`; do
+ response_code=`curl -o /dev/null --silent --head --write-out '%{http_code}' $curl_command`
+ echo "..."
+ if [[ ! -z $status_code ]] ; then
+ if [ "$status_code" -eq "$response_code" ]
+ then
+ echo "SUCCESS:Actual Status code <$response_code> match the expected code <$status_code>"
+ return 0
+ else
+ echo "WARNING:Expected <$status_code> but Actual <$response_code>"
+ fi
+ else
+ #GREP_STRING
+ if [[ $parameters == *"GREP_STRING"* ]]
+ then
+ grep_command=`echo $parameters | sed -e 's/.*GREP_STRING=//g'`
+ grep_command=`echo $grep_command | sed -e 's/ REPEAT_NUMBER=.*//g' | sed -e 's/ CURL_COMMAND=.*//g' | sed -e 's/ WAIT_MESSAGE=.*//g' | sed -e 's/ MAX_TIME=.*//g' | sed -e 's/ EXCLUDE_STRING.*//g'`
+ else
+ echo "-Grep_command is empty-" # Or no parameters passed.
+ return 0
+ fi
+
+ str=`curl -sS -m$max_time $curl_command | grep "$grep_command"`
+ echo "BODY::$str"
+ if [[ ! -z $exclude_string ]]
+ then
+ if [[ -z $str ]]
+ then
+ echo "SUCCESS: body response does not contains '$grep_command'";
+ break;
+ else
+ echo "Fall_Short: Body response still contains '$grep_command'"
+ fi
+ else
+ if [[ ! -z $str ]]
+ then
+ echo "SUCCESS: body response contains '$grep_command'";
+ break;
+ else
+ echo "Fall_Short: Element '$grep_command' not found yet # "$i""
+ fi
+ fi
+
+ if [ "$?" = "7" ]; then
+ echo 'Connection refused or can not connect to server/proxy';
+ str=''
+ fi
+ fi
+ seconds2sleep=`fibonacci_number $i`
+ echo $wait_message
+ echo "Iteration::$i out of $repeat_max "
+ echo "Quiet time for $seconds2sleep seconds ..."
+ sleep $seconds2sleep
+
+ # if waiting for a long time, log system load
+ if [ $i -gt 45 ]
+ then
+ memory_details
+ fi
+ done
+ #MEMORY_USAGE
+ if [[ $parameters == *"MEMORY_USAGE"* ]]
+ then
+ echo "==========================MEMORY USAGE=================================="
+ memory_details
+ echo "========================================================================"
+ fi
+ return 0
+}
+
+function run_simulator ()
+{
+ run_robottestlib
+ run_simulator_docker $1
+}
+
+function run_robottestlib ()
+{
+ #Start the robottest REST library if not started
+ if ! pgrep -f robottest > /dev/null
+ then
+ #Download the latest robottest jar
+ wget -q -O ${SCRIPTS}/integration/mockserver/org.openo.robottest.jar "https://nexus.open-o.org/service/local/artifact/maven/redirect?r=snapshots&g=org.openo.integration&a=org.openo.robottest&e=jar&v=LATEST"
+ chmod +x ${SCRIPTS}/integration/mockserver/org.openo.robottest.jar
+ eval `java -cp ${SCRIPTS}/integration/mockserver/org.openo.robottest.jar org.openo.robot.test.robottest.MyRemoteLibrary` &
+ fi
+}
+
+function run_simulator_docker ()
+{
+ #Start the simulator docker if not started
+ SIMULATOR_IP=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' simulator`
+ if [[ -z $SIMULATOR_IP ]]
+ then
+ echo "Starting simulator docker..."
+ SIMULATOR_JSON=$1
+ if [[ -z $SIMULATOR_JSON ]]
+ then
+ SIMULATOR_JSON=main.json
+ fi
+ docker run -d -i -t --name simulator -e SIMULATOR_JSON=$SIMULATOR_JSON -p 18009:18009 -p 18008:18008 openoint/simulate-test-docker
+ SIMULATOR_IP=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' simulator`
+ fi
+
+ #Set the simulator IP in robot variables
+ ROBOT_VARIABLES=${ROBOT_VARIABLES}" -v SIMULATOR_IP:${SIMULATOR_IP} -v SCRIPTS:${SCRIPTS}"
+ echo ${ROBOT_VARIABLES}
+}
+
+function get_docker_compose_service ()
+{
+ local service=$1
+ local compose_file=${2:-docker-compose.yml}
+
+ echo $(docker-compose --file ./${compose_file} ps | grep $service | cut -d " " -f1 )
+}
+
+function bypass_ip_adress ()
+{
+ local ip_address=$1
+
+ if [[ $no_proxy && $no_proxy != *$ip_address* ]]; then
+ export no_proxy=$no_proxy,$ip_address
+ fi
+}
+
+function wait_for_service_init ()
+{
+ local service_url=$1
+
+ for delay in {1..50}; do
+ curl -sS ${service_url} && break
+ echo "$delay - Waiting for $service_url..."
+ sleep $delay
+ done
+}
diff --git a/scripts/dmaap-buscontroller/.mock-aaf.sh.swp b/scripts/dmaap-buscontroller/.mock-aaf.sh.swp
new file mode 100644
index 00000000..edadfe90
--- /dev/null
+++ b/scripts/dmaap-buscontroller/.mock-aaf.sh.swp
Binary files differ
diff --git a/scripts/dmaap-buscontroller/dmaapbc-init.sh b/scripts/dmaap-buscontroller/dmaapbc-init.sh
new file mode 100755
index 00000000..804603f2
--- /dev/null
+++ b/scripts/dmaap-buscontroller/dmaapbc-init.sh
@@ -0,0 +1,76 @@
+#!/bin/bash
+
+# $1 is the IP address of the buscontroller
+# $2 is the IP address of the DRPS
+# $3 is the IP address of the MRC
+# $4 is the protocol (defaults to http)
+
+PROTO=${4:-http}
+if [ "$PROTO" = "http" ]
+then
+ PORT=8080
+ CURLOPT="-v"
+ MRPORT=3904
+ DRPORT=8080
+else
+ PORT=8443
+ CURLOPT="-v -k"
+ MRPORT=3905
+ DRPORT=8443
+fi
+
+# INITIALIZE: dmaap object
+JSON=/tmp/$$.dmaap
+cat << EOF > $JSON
+{
+ "version": "1",
+ "topicNsRoot": "org.onap.dmaap",
+ "drProvUrl": "${PROTO}://dmaap-dr-prov:${DRPORT}",
+ "dmaapName": "onapCSIT",
+ "bridgeAdminTopic": "MM_AGENT_PROV"
+
+}
+EOF
+
+echo "Initializing /dmaap endpoint"
+curl ${CURLOPT} -X POST -d @${JSON} -H "Content-Type: application/json" ${PROTO}://$1:${PORT}/webapi/dmaap
+
+
+
+# INITIALIZE: dcaeLocation object
+JSON=/tmp/$$.loc
+cat << EOF > $JSON
+{
+ "dcaeLocationName": "csit-sanfrancisco",
+ "dcaeLayer": "central-cloud",
+ "clli": "CSIT12345",
+ "zone": "zoneA"
+
+}
+EOF
+
+echo "Initializing /dcaeLocations endpoint"
+curl ${CURLOPT} -X POST -d @${JSON} -H "Content-Type: application/json" ${PROTO}://$1:${PORT}/webapi/dcaeLocations
+
+
+# INITIALIZE: MR object in 1 site
+# since MR is currently deployed via docker-compose, its IP doesn't seem
+# to be routable from DBCL. Fortunately, the MR port is mapped from the docker bridge IP address.
+# Found this article for how to deterine the docker bridge IP so using it as a workaround.
+# https://stackoverflow.com/questions/22944631/how-to-get-the-ip-address-of-the-docker-host-from-inside-a-docker-container
+# Used the following snippet found buried in a comment to an answer and then modified for only 1 value.
+DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+' | head -1 )
+# Perhaps there is a better way...
+JSON=/tmp/$$.mrc
+cat << EOF > $JSON
+{
+ "dcaeLocationName": "csit-sanfrancisco",
+ "fqdn": "$DOCKER_HOST",
+ "topicProtocol" : "http",
+ "topicPort": "${MRPORT}"
+
+}
+EOF
+
+echo "Initializing /mr_clusters endpoint"
+curl ${CURLOPT} -X POST -d @${JSON} -H "Content-Type: application/json" ${PROTO}://$1:${PORT}/webapi/mr_clusters
diff --git a/scripts/dmaap-buscontroller/dmaapbc-launch.sh b/scripts/dmaap-buscontroller/dmaapbc-launch.sh
new file mode 100755
index 00000000..317c17f1
--- /dev/null
+++ b/scripts/dmaap-buscontroller/dmaapbc-launch.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+# script to launch DMaaP buscontroller docker container
+# sets global var IP with assigned IP address
+
+function dmaapbc_launch() {
+ TAG="nexus3.onap.org:10001/onap/dmaap/buscontroller"
+ CONTAINER_NAME=dmaapbc
+ IP=""
+
+ cd ${WORKSPACE}/test/csit/scripts/dmaap-buscontroller
+
+ TMP_CFG=/tmp/docker-databus-controller.conf
+ . ./onapCSIT.env > $TMP_CFG
+ ADDHOSTS=""
+ if [ ! -z "$2" ]
+ then
+ ADDHOSTS="$ADDHOSTS --add-host=message-router:$2"
+ fi
+ if [ ! -z "$3" ]
+ then
+ ADDHOSTS="$ADDHOSTS --add-host=dmaap-dr-prov:$3"
+ fi
+ docker run -d $ADDHOSTS --name $CONTAINER_NAME -v $TMP_CFG:/opt/app/config/conf $TAG
+ IP=`get-instance-ip.sh ${CONTAINER_NAME}`
+
+ # Wait for initialization
+ for i in {1..10}; do
+ curl -sS ${IP}:8080 && break
+ echo sleep $i
+ sleep $i
+ done
+
+}
diff --git a/scripts/dmaap-buscontroller/dr-launch.sh b/scripts/dmaap-buscontroller/dr-launch.sh
new file mode 100644
index 00000000..abc0aae8
--- /dev/null
+++ b/scripts/dmaap-buscontroller/dr-launch.sh
@@ -0,0 +1,59 @@
+
+#!/bin/bash
+
+#!/bin/bash
+
+# script to launch DMaaP DR docker containers
+# sets global var IP with assigned IP address of DR Prov
+
+function dmaap_dr_launch() {
+ IP=""
+
+
+ # This next section was copied from scripts/dmaap-datarouter/dr-suite/setup.sh
+ # and slightly modified...
+
+ # Clone DMaaP Data Router repo
+ mkdir -p $WORKSPACE/archives/dmaapdr
+ cd $WORKSPACE/archives/dmaapdr
+
+ git clone --depth 1 https://gerrit.onap.org/r/dmaap/datarouter -b master
+ cd datarouter
+ git pull
+ cd $WORKSPACE/archives/dmaapdr/datarouter/docker-compose/
+
+ sed -i 's/10003/10001/g' docker-compose.yml
+ # start DMaaP DR containers with docker compose and configuration from docker-compose.yml
+ docker login -u docker -p docker nexus3.onap.org:10001
+ docker-compose up -d
+
+ # Wait for initialization of Docker container for datarouter-node, datarouter-prov and mariadb
+ for i in {1..50}; do
+ if [ $(docker inspect --format '{{ .State.Running }}' datarouter-node) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' datarouter-prov) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' mariadb) ]
+ then
+ echo "DR Service Running"
+ break
+ else
+ echo sleep $i
+ sleep $i
+ fi
+ done
+
+ DR_PROV_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' datarouter-prov)
+ DR_NODE_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' datarouter-node)
+ DR_GATEWAY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}' datarouter-prov)
+
+ echo DR_PROV_IP=${DR_PROV_IP}
+ echo DR_NODE_IP=${DR_NODE_IP}
+ echo DR_GATEWAY_IP=${DR_GATEWAY_IP}
+
+ docker exec -i datarouter-prov sh -c "curl -k -X PUT https://$DR_PROV_IP:8443/internal/api/NODES?val=dmaap-dr-node\|$DR_GATEWAY_IP"
+ docker exec -i datarouter-prov sh -c "curl -k -X PUT https://$DR_PROV_IP:8443/internal/api/PROV_AUTH_ADDRESSES?val=dmaap-dr-prov\|$DR_GATEWAY_IP"
+
+ #Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ ROBOT_VARIABLES="-v DR_PROV_IP:${DR_PROV_IP} -v DR_NODE_IP:${DR_NODE_IP}"
+
+ IP=${DR_GATEWAY_IP}
+}
diff --git a/scripts/dmaap-buscontroller/init-mock-aaf.sh b/scripts/dmaap-buscontroller/init-mock-aaf.sh
new file mode 100755
index 00000000..f25404ce
--- /dev/null
+++ b/scripts/dmaap-buscontroller/init-mock-aaf.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+# $1 is the IP address of the AAF mock server
+
+#curl -v -X PUT -d @- http://$1:1080/expectation << EOF
+#{
+# "httpRequest": {
+# "method": "GET",
+# "path": "/hello"
+# },
+# "httpResponse": {
+# "body": "Hello world!",
+# "statusCode": 200
+# },
+# "times" : {
+# "unlimited" : true
+# }
+#}
+#EOF
+# "httpRequest": {
+# "method": "POST",
+# "path": "/proxy/authz/.*"
+# },
+
+curl -v -X PUT -d @- http://$1:1080/expectation << EOF
+{
+ "httpRequest": {
+ "method": ".*",
+ "path": "/.*"
+ },
+ "httpResponse": {
+ "body": "Hello world!",
+ "statusCode": 200
+ },
+ "times" : {
+ "unlimited" : true
+ }
+}
+EOF
+
+#curl -v -X PUT -d @- http://$1:1080/expectation << EOF
+#{
+# "httpRequest": {
+# "method": "POST",
+# "path": "/proxy/authz/role/perm"
+# },
+# "httpResponse": {
+# "body": "Hello world!",
+# "statusCode": 200
+# }
+#}
+#EOF
+
diff --git a/scripts/dmaap-buscontroller/init-mock-drps.sh b/scripts/dmaap-buscontroller/init-mock-drps.sh
new file mode 100755
index 00000000..e0f1d0f1
--- /dev/null
+++ b/scripts/dmaap-buscontroller/init-mock-drps.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+# $1 is the IP address of the DRPS (Data Router Provisioning Server) mock server
+
+curl -v -X PUT -d @- http://$1:1080/expectation << EOF
+{
+ "httpRequest": {
+ "method": "GET",
+ "path": "/hello"
+ },
+ "httpResponse": {
+ "body": "Hello world!",
+ "statusCode": 200
+ }
+}
+EOF
+
diff --git a/scripts/dmaap-buscontroller/init-mock-mrc.sh b/scripts/dmaap-buscontroller/init-mock-mrc.sh
new file mode 100755
index 00000000..75c1a419
--- /dev/null
+++ b/scripts/dmaap-buscontroller/init-mock-mrc.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+# $1 is the IP address of the MRC (MR Central) mock server
+
+curl -v -X PUT -d @- http://$1:1080/expectation << EOF
+{
+ "httpRequest": {
+ "method": "GET",
+ "path": "/hello"
+ },
+ "httpResponse": {
+ "body": "Hello world!",
+ "statusCode": 200
+ }
+}
+EOF
+
diff --git a/scripts/dmaap-buscontroller/onapCSIT.env b/scripts/dmaap-buscontroller/onapCSIT.env
new file mode 100644
index 00000000..db865818
--- /dev/null
+++ b/scripts/dmaap-buscontroller/onapCSIT.env
@@ -0,0 +1,18 @@
+#!/bin/bash
+#
+# environment settings for Dmaap Bus Controller Integration Test.
+# assumes args are:
+# $1 - FQDN of AAF server
+# $2 - FQDN of MR server
+# $3 - FQDN of DRPS Server
+# Only need to set values where defaults aren't appropriate
+#
+cat <<!EOF
+DMAAPBC_INT_HTTPS_PORT=8443
+DMAAPBC_PG_ENABLED=false
+DMAAPBC_INSTANCE_NAME=ONAP-CSIT
+DMAAPBC_AAF_URL=https://${1}:1080/proxy/
+DMAAPBC_MR_CNAME=${2}
+DMAAPBC_DRPROV_FQDN=${3}
+DMAAPBC_CSIT=Yes
+!EOF
diff --git a/scripts/dmaap-buscontroller/start-mock.sh b/scripts/dmaap-buscontroller/start-mock.sh
new file mode 100755
index 00000000..b4707c5a
--- /dev/null
+++ b/scripts/dmaap-buscontroller/start-mock.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# org.onap.dmaap
+# ================================================================================
+# Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+#
+
+#
+# starts a mock server container named $1-mock
+# and runs init-mock-$1.sh to initialize it
+# modifies global var IP to provide the IP address of the started container
+function start_mock() {
+ IP=""
+ app=$1
+ port=${2:-1080}
+ docker run --name ${app}-mock -d jamesdbloom/mockserver /opt/mockserver/run_mockserver.sh -logLevel INFO -serverPort ${port} -proxyPort 1090
+ IP=`get-instance-ip.sh ${app}-mock`
+
+ # Wait for initialization
+ for i in {1..10}; do
+ curl -sS ${IP}:${port} && break
+ echo sleep $i
+ sleep $i
+ done
+
+ set -x
+ ${WORKSPACE}/test/csit/scripts/dmaap-buscontroller/init-mock-${app}.sh ${IP}
+ set +x
+
+ # this is the output of this function
+ #echo "$IP"
+}
+
diff --git a/scripts/dmaap-message-router/dmaap-mr-launch.sh b/scripts/dmaap-message-router/dmaap-mr-launch.sh
new file mode 100755
index 00000000..36d31689
--- /dev/null
+++ b/scripts/dmaap-message-router/dmaap-mr-launch.sh
@@ -0,0 +1,114 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# ONAP DMAAP MR
+# ================================================================================
+# Copyright (C) 2018 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+# This script is a copy of plans/dmaap/mrpubsub/setup.sh, placed in the scripts
+# dir, and edited to be a callable function from other plans. e.g. dmaap-buscontroller needs it.
+#
+source ${SCRIPTS}/common_functions.sh
+
+# function to launch DMaaP MR docker containers.
+# sets global var IP with assigned IP address of MR container.
+# (kafka and zk containers are not called externally)
+
+function dmaap_mr_launch() {
+ #
+ # the default prefix for docker containers is the directory name containing the docker-compose.yml file.
+ # It can be over-written by an env variable COMPOSE_PROJECT_NAME. This env var seems to be set in the Jenkins CSIT environment
+ COMPOSE_PREFIX=${COMPOSE_PROJECT_NAME:-docker-compose}
+ echo "COMPOSE_PROJECT_NAME=$COMPOSE_PROJECT_NAME"
+ echo "COMPOSE_PREFIX=$COMPOSE_PREFIX"
+
+ # Clone DMaaP Message Router repo
+ mkdir -p $WORKSPACE/archives/dmaapmr
+ cd $WORKSPACE/archives/dmaapmr
+ #unset http_proxy https_proxy
+ git clone --depth 1 http://gerrit.onap.org/r/dmaap/messagerouter/messageservice -b master
+ cd messageservice
+ git pull
+ cd $WORKSPACE/archives/dmaapmr/messageservice/src/main/resources/docker-compose
+ cp $WORKSPACE/archives/dmaapmr/messageservice/bundleconfig-local/etc/appprops/MsgRtrApi.properties /var/tmp/
+
+
+ # start DMaaP MR containers with docker compose and configuration from docker-compose.yml
+ docker login -u docker -p docker nexus3.onap.org:10001
+ docker-compose up -d
+ docker ps
+
+ # Wait for initialization of Docker contaienr for DMaaP MR, Kafka and Zookeeper
+ for i in {1..50}; do
+ if [ $(docker inspect --format '{{ .State.Running }}' ${COMPOSE_PREFIX}_dmaap_1) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' ${COMPOSE_PREFIX}_zookeeper_1) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' ${COMPOSE_PREFIX}_dmaap_1) ]
+ then
+ echo "DMaaP Service Running"
+ break
+ else
+ echo sleep $i
+ sleep $i
+ fi
+ done
+
+
+ DMAAP_MR_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${COMPOSE_PREFIX}_dmaap_1)
+ IP=${DMAAP_MR_IP}
+ KAFKA_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${COMPOSE_PREFIX}_kafka_1)
+ ZOOKEEPER_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${COMPOSE_PREFIX}_zookeeper_1)
+
+ echo DMAAP_MR_IP=${DMAAP_MR_IP}
+ echo IP=${IP}
+ echo KAFKA_IP=${KAFKA_IP}
+ echo ZOOKEEPER_IP=${ZOOKEEPER_IP}
+
+ # Initial docker-compose up and down is for populating kafka and zookeeper IPs in /var/tmp/MsgRtrApi.properites
+ docker-compose down
+
+ # Update kafkfa and zookeeper properties in MsgRtrApi.propeties which will be copied to DMaaP Container
+ sed -i -e 's/<zookeeper_host>/'$ZOOKEEPER_IP'/' /var/tmp/MsgRtrApi.properties
+ sed -i -e 's/<kafka_host>:<kafka_port>/'$KAFKA_IP':9092/' /var/tmp/MsgRtrApi.properties
+
+ docker-compose build
+ docker login -u docker -p docker nexus3.onap.org:10001
+ docker-compose up -d
+
+ # Wait for initialization of Docker containers
+ for i in {1..50}; do
+ if [ $(docker inspect --format '{{ .State.Running }}' ${COMPOSE_PREFIX}_dmaap_1) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' ${COMPOSE_PREFIX}_zookeeper_1) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' ${COMPOSE_PREFIX}_dmaap_1) ]
+ then
+ echo "DMaaP Service Running"
+ break
+ else
+ echo sleep $i
+ sleep $i
+ fi
+ done
+
+ # Wait for initialization of docker services
+ for i in {1..50}; do
+ curl -sS -m 1 ${DMAAP_MR_IP}:3904/events/TestTopic && break
+ echo sleep $i
+ sleep $i
+ done
+}
+
diff --git a/scripts/dmaap-message-router/dmaap-mr-teardown.sh b/scripts/dmaap-message-router/dmaap-mr-teardown.sh
new file mode 100755
index 00000000..ac6d798c
--- /dev/null
+++ b/scripts/dmaap-message-router/dmaap-mr-teardown.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2018 AT&T Intellectual Property
+#
+
+function dmaap_mr_teardown() {
+kill-instance.sh docker-compose_dmaap_1
+kill-instance.sh docker-compose_kafka_1
+kill-instance.sh docker-compose_zookeeper_1
+}
diff --git a/scripts/externalapi-nbi/delete_nbi_containers.sh b/scripts/externalapi-nbi/delete_nbi_containers.sh
new file mode 100644
index 00000000..76be3289
--- /dev/null
+++ b/scripts/externalapi-nbi/delete_nbi_containers.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+# ========================================================================
+# Copyright (c) 2018 Orange
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ========================================================================
+
+echo "This is ${WORKSPACE}/test/csit/scripts/externalapi-nbi/delete_nbi_containers.sh"
+
+# Check if docker-compose file exists
+if [ ! -f "$WORKSPACE/externalapi-nbi/docker-compose.yml" ]; then
+ echo 'There is nothing to clean. Exiting...' >&2
+ exit 0
+fi
+
+cd $WORKSPACE/externalapi-nbi
+
+# Remove containers and attached/anonymous volume(s)
+docker-compose down -v
+# Force stop & remove all containers and volumes
+docker-compose rm -f -s -v
+
+# clean up
+rm -rf $WORKSPACE/externalapi-nbi \ No newline at end of file
diff --git a/scripts/externalapi-nbi/start_nbi_containers.sh b/scripts/externalapi-nbi/start_nbi_containers.sh
new file mode 100644
index 00000000..68fbb029
--- /dev/null
+++ b/scripts/externalapi-nbi/start_nbi_containers.sh
@@ -0,0 +1,70 @@
+#!/bin/bash
+# ========================================================================
+# Copyright (c) 2018 Orange
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ========================================================================
+
+NEXUS_USERNAME=docker
+NEXUS_PASSWD=docker
+export NEXUS_DOCKER_REPO=nexus3.onap.org:10001
+export DOCKER_IMAGE_VERSION=latest
+
+echo "This is ${WORKSPACE}/test/csit/scripts/externalapi-nbi/start_nbi_containers.sh"
+
+# Create directory
+mkdir -p $WORKSPACE/externalapi-nbi
+cd $WORKSPACE/externalapi-nbi
+
+# Create .env file to access env variables for docker-compose
+echo "NEXUS_DOCKER_REPO=${NEXUS_DOCKER_REPO}" > .env
+echo "MSB_ENABLED=false" >> .env
+
+# Fetch the latest docker-compose.yml
+wget -O docker-compose.yml 'https://git.onap.org/externalapi/nbi/plain/docker-compose.yml?h=master'
+
+# Pull the nbi docker image from nexus
+# MariaDB and mongoDB will be pulled automatically from docker.io during docker-compose
+docker login -u $NEXUS_USERNAME -p $NEXUS_PASSWD $NEXUS_DOCKER_REPO
+docker pull $NEXUS_DOCKER_REPO/onap/externalapi/nbi:$DOCKER_IMAGE_VERSION
+
+# Start nbi, MariaDB and MongoDB containers with docker compose and nbi/docker-compose.yml
+docker-compose up -d mariadb mongo
+
+# inject a script to ensure that these services are ready for connections
+docker-compose run --rm --entrypoint='/bin/sh' nbi -c '\
+ attempt=1; \
+ while ! nc -z mariadb 3306 || ! nc -z mongo 27017; do \
+ if [ $attempt = 30 ]; then \
+ echo "Timed out!"; \
+ exit 1; \
+ fi; \
+ echo "waiting for db services (attempt #$attempt)..."; \
+ sleep 1; \
+ attempt=$(( attempt + 1)); \
+ done; \
+ echo "all db services are ready for connections!" \
+'
+
+docker-compose up -d nbi
+
+NBI_CONTAINER_NAME=$(docker-compose ps 2> /dev/null | tail -n+3 | tr -s ' ' | cut -d' ' -f1 | grep _nbi_)
+NBI_IP=$(docker inspect --format='{{ range .NetworkSettings.Networks }}{{ .IPAddress }}{{ end }}' ${NBI_CONTAINER_NAME})
+
+echo "IP address for NBI main container ($NBI_CONTAINER_NAME) is set to ${NBI_IP}."
+
+# Wait for initialization
+for i in {1..30}; do
+ curl -sS ${NBI_IP}:8080 > /dev/null 2>&1 && echo 'nbi initialized' && break
+ echo sleep $i
+ sleep $i
+done
diff --git a/scripts/get-instance-ip.sh b/scripts/get-instance-ip.sh
new file mode 100755
index 00000000..c4ca82cf
--- /dev/null
+++ b/scripts/get-instance-ip.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+docker inspect --format '{{ .NetworkSettings.IPAddress }}' $1
diff --git a/scripts/holmes/engine-management/startup.sh b/scripts/holmes/engine-management/startup.sh
new file mode 100644
index 00000000..27a4df48
--- /dev/null
+++ b/scripts/holmes/engine-management/startup.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# $1 nickname for the engined instance
+# $2 IP address of JDBC
+# $3 IP address of BrokerIP
+
+docker login -u docker -p docker nexus3.onap.org:10001
+
+run-instance.sh nexus3.onap.org:10001/onap/holmes/engine-management:latest $1 "-e URL_JDBC=$2:5432 -e MSB_ADDR=$3:80 -e TESTING=$4 -p 9102:9102"
diff --git a/scripts/holmes/rule-management/startup.sh b/scripts/holmes/rule-management/startup.sh
new file mode 100644
index 00000000..ab3f9312
--- /dev/null
+++ b/scripts/holmes/rule-management/startup.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# $1 nickname for the RuleMgt instance
+# $2 IP address of JDBC
+
+docker login -u docker -p docker nexus3.onap.org:10001
+
+run-instance.sh nexus3.onap.org:10001/onap/holmes/rule-management:latest $1 "-e URL_JDBC=$2:5432 -e MSB_ADDR=$3:80 -e TESTING=$4 -p 9101:9101" \ No newline at end of file
diff --git a/scripts/integration/mock-hello.sh b/scripts/integration/mock-hello.sh
new file mode 100755
index 00000000..ac955172
--- /dev/null
+++ b/scripts/integration/mock-hello.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# $1 ip address of the mock server
+
+curl -v -X PUT -d @- http://$1:1080/expectation <<EOF
+{
+ "httpRequest": {
+ "method": "GET",
+ "path": "/hello"
+ },
+ "httpResponse": {
+ "body": "Hello world!",
+ "statusCode": 200
+ }
+}
+EOF
+
diff --git a/scripts/integration/script1.sh b/scripts/integration/script1.sh
new file mode 100755
index 00000000..05d57e84
--- /dev/null
+++ b/scripts/integration/script1.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+echo "This is ${WORKSPACE}/test/csit/scripts/integration/script1.sh"
diff --git a/scripts/kill-instance.sh b/scripts/kill-instance.sh
new file mode 100755
index 00000000..525f96e4
--- /dev/null
+++ b/scripts/kill-instance.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# $1 nickname for the instance
+
+mkdir -p $WORKSPACE/archives
+
+docker logs $1 >> $WORKSPACE/archives/$1.log
+docker kill $1
+docker rm $1
+
diff --git a/scripts/modeling-toscaparsers-javatoscachecker/setup_containers.sh b/scripts/modeling-toscaparsers-javatoscachecker/setup_containers.sh
new file mode 100644
index 00000000..3521ff1c
--- /dev/null
+++ b/scripts/modeling-toscaparsers-javatoscachecker/setup_containers.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+echo "This is ${WORKSPACE}/test/csit/scripts/modeling-toscaparsers-javatoscachecker/setup_containers.sh"
+
+#start docker image
+run-instance.sh nexus3.onap.org:10001/onap/modeling/javatoscachecker:latest modeling_javatoscachecker_1 "-p 8080:8080"
+
+#checker docker image is accesible: picked from clamp, some common script would be good
+TIME_OUT=1200
+INTERVAL=5
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+ response=$(curl --write-out '%{http_code}' --silent --output /dev/null http://localhost:8080/check_template/test_me); echo $response
+
+ if [ "$response" == "404" ]; then
+ echo javatoscachecker service started in $TIME seconds
+ break;
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if javatoscachecker service is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]; then
+ echo TIME OUT: Docker containers not started in $TIME_OUT seconds... Could cause problems for tests...
+fi
+
+
diff --git a/scripts/modeling-toscaparsers-javatoscachecker/teardown_containers.sh b/scripts/modeling-toscaparsers-javatoscachecker/teardown_containers.sh
new file mode 100644
index 00000000..cca4fe19
--- /dev/null
+++ b/scripts/modeling-toscaparsers-javatoscachecker/teardown_containers.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+echo "This is ${WORKSPACE}/test/csit/scripts/modeling-toscaparsers-javatoscachecker/teardown_containers.sh"
+
+kill-instance.sh modeling_javatoscachecker_1
+
+
diff --git a/scripts/multicloud-ocata/generic_sim/Dockerfile b/scripts/multicloud-ocata/generic_sim/Dockerfile
new file mode 100644
index 00000000..688b58af
--- /dev/null
+++ b/scripts/multicloud-ocata/generic_sim/Dockerfile
@@ -0,0 +1,12 @@
+FROM python:2.7
+
+EXPOSE 8080
+
+RUN mkdir -p /{tmp,etc}/generic_sim
+
+WORKDIR /opt/generic_sim/
+
+COPY . .
+RUN pip install --no-cache-dir -r requirements.txt
+
+CMD [ "python", "generic_sim.py" ]
diff --git a/scripts/multicloud-ocata/generic_sim/aai/responses.yml b/scripts/multicloud-ocata/generic_sim/aai/responses.yml
new file mode 100644
index 00000000..f6d5fcd0
--- /dev/null
+++ b/scripts/multicloud-ocata/generic_sim/aai/responses.yml
@@ -0,0 +1,189 @@
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne:
+ GET:
+ body: '{"cloud-owner":"CloudOwner","cloud-region-id":"RegionOne","cloud-type":"openstack","owner-defined-type":"t1","cloud-region-version":"RegionOne","identity-url":"http://keystone:8080/v3","cloud-zone":"z1","complex-name":"clli1","sriov-automation":false,"cloud-extra-info":"","resource-version":"1524845154715"}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/internal:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/internal","Node
+ Not Found:No Node of type availability-zone found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/internal","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/nova:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/nova","Node
+ Not Found:No Node of type availability-zone found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/nova","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/100:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/100","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/100","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/110:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/110","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/110","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/111:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/111","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/111","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/112:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/112","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/112","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/113:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/113","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/113","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/114:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/114","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/114","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/115:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/115","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/115","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/116:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/116","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/116","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/117:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/117","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/117","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/images/image/660709df-e90b-471f-ac57-d8c2555e573d:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/images/image/660709df-e90b-471f-ac57-d8c2555e573d","Node
+ Not Found:No Node of type image found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/images/image/660709df-e90b-471f-ac57-d8c2555e573d","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3543226ffed44daf90a2f71f36c00b8d:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3543226ffed44daf90a2f71f36c00b8d","Node
+ Not Found:No Node of type tenant found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3543226ffed44daf90a2f71f36c00b8d","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/b8f5d85bbcd84af28d7caa62d39f05c7:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/b8f5d85bbcd84af28d7caa62d39f05c7","Node
+ Not Found:No Node of type tenant found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/b8f5d85bbcd84af28d7caa62d39f05c7","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne:
+ GET:
+ body: '{"cloud-owner":"CloudOwner","cloud-region-id":"RegionOne","cloud-type":"openstack","owner-defined-type":"t1","cloud-region-version":"RegionOne","identity-url":"http://multicloud-ocata:80/api/multicloud-titanium_cloud/v0/CloudOwner_RegionOne/identity/v2.0","cloud-zone":"z1","complex-name":"clli1","sriov-automation":false,"cloud-extra-info":"","resource-version":"1524845276291"}'
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/esr-system-info-list:
+ GET:
+ body: '{"esr-system-info":[{"esr-system-info-id":"4ce895ad-82f7-4476-b5eb-d19d19585da2","service-url":"http://keystone:8080/v3","user-name":"admin","password":"secret","system-type":"VIM","ssl-insecure":true,"cloud-domain":"Default","default-tenant":"admin","resource-version":"1524845155617"}]}'
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/pservers/pserver/compute-0:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/pservers/pserver/compute-0","Node
+ Not Found:No Node of type pserver found at: cloud-infrastructure/pservers/pserver/compute-0","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/pservers/pserver/compute-0/relationship-list/relationship:
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
diff --git a/scripts/multicloud-ocata/generic_sim/cinder/responses.yml b/scripts/multicloud-ocata/generic_sim/cinder/responses.yml
new file mode 100644
index 00000000..d9657a5d
--- /dev/null
+++ b/scripts/multicloud-ocata/generic_sim/cinder/responses.yml
@@ -0,0 +1,5 @@
+/snapshots/detail:
+ get:
+ body: '{"snapshots": []}'
+ content_type: application/json
+ status_code: 200
diff --git a/scripts/multicloud-ocata/generic_sim/generic_sim.py b/scripts/multicloud-ocata/generic_sim/generic_sim.py
new file mode 100644
index 00000000..4392b652
--- /dev/null
+++ b/scripts/multicloud-ocata/generic_sim/generic_sim.py
@@ -0,0 +1,109 @@
+# Copyright 2018 Intel Corporation, Inc
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import json
+import logging
+
+import web
+from web import webapi
+import yaml
+
+urls = (
+ '/(.*)','MockController'
+)
+
+def setup_logger(name, log_file, level=logging.DEBUG):
+ print("Configuring the logger...")
+ handler = logging.FileHandler(log_file)
+ formatter = logging.Formatter('%(message)s')
+ handler.setFormatter(formatter)
+
+ logger = logging.getLogger(name)
+ logger.setLevel(level)
+ logger.addHandler(handler)
+
+ return logger
+
+
+class MockResponse:
+ def __init__(self, http_verb, status_code,
+ content_type="application/json", body="{}",
+ headers={}):
+ self.http_verb = http_verb.lower()
+ self.status_code = status_code
+ self.content_type = content_type
+ self.body = body
+ self.headers = headers
+
+def _parse_responses(parsed_responses):
+ result = {}
+ for path, responses in parsed_responses.iteritems():
+ new_path = path
+ if path.startswith("/"):
+ new_path = path[1:]
+
+ result[new_path] = []
+ for http_verb, response in responses.iteritems():
+ result[new_path].append(MockResponse(http_verb, **response))
+ return result
+
+def load_responses(filename):
+ print("Loading responses from configuration file..")
+ with open(filename) as yaml_file:
+ responses_file = yaml.safe_load(yaml_file)
+ responses_map = _parse_responses(responses_file)
+ return responses_map
+
+
+class MockController:
+
+ def _do_action(self, action):
+ logger.info('{}'.format(web.ctx.env.get('wsgi.input').read()))
+ action = action.lower()
+ url = web.ctx['fullpath']
+ try:
+ if url.startswith("/"):
+ url = url[1:]
+ response = [ r for r in responses_map[url] if r.http_verb == action][0]
+ for header, value in response.headers.iteritems():
+ web.header(header, value)
+ web.header('Content-Type', response.content_type)
+ print(response.body)
+ return response.body
+ except:
+ webapi.NotFound()
+
+ def DELETE(self, url):
+ return self._do_action("delete")
+
+ def HEAD(self, url):
+ return self._do_action("head")
+
+ def PUT(self, url):
+ return self._do_action("put")
+
+ def GET(self, url):
+ return self._do_action("get")
+
+ def POST(self, url):
+ return self._do_action("post")
+
+ def PATCH(self, url):
+ return self._do_action("patch")
+
+
+logger = setup_logger('mock_controller', '/tmp/generic_sim/output.log')
+responses_map = load_responses('/etc/generic_sim/responses.yml')
+app = web.application(urls, globals())
+if __name__ == "__main__":
+ app.run()
diff --git a/scripts/multicloud-ocata/generic_sim/glance/responses.yml b/scripts/multicloud-ocata/generic_sim/glance/responses.yml
new file mode 100644
index 00000000..d8422352
--- /dev/null
+++ b/scripts/multicloud-ocata/generic_sim/glance/responses.yml
@@ -0,0 +1,73 @@
+/v2/images:
+ get:
+ body: '{"images": [{"status": "active", "schema": "/v2/schemas/image",
+ "virtual_size": null, "description": "", "tags": [], "container_format":
+ "bare", "created_at": "2018-04-21T06:12:13Z", "disk_format": "raw",
+ "updated_at": "2018-04-21T06:12:24Z", "visibility": "public", "id":
+ "660709df-e90b-471f-ac57-d8c2555e573d", "owner": "b8f5d85bbcd84af28d7caa62d39f05c7",
+ "protected": false, "min_ram": 0, "file": "/v2/images/660709df-e90b-471f-ac57-d8c2555e573d/file",
+ "checksum": "683f86920d4c922cb5c55d99d646b895", "min_disk": 0, "size":
+ 1697597440, "self": "/v2/images/660709df-e90b-471f-ac57-d8c2555e573d", "store":
+ "file", "name": "tis4-centos-guest"}], "first": "/v2/images", "schema":
+ "/v2/schemas/images"}'
+ content_type: application/json
+ status_code: 200
+/v2/schemas/image:
+ get:
+ body: '{"additionalProperties": {"type": "string"}, "name": "image",
+ "links": [{"href": "{self}", "rel": "self"}, {"href": "{file}",
+ "rel": "enclosure"}, {"href": "{schema}", "rel": "describedby"}],
+ "properties": {"container_format": {"enum": [null, "ami", "ari", "aki",
+ "bare", "ovf", "ova", "docker"], "type": ["null", "string"], "description":
+ "Format of the container"}, "min_ram": {"type": "integer", "description":
+ "Amount of ram (in MB) required to boot image."}, "ramdisk_id": {"pattern":
+ "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
+ "type": ["null", "string"], "description": "ID of image stored in Glance
+ that should be used as the ramdisk when booting an AMI-style image.", "is_base":
+ false}, "locations": {"items": {"required": ["url", "metadata"], "type":
+ "object", "properties": {"url": {"type": "string", "maxLength":
+ 255}, "metadata": {"type": "object"}}}, "type": "array", "description":
+ "A set of URLs to access the image file kept in external store"}, "file":
+ {"readOnly": true, "type": "string", "description": "An image file
+ url"}, "owner": {"type": ["null", "string"], "description": "Owner
+ of the image", "maxLength": 255}, "id": {"pattern": "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
+ "type": "string", "description": "An identifier for the image"}, "size":
+ {"readOnly": true, "type": ["null", "integer"], "description": "Size
+ of image file in bytes"}, "os_distro": {"type": "string", "description":
+ "Common name of operating system distribution as specified in https://docs.openstack.org/python-glanceclient/latest/cli/property-keys.html",
+ "is_base": false}, "self": {"readOnly": true, "type": "string", "description":
+ "An image self url"}, "disk_format": {"enum": [null, "ami", "ari",
+ "aki", "vhd", "vhdx", "vmdk", "raw", "qcow2", "vdi", "iso",
+ "ploop"], "type": ["null", "string"], "description": "Format of the
+ disk"}, "os_version": {"type": "string", "description": "Operating
+ system version as specified by the distributor", "is_base": false}, "direct_url":
+ {"readOnly": true, "type": "string", "description": "URL to access
+ the image file kept in external store"}, "schema": {"readOnly": true, "type":
+ "string", "description": "An image schema url"}, "status": {"readOnly":
+ true, "enum": ["queued", "saving", "active", "killed", "deleted",
+ "pending_delete", "deactivated"], "type": "string", "description":
+ "Status of the image"}, "tags": {"items": {"type": "string", "maxLength":
+ 255}, "type": "array", "description": "List of strings related to the
+ image"}, "kernel_id": {"pattern": "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
+ "type": ["null", "string"], "description": "ID of image stored in Glance
+ that should be used as the kernel when booting an AMI-style image.", "is_base":
+ false}, "visibility": {"enum": ["community", "public", "private",
+ "shared"], "type": "string", "description": "Scope of image accessibility"},
+ "updated_at": {"readOnly": true, "type": "string", "description":
+ "Date and time of the last image modification"}, "min_disk": {"type":
+ "integer", "description": "Amount of disk space (in GB) required to boot
+ image."}, "virtual_size": {"readOnly": true, "type": ["null", "integer"],
+ "description": "Virtual size of image in bytes"}, "instance_uuid": {"type":
+ "string", "description": "Metadata which can be used to record which instance
+ this image is associated with. (Informational only, does not create an instance
+ snapshot.)", "is_base": false}, "name": {"type": ["null", "string"],
+ "description": "Descriptive name for the image", "maxLength": 255}, "checksum":
+ {"readOnly": true, "type": ["null", "string"], "description": "md5
+ hash of image contents.", "maxLength": 32}, "created_at": {"readOnly":
+ true, "type": "string", "description": "Date and time of image registration"},
+ "protected": {"type": "boolean", "description": "If true, image will
+ not be deletable."}, "architecture": {"type": "string", "description":
+ "Operating system architecture as specified in https://docs.openstack.org/python-glanceclient/latest/cli/property-keys.html",
+ "is_base": false}}}'
+ content_type: application/json
+ status_code: 200
diff --git a/scripts/multicloud-ocata/generic_sim/keystone/responses.yml b/scripts/multicloud-ocata/generic_sim/keystone/responses.yml
new file mode 100644
index 00000000..422ec7b7
--- /dev/null
+++ b/scripts/multicloud-ocata/generic_sim/keystone/responses.yml
@@ -0,0 +1,44 @@
+projects:
+ get:
+ body: '{"projects": [{"is_domain": false, "description": "admin tenant",
+ "links": {"self": "http://keystone:8080/v3/projects/b8f5d85bbcd84af28d7caa62d39f05c7"},
+ "enabled": true, "domain_id": "default", "parent_id": "default", "id":
+ "b8f5d85bbcd84af28d7caa62d39f05c7", "name": "admin"}, {"is_domain":
+ false, "description": "Tenant for the openstack services", "links": {"self":
+ "http://keystone:8080/v3/projects/3543226ffed44daf90a2f71f36c00b8d"},
+ "enabled": true, "domain_id": "default", "parent_id": "default", "id":
+ "3543226ffed44daf90a2f71f36c00b8d", "name": "services"}], "links": {"self":
+ "http://keystone:8080/v3/projects", "next": null, "previous": null}}'
+ content_type: application/json
+ status_code: 200
+v3/auth/tokens:
+ post:
+ body: '{"token": {"methods": ["password"], "expires_at": "2019-11-06T15:32:17.893769Z",
+ "user": { "domain": {"id": "default", "name": "Default"},
+ "id": "423f19a4ac1e4f48bbb4180756e6eb6c", "name": "admin", "password_expires_at": null },
+ "audit_ids": [ "ZzZwkUflQfygX7pdYDBCQQ"], "catalog": [
+ { "endpoints": [
+ { "id": "1", "interface": "public", "region": "RegionOne", "url": "http://keystone:8080" },
+ { "id": "2", "interface": "internal", "region": "RegionOne", "url": "http://keystone:8080" },
+ { "id": "3", "interface": "admin", "region": "RegionOne", "url": "http://keystone:8080" }
+ ], "id": "1", "type": "identity", "name": "keystone"},
+ { "endpoints": [
+ { "id": "1", "interface": "public", "region": "RegionOne", "url": "http://glance:8080" },
+ { "id": "2", "interface": "internal", "region": "RegionOne", "url": "http://glance:8080" },
+ { "id": "3", "interface": "admin", "region": "RegionOne", "url": "http://glance:8080" }
+ ], "id": "2", "type": "image", "name": "glance"},
+ { "endpoints": [
+ { "id": "1", "interface": "public", "region": "RegionOne", "url": "http://cinder:8080" },
+ { "id": "2", "interface": "internal", "region": "RegionOne", "url": "http://cinder:8080" },
+ { "id": "3", "interface": "admin", "region": "RegionOne", "url": "http://cinder:8080" }
+ ], "id": "2", "type": "volumev3", "name": "cinder"},
+ { "endpoints": [
+ { "id": "1", "interface": "public", "region": "RegionOne", "url": "http://nova:8080" },
+ { "id": "2", "interface": "internal", "region": "RegionOne", "url": "http://nova:8080" },
+ { "id": "3", "interface": "admin", "region": "RegionOne", "url": "http://nova:8080" }
+ ], "id": "3", "type": "compute", "name": "nova"}],
+ "issued_at": "2015-11-06T14:32:17.893797Z"}}'
+ content_type: application/json
+ status_code: 200
+ headers:
+ X-Subject-Token: 423f19a4ac1e4f48bbb4180756e6eb6c
diff --git a/scripts/multicloud-ocata/generic_sim/log_parser.py b/scripts/multicloud-ocata/generic_sim/log_parser.py
new file mode 100644
index 00000000..1334e608
--- /dev/null
+++ b/scripts/multicloud-ocata/generic_sim/log_parser.py
@@ -0,0 +1,61 @@
+import argparse
+
+import yaml
+
+
+def _find_aai_response_content(inp):
+ return inp.split("||||")[1].split("with response content = ")[1]
+
+def _find_openstack_url(inp):
+ return inp.split("||||")[1].split("making request with URI:")[1]
+
+def _find_openstack_response_content(inp):
+ return inp.split("||||")[1].split("with content:")[1].replace("u'", "'")
+
+def _add_response(all_responses, url, http_verb, body, status_code=200, content_type="application/json"):
+ if url not in all_responses.keys():
+ all_responses[url] = {
+ http_verb: {
+ "status_code": status_code,
+ "content_type": content_type,
+ "body": body
+ }
+ }
+ elif http_verb not in all_responses[url].keys():
+ all_responses[url][http_verb] = {
+ "status_code": status_code,
+ "content_type": content_type,
+ "body": body
+ }
+
+def parse_lines(content, aai_ip):
+ aai_pattern = "https://%s:30233/" % aai_ip
+ openstack_pattern = "making request with URI:"
+
+ openstack_responses = {}
+ aai_responses = {}
+ for i, line in enumerate(content):
+ current_line = line.strip()
+ if aai_pattern in current_line and "DEBUG" not in current_line:
+ url = current_line.split(" ")[8][:-1].replace(aai_pattern, "")
+ _add_response(aai_responses, url, current_line.split(" ")[9][:-1],
+ _find_aai_response_content(content[i + 3]))
+ elif openstack_pattern in current_line:
+ _add_response(openstack_responses,
+ _find_openstack_url(current_line), "get",
+ _find_openstack_response_content(content[i + 2]))
+
+ return [
+ { "file": "nova.yml", "responses": openstack_responses },
+ { "file": "aai.yml", "responses": aai_responses }
+ ]
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description='Convert logs to responses YAML tree file.')
+ parser.add_argument('--log-file', type=argparse.FileType('r'), help="Log file to be parsed", required=True)
+ parser.add_argument('--aai-ip', help="A&AI IP Address", required=True)
+ args = parser.parse_args()
+
+ for mock_responses in parse_lines(args.log_file.readlines(), args.aai_ip):
+ with open(mock_responses["file"], 'w') as yaml_file:
+ yaml.dump(mock_responses["responses"], yaml_file, default_flow_style=False)
diff --git a/scripts/multicloud-ocata/generic_sim/nova/responses.yml b/scripts/multicloud-ocata/generic_sim/nova/responses.yml
new file mode 100644
index 00000000..94469711
--- /dev/null
+++ b/scripts/multicloud-ocata/generic_sim/nova/responses.yml
@@ -0,0 +1,177 @@
+/flavors/110/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"hw:cpu_policy": "dedicated", "hw:mem_page_size":
+ "large", "hw:cpu_sockets": "2", "hw:cpu_threads": "8", "hw:numa_mem.1":
+ "2048", "hw:numa_mem.0": "2048", "hw:capabilities:cpu_info:features":
+ "avx,acpi", "aggregate_instance_extra_specs:storage": "local_image", "hw:numa_nodes":
+ "2", "hw:numa_cpus.0": "0,1", "hw:numa_cpus.1": "2,3,4,5", "hw:cpu_cores":
+ "4", "hw:cpu_thread_policy": "prefer", "pci_passthrough:alias": "sriov-vf-intel-8086-15b3:4"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/111/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"aggregate_instance_extra_specs:storage": "local_image"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/112/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"hw:cpu_policy": "dedicated", "hw:cpu_thread_policy":
+ "isolate", "aggregate_instance_extra_specs:storage": "local_image"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/113/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"hw:cpu_cores": "8", "hw:cpu_threads": "16",
+ "aggregate_instance_extra_specs:storage": "local_image", "hw:cpu_sockets":
+ "2"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/114/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"aggregate_instance_extra_specs:storage": "local_image",
+ "hw:mem_page_size": "small"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/115/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"hw:numa_mem.1": "1024", "hw:numa_mem.0": "1024",
+ "aggregate_instance_extra_specs:storage": "local_image", "hw:numa_nodes":
+ "2", "hw:numa_cpus.0": "0,1", "hw:numa_cpus.1": "2,3"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/116/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"hw:capabilities:cpu_info:features": "avx,aes",
+ "aggregate_instance_extra_specs:storage": "local_image"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/117/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"aggregate_instance_extra_specs:storage": "local_image",
+ "pci_passthrough:alias": "sriov-vf-intel-8086-15b3:6"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/detail:
+ get:
+ body: '{"flavors": [{"name": "f.small", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/100",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/100",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 2, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "100"}, {"name":
+ "onap.hpa.all", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/110",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/110",
+ "rel": "bookmark"}], "ram": 4096, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 6, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "110"}, {"name":
+ "onap.hpa.basic", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/111",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/111",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 4, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "111"}, {"name":
+ "onap.hpa.cpupinning", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/112",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/112",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 4, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "112"}, {"name":
+ "onap.hpa.cputopology", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/113",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/113",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 2, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "113"}, {"name":
+ "onap.hpa.hugepage", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/114",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/114",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 2, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "114"}, {"name":
+ "onap.hpa.numa", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/115",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/115",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 4, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "115"}, {"name":
+ "onap.hpa.instruction", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/116",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/116",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 2, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "116"}, {"name":
+ "onap.hpa.passthrough", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/117",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/117",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 2, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "117"}]}'
+ content_type: application/json
+ status_code: 200
+/os-availability-zone/detail:
+ get:
+ body: '{"availabilityZoneInfo": [{"zoneState": {"available": true}, "hosts":
+ {"controller-0": {"nova-conductor": {"available": true, "active": true,
+ "updated_at": "2018-04-27T16:05:25.272674"}, "nova-consoleauth": {"available":
+ true, "active": true, "updated_at": "2018-04-27T16:05:21.875274"}, "nova-scheduler":
+ {"available": true, "active": true, "updated_at": "2018-04-27T16:05:25.286846"}}},
+ "zoneName": "internal"}, {"zoneState": {"available": false}, "hosts":
+ null, "zoneName": "nova"}]}'
+ content_type: application/json
+ status_code: 200
+/os-hypervisors/detail:
+ get:
+ body: '{
+ "hypervisors": [{
+ "status": "disabled",
+ "service": {
+ "host": "compute-0",
+ "disabled_reason": null,
+ "id": 11
+ },
+ "vcpus_used": 0.0,
+ "hypervisor_type": "QEMU",
+ "id": 1,
+ "local_gb_used": 0,
+ "state": "down",
+ "hypervisor_hostname": "compute-0",
+ "host_ip": "192.168.204.162",
+ "memory_mb": 51562,
+ "current_workload": 0,
+ "vcpus": 42,
+ "free_ram_mb": 51562,
+ "running_vms": 0,
+ "free_disk_gb": 1740,
+ "hypervisor_version": 2010000,
+ "disk_available_least": 1740,
+ "local_gb": 1833,
+ "cpu_info": "{\"vendor\": \"Intel\", \"model\": \"IvyBridge\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"xsaveopt\", \"clflush\", \"sep\", \"syscall\",\"tsc-deadline\",\"dtes64\",\"msr\",\"fsgsbase\",\"xsave\",\"vmx\",\"erms\",\"xtpr\",\"cmov\",\"smep\",\"pcid\",\"est\",\"pat\",\"monitor\",\"smx\",\"pbe\",\"lm\",\"tsc\",\"nx\",\"fxsr\",\"tm\",\"sse4.1\",\"pae\",\"sse4.2\",\"pclmuldq\",\"acpi\",\"vme\",\"popcnt\",\"mmx\",\"osxsave\",\"cx8\",\"mce\",\"de\",\"rdtscp\",\"ht\",\"dca\",\"lahf_lm\",\"pdcm\",\"mca\",\"pdpe1gb\",\"a pic\",\"sse\",\"f16c\",\"pse\",\"ds\",\"invtsc\",\"pni\",\"tm2\",\"aes\",\"sse2\",\"ss\",\"ds_cpl\",\"arat\",\"ssse3\",\"fpu\",\"cx16\",\"pse36\",\"mtrr\",\"rdrand\",\"x2apic\"],\"topology\": {\"cores\": 12,\"cells\": 2,\"threads\": 2,\"sockets\": 1}}",
+ "memory_mb_used ": 0
+ }]
+}'
+ content_type: application/json
+ status_code: 200
+/os-hypervisors/detail?hypervisor_hostname_pattern=controller-0:
+ get:
+ body: '{
+ "hypervisors": [{
+ "status": "disabled",
+ "service": {
+ "host": "compute-0",
+ "disabled_reason": null,
+ "id": 11
+ },
+ "vcpus_used": 0.0,
+ "hypervisor_type": "QEMU",
+ "id": 1,
+ "local_gb_used": 0,
+ "state": "down",
+ "hypervisor_hostname": "compute-0",
+ "host_ip": "192.168.204.162",
+ "memory_mb": 51562,
+ "current_workload": 0,
+ "vcpus": 42,
+ "free_ram_mb": 51562,
+ "running_vms": 0,
+ "free_disk_gb": 1740,
+ "hypervisor_version": 2010000,
+ "disk_available_least": 1740,
+ "local_gb": 1833,
+ "cpu_info": "{\"vendor\": \"Intel\", \"model\": \"IvyBridge\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"xsaveopt\", \"clflush\", \"sep\", \"syscall\",\"tsc-deadline\",\"dtes64\",\"msr\",\"fsgsbase\",\"xsave\",\"vmx\",\"erms\",\"xtpr\",\"cmov\",\"smep\",\"pcid\",\"est\",\"pat\",\"monitor\",\"smx\",\"pbe\",\"lm\",\"tsc\",\"nx\",\"fxsr\",\"tm\",\"sse4.1\",\"pae\",\"sse4.2\",\"pclmuldq\",\"acpi\",\"vme\",\"popcnt\",\"mmx\",\"osxsave\",\"cx8\",\"mce\",\"de\",\"rdtscp\",\"ht\",\"dca\",\"lahf_lm\",\"pdcm\",\"mca\",\"pdpe1gb\",\"a pic\",\"sse\",\"f16c\",\"pse\",\"ds\",\"invtsc\",\"pni\",\"tm2\",\"aes\",\"sse2\",\"ss\",\"ds_cpl\",\"arat\",\"ssse3\",\"fpu\",\"cx16\",\"pse36\",\"mtrr\",\"rdrand\",\"x2apic\"],\"topology\": {\"cores\": 12,\"cells\": 2,\"threads\": 2,\"sockets\": 1}}",
+ "memory_mb_used ": 0
+ }]
+}'
+ content_type: application/json
+ status_code: 200
diff --git a/scripts/multicloud-ocata/generic_sim/requirements.txt b/scripts/multicloud-ocata/generic_sim/requirements.txt
new file mode 100644
index 00000000..ac1d7dd7
--- /dev/null
+++ b/scripts/multicloud-ocata/generic_sim/requirements.txt
@@ -0,0 +1,2 @@
+PyYAML
+web.py
diff --git a/scripts/multicloud-pike/generic_sim/Dockerfile b/scripts/multicloud-pike/generic_sim/Dockerfile
new file mode 100644
index 00000000..688b58af
--- /dev/null
+++ b/scripts/multicloud-pike/generic_sim/Dockerfile
@@ -0,0 +1,12 @@
+FROM python:2.7
+
+EXPOSE 8080
+
+RUN mkdir -p /{tmp,etc}/generic_sim
+
+WORKDIR /opt/generic_sim/
+
+COPY . .
+RUN pip install --no-cache-dir -r requirements.txt
+
+CMD [ "python", "generic_sim.py" ]
diff --git a/scripts/multicloud-pike/generic_sim/aai/responses.yml b/scripts/multicloud-pike/generic_sim/aai/responses.yml
new file mode 100644
index 00000000..27628072
--- /dev/null
+++ b/scripts/multicloud-pike/generic_sim/aai/responses.yml
@@ -0,0 +1,189 @@
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne:
+ GET:
+ body: '{"cloud-owner":"CloudOwner","cloud-region-id":"RegionOne","cloud-type":"openstack","owner-defined-type":"t1","cloud-region-version":"RegionOne","identity-url":"http://keystone:8080/v3","cloud-zone":"z1","complex-name":"clli1","sriov-automation":false,"cloud-extra-info":"","resource-version":"1524845154715"}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/internal:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/internal","Node
+ Not Found:No Node of type availability-zone found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/internal","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/nova:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/nova","Node
+ Not Found:No Node of type availability-zone found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/nova","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/100:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/100","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/100","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/110:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/110","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/110","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/111:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/111","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/111","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/112:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/112","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/112","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/113:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/113","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/113","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/114:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/114","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/114","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/115:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/115","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/115","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/116:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/116","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/116","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/117:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/117","Node
+ Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/117","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/images/image/660709df-e90b-471f-ac57-d8c2555e573d:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/images/image/660709df-e90b-471f-ac57-d8c2555e573d","Node
+ Not Found:No Node of type image found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/images/image/660709df-e90b-471f-ac57-d8c2555e573d","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3543226ffed44daf90a2f71f36c00b8d:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3543226ffed44daf90a2f71f36c00b8d","Node
+ Not Found:No Node of type tenant found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3543226ffed44daf90a2f71f36c00b8d","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/b8f5d85bbcd84af28d7caa62d39f05c7:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/b8f5d85bbcd84af28d7caa62d39f05c7","Node
+ Not Found:No Node of type tenant found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/b8f5d85bbcd84af28d7caa62d39f05c7","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne:
+ GET:
+ body: '{"cloud-owner":"CloudOwner","cloud-region-id":"RegionOne","cloud-type":"openstack","owner-defined-type":"t1","cloud-region-version":"RegionOne","identity-url":"http://multicloud-pike:80/api/multicloud-titanium_cloud/v0/CloudOwner_RegionOne/identity/v2.0","cloud-zone":"z1","complex-name":"clli1","sriov-automation":false,"cloud-extra-info":"","resource-version":"1524845276291"}'
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/esr-system-info-list:
+ GET:
+ body: '{"esr-system-info":[{"esr-system-info-id":"4ce895ad-82f7-4476-b5eb-d19d19585da2","service-url":"http://keystone:8080/v3","user-name":"admin","password":"secret","system-type":"VIM","ssl-insecure":true,"cloud-domain":"Default","default-tenant":"admin","resource-version":"1524845155617"}]}'
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/pservers/pserver/compute-0:
+ GET:
+ body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+ not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/pservers/pserver/compute-0","Node
+ Not Found:No Node of type pserver found at: cloud-infrastructure/pservers/pserver/compute-0","ERR.5.4.6114"]}}}'
+ content_type: application/json
+ status_code: 200
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
+aai/v13/cloud-infrastructure/pservers/pserver/compute-0/relationship-list/relationship:
+ PUT:
+ body: ''
+ content_type: application/json
+ status_code: 200
diff --git a/scripts/multicloud-pike/generic_sim/cinder/responses.yml b/scripts/multicloud-pike/generic_sim/cinder/responses.yml
new file mode 100644
index 00000000..d9657a5d
--- /dev/null
+++ b/scripts/multicloud-pike/generic_sim/cinder/responses.yml
@@ -0,0 +1,5 @@
+/snapshots/detail:
+ get:
+ body: '{"snapshots": []}'
+ content_type: application/json
+ status_code: 200
diff --git a/scripts/multicloud-pike/generic_sim/generic_sim.py b/scripts/multicloud-pike/generic_sim/generic_sim.py
new file mode 100644
index 00000000..4392b652
--- /dev/null
+++ b/scripts/multicloud-pike/generic_sim/generic_sim.py
@@ -0,0 +1,109 @@
+# Copyright 2018 Intel Corporation, Inc
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import json
+import logging
+
+import web
+from web import webapi
+import yaml
+
+urls = (
+ '/(.*)','MockController'
+)
+
+def setup_logger(name, log_file, level=logging.DEBUG):
+ print("Configuring the logger...")
+ handler = logging.FileHandler(log_file)
+ formatter = logging.Formatter('%(message)s')
+ handler.setFormatter(formatter)
+
+ logger = logging.getLogger(name)
+ logger.setLevel(level)
+ logger.addHandler(handler)
+
+ return logger
+
+
+class MockResponse:
+ def __init__(self, http_verb, status_code,
+ content_type="application/json", body="{}",
+ headers={}):
+ self.http_verb = http_verb.lower()
+ self.status_code = status_code
+ self.content_type = content_type
+ self.body = body
+ self.headers = headers
+
+def _parse_responses(parsed_responses):
+ result = {}
+ for path, responses in parsed_responses.iteritems():
+ new_path = path
+ if path.startswith("/"):
+ new_path = path[1:]
+
+ result[new_path] = []
+ for http_verb, response in responses.iteritems():
+ result[new_path].append(MockResponse(http_verb, **response))
+ return result
+
+def load_responses(filename):
+ print("Loading responses from configuration file..")
+ with open(filename) as yaml_file:
+ responses_file = yaml.safe_load(yaml_file)
+ responses_map = _parse_responses(responses_file)
+ return responses_map
+
+
+class MockController:
+
+ def _do_action(self, action):
+ logger.info('{}'.format(web.ctx.env.get('wsgi.input').read()))
+ action = action.lower()
+ url = web.ctx['fullpath']
+ try:
+ if url.startswith("/"):
+ url = url[1:]
+ response = [ r for r in responses_map[url] if r.http_verb == action][0]
+ for header, value in response.headers.iteritems():
+ web.header(header, value)
+ web.header('Content-Type', response.content_type)
+ print(response.body)
+ return response.body
+ except:
+ webapi.NotFound()
+
+ def DELETE(self, url):
+ return self._do_action("delete")
+
+ def HEAD(self, url):
+ return self._do_action("head")
+
+ def PUT(self, url):
+ return self._do_action("put")
+
+ def GET(self, url):
+ return self._do_action("get")
+
+ def POST(self, url):
+ return self._do_action("post")
+
+ def PATCH(self, url):
+ return self._do_action("patch")
+
+
+logger = setup_logger('mock_controller', '/tmp/generic_sim/output.log')
+responses_map = load_responses('/etc/generic_sim/responses.yml')
+app = web.application(urls, globals())
+if __name__ == "__main__":
+ app.run()
diff --git a/scripts/multicloud-pike/generic_sim/glance/responses.yml b/scripts/multicloud-pike/generic_sim/glance/responses.yml
new file mode 100644
index 00000000..d8422352
--- /dev/null
+++ b/scripts/multicloud-pike/generic_sim/glance/responses.yml
@@ -0,0 +1,73 @@
+/v2/images:
+ get:
+ body: '{"images": [{"status": "active", "schema": "/v2/schemas/image",
+ "virtual_size": null, "description": "", "tags": [], "container_format":
+ "bare", "created_at": "2018-04-21T06:12:13Z", "disk_format": "raw",
+ "updated_at": "2018-04-21T06:12:24Z", "visibility": "public", "id":
+ "660709df-e90b-471f-ac57-d8c2555e573d", "owner": "b8f5d85bbcd84af28d7caa62d39f05c7",
+ "protected": false, "min_ram": 0, "file": "/v2/images/660709df-e90b-471f-ac57-d8c2555e573d/file",
+ "checksum": "683f86920d4c922cb5c55d99d646b895", "min_disk": 0, "size":
+ 1697597440, "self": "/v2/images/660709df-e90b-471f-ac57-d8c2555e573d", "store":
+ "file", "name": "tis4-centos-guest"}], "first": "/v2/images", "schema":
+ "/v2/schemas/images"}'
+ content_type: application/json
+ status_code: 200
+/v2/schemas/image:
+ get:
+ body: '{"additionalProperties": {"type": "string"}, "name": "image",
+ "links": [{"href": "{self}", "rel": "self"}, {"href": "{file}",
+ "rel": "enclosure"}, {"href": "{schema}", "rel": "describedby"}],
+ "properties": {"container_format": {"enum": [null, "ami", "ari", "aki",
+ "bare", "ovf", "ova", "docker"], "type": ["null", "string"], "description":
+ "Format of the container"}, "min_ram": {"type": "integer", "description":
+ "Amount of ram (in MB) required to boot image."}, "ramdisk_id": {"pattern":
+ "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
+ "type": ["null", "string"], "description": "ID of image stored in Glance
+ that should be used as the ramdisk when booting an AMI-style image.", "is_base":
+ false}, "locations": {"items": {"required": ["url", "metadata"], "type":
+ "object", "properties": {"url": {"type": "string", "maxLength":
+ 255}, "metadata": {"type": "object"}}}, "type": "array", "description":
+ "A set of URLs to access the image file kept in external store"}, "file":
+ {"readOnly": true, "type": "string", "description": "An image file
+ url"}, "owner": {"type": ["null", "string"], "description": "Owner
+ of the image", "maxLength": 255}, "id": {"pattern": "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
+ "type": "string", "description": "An identifier for the image"}, "size":
+ {"readOnly": true, "type": ["null", "integer"], "description": "Size
+ of image file in bytes"}, "os_distro": {"type": "string", "description":
+ "Common name of operating system distribution as specified in https://docs.openstack.org/python-glanceclient/latest/cli/property-keys.html",
+ "is_base": false}, "self": {"readOnly": true, "type": "string", "description":
+ "An image self url"}, "disk_format": {"enum": [null, "ami", "ari",
+ "aki", "vhd", "vhdx", "vmdk", "raw", "qcow2", "vdi", "iso",
+ "ploop"], "type": ["null", "string"], "description": "Format of the
+ disk"}, "os_version": {"type": "string", "description": "Operating
+ system version as specified by the distributor", "is_base": false}, "direct_url":
+ {"readOnly": true, "type": "string", "description": "URL to access
+ the image file kept in external store"}, "schema": {"readOnly": true, "type":
+ "string", "description": "An image schema url"}, "status": {"readOnly":
+ true, "enum": ["queued", "saving", "active", "killed", "deleted",
+ "pending_delete", "deactivated"], "type": "string", "description":
+ "Status of the image"}, "tags": {"items": {"type": "string", "maxLength":
+ 255}, "type": "array", "description": "List of strings related to the
+ image"}, "kernel_id": {"pattern": "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
+ "type": ["null", "string"], "description": "ID of image stored in Glance
+ that should be used as the kernel when booting an AMI-style image.", "is_base":
+ false}, "visibility": {"enum": ["community", "public", "private",
+ "shared"], "type": "string", "description": "Scope of image accessibility"},
+ "updated_at": {"readOnly": true, "type": "string", "description":
+ "Date and time of the last image modification"}, "min_disk": {"type":
+ "integer", "description": "Amount of disk space (in GB) required to boot
+ image."}, "virtual_size": {"readOnly": true, "type": ["null", "integer"],
+ "description": "Virtual size of image in bytes"}, "instance_uuid": {"type":
+ "string", "description": "Metadata which can be used to record which instance
+ this image is associated with. (Informational only, does not create an instance
+ snapshot.)", "is_base": false}, "name": {"type": ["null", "string"],
+ "description": "Descriptive name for the image", "maxLength": 255}, "checksum":
+ {"readOnly": true, "type": ["null", "string"], "description": "md5
+ hash of image contents.", "maxLength": 32}, "created_at": {"readOnly":
+ true, "type": "string", "description": "Date and time of image registration"},
+ "protected": {"type": "boolean", "description": "If true, image will
+ not be deletable."}, "architecture": {"type": "string", "description":
+ "Operating system architecture as specified in https://docs.openstack.org/python-glanceclient/latest/cli/property-keys.html",
+ "is_base": false}}}'
+ content_type: application/json
+ status_code: 200
diff --git a/scripts/multicloud-pike/generic_sim/keystone/responses.yml b/scripts/multicloud-pike/generic_sim/keystone/responses.yml
new file mode 100644
index 00000000..422ec7b7
--- /dev/null
+++ b/scripts/multicloud-pike/generic_sim/keystone/responses.yml
@@ -0,0 +1,44 @@
+projects:
+ get:
+ body: '{"projects": [{"is_domain": false, "description": "admin tenant",
+ "links": {"self": "http://keystone:8080/v3/projects/b8f5d85bbcd84af28d7caa62d39f05c7"},
+ "enabled": true, "domain_id": "default", "parent_id": "default", "id":
+ "b8f5d85bbcd84af28d7caa62d39f05c7", "name": "admin"}, {"is_domain":
+ false, "description": "Tenant for the openstack services", "links": {"self":
+ "http://keystone:8080/v3/projects/3543226ffed44daf90a2f71f36c00b8d"},
+ "enabled": true, "domain_id": "default", "parent_id": "default", "id":
+ "3543226ffed44daf90a2f71f36c00b8d", "name": "services"}], "links": {"self":
+ "http://keystone:8080/v3/projects", "next": null, "previous": null}}'
+ content_type: application/json
+ status_code: 200
+v3/auth/tokens:
+ post:
+ body: '{"token": {"methods": ["password"], "expires_at": "2019-11-06T15:32:17.893769Z",
+ "user": { "domain": {"id": "default", "name": "Default"},
+ "id": "423f19a4ac1e4f48bbb4180756e6eb6c", "name": "admin", "password_expires_at": null },
+ "audit_ids": [ "ZzZwkUflQfygX7pdYDBCQQ"], "catalog": [
+ { "endpoints": [
+ { "id": "1", "interface": "public", "region": "RegionOne", "url": "http://keystone:8080" },
+ { "id": "2", "interface": "internal", "region": "RegionOne", "url": "http://keystone:8080" },
+ { "id": "3", "interface": "admin", "region": "RegionOne", "url": "http://keystone:8080" }
+ ], "id": "1", "type": "identity", "name": "keystone"},
+ { "endpoints": [
+ { "id": "1", "interface": "public", "region": "RegionOne", "url": "http://glance:8080" },
+ { "id": "2", "interface": "internal", "region": "RegionOne", "url": "http://glance:8080" },
+ { "id": "3", "interface": "admin", "region": "RegionOne", "url": "http://glance:8080" }
+ ], "id": "2", "type": "image", "name": "glance"},
+ { "endpoints": [
+ { "id": "1", "interface": "public", "region": "RegionOne", "url": "http://cinder:8080" },
+ { "id": "2", "interface": "internal", "region": "RegionOne", "url": "http://cinder:8080" },
+ { "id": "3", "interface": "admin", "region": "RegionOne", "url": "http://cinder:8080" }
+ ], "id": "2", "type": "volumev3", "name": "cinder"},
+ { "endpoints": [
+ { "id": "1", "interface": "public", "region": "RegionOne", "url": "http://nova:8080" },
+ { "id": "2", "interface": "internal", "region": "RegionOne", "url": "http://nova:8080" },
+ { "id": "3", "interface": "admin", "region": "RegionOne", "url": "http://nova:8080" }
+ ], "id": "3", "type": "compute", "name": "nova"}],
+ "issued_at": "2015-11-06T14:32:17.893797Z"}}'
+ content_type: application/json
+ status_code: 200
+ headers:
+ X-Subject-Token: 423f19a4ac1e4f48bbb4180756e6eb6c
diff --git a/scripts/multicloud-pike/generic_sim/log_parser.py b/scripts/multicloud-pike/generic_sim/log_parser.py
new file mode 100644
index 00000000..1334e608
--- /dev/null
+++ b/scripts/multicloud-pike/generic_sim/log_parser.py
@@ -0,0 +1,61 @@
+import argparse
+
+import yaml
+
+
+def _find_aai_response_content(inp):
+ return inp.split("||||")[1].split("with response content = ")[1]
+
+def _find_openstack_url(inp):
+ return inp.split("||||")[1].split("making request with URI:")[1]
+
+def _find_openstack_response_content(inp):
+ return inp.split("||||")[1].split("with content:")[1].replace("u'", "'")
+
+def _add_response(all_responses, url, http_verb, body, status_code=200, content_type="application/json"):
+ if url not in all_responses.keys():
+ all_responses[url] = {
+ http_verb: {
+ "status_code": status_code,
+ "content_type": content_type,
+ "body": body
+ }
+ }
+ elif http_verb not in all_responses[url].keys():
+ all_responses[url][http_verb] = {
+ "status_code": status_code,
+ "content_type": content_type,
+ "body": body
+ }
+
+def parse_lines(content, aai_ip):
+ aai_pattern = "https://%s:30233/" % aai_ip
+ openstack_pattern = "making request with URI:"
+
+ openstack_responses = {}
+ aai_responses = {}
+ for i, line in enumerate(content):
+ current_line = line.strip()
+ if aai_pattern in current_line and "DEBUG" not in current_line:
+ url = current_line.split(" ")[8][:-1].replace(aai_pattern, "")
+ _add_response(aai_responses, url, current_line.split(" ")[9][:-1],
+ _find_aai_response_content(content[i + 3]))
+ elif openstack_pattern in current_line:
+ _add_response(openstack_responses,
+ _find_openstack_url(current_line), "get",
+ _find_openstack_response_content(content[i + 2]))
+
+ return [
+ { "file": "nova.yml", "responses": openstack_responses },
+ { "file": "aai.yml", "responses": aai_responses }
+ ]
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description='Convert logs to responses YAML tree file.')
+ parser.add_argument('--log-file', type=argparse.FileType('r'), help="Log file to be parsed", required=True)
+ parser.add_argument('--aai-ip', help="A&AI IP Address", required=True)
+ args = parser.parse_args()
+
+ for mock_responses in parse_lines(args.log_file.readlines(), args.aai_ip):
+ with open(mock_responses["file"], 'w') as yaml_file:
+ yaml.dump(mock_responses["responses"], yaml_file, default_flow_style=False)
diff --git a/scripts/multicloud-pike/generic_sim/nova/responses.yml b/scripts/multicloud-pike/generic_sim/nova/responses.yml
new file mode 100644
index 00000000..94469711
--- /dev/null
+++ b/scripts/multicloud-pike/generic_sim/nova/responses.yml
@@ -0,0 +1,177 @@
+/flavors/110/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"hw:cpu_policy": "dedicated", "hw:mem_page_size":
+ "large", "hw:cpu_sockets": "2", "hw:cpu_threads": "8", "hw:numa_mem.1":
+ "2048", "hw:numa_mem.0": "2048", "hw:capabilities:cpu_info:features":
+ "avx,acpi", "aggregate_instance_extra_specs:storage": "local_image", "hw:numa_nodes":
+ "2", "hw:numa_cpus.0": "0,1", "hw:numa_cpus.1": "2,3,4,5", "hw:cpu_cores":
+ "4", "hw:cpu_thread_policy": "prefer", "pci_passthrough:alias": "sriov-vf-intel-8086-15b3:4"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/111/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"aggregate_instance_extra_specs:storage": "local_image"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/112/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"hw:cpu_policy": "dedicated", "hw:cpu_thread_policy":
+ "isolate", "aggregate_instance_extra_specs:storage": "local_image"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/113/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"hw:cpu_cores": "8", "hw:cpu_threads": "16",
+ "aggregate_instance_extra_specs:storage": "local_image", "hw:cpu_sockets":
+ "2"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/114/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"aggregate_instance_extra_specs:storage": "local_image",
+ "hw:mem_page_size": "small"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/115/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"hw:numa_mem.1": "1024", "hw:numa_mem.0": "1024",
+ "aggregate_instance_extra_specs:storage": "local_image", "hw:numa_nodes":
+ "2", "hw:numa_cpus.0": "0,1", "hw:numa_cpus.1": "2,3"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/116/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"hw:capabilities:cpu_info:features": "avx,aes",
+ "aggregate_instance_extra_specs:storage": "local_image"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/117/os-extra_specs:
+ get:
+ body: '{"extra_specs": {"aggregate_instance_extra_specs:storage": "local_image",
+ "pci_passthrough:alias": "sriov-vf-intel-8086-15b3:6"}}'
+ content_type: application/json
+ status_code: 200
+/flavors/detail:
+ get:
+ body: '{"flavors": [{"name": "f.small", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/100",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/100",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 2, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "100"}, {"name":
+ "onap.hpa.all", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/110",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/110",
+ "rel": "bookmark"}], "ram": 4096, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 6, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "110"}, {"name":
+ "onap.hpa.basic", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/111",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/111",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 4, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "111"}, {"name":
+ "onap.hpa.cpupinning", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/112",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/112",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 4, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "112"}, {"name":
+ "onap.hpa.cputopology", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/113",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/113",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 2, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "113"}, {"name":
+ "onap.hpa.hugepage", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/114",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/114",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 2, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "114"}, {"name":
+ "onap.hpa.numa", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/115",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/115",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 4, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "115"}, {"name":
+ "onap.hpa.instruction", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/116",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/116",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 2, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "116"}, {"name":
+ "onap.hpa.passthrough", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/117",
+ "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/117",
+ "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+ "vcpus": 2, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+ 1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "117"}]}'
+ content_type: application/json
+ status_code: 200
+/os-availability-zone/detail:
+ get:
+ body: '{"availabilityZoneInfo": [{"zoneState": {"available": true}, "hosts":
+ {"controller-0": {"nova-conductor": {"available": true, "active": true,
+ "updated_at": "2018-04-27T16:05:25.272674"}, "nova-consoleauth": {"available":
+ true, "active": true, "updated_at": "2018-04-27T16:05:21.875274"}, "nova-scheduler":
+ {"available": true, "active": true, "updated_at": "2018-04-27T16:05:25.286846"}}},
+ "zoneName": "internal"}, {"zoneState": {"available": false}, "hosts":
+ null, "zoneName": "nova"}]}'
+ content_type: application/json
+ status_code: 200
+/os-hypervisors/detail:
+ get:
+ body: '{
+ "hypervisors": [{
+ "status": "disabled",
+ "service": {
+ "host": "compute-0",
+ "disabled_reason": null,
+ "id": 11
+ },
+ "vcpus_used": 0.0,
+ "hypervisor_type": "QEMU",
+ "id": 1,
+ "local_gb_used": 0,
+ "state": "down",
+ "hypervisor_hostname": "compute-0",
+ "host_ip": "192.168.204.162",
+ "memory_mb": 51562,
+ "current_workload": 0,
+ "vcpus": 42,
+ "free_ram_mb": 51562,
+ "running_vms": 0,
+ "free_disk_gb": 1740,
+ "hypervisor_version": 2010000,
+ "disk_available_least": 1740,
+ "local_gb": 1833,
+ "cpu_info": "{\"vendor\": \"Intel\", \"model\": \"IvyBridge\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"xsaveopt\", \"clflush\", \"sep\", \"syscall\",\"tsc-deadline\",\"dtes64\",\"msr\",\"fsgsbase\",\"xsave\",\"vmx\",\"erms\",\"xtpr\",\"cmov\",\"smep\",\"pcid\",\"est\",\"pat\",\"monitor\",\"smx\",\"pbe\",\"lm\",\"tsc\",\"nx\",\"fxsr\",\"tm\",\"sse4.1\",\"pae\",\"sse4.2\",\"pclmuldq\",\"acpi\",\"vme\",\"popcnt\",\"mmx\",\"osxsave\",\"cx8\",\"mce\",\"de\",\"rdtscp\",\"ht\",\"dca\",\"lahf_lm\",\"pdcm\",\"mca\",\"pdpe1gb\",\"a pic\",\"sse\",\"f16c\",\"pse\",\"ds\",\"invtsc\",\"pni\",\"tm2\",\"aes\",\"sse2\",\"ss\",\"ds_cpl\",\"arat\",\"ssse3\",\"fpu\",\"cx16\",\"pse36\",\"mtrr\",\"rdrand\",\"x2apic\"],\"topology\": {\"cores\": 12,\"cells\": 2,\"threads\": 2,\"sockets\": 1}}",
+ "memory_mb_used ": 0
+ }]
+}'
+ content_type: application/json
+ status_code: 200
+/os-hypervisors/detail?hypervisor_hostname_pattern=controller-0:
+ get:
+ body: '{
+ "hypervisors": [{
+ "status": "disabled",
+ "service": {
+ "host": "compute-0",
+ "disabled_reason": null,
+ "id": 11
+ },
+ "vcpus_used": 0.0,
+ "hypervisor_type": "QEMU",
+ "id": 1,
+ "local_gb_used": 0,
+ "state": "down",
+ "hypervisor_hostname": "compute-0",
+ "host_ip": "192.168.204.162",
+ "memory_mb": 51562,
+ "current_workload": 0,
+ "vcpus": 42,
+ "free_ram_mb": 51562,
+ "running_vms": 0,
+ "free_disk_gb": 1740,
+ "hypervisor_version": 2010000,
+ "disk_available_least": 1740,
+ "local_gb": 1833,
+ "cpu_info": "{\"vendor\": \"Intel\", \"model\": \"IvyBridge\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"xsaveopt\", \"clflush\", \"sep\", \"syscall\",\"tsc-deadline\",\"dtes64\",\"msr\",\"fsgsbase\",\"xsave\",\"vmx\",\"erms\",\"xtpr\",\"cmov\",\"smep\",\"pcid\",\"est\",\"pat\",\"monitor\",\"smx\",\"pbe\",\"lm\",\"tsc\",\"nx\",\"fxsr\",\"tm\",\"sse4.1\",\"pae\",\"sse4.2\",\"pclmuldq\",\"acpi\",\"vme\",\"popcnt\",\"mmx\",\"osxsave\",\"cx8\",\"mce\",\"de\",\"rdtscp\",\"ht\",\"dca\",\"lahf_lm\",\"pdcm\",\"mca\",\"pdpe1gb\",\"a pic\",\"sse\",\"f16c\",\"pse\",\"ds\",\"invtsc\",\"pni\",\"tm2\",\"aes\",\"sse2\",\"ss\",\"ds_cpl\",\"arat\",\"ssse3\",\"fpu\",\"cx16\",\"pse36\",\"mtrr\",\"rdrand\",\"x2apic\"],\"topology\": {\"cores\": 12,\"cells\": 2,\"threads\": 2,\"sockets\": 1}}",
+ "memory_mb_used ": 0
+ }]
+}'
+ content_type: application/json
+ status_code: 200
diff --git a/scripts/multicloud-pike/generic_sim/requirements.txt b/scripts/multicloud-pike/generic_sim/requirements.txt
new file mode 100644
index 00000000..ac1d7dd7
--- /dev/null
+++ b/scripts/multicloud-pike/generic_sim/requirements.txt
@@ -0,0 +1,2 @@
+PyYAML
+web.py
diff --git a/scripts/music/cql/admin.cql b/scripts/music/cql/admin.cql
new file mode 100644
index 00000000..df13f32a
--- /dev/null
+++ b/scripts/music/cql/admin.cql
@@ -0,0 +1,34 @@
+CREATE KEYSPACE IF NOT EXISTS admin
+ WITH REPLICATION = {
+ 'class' : 'SimpleStrategy',
+ 'replication_factor': 1
+ }
+ AND DURABLE_WRITES = true;
+
+CREATE TABLE IF NOT EXISTS admin.keyspace_master (
+ uuid uuid,
+ keyspace_name text,
+ application_name text,
+ is_api boolean,
+ password text,
+ username text,
+ is_aaf boolean,
+ PRIMARY KEY (uuid)
+);
+
+CREATE TABLE IF NOT EXISTS admin.notification_master (
+ id uuid,
+ current_notifier text,
+ endpoint_password blob,
+ endpoint_userid text,
+ notify_delete_on text,
+ notify_insert_on text,
+ notify_to_endpoint text,
+ notify_update_on text,
+ notifyon text PRIMARY KEY,
+ request text
+);
+
+
+
+describe keyspace admin;
diff --git a/scripts/music/cql/admin_pw.cql b/scripts/music/cql/admin_pw.cql
new file mode 100644
index 00000000..02de61e2
--- /dev/null
+++ b/scripts/music/cql/admin_pw.cql
@@ -0,0 +1,2 @@
+CREATE ROLE IF NOT EXISTS nelson24 WITH PASSWORD = 'winman123' AND SUPERUSER = True AND LOGIN = True;
+ALTER ROLE cassandra WITH PASSWORD = 'SomeLongRandomStringNoonewillthinkof';
diff --git a/scripts/music/cql/extra/test.cql b/scripts/music/cql/extra/test.cql
new file mode 100644
index 00000000..6a587201
--- /dev/null
+++ b/scripts/music/cql/extra/test.cql
@@ -0,0 +1 @@
+DESCRIBE keyspace admin; \ No newline at end of file
diff --git a/scripts/music/music-properties/log4j.properties b/scripts/music/music-properties/log4j.properties
new file mode 100644
index 00000000..1312e9bb
--- /dev/null
+++ b/scripts/music/music-properties/log4j.properties
@@ -0,0 +1,3 @@
+# No longer needed, please see the logback properties
+
+
diff --git a/scripts/music/music-properties/music.properties b/scripts/music/music-properties/music.properties
new file mode 100644
index 00000000..02fb52df
--- /dev/null
+++ b/scripts/music/music-properties/music.properties
@@ -0,0 +1,17 @@
+my.public.ip=localhost
+all.public.ips=localhost
+my.id=0
+all.ids=0
+#######################################
+# Optional current values are defaults
+#######################################
+zookeeper.host=music-zk
+cassandra.host=music-db
+#music.ip=localhost
+#debug=true
+#music.rest.ip=localhost
+#lock.lease.period=6000
+cassandra.user=nelson24
+cassandra.password=winman123
+
+
diff --git a/scripts/music/music-scripts/music_script.sh b/scripts/music/music-scripts/music_script.sh
new file mode 100755
index 00000000..f16062ad
--- /dev/null
+++ b/scripts/music/music-scripts/music_script.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+echo "######################################################################"
+echo "### "
+echo "### This is ${WORKSPACE}/test/csit/scripts/music/music-scripts/music_script.sh"
+echo "### "
+echo "######################################################################"
+#
+# add here whatever commands is needed to prepare the music CSIT testing
+#
+
diff --git a/scripts/music/music-scripts/wait_for_port.sh b/scripts/music/music-scripts/wait_for_port.sh
new file mode 100755
index 00000000..10f08ded
--- /dev/null
+++ b/scripts/music/music-scripts/wait_for_port.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+if [[ $# -ne 2 ]]; then
+ echo "Usage: wait-for-port hostname port" >&2
+ exit 1
+fi
+
+host=$1
+port=$2
+
+echo "Waiting for $host port $port open"
+until telnet $host $port </dev/null 2>/dev/null | grep -q '^Connected'; do
+ sleep 1
+done
+
+echo "$host port $port is open"
+
+exit 0
diff --git a/scripts/nfvo-wfengine/demo.bpmn20.xml b/scripts/nfvo-wfengine/demo.bpmn20.xml
new file mode 100644
index 00000000..4f0c83a6
--- /dev/null
+++ b/scripts/nfvo-wfengine/demo.bpmn20.xml
@@ -0,0 +1,11 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
+ <process id="demo" name="demofirst" isExecutable="true">
+ <startEvent id="sid-6B31A927-8A0F-4A2F-BC58-A2E3D90327D2"/>
+ <userTask id="sid-FDC595C2-41CE-4DE8-86D4-562414F0A0F3"/>
+ <sequenceFlow id="sid-B7ABA5B4-FB87-486C-B7D7-CC0FE5A4CE31" sourceRef="sid-6B31A927-8A0F-4A2F-BC58-A2E3D90327D2" targetRef="sid-FDC595C2-41CE-4DE8-86D4-562414F0A0F3"/>
+ <endEvent id="sid-EEACC228-A53D-41E8-96A1-8F2E4BF38596"/>
+ <sequenceFlow id="sid-07534141-12BB-49F0-9288-137A4E0BC8D8" sourceRef="sid-FDC595C2-41CE-4DE8-86D4-562414F0A0F3" targetRef="sid-EEACC228-A53D-41E8-96A1-8F2E4BF38596"/>
+ </process>
+
+</definitions> \ No newline at end of file
diff --git a/scripts/optf-has/has/has-properties/cert.cer b/scripts/optf-has/has/has-properties/cert.cer
new file mode 100644
index 00000000..67bb1303
--- /dev/null
+++ b/scripts/optf-has/has/has-properties/cert.cer
@@ -0,0 +1,36 @@
+-----BEGIN CERTIFICATE-----
+MIIGFjCCBP6gAwIBAgIQaTKJblnN1egdvyJmqxK6TDANBgkqhkiG9w0BAQsFADB+
+MQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAd
+BgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxLzAtBgNVBAMTJlN5bWFudGVj
+IENsYXNzIDMgU2VjdXJlIFNlcnZlciBDQSAtIEc0MB4XDTE3MDgzMTAwMDAwMFoX
+DTE4MDgzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhNaWNoaWdh
+bjETMBEGA1UEBwwKU291dGhmaWVsZDEcMBoGA1UECgwTQVQmVCBTZXJ2aWNlcywg
+SW5jLjESMBAGA1UECwwJQ29uZHVjdG9yMSYwJAYDVQQDDB1lY29tcC1wZXctOTct
+MDE3LnBlZGMuc2JjLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ANiCKEitPcCKcmTTmvuwItG34wVOhhWuha1GQ9KeW/JmKgDWYM/7BwKmT6FhrSWe
+998UKHKC+MriZKI6WsBoENu070zTyyphQ0SwTw7QZbeCpgrvSBv6+q9qWpkGZEQN
+OgZ4IOVQX1asqh+qmUuVKWIAN1AF60iMb+Krqr04FX/N+3N9wLFfOJIS80Ycrxwa
+2Kjqza9awVXOtuTHPa4hFqz7ggRoi7Ybdr8GyxNoXTP0QNCBsYYmjuTFnbfCnC/j
+d/1zMn3D6G4eihnTnUB9jhM+Jj85IXcgAG5um/jEjN7qxmi+kURFl6AbadmgTCca
+aIW1rOHZtR4vlA/sRWqSh28CAwEAAaOCAnwwggJ4MCgGA1UdEQQhMB+CHWVjb21w
+LXBldy05Ny0wMTcucGVkYy5zYmMuY29tMAkGA1UdEwQCMAAwDgYDVR0PAQH/BAQD
+AgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBhBgNVHSAEWjBYMFYG
+BmeBDAECAjBMMCMGCCsGAQUFBwIBFhdodHRwczovL2Quc3ltY2IuY29tL2NwczAl
+BggrBgEFBQcCAjAZDBdodHRwczovL2Quc3ltY2IuY29tL3JwYTAfBgNVHSMEGDAW
+gBRfYM9hkFXfhEMUimAqsvV69EMY7zArBgNVHR8EJDAiMCCgHqAchhpodHRwOi8v
+c3Muc3ltY2IuY29tL3NzLmNybDBXBggrBgEFBQcBAQRLMEkwHwYIKwYBBQUHMAGG
+E2h0dHA6Ly9zcy5zeW1jZC5jb20wJgYIKwYBBQUHMAKGGmh0dHA6Ly9zcy5zeW1j
+Yi5jb20vc3MuY3J0MIIBBgYKKwYBBAHWeQIEAgSB9wSB9ADyAHcA3esdK3oNT6Yg
+i4GtgWhwfi6OnQHVXIiNPRHEzbbsvswAAAFeOADGyAAABAMASDBGAiEAzYxTfoKt
+RnxlePKnJ0sCqLOvdd223T7CjqNsqbgmxfECIQC6FOBOe9J+a1poasZ7QfCVl9g2
+McAdcKofxp21Qw1DhwB3AKS5CZC0GFgUh7sTosxncAo8NZgE+RvfuON3zQ7IDdwQ
+AAABXjgAxuAAAAQDAEgwRgIhAIUbjCQBxcxAXBT3MS77jIR3Lw90Y622+JGAuhH7
+PASuAiEAzblNSNu2GDHu/KINsiX4apBzXgSw5J8BM9LCAYPmUogwDQYJKoZIhvcN
+AQELBQADggEBAIwOqd+U0iRFSt68vWh1ErMeY0I7Re/81cm17cAn1cQuhTNKFUwq
+lYnVXZHFBkGhVAU0vXAI59XN29TQ3sjBlmfDdtxAJ3PzITBxeHswJjnqCaslEGik
+sbdK4/cwCjWmAN0azKtUmKhH3ajnjyduWdlvCx5hsUdFmYGZ1yl+1QbTrwkkU9JB
+bYjHNbtca0Orq8JlfZlc6L9vO6LNU6+qa9NTkLs2qd3rsCOXUiAWhGBdARB+a0AT
+1ukrZDS2BZ6fUDmG2XxUsRPqUwuVNAb8NgOc0zLNaAe8CpU6fVzek1fZnL0KkJmK
+jJnnuCr6AOteod19VIChd54mo0QtFm+i/Ww=
+-----END CERTIFICATE-----
+
diff --git a/scripts/optf-has/has/has-properties/cert.key b/scripts/optf-has/has/has-properties/cert.key
new file mode 100644
index 00000000..b8a957ff
--- /dev/null
+++ b/scripts/optf-has/has/has-properties/cert.key
@@ -0,0 +1,28 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpQIBAAKCAQEA2IIoSK09wIpyZNOa+7Ai0bfjBU6GFa6FrUZD0p5b8mYqANZg
+z/sHAqZPoWGtJZ733xQocoL4yuJkojpawGgQ27TvTNPLKmFDRLBPDtBlt4KmCu9I
+G/r6r2pamQZkRA06Bngg5VBfVqyqH6qZS5UpYgA3UAXrSIxv4quqvTgVf837c33A
+sV84khLzRhyvHBrYqOrNr1rBVc625Mc9riEWrPuCBGiLtht2vwbLE2hdM/RA0IGx
+hiaO5MWdt8KcL+N3/XMyfcPobh6KGdOdQH2OEz4mPzkhdyAAbm6b+MSM3urGaL6R
+REWXoBtp2aBMJxpohbWs4dm1Hi+UD+xFapKHbwIDAQABAoIBAQCQVn1arjwL34CR
+3UxmXK9p1si/YfEcBURTFxPiFva/bAK2mjTikrzCtHND6GVRPmCLVNn+NXh9cV6b
+lIGp4fbTMhWSx2ObdkotQckC3EXjiHL/uTP+i1ySkzmg6NTxVUwIwg9UMTfOBcBI
+6ifWbrOvBOvbKocHz7BLkhx6lygmEccyiy3wD/a/NBTRFTBLFyGrNBh2/a9ZXRqs
+Gz1IxVSdxrNJZUoi1nKbBTOX5lKyjL0AyAkIEzC4MvgEBcGz5xZHFRF1cj4x0ajc
+xEDsRUv0hi3Vczw5/FfKVWUVQPmY7sqpLtvu9qnb9MeZFwtrVZBxG5Ik4LP0Sjxt
+0B1+EHYpAoGBAPeOpR1co9pJa8tgkObZWehrVd+VEMD9UM5SKfYYn/2FyVMl1/TH
+Z6SqB7e1aNYsT5oUDt5y3g+tG3i/r4zmE4OzwT/9neb/rVBsKdd5cPICVnhHajYu
+bdOKoCNEMBrQRBSBAeSK0IjbUYIMyre1bwhxU7HT5NzGJnLYBn4vx0BNAoGBAN/k
+bxLQpsYcMwAX4K0H42qI1yL4jlezv4zj+kDRAI9Szh94c2yxGBC4rAub3Igz1OlQ
+CfqPimvlnkWrhgz50+0CdJFPEQyC0+d2rzS7i816k8WYUYCDkrTJhr64eFnV1jjs
+AuLpnhF0WpqvrixBzf5ZENPV3C8k4HG4KrYjDuSrAoGBALeDELdRY01/u97JuODI
+IrP+TWwujnrhzbMEiYKbAo7nTDTNCuezogsY2BvA6PRLaL7pO5R/RkoMox7ByhsC
+u1iYOht7oEALLKk/ZU0MA0QDo6IKHpwHkvaL/uXluFtIJA+nCoYmuSuamTN01BmW
+77YsfESItVFLuljL9xQ3ytbJAoGAVqkd0SOQGgiaOQQFBBSUkwzqcO/ScOHzV756
+hBIh7Ff5zraZvs2Bah+BAHFQ2Ctv0usXIbPjuUXEkGUG2wjsXcXghsoa6EPPb71B
+reCWCW/TuNzvVxYWeAG1NSdD9knNxHSd3WTduRXXaB5uBVVnPXcOC2Cw/FKCyaGm
+bp99SUcCgYEAxzGq0cxFedF7TAQLjIMagsGIAatokzDvvQOvOK0lWZ+f17G+LV9Y
+tLpnvS6IdGnki6Kvg9Xa0F4eP7YoY4laHxl2DEceP/TeMLNHetM9cXCPKwP7w/24
+5mZlQ0t/HdVnjc1uDvkeHR6HVxnXTyWtKBJ0FtC6SfdRgK20YYFrKAQ=
+-----END RSA PRIVATE KEY-----
+
diff --git a/scripts/optf-has/has/has-properties/cert.pem b/scripts/optf-has/has/has-properties/cert.pem
new file mode 100644
index 00000000..5ecf3823
--- /dev/null
+++ b/scripts/optf-has/has/has-properties/cert.pem
@@ -0,0 +1,36 @@
+Bag Attributes
+ friendlyName: mso-client
+ localKeyID: 54 69 6D 65 20 31 35 31 39 32 39 37 30 37 31 32 33 33
+subject=/C=US/ST=Michigan/L=Southfield/O=AT&T Services, Inc./OU=mso-bpel-client-mtanj/CN=msobpel-client.mtanj.aic.cip.att.com
+issuer=/C=US/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA
+-----BEGIN CERTIFICATE-----
+MIIFZDCCBEygAwIBAgIQCDZ0gBbsclD2Ino3w+NqPDANBgkqhkiG9w0BAQsFADBN
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMScwJQYDVQQDEx5E
+aWdpQ2VydCBTSEEyIFNlY3VyZSBTZXJ2ZXIgQ0EwHhcNMTgwMTE5MDAwMDAwWhcN
+MTkwMTE5MTIwMDAwWjCBojELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE1pY2hpZ2Fu
+MRMwEQYDVQQHEwpTb3V0aGZpZWxkMRwwGgYDVQQKDBNBVCZUIFNlcnZpY2VzLCBJ
+bmMuMR4wHAYDVQQLExVtc28tYnBlbC1jbGllbnQtbXRhbmoxLTArBgNVBAMTJG1z
+b2JwZWwtY2xpZW50Lm10YW5qLmFpYy5jaXAuYXR0LmNvbTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAOJtbcWtMUYCIgIvdqm2CPN/cVTD8j3fDAsd42vn
+7I3PYJ4aBu8tiJVRheJhj9mejfwjBd5f5E2z9kWfNMPZU/9q0RB+cYbKWv0lP+q5
+q/RkbXN7iRtGUkXUyNpekvxNT3IKYfXK3P29qVDVhvUSey2ngIALRvBrRIKRTmb8
+gzrvcavJSwm8oQw2JXE1+Da+8PYR3TjJ19nfmoTmKbO+QDD58I5+2TgNqd/b7zhN
+GLaS3oiVONDmJ1b5iWwKg31otPDP8AJb7cNtl8vgfnGK2zvFIWnF2TRzMb6FePbn
+JBLaEyi7+c1iKJafj61t5nn27I2psbJloT9/2fmb6l4NU8MCAwEAAaOCAegwggHk
+MB8GA1UdIwQYMBaAFA+AYRyCMWHVLyjnjUY4tCzhxtniMB0GA1UdDgQWBBSQcljn
+BCxIKpisBfyoNgGCdtPzBzAvBgNVHREEKDAmgiRtc29icGVsLWNsaWVudC5tdGFu
+ai5haWMuY2lwLmF0dC5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsG
+AQUFBwMBBggrBgEFBQcDAjBrBgNVHR8EZDBiMC+gLaArhilodHRwOi8vY3JsMy5k
+aWdpY2VydC5jb20vc3NjYS1zaGEyLWc2LmNybDAvoC2gK4YpaHR0cDovL2NybDQu
+ZGlnaWNlcnQuY29tL3NzY2Etc2hhMi1nNi5jcmwwTAYDVR0gBEUwQzA3BglghkgB
+hv1sAQEwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQ
+UzAIBgZngQwBAgIwfAYIKwYBBQUHAQEEcDBuMCQGCCsGAQUFBzABhhhodHRwOi8v
+b2NzcC5kaWdpY2VydC5jb20wRgYIKwYBBQUHMAKGOmh0dHA6Ly9jYWNlcnRzLmRp
+Z2ljZXJ0LmNvbS9EaWdpQ2VydFNIQTJTZWN1cmVTZXJ2ZXJDQS5jcnQwCQYDVR0T
+BAIwADANBgkqhkiG9w0BAQsFAAOCAQEAxkadmzFcpA3f3qc9PbzMWfV2lJCXWxfr
+/6z4RXotl255GBZFR2zLn56k8J3hAJGWRc0WeSgSsLH1fxrxF60fWk+cmYCrMC9t
+C5ha5zWav/kz+dkZvJVbUxIFdx0Cd5uqBsLFnAaGrnSR6WzJkZHQ2rQUvwvQXwdP
+XL01FleDSNbV8jtHXvzmcdnVQWeLjcVOeOeBF3dW6lSvDRV0G6fe6+R9U+Gz0MwK
+x93XbsIAMTCJKUBkV7QdHwHzis3fhKJHwJUrb1p2Byhn/RwYUmFbjkamFiEfAyzw
++KdkwripOgYHnmGyLBJ16FdO/8kGhn4URW/qL1FO/sN2loGGlyA82w==
+-----END CERTIFICATE-----
diff --git a/scripts/optf-has/has/has-properties/conductor.conf.onap b/scripts/optf-has/has/has-properties/conductor.conf.onap
new file mode 100644
index 00000000..2c5b8d6c
--- /dev/null
+++ b/scripts/optf-has/has/has-properties/conductor.conf.onap
@@ -0,0 +1,378 @@
+
+[DEFAULT]
+
+#
+# From conductor
+#
+
+# Configuration file for WSGI definition of API. (string value)
+#api_paste_config = api_paste.ini
+
+# Music keyspace for content (string value)
+keyspace = conductor
+
+#
+# From oslo.log
+#
+
+# If set to true, the logging level will be set to DEBUG instead of the default
+# INFO level. (boolean value)
+# Note: This option can be changed without restarting.
+debug = true
+
+# DEPRECATED: If set to false, the logging level will be set to WARNING instead
+# of the default INFO level. (boolean value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+#verbose = true
+
+# The name of a logging configuration file. This file is appended to any
+# existing logging configuration files. For details about logging configuration
+# files, see the Python logging module documentation. Note that when logging
+# configuration files are used then all logging configuration is set in the
+# configuration file and other logging configuration options are ignored (for
+# example, logging_context_format_string). (string value)
+# Note: This option can be changed without restarting.
+# Deprecated group/name - [DEFAULT]/log_config
+log_config_append = /usr/local/bin/log.conf
+
+# Defines the format string for %%(asctime)s in log records. Default:
+# %(default)s . This option is ignored if log_config_append is set. (string
+# value)
+log_date_format = %d-%m-%Y %H:%M:%S
+
+# (Optional) Name of log file to send logging output to. If no default is set,
+# logging will go to stderr as defined by use_stderr. This option is ignored if
+# log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logfile
+#log_file = application.log
+
+
+# (Optional) The base directory used for relative log_file paths. This option
+# is ignored if log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logdir
+log_dir = /var/log
+
+
+
+
+# Uses logging handler designed to watch file system. When log file is moved or
+# removed this handler will open a new log file with specified path
+# instantaneously. It makes sense only if log_file option is specified and
+# Linux platform is used. This option is ignored if log_config_append is set.
+# (boolean value)
+#watch_log_file = false
+
+# Use syslog for logging. Existing syslog format is DEPRECATED and will be
+# changed later to honor RFC5424. This option is ignored if log_config_append
+# is set. (boolean value)
+#use_syslog = false
+
+# Syslog facility to receive log lines. This option is ignored if
+# log_config_append is set. (string value)
+#syslog_log_facility = LOG_USER
+
+# Log output to standard error. This option is ignored if log_config_append is
+# set. (boolean value)
+#use_stderr = false
+
+# Format string to use for log messages with context. (string value)
+#logging_context_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
+
+# Format string to use for log messages when context is undefined. (string
+# value)
+#logging_default_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
+
+# Additional data to append to log message when logging level for the message
+# is DEBUG. (string value)
+#logging_debug_format_suffix = %(funcName)s %(pathname)s:%(lineno)d
+
+# Prefix each line of exception output with this format. (string value)
+#logging_exception_prefix = %(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s
+
+# Defines the format string for %(user_identity)s that is used in
+# logging_context_format_string. (string value)
+#logging_user_identity_format = %(user)s %(tenant)s %(domain)s %(user_domain)s %(project_domain)s
+
+# List of package logging levels in logger=LEVEL pairs. This option is ignored
+# if log_config_append is set. (list value)
+#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN,taskflow=WARN,keystoneauth=WARN,oslo.cache=INFO,dogpile.core.dogpile=INFO
+
+# Enables or disables publication of error events. (boolean value)
+#publish_errors = false
+
+# The format for an instance that is passed with the log message. (string
+# value)
+#instance_format = "[instance: %(uuid)s] "
+
+# The format for an instance UUID that is passed with the log message. (string
+# value)
+#instance_uuid_format = "[instance: %(uuid)s] "
+
+# Interval, number of seconds, of log rate limiting. (integer value)
+#rate_limit_interval = 0
+
+# Maximum number of logged messages per rate_limit_interval. (integer value)
+#rate_limit_burst = 0
+
+# Log level name used by rate limiting: CRITICAL, ERROR, INFO, WARNING, DEBUG
+# or empty string. Logs with level greater or equal to rate_limit_except_level
+# are not filtered. An empty string means that all levels are filtered. (string
+# value)
+#rate_limit_except_level = CRITICAL
+
+# Enables or disables fatal status of deprecations. (boolean value)
+#fatal_deprecations = false
+
+
+[aai]
+
+#
+# From conductor
+#
+
+# Interval with which to refresh the local cache, in minutes. (integer value)
+cache_refresh_interval = 1
+complex_cache_refresh_interval = 60
+
+# Data Store table prefix. (string value)
+#table_prefix = aai
+
+# Base URL for A&AI, up to and including the version. (string value)
+server_url = http://localhost:8081/aai/
+
+
+# The version of A&AI (string value)
+server_url_version = v13
+
+# SSL/TLS certificate file in pem format. This certificate must be registered
+# with the A&AI endpoint. (string value)
+certificate_file = /usr/local/bin/cert.cer
+
+# Private Certificate Key file in pem format. (string value)
+certificate_key_file = /usr/local/bin/cert.key
+
+# Certificate Authority Bundle file in pem format. Must contain the appropriate
+# trust chain for theCertificate file. (string value)
+certificate_authority_bundle_file = /usr/local/bin/cert.pem
+
+[api]
+
+#
+# From conductor
+#
+
+# Toggle Pecan Debug Middleware. (boolean value)
+#pecan_debug = false
+
+# Default maximum number of items returned by API request. (integer value)
+# Minimum value: 1
+#default_api_return_limit = 100
+
+[conductor_api]
+
+# Basic Authentication Username (string value)
+username = admin1
+
+# Basic Authentication Password (string value)
+password = plan.15
+
+# To disable basic_auth_secure = false and to enable basic_auth_secure = true
+basic_auth_secure = false
+
+
+
+[controller]
+
+#
+# From conductor
+#
+
+# Timeout for planning requests. Default value is 10. (integer value)
+# Minimum value: 1
+#timeout = 10
+
+# Maximum number of result sets to return. Default value is 1. (integer value)
+# Minimum value: 1
+#limit = 1
+
+# Number of workers for controller service. Default value is 1. (integer value)
+# Minimum value: 1
+#workers = 1
+
+
+[inventory_provider]
+
+#
+# From conductor
+#
+
+# Extensions list to use (list value)
+# extensions = aai
+
+
+[messaging_server]
+
+#
+# From conductor
+#
+
+# Music keyspace for messages (string value)
+keyspace = conductor_rpc
+
+# Wait interval while checking for a message response. Default value is 1
+# second. (integer value)
+# Minimum value: 1
+#check_interval = 1
+
+# Overall message response timeout. Default value is 10 seconds. (integer
+# value)
+# Minimum value: 1
+timeout = 3600
+
+# Number of workers for messaging service. Default value is 1. (integer value)
+# Minimum value: 1
+#workers = 1
+
+# Time between checking for new messages. Default value is 1. (integer value)
+# Minimum value: 1
+#polling_interval = 1
+
+# Log debug messages. Default value is False. (boolean value)
+#debug = false
+
+
+[music_api]
+
+#
+# From conductor
+#
+music_new_version = True
+
+# Base URL for Music REST API without a trailing slash. (string value)
+server_url = http://localhost:8080/MUSIC/rest/v2
+version = v2
+music_version = "2.5.3"
+aafuser = conductor
+aafpass = c0nduct0r
+aafns = conductor
+
+# DEPRECATED: List of hostnames (round-robin access) (list value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Use server_url instead
+
+# DEPRECATED: Port (integer value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Use server_url instead
+#port = <None>
+
+# DEPRECATED: Path (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Use server_url instead
+#path = <None>
+
+# Lock timeout (integer value)
+#lock_timeout = 10
+
+# Replication factor (integer value)
+#replication_factor = 1
+
+# debug = false
+
+[reservation]
+
+#
+# From conductor
+#
+
+# Number of workers for reservation service. Default value is 1. (integer
+# value)
+# Minimum value: 1
+#workers = 1
+
+# Number of times reservation/release should be attempted. (integer value)
+#reserve_retries = 3
+
+# Set to True when reservation will run in active-active mode. When set to
+# False, reservation will restart any orphaned reserving requests at startup.
+# (boolean value)
+#concurrent = false
+
+[sdnc]
+
+#
+# From conductor
+#
+
+# Interval with which to refresh the local cache, in minutes. (integer value)
+#cache_refresh_interval = 1440
+
+# Data Store table prefix. (string value)
+#table_prefix = sdnc
+
+# Base URL for SDN-C. (string value)
+server_url = http://localhost:8083/restconf/
+
+# Basic Authentication Username (string value)
+username = admin
+
+# Basic Authentication Password (string value)
+password = admin
+
+
+[service_controller]
+
+#
+# From conductor
+#
+
+# Extensions list to use (list value)
+extensions = sdnc
+
+[solver]
+
+#
+# From conductor
+#
+
+# Number of workers for solver service. Default value is 1. (integer value)
+# Minimum value: 1
+#workers = 1
+
+# Set to True when solver will run in active-active mode. When set to False,
+# solver will restart any orphaned solving requests at startup. (boolean value)
+#concurrent = false
+
+
+[multicloud]
+
+#
+# From conductor
+#
+
+# Base URL for Multicloud without a trailing slash. (string value)
+server_url = http://msb.onap.org:8082/api/multicloud
+
+# Timeout for Multicloud Rest Call (string value)
+multicloud_rest_timeout = 30
+
+# Number of retry for Multicloud Rest Call (string value)
+multicloud_retries = 3
+
+# The version of Multicloud API. (string value)
+server_url_version = v0
+
+
+
+[vim_controller]
+
+#
+# From conductor
+#
+
+# Extensions list to use (list value)
+extensions = multicloud
+
diff --git a/scripts/optf-has/has/has-properties/log.conf.onap b/scripts/optf-has/has/has-properties/log.conf.onap
new file mode 100644
index 00000000..41d66444
--- /dev/null
+++ b/scripts/optf-has/has/has-properties/log.conf.onap
@@ -0,0 +1,65 @@
+[loggers]
+keys=root
+
+[handlers]
+keys=trfhand,consoleHandler,audithand,metrichand,errhand,debughand
+
+[logger_root]
+level=NOTSET
+handlers=trfhand,consoleHandler,audithand,metrichand,errhand,debughand
+
+[handler_consoleHandler]
+class=StreamHandler
+level=NOTSET
+formatter=generic
+args=(sys.stdout,)
+
+[handler_trfhand]
+class=handlers.TimedRotatingFileHandler
+level=NOTSET
+formatter=generic
+args=('application.log','midnight', 1, 10)
+
+[handler_audithand]
+class=handlers.TimedRotatingFileHandler
+level=INFO
+formatter=audit
+args=('audit.log', 'midnight', 1, 10)
+
+[handler_metrichand]
+class=handlers.TimedRotatingFileHandler
+level=INFO
+formatter=metric
+args=('metric.log','midnight', 1, 10)
+
+[handler_errhand]
+class=handlers.TimedRotatingFileHandler
+level=ERROR
+formatter=error
+args=('error.log','midnight', 1, 10)
+
+[handler_debughand]
+class=handlers.TimedRotatingFileHandler
+level=DEBUG
+formatter=generic
+args=('debug.log','midnight', 1, 10)
+
+[formatters]
+keys=generic,audit,metric,error
+
+[formatter_audit]
+format=%(asctime)s|%(asctime)s|00000000-0000-0000-0000-000000000000||%(thread)d||Conductor|N/A|COMPLETE|200|sucessful||%(levelname)s|||0|%(module)s|||||||||%(name)s : [-] %(message)s
+datefmt=
+
+[formatter_metric]
+format=%(asctime)s|%(asctime)s|00000000-0000-0000-0000-000000000000||%(thread)d||Conductor|N/A|N/A|N/A|COMPLETE|200|sucessful||%(levelname)s|||0|%(module)s||||||||||%(name)s : [-] %(message)s
+datefmt=
+
+[formatter_error]
+format=%(asctime)s|00000000-0000-0000-0000-000000000000|%(thread)d|Conductor|N/A|N/A|N/A|ERROR|500|N/A|%(name)s : [-] %(message)s
+datefmt=
+
+[formatter_generic]
+format=%(asctime)s||%(thread)d|%(levelname)s|%(module)s|%(name)s: [-] %(message)s
+datefmt=
+
diff --git a/scripts/optf-has/has/has_proxy_settings.sh b/scripts/optf-has/has/has_proxy_settings.sh
new file mode 100755
index 00000000..92f8d93c
--- /dev/null
+++ b/scripts/optf-has/has/has_proxy_settings.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# put into this file local proxy settings in case they are needed on your local environment
+echo "### This is ${WORKSPACE}/test/csit/scripts/optf-has/has/has_proxy_settings.sh"
+
+echo "optf/has proxy settings"
+if [ "$#" -eq "1" ]; then
+ echo "$1"
+ cd $1
+ pwd
+else
+ exit 1
+fi
+
+# don't remove following lines: commands can be attached here
+
+
diff --git a/scripts/optf-has/has/has_script.sh b/scripts/optf-has/has/has_script.sh
new file mode 100755
index 00000000..2d2eff3b
--- /dev/null
+++ b/scripts/optf-has/has/has_script.sh
@@ -0,0 +1,97 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+echo "### This is ${WORKSPACE}/test/csit/scripts/optf-has/has/has_script.sh"
+#
+# add here whatever commands is needed to prepare the optf/has CSIT testing
+#
+
+# assume the base is /tmp dir
+DIR=/tmp
+
+# the directory of the script
+echo ${DIR}
+cd ${DIR}
+
+# create directory for volume and copy configuration file
+# run docker containers
+COND_CONF=/tmp/conductor/properties/conductor.conf
+LOG_CONF=/tmp/conductor/properties/log.conf
+IMAGE_NAME=nexus3.onap.org:10001/onap/optf-has
+IMAGE_VER=1.2.1-SNAPSHOT-latest
+CERT=/tmp/conductor/properties/cert.cer
+KEY=/tmp/conductor/properties/cert.key
+BUNDLE=/tmp/conductor/properties/cert.pem
+
+mkdir -p /tmp/conductor/properties
+mkdir -p /tmp/conductor/logs
+cp ${WORKSPACE}/test/csit/scripts/optf-has/has/has-properties/conductor.conf.onap /tmp/conductor/properties/conductor.conf
+cp ${WORKSPACE}/test/csit/scripts/optf-has/has/has-properties/log.conf.onap /tmp/conductor/properties/log.conf
+cp ${WORKSPACE}/test/csit/scripts/optf-has/has/has-properties/cert.cer /tmp/conductor/properties/cert.cer
+cp ${WORKSPACE}/test/csit/scripts/optf-has/has/has-properties/cert.key /tmp/conductor/properties/cert.key
+cp ${WORKSPACE}/test/csit/scripts/optf-has/has/has-properties/cert.pem /tmp/conductor/properties/cert.pem
+#chmod -R 777 /tmp/conductor/properties
+
+MUSIC_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' music-tomcat`
+echo "MUSIC_IP=${MUSIC_IP}"
+
+# change MUSIC reference to the local instance
+sed -i -e "s%localhost:8080/MUSIC%${MUSIC_IP}:8080/MUSIC%g" /tmp/conductor/properties/conductor.conf
+
+AAISIM_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' aaisim`
+echo "AAISIM_IP=${AAISIM_IP}"
+
+# change AAI reference to the local instance
+sed -i -e "s%localhost:8081/%${AAISIM_IP}:8081/%g" /tmp/conductor/properties/conductor.conf
+
+MULTICLOUDSIM_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' multicloudsim`
+echo "MULTICLOUDSIM_IP=${MULTICLOUDSIM_IP}"
+
+# change MULTICLOUD reference to the local instance
+sed -i -e "s%msb.onap.org:8082/%${MULTICLOUDSIM_IP}:8082/%g" /tmp/conductor/properties/conductor.conf
+
+#onboard conductor into music
+echo "Query MUSIC to check for reachability. Query Version"
+curl -vvvvv --noproxy "*" --request GET http://${MUSIC_IP}:8080/MUSIC/rest/v2/version -H "Content-Type: application/json"
+
+echo "Onboard conductor into music"
+curl -vvvvv --noproxy "*" --request POST http://${MUSIC_IP}:8080/MUSIC/rest/v2/admin/onboardAppWithMusic -H "Content-Type: application/json" --data @${WORKSPACE}/test/csit/tests/optf-has/has/data/onboard.json
+
+docker run -d --name cond-cont -v ${COND_CONF}:/usr/local/bin/conductor.conf -v ${LOG_CONF}:/usr/local/bin/log.conf ${IMAGE_NAME}:${IMAGE_VER} python /usr/local/bin/conductor-controller --config-file=/usr/local/bin/conductor.conf
+sleep 20
+docker run -d --name cond-api -p "8091:8091" -v ${COND_CONF}:/usr/local/bin/conductor.conf -v ${LOG_CONF}:/usr/local/bin/log.conf ${IMAGE_NAME}:${IMAGE_VER} python /usr/local/bin/conductor-api --port=8091 -- --config-file=/usr/local/bin/conductor.conf
+sleep 20
+docker run -d --name cond-solv -v ${COND_CONF}:/usr/local/bin/conductor.conf -v ${LOG_CONF}:/usr/local/bin/log.conf ${IMAGE_NAME}:${IMAGE_VER} python /usr/local/bin/conductor-solver --config-file=/usr/local/bin/conductor.conf
+sleep 20
+docker run -d --name cond-resv -v ${COND_CONF}:/usr/local/bin/conductor.conf -v ${LOG_CONF}:/usr/local/bin/log.conf ${IMAGE_NAME}:${IMAGE_VER} python /usr/local/bin/conductor-reservation --config-file=/usr/local/bin/conductor.conf
+sleep 20
+docker run -d --name cond-data -v ${COND_CONF}:/usr/local/bin/conductor.conf -v ${LOG_CONF}:/usr/local/bin/log.conf -v ${CERT}:/usr/local/bin/cert.cer -v ${KEY}:/usr/local/bin/cert.key -v ${BUNDLE}:/usr/local/bin/cert.pem ${IMAGE_NAME}:${IMAGE_VER} python /usr/local/bin/conductor-data --config-file=/usr/local/bin/conductor.conf
+sleep 20
+
+COND_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' cond-api`
+${WORKSPACE}/test/csit/scripts/optf-has/has/wait_for_port.sh ${COND_IP} 8091
+
+echo "inspect docker things for tracing purpose"
+docker inspect cond-data
+docker inspect cond-cont
+docker inspect cond-api
+docker inspect cond-solv
+docker inspect cond-resv
+
+echo "dump music content just after conductor is started"
+docker exec music-db /usr/bin/nodetool status
+docker exec music-db /usr/bin/cqlsh -unelson24 -pwinman123 -e 'SELECT * FROM system_schema.keyspaces'
+docker exec music-db /usr/bin/cqlsh -unelson24 -pwinman123 -e 'SELECT * FROM admin.keyspace_master'
diff --git a/scripts/optf-has/has/has_teardown_script.sh b/scripts/optf-has/has/has_teardown_script.sh
new file mode 100755
index 00000000..bef28b43
--- /dev/null
+++ b/scripts/optf-has/has/has_teardown_script.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+echo "print meaningful data before scratching everything"
+docker exec music-db /usr/bin/cqlsh -unelson24 -pwinman123 -e 'SELECT * FROM system_schema.keyspaces'
+docker exec music-db /usr/bin/cqlsh -unelson24 -pwinman123 -e 'SELECT * FROM admin.keyspace_master'
+docker exec music-db /usr/bin/cqlsh -unelson24 -pwinman123 -e 'SELECT * FROM conductor.plans'
+
+echo "optf/has scripts docker containers killing";
+docker stop cond-api
+docker stop cond-solv
+docker stop cond-cont
+docker stop cond-data
+docker stop cond-resv
+
+docker rm cond-api
+docker rm cond-solv
+docker rm cond-cont
+docker rm cond-data
+docker rm cond-resv
+
diff --git a/scripts/optf-has/has/music-properties/log4j.properties b/scripts/optf-has/has/music-properties/log4j.properties
new file mode 100644
index 00000000..1312e9bb
--- /dev/null
+++ b/scripts/optf-has/has/music-properties/log4j.properties
@@ -0,0 +1,3 @@
+# No longer needed, please see the logback properties
+
+
diff --git a/scripts/optf-has/has/music-properties/music.properties b/scripts/optf-has/has/music-properties/music.properties
new file mode 100644
index 00000000..02fb52df
--- /dev/null
+++ b/scripts/optf-has/has/music-properties/music.properties
@@ -0,0 +1,17 @@
+my.public.ip=localhost
+all.public.ips=localhost
+my.id=0
+all.ids=0
+#######################################
+# Optional current values are defaults
+#######################################
+zookeeper.host=music-zk
+cassandra.host=music-db
+#music.ip=localhost
+#debug=true
+#music.rest.ip=localhost
+#lock.lease.period=6000
+cassandra.user=nelson24
+cassandra.password=winman123
+
+
diff --git a/scripts/optf-has/has/music_script.sh b/scripts/optf-has/has/music_script.sh
new file mode 100755
index 00000000..7693d7b3
--- /dev/null
+++ b/scripts/optf-has/has/music_script.sh
@@ -0,0 +1,100 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+echo "### This is ${WORKSPACE}/test/csit/scripts/optf-has/has/music_script.sh"
+#
+# add here whatever commands is needed to prepare the music setup for optf-has CSIT testing
+#
+
+#
+# add here all the configuration steps eventually needed to be carried out for music CSIT testing
+#
+echo "# music configuration step";
+
+CASS_IMG=nexus3.onap.org:10001/onap/music/cassandra_music:latest
+TOMCAT_IMG=nexus3.onap.org:10001/library/tomcat:8.0
+ZK_IMG=nexus3.onap.org:10001/library/zookeeper:3.4
+MUSIC_IMG=nexus3.onap.org:10001/onap/music/music:2.5.3
+WORK_DIR=/tmp/music
+CASS_USERNAME=nelson24
+CASS_PASSWORD=winman123
+MUSIC_SOURCE_PROPERTIES=${WORKSPACE}/test/csit/scripts/optf-has/has/music-properties
+MUSIC_PROPERTIES=/tmp/music/properties
+MUSIC_LOGS=/tmp/music/logs
+mkdir -p ${MUSIC_PROPERTIES}
+mkdir -p ${MUSIC_LOGS}
+
+cp ${MUSIC_SOURCE_PROPERTIES}/* ${WORK_DIR}/properties
+
+# Create Volume for mapping war file and tomcat
+docker volume create --name music-vol;
+
+# Create a network for all the containers to run in.
+docker network create music-net;
+
+# Start Cassandra
+docker run -d --name music-db --network music-net -p "7000:7000" -p "7001:7001" -p "7199:7199" -p "9042:9042" -p "9160:9160" -e CASSUSER=${CASS_USERNAME} -e CASSPASS=${CASS_PASSWORD} ${CASS_IMG};
+#CASSA_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' music-db`
+CASSA_IP=`docker inspect -f '{{ $network := index .NetworkSettings.Networks "music-net" }}{{ $network.IPAddress}}' music-db`
+echo "CASSANDRA_IP=${CASSA_IP}"
+${WORKSPACE}/test/csit/scripts/optf-has/has/wait_for_port.sh ${CASSA_IP} 9042
+sleep 150
+# Start Music war
+docker run -d --name music-war -v music-vol:/app ${MUSIC_IMG};
+sleep 30
+# Start Zookeeper
+docker run -d --name music-zk --network music-net -p "2181:2181" -p "2888:2888" -p "3888:3888" ${ZK_IMG};
+#ZOO_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' music-zk`
+ZOO_IP=`docker inspect -f '{{ $network := index .NetworkSettings.Networks "music-net" }}{{ $network.IPAddress}}' music-zk`
+echo "ZOOKEEPER_IP=${ZOO_IP}"
+
+# Delay between Cassandra/Zookeeper and Tomcat
+sleep 120
+
+# Start Up tomcat - Needs to have properties,logs dir and war file volume mapped.
+docker run -d --name music-tomcat --network music-net -p "8080:8080" -v music-vol:/usr/local/tomcat/webapps -v ${WORK_DIR}/properties:/opt/app/music/etc:ro -v ${WORK_DIR}/logs:/opt/app/music/logs ${TOMCAT_IMG};
+
+# Connect tomcat to host bridge network so that its port can be seen.
+docker network connect bridge music-tomcat;
+
+#
+# add here below the start of all docker containers needed for music CSIT testing
+#
+
+TOMCAT_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' music-tomcat`
+echo "TOMCAT_IP=${TOMCAT_IP}"
+
+${WORKSPACE}/test/csit/scripts/optf-has/has/wait_for_port.sh ${TOMCAT_IP} 8080
+
+# wait a while to make sure music is totally up and configured
+sleep 90
+
+echo "inspect docker things for tracing purpose"
+docker inspect music-db
+docker inspect music-zk
+docker inspect music-tomcat
+docker inspect music-war
+docker volume inspect music-vol
+docker network inspect music-net
+
+echo "dump music content just after music is started"
+docker exec music-db /usr/bin/nodetool status
+docker exec music-db /usr/bin/cqlsh -unelson24 -pwinman123 -e 'SELECT * FROM system_schema.keyspaces'
+docker exec music-db /usr/bin/cqlsh -unelson24 -pwinman123 -e 'SELECT * FROM admin.keyspace_master'
+
+
+
+
diff --git a/scripts/optf-has/has/music_teardown_script.sh b/scripts/optf-has/has/music_teardown_script.sh
new file mode 100755
index 00000000..605ebd4e
--- /dev/null
+++ b/scripts/optf-has/has/music_teardown_script.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+echo "music scripts docker containers killing";
+docker stop music-tomcat
+docker stop music-war
+docker stop music-zk
+docker stop music-db
+
+docker rm music-zk
+docker rm music-tomcat
+docker rm music-war
+docker rm music-db
+
+docker network rm music-net;
+sleep 5;
+
+docker volume rm music-vol
+
+echo "dump music.log files"
+ls -alF /tmp/music
+ls -alF /tmp/music/properties
+cat /tmp/music/properties/music.properties
+#cat /tmp/music/logs/MUSIC/music.log
+cat /tmp/music/logs/MUSIC/error.log
+
diff --git a/scripts/optf-has/has/simulator_script.sh b/scripts/optf-has/has/simulator_script.sh
new file mode 100755
index 00000000..2e8a0e6f
--- /dev/null
+++ b/scripts/optf-has/has/simulator_script.sh
@@ -0,0 +1,85 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+echo "### This is ${WORKSPACE}/test/csit/scripts/optf-has/has/simulator_script.sh"
+#
+# add here whatever commands is needed to prepare the optf/has CSIT testing
+#
+
+# assume the base is /tmp dir
+DIR=/tmp
+
+# the directory of the script
+echo ${DIR}
+cd ${DIR}
+
+# the temp directory used, within $DIR
+# omit the -p parameter to create a temporal directory in the default location
+WORK_DIR=`mktemp -d -p "$DIR"`
+echo ${WORK_DIR}
+cd ${WORK_DIR}
+
+# clone optf-has project
+git clone https://gerrit.onap.org/r/optf/has
+
+#echo "i am ${USER} : only non jenkins users may need proxy settings"
+if [ ${USER} != 'jenkins' ]; then
+
+ # add proxy settings into this script when you work behind a proxy
+ ${WORKSPACE}/test/csit/scripts/optf-has/has/has_proxy_settings.sh ${WORK_DIR}
+
+fi
+
+# prepare aaisim
+cd ${WORK_DIR}/has/conductor/conductor/tests/functional/simulators/aaisim/
+
+# check Dockerfile content
+cat ./Dockerfile
+
+# build aaisim
+docker build -t aaisim .
+
+# run aaisim
+docker run -d --name aaisim -p 8081:8081 aaisim
+
+AAISIM_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' aaisim`
+echo "AAISIM_IP=${AAISIM_IP}"
+
+${WORKSPACE}/test/csit/scripts/optf-has/has/wait_for_port.sh ${AAISIM_IP} 8081
+
+# prepare multicloudsim
+cd ${WORK_DIR}/has/conductor/conductor/tests/functional/simulators/multicloudsim/
+
+# check Dockerfile content
+cat ./Dockerfile
+
+# build multicloudsim
+docker build -t multicloudsim .
+
+# run multicloudsim
+docker run -d --name multicloudsim -p 8082:8082 multicloudsim
+
+MULTICLOUDSIM_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' multicloudsim`
+echo "MULTICLOUDSIM_IP=${MULTICLOUDSIM_IP}"
+
+${WORKSPACE}/test/csit/scripts/optf-has/has/wait_for_port.sh ${MULTICLOUDSIM_IP} 8082
+
+# wait a while before continuing
+sleep 2
+
+echo "inspect docker things for tracing purpose"
+docker inspect aaisim
+docker inspect multicloudsim
diff --git a/scripts/optf-has/has/simulator_teardown_script.sh b/scripts/optf-has/has/simulator_teardown_script.sh
new file mode 100755
index 00000000..a2edd332
--- /dev/null
+++ b/scripts/optf-has/has/simulator_teardown_script.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+echo "optf/has scripts docker containers killing";
+docker stop aaisim
+docker stop multicloudsim
+
+docker rm aaisim
+docker rm multicloudsim
diff --git a/scripts/optf-has/has/wait_for_port.sh b/scripts/optf-has/has/wait_for_port.sh
new file mode 100755
index 00000000..10f08ded
--- /dev/null
+++ b/scripts/optf-has/has/wait_for_port.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+if [[ $# -ne 2 ]]; then
+ echo "Usage: wait-for-port hostname port" >&2
+ exit 1
+fi
+
+host=$1
+port=$2
+
+echo "Waiting for $host port $port open"
+until telnet $host $port </dev/null 2>/dev/null | grep -q '^Connected'; do
+ sleep 1
+done
+
+echo "$host port $port is open"
+
+exit 0
diff --git a/scripts/optf-has/osdf/testsample.txt b/scripts/optf-has/osdf/testsample.txt
new file mode 100644
index 00000000..9f4e8d7d
--- /dev/null
+++ b/scripts/optf-has/osdf/testsample.txt
@@ -0,0 +1 @@
+#test
diff --git a/scripts/policy/mock-hello.sh b/scripts/policy/mock-hello.sh
new file mode 100755
index 00000000..6092dcba
--- /dev/null
+++ b/scripts/policy/mock-hello.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+#
+# Copyright 2017 AT&T Intellectual Property. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# $1 ip address of the mock server
+
+curl -v -X PUT -d @- http://$1:1080/expectation <<EOF
+{
+ "httpRequest": {
+ "method": "GET",
+ "path": "/hello"
+ },
+ "httpResponse": {
+ "body": "Hello world!",
+ "statusCode": 200
+ }
+}
+EOF
+
diff --git a/scripts/policy/script1.sh b/scripts/policy/script1.sh
new file mode 100755
index 00000000..12509eda
--- /dev/null
+++ b/scripts/policy/script1.sh
@@ -0,0 +1,174 @@
+#!/bin/bash
+#
+# Copyright 2017-2018 AT&T Intellectual Property. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+echo "This is ${WORKSPACE}/test/csit/scripts/policy/script1.sh"
+
+
+# the directory of the script
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+echo ${DIR}
+
+# the temp directory used, within $DIR
+# omit the -p parameter to create a temporal directory in the default location
+WORK_DIR=`mktemp -d -p "$DIR"`
+echo ${WORK_DIR}
+
+cd ${WORK_DIR}
+
+# check if tmp dir was created
+if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
+ echo "Could not create temp dir"
+ exit 1
+fi
+
+# bring down maven
+mkdir maven
+cd maven
+curl -O http://apache.claz.org/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
+tar -xzvf apache-maven-3.3.9-bin.tar.gz
+ls -l
+export PATH=${PATH}:${WORK_DIR}/maven/apache-maven-3.3.9/bin
+${WORK_DIR}/maven/apache-maven-3.3.9/bin/mvn -v
+cd ..
+
+ifconfig
+
+if ! ifconfig eth0; then
+ if ! ifconfig ens3; then
+ echo "Could not determine IP address"
+ exit 1
+ fi
+ export IP=`ifconfig ens3 | awk -F: '/inet addr/ {gsub(/ .*/,"",$2); print $2}'`
+else
+ export IP=`ifconfig eth0 | awk -F: '/inet addr/ {gsub(/ .*/,"",$2); print $2}'`
+fi
+echo $IP
+
+if ! ifconfig docker0; then
+ if ! ifconfig ens3; then
+ echo "Could not determine IP address"
+ exit 1
+ fi
+ export DOCKER_IP_IP=`ifconfig ens3 | awk -F: '/inet addr/ {gsub(/ .*/,"",$2); print $2}'`
+else
+ export DOCKER_IP=`ifconfig docker0 | awk -F: '/inet addr/ {gsub(/ .*/,"",$2); print $2}'`
+fi
+echo $DOCKER_IP
+
+git clone http://gerrit.onap.org/r/oparent
+
+git clone http://gerrit.onap.org/r/policy/engine
+cd engine/packages/docker
+${WORK_DIR}/maven/apache-maven-3.3.9/bin/mvn prepare-package --settings ${WORK_DIR}/oparent/settings.xml
+docker build -t onap/policy-pe target/policy-pe
+
+cd ${WORK_DIR}
+git clone http://gerrit.onap.org/r/policy/drools-pdp
+cd drools-pdp/packages/docker
+${WORK_DIR}/maven/apache-maven-3.3.9/bin/mvn prepare-package --settings ${WORK_DIR}/oparent/settings.xml
+docker build -t onap/policy-drools target/policy-drools
+
+cd ${WORK_DIR}
+git clone http://gerrit.onap.org/r/policy/docker
+cd docker
+
+chmod +x config/drools/drools-tweaks.sh
+
+echo $IP > config/pe/ip_addr.txt
+ls -l config/pe/ip_addr.txt
+cat config/pe/ip_addr.txt
+
+export MTU=9126
+
+export PRELOAD_POLICIES=false
+docker-compose -f docker-compose-integration.yml up -d
+
+if [ ! $? -eq 0 ]; then
+ echo "Docker compose failed"
+ exit 1
+fi
+
+docker ps
+
+POLICY_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' drools`
+echo ${POLICY_IP}
+
+PDP_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' pdp`
+echo ${PDP_IP}
+
+PAP_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' pap`
+echo ${PAP_IP}
+
+BRMS_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' brmsgw`
+echo ${BRMS_IP}
+
+NEXUS_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' nexus`
+echo ${NEXUS_IP}
+
+MARIADB_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' mariadb`
+echo ${MARIADB_IP}
+
+sleep 5m
+
+netstat -tnl
+
+docker logs mariadb
+${DIR}/wait_for_port.sh ${MARIADB_IP} 3306
+
+docker logs pap
+${DIR}/wait_for_port.sh ${PAP_IP} 9091
+
+docker logs pdp
+${DIR}/wait_for_port.sh ${PDP_IP} 8081
+
+docker logs brmsgw
+${DIR}/wait_for_port.sh ${BRMS_IP} 9989
+
+docker logs nexus
+${DIR}/wait_for_port.sh ${NEXUS_IP} 8081
+
+docker logs drools
+${DIR}/wait_for_port.sh ${POLICY_IP} 6969
+
+TIME_OUT=600
+INTERVAL=20
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+ curl -k -i --user healthcheck:zb!XztG34 -H "ContentType: application/json" -H "Accept: application/json" https://${POLICY_IP}:6969/healthcheck && break
+
+ echo Sleep: $INTERVAL seconds before testing if Policy is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+
+done
+
+TIME_OUT=600
+INTERVAL=20
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+
+ curl -k -i -v -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'ClientAuth: cHl0aG9uOnRlc3Q=' -H 'Authorization: Basic dGVzdHBkcDphbHBoYTEyMw==' -H 'Environment: TEST' -X POST -d '{"policyName": ".*"}' https://${PDP_IP}:8081/pdp/api/getConfig && break
+
+echo Sleep: $INTERVAL seconds before testing if Policy is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+
+done
+
+#
+# Add more sleep for everything to settle
+#
+sleep 3m
diff --git a/scripts/policy/wait_for_port.sh b/scripts/policy/wait_for_port.sh
new file mode 100755
index 00000000..10f08ded
--- /dev/null
+++ b/scripts/policy/wait_for_port.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+if [[ $# -ne 2 ]]; then
+ echo "Usage: wait-for-port hostname port" >&2
+ exit 1
+fi
+
+host=$1
+port=$2
+
+echo "Waiting for $host port $port open"
+until telnet $host $port </dev/null 2>/dev/null | grep -q '^Connected'; do
+ sleep 1
+done
+
+echo "$host port $port is open"
+
+exit 0
diff --git a/scripts/run-instance.sh b/scripts/run-instance.sh
new file mode 100755
index 00000000..84ab3439
--- /dev/null
+++ b/scripts/run-instance.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# $1 docker image path under ${WORKSPACE}/test/csit/docker/
+# $2 nickname for the instance
+# $3 docker run options, e.g. variables
+
+echo "docker run --name $2 $3 -d $1"
+
+docker run --name $2 $3 -d $1
diff --git a/scripts/sdc/docker_health.sh b/scripts/sdc/docker_health.sh
new file mode 100644
index 00000000..4264b1a5
--- /dev/null
+++ b/scripts/sdc/docker_health.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+curl localhost:9200/_cluster/health?pretty=true
+
+echo "BE health-Check:"
+curl http://localhost:8080/sdc2/rest/healthCheck
+
+echo ""
+echo ""
+echo "FE health-Check:"
+curl http://localhost:8181/sdc1/rest/healthCheck
+
+
+echo ""
+echo ""
+http_code=$(curl -o out.html -w '%{http_code}' -H "Accept: application/json" -H "Content-Type: application/json" -H "USER_ID: jh0003" http://localhost:8080/sdc2/rest/v1/user/demo;)
+if [[ ${http_code} != 200 ]]
+then
+ echo "Error [${http_code}] while user existance check"
+ return ${http_code}
+fi
+echo "check user existance: OK"
+
diff --git a/scripts/sdc/kill_containers_and_remove_dataFolders.sh b/scripts/sdc/kill_containers_and_remove_dataFolders.sh
new file mode 100644
index 00000000..a4e933ff
--- /dev/null
+++ b/scripts/sdc/kill_containers_and_remove_dataFolders.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+echo "This is ${WORKSPACE}/test/csit/scripts/sdc/kill_and_remove_dataFolder.sh"
+
+# copy logs to archive
+
+cp -rf ${WORKSPACE}/data/logs/ ${WORKSPACE}/archives/
+cp -rf ${WORKSPACE}/data/logs/*tests*/ExtentReport/* ${WORKSPACE}/archives/
+cp -rf ${WORKSPACE}/data/logs/*tests*/target/*.xml ${WORKSPACE}/archives/
+
+ls -Rt ${WORKSPACE}/archives/
+
+#kill and remove all sdc dockers
+docker stop $(docker ps -a -q --filter="name=sdc")
+docker rm $(docker ps -a -q --filter="name=sdc")
+
+
+#delete data folder
+
+#rm -rf ${WORKSPACE}/data/*
+
+
diff --git a/scripts/sdc/setup_sdc_for_apis_sanity.sh b/scripts/sdc/setup_sdc_for_apis_sanity.sh
new file mode 100644
index 00000000..41d3d2aa
--- /dev/null
+++ b/scripts/sdc/setup_sdc_for_apis_sanity.sh
@@ -0,0 +1,85 @@
+#!/bin/bash
+
+set -x
+
+echo "This is ${WORKSPACE}/test/csit/scripts/sdc/clone_and_setup_sdc_data.sh"
+
+# Clone sdc enviroment template
+mkdir -p ${WORKSPACE}/data/environments/
+mkdir -p ${WORKSPACE}/data/clone/
+#mkdir -p ${WORKSPACE}/data/logs/BE/SDC/SDC-BE
+#mkdir -p ${WORKSPACE}/data/logs/FE/SDC/SDC-FE
+#chmod -R 777 ${WORKSPACE}/data/logs
+#ls -lR ${WORKSPACE}/data/logs/
+
+
+cd ${WORKSPACE}/data/clone
+git clone --depth 1 http://gerrit.onap.org/r/sdc -b ${GERRIT_BRANCH}
+
+chmod -R 777 ${WORKSPACE}/data/clone
+
+# set enviroment variables
+
+export ENV_NAME='CSIT'
+export MR_IP_ADDR='10.0.0.1'
+
+ifconfig
+IP_ADDRESS=`ip route get 8.8.8.8 | awk '/src/{ print $7 }'`
+export HOST_IP=$IP_ADDRESS
+
+# setup enviroment json
+
+cat ${WORKSPACE}/data/clone/sdc/sdc-os-chef/environments/Template.json | sed "s/yyy/"$IP_ADDRESS"/g" > ${WORKSPACE}/data/environments/$ENV_NAME.json
+sed -i "s/xxx/"$ENV_NAME"/g" ${WORKSPACE}/data/environments/$ENV_NAME.json
+sed -i "s/\"ueb_url_list\":.*/\"ueb_url_list\": \""$MR_IP_ADDR","$MR_IP_ADDR"\",/g" ${WORKSPACE}/data/environments/$ENV_NAME.json
+sed -i "s/\"fqdn\":.*/\"fqdn\": [\""$MR_IP_ADDR"\", \""$MR_IP_ADDR"\"]/g" ${WORKSPACE}/data/environments/$ENV_NAME.json
+
+
+source ${WORKSPACE}/data/clone/sdc/version.properties
+export RELEASE=$major.$minor-STAGING-latest
+export DEP_ENV=$ENV_NAME
+
+cp ${WORKSPACE}/data/clone/sdc/sdc-os-chef/scripts/docker_run.sh ${WORKSPACE}/test/csit/scripts/sdc/
+#sed -i "s~/data~${WORKSPACE}\/data~g" ${WORKSPACE}/test/csit/scripts/sdc/docker_run.sh
+#sed -i "s/HOST_IP=\${IP}/HOST_IP=\${HOST_IP}/g" ${WORKSPACE}/test/csit/scripts/sdc/docker_run.sh
+#sed -i "s/ENVNAME=\"\${DEP_ENV}\"/ENVNAME=\"\${ENV_NAME}\"/g" ${WORKSPACE}/test/csit/scripts/sdc/docker_run.sh
+
+source ${WORKSPACE}/data/clone/sdc/version.properties
+export RELEASE=$major.$minor-STAGING-latest
+
+${WORKSPACE}/test/csit/scripts/sdc/docker_run.sh -r ${RELEASE} -e ${ENV_NAME} -p 10001 -tad
+
+sleep 120
+
+#monitor test processes
+
+TIME_OUT=1200
+INTERVAL=20
+TIME=0
+CID=`docker ps | grep tests | awk '{print $1}'`
+
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+
+PID=`docker exec -i $CID ps -ef | grep java | awk '{print $1}'`
+
+echo sanity PID is -- $PID
+
+if [ -z "$PID" ]
+ then
+ echo SDC sanity finished in $TIME seconds
+ break
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if SDC sanity completed. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]
+ then
+ echo TIME OUT: Sany was NOT completed in $TIME_OUT seconds... Could cause problems for tests...
+fi
+
+
+
+
diff --git a/scripts/sdc/setup_sdc_for_ui_sanity.sh b/scripts/sdc/setup_sdc_for_ui_sanity.sh
new file mode 100644
index 00000000..81b43d21
--- /dev/null
+++ b/scripts/sdc/setup_sdc_for_ui_sanity.sh
@@ -0,0 +1,85 @@
+#!/bin/bash
+
+set -x
+
+echo "This is ${WORKSPACE}/test/csit/scripts/sdc/clone_and_setup_sdc_data.sh"
+
+# Clone sdc enviroment template
+mkdir -p ${WORKSPACE}/data/environments/
+mkdir -p ${WORKSPACE}/data/clone/
+#mkdir -p ${WORKSPACE}/data/logs/BE/SDC/SDC-BE
+#mkdir -p ${WORKSPACE}/data/logs/FE/SDC/SDC-FE
+#chmod -R 777 ${WORKSPACE}/data/logs
+#ls -lR ${WORKSPACE}/data/logs/
+
+
+cd ${WORKSPACE}/data/clone
+git clone --depth 1 http://gerrit.onap.org/r/sdc -b ${GERRIT_BRANCH}
+
+chmod -R 777 ${WORKSPACE}/data/clone
+
+# set enviroment variables
+
+export ENV_NAME='CSIT'
+export MR_IP_ADDR='10.0.0.1'
+
+ifconfig
+IP_ADDRESS=`ip route get 8.8.8.8 | awk '/src/{ print $7 }'`
+export HOST_IP=$IP_ADDRESS
+
+# setup enviroment json
+
+cat ${WORKSPACE}/data/clone/sdc/sdc-os-chef/environments/Template.json | sed "s/yyy/"$IP_ADDRESS"/g" > ${WORKSPACE}/data/environments/$ENV_NAME.json
+sed -i "s/xxx/"$ENV_NAME"/g" ${WORKSPACE}/data/environments/$ENV_NAME.json
+sed -i "s/\"ueb_url_list\":.*/\"ueb_url_list\": \""$MR_IP_ADDR","$MR_IP_ADDR"\",/g" ${WORKSPACE}/data/environments/$ENV_NAME.json
+sed -i "s/\"fqdn\":.*/\"fqdn\": [\""$MR_IP_ADDR"\", \""$MR_IP_ADDR"\"]/g" ${WORKSPACE}/data/environments/$ENV_NAME.json
+
+
+source ${WORKSPACE}/data/clone/sdc/version.properties
+export RELEASE=$major.$minor-STAGING-latest
+export DEP_ENV=$ENV_NAME
+
+cp ${WORKSPACE}/data/clone/sdc/sdc-os-chef/scripts/docker_run.sh ${WORKSPACE}/test/csit/scripts/sdc/
+#sed -i "s~/data~${WORKSPACE}\/data~g" ${WORKSPACE}/test/csit/scripts/sdc/docker_run.sh
+#sed -i "s/HOST_IP=\${IP}/HOST_IP=\${HOST_IP}/g" ${WORKSPACE}/test/csit/scripts/sdc/docker_run.sh
+#sed -i "s/ENVNAME=\"\${DEP_ENV}\"/ENVNAME=\"\${ENV_NAME}\"/g" ${WORKSPACE}/test/csit/scripts/sdc/docker_run.sh
+
+source ${WORKSPACE}/data/clone/sdc/version.properties
+export RELEASE=$major.$minor-STAGING-latest
+
+${WORKSPACE}/test/csit/scripts/sdc/docker_run.sh -r ${RELEASE} -e ${ENV_NAME} -p 10001 -tud
+
+sleep 120
+
+#monitor test processes
+
+TIME_OUT=1200
+INTERVAL=20
+TIME=0
+CID=`docker ps | grep tests | awk '{print $1}'`
+
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+
+PID=`docker exec -i $CID ps -ef | grep java | awk '{print $1}'`
+
+echo sanity PID is -- $PID
+
+if [ -z "$PID" ]
+ then
+ echo SDC sanity finished in $TIME seconds
+ break
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if SDC sanity completed. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]
+ then
+ echo TIME OUT: Sany was NOT completed in $TIME_OUT seconds... Could cause problems for tests...
+fi
+
+
+
+
diff --git a/scripts/sdc/start_sdc_containers.sh b/scripts/sdc/start_sdc_containers.sh
new file mode 100644
index 00000000..5bc8770b
--- /dev/null
+++ b/scripts/sdc/start_sdc_containers.sh
@@ -0,0 +1,116 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# ONAP CLAMP
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+echo "This is ${WORKSPACE}/test/csit/scripts/sdc/start_sdc_containers.sh"
+
+source ${WORKSPACE}/data/clone/sdc/version.properties
+export RELEASE=$major.$minor-STAGING-latest
+export DEP_ENV=$ENV_NAME
+#[ -f /opt/config/nexus_username.txt ] && NEXUS_USERNAME=$(cat /opt/config/nexus_username.txt) || NEXUS_USERNAME=release
+#[ -f /opt/config/nexus_password.txt ] && NEXUS_PASSWD=$(cat /opt/config/nexus_password.txt) || NEXUS_PASSWD=sfWU3DFVdBr7GVxB85mTYgAW
+#[ -f /opt/config/nexus_docker_repo.txt ] && NEXUS_DOCKER_REPO=$(cat /opt/config/nexus_docker_repo.txt) || NEXUS_DOCKER_REPO=ecomp-nexus:${PORT}
+#[ -f /opt/config/nexus_username.txt ] && docker login -u $NEXUS_USERNAME -p $NEXUS_PASSWD $NEXUS_DOCKER_REPO
+export IP=$HOST_IP
+#export PREFIX=${NEXUS_DOCKER_REPO}'/openecomp'
+export PREFIX='nexus3.onap.org:10001/openecomp'
+
+
+function monitor_docker {
+
+echo monitor $1 Docker
+sleep 5
+TIME_OUT=800
+INTERVAL=20
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+
+MATCH=`docker logs --tail 30 $1 | grep "DOCKER STARTED"`
+echo MATCH is -- $MATCH
+
+if [ -n "$MATCH" ]
+ then
+ echo DOCKER start finished in $TIME seconds
+ break
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if $1 DOCKER is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]
+ then
+ echo -e "\e[1;31mTIME OUT: DOCKER was NOT fully started in $TIME_OUT seconds... Could cause problems ...\e[0m"
+fi
+
+
+}
+
+#start Elastic-Search
+docker run --detach --name sdc-es --env ENVNAME="${DEP_ENV}" --log-driver=json-file --log-opt max-size=100m --log-opt max-file=10 --memory 1g --memory-swap=1g --ulimit memlock=-1:-1 --ulimit nofile=4096:100000 --volume /etc/localtime:/etc/localtime:ro -e ES_HEAP_SIZE=1024M --volume ${WORKSPACE}/data/ES:/usr/share/elasticsearch/data --volume ${WORKSPACE}/data/environments:/root/chef-solo/environments --publish 9200:9200 --publish 9300:9300 ${PREFIX}/sdc-elasticsearch:${RELEASE}
+
+#start cassandra
+docker run --detach --name sdc-cs --env RELEASE="${RELEASE}" --env ENVNAME="${DEP_ENV}" --env HOST_IP=${IP} --log-driver=json-file --log-opt max-size=100m --log-opt max-file=10 --ulimit memlock=-1:-1 --ulimit nofile=4096:100000 --volume /etc/localtime:/etc/localtime:ro --volume ${WORKSPACE}/data/CS:/var/lib/cassandra --volume ${WORKSPACE}/data/environments:/root/chef-solo/environments --publish 9042:9042 --publish 9160:9160 ${PREFIX}/sdc-cassandra:${RELEASE}
+
+echo "please wait while CS is starting..."
+monitor_docker sdc-cs
+
+
+#start kibana
+#docker run --detach --name sdc-kbn --env ENVNAME="${DEP_ENV}" --log-driver=json-file --log-opt max-size=100m --log-opt max-file=10 --ulimit memlock=-1:-1 --memory 2g --memory-swap=2g --ulimit nofile=4096:100000 --volume /etc/localtime:/etc/localtime:ro --volume ${WORKSPACE}/data/environments:/root/chef-solo/environments --publish 5601:5601 ${PREFIX}/sdc-kibana:${RELEASE}
+
+#start sdc-backend
+docker run --detach --name sdc-BE --env HOST_IP=${IP} --env ENVNAME="${DEP_ENV}" --env http_proxy=${http_proxy} --env https_proxy=${https_proxy} --env no_proxy=${no_proxy} --log-driver=json-file --log-opt max-size=100m --log-opt max-file=10 --ulimit memlock=-1:-1 --memory 4g --memory-swap=4g --ulimit nofile=4096:100000 --volume /etc/localtime:/etc/localtime:ro --volume ${WORKSPACE}/data/logs/BE/:/var/lib/jetty/logs --volume ${WORKSPACE}/data/environments:/root/chef-solo/environments --publish 8443:8443 --publish 8080:8080 ${PREFIX}/sdc-backend:${RELEASE}
+
+echo "please wait while BE is starting..."
+monitor_docker sdc-BE
+
+#start Front-End
+docker run --detach --name sdc-FE --env HOST_IP=${IP} --env ENVNAME="${DEP_ENV}" --env http_proxy=${http_proxy} --env https_proxy=${https_proxy} --env no_proxy=${no_proxy} --log-driver=json-file --log-opt max-size=100m --log-opt max-file=10 --ulimit memlock=-1:-1 --memory 2g --memory-swap=2g --ulimit nofile=4096:100000 --volume /etc/localtime:/etc/localtime:ro --volume ${WORKSPACE}/data/logs/FE/:/var/lib/jetty/logs --volume ${WORKSPACE}/data/environments:/root/chef-solo/environments --publish 9443:9443 --publish 8181:8181 ${PREFIX}/sdc-frontend:${RELEASE}
+
+echo "docker run sdc-frontend..."
+monitor_docker sdc-FE
+
+echo " WAIT 1 minutes maximum and test every 5 seconds if SDC up using HealthCheck API...."
+
+TIME_OUT=60
+INTERVAL=5
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+ response=$(curl --write-out '%{http_code}' --silent --output /dev/null http://localhost:8080/sdc2/rest/healthCheck); echo $response
+
+ if [ "$response" == "200" ]; then
+ echo SDC well started in $TIME seconds
+ break;
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if SDC is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]; then
+ echo TIME OUT: Docker containers not started in $TIME_OUT seconds... Could cause problems for tests...
+fi
+
diff --git a/scripts/sdc/start_sdc_sanity.sh b/scripts/sdc/start_sdc_sanity.sh
new file mode 100644
index 00000000..2b553136
--- /dev/null
+++ b/scripts/sdc/start_sdc_sanity.sh
@@ -0,0 +1,71 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# ONAP CLAMP
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+
+
+#start Sanity docker
+
+docker run --detach --name sdc-sanity --env HOST_IP=${IP} --env ENVNAME="${DEP_ENV}" --env http_proxy=${http_proxy} --env https_proxy=${https_proxy} --env no_proxy=${no_proxy} --log-driver=json-file --log-opt max-size=100m --log-opt max-file=10 --ulimit memlock=-1:-1 --memory 2g --memory-swap=2g --ulimit nofile=4096:100000 --volume /etc/localtime:/etc/localtime:ro --volume ${WORKSPACE}/data/logs/sdc-sanity/target:/var/lib/tests/target --volume ${WORKSPACE}/data/logs/sdc-sanity/ExtentReport:/var/lib/tests/ExtentReport --volume ${WORKSPACE}/data/environments:/root/chef-solo/environments --publish 9560:9560 ${PREFIX}/sdc-sanity:${RELEASE}
+
+#echo "please wait while Sanity Docker is starting..."
+echo ""
+c=60 # seconds to wait
+REWRITE="\e[45D\e[1A\e[K"
+while [ $c -gt 0 ]; do
+ c=$((c-1))
+ sleep 1
+ echo -e "${REWRITE}$c"
+done
+echo -e ""
+
+
+#monitor sanity process
+
+TIME_OUT=1200
+INTERVAL=20
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+
+PID=`docker exec -i sdc-sanity ps -ef | grep java | awk '{print $2}'`
+echo sanity PID is -- $PID
+
+if [ -z "$PID" ]
+ then
+ echo SDC sanity finished in $TIME seconds
+ break
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if SDC sanity completed. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]
+ then
+ echo TIME OUT: Sany was NOT completed in $TIME_OUT seconds... Could cause problems for tests...
+fi
+cp -rf ${WORKSPACE}/data/logs/sdc-sanity/ExtentReport/* ${WORKSPACE}/archives/
+cp -rf ${WORKSPACE}/data/logs/ ${WORKSPACE}/archives/
+cp -rf ${WORKSPACE}/data/logs/sdc-sanity/target/*.xml ${WORKSPACE}/archives/
+
diff --git a/scripts/sdnc/script1.sh b/scripts/sdnc/script1.sh
new file mode 100644
index 00000000..b87e3c19
--- /dev/null
+++ b/scripts/sdnc/script1.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+echo "This is ${WORKSPACE}/test/csit/scripts/sdnc/script1.sh"
diff --git a/scripts/so/chef-config/aai.crt b/scripts/so/chef-config/aai.crt
new file mode 100644
index 00000000..4ffa426c
--- /dev/null
+++ b/scripts/so/chef-config/aai.crt
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE-----
+MIIEiTCCA3GgAwIBAgIJAIPKfDLcn3MpMA0GCSqGSIb3DQEBCwUAMIGtMQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCTkoxEzARBgNVBAcMCkJlZG1pbnN0ZXIxEjAQBgNV
+BAoMCU9wZW5FQ09NUDETMBEGA1UECwwKc2ltcGxlZGVtbzEqMCgGA1UEAwwhT3Bl
+bkVDT01QIHNpbXBsZWRlbW8gU2VydmVyIENBIFgxMScwJQYJKoZIhvcNAQkBFhhz
+aW1wbGVkZW1vQG9wZW5lY29tcC5vcmcwHhcNMTYxMTMwMTUzODM5WhcNMTcxMTMw
+MTUzODM5WjCBuTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5KMRMwEQYDVQQHDApC
+ZWRtaW5zdGVyMRIwEAYDVQQKDAlPcGVuRUNPTVAxEzARBgNVBAsMClNpbXBsZURl
+bW8xKTAnBgNVBAMMIGFhaS5hcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAub3JnMTQw
+MgYJKoZIhvcNAQkBFiVhYWktaG9zdEBhcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAu
+b3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwQrQl8A0rT0Jjlos
+Mr/7LEhT5UOif4GGPOk+3NCIxT3lOqAbUf+d9ZXyT2jWFRiKWua03vQ+Dxc8c2h2
+RRuH8LwEiOiWqPjWRxNqsARzZMI3ryHFCFBZh0FcpjH9kEeKVlLDYuV68k+ZucKd
+NiqUNn61lD7kbmEGwvzKwf91FrJ09+CBMx1OnWKm3gCNKDqAEFMZCOdn2MgesJYB
+/03lzPBS1jDfBXImXRcTBzpgA+wdCLn0cIQ1eLWUwS5tUqUJNh36nHdVyJ0P2Yjd
+JLuxhFcmBKOz1ShyyO+BBtKBO8EGbU6qKflOiwOw0Fsn8LjKcrHQ58NPui5y04BU
+Rypf3QIDAQABo4GdMIGaMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgO4MB0G
+A1UdDgQWBBQyMUOsE2J+CKzK0qd8KFBD2gaWyjBbBgNVHSAEVDBSMFAGBFUdIAAw
+SDBGBggrBgEFBQcCAjA6GjhLZWVwIGF3YXkgZnJvbSBjaGlsZHJlbi4gIFRoaXMg
+Y2VydGlmaWNhdGUgaXMgbm90IGEgdG95LjANBgkqhkiG9w0BAQsFAAOCAQEAnkoy
+2tWJOyyyIQwtVojUxv1GWQPnw3WCUcKpuX4CJhHXLxNErW1fBg7bmo08BNmBPPpq
+WrJsy5lbBgUo9kgpViux5Stfy1rRIRsRLfl/icgCvJmUAxkmRCZL7yUvwG4K7s+8
+DwT+nW/XuWNP6Hd/qHccexB6COJ8KwvTdVoxAkCdX8qw4MCb/f7Kb1yle/vwBM5Q
+UUONCJ4bEns1vnb9DGlNDUJNwCfwORAaVJpVS38Mv4UnSTmb2KMePtCWcx/dNsYR
+2XrSGqLDnTvHwOpyhbfFTmackysGoSuDytORXy8YbwEiF13BwEK8i3rgNN0Z2ojf
+cpmE2xxmaa+A2uuN6g==
+-----END CERTIFICATE----- \ No newline at end of file
diff --git a/scripts/so/chef-config/mso-docker.json b/scripts/so/chef-config/mso-docker.json
new file mode 100644
index 00000000..120db117
--- /dev/null
+++ b/scripts/so/chef-config/mso-docker.json
@@ -0,0 +1,230 @@
+{
+ "name": "mso-docker",
+ "description": "MSO Docker Images",
+ "chef_type": "environment",
+ "json_class": "Chef::Environment",
+
+ "default_attributes":
+ {
+ "mso_config_path": "/etc/mso/config.d/",
+
+ "mso-topology-config":
+ {
+ "msb-server-ip": "172.30.3.34",
+ "msb-server-port": "80"
+ },
+
+ "mso-api-handler-infra-config":
+ {
+ "bpelURL": "http://mso:8080",
+ "bpelAuth": "786864AA53D0DCD881AED1154230C0C3058D58B9339D2EFB6193A0F0D82530E1",
+ "camundaURL": "http://mso:8080",
+ "camundaAuth": "5119D1AF37F671FC01FFAD2151D93EFB2BBB503E879FD07104D024EDDF118FD1"
+ },
+
+ "asdc-connections":
+ {
+ "asdc-controller1":
+ {
+ "user": "mso",
+ "consumerGroup": "sdc-OpenSource-Env1",
+ "consumerId": "sdc-COpenSource-Env11",
+ "environmentName": "SDC-OpenSource-Env1",
+ "asdcAddress": "c2.vm1.sdc.simpledemo.openecomp.org:8443",
+ "password": "613AF3483E695524F9857643B697FA51C7A9A0951094F53791485BF3458F9EADA37DBACCCEBD0CB242B85B4062745247",
+ "pollingInterval": 60,
+ "pollingTimeout": 60,
+ "relevantArtifactTypes": "HEAT,HEAT_ENV,HEAT_VOL",
+ "activateServerTLSAuth": "false",
+ "keyStorePassword": "",
+ "keyStorePath": ""
+ },
+
+ "asdc-controller2":
+ {
+ "user": "user",
+ "consumerGroup": "mso",
+ "consumerId": "mso",
+ "environmentName": "PROD",
+ "asdcAddress": "asdc_hostname2:8443",
+ "password": "f3895035812addbf115bfaf7d2dc850e",
+ "pollingInterval": 60,
+ "pollingTimeout": 60,
+ "relevantArtifactTypes": "HEAT,HEAT_ENV,HEAT_VOL",
+ "activateServerTLSAuth": "false",
+ "keyStorePassword": "",
+ "keyStorePath": ""
+ }
+ },
+
+ "mso-sdnc-adapter-config":
+ {
+ "sdncurls":
+ [
+ "http://c1.vm1.sdnc.simpledemo.openecomp.org:8282/restconf/operations/L3SDN-API:",
+ "http://c1.vm1.sdnc.simpledemo.openecomp.org:8282/restconf/config/L3SDN-API:",
+ "http://c1.vm1.sdnc.simpledemo.openecomp.org:8282/restconf/operations/Firewall-API:",
+ "http://c1.vm1.sdnc.simpledemo.openecomp.org:8282/restconf/config",
+ "http://c1.vm1.sdnc.simpledemo.openecomp.org:8282/restconf/operations/VNF-API:",
+ "http://c1.vm1.sdnc.simpledemo.openecomp.org:8282/restconf/operations/NBNC-API:",
+ "http://c1.vm1.sdnc.simpledemo.openecomp.org:8282/restconf/operations/NORTHBOUND-API:service-topology-operation",
+ "http://c1.vm1.sdnc.simpledemo.openecomp.org:8282/restconf/operations/GENERIC-RESOURCE-API:",
+ "http://c1.vm1.sdnc.simpledemo.openecomp.org:8282/restconf/operations/VNFTOPOLOGYAIC-API:",
+ "http://c1.vm1.sdnc.simpledemo.openecomp.org:8282/"
+ ],
+
+ "bpelurl": "http://c1.vm1.mso.simpledemo.openecomp.org:8080/mso/SDNCAdapterCallbackService",
+ "restbpelurl": "http://c1.vm1.mso.simpledemo.openecomp.org:8080/mso/WorkflowMessage",
+ "myurl": "http://c1.vm1.mso.simpledemo.openecomp.org:8080/adapters/rest/SDNCNotify",
+ "sdncauth": "263f7d5f944d4d0c76db74b4148bec67d0bc796a874bc0d2a2a12aae89a866aa69133f700f391f784719a37f6a68d29bf5a2fbae1dab0402db7788c800c5ba73",
+ "bpelauth": "5119D1AF37F671FC01FFAD2151D93EFB2BBB503E879FD07104D024EDDF118FD1",
+ "sdncconnecttime": "5000"
+ },
+
+ "mso-po-adapter-config":
+ {
+ "identity_services":
+ [
+ {
+ "dcp_clli": "RAX_KEYSTONE",
+ "identity_url": "https://identity.api.rackspacecloud.com/v2.0",
+ "mso_id": "RACKSPACE_ACCOUNT_ID",
+ "mso_pass": "RACKSPACE_ACCOUNT_APIKEY",
+ "admin_tenant": "service",
+ "member_role": "admin",
+ "tenant_metadata": "true",
+ "identity_server_type": "KEYSTONE",
+ "identity_authentication_type": "RACKSPACE_APIKEY"
+ }
+ ],
+
+ "cloud_sites":
+ [
+ {
+ "id": "Dallas",
+ "aic_version": "2.5",
+ "lcp_clli": "DFW",
+ "region_id": "DFW",
+ "identity_service_id": "RAX_KEYSTONE"
+ },
+
+ {
+ "id": "Northern Virginia",
+ "aic_version": "2.5",
+ "lcp_clli": "IAD",
+ "region_id": "IAD",
+ "identity_service_id": "RAX_KEYSTONE"
+ },
+
+ {
+ "id": "Chicago",
+ "aic_version": "2.5",
+ "lcp_clli": "ORD",
+ "region_id": "ORD",
+ "identity_service_id": "RAX_KEYSTONE"
+ }
+ ],
+
+ "vnfbpelauth": "5119D1AF37F671FC01FFAD2151D93EFB2BBB503E879FD07104D024EDDF118FD1",
+ "checkrequiredparameters": "true",
+ "nwbpelauth": "5119D1AF37F671FC01FFAD2151D93EFB2BBB503E879FD07104D024EDDF118FD1"
+ },
+
+ "mso-workflow-message-adapter-config":
+ {
+ "wmbpelurl": "http://mso:8080/mso/WorkflowMessage",
+ "wmbpelauth": "5119D1AF37F671FC01FFAD2151D93EFB2BBB503E879FD07104D024EDDF118FD1"
+ },
+
+ "mso-appc-adapter-config":
+ {
+ "appc_url": "http://localhost:18080",
+ "appc_stub": "/AppC-Simulator/action/execute",
+ "appc_auth": "786864AA53D0DCD881AED1154230C0C3058D58B9339D2EFB6193A0F0D82530E1",
+ "appc_timeout": "30",
+ "ueb_cluster_address": "http://localhost:18080",
+ "ueb_consumer_group": "testgroup",
+ "ueb_consumer_id": "testuser",
+ "ueb_topic": "queuetopic",
+ "ueb_polling_interval": "30",
+ "ueb_user": "user",
+ "ueb_password": "1ec0d74615d4e4639f991c0590c83b88",
+ "bpel_url": "http://localhost:18080",
+ "bpel_stub": "/AppC-Simulator/bpmn/appCResponse",
+ "bpel_auth": "786864AA53D0DCD881AED1154230C0C3058D58B9339D2EFB6193A0F0D82530E1",
+ "bpel_timeout": "30"
+ },
+
+ "mso-bpmn-config":
+ {
+ "urnFileSystemLoadingEnabled": "true"
+ },
+
+ "mso-bpmn-urn-config":
+ {
+ "debug":"false",
+ "invariantIdL3ToHigherLayerDeleteBonding": "50359538-066f-4a8d-807f-f2bc8eaa79dc",
+ "versionIdL3ToHigherLayerDeleteBonding": "52dbec20-47aa-42e4-936c-331d8e350d44",
+ "infraCustomerId": "21014aa2-526b-11e6-beb8-9e71128cae77",
+ "sniroAuth": "test:testpwd",
+ "sniroEndpoint": "http://sniro.api.simpledemo.openecomp.org:8080/sniro/api/v2/placement",
+ "sniroTimeout": "PT30M",
+ "serviceAgnosticSniroHost": "http://sniro.api.simpledemo.openecomp.org:8080",
+ "serviceAgnosticSniroEndpoint": "/sniro/api/v2/placement",
+ "aaiEndpoint": "https://aai.api.simpledemo.onap.org:8443",
+ "aaiAuth": "2630606608347B7124C244AB0FE34F6F",
+ "adaptersNamespace": "http://org.openecomp.mso",
+ "adaptersCompletemsoprocessEndpoint": "http://mso:8080/CompleteMsoProcess",
+ "adaptersDbEndpoint": "http://mso:8080/dbadapters/MsoRequestsDbAdapter",
+ "adaptersOpenecompDbEndpoint": "http://mso:8080/dbadapters/RequestsDbAdapter",
+ "catalogDbEndpoint": "http://mso:8080/ecomp/mso/catalog",
+ "adaptersSdncEndpoint": "http://mso:8080/adapters/SDNCAdapter",
+ "adaptersSdncRestEndpoint": "http://mso:8080/adapters/rest/v1/sdnc",
+ "adaptersTenantEndpoint": "http://mso:8080/tenants/TenantAdapter",
+ "adaptersDbAuth": "6B0E6863FB8EE010AB6F191B3C0489437601E81DC7C86305CB92DB98AFC53D74",
+ "adaptersWorkflowMessageEndpoint": "http://mso:8080/workflows/messages",
+ "workflowMessageEndpoint": "http://mso:8080/mso/WorkflowMessage",
+ "workflowSdncAdapterCallback": "http://mso:8080/mso/SDNCAdapterCallbackService",
+ "workflowSdncReplicationDelay": "PT5S",
+ "workflowAaiDistributionDelay": "PT30S",
+ "msoKey": "07a7159d3bf51a0e53be7a8f89699be7",
+ "adaptersPoAuth": "6B0E6863FB8EE010AB6F191B3C0489437601E81DC7C86305CB92DB98AFC53D74",
+ "sdncTimeout": "PT5M",
+ "rollback": "true",
+ "adaptersNetworkEndpoint": "http://mso:8080/networks/NetworkAdapter",
+ "adaptersNetworkRestEndpoint": "http://mso:8080/networks/rest/v1/networks",
+ "adaptersVnfAsyncEndpoint": "http://mso:8080/vnfs/VnfAdapterAsync",
+ "workflowVnfAdapterDeleteCallback": "http://mso:8080/mso/vnfAdapterNotify",
+ "workflowVnfAdapterCreateCallback": "http://mso:8080/mso/vnfAdapterNotify",
+ "adaptersVnfRestEndpoint": "http://mso:8080/vnfs/rest/v1/vnfs",
+ "workflowVnfAdapterRestCallback": "http://mso:8080/mso/vnfAdapterRestNotify",
+ "poTimeout": "PT5M",
+ "sdncFirewallYangModel": "http://com/att/svc/mis/firewall-lite-gui",
+ "sdncFirewallYangModelVersion": "2015-05-15",
+ "sdncTimeoutFirewall": "20",
+ "callbackRetryAttempts": "30",
+ "callbackRetrySleepTime": "1000",
+ "appcClientTopicRead": "APPC-LCM-READ",
+ "appcClientTopicWrite": "APPC-LCM-WRITE",
+ "appcClientTopicSdncRead": "SDNC-LCM-READ",
+ "appcClientTopicSdncWrite": "SDNC-LCM-WRITE",
+ "appcClientTopicReadTimeout": "360000",
+ "appcClientResponseTime": "360000",
+ "appcClientPoolMembers": "10.0.11.1:3904",
+ "appcClientKey": "VIlbtVl6YLhNUrtU",
+ "appcClientSecret": "64AG2hF4pYeG2pq7CT6XwUOT",
+ "appcClientService": "ueb",
+ "workflowL3ToHigherLayerAddBondingModelName": "WAN Bonding",
+ "workflowL3ToHigherLayerAddBondingModelVersion": "2.0"
+ }
+ },
+
+ "override_attributes":
+ {
+ },
+
+ "cookbook_versions":
+ {
+ "mso-config": "~> 1.0.0"
+ }
+}
diff --git a/scripts/so/mariadb/conf.d/mariadb1.cnf b/scripts/so/mariadb/conf.d/mariadb1.cnf
new file mode 100644
index 00000000..39ed0224
--- /dev/null
+++ b/scripts/so/mariadb/conf.d/mariadb1.cnf
@@ -0,0 +1,193 @@
+# Example MySQL config file for medium systems.
+#
+# This is for a system with memory 8G where MySQL plays
+# an important part, or systems up to 128M where MySQL is used together with
+# other programs (such as a web server)
+#
+# In this file, you can use all long options that a program supports.
+# If you want to know which options a program supports, run the program
+# with the "--help" option.
+
+# The following options will be passed to all MySQL clients
+##[client]
+##user = root
+##port = 3306
+##socket = //opt/app/mysql/mysql.sock
+
+# Here follows entries for some specific programs
+
+# The MySQL server
+[mysqld]
+##performance_schema
+
+slow_query_log =ON
+long_query_time =2
+slow_query_log_file =//var/lib/mysql/slow_query.log
+
+skip-external-locking
+explicit_defaults_for_timestamp = true
+skip-symbolic-links
+local-infile = 0
+key_buffer_size = 16M
+max_allowed_packet = 4M
+table_open_cache = 100
+sort_buffer_size = 512K
+net_buffer_length = 8K
+read_buffer_size = 256K
+read_rnd_buffer_size = 512K
+myisam_sort_buffer_size = 8M
+max_connections = 500
+lower_case_table_names = 1
+thread_stack = 256K
+thread_cache_size = 25
+query_cache_size = 8M
+query_cache_type = 0
+query_prealloc_size = 512K
+query_cache_limit = 1M
+
+# Password validation
+##plugin-load-add=simple_password_check.so
+##simple_password_check_other_characters=0
+
+# Audit Log settings
+plugin-load-add=server_audit.so
+server_audit=FORCE_PLUS_PERMANENT
+server_audit_file_path=//var/lib/mysql/audit.log
+server_audit_file_rotate_size=50M
+server_audit_events=CONNECT,QUERY,TABLE
+server_audit_logging=on
+
+# Don't listen on a TCP/IP port at all. This can be a security enhancement,
+# if all processes that need to connect to mysqld run on the same host.
+# All interaction with mysqld must be made via Unix sockets or named pipes.
+# Note that using this option without enabling named pipes on Windows
+# (via the "enable-named-pipe" option) will render mysqld useless!
+#
+#skip-networking
+
+# Replication Master Server (default)
+# binary logging is required for replication
+##log-bin=//var/lib/mysql/mysql-bin
+
+# binary logging format - mixed recommended
+binlog_format=row
+
+# required unique id between 1 and 2^32 - 1
+# defaults to 1 if master-host is not set
+# but will not function as a master if omitted
+
+# Replication Slave (comment out master section to use this)
+#
+# To configure this host as a replication slave, you can choose between
+# two methods :
+#
+# 1) Use the CHANGE MASTER TO command (fully described in our manual) -
+# the syntax is:
+#
+# CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,
+# MASTER_USER=<user>, MASTER_PASSWORD=<password> ;
+#
+# where you replace <host>, <user>, <password> by quoted strings and
+# <port> by the master's port number (3306 by default).
+#
+# Example:
+#
+# CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
+# MASTER_USER='joe', MASTER_PASSWORD='secret';
+#
+# OR
+#
+# 2) Set the variables below. However, in case you choose this method, then
+# start replication for the first time (even unsuccessfully, for example
+# if you mistyped the password in master-password and the slave fails to
+# connect), the slave will create a master.info file, and any later
+# change in this file to the variables' values below will be ignored and
+# overridden by the content of the master.info file, unless you shutdown
+# the slave server, delete master.info and restart the slaver server.
+# For that reason, you may want to leave the lines below untouched
+# (commented) and instead use CHANGE MASTER TO (see above)
+#
+# required unique id between 2 and 2^32 - 1
+# (and different from the master)
+# defaults to 2 if master-host is set
+# but will not function as a slave if omitted
+#server-id = 2
+#
+# The replication master for this slave - required
+#master-host = <hostname>
+#
+# The username the slave will use for authentication when connecting
+# to the master - required
+#master-user = <username>
+#
+# The password the slave will authenticate with when connecting to
+# the master - required
+#master-password = <password>
+#
+# The port the master is listening on.
+# optional - defaults to 3306
+#master-port = <port>
+#
+# binary logging - not required for slaves, but recommended
+#log-bin=mysql-bin
+
+# Uncomment the following if you are using InnoDB tables
+##innodb_data_home_dir = //opt/app/mysql/data
+##innodb_data_file_path = ibdata1:20M:autoextend:max:32G
+##innodb_log_group_home_dir = //opt/app/mysql/iblogs
+# You can set .._buffer_pool_size up to 50 - 80 %
+# of RAM but beware of setting memory usage too high
+#innodb_buffer_pool_size = 6380M
+#innodb_additional_mem_pool_size = 2M
+# Set .._log_file_size to 25 % of buffer pool size
+innodb_log_file_size = 150M
+innodb_log_files_in_group = 3
+innodb_log_buffer_size = 8M
+#innodb_flush_log_at_trx_commit = 1
+innodb_lock_wait_timeout = 50
+innodb_autoextend_increment = 100
+expire_logs_days = 8
+open_files_limit = 2000
+transaction-isolation=READ-COMMITTED
+####### Galera parameters #######
+## Galera Provider configuration
+wsrep_provider=/usr/lib/galera/libgalera_smm.so
+wsrep_provider_options="gcache.size=2G; gcache.page_size=1G"
+## Galera Cluster configuration
+wsrep_cluster_name="MSO-automated-tests-cluster"
+wsrep_cluster_address="gcomm://"
+#wsrep_cluster_address="gcomm://mariadb1,mariadb2,mariadb3"
+##wsrep_cluster_address="gcomm://192.169.3.184,192.169.3.185,192.169.3.186"
+## Galera Synchronization configuration
+wsrep_sst_method=rsync
+#wsrep_sst_method=xtrabackup-v2
+#wsrep_sst_auth="sstuser:Mon#2o!6"
+## Galera Node configuration
+wsrep_node_name="mariadb1"
+##wsrep_node_address="192.169.3.184"
+wsrep_on=ON
+## Status notification
+#wsrep_notify_cmd=/opt/app/mysql/bin/wsrep_notify
+#######
+
+
+[mysqldump]
+quick
+max_allowed_packet = 16M
+
+[mysql]
+no-auto-rehash
+# Remove the next comment character if you are not familiar with SQL
+#safe-updates
+
+[myisamchk]
+key_buffer_size = 20971520
+
+##[mysqlhotcopy]
+##interactive-timeout
+##[mysqld_safe]
+##malloc-lib=//opt/app/mysql/local/lib/libjemalloc.so.1
+##log-error=//opt/app/mysql/log/mysqld.log
+
+general_log_file = /var/log/mysql/mysql.log
+general_log = 1
diff --git a/scripts/so/mariadb/docker-entrypoint-initdb.d/01-load-default-sql-files.sh b/scripts/so/mariadb/docker-entrypoint-initdb.d/01-load-default-sql-files.sh
new file mode 100644
index 00000000..326f2735
--- /dev/null
+++ b/scripts/so/mariadb/docker-entrypoint-initdb.d/01-load-default-sql-files.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# ============LICENSE_START==========================================
+# ===================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ===================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+#
+# ECOMP and OpenECOMP are trademarks
+# and service marks of AT&T Intellectual Property.
+#
+#
+cd /docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vfw
+mysql -uroot -p$MYSQL_ROOT_PASSWORD -f < create_mso_db-demo-vfw.sql \ No newline at end of file
diff --git a/scripts/so/mariadb/docker-entrypoint-initdb.d/02-load-additional-changes.sh b/scripts/so/mariadb/docker-entrypoint-initdb.d/02-load-additional-changes.sh
new file mode 100644
index 00000000..a1638010
--- /dev/null
+++ b/scripts/so/mariadb/docker-entrypoint-initdb.d/02-load-additional-changes.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# ============LICENSE_START==========================================
+# ===================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ===================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+#
+# ECOMP and OpenECOMP are trademarks
+# and service marks of AT&T Intellectual Property.
+#
+#
+
+# TODO: update this script to work with the new DB schema
+
+# mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "UPDATE heat_environment SET ENVIRONMENT='parameters:\n vfw_image_name: Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)\n vfw_flavor_name: 4 GB General Purpose v1\n public_net_id: 00000000-0000-0000-0000-000000000000\n unprotected_private_net_id: zdfw1fwl01_unprotected\n protected_private_net_id: zdfw1fwl01_protected\n ecomp_private_net_id: oam_ecomp\n unprotected_private_net_cidr: 192.168.10.0/24\n protected_private_net_cidr: 192.168.20.0/24\n ecomp_private_net_cidr: 192.168.9.0/24\n vfw_private_ip_0: 192.168.10.100\n vfw_private_ip_1: 192.168.20.100\n vfw_private_ip_2: 192.168.9.100\n vpg_private_ip_0: 192.168.10.200\n vpg_private_ip_1: 192.168.9.200\n vsn_private_ip_0: 192.168.20.250\n vsn_private_ip_1: 192.168.9.250\n vfw_name_0: zdfw1fwl01fwl01\n vpg_name_0: zdfw1fwl01pgn01\n vsn_name_0: zdfw1fwl01snk01\n vnf_id: vFirewall_demo_app\n vf_module_id: vFirewall\n webserver_ip: 162.242.237.182\n dcae_collector_ip: 192.168.9.1\n key_name: vfw_key\n pub_key: INSERT YOUR PUBLIC KEY HERE' where id=5;" mso_catalog
diff --git a/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/automated-tests/create_mso_db-tests.sql b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/automated-tests/create_mso_db-tests.sql
new file mode 100644
index 00000000..146ad016
--- /dev/null
+++ b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/automated-tests/create_mso_db-tests.sql
@@ -0,0 +1,49 @@
+SOURCE ../default/create_mso_db-default.sql
+
+USE `mso_requests`;
+DROP USER 'mso';
+CREATE USER 'mso';
+GRANT ALL on mso_requests.* to 'mso' identified by 'mso123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+USE `mso_catalog`;
+DROP USER 'catalog';
+CREATE USER 'catalog';
+GRANT ALL on mso_catalog.* to 'catalog' identified by 'catalog123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+LOCK TABLES `NETWORK_RESOURCE` WRITE;
+/*!40000 ALTER TABLE `NETWORK_RESOURCE` DISABLE KEYS */;
+/*!40000 ALTER TABLE `NETWORK_RESOURCE` ENABLE KEYS */;
+insert into NETWORK_RESOURCE (id, NETWORK_TYPE, VERSION_STR, ORCHESTRATION_MODE ,DESCRIPTION, TEMPLATE_ID, NEUTRON_NETWORK_TYPE, AIC_VERSION_MIN) values
+(1, "vlan",'1',"NEUTRON","Cool network",1,"BASIC","0");
+UNLOCK TABLES;
+
+LOCK TABLES `NETWORK_RECIPE` WRITE;
+/*!40000 ALTER TABLE `NETWORK_RECIPE` DISABLE KEYS */;
+INSERT INTO `NETWORK_RECIPE`(`NETWORK_TYPE`, `ACTION`, `VERSION_STR`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`) VALUES
+('vlan','CREATE','1',NULL,'/active-bpel/services/REST/CreateNetwork',NULL,180,NULL),
+('vlan','DELETE','1',NULL,'/active-bpel/services/REST/DeleteNetwork',NULL,180,NULL);
+/*!40000 ALTER TABLE `NETWORK_RECIPE` ENABLE KEYS */;
+UNLOCK TABLES;
+
+LOCK TABLES `VNF_RECIPE` WRITE;
+INSERT INTO `VNF_RECIPE`(`ID`, `VNF_TYPE`, `ACTION`, `VERSION_STR`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`) VALUES
+(100,'VPE','CREATE','1','','/active-bpel/services/REST/CreateGenericVNF','',180,'SDN-ETHERNET-INTERNET'),
+(101,'VPE','DELETE','1','','/active-bpel/services/REST/DeleteGenericVNF','',180,'SDN-ETHERNET-INTERNET');
+UNLOCK TABLES;
+
+LOCK TABLES `VF_MODULE` WRITE;
+INSERT INTO `VF_MODULE`(`ID`, `TYPE`, `ASDC_SERVICE_MODEL_VERSION`, `MODEL_NAME`, `MODEL_VERSION`, `IS_BASE`, `VNF_RESOURCE_ID`) VALUES
+(100,'dns-servicetest/DNSResource-1::VF_DNS::module-1','1.0','VF_DNS::module-1','1.0','1','7'),
+(101,'dns-servicetest/DNSResource-1::Mog111..mog_psm..module-1','1.0','Mog111..mog_psm..module-1','1.0','1','7');
+UNLOCK TABLES;
+
+LOCK TABLES `VNF_RESOURCE` WRITE;
+INSERT INTO `VNF_RESOURCE`(`ID`, `VNF_TYPE`, `ASDC_SERVICE_MODEL_VERSION`, `ORCHESTRATION_MODE`, `MODEL_VERSION`) VALUES
+(100,'dns-servicetest/DNSResource-1','1.0','VF_DNS::module-1','1.0');
+UNLOCK TABLES;
+
+DELETE FROM HEAT_TEMPLATE_PARAMS;
+DELETE FROM HEAT_TEMPLATE;
+DELETE FROM HEAT_ENVIRONMENT;
diff --git a/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/default/create_mso_db-default.sql b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/default/create_mso_db-default.sql
new file mode 100644
index 00000000..1fea840d
--- /dev/null
+++ b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/default/create_mso_db-default.sql
@@ -0,0 +1,128 @@
+SOURCE ../../camunda/mariadb_engine_7.7.3-ee.sql
+
+--
+-- Create an admin user automatically for the cockpit
+--
+SOURCE ../../camunda/mysql_create_camunda_admin.sql
+
+--
+-- Current Database: `mso_requests`
+--
+
+DROP DATABASE IF EXISTS `mso_requests`;
+
+CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mso_requests` /*!40100 DEFAULT CHARACTER SET latin1 */;
+
+USE `mso_requests`;
+
+SOURCE ../../main-schemas/MySQL-Requests-schema.sql
+
+--
+-- Current Database: `mso_catalog`
+--
+
+DROP DATABASE IF EXISTS `mso_catalog`;
+
+CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mso_catalog` /*!40100 DEFAULT CHARACTER SET latin1 */;
+
+USE `mso_catalog`;
+
+SOURCE ../../main-schemas/MySQL-Catalog-schema.sql
+
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+
+INSERT INTO `heat_template` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `TIMEOUT_MINUTES`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('4885c198-a9fe-11e7-8b4b-0242ac120002','Contrail30-l2nodhcp','1',NULL,'heat_template_version: 2015-04-30\n\ndescription:\n HOT template that creates a Contrail Virtual Network with L2NODHCP\n\nparameters:\n network_name:\n type: string\n description: Name of direct network (e.g. core, dmz)\n default: ECOMPNetwork\n shared:\n type: boolean\n description: Shared amongst tenants\n default: False\n external:\n type: boolean\n description: router_external for the VirtualNetwork\n default: False\n route_targets:\n type: comma_delimited_list\n description: Network route-targets (RT)\n default: \"\"\n subnet_list:\n type: json\n description: Network subnets\n default: []\n policy_refs:\n type: comma_delimited_list\n description: Policies referenced by Network\n default: \"\"\n policy_refsdata:\n type: json\n description: Policies referenced by Network\n default: []\n route_table_refs:\n type: comma_delimited_list\n description: Route Tables referenced by Network\n default: \"\"\n virtual_network_properties_allow_transit:\n type: boolean\n description: allow_transit for the VirtualNetwork\n default: True\n virtual_network_properties_forwarding_mode:\n type: string\n description: forwarding_mode for the VirtualNetwork\n default: l2\n virtual_network_properties_rpf:\n type: string\n description: rpf for the VirtualNetwork\n default: disable\n flood_unknown_unicast:\n type: boolean\n description: flood_unknown_unicast for the VirtualNetwork\n default: True\n\noutputs:\n network_id:\n description: Openstack network identifier\n value: { get_resource: network }\n network_fqdn:\n description: Openstack network identifier\n value: {list_join: [\':\', { get_attr: [network, fq_name] } ] }\n\nresources:\n networkIpam:\n type: OS::ContrailV2::NetworkIpam\n properties:\n name: { get_param: network_name }\n\n network:\n type: OS::ContrailV2::VirtualNetwork\n properties:\n name: { get_param: network_name }\n is_shared: {get_param: shared}\n router_external: { get_param: external }\n route_target_list:\n {\n route_target_list_route_target: { get_param: route_targets }\n }\n network_ipam_refs: [{ get_resource: networkIpam }]\n network_ipam_refs_data:\n [\n {\n network_ipam_refs_data_ipam_subnets: { get_param: subnet_list }\n }\n ]\n network_policy_refs: { get_param: policy_refs }\n network_policy_refs_data: { get_param: policy_refsdata }\n route_table_refs: { get_param: route_table_refs }\n flood_unknown_unicast: { get_param: flood_unknown_unicast } \n virtual_network_properties:\n {\n virtual_network_properties_allow_transit: { get_param: virtual_network_properties_allow_transit },\n virtual_network_properties_forwarding_mode: { get_param: virtual_network_properties_forwarding_mode },\n virtual_network_properties_rpf: { get_param: virtual_network_properties_rpf },\n }\n',10,'MANUAL RECORD','2017-10-05 18:52:03');
+
+INSERT INTO `heat_template` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `TIMEOUT_MINUTES`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('4885c7a1-a9fe-11e7-8b4b-0242ac120002','Contrail30-gndirect','1',NULL,'heat_template_version: 2015-04-30\n\ndescription:\n HOT template that creates a Contrail Virtual Network for GNDIRECT\n\nparameters:\n network_name:\n type: string\n description: Name of direct network (e.g. core, dmz)\n default: ECOMPNetwork\n shared:\n type: boolean\n description: Shared amongst tenants\n default: False\n external:\n type: boolean\n description: router_external for the VirtualNetwork\n default: False\n route_targets:\n type: comma_delimited_list\n description: Network route-targets (RT)\n default: \"\"\n subnet_list:\n type: json\n description: Network subnets\n default: []\n policy_refs:\n type: comma_delimited_list\n description: Policies referenced by Network\n default: \"\"\n policy_refsdata:\n type: json\n description: Policies referenced by Network\n default: []\n route_table_refs:\n type: comma_delimited_list\n description: Route Tables referenced by Network\n default: \"\"\n virtual_network_properties_rpf:\n type: string\n description: rpf for the VirtualNetwork\n default: disable\n\noutputs:\n network_id:\n description: Openstack network identifier\n value: { get_resource: network }\n network_fqdn:\n description: Openstack network identifier\n value: {list_join: [\':\', { get_attr: [network, fq_name] } ] }\n\nresources:\n networkIpam:\n type: OS::ContrailV2::NetworkIpam\n properties:\n name: { get_param: network_name }\n\n network:\n type: OS::ContrailV2::VirtualNetwork\n properties:\n name: { get_param: network_name }\n is_shared: {get_param: shared}\n router_external: { get_param: external }\n route_target_list:\n {\n route_target_list_route_target: { get_param: route_targets }\n }\n network_ipam_refs: [{ get_resource: networkIpam }]\n network_ipam_refs_data:\n [\n {\n network_ipam_refs_data_ipam_subnets: { get_param: subnet_list }\n }\n ]\n network_policy_refs: { get_param: policy_refs }\n network_policy_refs_data: { get_param: policy_refsdata }\n route_table_refs: { get_param: route_table_refs }\n virtual_network_properties:\n {\n virtual_network_properties_rpf: { get_param: virtual_network_properties_rpf }\n }\n',10,'MANUAL RECORD','2017-10-05 18:52:03');
+
+INSERT INTO `heat_template` (`ARTIFACT_UUID`,`NAME`,`VERSION`,`BODY`,`TIMEOUT_MINUTES`,`DESCRIPTION`,`CREATION_TIMESTAMP`,`ARTIFACT_CHECKSUM`) VALUES ('efee1d84-b8ec-11e7-abc4-cec278b6b50a','Generic NeutronNet','1','heat_template_version: 2013-05-23\n\ndescription:\n HOT template that creates a Generic Neutron Network\n\nparameters:\n network_name:\n type: string\n description: Name of direct network (e.g. core, dmz)\n default: ECOMPNetwork\n network_subnet_name:\n type: string\n description: Name of subnet network (e.g. core, dmz)\n default: ECOMPNetwork\n network_subnet_cidr:\n type: string\n description: CIDR of subnet network (e.g. core, dmz)\n default: 10.0.0.0/16\n\noutputs:\n network_id:\n description: Openstack network identifier\n value: { get_resource: network }\n network_fqdn:\n description: Openstack network identifier\n value: {list_join: [\':\', { get_attr: [network, fq_name] } ] }\n\nresources:\n network:\n type: OS::Neutron::Net\n properties:\n name: {get_param: network_name }\n\n subnet:\n type: OS::Neutron::Subnet\n properties:\n name: { get_param: network_subnet_name }\n network_id: { get_resource: network }\n cidr: { get_param: network_subnet_cidr }\n enable_dhcp: false\n',10,'Generic Neutron Template','2017-10-26 14:44:00', 'MANUAL RECORD');
+
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c198-a9fe-11e7-8b4b-0242ac120002','external','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c198-a9fe-11e7-8b4b-0242ac120002','flood_unknown_unicast','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c198-a9fe-11e7-8b4b-0242ac120002','network_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c198-a9fe-11e7-8b4b-0242ac120002','policy_refs','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c198-a9fe-11e7-8b4b-0242ac120002','policy_refsdata','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c198-a9fe-11e7-8b4b-0242ac120002','route_table_refs','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c198-a9fe-11e7-8b4b-0242ac120002','route_targets','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c198-a9fe-11e7-8b4b-0242ac120002','shared','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c198-a9fe-11e7-8b4b-0242ac120002','virtual_network_properties_allow_transit','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c198-a9fe-11e7-8b4b-0242ac120002','virtual_network_properties_forwarding_mode','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c198-a9fe-11e7-8b4b-0242ac120002','virtual_network_properties_rpf','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c7a1-a9fe-11e7-8b4b-0242ac120002','external','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c7a1-a9fe-11e7-8b4b-0242ac120002','network_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c7a1-a9fe-11e7-8b4b-0242ac120002','policy_refs','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c7a1-a9fe-11e7-8b4b-0242ac120002','policy_refsdata','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c7a1-a9fe-11e7-8b4b-0242ac120002','route_table_refs','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c7a1-a9fe-11e7-8b4b-0242ac120002','route_targets','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c7a1-a9fe-11e7-8b4b-0242ac120002','shared','\0','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('4885c7a1-a9fe-11e7-8b4b-0242ac120002','virtual_network_properties_rpf','\0','string',NULL);
+
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (1,'CONTRAIL_BASIC','CREATE',NULL,'/mso/async/services/CreateNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (2,'CONTRAIL_BASIC','DELETE',NULL,'/mso/async/services/DeleteNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (3,'CONTRAIL_BASIC','UPDATE',NULL,'/mso/async/services/UpdateNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (4,'CONTRAIL_SHARED','CREATE',NULL,'/mso/async/services/CreateNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (5,'CONTRAIL_SHARED','UPDATE',NULL,'/mso/async/services/UpdateNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (6,'CONTRAIL_SHARED','DELETE',NULL,'/mso/async/services/DeleteNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (7,'CONTRAIL_EXTERNAL','CREATE',NULL,'/mso/async/services/CreateNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (8,'CONTRAIL_EXTERNAL','UPDATE',NULL,'/mso/async/services/UpdateNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (9,'CONTRAIL_EXTERNAL','DELETE',NULL,'/mso/async/services/DeleteNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (10,'CONTRAIL30_BASIC','CREATE',NULL,'/mso/async/services/CreateNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (11,'CONTRAIL30_BASIC','UPDATE',NULL,'/mso/async/services/UpdateNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (12,'CONTRAIL30_BASIC','DELETE',NULL,'/mso/async/services/DeleteNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (13,'CONTRAIL30_MPSCE','CREATE',NULL,'/mso/async/services/CreateNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (14,'CONTRAIL30_MPSCE','UPDATE',NULL,'/mso/async/services/UpdateNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (15,'CONTRAIL30_MPSCE','DELETE',NULL,'/mso/async/services/DeleteNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (16,'VID_DEFAULT','createInstance','VID_DEFAULT recipe to create network if no custom BPMN flow is found','/mso/async/services/CreateNetworkInstance',NULL,180,NULL,'2017-10-05 18:52:03','1.0');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (17,'VID_DEFAULT','updateInstance','VID_DEFAULT recipe to update network if no custom BPMN flow is found','/mso/async/services/UpdateNetworkInstance',NULL,180,NULL,'2017-10-05 18:52:03','1.0');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (18,'VID_DEFAULT','deleteInstance','VID_DEFAULT recipe to delete network if no custom BPMN flow is found','/mso/async/services/DeleteNetworkInstance',NULL,180,NULL,'2017-10-05 18:52:03','1.0');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (19,'CONTRAIL30_L2NODHCP','CREATE',NULL,'/mso/async/services/CreateNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (20,'CONTRAIL30_L2NODHCP','UPDATE',NULL,'/mso/async/services/UpdateNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (21,'CONTRAIL30_L2NODHCP','DELETE',NULL,'/mso/async/services/DeleteNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (22,'CONTRAIL30_GNDIRECT','CREATE',NULL,'/mso/async/services/CreateNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (23,'CONTRAIL30_GNDIRECT','UPDATE',NULL,'/mso/async/services/UpdateNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+INSERT INTO `network_recipe` (`id`, `MODEL_NAME`, `ACTION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `NETWORK_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TYPE`, `CREATION_TIMESTAMP`, `VERSION_STR`) VALUES (24,'CONTRAIL30_GNDIRECT','DELETE',NULL,'/mso/async/services/DeleteNetworkV2',NULL,180,NULL,'2017-10-05 18:52:03','1');
+
+INSERT INTO `service` (`MODEL_UUID`, `MODEL_NAME`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `TOSCA_CSAR_ARTIFACT_UUID`) VALUES ('48cc36cc-a9fe-11e7-8b4b-0242ac120002','VID_DEFAULT','48cd56c8-a9fe-11e7-8b4b-0242ac120002','1.0','Default service for VID to use for infra APIH orchestration1707MIGRATED1707MIGRATED','2017-10-05 18:52:03',NULL);
+INSERT INTO `service` (`MODEL_UUID`, `MODEL_NAME`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `TOSCA_CSAR_ARTIFACT_UUID`) VALUES ('48cc3acd-a9fe-11e7-8b4b-0242ac120002','*','48ce2256-a9fe-11e7-8b4b-0242ac120002','1.0','Default service to use for infra APIH orchestration1707MIGRATED1707MIGRATED','2017-10-05 18:52:03',NULL);
+
+INSERT INTO `service_recipe` (`id`, `ACTION`, `VERSION_STR`, `DESCRIPTION`, `ORCHESTRATION_URI`, `SERVICE_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TIMEOUT_INTERIM`, `CREATION_TIMESTAMP`, `SERVICE_MODEL_UUID`) VALUES (1,'createInstance','1','VID_DEFAULT recipe to create service-instance if no custom BPMN flow is found','/mso/async/services/CreateGenericALaCarteServiceInstance',NULL,180,NULL,'2017-10-05 18:52:03','48cc36cc-a9fe-11e7-8b4b-0242ac120002');
+INSERT INTO `service_recipe` (`id`, `ACTION`, `VERSION_STR`, `DESCRIPTION`, `ORCHESTRATION_URI`, `SERVICE_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TIMEOUT_INTERIM`, `CREATION_TIMESTAMP`, `SERVICE_MODEL_UUID`) VALUES (2,'deleteInstance','1','VID_DEFAULT recipe to delete service-instance if no custom BPMN flow is found','/mso/async/services/DeleteGenericALaCarteServiceInstance',NULL,180,NULL,'2017-10-05 18:52:03','48cc36cc-a9fe-11e7-8b4b-0242ac120002');
+INSERT INTO `service_recipe` (`id`, `ACTION`, `VERSION_STR`, `DESCRIPTION`, `ORCHESTRATION_URI`, `SERVICE_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TIMEOUT_INTERIM`, `CREATION_TIMESTAMP`, `SERVICE_MODEL_UUID`) VALUES (3,'createInstance','1','DEFAULT recipe to create service-instance if no custom BPMN flow is found','/mso/async/services/CreateGenericALaCarteServiceInstance',NULL,180,NULL,'2017-10-05 18:52:03','48cc3acd-a9fe-11e7-8b4b-0242ac120002');
+INSERT INTO `service_recipe` (`id`, `ACTION`, `VERSION_STR`, `DESCRIPTION`, `ORCHESTRATION_URI`, `SERVICE_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TIMEOUT_INTERIM`, `CREATION_TIMESTAMP`, `SERVICE_MODEL_UUID`) VALUES (4,'deleteInstance','1','DEFAULT recipe to delete service-instance if no custom BPMN flow is found','/mso/async/services/DeleteGenericALaCarteServiceInstance',NULL,180,NULL,'2017-10-05 18:52:03','48cc3acd-a9fe-11e7-8b4b-0242ac120002');
+
+--
+-- Custom Reciepe for the VoLTE service added temporarily
+--
+
+INSERT INTO `service` (`MODEL_UUID`, `MODEL_NAME`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `TOSCA_CSAR_ARTIFACT_UUID`) VALUES ('dfcd7471-16c7-444e-8268-d4c50d90593a','UUI_DEFAULT','dfcd7471-16c7-444e-8268-d4c50d90593a','1.0','Default service for UUI to use for infra APIH orchestration1707MIGRATED1707MIGRATED','2017-10-23 18:52:03',NULL);
+
+INSERT INTO `service_recipe` (`id`, `ACTION`, `VERSION_STR`, `DESCRIPTION`, `ORCHESTRATION_URI`, `SERVICE_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TIMEOUT_INTERIM`, `CREATION_TIMESTAMP`, `SERVICE_MODEL_UUID`) VALUES (11,'createInstance','1','Custom recipe to create E2E service-instance if no custom BPMN flow is found','/mso/async/services/CreateCustomE2EServiceInstance',NULL,180,NULL,'2017-10-05 18:52:03','dfcd7471-16c7-444e-8268-d4c50d90593a');
+INSERT INTO `service_recipe` (`id`, `ACTION`, `VERSION_STR`, `DESCRIPTION`, `ORCHESTRATION_URI`, `SERVICE_PARAM_XSD`, `RECIPE_TIMEOUT`, `SERVICE_TIMEOUT_INTERIM`, `CREATION_TIMESTAMP`, `SERVICE_MODEL_UUID`) VALUES (12,'deleteInstance','1','Custom recipe to delete E2E service-instance if no custom BPMN flow is found','/mso/async/services/DeleteCustomE2EServiceInstance',NULL,180,NULL,'2017-10-05 18:52:03','dfcd7471-16c7-444e-8268-d4c50d90593a');
+
+INSERT INTO `temp_network_heat_template_lookup` (`NETWORK_RESOURCE_MODEL_NAME`, `HEAT_TEMPLATE_ARTIFACT_UUID`, `AIC_VERSION_MIN`, `AIC_VERSION_MAX`) VALUES ('CONTRAIL30_GNDIRECT','4885c7a1-a9fe-11e7-8b4b-0242ac120002','3.0',NULL);
+INSERT INTO `temp_network_heat_template_lookup` (`NETWORK_RESOURCE_MODEL_NAME`, `HEAT_TEMPLATE_ARTIFACT_UUID`, `AIC_VERSION_MIN`, `AIC_VERSION_MAX`) VALUES ('CONTRAIL30_L2NODHCP','4885c198-a9fe-11e7-8b4b-0242ac120002','3.0',NULL);
+INSERT INTO `temp_network_heat_template_lookup` (`NETWORK_RESOURCE_MODEL_NAME`, `HEAT_TEMPLATE_ARTIFACT_UUID`,`AIC_VERSION_MIN` , `AIC_VERSION_MAX` ) VALUES ('Generic NeutronNet','efee1d84-b8ec-11e7-abc4-cec278b6b50a','2.0','NULL');
+
+INSERT INTO `vnf_components_recipe` (`id`, `VNF_TYPE`, `VNF_COMPONENT_TYPE`, `VF_MODULE_MODEL_UUID`, `ACTION`, `SERVICE_TYPE`, `VERSION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_COMPONENT_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (1,'*','VOLUME_GROUP',NULL,'CREATE',NULL,'1','Recipe Match All for','/mso/async/services/createCinderVolumeV1',null,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_components_recipe` (`id`, `VNF_TYPE`, `VNF_COMPONENT_TYPE`, `VF_MODULE_MODEL_UUID`, `ACTION`, `SERVICE_TYPE`, `VERSION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_COMPONENT_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (2,'*','VOLUME_GROUP',NULL,'DELETE',NULL,'1','Recipe Match All for','/mso/async/services/deleteCinderVolumeV1',null,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_components_recipe` (`id`, `VNF_TYPE`, `VNF_COMPONENT_TYPE`, `VF_MODULE_MODEL_UUID`, `ACTION`, `SERVICE_TYPE`, `VERSION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_COMPONENT_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (3,'*','VOLUME_GROUP',NULL,'UPDATE',NULL,'1','Recipe Match All for','/mso/async/services/updateCinderVolumeV1',null,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_components_recipe` (`id`, `VNF_TYPE`, `VNF_COMPONENT_TYPE`, `VF_MODULE_MODEL_UUID`, `ACTION`, `SERVICE_TYPE`, `VERSION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_COMPONENT_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (4,NULL,'VOLUME_GROUP',NULL,'CREATE_VF_MODULE_VOL',NULL,'1','Recipe Match All for','/mso/async/services/CreateVfModuleVolume',null,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_components_recipe` (`id`, `VNF_TYPE`, `VNF_COMPONENT_TYPE`, `VF_MODULE_MODEL_UUID`, `ACTION`, `SERVICE_TYPE`, `VERSION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_COMPONENT_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (5,NULL,'VOLUME_GROUP',NULL,'DELETE_VF_MODULE_VOL',NULL,'1','Recipe Match All for','/mso/async/services/DeleteVfModuleVolume',null,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_components_recipe` (`id`, `VNF_TYPE`, `VNF_COMPONENT_TYPE`, `VF_MODULE_MODEL_UUID`, `ACTION`, `SERVICE_TYPE`, `VERSION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_COMPONENT_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (6,NULL,'VOLUME_GROUP',NULL,'UPDATE_VF_MODULE_VOL',NULL,'1','Recipe Match All for','/mso/async/services/UpdateVfModuleVolume',null,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_components_recipe` (`id`, `VNF_TYPE`, `VNF_COMPONENT_TYPE`, `VF_MODULE_MODEL_UUID`, `ACTION`, `SERVICE_TYPE`, `VERSION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_COMPONENT_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (7,NULL,'volumeGroup','VID_DEFAULT','createInstance',NULL,'1','VID_DEFAULT recipe t','/mso/async/services/CreateVfModuleVolumeInfraV1',null,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_components_recipe` (`id`, `VNF_TYPE`, `VNF_COMPONENT_TYPE`, `VF_MODULE_MODEL_UUID`, `ACTION`, `SERVICE_TYPE`, `VERSION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_COMPONENT_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (8,NULL,'volumeGroup','VID_DEFAULT','deleteInstance',NULL,'1','VID_DEFAULT recipe t','/mso/async/services/DeleteVfModuleVolumeInfraV1',null,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_components_recipe` (`id`, `VNF_TYPE`, `VNF_COMPONENT_TYPE`, `VF_MODULE_MODEL_UUID`, `ACTION`, `SERVICE_TYPE`, `VERSION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_COMPONENT_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (9,NULL,'volumeGroup','VID_DEFAULT','updateInstance',NULL,'1','VID_DEFAULT recipe t','/mso/async/services/UpdateVfModuleVolumeInfraV1',null,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_components_recipe` (`id`, `VNF_TYPE`, `VNF_COMPONENT_TYPE`, `VF_MODULE_MODEL_UUID`, `ACTION`, `SERVICE_TYPE`, `VERSION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_COMPONENT_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (10,NULL,'vfModule','VID_DEFAULT','createInstance',NULL,'1','VID_DEFAULT recipe t','/mso/async/services/CreateVfModuleInfra',null,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_components_recipe` (`id`, `VNF_TYPE`, `VNF_COMPONENT_TYPE`, `VF_MODULE_MODEL_UUID`, `ACTION`, `SERVICE_TYPE`, `VERSION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_COMPONENT_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (11,NULL,'vfModule','VID_DEFAULT','deleteInstance',NULL,'1','VID_DEFAULT recipe t','/mso/async/services/DeleteVfModuleInfra',null,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_components_recipe` (`id`, `VNF_TYPE`, `VNF_COMPONENT_TYPE`, `VF_MODULE_MODEL_UUID`, `ACTION`, `SERVICE_TYPE`, `VERSION`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_COMPONENT_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (12,NULL,'vfModule','VID_DEFAULT','updateInstance',NULL,'1','VID_DEFAULT recipe t','/mso/async/services/UpdateVfModuleInfra',null,180,'2017-10-05 18:52:03');
+
+INSERT INTO `vnf_recipe` (`id`, `VF_MODULE_ID`, `ACTION`, `SERVICE_TYPE`, `VERSION_STR`, `VNF_TYPE`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (1,NULL,'CREATE',NULL,'1','*','Recipe Match All for VNFs if no custom flow exists','/mso/workflow/services/CreateGenericVNFV1',NULL,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_recipe` (`id`, `VF_MODULE_ID`, `ACTION`, `SERVICE_TYPE`, `VERSION_STR`, `VNF_TYPE`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (2,NULL,'DELETE',NULL,'1','*','Recipe Match All for VNFs if no custom flow exists','/mso/async/services//deleteGenericVNFV1',NULL,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_recipe` (`id`, `VF_MODULE_ID`, `ACTION`, `SERVICE_TYPE`, `VERSION_STR`, `VNF_TYPE`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (3,NULL,'UPDATE',NULL,'1','*','Recipe Match All for VNFs if no custom flow exists','/mso/workflow/services/updateGenericVNFV1',NULL,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_recipe` (`id`, `VF_MODULE_ID`, `ACTION`, `SERVICE_TYPE`, `VERSION_STR`, `VNF_TYPE`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (4,'*','CREATE_VF_MODULE',NULL,'1',NULL,'Recipe Match All for VNFs if no custom flow exists','/mso/async/services/CreateVfModule',NULL,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_recipe` (`id`, `VF_MODULE_ID`, `ACTION`, `SERVICE_TYPE`, `VERSION_STR`, `VNF_TYPE`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (5,'*','DELETE_VF_MODULE',NULL,'1',NULL,'Recipe Match All for VNFs if no custom flow exists','/mso/async/services/DeleteVfModule',NULL,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_recipe` (`id`, `VF_MODULE_ID`, `ACTION`, `SERVICE_TYPE`, `VERSION_STR`, `VNF_TYPE`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (6,'*','UPDATE_VF_MODULE',NULL,'1',NULL,'Recipe Match All for VNFs if no custom flow exists','/mso/async/services/UpdateVfModule',NULL,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_recipe` (`id`, `VF_MODULE_ID`, `ACTION`, `SERVICE_TYPE`, `VERSION_STR`, `VNF_TYPE`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (7,NULL,'createInstance',NULL,'1','VID_DEFAULT','VID_DEFAULT recipe to create VNF if no custom BPMN flow is found','/mso/async/services/CreateVnfInfra',NULL,180,'2017-10-05 18:52:03');
+INSERT INTO `vnf_recipe` (`id`, `VF_MODULE_ID`, `ACTION`, `SERVICE_TYPE`, `VERSION_STR`, `VNF_TYPE`, `DESCRIPTION`, `ORCHESTRATION_URI`, `VNF_PARAM_XSD`, `RECIPE_TIMEOUT`, `CREATION_TIMESTAMP`) VALUES (8,NULL,'deleteInstance',NULL,'1','VID_DEFAULT','VID_DEFAULT recipe to delete VNF if no custom BPMN flow is found','/mso/async/services/DeleteVnfInfra',NULL,180,'2017-10-05 18:52:03');
+
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
diff --git a/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-dns/create_mso_db-demo-dns.sql b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-dns/create_mso_db-demo-dns.sql
new file mode 100644
index 00000000..b5063def
--- /dev/null
+++ b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-dns/create_mso_db-demo-dns.sql
@@ -0,0 +1,77 @@
+SOURCE ../default/create_mso_db-default.sql
+
+USE `mso_requests`;
+DROP USER 'mso';
+CREATE USER 'mso';
+GRANT ALL on mso_requests.* to 'mso' identified by 'mso123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+USE `mso_catalog`;
+DROP USER 'catalog';
+CREATE USER 'catalog';
+GRANT ALL on mso_catalog.* to 'catalog' identified by 'catalog123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+
+INSERT INTO `heat_environment` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('EnvArtifact-UUID1','base_vlb.env','1.0','BASE VLB ENV file','parameters:\n vlb_image_name: Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)\n vlb_flavor_name: 4 GB General Purpose v1\n public_net_id: 00000000-0000-0000-0000-000000000000\n vlb_private_net_id: zdfw1lb01_private\n ecomp_private_net_id: oam_ecomp\n vlb_private_net_cidr: 192.168.10.0/24\n ecomp_private_net_cidr: 192.168.9.0/24\n vlb_private_ip_0: 192.168.10.111\n vlb_private_ip_1: 192.168.9.111\n vdns_private_ip_0: 192.168.10.211\n vdns_private_ip_1: 192.168.9.211\n vlb_name_0: zdfw1lb01lb01\n vdns_name_0: zdfw1lb01dns01\n vnf_id: vLoadBalancer_demo_app\n vf_module_id: vLoadBalancer\n webserver_ip: 162.242.237.182\n dcae_collector_ip: 192.168.9.1\n key_name: vlb_key\n pub_key: INSERT YOUR PUBLIC KEY HERE','MANUAL RECORD','2016-11-14 13:04:07');
+
+INSERT INTO `heat_environment` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('EnvArtifact-UUID2','dnsscaling.env','1.0','DNS Scaling ENV file','parameters:\n vlb_image_name: Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)\n vlb_flavor_name: 4 GB General Purpose v1\n public_net_id: 00000000-0000-0000-0000-000000000000\n vlb_private_net_id: zdfw1lb01_private\n ecomp_private_net_id: oam_ecomp\n vlb_private_ip_0: 192.168.10.111\n vlb_private_ip_1: 192.168.9.111\n vdns_private_ip_0: 192.168.10.222\n vdns_private_ip_1: 192.168.9.222\n vdns_name_0: zdfw1lb01dns02\n vnf_id: vLoadBalancer_demo_app\n vf_module_id: vLoadBalancer\n webserver_ip: 162.242.237.182\n dcae_collector_ip: 192.168.9.1\n key_name: vlb_key\n pub_key: INSERT YOUR PUBLIC KEY HERE','MANUAL RECORD','2016-11-14 13:04:07');
+
+INSERT INTO `heat_template` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `TIMEOUT_MINUTES`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('Artifact-UUID1','base_vlb.yaml','1.0','Base VLB Heat','heat_template_version: 2013-05-23\n\ndescription: Heat template to deploy vLoadBalancer/vDNS demo app for OpenECOMP\n\nparameters:\n vlb_image_name:\n type: string\n label: Image name or ID\n description: Image to be used for compute instance\n vlb_flavor_name:\n type: string\n label: Flavor\n description: Type of instance (flavor) to be used\n public_net_id:\n type: string\n label: Public network name or ID\n description: Public network that enables remote connection to VNF\n vlb_private_net_id:\n type: string\n label: vLoadBalancer private network name or ID\n description: Private network that connects vLoadBalancer with vDNSs\n ecomp_private_net_id:\n type: string\n label: ECOMP management network name or ID\n description: Private network that connects ECOMP component and the VNF\n vlb_private_net_cidr:\n type: string\n label: vLoadBalancer private network CIDR\n description: The CIDR of the vLoadBalancer private network\n ecomp_private_net_cidr:\n type: string\n label: ECOMP private network CIDR\n description: The CIDR of the protected private network\n vlb_private_ip_0:\n type: string\n label: vLoadBalancer private IP address towards the private network\n description: Private IP address that is assigned to the vLoadBalancer to communicate with the vDNSs\n vlb_private_ip_1:\n type: string\n label: vLoadBalancer private IP address towards the ECOMP management network\n description: Private IP address that is assigned to the vLoadBalancer to communicate with ECOMP components\n vdns_private_ip_0:\n type: string\n label: vDNS private IP address towards the private network\n description: Private IP address that is assigned to the vDNS to communicate with the vLoadBalancer\n vdns_private_ip_1:\n type: string\n label: vDNS private IP address towards the ECOMP management network\n description: Private IP address that is assigned to the vDNS to communicate with ECOMP components\n vlb_name_0:\n type: string\n label: vLoadBalancer name\n description: Name of the vLoadBalancer\n vdns_name_0:\n type: string\n label: vDNS name\n description: Name of the vDNS\n vnf_id:\n type: string\n label: VNF ID\n description: The VNF ID is provided by ECOMP\n vf_module_id:\n type: string\n label: vFirewall module ID\n description: The vLoadBalancer Module ID is provided by ECOMP\n webserver_ip:\n type: string\n label: Webserver IP address\n description: IP address of the webserver that hosts the source code and binaries\n dcae_collector_ip:\n type: string\n label: DCAE collector IP address\n description: IP address of the DCAE collector\n key_name:\n type: string\n label: Key pair name\n description: Public/Private key pair name\n pub_key:\n type: string\n label: Public key\n description: Public key to be installed on the compute instance\n\nresources:\n my_keypair:\n type: OS::Nova::KeyPair\n properties:\n name: { get_param: key_name }\n public_key: { get_param: pub_key }\n save_private_key: false\n\n vlb_private_network:\n type: OS::Neutron::Net\n properties:\n name: { get_param: vlb_private_net_id }\n\n vlb_private_subnet:\n type: OS::Neutron::Subnet\n properties:\n name: { get_param: vlb_private_net_id }\n network_id: { get_resource: vlb_private_network }\n cidr: { get_param: vlb_private_net_cidr }\n\n vlb_0:\n type: OS::Nova::Server\n properties:\n image: { get_param: vlb_image_name }\n flavor: { get_param: vlb_flavor_name }\n name: { get_param: vlb_name_0 }\n key_name: { get_resource: my_keypair }\n networks:\n - network: { get_param: public_net_id }\n - port: { get_resource: vlb_private_0_port }\n - port: { get_resource: vlb_private_1_port }\n metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}\n user_data_format: RAW\n user_data:\n str_replace:\n params:\n __webserver__: { get_param: webserver_ip }\n __dcae_collector_ip__: { get_param: dcae_collector_ip }\n __local_private_ipaddr__: { get_param: vlb_private_ip_0 }\n template: |\n #!/bin/bash\n\n WEBSERVER_IP=__webserver__\n DCAE_COLLECTOR_IP=__dcae_collector_ip__\n LOCAL_PRIVATE_IPADDR=__local_private_ipaddr__\n\n mkdir /opt/config\n cd /opt\n wget http://$WEBSERVER_IP/demo_repo/v_lb_init.sh\n wget http://$WEBSERVER_IP/demo_repo/vlb.sh\n chmod +x v_lb_init.sh\n chmod +x vlb.sh\n echo $WEBSERVER_IP > config/webserver_ip.txt\n echo $DCAE_COLLECTOR_IP > config/dcae_collector_ip.txt\n echo $LOCAL_PRIVATE_IPADDR > config/local_private_ipaddr.txt\n echo \"no\" > config/install.txt\n LOCAL_PUBLIC_IPADDR=$(ifconfig eth0 | grep \"inet addr\" | tr -s \' \' | cut -d\' \' -f3 | cut -d\':\' -f2)\n echo $LOCAL_PUBLIC_IPADDR > config/local_public_ipaddr.txt\n mv vlb.sh /etc/init.d\n update-rc.d vlb.sh defaults\n ./v_lb_init.sh\n\n vlb_private_0_port:\n type: OS::Neutron::Port\n properties:\n network: { get_resource: vlb_private_network }\n fixed_ips: [{\"subnet\": { get_resource: vlb_private_subnet }, \"ip_address\": { get_param: vlb_private_ip_0 }}]\n\n vlb_private_1_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: ecomp_private_net_id }\n fixed_ips: [{\"subnet\": { get_param: ecomp_private_net_id }, \"ip_address\": { get_param: vlb_private_ip_1 }}]\n\n vdns_0:\n type: OS::Nova::Server\n properties:\n image: { get_param: vlb_image_name }\n flavor: { get_param: vlb_flavor_name }\n name: { get_param: vdns_name_0 }\n key_name: { get_resource: my_keypair }\n networks:\n - network: { get_param: public_net_id }\n - port: { get_resource: vdns_private_0_port }\n - port: { get_resource: vdns_private_1_port }\n metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}\n user_data_format: RAW\n user_data:\n str_replace:\n params:\n __webserver__: { get_param: webserver_ip }\n __lb_oam_int__ : { get_param: vlb_private_ip_1 }\n __lb_private_ipaddr__: { get_param: vlb_private_ip_0 }\n __local_private_ipaddr__: { get_param: vdns_private_ip_0 }\n template: |\n #!/bin/bash\n\n WEBSERVER_IP=__webserver__\n LB_OAM_INT=__lb_oam_int__\n LB_PRIVATE_IPADDR=__lb_private_ipaddr__\n LOCAL_PRIVATE_IPADDR=__local_private_ipaddr__\n\n mkdir /opt/config\n cd /opt\n wget http://$WEBSERVER_IP/demo_repo/v_dns_init.sh\n wget http://$WEBSERVER_IP/demo_repo/vdns.sh\n chmod +x v_dns_init.sh\n chmod +x vdns.sh\n echo $WEBSERVER_IP > config/webserver_ip.txt\n echo $LB_OAM_INT > config/lb_oam_int.txt\n echo $LB_PRIVATE_IPADDR > config/lb_private_ipaddr.txt\n echo $LOCAL_PRIVATE_IPADDR > config/local_private_ipaddr.txt\n echo \"no\" > config/install.txt\n mv vdns.sh /etc/init.d\n update-rc.d vdns.sh defaults\n ./v_dns_init.sh\n\n vdns_private_0_port:\n type: OS::Neutron::Port\n properties:\n network: { get_resource: vlb_private_network }\n fixed_ips: [{\"subnet\": { get_resource: vlb_private_subnet }, \"ip_address\": { get_param: vdns_private_ip_0 }}]\n\n vdns_private_1_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: ecomp_private_net_id }\n fixed_ips: [{\"subnet\": { get_param: ecomp_private_net_id }, \"ip_address\": { get_param: vdns_private_ip_1 }}]\n',300,'MANUAL RECORD','2016-11-14 13:04:07');
+
+INSERT INTO `heat_template` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `TIMEOUT_MINUTES`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('Artifact-UUID2','dnsscaling.yaml','1.0','DNS Scaling Heat','heat_template_version: 2013-05-23\n\ndescription: Heat template to deploy a vDNS for OpenECOMP (scaling-up scenario)\n\nparameters:\n vlb_image_name:\n type: string\n label: Image name or ID\n description: Image to be used for compute instance\n vlb_flavor_name:\n type: string\n label: Flavor\n description: Type of instance (flavor) to be used\n public_net_id:\n type: string\n label: Public network name or ID\n description: Public network that enables remote connection to VNF\n vlb_private_net_id:\n type: string\n label: vLoadBalancer private network name or ID\n description: Private network that connects vLoadBalancer with vDNSs\n ecomp_private_net_id:\n type: string\n label: ECOMP management network name or ID\n description: Private network that connects ECOMP component and the VNF\n vlb_private_ip_0:\n type: string\n label: vLoadBalancer private IP address towards the private network\n description: Private IP address that is assigned to the vLoadBalancer to communicate with the vDNSs\n vlb_private_ip_1:\n type: string\n label: vLoadBalancer private IP address towards the ECOMP management network\n description: Private IP address that is assigned to the vLoadBalancer to communicate with ECOMP components\n vdns_private_ip_0:\n type: string\n label: vDNS private IP address towards the private network\n description: Private IP address that is assigned to the vDNS to communicate with the vLoadBalancer\n vdns_private_ip_1:\n type: string\n label: vDNS private IP address towards the ECOMP management network\n description: Private IP address that is assigned to the vDNS to communicate with ECOMP components\n vdns_name_0:\n type: string\n label: vDNS name\n description: Name of the vDNS\n vnf_id:\n type: string\n label: VNF ID\n description: The VNF ID is provided by ECOMP\n vf_module_id:\n type: string\n label: vFirewall module ID\n description: The vLoadBalancer Module ID is provided by ECOMP\n webserver_ip:\n type: string\n label: Webserver IP address\n description: IP address of the webserver that hosts the source code and binaries\n dcae_collector_ip:\n type: string\n label: DCAE collector IP address\n description: IP address of the DCAE collector\n key_name:\n type: string\n label: Key pair name\n description: Public/Private key pair name\n pub_key:\n type: string\n label: Public key\n description: Public key to be installed on the compute instance\n\nresources:\n vdns_0:\n type: OS::Nova::Server\n properties:\n image: { get_param: vlb_image_name }\n flavor: { get_param: vlb_flavor_name }\n name: { get_param: vdns_name_0 }\n key_name: { get_param: key_name }\n networks:\n - network: { get_param: public_net_id }\n - port: { get_resource: vdns_private_0_port }\n - port: { get_resource: vdns_private_1_port }\n metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}\n user_data_format: RAW\n user_data:\n str_replace:\n params:\n __webserver__: { get_param: webserver_ip }\n __lb_oam_int__ : { get_param: vlb_private_ip_1 }\n __lb_private_ipaddr__: { get_param: vlb_private_ip_0 }\n __local_private_ipaddr__: { get_param: vdns_private_ip_0 }\n template: |\n #!/bin/bash\n\n WEBSERVER_IP=__webserver__\n LB_OAM_INT=__lb_oam_int__\n LB_PRIVATE_IPADDR=__lb_private_ipaddr__\n LOCAL_PRIVATE_IPADDR=__local_private_ipaddr__\n\n mkdir /opt/config\n cd /opt\n wget http://$WEBSERVER_IP/demo_repo/v_dns_init.sh\n wget http://$WEBSERVER_IP/demo_repo/vdns.sh\n chmod +x v_dns_init.sh\n chmod +x vdns.sh\n echo $WEBSERVER_IP > config/webserver_ip.txt\n echo $LB_OAM_INT > config/lb_oam_int.txt\n echo $LB_PRIVATE_IPADDR > config/lb_private_ipaddr.txt\n echo $LOCAL_PRIVATE_IPADDR > config/local_private_ipaddr.txt\n echo \"no\" > config/install.txt\n mv vdns.sh /etc/init.d\n update-rc.d vdns.sh defaults\n ./v_dns_init.sh\n\n vdns_private_0_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: vlb_private_net_id }\n fixed_ips: [{\"subnet\": { get_param: vlb_private_net_id }, \"ip_address\": { get_param: vdns_private_ip_0 }}]\n\n vdns_private_1_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: ecomp_private_net_id }\n fixed_ips: [{\"subnet\": { get_param: ecomp_private_net_id }, \"ip_address\": { get_param: vdns_private_ip_1 }}]\n',300,'MANUAL RECORD','2016-11-14 13:04:07');
+
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','dcae_collector_ip','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','ecomp_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','ecomp_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','key_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','public_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','pub_key','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','vdns_private_ip_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','vdns_private_ip_1','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','vdsn_name_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','vf_module_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','vlb_flavor_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','vlb_image_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','vlb_name_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','vlb_private_ip_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','vlb_private_ip_1','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','vlb_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','vlb_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','vnf_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID1','webserver_ip','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','dcae_collector_ip','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','ecomp_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','key_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','public_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','pub_key','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vdns_private_ip_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vdns_private_ip_1','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vdsn_name_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vf_module_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vlb_flavor_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vlb_image_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vlb_private_ip_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vlb_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vnf_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','webserver_ip','','string',NULL);
+
+INSERT INTO `service` (`MODEL_UUID`, `MODEL_NAME`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `TOSCA_CSAR_ARTIFACT_UUID`) VALUES ('1e34774e-715e-4fd6-bd09-7b654622f35i','dns-service','585822c8-4027-4f84-ba50-e9248606f111','1.0','dns service for unit test','2016-11-14 13:04:07',NULL);
+
+INSERT INTO `service_to_resource_customizations` (`SERVICE_MODEL_UUID`, `RESOURCE_MODEL_CUSTOMIZATION_UUID`, `MODEL_TYPE`, `CREATION_TIMESTAMP`) VALUES ('1e34774e-715e-4fd6-bd09-7b654622f35i','302aa6be-a9fe-11e7-8b4b-0242ac120002','vnf','2017-10-05 18:51:28');
+
+INSERT INTO `vf_module` (`MODEL_UUID`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `MODEL_NAME`, `DESCRIPTION`, `IS_BASE`, `HEAT_TEMPLATE_ARTIFACT_UUID`, `VOL_HEAT_TEMPLATE_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VNF_RESOURCE_MODEL_UUID`) VALUES ('1e34774e-715e-4fd5-bd08-7b654622f33e.VF_RI1_DNS::module-1::module-1.group','585822c7-4027-4f84-ba50-e9248606f132','1.0','VF_RI1_DNS::module-1',NULL,1,'Artifact-UUID1',NULL,'2016-11-14 13:04:07','585822c7-4027-4f84-ba50-e9248606f131');
+INSERT INTO `vf_module` (`MODEL_UUID`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `MODEL_NAME`, `DESCRIPTION`, `IS_BASE`, `HEAT_TEMPLATE_ARTIFACT_UUID`, `VOL_HEAT_TEMPLATE_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VNF_RESOURCE_MODEL_UUID`) VALUES ('1e34774e-715e-4fd5-bd08-7b654622f33e.VF_RI1_DNS::module-2::module-1.group','585822c7-4027-4f84-ba50-e9248606f133','1.0','VF_RI1_DNS::module-2',NULL,0,'Artifact-UUID2',NULL,'2016-11-14 13:04:07','585822c7-4027-4f84-ba50-e9248606f131');
+
+INSERT INTO `vf_module_customization` (`MODEL_CUSTOMIZATION_UUID`, `LABEL`, `INITIAL_COUNT`, `MIN_INSTANCES`, `MAX_INSTANCES`, `AVAILABILITY_ZONE_COUNT`, `HEAT_ENVIRONMENT_ARTIFACT_UUID`, `VOL_ENVIRONMENT_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VF_MODULE_MODEL_UUID`) VALUES ('30316d81-a9fe-11e7-8b4b-0242ac120002',NULL,1,0,NULL,NULL,'EnvArtifact-UUID1',NULL,'2017-10-05 18:51:25','1e34774e-715e-4fd5-bd08-7b654622f33e.VF_RI1_DNS::module-1::module-1.group');
+INSERT INTO `vf_module_customization` (`MODEL_CUSTOMIZATION_UUID`, `LABEL`, `INITIAL_COUNT`, `MIN_INSTANCES`, `MAX_INSTANCES`, `AVAILABILITY_ZONE_COUNT`, `HEAT_ENVIRONMENT_ARTIFACT_UUID`, `VOL_ENVIRONMENT_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VF_MODULE_MODEL_UUID`) VALUES ('303170ae-a9fe-11e7-8b4b-0242ac120002',NULL,0,0,NULL,NULL,'EnvArtifact-UUID2',NULL,'2017-10-05 18:51:25','1e34774e-715e-4fd5-bd08-7b654622f33e.VF_RI1_DNS::module-2::module-1.group');
+INSERT INTO `vnf_res_custom_to_vf_module_custom` (`VNF_RESOURCE_CUST_MODEL_CUSTOMIZATION_UUID`, `VF_MODULE_CUST_MODEL_CUSTOMIZATION_UUID`, `CREATION_TIMESTAMP`) VALUES ('302aa6be-a9fe-11e7-8b4b-0242ac120002','30316d81-a9fe-11e7-8b4b-0242ac120002','2017-10-05 18:51:26');
+
+INSERT INTO `vnf_res_custom_to_vf_module_custom` (`VNF_RESOURCE_CUST_MODEL_CUSTOMIZATION_UUID`, `VF_MODULE_CUST_MODEL_CUSTOMIZATION_UUID`, `CREATION_TIMESTAMP`) VALUES ('302aa6be-a9fe-11e7-8b4b-0242ac120002','303170ae-a9fe-11e7-8b4b-0242ac120002','2017-10-05 18:51:26');
+
+INSERT INTO `vnf_resource` (`ORCHESTRATION_MODE`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `MODEL_UUID`, `AIC_VERSION_MIN`, `AIC_VERSION_MAX`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `MODEL_NAME`, `TOSCA_NODE_TYPE`, `HEAT_TEMPLATE_ARTIFACT_UUID`) VALUES ('HEAT','dns service for unit test1707MIGRATED','2016-11-14 13:04:07','585822c7-4027-4f84-ba50-e9248606f131',NULL,NULL,'585822c7-4027-4f84-ba50-e9248606f112','1.0','DNSResource',NULL,NULL);
+
+INSERT INTO `vnf_resource_customization` (`MODEL_CUSTOMIZATION_UUID`, `MODEL_INSTANCE_NAME`, `MIN_INSTANCES`, `MAX_INSTANCES`, `AVAILABILITY_ZONE_MAX_COUNT`, `NF_TYPE`, `NF_ROLE`, `NF_FUNCTION`, `NF_NAMING_CODE`, `CREATION_TIMESTAMP`, `VNF_RESOURCE_MODEL_UUID`) VALUES ('302aa6be-a9fe-11e7-8b4b-0242ac120002','DNSResource-1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2017-10-05 18:51:25','585822c7-4027-4f84-ba50-e9248606f131');
+
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
diff --git a/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-infra.sql b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-infra.sql
new file mode 100644
index 00000000..c8610aa6
--- /dev/null
+++ b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-infra.sql
@@ -0,0 +1,70 @@
+SOURCE ../default/create_mso_db-default.sql
+
+USE `mso_requests`;
+DROP USER 'mso';
+CREATE USER 'mso';
+GRANT ALL on mso_requests.* to 'mso' identified by 'mso123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+USE `mso_catalog`;
+DROP USER 'catalog';
+CREATE USER 'catalog';
+GRANT ALL on mso_catalog.* to 'catalog' identified by 'catalog123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+
+INSERT INTO `heat_environment` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('EnvArtifact-UUID2','base_vcpe_infra.env','1.0','base_vcpe_infra ENV file','parameters:\n vcpe_image_name: PUT THE IMAGE NAME HERE (Ubuntu 1604 SUGGESTED)\n vcpe_flavor_name: PUT THE FLAVOR NAME HERE (MEDIUM FLAVOR SUGGESTED)\n public_net_id: PUT THE PUBLIC NETWORK ID HERE\n cpe_signal_net_id: zdfw1cpe01_private\n cpe_signal_subnet_id: zdfw1cpe01_sub_private\n cpe_public_net_id: zdfw1cpe01_public\n cpe_public_subnet_id: zdfw1cpe01_sub_public\n onap_private_net_id: PUT THE ONAP PRIVATE NETWORK NAME HERE\n onap_private_subnet_id: PUT THE ONAP PRIVATE SUBNETWORK NAME HERE\n onap_private_net_cidr: 10.0.0.0/16\n cpe_signal_net_cidr: 10.4.0.0/24\n cpe_public_net_cidr: 10.2.0.0/24\n vdhcp_private_ip_0: 10.4.0.1\n vdhcp_private_ip_1: 10.0.101.1\n vaaa_private_ip_0: 10.4.0.4\n vaaa_private_ip_1: 10.0.101.2\n vdns_private_ip_0: 10.2.0.1\n vdns_private_ip_1: 10.0.101.3\n vweb_private_ip_0: 10.2.0.10\n vweb_private_ip_1: 10.0.101.40\n mr_ip_addr: 10.0.11.1\n vaaa_name_0: zdcpe1cpe01aaa01\n vdns_name_0: zdcpe1cpe01dns01\n vdhcp_name_0: zdcpe1cpe01dhcp01\n vweb_name_0: zdcpe1cpe01web01\n vnf_id: vCPE_Infrastructure_demo_app\n vf_module_id: vCPE_Intrastructure\n dcae_collector_ip: 10.0.4.1\n dcae_collector_port: 8081\n repo_url_blob: https://nexus.onap.org/content/sites/raw\n repo_url_artifacts: https://nexus.onap.org/content/groups/staging\n demo_artifacts_version: 1.2.0\n install_script_version: 1.2.0-SNAPSHOT\n key_name: vaaa_key\n pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN\n cloud_env: PUT THE CLOUD PROVIDED HERE (openstack or rackspace)\n','MANUAL RECORD','2018-04-28 13:04:07a');
+
+INSERT INTO `heat_template` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `TIMEOUT_MINUTES`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('Artifact-UUID2','base_vcpe_infra.yaml','1.0','Base VCPE INFRA Heat','heat_template_version: 2013-05-23\n\ndescription: Heat template to deploy vCPE Infrastructue emlements (vAAA, vDHCP, vDNS_DHCP, webServer)\n\nparameters:\n vcpe_image_name:\n type: string\n label: Image name or ID\n description: Image to be used for compute instance\n vcpe_flavor_name:\n type: string\n label: Flavor\n description: Type of instance (flavor) to be used\n public_net_id:\n type: string\n label: Public network name or ID\n description: Public network that enables remote connection to VNF\n onap_private_net_id:\n type: string\n label: ONAP management network name or ID\n description: Private network that connects ONAP components and the VNF\n onap_private_subnet_id:\n type: string\n label: ONAP management sub-network name or ID\n description: Private sub-network that connects ONAP components and the VNF\n onap_private_net_cidr:\n type: string\n label: ONAP private network CIDR\n description: The CIDR of the protected private network\n cpe_signal_net_id:\n type: string\n label: vAAA private network name or ID\n description: Private network that connects vAAA with vDNSs\n cpe_signal_subnet_id:\n type: string\n label: CPE Signal subnet\n description: CPE Signal subnet\n cpe_signal_net_cidr:\n type: string\n label: vAAA private network CIDR\n description: The CIDR of the vAAA private network\n cpe_public_net_id:\n type: string\n label: vCPE Public network (emulates internet) name or ID\n description: Private network that connects vGW to emulated internet\n cpe_public_subnet_id:\n type: string\n label: CPE Public subnet\n description: CPE Public subnet\n cpe_public_net_cidr:\n type: string\n label: vCPE public network CIDR\n description: The CIDR of the vCPE public\n vaaa_private_ip_0:\n type: string\n label: vAAA private IP address towards the CPE_SIGNAL private network\n description: Private IP address that is assigned to the vAAA to communicate with the vCPE components\n vaaa_private_ip_1:\n type: string\n label: vAAA private IP address towards the ONAP management network\n description: Private IP address that is assigned to the vAAA to communicate with ONAP components\n vdns_private_ip_0:\n type: string\n label: vDNS private IP address towards the CPE_PUBLIC private network\n description: Private IP address that is assigned to the vDNS to communicate with the vCPE components\n vdns_private_ip_1:\n type: string\n label: vDNS private IP address towards the ONAP management network\n description: Private IP address that is assigned to the vDNS to communicate with ONAP components\n vdhcp_private_ip_0:\n type: string\n label: vDHCP private IP address towards the CPE_SIGNAL private network\n description: Private IP address that is assigned to the vDHCP to communicate with the vCPE components\n vdhcp_private_ip_1:\n type: string\n label: vDNS private IP address towards the ONAP management network\n description: Private IP address that is assigned to the vDHCP to communicate with ONAP components\n vweb_private_ip_0:\n type: string\n label: vWEB private IP address towards the CPE_PUBLIC private network\n description: Private IP address that is assigned to the vWEB to communicate with the vGWs \n vweb_private_ip_1:\n type: string\n label: vWEB private IP address towards the ONAP management network\n description: Private IP address that is assigned to the vWEB to communicate with ONAP components\n vaaa_name_0:\n type: string\n label: vAAA name\n description: Name of the vAAA\n vdns_name_0:\n type: string\n label: vDNS name\n description: Name of the vDNS\n vdhcp_name_0:\n type: string\n label: vDHCP name\n description: Name of the vDHCP\n vweb_name_0:\n type: string\n label: vWEB name\n description: Name of the vWEB \n vnf_id:\n type: string\n label: VNF ID\n description: The VNF ID is provided by ONAP\n vf_module_id:\n type: string\n label: vFirewall module ID\n description: The vAAA Module ID is provided by ONAP\n dcae_collector_ip:\n type: string\n label: DCAE collector IP address\n description: IP address of the DCAE collector\n dcae_collector_port:\n type: string\n label: DCAE collector port\n description: Port of the DCAE collector\n mr_ip_addr:\n type: string\n label: Message Router IP address\n description: IP address of the Message Router that for vDHCP configuration \n key_name:\n type: string\n label: Key pair name\n description: Public/Private key pair name\n pub_key:\n type: string\n label: Public key\n description: Public key to be installed on the compute instance\n repo_url_blob:\n type: string\n label: Repository URL\n description: URL of the repository that hosts the demo packages\n repo_url_artifacts:\n type: string\n label: Repository URL\n description: URL of the repository that hosts the demo packages\n install_script_version:\n type: string\n label: Installation script version number\n description: Version number of the scripts that install the vFW demo app\n demo_artifacts_version:\n type: string\n label: Artifacts version used in demo vnfs\n description: Artifacts (jar, tar.gz) version used in demo vnfs\n cloud_env:\n type: string\n label: Cloud environment\n description: Cloud environment (e.g., openstack, rackspace)\n\nresources:\n\n random-str:\n type: OS::Heat::RandomString\n properties:\n length: 4\n\n my_keypair:\n type: OS::Nova::KeyPair\n properties:\n name:\n str_replace:\n template: base_rand\n params:\n base: { get_param: key_name }\n rand: { get_resource: random-str }\n public_key: { get_param: pub_key }\n save_private_key: false\n\n\n vaaa_private_0_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: cpe_signal_net_id }\n fixed_ips: [{"subnet": { get_param: cpe_signal_subnet_id }, "ip_address": { get_param: vaaa_private_ip_0 }}]\n\n vaaa_private_1_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: onap_private_net_id }\n fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vaaa_private_ip_1 }}]\n\n vaaa_0:\n type: OS::Nova::Server\n properties:\n image: { get_param: vcpe_image_name }\n flavor: { get_param: vcpe_flavor_name }\n name: { get_param: vaaa_name_0 }\n key_name: { get_resource: my_keypair }\n networks:\n - network: { get_param: public_net_id }\n - port: { get_resource: vaaa_private_0_port }\n - port: { get_resource: vaaa_private_1_port }\n metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}\n user_data_format: RAW\n user_data:\n str_replace:\n params:\n __dcae_collector_ip__: { get_param: dcae_collector_ip }\n __dcae_collector_port__: { get_param: dcae_collector_port }\n __cpe_signal_net_ipaddr__: { get_param: vaaa_private_ip_0 }\n __oam_ipaddr__: { get_param: vaaa_private_ip_1 }\n __oam_cidr__: { get_param: onap_private_net_cidr }\n __cpe_signal_net_cidr__: { get_param: cpe_signal_net_cidr }\n __repo_url_blob__ : { get_param: repo_url_blob }\n __repo_url_artifacts__ : { get_param: repo_url_artifacts }\n __demo_artifacts_version__ : { get_param: demo_artifacts_version }\n __install_script_version__ : { get_param: install_script_version }\n __cloud_env__ : { get_param: cloud_env }\n template: |\n #!/bin/bash\n\n mkdir /opt/config\n echo "__dcae_collector_ip__" > /opt/config/dcae_collector_ip.txt\n echo "__dcae_collector_port__" > /opt/config/dcae_collector_port.txt\n echo "__cpe_signal_net_ipaddr__" > /opt/config/cpe_signal_net_ipaddr.txt\n echo "__oam_ipaddr__" > /opt/config/oam_ipaddr.txt\n echo "__oam_cidr__" > /opt/config/oam_cidr.txt\n echo "__cpe_signal_net_cidr__" > /opt/config/cpe_signal_net_cidr.txt\n echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt\n echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt\n echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt\n echo "__install_script_version__" > /opt/config/install_script_version.txt\n echo "__cloud_env__" > /opt/config/cloud_env.txt\n\n curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_aaa_install.sh -o /opt/v_aaa_install.sh\n cd /opt\n chmod +x v_aaa_install.sh\n ./v_aaa_install.sh\n\n\n vdns_private_0_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: cpe_public_net_id }\n fixed_ips: [{"subnet": { get_param: cpe_public_subnet_id }, "ip_address": { get_param: vdns_private_ip_0 }}]\n\n vdns_private_1_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: onap_private_net_id }\n fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vdns_private_ip_1 }}]\n\n vdns_0:\n type: OS::Nova::Server\n properties:\n image: { get_param: vcpe_image_name }\n flavor: { get_param: vcpe_flavor_name }\n name: { get_param: vdns_name_0 }\n key_name: { get_resource: my_keypair }\n networks:\n - network: { get_param: public_net_id }\n - port: { get_resource: vdns_private_0_port }\n - port: { get_resource: vdns_private_1_port }\n metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}\n user_data_format: RAW\n user_data:\n str_replace:\n params:\n __oam_ipaddr__ : { get_param: vdns_private_ip_1 }\n __cpe_public_net_ipaddr__: { get_param: vdns_private_ip_0 }\n __oam_cidr__: { get_param: onap_private_net_cidr }\n __cpe_public_net_cidr__: { get_param: cpe_public_net_cidr }\n __repo_url_blob__ : { get_param: repo_url_blob }\n __repo_url_artifacts__ : { get_param: repo_url_artifacts }\n __demo_artifacts_version__ : { get_param: demo_artifacts_version }\n __install_script_version__ : { get_param: install_script_version }\n __cloud_env__ : { get_param: cloud_env }\n template: |\n #!/bin/bash\n\n mkdir /opt/config\n echo "__oam_ipaddr__" > /opt/config/oam_ipaddr.txt\n echo "__cpe_public_net_ipaddr__" > /opt/config/cpe_public_net_ipaddr.txt\n echo "__oam_cidr__" > /opt/config/oam_cidr.txt\n echo "__cpe_public_net_cidr__" > /opt/config/cpe_public_net_cidr.txt\n echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt\n echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt\n echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt\n echo "__install_script_version__" > /opt/config/install_script_version.txt\n echo "__cloud_env__" > /opt/config/cloud_env.txt\n\n curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_dns_install.sh -o /opt/v_dns_install.sh\n cd /opt\n chmod +x v_dns_install.sh\n ./v_dns_install.sh\n\n\n vdhcp_private_0_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: cpe_signal_net_id }\n fixed_ips: [{"subnet": { get_param: cpe_signal_subnet_id }, "ip_address": { get_param: vdhcp_private_ip_0 }}]\n\n vdhcp_private_1_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: onap_private_net_id }\n fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vdhcp_private_ip_1 }}]\n\n vdhcp_0:\n type: OS::Nova::Server\n properties:\n image: { get_param: vcpe_image_name }\n flavor: { get_param: vcpe_flavor_name }\n name: { get_param: vdhcp_name_0 }\n key_name: { get_resource: my_keypair }\n networks:\n - network: { get_param: public_net_id }\n - port: { get_resource: vdhcp_private_0_port }\n - port: { get_resource: vdhcp_private_1_port }\n metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}\n user_data_format: RAW\n user_data:\n str_replace:\n params:\n __oam_ipaddr__ : { get_param: vdhcp_private_ip_1 }\n __cpe_signal_ipaddr__ : { get_param: vdhcp_private_ip_0 }\n __oam_cidr__ : { get_param: onap_private_net_cidr }\n __cpe_signal_net_cidr__ : { get_param: cpe_signal_net_cidr }\n __mr_ip_addr__ : { get_param: mr_ip_addr }\n __repo_url_blob__ : { get_param: repo_url_blob }\n __repo_url_artifacts__ : { get_param: repo_url_artifacts }\n __demo_artifacts_version__ : { get_param: demo_artifacts_version }\n __install_script_version__ : { get_param: install_script_version }\n __cloud_env__ : { get_param: cloud_env }\n template: |\n #!/bin/bash\n\n mkdir /opt/config\n echo "__oam_ipaddr__" > /opt/config/oam_ipaddr.txt\n echo "__cpe_signal_ipaddr__" > /opt/config/cpe_signal_ipaddr.txt\n echo "__oam_cidr__" > /opt/config/oam_cidr.txt\n echo "__cpe_signal_net_cidr__" > /opt/config/cpe_signal_net_cidr.txt\n echo "__mr_ip_addr__" > /opt/config/mr_ip_addr.txt\n echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt\n echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt\n echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt\n echo "__install_script_version__" > /opt/config/install_script_version.txt\n echo "__cloud_env__" > /opt/config/cloud_env.txt\n\n curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_dhcp_install.sh -o /opt/v_dhcp_install.sh\n cd /opt\n chmod +x v_dhcp_install.sh\n ./v_dhcp_install.sh\n\n vweb_private_0_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: cpe_public_net_id }\n fixed_ips: [{"subnet": { get_param: cpe_public_subnet_id }, "ip_address": { get_param: vweb_private_ip_0 }}]\n\n vweb_private_1_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: onap_private_net_id }\n fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vweb_private_ip_1 }}]\n\n\n vweb_0:\n type: OS::Nova::Server\n properties:\n image: { get_param: vcpe_image_name }\n flavor: { get_param: vcpe_flavor_name }\n name: { get_param: vweb_name_0 }\n key_name: { get_resource: my_keypair }\n networks:\n - network: { get_param: public_net_id }\n - port: { get_resource: vweb_private_0_port }\n - port: { get_resource: vweb_private_1_port }\n metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}\n user_data_format: RAW\n user_data:\n str_replace:\n params:\n __oam_ipaddr__ : { get_param: vweb_private_ip_1 }\n __cpe_public_ipaddr__: { get_param: vweb_private_ip_0 }\n __oam_cidr__: { get_param: onap_private_net_cidr }\n __cpe_public_net_cidr__: { get_param: cpe_public_net_cidr }\n __repo_url_blob__ : { get_param: repo_url_blob }\n __repo_url_artifacts__ : { get_param: repo_url_artifacts }\n __demo_artifacts_version__ : { get_param: demo_artifacts_version }\n __install_script_version__ : { get_param: install_script_version }\n __cloud_env__ : { get_param: cloud_env }\n template: |\n #!/bin/bash\n\n mkdir /opt/config\n echo "__oam_ipaddr__" > /opt/config/oam_ipaddr.txt\n echo "__cpe_public_ipaddr__" > /opt/config/cpe_public_ipaddr.txt\n echo "__oam_cidr__" > /opt/config/oam_cidr.txt\n echo "__cpe_public_net_cidr__" > /opt/config/cpe_public_net_cidr.txt\n echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt\n echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt\n echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt\n echo "__install_script_version__" > /opt/config/install_script_version.txt\n echo "__cloud_env__" > /opt/config/cloud_env.txt\n\n curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_web_install.sh -o /opt/v_web_install.sh\n cd /opt\n chmod +x v_web_install.sh\n ./v_web_install.sh\n',300,'MANUAL RECORD','2018-04-28 13:04:07');
+
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','cloud_env','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','pub_key','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','key_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','install_script_version','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','demo_artifacts_version','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','repo_url_artifacts','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','repo_url_blob','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','dcae_collector_port','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','dcae_collector_ip','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vf_module_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vnf_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vweb_name_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vdhcp_name_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vdns_name_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vaaa_name_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','mr_ip_addr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vweb_private_ip_1','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vweb_private_ip_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vdns_private_ip_1','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vdns_private_ip_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vaaa_private_ip_1','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vaaa_private_ip_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vdhcp_private_ip_1','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vdhcp_private_ip_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','cpe_public_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','cpe_signal_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','onap_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','onap_private_subnet_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','onap_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','cpe_public_subnet_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','cpe_public_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','cpe_signal_subnet_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','cpe_signal_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','public_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vcpe_flavor_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID2','vcpe_image_name','','string',NULL);
+
+INSERT INTO `service` (`MODEL_UUID`, `MODEL_NAME`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `TOSCA_CSAR_ARTIFACT_UUID`) VALUES ('2e34774e-715e-4fd5-bd09-7b654622f35i','infra-service','585822c7-4027-4f84-ba50-e9248606f112','1.0','INFRA service','2018-04-28 13:04:07',NULL);
+
+INSERT INTO `vf_module` (`MODEL_UUID`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `MODEL_NAME`, `DESCRIPTION`, `IS_BASE`, `HEAT_TEMPLATE_ARTIFACT_UUID`, `VOL_HEAT_TEMPLATE_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VNF_RESOURCE_MODEL_UUID`) VALUES ('1e34774e-715e-4fd5-bd08-7b654622f33f.VF_RI1_VFW::module-1::module-1.group','585822c7-4027-4f84-ba50-e9248606f134','1.0','VF_RI1_VFW::module-1',NULL,1,'Artifact-UUID2',NULL,'2018-04-28 13:04:07','685822c7-4027-4f84-ba50-e9248606f132');
+
+INSERT INTO `vf_module_customization` (`MODEL_CUSTOMIZATION_UUID`, `LABEL`, `INITIAL_COUNT`, `MIN_INSTANCES`, `MAX_INSTANCES`, `AVAILABILITY_ZONE_COUNT`, `HEAT_ENVIRONMENT_ARTIFACT_UUID`, `VOL_ENVIRONMENT_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VF_MODULE_MODEL_UUID`) VALUES ('5aa23938-a9fe-11e7-8b4b-0242ac120002',NULL,1,0,NULL,NULL,'EnvArtifact-UUID2',NULL,'2018-04-28 18:52:03','1e34774e-715e-4fd5-bd08-7b654622f33f.VF_RI1_VFW::module-1::module-1.group');
+
+INSERT INTO `vnf_res_custom_to_vf_module_custom` (`VNF_RESOURCE_CUST_MODEL_CUSTOMIZATION_UUID`, `VF_MODULE_CUST_MODEL_CUSTOMIZATION_UUID`, `CREATION_TIMESTAMP`) VALUES ('5a9bd247-a9fe-11e7-8b4b-0242ac120002','5aa23938-a9fe-11e7-8b4b-0242ac120002','2018-04-28 18:52:03');
+
+INSERT INTO `vnf_resource` (`ORCHESTRATION_MODE`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `MODEL_UUID`, `AIC_VERSION_MIN`, `AIC_VERSION_MAX`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `MODEL_NAME`, `TOSCA_NODE_TYPE`, `HEAT_TEMPLATE_ARTIFACT_UUID`) VALUES ('HEAT','INFRA service1707MIGRATED','2018-04-28 13:04:07','685822c7-4027-4f84-ba50-e9248606f132',NULL,NULL,'585822c7-4027-4f84-ba50-e9248606f113','1.0','INFRAResource',NULL,NULL);
+
+INSERT INTO `vnf_resource_customization` (`MODEL_CUSTOMIZATION_UUID`, `MODEL_INSTANCE_NAME`, `MIN_INSTANCES`, `MAX_INSTANCES`, `AVAILABILITY_ZONE_MAX_COUNT`, `NF_TYPE`, `NF_ROLE`, `NF_FUNCTION`, `NF_NAMING_CODE`, `CREATION_TIMESTAMP`, `VNF_RESOURCE_MODEL_UUID`) VALUES ('5a9bd247-a9fe-11e7-8b4b-0242ac120002','VFWResource-1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2018-04-28 18:52:03','685822c7-4027-4f84-ba50-e9248606f132');
+
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
diff --git a/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vbng.sql b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vbng.sql
new file mode 100644
index 00000000..baf96327
--- /dev/null
+++ b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vbng.sql
@@ -0,0 +1,69 @@
+SOURCE ../default/create_mso_db-default.sql
+
+USE `mso_requests`;
+DROP USER 'mso';
+CREATE USER 'mso';
+GRANT ALL on mso_requests.* to 'mso' identified by 'mso123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+USE `mso_catalog`;
+DROP USER 'catalog';
+CREATE USER 'catalog';
+GRANT ALL on mso_catalog.* to 'catalog' identified by 'catalog123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+
+INSERT INTO `heat_environment` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('EnvArtifact-UUID5','base_vcpe_vbng.env','1.2.0','base_vbng ENV file','parameters:\n vcpe_image_name: PUT THE IMAGE NAME HERE (Ubuntu 1604 SUGGESTED)\n vcpe_flavor_name: PUT THE FLAVOR NAME HERE (MEDIUM FLAVOR SUGGESTED)\n public_net_id: PUT THE PUBLIC NETWORK ID HERE\n brgemu_bng_private_net_id: zdfw1bngin01_private\n brgemu_bng_private_subnet_id: zdfw1bngin01_sub_private\n bng_gmux_private_net_id: zdfw1bngmux01_private\n bng_gmux_private_subnet_id: zdfw1bngmux01_sub_private\n onap_private_net_id: PUT THE ONAP PRIVATE NETWORK NAME HERE\n onap_private_subnet_id: PUT THE ONAP PRIVATE SUBNETWORK NAME HERE\n onap_private_net_cidr: 10.0.0.0/16\n cpe_signal_net_id: zdfw1cpe01_private\n cpe_signal_subnet_id: zdfw1cpe01_sub_private\n brgemu_bng_private_net_cidr: 10.3.0.0/24\n bng_gmux_private_net_cidr: 10.1.0.0/24\n cpe_signal_private_net_cidr: 10.4.0.0/24\n vbng_private_ip_0: 10.3.0.1\n vbng_private_ip_1: 10.0.101.10\n vbng_private_ip_2: 10.4.0.3\n vbng_private_ip_3: 10.1.0.10\n vbng_name_0: zdcpe1cpe01bng01\n vnf_id: vCPE_Infrastructure_Metro_vBNG_demo_app\n vf_module_id: vCPE_Intrastructure_Metro_vBNG\n sdnc_ip_addr: 10.0.7.1\n dcae_collector_ip: 10.0.4.1\n dcae_collector_port: 8081\n repo_url_blob: https://nexus.onap.org/content/sites/raw\n repo_url_artifacts: https://nexus.onap.org/content/groups/staging\n demo_artifacts_version: 1.2.0\n install_script_version: 1.2.0-SNAPSHOT\n key_name: vbng_key\n pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN\n cloud_env: PUT THE CLOUD PROVIDED HERE (openstack or rackspace)\n vpp_source_repo_url: https://gerrit.fd.io/r/vpp\n vpp_source_repo_branch: stable/1704\n vpp_patch_url: https://git.onap.org/demo/plain/vnfs/vCPE/vpp-radius-client-for-vbng/src/patches/Vpp-Integrate-FreeRADIUS-Client-for-vBNG.patch','MANUAL RECORD','2018-04-28 13:04:07');
+
+INSERT INTO `heat_template` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `TIMEOUT_MINUTES`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('Artifact-UUID5','base_vcpe_vbng.yaml','1.0','Base VBNG Heat','heat_template_version: 2013-05-23\n\ndescription: Heat template to deploy vCPE virtual Broadband Network Gateway (vBNG)\n\nparameters:\n vcpe_image_name:\n type: string\n label: Image name or ID\n description: Image to be used for compute instance\n vcpe_flavor_name:\n type: string\n label: Flavor\n description: Type of instance (flavor) to be used\n public_net_id:\n type: string\n label: Public network name or ID\n description: Public network that enables remote connection to VNF\n brgemu_bng_private_net_id:\n type: string\n label: vBNG IN private network name or ID\n description: Private network that connects vBRG to vBNG\n brgemu_bng_private_subnet_id:\n type: string\n label: vBNG IN private sub-network name or ID\n description: vBNG IN private sub-network name or ID\n brgemu_bng_private_net_cidr:\n type: string\n label: vBNG IN private network CIDR\n description: The CIDR of the input side of vBNG private network\n bng_gmux_private_net_id:\n type: string\n label: vBNG vGMUX private network name or ID\n description: Private network that connects vBNG to vGMUX\n bng_gmux_private_subnet_id:\n type: string\n label: vBNG vGMUX private sub-network name or ID\n description: vBNG vGMUX private sub-network name or ID\n bng_gmux_private_net_cidr:\n type: string\n label: vGMUX private network CIDR\n description: The CIDR of the input side of vGMUX private network\n onap_private_net_id:\n type: string\n label: ONAP management network name or ID\n description: Private network that connects ONAP components and the VNF\n onap_private_subnet_id:\n type: string\n label: ONAP management sub-network name or ID\n description: Private sub-network that connects ONAP components and the VNF\n onap_private_net_cidr:\n type: string\n label: ONAP private network CIDR\n description: The CIDR of the protected private network\n cpe_signal_net_id:\n type: string\n label: vCPE private network name or ID\n description: Private network that connects vCPE elements with vCPE infrastructure elements\n cpe_signal_subnet_id:\n type: string\n label: vCPE private sub-network name or ID\n description: vCPE private sub-network name or ID\n cpe_signal_private_net_cidr:\n type: string\n label: vAAA private network CIDR\n description: The CIDR of the vAAA private network\n vbng_private_ip_0:\n type: string\n label: vBNG IN private IP address\n description: Private IP address that is assigned to the vBNG IN\n vbng_private_ip_1:\n type: string\n label: vBNG private IP address towards the ONAP management network\n description: Private IP address that is assigned to the vBNG to communicate with ONAP components\n vbng_private_ip_2:\n type: string\n label: vBNG to CPE_SIGNAL private IP address\n description: Private IP address that is assigned to the vBNG in the CPE_SIGNAL network\n vbng_private_ip_3:\n type: string\n label: vBNG to vGMUX private IP address\n description: Private IP address that is assigned to the vBNG to vGMUX port\n vbng_name_0:\n type: string\n label: vBNG name\n description: Name of the vBNG\n vnf_id:\n type: string\n label: VNF ID\n description: The VNF ID is provided by ONAP\n vf_module_id:\n type: string\n label: vCPE module ID\n description: The vCPE Module ID is provided by ONAP\n dcae_collector_ip:\n type: string\n label: DCAE collector IP address\n description: IP address of the DCAE collector\n dcae_collector_port:\n type: string\n label: DCAE collector port\n description: Port of the DCAE collector\n key_name:\n type: string\n label: Key pair name\n description: Public/Private key pair name\n pub_key:\n type: string\n label: Public key\n description: Public key to be installed on the compute instance\n repo_url_blob:\n type: string\n label: Repository URL\n description: URL of the repository that hosts the demo packages\n repo_url_artifacts:\n type: string\n label: Repository URL\n description: URL of the repository that hosts the demo packages\n install_script_version:\n type: string\n label: Installation script version number\n description: Version number of the scripts that install the vFW demo app\n demo_artifacts_version:\n type: string\n label: Artifacts version used in demo vnfs\n description: Artifacts (jar, tar.gz) version used in demo vnfs\n cloud_env:\n type: string\n label: Cloud environment\n description: Cloud environment (e.g., openstack, rackspace)\n vpp_source_repo_url:\n type: string\n label: VPP Source Git Repo\n description: URL for VPP source codes\n vpp_source_repo_branch:\n type: string\n label: VPP Source Git Branch\n description: Git Branch for the VPP source codes\n vpp_patch_url:\n type: string\n label: VPP Patch URL\n description: URL for VPP patch for vBNG\n sdnc_ip_addr:\n type: string\n label: SDNC IP address\n description: IP address of the SDNC\n\nresources:\n\n random-str:\n type: OS::Heat::RandomString\n properties:\n length: 4\n\n my_keypair:\n type: OS::Nova::KeyPair\n properties:\n name:\n str_replace:\n template: base_rand\n params:\n base: { get_param: key_name }\n rand: { get_resource: random-str }\n public_key: { get_param: pub_key }\n save_private_key: false\n\n\n vbng_private_0_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: brgemu_bng_private_net_id }\n fixed_ips: [{"subnet": { get_param: brgemu_bng_private_subnet_id }, "ip_address": { get_param: vbng_private_ip_0 }}]\n\n vbng_private_1_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: onap_private_net_id }\n fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vbng_private_ip_1 }}]\n\n vbng_private_2_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: cpe_signal_net_id }\n fixed_ips: [{"subnet": { get_param: cpe_signal_subnet_id }, "ip_address": { get_param: vbng_private_ip_2 }}]\n\n vbng_private_3_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: bng_gmux_private_net_id }\n fixed_ips: [{"subnet": { get_param: bng_gmux_private_subnet_id }, "ip_address": { get_param: vbng_private_ip_3 }}]\n\n vbng_0:\n type: OS::Nova::Server\n properties:\n image: { get_param: vcpe_image_name }\n flavor: { get_param: vcpe_flavor_name }\n name: { get_param: vbng_name_0 }\n key_name: { get_resource: my_keypair }\n networks:\n - network: { get_param: public_net_id }\n - port: { get_resource: vbng_private_0_port }\n - port: { get_resource: vbng_private_1_port }\n - port: { get_resource: vbng_private_2_port }\n - port: { get_resource: vbng_private_3_port }\n metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}\n user_data_format: RAW\n user_data:\n str_replace:\n params:\n __oam_ipaddr__: { get_param: vbng_private_ip_1 }\n __brgemu_bng_net_ipaddr__: { get_param: vbng_private_ip_0 }\n __cpe_signal_net_ipaddr__: { get_param: vbng_private_ip_2 }\n __bng_gmux_net_ipaddr__: { get_param: vbng_private_ip_3 }\n __oam_cidr__: { get_param: onap_private_net_cidr }\n __brgemu_bng_cidr__: { get_param: brgemu_bng_private_net_cidr }\n __cpe_signal_cidr__: { get_param: cpe_signal_private_net_cidr }\n __bng_gmux_cidr__: { get_param: bng_gmux_private_net_cidr }\n __dcae_collector_ip__: { get_param: dcae_collector_ip }\n __dcae_collector_port__: { get_param: dcae_collector_port }\n __repo_url_blob__ : { get_param: repo_url_blob }\n __repo_url_artifacts__ : { get_param: repo_url_artifacts }\n __demo_artifacts_version__ : { get_param: demo_artifacts_version }\n __install_script_version__ : { get_param: install_script_version }\n __cloud_env__ : { get_param: cloud_env }\n __vpp_source_repo_url__ : { get_param: vpp_source_repo_url }\n __vpp_source_repo_branch__ : { get_param: vpp_source_repo_branch }\n __vpp_patch_url__ : { get_param: vpp_patch_url }\n __sdnc_ip_addr__: { get_param: sdnc_ip_addr }\n template: |\n #!/bin/bash\n\n mkdir /opt/config\n echo "__brgemu_bng_net_ipaddr__" > /opt/config/brgemu_bng_net_ipaddr.txt\n echo "__cpe_signal_net_ipaddr__" > /opt/config/cpe_signal_net_ipaddr.txt\n echo "__bng_gmux_net_ipaddr__" > /opt/config/bng_gmux_net_ipaddr.txt\n echo "__oam_ipaddr__" > /opt/config/oam_ipaddr.txt\n echo "__oam_cidr__" > /opt/config/oam_cidr.txt\n echo "__bng_gmux_cidr__" > /opt/config/bng_gmux_net_cidr.txt\n echo "__cpe_signal_cidr__" > /opt/config/cpe_signal_net_cidr.txt\n echo "__brgemu_bng_cidr__" > /opt/config/brgemu_bng_net_cidr.txt\n echo "__dcae_collector_ip__" > /opt/config/dcae_collector_ip.txt\n echo "__dcae_collector_port__" > /opt/config/dcae_collector_port.txt\n echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt\n echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt\n echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt\n echo "__install_script_version__" > /opt/config/install_script_version.txt\n echo "__cloud_env__" > /opt/config/cloud_env.txt\n echo "__vpp_source_repo_url__" > /opt/config/vpp_source_repo_url.txt\n echo "__vpp_source_repo_branch__" > /opt/config/vpp_source_repo_branch.txt\n echo "__vpp_patch_url__" > /opt/config/vpp_patch_url.txt\n echo "__sdnc_ip_addr__" > /opt/config/sdnc_ip_addr.txt\n\n curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_bng_install.sh -o /opt/v_bng_install.sh\n cd /opt\n chmod +x v_bng_install.sh\n ./v_bng_install.sh\n',300,'MANUAL RECORD','2018-04-27 13:04:07');
+
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','vpp_patch_url','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','vpp_source_repo_branch','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','vpp_source_repo_url','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','cloud_env','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','pub_key','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','key_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','install_script_version','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','demo_artifacts_version','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','repo_url_artifacts','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','repo_url_blob','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','dcae_collector_port','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','dcae_collector_ip','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','sdnc_ip_addr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','vf_module_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','vnf_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','vbng_name_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','vbng_private_ip_3','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','vbng_private_ip_2','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','vbng_private_ip_1','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','vbng_private_ip_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','cpe_signal_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','bng_gmux_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','brgemu_bng_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','cpe_signal_subnet_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','cpe_signal_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','onap_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','onap_private_subnet_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','onap_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','bng_gmux_private_subnet_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','bng_gmux_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','brgemu_bng_private_subnet_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','brgemu_bng_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','public_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','vcpe_flavor_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID5','vcpe_image_name','','string',NULL);
+
+INSERT INTO `service` (`MODEL_UUID`, `MODEL_NAME`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `TOSCA_CSAR_ARTIFACT_UUID`) VALUES ('a94f8ff8-442d-11e8-8a14-0320c6d83cc0','vbng-service','fba765a0-442d-11e8-b89d-57dec24c6cba','1.0','VBNG service','2018-04-28 13:04:07',NULL);
+
+INSERT INTO `vf_module` (`MODEL_UUID`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `MODEL_NAME`, `DESCRIPTION`, `IS_BASE`, `HEAT_TEMPLATE_ARTIFACT_UUID`, `VOL_HEAT_TEMPLATE_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VNF_RESOURCE_MODEL_UUID`) VALUES ('1e34774e-715e-4fd5-bd08-7b654622f33f.VF_RI1_VFW::module-1::module-1.group','585822c7-4027-4f84-ba50-e9248606f134','1.0','VF_RI1_VFW::module-1',NULL,1,'Artifact-UUID5',NULL,'2018-04-28 13:04:07','685822c7-4027-4f84-ba50-e9248606f132');
+
+INSERT INTO `vf_module_customization` (`MODEL_CUSTOMIZATION_UUID`, `LABEL`, `INITIAL_COUNT`, `MIN_INSTANCES`, `MAX_INSTANCES`, `AVAILABILITY_ZONE_COUNT`, `HEAT_ENVIRONMENT_ARTIFACT_UUID`, `VOL_ENVIRONMENT_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VF_MODULE_MODEL_UUID`) VALUES ('5aa23938-a9fe-11e7-8b4b-0242ac120002',NULL,1,0,NULL,NULL,'EnvArtifact-UUID5',NULL,'2018-04-28 18:52:03','1e34774e-715e-4fd5-bd08-7b654622f33f.VF_RI1_VFW::module-1::module-1.group');
+
+INSERT INTO `vnf_res_custom_to_vf_module_custom` (`VNF_RESOURCE_CUST_MODEL_CUSTOMIZATION_UUID`, `VF_MODULE_CUST_MODEL_CUSTOMIZATION_UUID`, `CREATION_TIMESTAMP`) VALUES ('5a9bd247-a9fe-11e7-8b4b-0242ac120002','5aa23938-a9fe-11e7-8b4b-0242ac120002','2018-04-28 18:52:03');
+
+INSERT INTO `vnf_resource` (`ORCHESTRATION_MODE`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `MODEL_UUID`, `AIC_VERSION_MIN`, `AIC_VERSION_MAX`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `MODEL_NAME`, `TOSCA_NODE_TYPE`, `HEAT_TEMPLATE_ARTIFACT_UUID`) VALUES ('HEAT','VBNG service1707MIGRATED','2018-04-28 13:04:07','685822c7-4027-4f84-ba50-e9248606f132',NULL,NULL,'585822c7-4027-4f84-ba50-e9248606f113','1.0','VFWResource',NULL,NULL);
+
+INSERT INTO `vnf_resource_customization` (`MODEL_CUSTOMIZATION_UUID`, `MODEL_INSTANCE_NAME`, `MIN_INSTANCES`, `MAX_INSTANCES`, `AVAILABILITY_ZONE_MAX_COUNT`, `NF_TYPE`, `NF_ROLE`, `NF_FUNCTION`, `NF_NAMING_CODE`, `CREATION_TIMESTAMP`, `VNF_RESOURCE_MODEL_UUID`) VALUES ('5a9bd247-a9fe-11e7-8b4b-0242ac120002','VBNGResource-1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2018-04-28 18:52:03','685822c7-4027-4f84-ba50-e9248606f132');
+
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
diff --git a/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vbrgemu.sql b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vbrgemu.sql
new file mode 100644
index 00000000..36aaa99e
--- /dev/null
+++ b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vbrgemu.sql
@@ -0,0 +1,58 @@
+SOURCE ../default/create_mso_db-default.sql
+
+USE `mso_requests`;
+DROP USER 'mso';
+CREATE USER 'mso';
+GRANT ALL on mso_requests.* to 'mso' identified by 'mso123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+USE `mso_catalog`;
+DROP USER 'catalog';
+CREATE USER 'catalog';
+GRANT ALL on mso_catalog.* to 'catalog' identified by 'catalog123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+
+INSERT INTO `heat_environment` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('EnvArtifact-UUID6','base_vcpe_vbrgemu.env','1.0','base_vcpe_vbrgemu ENV file','parameters:\n vcpe_image_name: PUT THE IMAGE NAME HERE (Ubuntu 1604 or vbrg-base-ubuntu-16-04 SUGGESTED)\n vcpe_flavor_name: PUT THE FLAVOR NAME HERE (MEDIUM FLAVOR SUGGESTED)\n compile_state: PUT THE COMPILE STATE (done, auto or build)\n public_net_id: PUT THE PUBLIC NETWORK ID HERE\n vbrgemu_bng_private_net_id: zdfw1bngin01_private\n vbrgemu_bng_private_subnet_id: zdfw1bngin01_sub_private\n vbrgemu_bng_private_net_cidr: 10.3.0.0/24\n vbrgemu_private_ip_0: 10.3.0.4\n sdnc_ip: 10.0.7.1\n vbrgemu_name_0: zdcpe1cpe01brgemu01\n vnf_id: vCPE_Infrastructure_BGREMU_demo_app\n vf_module_id: vCPE_Customer_BRGEMU\n repo_url_blob: https://nexus.onap.org/content/sites/raw\n repo_url_artifacts: https://nexus.onap.org/content/groups/staging\n demo_artifacts_version: 1.2.0\n install_script_version: 1.2.0-SNAPSHOT\n key_name: vbrgemu_key\n pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDKXDgoo3+WOqcUG8/5uUbk81+yczgwC4Y8ywTmuQqbNxlY1oQ0YxdMUqUnhitSXs5S/yRuAVOYHwGg2mCs20oAINrP+mxBI544AMIb9itPjCtgqtE2EWo6MmnFGbHB4Sx3XioE7F4VPsh7japsIwzOjbrQe+Mua1TGQ5d4nfEOQaaglXLLPFfuc7WbhbJbK6Q7rHqZfRcOwAMXgDoBqlyqKeiKwnumddo2RyNT8ljYmvB6buz7KnMinzo7qB0uktVT05FH9Rg0CTWH5norlG5qXgP2aukL0gk1ph8iAt7uYLf1ktp+LJI2gaF6L0/qli9EmVCSLr1uJ38Q8CBflhkh\n cloud_env: PUT THE CLOUD PROVIDED HERE (openstack or rackspace)\n vpp_source_repo_url: https://gerrit.fd.io/r/vpp\n vpp_source_repo_branch: stable/1704\n hc2vpp_source_repo_url: https://gerrit.fd.io/r/hc2vpp\n hc2vpp_source_repo_branch: stable/1704\n vpp_patch_url: https://git.onap.org/demo/plain/vnfs/vCPE/vpp-option-82-for-vbrg/src/patches/VPP-Add-Option82-Nat-Filter-For-vBRG.patch\n ','MANUAL RECORD','2018-04-28 13:04:07');
+
+INSERT INTO `heat_template` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `TIMEOUT_MINUTES`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('Artifact-UUID6','base_vcpe_vbrgemu.yaml','1.0','Base VBRGEMU Heat','heat_template_version: 2013-05-23\n\ndescription: Heat template to deploy vCPE vBRG Emulator (vBRGEMU)\n\nparameters:\n vcpe_image_name:\n type: string\n label: Image name or ID\n description: Image to be used for compute instance\n vcpe_flavor_name:\n type: string\n label: Flavor\n description: Type of instance (flavor) to be used\n public_net_id:\n type: string\n label: Public network name or ID\n description: Public network that enables remote connection to VNF\n vbrgemu_bng_private_net_id:\n type: string\n label: vBNG private network name or ID\n description: Private network that connects vBRGEMU to vBNG\n vbrgemu_bng_private_subnet_id:\n type: string\n label: vBNG private sub-network name or ID\n description: vBNG private sub-network name or ID\n vbrgemu_bng_private_net_cidr:\n type: string\n label: vBNG IN private network CIDR\n description: The CIDR of the input side of vBNG private network\n vbrgemu_private_ip_0:\n type: string\n label: vGW private IP address\n description: Private IP address towards the BRGEMU-BNG network\n vbrgemu_name_0:\n type: string\n label: vGW name\n description: Name of the vGW\n vnf_id:\n type: string\n label: VNF ID\n description: The VNF ID is provided by ONAP\n vf_module_id:\n type: string\n label: vCPE module ID\n description: The vCPE Module ID is provided by ONAP\n key_name:\n type: string\n label: Key pair name\n description: Public/Private key pair name\n pub_key:\n type: string\n label: Public key\n description: Public key to be installed on the compute instance\n repo_url_blob:\n type: string\n label: Repository URL\n description: URL of the repository that hosts the demo packages\n repo_url_artifacts:\n type: string\n label: Repository URL\n description: URL of the repository that hosts the demo packages\n install_script_version:\n type: string\n label: Installation script version number\n description: Version number of the scripts that install the vFW demo app\n demo_artifacts_version:\n type: string\n label: Artifacts version used in demo vnfs\n description: Artifacts (jar, tar.gz) version used in demo vnfs\n cloud_env:\n type: string\n label: Cloud environment\n description: Cloud environment (e.g., openstack, rackspace)\n vpp_source_repo_url:\n type: string\n label: VPP Source Git Repo\n description: URL for VPP source codes\n vpp_source_repo_branch:\n type: string\n label: VPP Source Git Branch\n description: Git Branch for the VPP source codes\n hc2vpp_source_repo_url:\n type: string\n label: Honeycomb Source Git Repo\n description: URL for Honeycomb source codes\n hc2vpp_source_repo_branch:\n type: string\n label: Honeycomb Source Git Branch\n description: Git Branch for the Honeycomb source codes\n vpp_patch_url:\n type: string\n label: VPP Patch URL\n description: URL for VPP patch for vBRG Emulator\n sdnc_ip:\n type: string\n label: SDNC ip address\n description: SDNC ip address used to set NAT\n compile_state:\n type: string\n label: Compile State\n description: State to compile code or not\n\nresources:\n\n random-str:\n type: OS::Heat::RandomString\n properties:\n length: 4\n\n my_keypair:\n type: OS::Nova::KeyPair\n properties:\n name:\n str_replace:\n template: base_rand\n params:\n base: { get_param: key_name }\n rand: { get_resource: random-str }\n public_key: { get_param: pub_key }\n save_private_key: false\n\n vbrgemu_private_0_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: vbrgemu_bng_private_net_id }\n fixed_ips: [{"subnet": { get_param: vbrgemu_bng_private_subnet_id }, "ip_address": { get_param: vbrgemu_private_ip_0 }}]\n\n vbrgemu_0:\n type: OS::Nova::Server\n properties:\n image: { get_param: vcpe_image_name }\n flavor: { get_param: vcpe_flavor_name }\n name: { get_param: vbrgemu_name_0 }\n key_name: { get_resource: my_keypair }\n networks:\n - network: { get_param: public_net_id }\n - port: { get_resource: vbrgemu_private_0_port }\n metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}\n user_data_format: RAW\n user_data:\n str_replace:\n params:\n __brgemu_bng_private_net_cidr__: { get_param: vbrgemu_bng_private_net_cidr }\n __repo_url_blob__ : { get_param: repo_url_blob }\n __repo_url_artifacts__ : { get_param: repo_url_artifacts }\n __demo_artifacts_version__ : { get_param: demo_artifacts_version }\n __install_script_version__ : { get_param: install_script_version }\n __cloud_env__ : { get_param: cloud_env }\n __vpp_source_repo_url__ : { get_param: vpp_source_repo_url }\n __vpp_source_repo_branch__ : { get_param: vpp_source_repo_branch }\n __hc2vpp_source_repo_url__ : { get_param: hc2vpp_source_repo_url }\n __hc2vpp_source_repo_branch__ : { get_param: hc2vpp_source_repo_branch }\n __vpp_patch_url__ : { get_param: vpp_patch_url }\n __sdnc_ip__ : { get_param: sdnc_ip }\n __compile_state__ : { get_param: compile_state }\n template: |\n #!/bin/bash\n\n mkdir /opt/config\n echo "__brgemu_bng_private_net_cidr__" > /opt/config/brgemu_bng_private_net_cidr.txt\n echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt\n echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt\n echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt\n echo "__install_script_version__" > /opt/config/install_script_version.txt\n echo "__cloud_env__" > /opt/config/cloud_env.txt\n echo "__vpp_source_repo_url__" > /opt/config/vpp_source_repo_url.txt\n echo "__vpp_source_repo_branch__" > /opt/config/vpp_source_repo_branch.txt\n echo "__hc2vpp_source_repo_url__" > /opt/config/hc2vpp_source_repo_url.txt\n echo "__hc2vpp_source_repo_branch__" > /opt/config/hc2vpp_source_repo_branch.txt\n echo "__vpp_patch_url__" > /opt/config/vpp_patch_url.txt\n echo "__sdnc_ip__" > /opt/config/sdnc_ip.txt\n echo "__compile_state__" > /opt/config/compile_state.txt\n\n curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_brgemu_install.sh -o /opt/v_brgemu_install.sh\n cd /opt\n chmod +x v_brgemu_install.sh\n ./v_brgemu_install.sh\n ', 300, 'MANUAL RECORD', '2018-04-28 13:04:07');
+
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','vpp_patch_url','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','hc2vpp_source_repo_branch','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','hc2vpp_source_repo_url','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','vpp_source_repo_branch','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','vpp_source_repo_url','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','cloud_env','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','pub_key','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','key_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','install_script_version','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','demo_artifacts_version','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','repo_url_artifacts','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','repo_url_blob','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','vf_module_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','vnf_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','vbrgemu_name_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','sdnc_ip','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','vbrgemu_private_ip_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','vbrgemu_bng_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','vbrgemu_bng_private_subnet_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','vbrgemu_bng_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','public_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','compile_state','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','vcpe_flavor_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID6','vcpe_image_name','','string',NULL);
+
+INSERT INTO `service` (`MODEL_UUID`, `MODEL_NAME`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `TOSCA_CSAR_ARTIFACT_UUID`) VALUES ('a94f8ff8-442d-11e8-8a14-0320c6d83cc0','vbrgemu-service','fba765a0-442d-11e8-b89d-57dec24c6cba','1.0','VBRGEMU service','2018-04-28 13:04:07',NULL);
+
+INSERT INTO `vf_module` (`MODEL_UUID`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `MODEL_NAME`, `DESCRIPTION`, `IS_BASE`, `HEAT_TEMPLATE_ARTIFACT_UUID`, `VOL_HEAT_TEMPLATE_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VNF_RESOURCE_MODEL_UUID`) VALUES ('1e34774e-715e-4fd5-bd08-7b654622f33f.VF_RI1_VFW::module-1::module-1.group','585822c7-4027-4f84-ba50-e9248606f134','1.0','VF_RI1_VFW::module-1',NULL,1,'Artifact-UUID6',NULL,'2018-04-28 13:04:07','685822c7-4027-4f84-ba50-e9248606f132');
+
+INSERT INTO `vf_module_customization` (`MODEL_CUSTOMIZATION_UUID`, `LABEL`, `INITIAL_COUNT`, `MIN_INSTANCES`, `MAX_INSTANCES`, `AVAILABILITY_ZONE_COUNT`, `HEAT_ENVIRONMENT_ARTIFACT_UUID`, `VOL_ENVIRONMENT_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VF_MODULE_MODEL_UUID`) VALUES ('5aa23938-a9fe-11e7-8b4b-0242ac120002',NULL,1,0,NULL,NULL,'EnvArtifact-UUID6',NULL,'2018-04-28 18:52:03','1e34774e-715e-4fd5-bd08-7b654622f33f.VF_RI1_VFW::module-1::module-1.group');
+
+INSERT INTO `vnf_res_custom_to_vf_module_custom` (`VNF_RESOURCE_CUST_MODEL_CUSTOMIZATION_UUID`, `VF_MODULE_CUST_MODEL_CUSTOMIZATION_UUID`, `CREATION_TIMESTAMP`) VALUES ('5a9bd247-a9fe-11e7-8b4b-0242ac120002','5aa23938-a9fe-11e7-8b4b-0242ac120002','2018-04-28 18:52:03');
+
+INSERT INTO `vnf_resource` (`ORCHESTRATION_MODE`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `MODEL_UUID`, `AIC_VERSION_MIN`, `AIC_VERSION_MAX`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `MODEL_NAME`, `TOSCA_NODE_TYPE`, `HEAT_TEMPLATE_ARTIFACT_UUID`) VALUES ('HEAT','VBRGEMU service1707MIGRATED','2018-04-28 13:04:07','685822c7-4027-4f84-ba50-e9248606f132',NULL,NULL,'585822c7-4027-4f84-ba50-e9248606f113','1.0','VFWResource',NULL,NULL);
+
+INSERT INTO `vnf_resource_customization` (`MODEL_CUSTOMIZATION_UUID`, `MODEL_INSTANCE_NAME`, `MIN_INSTANCES`, `MAX_INSTANCES`, `AVAILABILITY_ZONE_MAX_COUNT`, `NF_TYPE`, `NF_ROLE`, `NF_FUNCTION`, `NF_NAMING_CODE`, `CREATION_TIMESTAMP`, `VNF_RESOURCE_MODEL_UUID`) VALUES ('5a9bd247-a9fe-11e7-8b4b-0242ac120002','VBRGEMUResource-1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2018-04-28 18:52:03','685822c7-4027-4f84-ba50-e9248606f132');
+
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
diff --git a/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vgmux.sql b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vgmux.sql
new file mode 100644
index 00000000..169ff71d
--- /dev/null
+++ b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vgmux.sql
@@ -0,0 +1,71 @@
+SOURCE ../default/create_mso_db-default.sql
+
+USE `mso_requests`;
+DROP USER 'mso';
+CREATE USER 'mso';
+GRANT ALL on mso_requests.* to 'mso' identified by 'mso123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+USE `mso_catalog`;
+DROP USER 'catalog';
+CREATE USER 'catalog';
+GRANT ALL on mso_catalog.* to 'catalog' identified by 'catalog123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+
+INSERT INTO `heat_environment` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('EnvArtifact-UUID7','base_vcpe_vgw.env','1.0','base_vcpe_vgmux ENV file','parameters:\n vcpe_image_name: PUT THE IMAGE NAME HERE (Ubuntu 1604 SUGGESTED)\n vcpe_flavor_name: PUT THE FLAVOR NAME HERE (MEDIUM FLAVOR SUGGESTED)\n public_net_id: PUT THE PUBLIC NETWORK ID HERE\n bng_gmux_private_net_id: zdfw1bngmux01_private\n bng_gmux_private_subnet_id: zdfw1bngmux01_sub_private\n mux_gw_private_net_id: zdfw1muxgw01_private\n mux_gw_private_subnet_id: zdfw1muxgw01_sub_private\n onap_private_net_id: PUT THE ONAP PRIVATE NETWORK NAME HERE\n onap_private_subnet_id: PUT THE ONAP PRIVATE SUBNETWORK NAME HERE\n onap_private_net_cidr: 10.0.0.0/16\n bng_gmux_private_net_cidr: 10.1.0.0/24\n mux_gw_private_net_cidr: 10.5.0.0/24\n brgemu_bng_private_net_cidr: 10.3.0.0/24\n vgmux_private_ip_0: 10.1.0.20\n vgmux_private_ip_1: 10.0.101.20\n vgmux_private_ip_2: 10.5.0.20\n vgmux_name_0: zdcpe1cpe01mux01\n vnf_id: vCPE_Infrastructure_vGMUX_demo_app\n vf_module_id: vCPE_Intrastructure_Metro_vGMUX\n bng_gmux_private_ip: 10.1.0.10\n dcae_collector_ip: 10.0.4.1\n dcae_collector_port: 8081\n repo_url_blob: https://nexus.onap.org/content/sites/raw\n repo_url_artifacts: https://nexus.onap.org/content/groups/staging\n demo_artifacts_version: 1.2.0\n install_script_version: 1.2.0-SNAPSHOT\n key_name: vgmux_key\n pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN\n cloud_env: PUT THE CLOUD PROVIDED HERE (openstack or rackspace)\n vpp_source_repo_url: https://gerrit.fd.io/r/vpp\n vpp_source_repo_branch: stable/1704\n hc2vpp_source_repo_url: https://gerrit.fd.io/r/hc2vpp\n hc2vpp_source_repo_branch: stable/1704\n vpp_patch_url: https://git.onap.org/demo/plain/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Vpp-Add-VES-agent-for-vG-MUX.patch\n hc2vpp_patch_url: https://git.onap.org/demo/plain/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Hc2vpp-Add-VES-agent-for-vG-MUX.patch\n libevel_patch_url: https://git.onap.org/demo/plain/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/vCPE-vG-MUX-libevel-fixup.patch\n ','MANUAL RECORD','2018-04-28 13:04:07');
+
+INSERT INTO `heat_template` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `TIMEOUT_MINUTES`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('Artifact-UUID7','base_vcpe_vgmux.yaml','1.0','Base VGMUX Heat','heat_template_version: 2013-05-23\n\ndescription: Heat template to deploy vCPE Infrastructue Metro vGMUX\n\nparameters:\n vcpe_image_name:\n type: string\n label: Image name or ID\n description: Image to be used for compute instance\n vcpe_flavor_name:\n type: string\n label: Flavor\n description: Type of instance (flavor) to be used\n public_net_id:\n type: string\n label: Public network name or ID\n description: Public network that enables remote connection to VNF\n bng_gmux_private_net_id:\n type: string\n label: vBNG vGMUX private network name or ID\n description: Private network that connects vBNG to vGMUX\n bng_gmux_private_subnet_id:\n type: string\n label: vBNG vGMUX private sub-network name or ID\n description: vBNG vGMUX private sub-network name or ID\n bng_gmux_private_net_cidr:\n type: string\n label: vBNG vGMUX private network CIDR\n description: The CIDR of the vBNG-vGMUX private network\n mux_gw_private_net_id:\n type: string\n label: vGMUX vGWs network name or ID\n description: Private network that connects vGMUX to vGWs\n mux_gw_private_subnet_id:\n type: string\n label: vGMUX vGWs sub-network name or ID\n description: vGMUX vGWs sub-network name or ID\n mux_gw_private_net_cidr:\n type: string\n label: vGMUX private network CIDR\n description: The CIDR of the vGMUX private network\n brgemu_bng_private_net_cidr:\n type: string\n label: vBRG vBNG private network CIDR\n description: The CIDR of the vBRG-vBNG private network\n onap_private_net_id:\n type: string\n label: ONAP management network name or ID\n description: Private network that connects ONAP components and the VNF\n onap_private_subnet_id:\n type: string\n label: ONAP management sub-network name or ID\n description: Private sub-network that connects ONAP components and the VNF\n onap_private_net_cidr:\n type: string\n label: ONAP private network CIDR\n description: The CIDR of the protected private network\n vgmux_private_ip_0:\n type: string\n label: vGMUX private IP address towards the vBNG-vGMUX private network\n description: Private IP address that is assigned to the vGMUX to communicate with the vBNG\n vgmux_private_ip_1:\n type: string\n label: vGMUX private IP address towards the ONAP management network\n description: Private IP address that is assigned to the vGMUX to communicate with ONAP components\n vgmux_private_ip_2:\n type: string\n label: vGMUX private IP address towards the vGMUX-vGW private network\n description: Private IP address that is assigned to the vGMUX to communicate with vGWs\n vgmux_name_0:\n type: string\n label: vGMUX name\n description: Name of the vGMUX\n vnf_id:\n type: string\n label: VNF ID\n description: The VNF ID is provided by ONAP\n vf_module_id:\n type: string\n label: vCPE module ID\n description: The vCPE Module ID is provided by ONAP\n bng_gmux_private_ip:\n type: string\n label: vBNG private IP address towards the vBNG-vGMUX private network\n description: Private IP address that is assigned to the vBNG to communicate with the vGMUX\n dcae_collector_ip:\n type: string\n label: DCAE collector IP address\n description: IP address of the DCAE collector\n dcae_collector_port:\n type: string\n label: DCAE collector port\n description: Port of the DCAE collector\n key_name:\n type: string\n label: Key pair name\n description: Public/Private key pair name\n pub_key:\n type: string\n label: Public key\n description: Public key to be installed on the compute instance\n repo_url_blob:\n type: string\n label: Repository URL\n description: URL of the repository that hosts the demo packages\n repo_url_artifacts:\n type: string\n label: Repository URL\n description: URL of the repository that hosts the demo packages\n install_script_version:\n type: string\n label: Installation script version number\n description: Version number of the scripts that install the vFW demo app\n demo_artifacts_version:\n type: string\n label: Artifacts version used in demo vnfs\n description: Artifacts (jar, tar.gz) version used in demo vnfs\n cloud_env:\n type: string\n label: Cloud environment\n description: Cloud environment (e.g., openstack, rackspace)\n vpp_source_repo_url:\n type: string\n label: VPP Source Git Repo\n description: URL for VPP source codes\n vpp_source_repo_branch:\n type: string\n label: VPP Source Git Branch\n description: Git Branch for the VPP source codes\n hc2vpp_source_repo_url:\n type: string\n label: Honeycomb Source Git Repo\n description: URL for Honeycomb source codes\n hc2vpp_source_repo_branch:\n type: string\n label: Honeycomb Source Git Branch\n description: Git Branch for the Honeycomb source codes\n vpp_patch_url:\n type: string\n label: VPP Patch URL\n description: URL for VPP patch for vG-MUX\n hc2vpp_patch_url:\n type: string\n label: Honeycomb Patch URL\n description: URL for Honeycomb patch for vG-MUX\n libevel_patch_url:\n type: string\n label: libevel Patch URL\n description: URL for libevel patch for vG-MUX\n\n\nresources:\n\n random-str:\n type: OS::Heat::RandomString\n properties:\n length: 4\n\n my_keypair:\n type: OS::Nova::KeyPair\n properties:\n name:\n str_replace:\n template: base_rand\n params:\n base: { get_param: key_name }\n rand: { get_resource: random-str }\n public_key: { get_param: pub_key }\n save_private_key: false\n\n\n vgmux_private_0_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: bng_gmux_private_net_id }\n fixed_ips: [{"subnet": { get_param: bng_gmux_private_subnet_id }, "ip_address": { get_param: vgmux_private_ip_0 }}]\n\n vgmux_private_1_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: onap_private_net_id }\n fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vgmux_private_ip_1 }}]\n\n vgmux_private_2_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: mux_gw_private_net_id }\n fixed_ips: [{"subnet": { get_param: mux_gw_private_subnet_id }, "ip_address": { get_param: vgmux_private_ip_2 }}]\n\n vgmux_0:\n type: OS::Nova::Server\n properties:\n image: { get_param: vcpe_image_name }\n flavor: { get_param: vcpe_flavor_name }\n name: { get_param: vgmux_name_0 }\n key_name: { get_resource: my_keypair }\n networks:\n - network: { get_param: public_net_id }\n - port: { get_resource: vgmux_private_0_port }\n - port: { get_resource: vgmux_private_1_port }\n - port: { get_resource: vgmux_private_2_port }\n metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}\n user_data_format: RAW\n user_data:\n str_replace:\n params:\n __mux_to_bng_net_ipaddr__ : { get_param: vgmux_private_ip_0 }\n __oam_ipaddr__ : { get_param: vgmux_private_ip_1 }\n __mux_gw_net_ipaddr__ : { get_param: vgmux_private_ip_2 }\n __bng_to_mux_ipaddr__ : { get_param: bng_gmux_private_ip }\n __bng_mux_net_cidr__ : { get_param: bng_gmux_private_net_cidr }\n __oam_cidr__ : { get_param: onap_private_net_cidr }\n __mux_gw_net_cidr__ : { get_param: mux_gw_private_net_cidr }\n __brg_bng_net_cidr__ : { get_param: brgemu_bng_private_net_cidr }\n __repo_url_blob__ : { get_param: repo_url_blob }\n __repo_url_artifacts__ : { get_param: repo_url_artifacts }\n __demo_artifacts_version__ : { get_param: demo_artifacts_version }\n __install_script_version__ : { get_param: install_script_version }\n __cloud_env__ : { get_param: cloud_env }\n __vpp_source_repo_url__ : { get_param: vpp_source_repo_url }\n __vpp_source_repo_branch__ : { get_param: vpp_source_repo_branch }\n __hc2vpp_source_repo_url__ : { get_param: hc2vpp_source_repo_url }\n __hc2vpp_source_repo_branch__ : { get_param: hc2vpp_source_repo_branch }\n __vpp_patch_url__ : { get_param: vpp_patch_url }\n __hc2vpp_patch_url__ : { get_param: hc2vpp_patch_url }\n __libevel_patch_url__ : { get_param: libevel_patch_url }\n template: |\n #!/bin/bash\n\n mkdir /opt/config\n echo "__mux_to_bng_net_ipaddr__" > /opt/config/mux_to_bng_net_ipaddr.txt\n echo "__oam_ipaddr__" > /opt/config/oam_ipaddr.txt\n echo "__mux_gw_net_ipaddr__" > /opt/config/mux_gw_net_ipaddr.txt\n echo "__bng_to_mux_ipaddr__ " > /opt/config/bng_to_mux_net_ipaddr.txt\n echo "__bng_mux_net_cidr__" > /opt/config/bng_mux_net_cidr.txt\n echo "__oam_cidr__" > /opt/config/oam_cidr.txt\n echo "__mux_gw_net_cidr__" > /opt/config/mux_gw_net_cidr.txt\n echo "__brg_bng_net_cidr__" > /opt/config/brg_bng_net_cidr.txt\n echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt\n echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt\n echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt\n echo "__install_script_version__" > /opt/config/install_script_version.txt\n echo "__cloud_env__" > /opt/config/cloud_env.txt\n echo "__vpp_source_repo_url__" > /opt/config/vpp_source_repo_url.txt\n echo "__vpp_source_repo_branch__" > /opt/config/vpp_source_repo_branch.txt\n echo "__vpp_patch_url__" > /opt/config/vpp_patch_url.txt\n echo "__hc2vpp_source_repo_url__" > /opt/config/hc2vpp_source_repo_url.txt\n echo "__hc2vpp_source_repo_branch__" > /opt/config/hc2vpp_source_repo_branch.txt\n echo "__hc2vpp_patch_url__" > /opt/config/hc2vpp_patch_url.txt\n echo "__libevel_patch_url__" > /opt/config/libevel_patch_url.txt\n\n curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_gmux_install.sh -o /opt/v_gmux_install.sh\n cd /opt\n chmod +x v_gmux_install.sh\n ./v_gmux_install.sh\n',300, 'MANUAL RECORD', '2018-04-28 13:04:07');
+
+
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','libevel_patch_url','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','hc2vpp_patch_url','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','vpp_patch_url','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','hc2vpp_source_repo_branch','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','hc2vpp_source_repo_url','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','vpp_source_repo_branch','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','vpp_source_repo_url','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','cloud_env','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','pub_key','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','key_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','install_script_version','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','demo_artifacts_version','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','repo_url_artifacts','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','repo_url_blob','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','dcae_collector_port','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','dcae_collector_ip','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','bng_gmux_private_ip','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','vf_module_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','vnf_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','vgmux_name_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','vgmux_private_ip_2','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','vgmux_private_ip_1','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','vgmux_private_ip_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','brgemu_bng_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','mux_gw_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','bng_gmux_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','onap_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','onap_private_subnet_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','onap_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','mux_gw_private_subnet_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','mux_gw_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','bng_gmux_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','bng_gmux_private_subnet_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','public_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','vcpe_flavor_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID7','vcpe_image_name','','string',NULL);
+
+INSERT INTO `service` (`MODEL_UUID`, `MODEL_NAME`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `TOSCA_CSAR_ARTIFACT_UUID`) VALUES ('a94f8ff8-442d-11e8-8a14-0320c6d83cc0','vgmux-service','fba765a0-442d-11e8-b89d-57dec24c6cba','1.0','VGMUX service','2018-04-28 13:04:07',NULL);
+
+INSERT INTO `vf_module` (`MODEL_UUID`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `MODEL_NAME`, `DESCRIPTION`, `IS_BASE`, `HEAT_TEMPLATE_ARTIFACT_UUID`, `VOL_HEAT_TEMPLATE_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VNF_RESOURCE_MODEL_UUID`) VALUES ('1e34774e-715e-4fd5-bd08-7b654622f33f.VF_RI1_VFW::module-1::module-1.group','585822c7-4027-4f84-ba50-e9248606f134','1.0','VF_RI1_VFW::module-1',NULL,1,'Artifact-UUID7',NULL,'2018-04-28 13:04:07','685822c7-4027-4f84-ba50-e9248606f132');
+
+INSERT INTO `vf_module_customization` (`MODEL_CUSTOMIZATION_UUID`, `LABEL`, `INITIAL_COUNT`, `MIN_INSTANCES`, `MAX_INSTANCES`, `AVAILABILITY_ZONE_COUNT`, `HEAT_ENVIRONMENT_ARTIFACT_UUID`, `VOL_ENVIRONMENT_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VF_MODULE_MODEL_UUID`) VALUES ('5aa23938-a9fe-11e7-8b4b-0242ac120002',NULL,1,0,NULL,NULL,'EnvArtifact-UUID7',NULL,'2018-04-28 18:52:03','1e34774e-715e-4fd5-bd08-7b654622f33f.VF_RI1_VFW::module-1::module-1.group');
+
+INSERT INTO `vnf_res_custom_to_vf_module_custom` (`VNF_RESOURCE_CUST_MODEL_CUSTOMIZATION_UUID`, `VF_MODULE_CUST_MODEL_CUSTOMIZATION_UUID`, `CREATION_TIMESTAMP`) VALUES ('5a9bd247-a9fe-11e7-8b4b-0242ac120002','5aa23938-a9fe-11e7-8b4b-0242ac120002','2018-04-28 18:52:03');
+
+INSERT INTO `vnf_resource` (`ORCHESTRATION_MODE`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `MODEL_UUID`, `AIC_VERSION_MIN`, `AIC_VERSION_MAX`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `MODEL_NAME`, `TOSCA_NODE_TYPE`, `HEAT_TEMPLATE_ARTIFACT_UUID`) VALUES ('HEAT','VGMUX service1707MIGRATED','2018-04-28 13:04:07','685822c7-4027-4f84-ba50-e9248606f132',NULL,NULL,'585822c7-4027-4f84-ba50-e9248606f113','1.0','VFWResource',NULL,NULL);
+
+INSERT INTO `vnf_resource_customization` (`MODEL_CUSTOMIZATION_UUID`, `MODEL_INSTANCE_NAME`, `MIN_INSTANCES`, `MAX_INSTANCES`, `AVAILABILITY_ZONE_MAX_COUNT`, `NF_TYPE`, `NF_ROLE`, `NF_FUNCTION`, `NF_NAMING_CODE`, `CREATION_TIMESTAMP`, `VNF_RESOURCE_MODEL_UUID`) VALUES ('5a9bd247-a9fe-11e7-8b4b-0242ac120002','VGMUXResource-1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2018-04-28 18:52:03','685822c7-4027-4f84-ba50-e9248606f132');
+
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
diff --git a/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vgw.sql b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vgw.sql
new file mode 100644
index 00000000..85173b44
--- /dev/null
+++ b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vCPE/create_mso_db-demo-vCPE-vgw.sql
@@ -0,0 +1,67 @@
+SOURCE ../default/create_mso_db-default.sql
+
+USE `mso_requests`;
+DROP USER 'mso';
+CREATE USER 'mso';
+GRANT ALL on mso_requests.* to 'mso' identified by 'mso123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+USE `mso_catalog`;
+DROP USER 'catalog';
+CREATE USER 'catalog';
+GRANT ALL on mso_catalog.* to 'catalog' identified by 'catalog123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+
+INSERT INTO `heat_environment` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('EnvArtifact-UUID4','base_vcpe_vgw.env','1.0','base_vgw ENV file','parameters:\nvcpe_image_name: PUT THE IMAGE NAME HERE (Ubuntu 1604 SUGGESTED)\n vcpe_flavor_name: PUT THE FLAVOR NAME HERE (MEDIUM FLAVOR SUGGESTED)\n public_net_id: PUT THE PUBLIC NETWORK ID HERE\n mux_gw_private_net_id: zdfw1muxgw01_private\n mux_gw_private_subnet_id: zdfw1muxgw01_sub_private\n mux_gw_private_net_cidr: 10.5.0.0/24\n cpe_public_net_id: zdfw1cpe01_public\n cpe_public_subnet_id: zdfw1cpe01_sub_public\n cpe_public_net_cidr: 10.2.0.0/24\n onap_private_net_id: PUT THE ONAP PRIVATE NETWORK NAME HERE\n onap_private_subnet_id: PUT THE ONAP PRIVATE SUBNETWORK NAME HERE\n onap_private_net_cidr: 10.0.0.0/16\n vgw_private_ip_0: 10.5.0.21\n vgw_private_ip_1: 10.0.101.30\n vgw_private_ip_2: 10.2.0.3\n vgw_name_0: zdcpe1cpe01gw01\n vnf_id: vCPE_Infrastructure_GW_demo_app\n vf_module_id: vCPE_Customer_GW\n mux_ip_addr: 10.5.0.20\n vg_vgmux_tunnel_vni: 100\n dcae_collector_ip: 10.0.4.102\n dcae_collector_port: 8080\n repo_url_blob: https://nexus.onap.org/content/sites/raw\n repo_url_artifacts: https://nexus.onap.org/content/groups/staging\n demo_artifacts_version: 1.2.0\n install_script_version: 1.2.0-SNAPSHOT\n key_name: vgw_key\n pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN\n cloud_env: PUT THE CLOUD PROVIDED HERE (openstack or rackspace)\n vpp_source_repo_url: https://gerrit.fd.io/r/vpp\n vpp_source_repo_branch: stable/1704\n hc2vpp_source_repo_url: https://gerrit.fd.io/r/hc2vpp\n hc2vpp_source_repo_branch: stable/1704 ','MANUAL RECORD','2018-04-19 13:04:07');
+
+INSERT INTO `heat_template` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `TIMEOUT_MINUTES`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('Artifact-UUID4','base_vcpe_vgw.yaml','1.0','Base VGW Heat','heat_template_version: 2013-05-23\n\ndescription: Heat template to deploy vCPE vGateway(vG) \n\n parameters:\n vcpe_image_name:\n type: string\n label: Image name or ID\n description: Image to be used for compute instance\n vcpe_flavor_name:\n type: string\n label: Flavor\n description: Type of instance (flavor) to be used\n public_net_id:\n type: string\n label: Public network name or ID\n description: Public network that enables remote connection to VNF\n mux_gw_private_net_id:\n type: string\n label: vGMUX private network name or ID\n description: Private network that connects vGMUX to vGWs\n mux_gw_private_subnet_id:\n type: string\n label: vGMUX private sub-network name or ID\n description: vGMUX private sub-network name or ID\n mux_gw_private_net_cidr:\n type: string\n label: vGMUX private network CIDR\n description: The CIDR of the vGMUX private network\n onap_private_net_id:\n type: string\n label: ONAP management network name or ID\n description: Private network that connects ONAP components and the VNF\n onap_private_subnet_id:\n type: string\n label: ONAP management sub-network name or ID\n description: Private sub-network that connects ONAP components and the VNF\n onap_private_net_cidr:\n type: string\n label: ONAP private network CIDR\n description: The CIDR of the protected private network\n cpe_public_net_id:\n type: string\n label: vCPE network that emulates internetmanagement name or ID\n description: Private network that connects vGW to emulated internet\n cpe_public_subnet_id:\n type: string\n label: vCPE Public subnet\n description: vCPE Public subnet\n cpe_public_net_cidr:\n type: string\n label: vCPE public network CIDR\n description: The CIDR of the vCPE public\n vgw_private_ip_0:\n type: string\n label: vGW private IP address towards the vGMUX\n description: Private IP address that is assigned to the vGW to communicate with vGMUX\n vgw_private_ip_1:\n type: string\n label: vGW private IP address towards the ONAP management network\n description: Private IP address that is assigned to the vGW to communicate with ONAP components\n vgw_private_ip_2:\n type: string\n label: vGW private IP address towards the vCPE public network\n description: Private IP address that is assigned to the vGW to communicate with vCPE public network\n vgw_name_0:\n type: string\n label: vGW name\n description: Name of the vGW\n vnf_id:\n type: string\n label: VNF ID\n description: The VNF ID is provided by ONAP\n vf_module_id:\n type: string\n label: vCPE module ID\n description: The vCPE Module ID is provided by ONAP\n dcae_collector_ip:\n type: string\n label: DCAE collector IP address\n description: IP address of the DCAE collector\n dcae_collector_port:\n type: string\n label: DCAE collector port\n description: Port of the DCAE collector\n key_name:\n type: string\n label: Key pair name\n description: Public/Private key pair name\n pub_key:\n type: string\n label: Public key\n description: Public key to be installed on the compute instance\n repo_url_blob:\n type: string\n label: Repository URL\n description: URL of the repository that hosts the demo packages\n repo_url_artifacts:\n type: string\n label: Repository URL\n description: URL of the repository that hosts the demo packages\n install_script_version:\n type: string\n label: Installation script version number\n description: Version number of the scripts that install the vFW demo app\n demo_artifacts_version:\n type: string\n label: Artifacts version used in demo vnfs\n description: Artifacts (jar, tar.gz) version used in demo vnfs\n cloud_env:\n type: string\n label: Cloud environment\n description: Cloud environment (e.g., openstack, rackspace)\n vpp_source_repo_url:\n type: string\n label: VPP Source Git Repo\n description: URL for VPP source codes\n vpp_source_repo_branch:\n type: string\n label: VPP Source Git Branch\n description: Git Branch for the VPP source codes\n hc2vpp_source_repo_url:\n type: string\n label: Honeycomb Source Git Repo\n description: URL for Honeycomb source codes\n hc2vpp_source_repo_branch:\n type: string\n label: Honeycomb Source Git Branch\n description: Git Branch for the Honeycomb source codes\n mux_ip_addr:\n type: string\n label: vGMUX IP address\n description: IP address of vGMUX\n vg_vgmux_tunnel_vni:\n type: number\n label: vG-vGMUX tunnel vni\n description: vni value of vG-vGMUX vxlan tunnel\n\n#############\n# #\n# RESOURCES #\n# #\n#############\n\nresources:\n\n random-str:\n type: OS::Heat::RandomString\n properties:\n length: 4\n\n my_keypair:\n type: OS::Nova::KeyPair\n properties:\n name:\n str_replace:\n template: base_rand\n params:\n base: { get_param: key_name }\n rand: { get_resource: random-str }\n public_key: { get_param: pub_key }\n save_private_key: false\n\n # Virtual GW Instantiation\n vgw_private_0_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: mux_gw_private_net_id }\n fixed_ips: [{"subnet": { get_param: mux_gw_private_subnet_id }, "ip_address": { get_param: vgw_private_ip_0 }}]\n\n vgw_private_1_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: onap_private_net_id }\n fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vgw_private_ip_1 }}]\n\n vgw_private_2_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: cpe_public_net_id}\n fixed_ips: [{"subnet": { get_param: cpe_public_subnet_id }, "ip_address": { get_param: vgw_private_ip_2 }}]\n\n vgw_0:\n type: OS::Nova::Server\n properties:\n image: { get_param: vcpe_image_name }\n flavor: { get_param: vcpe_flavor_name }\n name: { get_param: vgw_name_0 }\n key_name: { get_resource: my_keypair }\n networks:\n - network: { get_param: public_net_id }\n - port: { get_resource: vgw_private_0_port }\n - port: { get_resource: vgw_private_1_port }\n - port: { get_resource: vgw_private_2_port }\n metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}\n user_data_format: RAW\n user_data:\n str_replace:\n params:\n __mux_gw_private_net_ipaddr__ : { get_param: vgw_private_ip_0 }\n __oam_ipaddr__ : { get_param: vgw_private_ip_1 }\n __oam_cidr__ : { get_param: onap_private_net_cidr }\n __cpe_public_net_cidr__ : { get_param: cpe_public_net_cidr }\n __mux_gw_private_net_cidr__ : { get_param: mux_gw_private_net_cidr }\n __repo_url_blob__ : { get_param: repo_url_blob }\n __repo_url_artifacts__ : { get_param: repo_url_artifacts }\n __demo_artifacts_version__ : { get_param: demo_artifacts_version }\n __install_script_version__ : { get_param: install_script_version }\n __cloud_env__ : { get_param: cloud_env }\n __vpp_source_repo_url__ : { get_param: vpp_source_repo_url }\n __vpp_source_repo_branch__ : { get_param: vpp_source_repo_branch }\n __hc2vpp_source_repo_url__ : { get_param: hc2vpp_source_repo_url }\n __hc2vpp_source_repo_branch__ : { get_param: hc2vpp_source_repo_branch }\n __mux_ip_addr__: { get_param: mux_ip_addr }\n __vg_vgmux_tunnel_vni__: { get_param: vg_vgmux_tunnel_vni }\n template: |\n #!/bin/bash\n\n # Create configuration files\n mkdir /opt/config\n echo "__oam_ipaddr__" > /opt/config/oam_ipaddr.txt\n echo "__oam_cidr__" > /opt/config/oam_cidr.txt\n echo "__cpe_public_net_cidr__" > /opt/config/cpe_public_net_cidr.txt\n echo "__mux_gw_private_net_ipaddr__" > /opt/config/mux_gw_private_net_ipaddr.txt\n echo "__mux_gw_private_net_cidr__" > /opt/config/mux_gw_private_net_cidr.txt\n echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt\n echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt\n echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt\n echo "__install_script_version__" > /opt/config/install_script_version.txt\n echo "__cloud_env__" > /opt/config/cloud_env.txt\n echo "__vpp_source_repo_url__" > /opt/config/vpp_source_repo_url.txt\n echo "__vpp_source_repo_branch__" > /opt/config/vpp_source_repo_branch.txt\n echo "__hc2vpp_source_repo_url__" > /opt/config/hc2vpp_source_repo_url.txt\n echo "__hc2vpp_source_repo_branch__" > /opt/config/hc2vpp_source_repo_branch.txt\n echo "__mux_ip_addr__" > /opt/config/mux_ip_addr.txt\n echo "__vg_vgmux_tunnel_vni__" > /opt/config/vg_vgmux_tunnel_vni.txt\n\n # Download and run install script\n curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_gw_install.sh -o /opt/v_gw_install.sh\n cd /opt\n chmod +x v_gw_install.sh\n ./v_gw_install.sh\n\n', 300, 'MANUAL RECORD', '2018-04-19 13:04:07');
+
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','hc2vpp_source_repo_branch','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','hc2vpp_source_repo_url','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','vpp_source_repo_branch','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','vpp_source_repo_url','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','cloud_env','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','pub_key','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','key_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','install_script_version','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','demo_artifacts_version','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','repo_url_artifacts','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','repo_url_blob','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','dcae_collector_port','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','dcae_collector_ip','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','vg_vgmux_tunnel_vni','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','mux_ip_addr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','vf_module_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','vnf_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','vgw_name_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','vgw_private_ip_2','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','vgw_private_ip_1','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','vgw_private_ip_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','onap_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','onap_private_subnet_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','onap_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','cpe_public_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','cpe_public_subnet_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','cpe_public_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','mux_gw_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','mux_gw_private_subnet_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','mux_gw_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','public_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','vcpe_flavor_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID4','vcpe_image_name','','string',NULL);
+
+INSERT INTO `service` (`MODEL_UUID`, `MODEL_NAME`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `TOSCA_CSAR_ARTIFACT_UUID`) VALUES ('a94f8ff8-442d-11e8-8a14-0320c6d83cc0','vgw-service','fba765a0-442d-11e8-b89d-57dec24c6cba','1.0','VGW service','2018-04-19 13:04:07',NULL);
+
+INSERT INTO `vf_module` (`MODEL_UUID`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `MODEL_NAME`, `DESCRIPTION`, `IS_BASE`, `HEAT_TEMPLATE_ARTIFACT_UUID`, `VOL_HEAT_TEMPLATE_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VNF_RESOURCE_MODEL_UUID`) VALUES ('1e34774e-715e-4fd5-bd08-7b654622f33f.VF_RI1_VFW::module-1::module-1.group','585822c7-4027-4f84-ba50-e9248606f134','1.0','VF_RI1_VFW::module-1',NULL,1,'Artifact-UUID4',NULL,'2018-04-19 13:04:07','685822c7-4027-4f84-ba50-e9248606f132');
+
+INSERT INTO `vf_module_customization` (`MODEL_CUSTOMIZATION_UUID`, `LABEL`, `INITIAL_COUNT`, `MIN_INSTANCES`, `MAX_INSTANCES`, `AVAILABILITY_ZONE_COUNT`, `HEAT_ENVIRONMENT_ARTIFACT_UUID`, `VOL_ENVIRONMENT_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VF_MODULE_MODEL_UUID`) VALUES ('5aa23938-a9fe-11e7-8b4b-0242ac120002',NULL,1,0,NULL,NULL,'EnvArtifact-UUID4',NULL,'2018-04-19 18:52:03','1e34774e-715e-4fd5-bd08-7b654622f33f.VF_RI1_VFW::module-1::module-1.group');
+
+INSERT INTO `vnf_res_custom_to_vf_module_custom` (`VNF_RESOURCE_CUST_MODEL_CUSTOMIZATION_UUID`, `VF_MODULE_CUST_MODEL_CUSTOMIZATION_UUID`, `CREATION_TIMESTAMP`) VALUES ('5a9bd247-a9fe-11e7-8b4b-0242ac120002','5aa23938-a9fe-11e7-8b4b-0242ac120002','2018-04-19 18:52:03');
+
+INSERT INTO `vnf_resource` (`ORCHESTRATION_MODE`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `MODEL_UUID`, `AIC_VERSION_MIN`, `AIC_VERSION_MAX`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `MODEL_NAME`, `TOSCA_NODE_TYPE`, `HEAT_TEMPLATE_ARTIFACT_UUID`) VALUES ('HEAT','VGW service1707MIGRATED','2016-04-19 13:04:07','685822c7-4027-4f84-ba50-e9248606f132',NULL,NULL,'585822c7-4027-4f84-ba50-e9248606f113','1.0','VFWResource',NULL,NULL);
+
+INSERT INTO `vnf_resource_customization` (`MODEL_CUSTOMIZATION_UUID`, `MODEL_INSTANCE_NAME`, `MIN_INSTANCES`, `MAX_INSTANCES`, `AVAILABILITY_ZONE_MAX_COUNT`, `NF_TYPE`, `NF_ROLE`, `NF_FUNCTION`, `NF_NAMING_CODE`, `CREATION_TIMESTAMP`, `VNF_RESOURCE_MODEL_UUID`) VALUES ('5a9bd247-a9fe-11e7-8b4b-0242ac120002','VGWResource-1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2018-04-19 18:52:03','685822c7-4027-4f84-ba50-e9248606f132');
+
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
diff --git a/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vfw/create_mso_db-demo-vfw.sql b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vfw/create_mso_db-demo-vfw.sql
new file mode 100644
index 00000000..15001050
--- /dev/null
+++ b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/bulkload-files/demo-vfw/create_mso_db-demo-vfw.sql
@@ -0,0 +1,59 @@
+SOURCE ../default/create_mso_db-default.sql
+
+USE `mso_requests`;
+DROP USER 'mso';
+CREATE USER 'mso';
+GRANT ALL on mso_requests.* to 'mso' identified by 'mso123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+USE `mso_catalog`;
+DROP USER 'catalog';
+CREATE USER 'catalog';
+GRANT ALL on mso_catalog.* to 'catalog' identified by 'catalog123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+
+INSERT INTO `heat_environment` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('EnvArtifact-UUID3','base_vfw.env','1.0','base_vfw ENV file','parameters:\n vfw_image_name: Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)\n vfw_flavor_name: 4 GB General Purpose v1\n public_net_id: 00000000-0000-0000-0000-000000000000\n unprotected_private_net_id: zdfw1fwl01_unprotected\n protected_private_net_id: zdfw1fwl01_protected\n ecomp_private_net_id: oam_ecomp\n unprotected_private_net_cidr: 192.168.10.0/24\n protected_private_net_cidr: 192.168.20.0/24\n ecomp_private_net_cidr: 192.168.9.0/24\n vfw_private_ip_0: 192.168.10.100\n vfw_private_ip_1: 192.168.20.100\n vfw_private_ip_2: 192.168.9.100\n vpg_private_ip_0: 192.168.10.200\n vpg_private_ip_1: 192.168.9.200\n vsn_private_ip_0: 192.168.20.250\n vsn_private_ip_1: 192.168.9.250\n vfw_name_0: zdfw1fwl01fwl01\n vpg_name_0: zdfw1fwl01pgn01\n vsn_name_0: zdfw1fwl01snk01\n vnf_id: vFirewall_demo_app\n vf_module_id: vFirewall\n webserver_ip: 162.242.237.182\n dcae_collector_ip: 192.168.9.1\n key_name: vfw_key\n pub_key: INSERT YOUR PUBLIC KEY HERE','MANUAL RECORD','2016-11-14 13:04:07');
+
+INSERT INTO `heat_template` (`ARTIFACT_UUID`, `NAME`, `VERSION`, `DESCRIPTION`, `BODY`, `TIMEOUT_MINUTES`, `ARTIFACT_CHECKSUM`, `CREATION_TIMESTAMP`) VALUES ('Artifact-UUID3','base_vfw.yaml','1.0','Base VFW Heat','heat_template_version: 2013-05-23\n\ndescription: Heat template to deploy vFirewall demo app for OpenECOMP\n\nparameters:\n vfw_image_name:\n type: string\n label: Image name or ID\n description: Image to be used for compute instance\n vfw_flavor_name:\n type: string\n label: Flavor\n description: Type of instance (flavor) to be used\n public_net_id:\n type: string\n label: Public network name or ID\n description: Public network that enables remote connection to VNF\n unprotected_private_net_id:\n type: string\n label: Unprotected private network name or ID\n description: Private network that connects vPacketGenerator with vFirewall\n protected_private_net_id:\n type: string\n label: Protected private network name or ID\n description: Private network that connects vFirewall with vSink\n ecomp_private_net_id:\n type: string\n label: ECOMP management network name or ID\n description: Private network that connects ECOMP component and the VNF\n unprotected_private_net_cidr:\n type: string\n label: Unprotected private network CIDR\n description: The CIDR of the unprotected private network\n protected_private_net_cidr:\n type: string\n label: Protected private network CIDR\n description: The CIDR of the protected private network\n ecomp_private_net_cidr:\n type: string\n label: ECOMP private network CIDR\n description: The CIDR of the protected private network\n vfw_private_ip_0:\n type: string\n label: vFirewall private IP address towards the unprotected network\n description: Private IP address that is assigned to the vFirewall to communicate with the vPacketGenerator\n vfw_private_ip_1:\n type: string\n label: vFirewall private IP address towards the protected network\n description: Private IP address that is assigned to the vFirewall to communicate with the vSink\n vfw_private_ip_2:\n type: string\n label: vFirewall private IP address towards the ECOMP management network\n description: Private IP address that is assigned to the vFirewall to communicate with ECOMP components\n vpg_private_ip_0:\n type: string\n label: vPacketGenerator private IP address towards the unprotected network\n description: Private IP address that is assigned to the vPacketGenerator to communicate with the vFirewall\n vpg_private_ip_1:\n type: string\n label: vPacketGenerator private IP address towards the ECOMP management network\n description: Private IP address that is assigned to the vPacketGenerator to communicate with ECOMP components\n vsn_private_ip_0:\n type: string\n label: vSink private IP address towards the protected network\n description: Private IP address that is assigned to the vSink to communicate with the vFirewall\n vsn_private_ip_1:\n type: string\n label: vSink private IP address towards the ECOMP management network\n description: Private IP address that is assigned to the vSink to communicate with ECOMP components\n vfw_name_0:\n type: string\n label: vFirewall name\n description: Name of the vFirewall\n vpg_name_0:\n type: string\n label: vPacketGenerator name\n description: Name of the vPacketGenerator\n vsn_name_0:\n type: string\n label: vSink name\n description: Name of the vSink\n vnf_id:\n type: string\n label: VNF ID\n description: The VNF ID is provided by ECOMP\n vf_module_id:\n type: string\n label: vFirewall module ID\n description: The vFirewall Module ID is provided by ECOMP\n webserver_ip:\n type: string\n label: Webserver IP address\n description: IP address of the webserver that hosts the source code and binaries\n dcae_collector_ip:\n type: string\n label: DCAE collector IP address\n description: IP address of the DCAE collector\n key_name:\n type: string\n label: Key pair name\n description: Public/Private key pair name\n pub_key:\n type: string\n label: Public key\n description: Public key to be installed on the compute instance\n\nresources:\n my_keypair:\n type: OS::Nova::KeyPair\n properties:\n name: { get_param: key_name }\n public_key: { get_param: pub_key }\n save_private_key: false\n\n unprotected_private_network:\n type: OS::Neutron::Net\n properties:\n name: { get_param: unprotected_private_net_id }\n\n protected_private_network:\n type: OS::Neutron::Net\n properties:\n name: { get_param: protected_private_net_id }\n\n unprotected_private_subnet:\n type: OS::Neutron::Subnet\n properties:\n network_id: { get_resource: unprotected_private_network }\n cidr: { get_param: unprotected_private_net_cidr }\n\n protected_private_subnet:\n type: OS::Neutron::Subnet\n properties:\n network_id: { get_resource: protected_private_network }\n cidr: { get_param: protected_private_net_cidr }\n\n vfw_0:\n type: OS::Nova::Server\n properties:\n image: { get_param: vfw_image_name }\n flavor: { get_param: vfw_flavor_name }\n name: { get_param: vfw_name_0 }\n key_name: { get_resource: my_keypair }\n networks:\n - network: { get_param: public_net_id }\n - port: { get_resource: vfw_private_0_port }\n - port: { get_resource: vfw_private_1_port }\n - port: { get_resource: vfw_private_2_port }\n metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}\n user_data_format: RAW\n user_data:\n str_replace:\n params:\n __webserver__: { get_param: webserver_ip }\n __dcae_collector_ip__ : { get_param: dcae_collector_ip }\n template: |\n #!/bin/bash\n\n WEBSERVER_IP=__webserver__\n DCAE_COLLECTOR_IP=__dcae_collector_ip__\n\n mkdir /opt/config\n cd /opt\n wget http://$WEBSERVER_IP/demo_repo/v_firewall_init.sh\n wget http://$WEBSERVER_IP/demo_repo/vfirewall.sh\n chmod +x v_firewall_init.sh\n chmod +x vfirewall.sh\n echo $WEBSERVER_IP > config/webserver_ip.txt\n echo $DCAE_COLLECTOR_IP > config/dcae_collector_ip.txt\n echo \"no\" > config/install.txt\n mv vfirewall.sh /etc/init.d\n sudo update-rc.d vfirewall.sh defaults\n ./v_firewall_init.sh\n\n vfw_private_0_port:\n type: OS::Neutron::Port\n properties:\n network: { get_resource: unprotected_private_network }\n fixed_ips: [{\"subnet\": { get_resource: unprotected_private_subnet }, \"ip_address\": { get_param: vfw_private_ip_0 }}]\n\n vfw_private_1_port:\n type: OS::Neutron::Port\n properties:\n network: { get_resource: protected_private_network }\n fixed_ips: [{\"subnet\": { get_resource: protected_private_subnet }, \"ip_address\": { get_param: vfw_private_ip_1 }}]\n\n vfw_private_2_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: ecomp_private_net_id }\n fixed_ips: [{\"subnet\": { get_param: ecomp_private_net_id }, \"ip_address\": { get_param: vfw_private_ip_2 }}]\n\n vpg_0:\n type: OS::Nova::Server\n properties:\n image: { get_param: vfw_image_name }\n flavor: { get_param: vfw_flavor_name }\n name: { get_param: vpg_name_0 }\n key_name: { get_resource: my_keypair }\n networks:\n - network: { get_param: public_net_id }\n - port: { get_resource: vpg_private_0_port }\n - port: { get_resource: vpg_private_1_port }\n metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}\n user_data_format: RAW\n user_data:\n str_replace:\n params:\n __webserver__: { get_param: webserver_ip }\n __fw_ipaddr__: { get_param: vfw_private_ip_0 }\n __protected_net_cidr__: { get_param: protected_private_net_cidr }\n __sink_ipaddr__: { get_param: vsn_private_ip_0 }\n template: |\n #!/bin/bash\n\n WEBSERVER_IP=__webserver__\n FW_IPADDR=__fw_ipaddr__\n PROTECTED_NET_CIDR=__protected_net_cidr__\n SINK_IPADDR=__sink_ipaddr__\n\n mkdir /opt/config\n cd /opt\n wget http://$WEBSERVER_IP/demo_repo/v_packetgen_init.sh\n wget http://$WEBSERVER_IP/demo_repo/vpacketgen.sh\n chmod +x v_packetgen_init.sh\n chmod +x vpacketgen.sh\n echo $WEBSERVER_IP > config/webserver_ip.txt\n echo $FW_IPADDR > config/fw_ipaddr.txt\n echo $PROTECTED_NET_CIDR > config/protected_net_cidr.txt\n echo $SINK_IPADDR > config/sink_ipaddr.txt\n echo \"no\" > config/install.txt\n mv vpacketgen.sh /etc/init.d\n sudo update-rc.d vpacketgen.sh defaults\n ./v_packetgen_init.sh\n\n vpg_private_0_port:\n type: OS::Neutron::Port\n properties:\n network: { get_resource: unprotected_private_network }\n fixed_ips: [{\"subnet\": { get_resource: unprotected_private_subnet }, \"ip_address\": { get_param: vpg_private_ip_0 }}]\n\n vpg_private_1_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: ecomp_private_net_id }\n fixed_ips: [{\"subnet\": { get_param: ecomp_private_net_id }, \"ip_address\": { get_param: vpg_private_ip_1 }}]\n\n vsn_0:\n type: OS::Nova::Server\n properties:\n image: { get_param: vfw_image_name }\n flavor: { get_param: vfw_flavor_name }\n name: { get_param: vsn_name_0 }\n key_name: { get_resource: my_keypair }\n networks:\n - network: { get_param: public_net_id }\n - port: { get_resource: vsn_private_0_port }\n - port: { get_resource: vsn_private_1_port }\n metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}\n user_data_format: RAW\n user_data:\n str_replace:\n params:\n __webserver__: { get_param: webserver_ip }\n __protected_net_gw__: { get_param: vfw_private_ip_1 }\n __unprotected_net__: { get_param: unprotected_private_net_cidr }\n template: |\n #!/bin/bash\n\n WEBSERVER_IP=__webserver__\n PROTECTED_NET_GW=__protected_net_gw__\n UNPROTECTED_NET=__unprotected_net__\n UNPROTECTED_NET=$(echo $UNPROTECTED_NET | cut -d\'/\' -f1)\n\n mkdir /opt/config\n cd /opt\n wget http://$WEBSERVER_IP/demo_repo/v_sink_init.sh\n wget http://$WEBSERVER_IP/demo_repo/vsink.sh\n chmod +x v_sink_init.sh\n chmod +x vsink.sh\n echo $PROTECTED_NET_GW > config/protected_net_gw.txt\n echo $UNPROTECTED_NET > config/unprotected_net.txt\n echo \"no\" > config/install.txt\n mv vsink.sh /etc/init.d\n sudo update-rc.d vsink.sh defaults\n ./v_sink_init.sh\n\n vsn_private_0_port:\n type: OS::Neutron::Port\n properties:\n network: { get_resource: protected_private_network }\n fixed_ips: [{\"subnet\": { get_resource: protected_private_subnet }, \"ip_address\": { get_param: vsn_private_ip_0 }}]\n\n vsn_private_1_port:\n type: OS::Neutron::Port\n properties:\n network: { get_param: ecomp_private_net_id }\n fixed_ips: [{\"subnet\": { get_param: ecomp_private_net_id }, \"ip_address\": { get_param: vsn_private_ip_1 }}]\n \n',300,'MANUAL RECORD','2016-11-14 13:04:07');
+
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','dcae_collector_ip','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','ecomp_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','ecomp_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','key_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','protected_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','protected_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','public_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','pub_key','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','unprotected_private_net_cidr','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','unprotected_private_net_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','vfw_flavor_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','vfw_image_name','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','vfw_name_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','vfw_private_ip_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','vfw_private_ip_1','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','vfw_private_ip_2','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','vf_module_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','vnf_id','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','vpg_name_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','vpg_private_ip_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','vpg_private_ip_1','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','vsn_name_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','vsn_private_ip_0','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','vsn_private_ip_1','','string',NULL);
+INSERT INTO `heat_template_params` (`HEAT_TEMPLATE_ARTIFACT_UUID`, `PARAM_NAME`, `IS_REQUIRED`, `PARAM_TYPE`, `PARAM_ALIAS`) VALUES ('Artifact-UUID3','webserver_ip','','string',NULL);
+
+INSERT INTO `service` (`MODEL_UUID`, `MODEL_NAME`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `TOSCA_CSAR_ARTIFACT_UUID`) VALUES ('2e34774e-715e-4fd5-bd09-7b654622f35i','vfw-service','585822c7-4027-4f84-ba50-e9248606f112','1.0','VFW service','2016-11-14 13:04:07',NULL);
+
+INSERT INTO `vf_module` (`MODEL_UUID`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `MODEL_NAME`, `DESCRIPTION`, `IS_BASE`, `HEAT_TEMPLATE_ARTIFACT_UUID`, `VOL_HEAT_TEMPLATE_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VNF_RESOURCE_MODEL_UUID`) VALUES ('1e34774e-715e-4fd5-bd08-7b654622f33f.VF_RI1_VFW::module-1::module-1.group','585822c7-4027-4f84-ba50-e9248606f134','1.0','VF_RI1_VFW::module-1',NULL,1,'Artifact-UUID3',NULL,'2016-11-14 13:04:07','685822c7-4027-4f84-ba50-e9248606f132');
+
+INSERT INTO `vf_module_customization` (`MODEL_CUSTOMIZATION_UUID`, `LABEL`, `INITIAL_COUNT`, `MIN_INSTANCES`, `MAX_INSTANCES`, `AVAILABILITY_ZONE_COUNT`, `HEAT_ENVIRONMENT_ARTIFACT_UUID`, `VOL_ENVIRONMENT_ARTIFACT_UUID`, `CREATION_TIMESTAMP`, `VF_MODULE_MODEL_UUID`) VALUES ('5aa23938-a9fe-11e7-8b4b-0242ac120002',NULL,1,0,NULL,NULL,'EnvArtifact-UUID3',NULL,'2017-10-05 18:52:03','1e34774e-715e-4fd5-bd08-7b654622f33f.VF_RI1_VFW::module-1::module-1.group');
+
+INSERT INTO `vnf_res_custom_to_vf_module_custom` (`VNF_RESOURCE_CUST_MODEL_CUSTOMIZATION_UUID`, `VF_MODULE_CUST_MODEL_CUSTOMIZATION_UUID`, `CREATION_TIMESTAMP`) VALUES ('5a9bd247-a9fe-11e7-8b4b-0242ac120002','5aa23938-a9fe-11e7-8b4b-0242ac120002','2017-10-05 18:52:03');
+
+INSERT INTO `vnf_resource` (`ORCHESTRATION_MODE`, `DESCRIPTION`, `CREATION_TIMESTAMP`, `MODEL_UUID`, `AIC_VERSION_MIN`, `AIC_VERSION_MAX`, `MODEL_INVARIANT_UUID`, `MODEL_VERSION`, `MODEL_NAME`, `TOSCA_NODE_TYPE`, `HEAT_TEMPLATE_ARTIFACT_UUID`) VALUES ('HEAT','VFW service1707MIGRATED','2016-11-14 13:04:07','685822c7-4027-4f84-ba50-e9248606f132',NULL,NULL,'585822c7-4027-4f84-ba50-e9248606f113','1.0','VFWResource',NULL,NULL);
+
+INSERT INTO `vnf_resource_customization` (`MODEL_CUSTOMIZATION_UUID`, `MODEL_INSTANCE_NAME`, `MIN_INSTANCES`, `MAX_INSTANCES`, `AVAILABILITY_ZONE_MAX_COUNT`, `NF_TYPE`, `NF_ROLE`, `NF_FUNCTION`, `NF_NAMING_CODE`, `CREATION_TIMESTAMP`, `VNF_RESOURCE_MODEL_UUID`) VALUES ('5a9bd247-a9fe-11e7-8b4b-0242ac120002','VFWResource-1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2017-10-05 18:52:03','685822c7-4027-4f84-ba50-e9248606f132');
+
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
diff --git a/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/camunda/mariadb_engine_7.7.3-ee.sql b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/camunda/mariadb_engine_7.7.3-ee.sql
new file mode 100644
index 00000000..b9b8dd62
--- /dev/null
+++ b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/camunda/mariadb_engine_7.7.3-ee.sql
@@ -0,0 +1,1195 @@
+DROP DATABASE IF EXISTS `camundabpmn`;
+
+CREATE DATABASE `camundabpmn`;
+
+USE `camundabpmn`;
+
+# DROP USER IF EXISTS 'camunda';
+delete from mysql.user where User='camunda';
+CREATE USER 'camunda';
+GRANT ALL on camundabpmn.* to 'camunda' identified by 'camunda123' with GRANT OPTION;
+FLUSH PRIVILEGES;
+
+USE `camundabpmn`;
+
+create table ACT_GE_PROPERTY (
+ NAME_ varchar(64),
+ VALUE_ varchar(300),
+ REV_ integer,
+ primary key (NAME_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+insert into ACT_GE_PROPERTY
+values ('schema.version', 'fox', 1);
+
+insert into ACT_GE_PROPERTY
+values ('schema.history', 'create(fox)', 1);
+
+insert into ACT_GE_PROPERTY
+values ('next.dbid', '1', 1);
+
+insert into ACT_GE_PROPERTY
+values ('deployment.lock', '0', 1);
+
+insert into ACT_GE_PROPERTY
+values ('history.cleanup.job.lock', '0', 1);
+
+create table ACT_GE_BYTEARRAY (
+ ID_ varchar(64),
+ REV_ integer,
+ NAME_ varchar(255),
+ DEPLOYMENT_ID_ varchar(64),
+ BYTES_ LONGBLOB,
+ GENERATED_ TINYINT,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_RE_DEPLOYMENT (
+ ID_ varchar(64),
+ NAME_ varchar(255),
+ DEPLOY_TIME_ timestamp(3),
+ SOURCE_ varchar(255),
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_RU_EXECUTION (
+ ID_ varchar(64),
+ REV_ integer,
+ PROC_INST_ID_ varchar(64),
+ BUSINESS_KEY_ varchar(255),
+ PARENT_ID_ varchar(64),
+ PROC_DEF_ID_ varchar(64),
+ SUPER_EXEC_ varchar(64),
+ SUPER_CASE_EXEC_ varchar(64),
+ CASE_INST_ID_ varchar(64),
+ ACT_ID_ varchar(255),
+ ACT_INST_ID_ varchar(64),
+ IS_ACTIVE_ TINYINT,
+ IS_CONCURRENT_ TINYINT,
+ IS_SCOPE_ TINYINT,
+ IS_EVENT_SCOPE_ TINYINT,
+ SUSPENSION_STATE_ integer,
+ CACHED_ENT_STATE_ integer,
+ SEQUENCE_COUNTER_ bigint,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_RU_JOB (
+ ID_ varchar(64) NOT NULL,
+ REV_ integer,
+ TYPE_ varchar(255) NOT NULL,
+ LOCK_EXP_TIME_ timestamp(3) NULL,
+ LOCK_OWNER_ varchar(255),
+ EXCLUSIVE_ boolean,
+ EXECUTION_ID_ varchar(64),
+ PROCESS_INSTANCE_ID_ varchar(64),
+ PROCESS_DEF_ID_ varchar(64),
+ PROCESS_DEF_KEY_ varchar(255),
+ RETRIES_ integer,
+ EXCEPTION_STACK_ID_ varchar(64),
+ EXCEPTION_MSG_ varchar(4000),
+ DUEDATE_ timestamp(3) NULL,
+ REPEAT_ varchar(255),
+ HANDLER_TYPE_ varchar(255),
+ HANDLER_CFG_ varchar(4000),
+ DEPLOYMENT_ID_ varchar(64),
+ SUSPENSION_STATE_ integer NOT NULL DEFAULT 1,
+ JOB_DEF_ID_ varchar(64),
+ PRIORITY_ bigint NOT NULL DEFAULT 0,
+ SEQUENCE_COUNTER_ bigint,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_RU_JOBDEF (
+ ID_ varchar(64) NOT NULL,
+ REV_ integer,
+ PROC_DEF_ID_ varchar(64),
+ PROC_DEF_KEY_ varchar(255),
+ ACT_ID_ varchar(255),
+ JOB_TYPE_ varchar(255) NOT NULL,
+ JOB_CONFIGURATION_ varchar(255),
+ SUSPENSION_STATE_ integer,
+ JOB_PRIORITY_ bigint,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_RE_PROCDEF (
+ ID_ varchar(64) not null,
+ REV_ integer,
+ CATEGORY_ varchar(255),
+ NAME_ varchar(255),
+ KEY_ varchar(255) not null,
+ VERSION_ integer not null,
+ DEPLOYMENT_ID_ varchar(64),
+ RESOURCE_NAME_ varchar(4000),
+ DGRM_RESOURCE_NAME_ varchar(4000),
+ HAS_START_FORM_KEY_ TINYINT,
+ SUSPENSION_STATE_ integer,
+ TENANT_ID_ varchar(64),
+ VERSION_TAG_ varchar(64),
+ HISTORY_TTL_ integer,
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_RU_TASK (
+ ID_ varchar(64),
+ REV_ integer,
+ EXECUTION_ID_ varchar(64),
+ PROC_INST_ID_ varchar(64),
+ PROC_DEF_ID_ varchar(64),
+ CASE_EXECUTION_ID_ varchar(64),
+ CASE_INST_ID_ varchar(64),
+ CASE_DEF_ID_ varchar(64),
+ NAME_ varchar(255),
+ PARENT_TASK_ID_ varchar(64),
+ DESCRIPTION_ varchar(4000),
+ TASK_DEF_KEY_ varchar(255),
+ OWNER_ varchar(255),
+ ASSIGNEE_ varchar(255),
+ DELEGATION_ varchar(64),
+ PRIORITY_ integer,
+ CREATE_TIME_ timestamp(3),
+ DUE_DATE_ datetime(3),
+ FOLLOW_UP_DATE_ datetime(3),
+ SUSPENSION_STATE_ integer,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_RU_IDENTITYLINK (
+ ID_ varchar(64),
+ REV_ integer,
+ GROUP_ID_ varchar(255),
+ TYPE_ varchar(255),
+ USER_ID_ varchar(255),
+ TASK_ID_ varchar(64),
+ PROC_DEF_ID_ varchar(64),
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_RU_VARIABLE (
+ ID_ varchar(64) not null,
+ REV_ integer,
+ TYPE_ varchar(255) not null,
+ NAME_ varchar(255) not null,
+ EXECUTION_ID_ varchar(64),
+ PROC_INST_ID_ varchar(64),
+ CASE_EXECUTION_ID_ varchar(64),
+ CASE_INST_ID_ varchar(64),
+ TASK_ID_ varchar(64),
+ BYTEARRAY_ID_ varchar(64),
+ DOUBLE_ double,
+ LONG_ bigint,
+ TEXT_ LONGBLOB NULL,
+ TEXT2_ LONGBLOB NULL,
+ VAR_SCOPE_ varchar(64) not null,
+ SEQUENCE_COUNTER_ bigint,
+ IS_CONCURRENT_LOCAL_ TINYINT,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_RU_EVENT_SUBSCR (
+ ID_ varchar(64) not null,
+ REV_ integer,
+ EVENT_TYPE_ varchar(255) not null,
+ EVENT_NAME_ varchar(255),
+ EXECUTION_ID_ varchar(64),
+ PROC_INST_ID_ varchar(64),
+ ACTIVITY_ID_ varchar(255),
+ CONFIGURATION_ varchar(255),
+ CREATED_ timestamp(3) not null,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_RU_INCIDENT (
+ ID_ varchar(64) not null,
+ REV_ integer not null,
+ INCIDENT_TIMESTAMP_ timestamp(3) not null,
+ INCIDENT_MSG_ varchar(4000),
+ INCIDENT_TYPE_ varchar(255) not null,
+ EXECUTION_ID_ varchar(64),
+ ACTIVITY_ID_ varchar(255),
+ PROC_INST_ID_ varchar(64),
+ PROC_DEF_ID_ varchar(64),
+ CAUSE_INCIDENT_ID_ varchar(64),
+ ROOT_CAUSE_INCIDENT_ID_ varchar(64),
+ CONFIGURATION_ varchar(255),
+ TENANT_ID_ varchar(64),
+ JOB_DEF_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_RU_AUTHORIZATION (
+ ID_ varchar(64) not null,
+ REV_ integer not null,
+ TYPE_ integer not null,
+ GROUP_ID_ varchar(255),
+ USER_ID_ varchar(255),
+ RESOURCE_TYPE_ integer not null,
+ RESOURCE_ID_ varchar(64),
+ PERMS_ integer,
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_RU_FILTER (
+ ID_ varchar(64) not null,
+ REV_ integer not null,
+ RESOURCE_TYPE_ varchar(255) not null,
+ NAME_ varchar(255) not null,
+ OWNER_ varchar(255),
+ QUERY_ LONGTEXT not null,
+ PROPERTIES_ LONGTEXT,
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_RU_METER_LOG (
+ ID_ varchar(64) not null,
+ NAME_ varchar(64) not null,
+ REPORTER_ varchar(255),
+ VALUE_ bigint,
+ TIMESTAMP_ timestamp(3),
+ MILLISECONDS_ bigint DEFAULT 0,
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_RU_EXT_TASK (
+ ID_ varchar(64) not null,
+ REV_ integer not null,
+ WORKER_ID_ varchar(255),
+ TOPIC_NAME_ varchar(255),
+ RETRIES_ integer,
+ ERROR_MSG_ varchar(4000),
+ ERROR_DETAILS_ID_ varchar(64),
+ LOCK_EXP_TIME_ timestamp(3) NULL,
+ SUSPENSION_STATE_ integer,
+ EXECUTION_ID_ varchar(64),
+ PROC_INST_ID_ varchar(64),
+ PROC_DEF_ID_ varchar(64),
+ PROC_DEF_KEY_ varchar(255),
+ ACT_ID_ varchar(255),
+ ACT_INST_ID_ varchar(64),
+ TENANT_ID_ varchar(64),
+ PRIORITY_ bigint NOT NULL DEFAULT 0,
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_RU_BATCH (
+ ID_ varchar(64) not null,
+ REV_ integer not null,
+ TYPE_ varchar(255),
+ TOTAL_JOBS_ integer,
+ JOBS_CREATED_ integer,
+ JOBS_PER_SEED_ integer,
+ INVOCATIONS_PER_JOB_ integer,
+ SEED_JOB_DEF_ID_ varchar(64),
+ BATCH_JOB_DEF_ID_ varchar(64),
+ MONITOR_JOB_DEF_ID_ varchar(64),
+ SUSPENSION_STATE_ integer,
+ CONFIGURATION_ varchar(255),
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create index ACT_IDX_EXEC_BUSKEY on ACT_RU_EXECUTION(BUSINESS_KEY_);
+create index ACT_IDX_EXEC_TENANT_ID on ACT_RU_EXECUTION(TENANT_ID_);
+create index ACT_IDX_TASK_CREATE on ACT_RU_TASK(CREATE_TIME_);
+create index ACT_IDX_TASK_ASSIGNEE on ACT_RU_TASK(ASSIGNEE_);
+create index ACT_IDX_TASK_TENANT_ID on ACT_RU_TASK(TENANT_ID_);
+create index ACT_IDX_IDENT_LNK_USER on ACT_RU_IDENTITYLINK(USER_ID_);
+create index ACT_IDX_IDENT_LNK_GROUP on ACT_RU_IDENTITYLINK(GROUP_ID_);
+create index ACT_IDX_EVENT_SUBSCR_CONFIG_ on ACT_RU_EVENT_SUBSCR(CONFIGURATION_);
+create index ACT_IDX_EVENT_SUBSCR_TENANT_ID on ACT_RU_EVENT_SUBSCR(TENANT_ID_);
+create index ACT_IDX_VARIABLE_TASK_ID on ACT_RU_VARIABLE(TASK_ID_);
+create index ACT_IDX_VARIABLE_TENANT_ID on ACT_RU_VARIABLE(TENANT_ID_);
+create index ACT_IDX_ATHRZ_PROCEDEF on ACT_RU_IDENTITYLINK(PROC_DEF_ID_);
+create index ACT_IDX_INC_CONFIGURATION on ACT_RU_INCIDENT(CONFIGURATION_);
+create index ACT_IDX_INC_TENANT_ID on ACT_RU_INCIDENT(TENANT_ID_);
+-- CAM-5914
+create index ACT_IDX_JOB_EXECUTION_ID on ACT_RU_JOB(EXECUTION_ID_);
+-- this index needs to be limited in mariadb see CAM-6938
+create index ACT_IDX_JOB_HANDLER on ACT_RU_JOB(HANDLER_TYPE_(100),HANDLER_CFG_(155));
+create index ACT_IDX_JOB_PROCINST on ACT_RU_JOB(PROCESS_INSTANCE_ID_);
+create index ACT_IDX_JOB_TENANT_ID on ACT_RU_JOB(TENANT_ID_);
+create index ACT_IDX_JOBDEF_TENANT_ID on ACT_RU_JOBDEF(TENANT_ID_);
+
+-- new metric milliseconds column
+CREATE INDEX ACT_IDX_METER_LOG_MS ON ACT_RU_METER_LOG(MILLISECONDS_);
+CREATE INDEX ACT_IDX_METER_LOG_NAME_MS ON ACT_RU_METER_LOG(NAME_, MILLISECONDS_);
+CREATE INDEX ACT_IDX_METER_LOG_REPORT ON ACT_RU_METER_LOG(NAME_, REPORTER_, MILLISECONDS_);
+
+-- old metric timestamp column
+CREATE INDEX ACT_IDX_METER_LOG_TIME ON ACT_RU_METER_LOG(TIMESTAMP_);
+CREATE INDEX ACT_IDX_METER_LOG ON ACT_RU_METER_LOG(NAME_, TIMESTAMP_);
+
+create index ACT_IDX_EXT_TASK_TOPIC on ACT_RU_EXT_TASK(TOPIC_NAME_);
+create index ACT_IDX_EXT_TASK_TENANT_ID on ACT_RU_EXT_TASK(TENANT_ID_);
+create index ACT_IDX_EXT_TASK_PRIORITY ON ACT_RU_EXT_TASK(PRIORITY_);
+create index ACT_IDX_EXT_TASK_ERR_DETAILS ON ACT_RU_EXT_TASK(ERROR_DETAILS_ID_);
+create index ACT_IDX_AUTH_GROUP_ID ON ACT_RU_AUTHORIZATION(GROUP_ID_);
+create index ACT_IDX_JOB_JOB_DEF_ID on ACT_RU_JOB(JOB_DEF_ID_);
+
+alter table ACT_GE_BYTEARRAY
+ add constraint ACT_FK_BYTEARR_DEPL
+ foreign key (DEPLOYMENT_ID_)
+ references ACT_RE_DEPLOYMENT (ID_);
+
+alter table ACT_RU_EXECUTION
+ add constraint ACT_FK_EXE_PROCINST
+ foreign key (PROC_INST_ID_)
+ references ACT_RU_EXECUTION (ID_) on delete cascade on update cascade;
+
+alter table ACT_RU_EXECUTION
+ add constraint ACT_FK_EXE_PARENT
+ foreign key (PARENT_ID_)
+ references ACT_RU_EXECUTION (ID_);
+
+alter table ACT_RU_EXECUTION
+ add constraint ACT_FK_EXE_SUPER
+ foreign key (SUPER_EXEC_)
+ references ACT_RU_EXECUTION (ID_);
+
+alter table ACT_RU_EXECUTION
+ add constraint ACT_FK_EXE_PROCDEF
+ foreign key (PROC_DEF_ID_)
+ references ACT_RE_PROCDEF (ID_);
+
+alter table ACT_RU_IDENTITYLINK
+ add constraint ACT_FK_TSKASS_TASK
+ foreign key (TASK_ID_)
+ references ACT_RU_TASK (ID_);
+
+alter table ACT_RU_IDENTITYLINK
+ add constraint ACT_FK_ATHRZ_PROCEDEF
+ foreign key (PROC_DEF_ID_)
+ references ACT_RE_PROCDEF(ID_);
+
+alter table ACT_RU_TASK
+ add constraint ACT_FK_TASK_EXE
+ foreign key (EXECUTION_ID_)
+ references ACT_RU_EXECUTION (ID_);
+
+alter table ACT_RU_TASK
+ add constraint ACT_FK_TASK_PROCINST
+ foreign key (PROC_INST_ID_)
+ references ACT_RU_EXECUTION (ID_);
+
+alter table ACT_RU_TASK
+ add constraint ACT_FK_TASK_PROCDEF
+ foreign key (PROC_DEF_ID_)
+ references ACT_RE_PROCDEF (ID_);
+
+alter table ACT_RU_VARIABLE
+ add constraint ACT_FK_VAR_EXE
+ foreign key (EXECUTION_ID_)
+ references ACT_RU_EXECUTION (ID_);
+
+alter table ACT_RU_VARIABLE
+ add constraint ACT_FK_VAR_PROCINST
+ foreign key (PROC_INST_ID_)
+ references ACT_RU_EXECUTION(ID_);
+
+alter table ACT_RU_VARIABLE
+ add constraint ACT_FK_VAR_BYTEARRAY
+ foreign key (BYTEARRAY_ID_)
+ references ACT_GE_BYTEARRAY (ID_);
+
+alter table ACT_RU_JOB
+ add constraint ACT_FK_JOB_EXCEPTION
+ foreign key (EXCEPTION_STACK_ID_)
+ references ACT_GE_BYTEARRAY (ID_);
+
+alter table ACT_RU_EVENT_SUBSCR
+ add constraint ACT_FK_EVENT_EXEC
+ foreign key (EXECUTION_ID_)
+ references ACT_RU_EXECUTION(ID_);
+
+alter table ACT_RU_INCIDENT
+ add constraint ACT_FK_INC_EXE
+ foreign key (EXECUTION_ID_)
+ references ACT_RU_EXECUTION (ID_);
+
+alter table ACT_RU_INCIDENT
+ add constraint ACT_FK_INC_PROCINST
+ foreign key (PROC_INST_ID_)
+ references ACT_RU_EXECUTION (ID_);
+
+alter table ACT_RU_INCIDENT
+ add constraint ACT_FK_INC_PROCDEF
+ foreign key (PROC_DEF_ID_)
+ references ACT_RE_PROCDEF (ID_);
+
+alter table ACT_RU_INCIDENT
+ add constraint ACT_FK_INC_CAUSE
+ foreign key (CAUSE_INCIDENT_ID_)
+ references ACT_RU_INCIDENT (ID_) on delete cascade on update cascade;
+
+alter table ACT_RU_INCIDENT
+ add constraint ACT_FK_INC_RCAUSE
+ foreign key (ROOT_CAUSE_INCIDENT_ID_)
+ references ACT_RU_INCIDENT (ID_) on delete cascade on update cascade;
+
+alter table ACT_RU_EXT_TASK
+ add constraint ACT_FK_EXT_TASK_ERROR_DETAILS
+ foreign key (ERROR_DETAILS_ID_)
+ references ACT_GE_BYTEARRAY (ID_);
+
+create index ACT_IDX_INC_JOB_DEF on ACT_RU_INCIDENT(JOB_DEF_ID_);
+alter table ACT_RU_INCIDENT
+ add constraint ACT_FK_INC_JOB_DEF
+ foreign key (JOB_DEF_ID_)
+ references ACT_RU_JOBDEF (ID_);
+
+alter table ACT_RU_AUTHORIZATION
+ add constraint ACT_UNIQ_AUTH_USER
+ unique (USER_ID_,TYPE_,RESOURCE_TYPE_,RESOURCE_ID_);
+
+alter table ACT_RU_AUTHORIZATION
+ add constraint ACT_UNIQ_AUTH_GROUP
+ unique (GROUP_ID_,TYPE_,RESOURCE_TYPE_,RESOURCE_ID_);
+
+alter table ACT_RU_VARIABLE
+ add constraint ACT_UNIQ_VARIABLE
+ unique (VAR_SCOPE_, NAME_);
+
+alter table ACT_RU_EXT_TASK
+ add constraint ACT_FK_EXT_TASK_EXE
+ foreign key (EXECUTION_ID_)
+ references ACT_RU_EXECUTION (ID_);
+
+create index ACT_IDX_BATCH_SEED_JOB_DEF ON ACT_RU_BATCH(SEED_JOB_DEF_ID_);
+alter table ACT_RU_BATCH
+ add constraint ACT_FK_BATCH_SEED_JOB_DEF
+ foreign key (SEED_JOB_DEF_ID_)
+ references ACT_RU_JOBDEF (ID_);
+
+create index ACT_IDX_BATCH_MONITOR_JOB_DEF ON ACT_RU_BATCH(MONITOR_JOB_DEF_ID_);
+alter table ACT_RU_BATCH
+ add constraint ACT_FK_BATCH_MONITOR_JOB_DEF
+ foreign key (MONITOR_JOB_DEF_ID_)
+ references ACT_RU_JOBDEF (ID_);
+
+create index ACT_IDX_BATCH_JOB_DEF ON ACT_RU_BATCH(BATCH_JOB_DEF_ID_);
+alter table ACT_RU_BATCH
+ add constraint ACT_FK_BATCH_JOB_DEF
+ foreign key (BATCH_JOB_DEF_ID_)
+ references ACT_RU_JOBDEF (ID_);
+
+-- indexes for deadlock problems - https://app.camunda.com/jira/browse/CAM-2567 --
+create index ACT_IDX_INC_CAUSEINCID on ACT_RU_INCIDENT(CAUSE_INCIDENT_ID_);
+create index ACT_IDX_INC_EXID on ACT_RU_INCIDENT(EXECUTION_ID_);
+create index ACT_IDX_INC_PROCDEFID on ACT_RU_INCIDENT(PROC_DEF_ID_);
+create index ACT_IDX_INC_PROCINSTID on ACT_RU_INCIDENT(PROC_INST_ID_);
+create index ACT_IDX_INC_ROOTCAUSEINCID on ACT_RU_INCIDENT(ROOT_CAUSE_INCIDENT_ID_);
+-- index for deadlock problem - https://app.camunda.com/jira/browse/CAM-4440 --
+create index ACT_IDX_AUTH_RESOURCE_ID on ACT_RU_AUTHORIZATION(RESOURCE_ID_);
+-- index to prevent deadlock on fk constraint - https://app.camunda.com/jira/browse/CAM-5440 --
+create index ACT_IDX_EXT_TASK_EXEC on ACT_RU_EXT_TASK(EXECUTION_ID_);
+
+-- indexes to improve deployment
+create index ACT_IDX_BYTEARRAY_NAME on ACT_GE_BYTEARRAY(NAME_);
+create index ACT_IDX_DEPLOYMENT_NAME on ACT_RE_DEPLOYMENT(NAME_);
+create index ACT_IDX_DEPLOYMENT_TENANT_ID on ACT_RE_DEPLOYMENT(TENANT_ID_);
+create index ACT_IDX_JOBDEF_PROC_DEF_ID ON ACT_RU_JOBDEF(PROC_DEF_ID_);
+create index ACT_IDX_JOB_HANDLER_TYPE ON ACT_RU_JOB(HANDLER_TYPE_);
+create index ACT_IDX_EVENT_SUBSCR_EVT_NAME ON ACT_RU_EVENT_SUBSCR(EVENT_NAME_);
+create index ACT_IDX_PROCDEF_DEPLOYMENT_ID ON ACT_RE_PROCDEF(DEPLOYMENT_ID_);
+create index ACT_IDX_PROCDEF_TENANT_ID ON ACT_RE_PROCDEF(TENANT_ID_);
+create index ACT_IDX_PROCDEF_VER_TAG ON ACT_RE_PROCDEF(VERSION_TAG_);
+-- create case definition table --
+create table ACT_RE_CASE_DEF (
+ ID_ varchar(64) not null,
+ REV_ integer,
+ CATEGORY_ varchar(255),
+ NAME_ varchar(255),
+ KEY_ varchar(255) not null,
+ VERSION_ integer not null,
+ DEPLOYMENT_ID_ varchar(64),
+ RESOURCE_NAME_ varchar(4000),
+ DGRM_RESOURCE_NAME_ varchar(4000),
+ TENANT_ID_ varchar(64),
+ HISTORY_TTL_ integer,
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+-- create case execution table --
+create table ACT_RU_CASE_EXECUTION (
+ ID_ varchar(64) NOT NULL,
+ REV_ integer,
+ CASE_INST_ID_ varchar(64),
+ SUPER_CASE_EXEC_ varchar(64),
+ SUPER_EXEC_ varchar(64),
+ BUSINESS_KEY_ varchar(255),
+ PARENT_ID_ varchar(64),
+ CASE_DEF_ID_ varchar(64),
+ ACT_ID_ varchar(255),
+ PREV_STATE_ integer,
+ CURRENT_STATE_ integer,
+ REQUIRED_ boolean,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+-- create case sentry part table --
+
+create table ACT_RU_CASE_SENTRY_PART (
+ ID_ varchar(64) NOT NULL,
+ REV_ integer,
+ CASE_INST_ID_ varchar(64),
+ CASE_EXEC_ID_ varchar(64),
+ SENTRY_ID_ varchar(255),
+ TYPE_ varchar(255),
+ SOURCE_CASE_EXEC_ID_ varchar(64),
+ STANDARD_EVENT_ varchar(255),
+ SOURCE_ varchar(255),
+ VARIABLE_EVENT_ varchar(255),
+ VARIABLE_NAME_ varchar(255),
+ SATISFIED_ boolean,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+-- create index on business key --
+create index ACT_IDX_CASE_EXEC_BUSKEY on ACT_RU_CASE_EXECUTION(BUSINESS_KEY_);
+
+-- create foreign key constraints on ACT_RU_CASE_EXECUTION --
+alter table ACT_RU_CASE_EXECUTION
+ add constraint ACT_FK_CASE_EXE_CASE_INST
+ foreign key (CASE_INST_ID_)
+ references ACT_RU_CASE_EXECUTION(ID_) on delete cascade on update cascade;
+
+alter table ACT_RU_CASE_EXECUTION
+ add constraint ACT_FK_CASE_EXE_PARENT
+ foreign key (PARENT_ID_)
+ references ACT_RU_CASE_EXECUTION(ID_);
+
+alter table ACT_RU_CASE_EXECUTION
+ add constraint ACT_FK_CASE_EXE_CASE_DEF
+ foreign key (CASE_DEF_ID_)
+ references ACT_RE_CASE_DEF(ID_);
+
+-- create foreign key constraints on ACT_RU_VARIABLE --
+alter table ACT_RU_VARIABLE
+ add constraint ACT_FK_VAR_CASE_EXE
+ foreign key (CASE_EXECUTION_ID_)
+ references ACT_RU_CASE_EXECUTION(ID_);
+
+alter table ACT_RU_VARIABLE
+ add constraint ACT_FK_VAR_CASE_INST
+ foreign key (CASE_INST_ID_)
+ references ACT_RU_CASE_EXECUTION(ID_);
+
+-- create foreign key constraints on ACT_RU_TASK --
+alter table ACT_RU_TASK
+ add constraint ACT_FK_TASK_CASE_EXE
+ foreign key (CASE_EXECUTION_ID_)
+ references ACT_RU_CASE_EXECUTION(ID_);
+
+alter table ACT_RU_TASK
+ add constraint ACT_FK_TASK_CASE_DEF
+ foreign key (CASE_DEF_ID_)
+ references ACT_RE_CASE_DEF(ID_);
+
+-- create foreign key constraints on ACT_RU_CASE_SENTRY_PART --
+alter table ACT_RU_CASE_SENTRY_PART
+ add constraint ACT_FK_CASE_SENTRY_CASE_INST
+ foreign key (CASE_INST_ID_)
+ references ACT_RU_CASE_EXECUTION(ID_);
+
+alter table ACT_RU_CASE_SENTRY_PART
+ add constraint ACT_FK_CASE_SENTRY_CASE_EXEC
+ foreign key (CASE_EXEC_ID_)
+ references ACT_RU_CASE_EXECUTION(ID_);
+
+create index ACT_IDX_CASE_DEF_TENANT_ID on ACT_RE_CASE_DEF(TENANT_ID_);
+create index ACT_IDX_CASE_EXEC_TENANT_ID on ACT_RU_CASE_EXECUTION(TENANT_ID_);
+-- create decision definition table --
+create table ACT_RE_DECISION_DEF (
+ ID_ varchar(64) not null,
+ REV_ integer,
+ CATEGORY_ varchar(255),
+ NAME_ varchar(255),
+ KEY_ varchar(255) not null,
+ VERSION_ integer not null,
+ DEPLOYMENT_ID_ varchar(64),
+ RESOURCE_NAME_ varchar(4000),
+ DGRM_RESOURCE_NAME_ varchar(4000),
+ DEC_REQ_ID_ varchar(64),
+ DEC_REQ_KEY_ varchar(255),
+ TENANT_ID_ varchar(64),
+ HISTORY_TTL_ integer,
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+-- create decision requirements definition table --
+create table ACT_RE_DECISION_REQ_DEF (
+ ID_ varchar(64) NOT NULL,
+ REV_ integer,
+ CATEGORY_ varchar(255),
+ NAME_ varchar(255),
+ KEY_ varchar(255) NOT NULL,
+ VERSION_ integer NOT NULL,
+ DEPLOYMENT_ID_ varchar(64),
+ RESOURCE_NAME_ varchar(4000),
+ DGRM_RESOURCE_NAME_ varchar(4000),
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+alter table ACT_RE_DECISION_DEF
+ add constraint ACT_FK_DEC_REQ
+ foreign key (DEC_REQ_ID_)
+ references ACT_RE_DECISION_REQ_DEF(ID_);
+
+create index ACT_IDX_DEC_DEF_TENANT_ID on ACT_RE_DECISION_DEF(TENANT_ID_);
+create index ACT_IDX_DEC_DEF_REQ_ID on ACT_RE_DECISION_DEF(DEC_REQ_ID_);
+create index ACT_IDX_DEC_REQ_DEF_TENANT_ID on ACT_RE_DECISION_REQ_DEF(TENANT_ID_);
+create table ACT_HI_PROCINST (
+ ID_ varchar(64) not null,
+ PROC_INST_ID_ varchar(64) not null,
+ BUSINESS_KEY_ varchar(255),
+ PROC_DEF_KEY_ varchar(255),
+ PROC_DEF_ID_ varchar(64) not null,
+ START_TIME_ datetime(3) not null,
+ END_TIME_ datetime(3),
+ DURATION_ bigint,
+ START_USER_ID_ varchar(255),
+ START_ACT_ID_ varchar(255),
+ END_ACT_ID_ varchar(255),
+ SUPER_PROCESS_INSTANCE_ID_ varchar(64),
+ SUPER_CASE_INSTANCE_ID_ varchar(64),
+ CASE_INST_ID_ varchar(64),
+ DELETE_REASON_ varchar(4000),
+ TENANT_ID_ varchar(64),
+ STATE_ varchar(255),
+ primary key (ID_),
+ unique (PROC_INST_ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_HI_ACTINST (
+ ID_ varchar(64) not null,
+ PARENT_ACT_INST_ID_ varchar(64),
+ PROC_DEF_KEY_ varchar(255),
+ PROC_DEF_ID_ varchar(64) not null,
+ PROC_INST_ID_ varchar(64) not null,
+ EXECUTION_ID_ varchar(64) not null,
+ ACT_ID_ varchar(255) not null,
+ TASK_ID_ varchar(64),
+ CALL_PROC_INST_ID_ varchar(64),
+ CALL_CASE_INST_ID_ varchar(64),
+ ACT_NAME_ varchar(255),
+ ACT_TYPE_ varchar(255) not null,
+ ASSIGNEE_ varchar(64),
+ START_TIME_ datetime(3) not null,
+ END_TIME_ datetime(3),
+ DURATION_ bigint,
+ ACT_INST_STATE_ integer,
+ SEQUENCE_COUNTER_ bigint,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_HI_TASKINST (
+ ID_ varchar(64) not null,
+ TASK_DEF_KEY_ varchar(255),
+ PROC_DEF_KEY_ varchar(255),
+ PROC_DEF_ID_ varchar(64),
+ PROC_INST_ID_ varchar(64),
+ EXECUTION_ID_ varchar(64),
+ CASE_DEF_KEY_ varchar(255),
+ CASE_DEF_ID_ varchar(64),
+ CASE_INST_ID_ varchar(64),
+ CASE_EXECUTION_ID_ varchar(64),
+ ACT_INST_ID_ varchar(64),
+ NAME_ varchar(255),
+ PARENT_TASK_ID_ varchar(64),
+ DESCRIPTION_ varchar(4000),
+ OWNER_ varchar(255),
+ ASSIGNEE_ varchar(255),
+ START_TIME_ datetime(3) not null,
+ END_TIME_ datetime(3),
+ DURATION_ bigint,
+ DELETE_REASON_ varchar(4000),
+ PRIORITY_ integer,
+ DUE_DATE_ datetime(3),
+ FOLLOW_UP_DATE_ datetime(3),
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_HI_VARINST (
+ ID_ varchar(64) not null,
+ PROC_DEF_KEY_ varchar(255),
+ PROC_DEF_ID_ varchar(64),
+ PROC_INST_ID_ varchar(64),
+ EXECUTION_ID_ varchar(64),
+ ACT_INST_ID_ varchar(64),
+ CASE_DEF_KEY_ varchar(255),
+ CASE_DEF_ID_ varchar(64),
+ CASE_INST_ID_ varchar(64),
+ CASE_EXECUTION_ID_ varchar(64),
+ TASK_ID_ varchar(64),
+ NAME_ varchar(255) not null,
+ VAR_TYPE_ varchar(100),
+ REV_ integer,
+ BYTEARRAY_ID_ varchar(64),
+ DOUBLE_ double,
+ LONG_ bigint,
+ TEXT_ LONGBLOB NULL,
+ TEXT2_ LONGBLOB NULL,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_HI_DETAIL (
+ ID_ varchar(64) not null,
+ TYPE_ varchar(255) not null,
+ PROC_DEF_KEY_ varchar(255),
+ PROC_DEF_ID_ varchar(64),
+ PROC_INST_ID_ varchar(64),
+ EXECUTION_ID_ varchar(64),
+ CASE_DEF_KEY_ varchar(255),
+ CASE_DEF_ID_ varchar(64),
+ CASE_INST_ID_ varchar(64),
+ CASE_EXECUTION_ID_ varchar(64),
+ TASK_ID_ varchar(64),
+ ACT_INST_ID_ varchar(64),
+ VAR_INST_ID_ varchar(64),
+ NAME_ varchar(255) not null,
+ VAR_TYPE_ varchar(255),
+ REV_ integer,
+ TIME_ datetime(3) not null,
+ BYTEARRAY_ID_ varchar(64),
+ DOUBLE_ double,
+ LONG_ bigint,
+ TEXT_ LONGBLOB NULL,
+ TEXT2_ LONGBLOB NULL,
+ SEQUENCE_COUNTER_ bigint,
+ TENANT_ID_ varchar(64),
+ OPERATION_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_HI_IDENTITYLINK (
+ ID_ varchar(64) not null,
+ TIMESTAMP_ timestamp(3) not null,
+ TYPE_ varchar(255),
+ USER_ID_ varchar(255),
+ GROUP_ID_ varchar(255),
+ TASK_ID_ varchar(64),
+ PROC_DEF_ID_ varchar(64),
+ OPERATION_TYPE_ varchar(64),
+ ASSIGNER_ID_ varchar(64),
+ PROC_DEF_KEY_ varchar(255),
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_HI_COMMENT (
+ ID_ varchar(64) not null,
+ TYPE_ varchar(255),
+ TIME_ datetime(3) not null,
+ USER_ID_ varchar(255),
+ TASK_ID_ varchar(64),
+ PROC_INST_ID_ varchar(64),
+ ACTION_ varchar(255),
+ MESSAGE_ varchar(4000),
+ FULL_MSG_ LONGBLOB,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_HI_ATTACHMENT (
+ ID_ varchar(64) not null,
+ REV_ integer,
+ USER_ID_ varchar(255),
+ NAME_ varchar(255),
+ DESCRIPTION_ varchar(4000),
+ TYPE_ varchar(255),
+ TASK_ID_ varchar(64),
+ PROC_INST_ID_ varchar(64),
+ URL_ varchar(4000),
+ CONTENT_ID_ varchar(64),
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_HI_OP_LOG (
+ ID_ varchar(64) not null,
+ DEPLOYMENT_ID_ varchar(64),
+ PROC_DEF_ID_ varchar(64),
+ PROC_DEF_KEY_ varchar(255),
+ PROC_INST_ID_ varchar(64),
+ EXECUTION_ID_ varchar(64),
+ CASE_DEF_ID_ varchar(64),
+ CASE_INST_ID_ varchar(64),
+ CASE_EXECUTION_ID_ varchar(64),
+ TASK_ID_ varchar(64),
+ JOB_ID_ varchar(64),
+ JOB_DEF_ID_ varchar(64),
+ BATCH_ID_ varchar(64),
+ USER_ID_ varchar(255),
+ TIMESTAMP_ timestamp(3) not null,
+ OPERATION_TYPE_ varchar(64),
+ OPERATION_ID_ varchar(64),
+ ENTITY_TYPE_ varchar(30),
+ PROPERTY_ varchar(64),
+ ORG_VALUE_ varchar(4000),
+ NEW_VALUE_ varchar(4000),
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_HI_INCIDENT (
+ ID_ varchar(64) not null,
+ PROC_DEF_KEY_ varchar(255),
+ PROC_DEF_ID_ varchar(64),
+ PROC_INST_ID_ varchar(64),
+ EXECUTION_ID_ varchar(64),
+ CREATE_TIME_ timestamp(3) not null,
+ END_TIME_ timestamp(3) null,
+ INCIDENT_MSG_ varchar(4000),
+ INCIDENT_TYPE_ varchar(255) not null,
+ ACTIVITY_ID_ varchar(255),
+ CAUSE_INCIDENT_ID_ varchar(64),
+ ROOT_CAUSE_INCIDENT_ID_ varchar(64),
+ CONFIGURATION_ varchar(255),
+ INCIDENT_STATE_ integer,
+ TENANT_ID_ varchar(64),
+ JOB_DEF_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_HI_JOB_LOG (
+ ID_ varchar(64) not null,
+ TIMESTAMP_ timestamp(3) not null,
+ JOB_ID_ varchar(64) not null,
+ JOB_DUEDATE_ timestamp(3) NULL,
+ JOB_RETRIES_ integer,
+ JOB_PRIORITY_ bigint NOT NULL DEFAULT 0,
+ JOB_EXCEPTION_MSG_ varchar(4000),
+ JOB_EXCEPTION_STACK_ID_ varchar(64),
+ JOB_STATE_ integer,
+ JOB_DEF_ID_ varchar(64),
+ JOB_DEF_TYPE_ varchar(255),
+ JOB_DEF_CONFIGURATION_ varchar(255),
+ ACT_ID_ varchar(255),
+ EXECUTION_ID_ varchar(64),
+ PROCESS_INSTANCE_ID_ varchar(64),
+ PROCESS_DEF_ID_ varchar(64),
+ PROCESS_DEF_KEY_ varchar(255),
+ DEPLOYMENT_ID_ varchar(64),
+ SEQUENCE_COUNTER_ bigint,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_HI_BATCH (
+ ID_ varchar(64) not null,
+ TYPE_ varchar(255),
+ TOTAL_JOBS_ integer,
+ JOBS_PER_SEED_ integer,
+ INVOCATIONS_PER_JOB_ integer,
+ SEED_JOB_DEF_ID_ varchar(64),
+ MONITOR_JOB_DEF_ID_ varchar(64),
+ BATCH_JOB_DEF_ID_ varchar(64),
+ TENANT_ID_ varchar(64),
+ START_TIME_ datetime(3) not null,
+ END_TIME_ datetime(3),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_HI_EXT_TASK_LOG (
+ ID_ varchar(64) not null,
+ TIMESTAMP_ timestamp(3) not null,
+ EXT_TASK_ID_ varchar(64) not null,
+ RETRIES_ integer,
+ TOPIC_NAME_ varchar(255),
+ WORKER_ID_ varchar(255),
+ PRIORITY_ bigint NOT NULL DEFAULT 0,
+ ERROR_MSG_ varchar(4000),
+ ERROR_DETAILS_ID_ varchar(64),
+ ACT_ID_ varchar(255),
+ ACT_INST_ID_ varchar(64),
+ EXECUTION_ID_ varchar(64),
+ PROC_INST_ID_ varchar(64),
+ PROC_DEF_ID_ varchar(64),
+ PROC_DEF_KEY_ varchar(255),
+ TENANT_ID_ varchar(64),
+ STATE_ integer,
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create index ACT_IDX_HI_PRO_INST_END on ACT_HI_PROCINST(END_TIME_);
+create index ACT_IDX_HI_PRO_I_BUSKEY on ACT_HI_PROCINST(BUSINESS_KEY_);
+create index ACT_IDX_HI_PRO_INST_TENANT_ID on ACT_HI_PROCINST(TENANT_ID_);
+create index ACT_IDX_HI_PRO_INST_PROC_DEF_KEY on ACT_HI_PROCINST(PROC_DEF_KEY_);
+
+create index ACT_IDX_HI_ACT_INST_START on ACT_HI_ACTINST(START_TIME_);
+create index ACT_IDX_HI_ACT_INST_END on ACT_HI_ACTINST(END_TIME_);
+create index ACT_IDX_HI_ACT_INST_PROCINST on ACT_HI_ACTINST(PROC_INST_ID_, ACT_ID_);
+create index ACT_IDX_HI_ACT_INST_COMP on ACT_HI_ACTINST(EXECUTION_ID_, ACT_ID_, END_TIME_, ID_);
+create index ACT_IDX_HI_ACT_INST_STATS on ACT_HI_ACTINST(PROC_DEF_ID_, ACT_ID_, END_TIME_, ACT_INST_STATE_);
+create index ACT_IDX_HI_ACT_INST_TENANT_ID on ACT_HI_ACTINST(TENANT_ID_);
+create index ACT_IDX_HI_ACT_INST_PROC_DEF_KEY on ACT_HI_ACTINST(PROC_DEF_KEY_);
+
+create index ACT_IDX_HI_TASK_INST_TENANT_ID on ACT_HI_TASKINST(TENANT_ID_);
+create index ACT_IDX_HI_TASK_INST_PROC_DEF_KEY on ACT_HI_TASKINST(PROC_DEF_KEY_);
+
+create index ACT_IDX_HI_DETAIL_PROC_INST on ACT_HI_DETAIL(PROC_INST_ID_);
+create index ACT_IDX_HI_DETAIL_ACT_INST on ACT_HI_DETAIL(ACT_INST_ID_);
+create index ACT_IDX_HI_DETAIL_CASE_INST on ACT_HI_DETAIL(CASE_INST_ID_);
+create index ACT_IDX_HI_DETAIL_CASE_EXEC on ACT_HI_DETAIL(CASE_EXECUTION_ID_);
+create index ACT_IDX_HI_DETAIL_TIME on ACT_HI_DETAIL(TIME_);
+create index ACT_IDX_HI_DETAIL_NAME on ACT_HI_DETAIL(NAME_);
+create index ACT_IDX_HI_DETAIL_TASK_ID on ACT_HI_DETAIL(TASK_ID_);
+create index ACT_IDX_HI_DETAIL_TENANT_ID on ACT_HI_DETAIL(TENANT_ID_);
+create index ACT_IDX_HI_DETAIL_PROC_DEF_KEY on ACT_HI_DETAIL(PROC_DEF_KEY_);
+
+create index ACT_IDX_HI_IDENT_LNK_USER on ACT_HI_IDENTITYLINK(USER_ID_);
+create index ACT_IDX_HI_IDENT_LNK_GROUP on ACT_HI_IDENTITYLINK(GROUP_ID_);
+create index ACT_IDX_HI_IDENT_LNK_TENANT_ID on ACT_HI_IDENTITYLINK(TENANT_ID_);
+create index ACT_IDX_HI_IDENT_LNK_PROC_DEF_KEY on ACT_HI_IDENTITYLINK(PROC_DEF_KEY_);
+
+create index ACT_IDX_HI_PROCVAR_PROC_INST on ACT_HI_VARINST(PROC_INST_ID_);
+create index ACT_IDX_HI_PROCVAR_NAME_TYPE on ACT_HI_VARINST(NAME_, VAR_TYPE_);
+create index ACT_IDX_HI_CASEVAR_CASE_INST on ACT_HI_VARINST(CASE_INST_ID_);
+create index ACT_IDX_HI_VAR_INST_TENANT_ID on ACT_HI_VARINST(TENANT_ID_);
+create index ACT_IDX_HI_VAR_INST_PROC_DEF_KEY on ACT_HI_VARINST(PROC_DEF_KEY_);
+
+create index ACT_IDX_HI_INCIDENT_TENANT_ID on ACT_HI_INCIDENT(TENANT_ID_);
+create index ACT_IDX_HI_INCIDENT_PROC_DEF_KEY on ACT_HI_INCIDENT(PROC_DEF_KEY_);
+
+create index ACT_IDX_HI_JOB_LOG_PROCINST on ACT_HI_JOB_LOG(PROCESS_INSTANCE_ID_);
+create index ACT_IDX_HI_JOB_LOG_PROCDEF on ACT_HI_JOB_LOG(PROCESS_DEF_ID_);
+create index ACT_IDX_HI_JOB_LOG_TENANT_ID on ACT_HI_JOB_LOG(TENANT_ID_);
+create index ACT_IDX_HI_JOB_LOG_JOB_DEF_ID on ACT_HI_JOB_LOG(JOB_DEF_ID_);
+create index ACT_IDX_HI_JOB_LOG_PROC_DEF_KEY on ACT_HI_JOB_LOG(PROCESS_DEF_KEY_);
+
+create index ACT_HI_EXT_TASK_LOG_PROCINST on ACT_HI_EXT_TASK_LOG(PROC_INST_ID_);
+create index ACT_HI_EXT_TASK_LOG_PROCDEF on ACT_HI_EXT_TASK_LOG(PROC_DEF_ID_);
+create index ACT_HI_EXT_TASK_LOG_PROC_DEF_KEY on ACT_HI_EXT_TASK_LOG(PROC_DEF_KEY_);
+create index ACT_HI_EXT_TASK_LOG_TENANT_ID on ACT_HI_EXT_TASK_LOG(TENANT_ID_);
+
+create index ACT_IDX_HI_OP_LOG_PROCINST on ACT_HI_OP_LOG(PROC_INST_ID_);
+create index ACT_IDX_HI_OP_LOG_PROCDEF on ACT_HI_OP_LOG(PROC_DEF_ID_);
+create table ACT_HI_CASEINST (
+ ID_ varchar(64) not null,
+ CASE_INST_ID_ varchar(64) not null,
+ BUSINESS_KEY_ varchar(255),
+ CASE_DEF_ID_ varchar(64) not null,
+ CREATE_TIME_ datetime(3) not null,
+ CLOSE_TIME_ datetime(3),
+ DURATION_ bigint,
+ STATE_ integer,
+ CREATE_USER_ID_ varchar(255),
+ SUPER_CASE_INSTANCE_ID_ varchar(64),
+ SUPER_PROCESS_INSTANCE_ID_ varchar(64),
+ TENANT_ID_ varchar(64),
+ primary key (ID_),
+ unique (CASE_INST_ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_HI_CASEACTINST (
+ ID_ varchar(64) not null,
+ PARENT_ACT_INST_ID_ varchar(64),
+ CASE_DEF_ID_ varchar(64) not null,
+ CASE_INST_ID_ varchar(64) not null,
+ CASE_ACT_ID_ varchar(255) not null,
+ TASK_ID_ varchar(64),
+ CALL_PROC_INST_ID_ varchar(64),
+ CALL_CASE_INST_ID_ varchar(64),
+ CASE_ACT_NAME_ varchar(255),
+ CASE_ACT_TYPE_ varchar(255),
+ CREATE_TIME_ datetime(3) not null,
+ END_TIME_ datetime(3),
+ DURATION_ bigint,
+ STATE_ integer,
+ REQUIRED_ boolean,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create index ACT_IDX_HI_CAS_I_CLOSE on ACT_HI_CASEINST(CLOSE_TIME_);
+create index ACT_IDX_HI_CAS_I_BUSKEY on ACT_HI_CASEINST(BUSINESS_KEY_);
+create index ACT_IDX_HI_CAS_I_TENANT_ID on ACT_HI_CASEINST(TENANT_ID_);
+create index ACT_IDX_HI_CAS_A_I_CREATE on ACT_HI_CASEACTINST(CREATE_TIME_);
+create index ACT_IDX_HI_CAS_A_I_END on ACT_HI_CASEACTINST(END_TIME_);
+create index ACT_IDX_HI_CAS_A_I_COMP on ACT_HI_CASEACTINST(CASE_ACT_ID_, END_TIME_, ID_);
+create index ACT_IDX_HI_CAS_A_I_CASEINST on ACT_HI_CASEACTINST(CASE_INST_ID_, CASE_ACT_ID_);
+create index ACT_IDX_HI_CAS_A_I_TENANT_ID on ACT_HI_CASEACTINST(TENANT_ID_);
+-- create history decision instance table --
+create table ACT_HI_DECINST (
+ ID_ varchar(64) NOT NULL,
+ DEC_DEF_ID_ varchar(64) NOT NULL,
+ DEC_DEF_KEY_ varchar(255) NOT NULL,
+ DEC_DEF_NAME_ varchar(255),
+ PROC_DEF_KEY_ varchar(255),
+ PROC_DEF_ID_ varchar(64),
+ PROC_INST_ID_ varchar(64),
+ CASE_DEF_KEY_ varchar(255),
+ CASE_DEF_ID_ varchar(64),
+ CASE_INST_ID_ varchar(64),
+ ACT_INST_ID_ varchar(64),
+ ACT_ID_ varchar(255),
+ EVAL_TIME_ datetime(3) not null,
+ COLLECT_VALUE_ double,
+ USER_ID_ varchar(255),
+ ROOT_DEC_INST_ID_ varchar(64),
+ DEC_REQ_ID_ varchar(64),
+ DEC_REQ_KEY_ varchar(255),
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+-- create history decision input table --
+create table ACT_HI_DEC_IN (
+ ID_ varchar(64) NOT NULL,
+ DEC_INST_ID_ varchar(64) NOT NULL,
+ CLAUSE_ID_ varchar(64),
+ CLAUSE_NAME_ varchar(255),
+ VAR_TYPE_ varchar(100),
+ BYTEARRAY_ID_ varchar(64),
+ DOUBLE_ double,
+ LONG_ bigint,
+ TEXT_ LONGBLOB NULL,
+ TEXT2_ LONGBLOB NULL,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+-- create history decision output table --
+create table ACT_HI_DEC_OUT (
+ ID_ varchar(64) NOT NULL,
+ DEC_INST_ID_ varchar(64) NOT NULL,
+ CLAUSE_ID_ varchar(64),
+ CLAUSE_NAME_ varchar(255),
+ RULE_ID_ varchar(64),
+ RULE_ORDER_ integer,
+ VAR_NAME_ varchar(255),
+ VAR_TYPE_ varchar(100),
+ BYTEARRAY_ID_ varchar(64),
+ DOUBLE_ double,
+ LONG_ bigint,
+ TEXT_ LONGBLOB NULL,
+ TEXT2_ LONGBLOB NULL,
+ TENANT_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+
+create index ACT_IDX_HI_DEC_INST_ID on ACT_HI_DECINST(DEC_DEF_ID_);
+create index ACT_IDX_HI_DEC_INST_KEY on ACT_HI_DECINST(DEC_DEF_KEY_);
+create index ACT_IDX_HI_DEC_INST_PI on ACT_HI_DECINST(PROC_INST_ID_);
+create index ACT_IDX_HI_DEC_INST_CI on ACT_HI_DECINST(CASE_INST_ID_);
+create index ACT_IDX_HI_DEC_INST_ACT on ACT_HI_DECINST(ACT_ID_);
+create index ACT_IDX_HI_DEC_INST_ACT_INST on ACT_HI_DECINST(ACT_INST_ID_);
+create index ACT_IDX_HI_DEC_INST_TIME on ACT_HI_DECINST(EVAL_TIME_);
+create index ACT_IDX_HI_DEC_INST_TENANT_ID on ACT_HI_DECINST(TENANT_ID_);
+create index ACT_IDX_HI_DEC_INST_ROOT_ID on ACT_HI_DECINST(ROOT_DEC_INST_ID_);
+create index ACT_IDX_HI_DEC_INST_REQ_ID on ACT_HI_DECINST(DEC_REQ_ID_);
+create index ACT_IDX_HI_DEC_INST_REQ_KEY on ACT_HI_DECINST(DEC_REQ_KEY_);
+
+
+create index ACT_IDX_HI_DEC_IN_INST on ACT_HI_DEC_IN(DEC_INST_ID_);
+create index ACT_IDX_HI_DEC_IN_CLAUSE on ACT_HI_DEC_IN(DEC_INST_ID_, CLAUSE_ID_);
+
+create index ACT_IDX_HI_DEC_OUT_INST on ACT_HI_DEC_OUT(DEC_INST_ID_);
+create index ACT_IDX_HI_DEC_OUT_RULE on ACT_HI_DEC_OUT(RULE_ORDER_, CLAUSE_ID_);
+
+
+-- mariadb identity:
+
+create table ACT_ID_GROUP (
+ ID_ varchar(64),
+ REV_ integer,
+ NAME_ varchar(255),
+ TYPE_ varchar(255),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_ID_MEMBERSHIP (
+ USER_ID_ varchar(64),
+ GROUP_ID_ varchar(64),
+ primary key (USER_ID_, GROUP_ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_ID_USER (
+ ID_ varchar(64),
+ REV_ integer,
+ FIRST_ varchar(255),
+ LAST_ varchar(255),
+ EMAIL_ varchar(255),
+ PWD_ varchar(255),
+ SALT_ varchar(255),
+ PICTURE_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_ID_INFO (
+ ID_ varchar(64),
+ REV_ integer,
+ USER_ID_ varchar(64),
+ TYPE_ varchar(64),
+ KEY_ varchar(255),
+ VALUE_ varchar(255),
+ PASSWORD_ LONGBLOB,
+ PARENT_ID_ varchar(255),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_ID_TENANT (
+ ID_ varchar(64),
+ REV_ integer,
+ NAME_ varchar(255),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+create table ACT_ID_TENANT_MEMBER (
+ ID_ varchar(64) not null,
+ TENANT_ID_ varchar(64) not null,
+ USER_ID_ varchar(64),
+ GROUP_ID_ varchar(64),
+ primary key (ID_)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
+
+alter table ACT_ID_MEMBERSHIP
+ add constraint ACT_FK_MEMB_GROUP
+ foreign key (GROUP_ID_)
+ references ACT_ID_GROUP (ID_);
+
+alter table ACT_ID_MEMBERSHIP
+ add constraint ACT_FK_MEMB_USER
+ foreign key (USER_ID_)
+ references ACT_ID_USER (ID_);
+
+alter table ACT_ID_TENANT_MEMBER
+ add constraint ACT_UNIQ_TENANT_MEMB_USER
+ unique (TENANT_ID_, USER_ID_);
+
+alter table ACT_ID_TENANT_MEMBER
+ add constraint ACT_UNIQ_TENANT_MEMB_GROUP
+ unique (TENANT_ID_, GROUP_ID_);
+
+alter table ACT_ID_TENANT_MEMBER
+ add constraint ACT_FK_TENANT_MEMB
+ foreign key (TENANT_ID_)
+ references ACT_ID_TENANT (ID_);
+
+alter table ACT_ID_TENANT_MEMBER
+ add constraint ACT_FK_TENANT_MEMB_USER
+ foreign key (USER_ID_)
+ references ACT_ID_USER (ID_);
+
+alter table ACT_ID_TENANT_MEMBER
+ add constraint ACT_FK_TENANT_MEMB_GROUP
+ foreign key (GROUP_ID_)
+ references ACT_ID_GROUP (ID_);
+
diff --git a/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/camunda/mysql_create_camunda_admin.sql b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/camunda/mysql_create_camunda_admin.sql
new file mode 100644
index 00000000..3658c6c2
--- /dev/null
+++ b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/camunda/mysql_create_camunda_admin.sql
@@ -0,0 +1,25 @@
+USE camundabpmn;
+
+INSERT INTO `act_id_group` (`ID_`, `REV_`, `NAME_`, `TYPE_`) VALUES ('camunda-admin',1,'camunda BPM Administrators','SYSTEM');
+
+INSERT INTO `act_id_user` (`ID_`, `REV_`, `FIRST_`, `LAST_`, `EMAIL_`, `PWD_`, `SALT_`, `PICTURE_ID_`) VALUES ('admin',1,'admin','user','camundaadmin@onap.org','{SHA-512}n5jUw7fvXM9sZBcrIkLiAOCqiPHutaqEkbg6IQVQdylVP1im8SczBJf4f2xL7cvWwIAZjkcSSQzgFTsdaJSEiA==','ftTn4gNgMcq07wdSD0lEJQ==',NULL);
+
+INSERT INTO `act_id_membership` (`USER_ID_`, `GROUP_ID_`) VALUES ('admin','camunda-admin');
+
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49b0e028-a3c6-11e7-b0ec-0242ac120003',1,1,NULL,'admin',1,'admin',2147483647);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49b525e9-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,2,'camunda-admin',2);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49b8814a-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,0,'*',2147483647);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49baa42b-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,1,'*',2147483647);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49bd8a5c-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,2,'*',2147483647);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49bfd44d-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,3,'*',2147483647);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49c1f72e-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,4,'*',2147483647);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49c41a0f-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,5,'*',2147483647);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49c77570-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,6,'*',2147483647);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49ca5ba1-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,7,'*',2147483647);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49cca592-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,8,'*',2147483647);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49ceef83-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,9,'*',2147483647);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49d11264-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,10,'*',2147483647);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49d38365-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,11,'*',2147483647);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49d5a646-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,12,'*',2147483647);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49d83e57-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,13,'*',2147483647);
+INSERT INTO `act_ru_authorization` (`ID_`, `REV_`, `TYPE_`, `GROUP_ID_`, `USER_ID_`, `RESOURCE_TYPE_`, `RESOURCE_ID_`, `PERMS_`) VALUES ('49da3a28-a3c6-11e7-b0ec-0242ac120003',1,1,'camunda-admin',NULL,14,'*',2147483647);
diff --git a/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/main-schemas/MySQL-Catalog-schema.sql b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/main-schemas/MySQL-Catalog-schema.sql
new file mode 100644
index 00000000..ca002fbe
--- /dev/null
+++ b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/main-schemas/MySQL-Catalog-schema.sql
@@ -0,0 +1,462 @@
+
+ alter table HEAT_TEMPLATE_PARAMS
+ drop
+ foreign key FK_p3ol1xcvp831glqohrlu6o07o;
+
+ alter table MODEL_RECIPE
+ drop
+ foreign key FK_c23r0puyqug6n44jg39dutm1c;
+
+ alter table SERVICE
+ drop
+ foreign key FK_l3qy594u2xr1tfpmma3uigsna;
+
+ alter table SERVICE_RECIPE
+ drop
+ foreign key FK_i3r1b8j6e7dg9hkp49evnnm5y;
+
+ alter table SERVICE_TO_RESOURCE_CUSTOMIZATIONS
+ drop
+ foreign key FK_kiddaay6cfe0aob1f1jaio1bb;
+
+ alter table VF_MODULE
+ drop
+ foreign key FK_12jptc9it7gs3pru08skobxxc;
+
+ alter table VNF_RESOURCE_CUSTOMIZATION
+ drop
+ foreign key FK_iff1ayhb1hrp5jhea3vvikuni;
+
+ drop table if exists ALLOTTED_RESOURCE;
+
+ drop table if exists ALLOTTED_RESOURCE_CUSTOMIZATION;
+
+ drop table if exists HEAT_ENVIRONMENT;
+
+ drop table if exists HEAT_FILES;
+
+ drop table if exists HEAT_NESTED_TEMPLATE;
+
+ drop table if exists HEAT_TEMPLATE;
+
+ drop table if exists HEAT_TEMPLATE_PARAMS;
+
+ drop table if exists MODEL;
+
+ drop table if exists MODEL_RECIPE;
+
+ drop table if exists NETWORK_RECIPE;
+
+ drop table if exists NETWORK_RESOURCE;
+
+ drop table if exists NETWORK_RESOURCE_CUSTOMIZATION;
+
+ drop table if exists SERVICE;
+
+ drop table if exists SERVICE_RECIPE;
+
+ drop table if exists SERVICE_TO_ALLOTTED_RESOURCES;
+
+ drop table if exists SERVICE_TO_NETWORKS;
+
+ drop table if exists SERVICE_TO_RESOURCE_CUSTOMIZATIONS;
+
+ drop table if exists TEMP_NETWORK_HEAT_TEMPLATE_LOOKUP;
+
+ drop table if exists TOSCA_CSAR;
+
+ drop table if exists VF_MODULE;
+
+ drop table if exists VF_MODULE_CUSTOMIZATION;
+
+ drop table if exists VF_MODULE_TO_HEAT_FILES;
+
+ drop table if exists VNF_COMPONENTS;
+
+ drop table if exists VNF_COMPONENTS_RECIPE;
+
+ drop table if exists VNF_RECIPE;
+
+ drop table if exists VNF_RESOURCE;
+
+ drop table if exists VNF_RESOURCE_CUSTOMIZATION;
+
+ drop table if exists VNF_RES_CUSTOM_TO_VF_MODULE_CUSTOM;
+
+ create table ALLOTTED_RESOURCE (
+ MODEL_UUID varchar(255) not null,
+ MODEL_INVARIANT_UUID varchar(255),
+ MODEL_VERSION varchar(255),
+ MODEL_NAME varchar(255),
+ TOSCA_NODE_TYPE varchar(255),
+ SUBCATEGORY varchar(255),
+ DESCRIPTION varchar(255),
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (MODEL_UUID)
+ );
+
+ create table ALLOTTED_RESOURCE_CUSTOMIZATION (
+ MODEL_CUSTOMIZATION_UUID varchar(200) not null,
+ MODEL_INSTANCE_NAME varchar(255),
+ AR_MODEL_UUID varchar(255),
+ PROVIDING_SERVICE_MODEL_INVARIANT_UUID varchar(255),
+ TARGET_NETWORK_ROLE varchar(255),
+ NF_FUNCTION varchar(255),
+ NF_TYPE varchar(255),
+ NF_ROLE varchar(255),
+ NF_NAMING_CODE varchar(255),
+ MIN_INSTANCES integer,
+ MAX_INSTANCES integer,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (MODEL_CUSTOMIZATION_UUID)
+ );
+
+ create table HEAT_ENVIRONMENT (
+ ARTIFACT_UUID varchar(200) not null,
+ NAME varchar(100) not null,
+ VERSION varchar(20) not null,
+ DESCRIPTION varchar(1200),
+ BODY longtext not null,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ ARTIFACT_CHECKSUM varchar(200) default 'MANUAL RECORD',
+ primary key (ARTIFACT_UUID)
+ );
+
+ create table HEAT_FILES (
+ ARTIFACT_UUID varchar(255) not null,
+ DESCRIPTION varchar(255),
+ NAME varchar(255),
+ VERSION varchar(255),
+ BODY longtext,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ ARTIFACT_CHECKSUM varchar(255),
+ primary key (ARTIFACT_UUID)
+ );
+
+ create table HEAT_NESTED_TEMPLATE (
+ PARENT_HEAT_TEMPLATE_UUID varchar(200) not null,
+ CHILD_HEAT_TEMPLATE_UUID varchar(200) not null,
+ PROVIDER_RESOURCE_FILE varchar(100),
+ primary key (PARENT_HEAT_TEMPLATE_UUID, CHILD_HEAT_TEMPLATE_UUID)
+ );
+
+ create table HEAT_TEMPLATE (
+ ARTIFACT_UUID varchar(200) not null,
+ NAME varchar(200) not null,
+ VERSION varchar(20) not null,
+ BODY longtext not null,
+ TIMEOUT_MINUTES integer,
+ DESCRIPTION varchar(1200),
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ ARTIFACT_CHECKSUM varchar(200) default 'MANUAL RECORD' not null,
+ primary key (ARTIFACT_UUID)
+ );
+
+ create table HEAT_TEMPLATE_PARAMS (
+ HEAT_TEMPLATE_ARTIFACT_UUID varchar(255) not null,
+ PARAM_NAME varchar(255) not null,
+ IS_REQUIRED bit not null,
+ PARAM_TYPE varchar(20),
+ PARAM_ALIAS varchar(45),
+ primary key (HEAT_TEMPLATE_ARTIFACT_UUID, PARAM_NAME)
+ );
+
+ create table MODEL (
+ id integer not null auto_increment,
+ MODEL_TYPE varchar(20) not null,
+ MODEL_VERSION_ID varchar(40) not null,
+ MODEL_INVARIANT_ID varchar(40),
+ MODEL_NAME varchar(40) not null,
+ MODEL_VERSION varchar(20),
+ MODEL_CUSTOMIZATION_ID varchar(40),
+ MODEL_CUSTOMIZATION_NAME varchar(40),
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (id)
+ );
+
+ create table MODEL_RECIPE (
+ id integer not null auto_increment,
+ MODEL_ID integer not null,
+ ACTION varchar(20) not null,
+ SCHEMA_VERSION varchar(20),
+ DESCRIPTION varchar(1200),
+ ORCHESTRATION_URI varchar(256) not null,
+ MODEL_PARAM_XSD varchar(2048),
+ RECIPE_TIMEOUT integer,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (id)
+ );
+
+ create table NETWORK_RECIPE (
+ id integer not null auto_increment,
+ MODEL_NAME varchar(20) not null,
+ ACTION varchar(20) not null,
+ VERSION_STR varchar(20) not null,
+ SERVICE_TYPE varchar(45),
+ DESCRIPTION varchar(1200),
+ ORCHESTRATION_URI varchar(256) not null,
+ NETWORK_PARAM_XSD varchar(2048),
+ RECIPE_TIMEOUT integer,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (id)
+ );
+
+ create table NETWORK_RESOURCE (
+ MODEL_UUID varchar(200) not null,
+ MODEL_NAME varchar(200) not null,
+ MODEL_INVARIANT_UUID varchar(200),
+ MODEL_VERSION varchar(20),
+ TOSCA_NODE_TYPE varchar(200),
+ NEUTRON_NETWORK_TYPE varchar(20),
+ DESCRIPTION varchar(1200),
+ ORCHESTRATION_MODE varchar(20),
+ HEAT_TEMPLATE_ARTIFACT_UUID varchar(200) not null,
+ AIC_VERSION_MIN varchar(20) default 2.5 not null,
+ AIC_VERSION_MAX varchar(20) default 2.5,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (MODEL_UUID)
+ );
+
+ create table NETWORK_RESOURCE_CUSTOMIZATION (
+ MODEL_CUSTOMIZATION_UUID varchar(200) not null,
+ NETWORK_RESOURCE_MODEL_UUID varchar(200) not null,
+ MODEL_INSTANCE_NAME varchar(255),
+ NETWORK_TECHNOLOGY varchar(255),
+ NETWORK_TYPE varchar(255),
+ NETWORK_SCOPE varchar(255),
+ NETWORK_ROLE varchar(255),
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (MODEL_CUSTOMIZATION_UUID)
+ );
+
+ create table SERVICE (
+ MODEL_UUID varchar(200) not null,
+ MODEL_NAME varchar(200) not null,
+ MODEL_VERSION varchar(20) not null,
+ DESCRIPTION varchar(1200),
+ TOSCA_CSAR_ARTIFACT_UUID varchar(200),
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ MODEL_INVARIANT_UUID varchar(200) default 'MANUAL_RECORD' not null,
+ SERVICE_TYPE varchar(20),
+ SERVICE_ROLE varchar(20),
+ primary key (MODEL_UUID)
+ );
+
+ create table SERVICE_RECIPE (
+ id integer not null auto_increment,
+ SERVICE_MODEL_UUID varchar(200) not null,
+ ACTION varchar(40) not null,
+ ORCHESTRATION_URI varchar(256) not null,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ VERSION_STR varchar(20),
+ DESCRIPTION varchar(1200),
+ SERVICE_PARAM_XSD varchar(2048),
+ RECIPE_TIMEOUT integer,
+ SERVICE_TIMEOUT_INTERIM integer,
+ primary key (id)
+ );
+
+ create table SERVICE_TO_ALLOTTED_RESOURCES (
+ SERVICE_MODEL_UUID varchar(200) not null,
+ AR_MODEL_CUSTOMIZATION_UUID varchar(200) not null,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (SERVICE_MODEL_UUID, AR_MODEL_CUSTOMIZATION_UUID)
+ );
+
+ create table SERVICE_TO_NETWORKS (
+ SERVICE_MODEL_UUID varchar(200) not null,
+ NETWORK_MODEL_CUSTOMIZATION_UUID varchar(200) not null,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (SERVICE_MODEL_UUID, NETWORK_MODEL_CUSTOMIZATION_UUID)
+ );
+
+ create table SERVICE_TO_RESOURCE_CUSTOMIZATIONS (
+ MODEL_TYPE varchar(20) not null,
+ RESOURCE_MODEL_CUSTOMIZATION_UUID varchar(200) not null,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ SERVICE_MODEL_UUID varchar(200) not null,
+ primary key (MODEL_TYPE, RESOURCE_MODEL_CUSTOMIZATION_UUID)
+ );
+
+ create table TEMP_NETWORK_HEAT_TEMPLATE_LOOKUP (
+ NETWORK_RESOURCE_MODEL_NAME varchar(200) not null,
+ HEAT_TEMPLATE_ARTIFACT_UUID varchar(200) not null,
+ AIC_VERSION_MIN varchar(20) not null,
+ AIC_VERSION_MAX varchar(20),
+ primary key (NETWORK_RESOURCE_MODEL_NAME)
+ );
+
+ create table TOSCA_CSAR (
+ ARTIFACT_UUID varchar(200) not null,
+ NAME varchar(200) not null,
+ VERSION varchar(20) not null,
+ ARTIFACT_CHECKSUM varchar(200) not null,
+ URL varchar(200) not null,
+ DESCRIPTION varchar(1200),
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (ARTIFACT_UUID)
+ );
+
+ create table VF_MODULE (
+ MODEL_UUID varchar(200) not null,
+ VNF_RESOURCE_MODEL_UUID varchar(200),
+ MODEL_INVARIANT_UUID varchar(200),
+ MODEL_VERSION varchar(20) not null,
+ MODEL_NAME varchar(200) not null,
+ DESCRIPTION varchar(1200),
+ IS_BASE integer not null,
+ HEAT_TEMPLATE_ARTIFACT_UUID varchar(200) not null,
+ VOL_HEAT_TEMPLATE_ARTIFACT_UUID varchar(200),
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (MODEL_UUID)
+ );
+
+ create table VF_MODULE_CUSTOMIZATION (
+ MODEL_CUSTOMIZATION_UUID varchar(200) not null,
+ VF_MODULE_MODEL_UUID varchar(200) not null,
+ VOL_ENVIRONMENT_ARTIFACT_UUID varchar(200),
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ HEAT_ENVIRONMENT_ARTIFACT_UUID varchar(200),
+ MIN_INSTANCES integer,
+ MAX_INSTANCES integer,
+ INITIAL_COUNT integer,
+ AVAILABILITY_ZONE_COUNT integer,
+ LABEL varchar(200),
+ primary key (MODEL_CUSTOMIZATION_UUID)
+ );
+
+ create table VF_MODULE_TO_HEAT_FILES (
+ VF_MODULE_MODEL_UUID varchar(200) not null,
+ HEAT_FILES_ARTIFACT_UUID varchar(200) not null,
+ primary key (VF_MODULE_MODEL_UUID, HEAT_FILES_ARTIFACT_UUID)
+ );
+
+ create table VNF_COMPONENTS (
+ VNF_ID integer not null,
+ COMPONENT_TYPE varchar(20) not null,
+ HEAT_TEMPLATE_ID integer,
+ HEAT_ENVIRONMENT_ID integer,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (VNF_ID, COMPONENT_TYPE)
+ );
+
+ create table VNF_COMPONENTS_RECIPE (
+ id integer not null auto_increment,
+ VNF_TYPE varchar(200),
+ VF_MODULE_MODEL_UUID varchar(100),
+ VNF_COMPONENT_TYPE varchar(45) not null,
+ ACTION varchar(20) not null,
+ SERVICE_TYPE varchar(45),
+ VERSION varchar(20),
+ DESCRIPTION varchar(1200),
+ ORCHESTRATION_URI varchar(256) not null,
+ VNF_COMPONENT_PARAM_XSD varchar(2048),
+ RECIPE_TIMEOUT integer,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (id)
+ );
+
+ create table VNF_RECIPE (
+ id integer not null auto_increment,
+ VF_MODULE_ID varchar(100),
+ ACTION varchar(20) not null,
+ VERSION_STR varchar(20) not null,
+ VNF_TYPE varchar(200),
+ SERVICE_TYPE varchar(45) default null,
+ DESCRIPTION varchar(1200),
+ ORCHESTRATION_URI varchar(256) not null,
+ VNF_PARAM_XSD varchar(2048),
+ RECIPE_TIMEOUT integer,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (id)
+ );
+
+ create table VNF_RESOURCE (
+ MODEL_UUID varchar(200) not null,
+ MODEL_INVARIANT_UUID varchar(200),
+ MODEL_VERSION varchar(20) not null,
+ MODEL_NAME varchar(200),
+ TOSCA_NODE_TYPE varchar(200),
+ DESCRIPTION varchar(1200),
+ ORCHESTRATION_MODE varchar(20) not null,
+ AIC_VERSION_MIN varchar(20),
+ AIC_VERSION_MAX varchar(20),
+ HEAT_TEMPLATE_ARTIFACT_UUID varchar(200),
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (MODEL_UUID)
+ );
+
+ create table VNF_RESOURCE_CUSTOMIZATION (
+ MODEL_CUSTOMIZATION_UUID varchar(200) not null,
+ MODEL_INSTANCE_NAME varchar(200) not null,
+ MIN_INSTANCES integer,
+ MAX_INSTANCES integer,
+ AVAILABILITY_ZONE_MAX_COUNT integer,
+ NF_FUNCTION varchar(200),
+ NF_TYPE varchar(200),
+ NF_ROLE varchar(200),
+ NF_NAMING_CODE varchar(200),
+ VNF_RESOURCE_MODEL_UUID varchar(200) not null,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (MODEL_CUSTOMIZATION_UUID)
+ );
+
+ create table VNF_RES_CUSTOM_TO_VF_MODULE_CUSTOM (
+ VNF_RESOURCE_CUST_MODEL_CUSTOMIZATION_UUID varchar(200) not null,
+ VF_MODULE_CUST_MODEL_CUSTOMIZATION_UUID varchar(200) not null,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (VNF_RESOURCE_CUST_MODEL_CUSTOMIZATION_UUID, VF_MODULE_CUST_MODEL_CUSTOMIZATION_UUID)
+ );
+
+ alter table MODEL
+ add constraint UK_rra00f1rk6eyy7g00k9raxh2v unique (MODEL_TYPE, MODEL_VERSION_ID);
+
+ alter table MODEL_RECIPE
+ add constraint UK_b4g8j9wtqrkxfycyi3ursk7gb unique (MODEL_ID, ACTION);
+
+ alter table NETWORK_RECIPE
+ add constraint UK_pbsa8i44m8p10f9529jdgfuk9 unique (MODEL_NAME, ACTION, VERSION_STR);
+
+ alter table SERVICE_RECIPE
+ add constraint UK_2lr377dpqnvl5aqlp5dtj2fcp unique (SERVICE_MODEL_UUID, ACTION);
+
+ alter table VNF_COMPONENTS_RECIPE
+ add constraint UK_g3je95aaxxiuest25f0qoy2u8 unique (VNF_TYPE, VF_MODULE_MODEL_UUID, VNF_COMPONENT_TYPE, ACTION, SERVICE_TYPE, VERSION);
+
+ alter table VNF_RECIPE
+ add constraint UK_f3tvqau498vrifq3cr8qnigkr unique (VF_MODULE_ID, ACTION, VERSION_STR);
+
+ alter table HEAT_TEMPLATE_PARAMS
+ add constraint FK_p3ol1xcvp831glqohrlu6o07o
+ foreign key (HEAT_TEMPLATE_ARTIFACT_UUID)
+ references HEAT_TEMPLATE (ARTIFACT_UUID);
+
+ alter table MODEL_RECIPE
+ add constraint FK_c23r0puyqug6n44jg39dutm1c
+ foreign key (MODEL_ID)
+ references MODEL (id);
+
+ alter table SERVICE
+ add constraint FK_l3qy594u2xr1tfpmma3uigsna
+ foreign key (TOSCA_CSAR_ARTIFACT_UUID)
+ references TOSCA_CSAR (ARTIFACT_UUID);
+
+ alter table SERVICE_RECIPE
+ add constraint FK_i3r1b8j6e7dg9hkp49evnnm5y
+ foreign key (SERVICE_MODEL_UUID)
+ references SERVICE (MODEL_UUID);
+
+ alter table SERVICE_TO_RESOURCE_CUSTOMIZATIONS
+ add constraint FK_kiddaay6cfe0aob1f1jaio1bb
+ foreign key (SERVICE_MODEL_UUID)
+ references SERVICE (MODEL_UUID);
+
+ alter table VF_MODULE
+ add constraint FK_12jptc9it7gs3pru08skobxxc
+ foreign key (VNF_RESOURCE_MODEL_UUID)
+ references VNF_RESOURCE (MODEL_UUID);
+
+ alter table VNF_RESOURCE_CUSTOMIZATION
+ add constraint FK_iff1ayhb1hrp5jhea3vvikuni
+ foreign key (VNF_RESOURCE_MODEL_UUID)
+ references VNF_RESOURCE (MODEL_UUID);
diff --git a/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/main-schemas/MySQL-Requests-schema.sql b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/main-schemas/MySQL-Requests-schema.sql
new file mode 100644
index 00000000..f64548e2
--- /dev/null
+++ b/scripts/so/mariadb/docker-entrypoint-initdb.d/db-sql-scripts/main-schemas/MySQL-Requests-schema.sql
@@ -0,0 +1,84 @@
+
+ drop table if exists INFRA_ACTIVE_REQUESTS;
+
+ drop table if exists SITE_STATUS;
+
+ create table INFRA_ACTIVE_REQUESTS (
+ REQUEST_ID varchar(45) not null,
+ CLIENT_REQUEST_ID varchar(45),
+ ACTION varchar(45) not null,
+ REQUEST_STATUS varchar(20),
+ STATUS_MESSAGE varchar(2000),
+ PROGRESS bigint,
+ START_TIME datetime,
+ END_TIME datetime,
+ SOURCE varchar(45),
+ VNF_ID varchar(45),
+ VNF_NAME varchar(80),
+ VNF_TYPE varchar(200),
+ SERVICE_TYPE varchar(45),
+ AIC_NODE_CLLI varchar(11),
+ TENANT_ID varchar(45),
+ PROV_STATUS varchar(20),
+ VNF_PARAMS longtext,
+ VNF_OUTPUTS longtext,
+ REQUEST_BODY longtext,
+ RESPONSE_BODY longtext,
+ LAST_MODIFIED_BY varchar(50),
+ MODIFY_TIME datetime,
+ REQUEST_TYPE varchar(20),
+ VOLUME_GROUP_ID varchar(45),
+ VOLUME_GROUP_NAME varchar(45),
+ VF_MODULE_ID varchar(45),
+ VF_MODULE_NAME varchar(200),
+ VF_MODULE_MODEL_NAME varchar(200),
+ AAI_SERVICE_ID varchar(50),
+ AIC_CLOUD_REGION varchar(11),
+ CALLBACK_URL varchar(200),
+ CORRELATOR varchar(80),
+ SERVICE_INSTANCE_ID varchar(45),
+ SERVICE_INSTANCE_NAME varchar(80),
+ REQUEST_SCOPE varchar(20),
+ REQUEST_ACTION varchar(45) not null,
+ NETWORK_ID varchar(45),
+ NETWORK_NAME varchar(80),
+ NETWORK_TYPE varchar(80),
+ REQUESTOR_ID varchar(80),
+ primary key (REQUEST_ID)
+ );
+
+ create table SITE_STATUS (
+ SITE_NAME varchar(255) not null,
+ STATUS bit,
+ CREATION_TIMESTAMP datetime default CURRENT_TIMESTAMP,
+ primary key (SITE_NAME)
+ );
+ create table OPERATION_STATUS (
+ SERVICE_ID varchar(255) not null,
+ OPERATION_ID varchar(255) not null,
+ SERVICE_NAME varchar(255),
+ OPERATION_TYPE varchar(255),
+ USER_ID varchar(255),
+ RESULT varchar(255),
+ OPERATION_CONTENT varchar(255),
+ PROGRESS varchar(255),
+ REASON varchar(255),
+ OPERATE_AT datetime,
+ FINISHED_AT datetime,
+ primary key (SERVICE_ID,OPERATION_ID)
+ );
+ create table RESOURCE_OPERATION_STATUS (
+ SERVICE_ID varchar(255) not null,
+ OPERATION_ID varchar(255) not null,
+ RESOURCE_TEMPLATE_UUID varchar(255) not null,
+ OPER_TYPE varchar(255),
+ RESOURCE_INSTANCE_ID varchar(255),
+ JOB_ID varchar(255),
+ STATUS varchar(255),
+ PROGRESS varchar(255),
+ ERROR_CODE varchar(255) ,
+ STATUS_DESCRIPOTION varchar(255) ,
+ primary key (SERVICE_ID,OPERATION_ID,RESOURCE_TEMPLATE_UUID)
+ );
+ alter table INFRA_ACTIVE_REQUESTS
+ add constraint UK_bhu6w8p7wvur4pin0gjw2d5ak unique (CLIENT_REQUEST_ID);
diff --git a/scripts/vid/clone_and_setup_vid_data.sh b/scripts/vid/clone_and_setup_vid_data.sh
new file mode 100644
index 00000000..917016c7
--- /dev/null
+++ b/scripts/vid/clone_and_setup_vid_data.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# ONAP CLAMP
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+echo "This is ${WORKSPACE}/test/csit/scripts/sdc/clone_and_setup_vid_data.sh"
+
+# Clone sdc enviroment template
+
+mkdir -p ${WORKSPACE}/data/clone/
+
+cd ${WORKSPACE}/data/clone
+git clone --depth 1 http://gerrit.onap.org/r/vid -b master
+
+
+
+
+
diff --git a/scripts/vid/kill_containers_and_remove_dataFolders.sh b/scripts/vid/kill_containers_and_remove_dataFolders.sh
new file mode 100644
index 00000000..33a799d5
--- /dev/null
+++ b/scripts/vid/kill_containers_and_remove_dataFolders.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+echo "This is ${WORKSPACE}/test/csit/scripts/vid/kill_and_remove_dataFolder.sh"
+
+#kill and remove all vid dockers
+docker stop $(docker ps -a -q --filter="name=vid")
+docker rm $(docker ps -a -q --filter="name=vid")
+
+
+#delete data folder
+
+rm -rf ${WORKSPACE}/data/*
+
+
diff --git a/scripts/vid/start_vid_containers.sh b/scripts/vid/start_vid_containers.sh
new file mode 100644
index 00000000..c4bdae2d
--- /dev/null
+++ b/scripts/vid/start_vid_containers.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# ONAP CLAMP
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+echo "This is ${WORKSPACE}/test/csit/scripts/vid/start_vid_containers.sh"
+
+export IP=`ifconfig eth0 | awk -F: '/inet addr/ {gsub(/ .*/,"",$2); print $2}'`
+
+cd ${WORKSPACE}/test/csit/tests/vid/resources
+docker-compose up -d --build
+
+# WAIT 5 minutes maximum and test every 5 seconds if VID up using HealthCheck API
+
+TIME_OUT=1200
+INTERVAL=5
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+ response=$(curl --write-out '%{http_code}' --silent --output /dev/null http://localhost:8080/vid/healthCheck); echo $response
+
+ if [ "$response" == "200" ]; then
+ echo VID and its database well started in $TIME seconds
+ break;
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if VID is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]; then
+ echo TIME OUT: Docker containers not started in $TIME_OUT seconds... Could cause problems for tests...
+fi
diff --git a/scripts/vvp/clone_and_setup_vvp_data.sh b/scripts/vvp/clone_and_setup_vvp_data.sh
new file mode 100644
index 00000000..a39ed083
--- /dev/null
+++ b/scripts/vvp/clone_and_setup_vvp_data.sh
@@ -0,0 +1,110 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# ONAP CLAMP
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+echo "This is ${WORKSPACE}/test/csit/scripts/vvp/clone_and_setup_vvp_data.sh"
+
+# Clone vvp enviroment template
+mkdir -p ${WORKSPACE}/data/environments/
+mkdir -p ${WORKSPACE}/data/clone/
+mkdir -p /opt/configmaps/settings/
+
+cd ${WORKSPACE}/data/clone
+git clone --depth 1 http://gerrit.onap.org/r/vvp/engagementmgr -b master
+
+chmod -R 775 ${WORKSPACE}/data/
+
+# copy settings file from tox environment infrastructure:
+cp -f ${WORKSPACE}/data/clone/engagementmgr/django/vvp/settings/tox_settings.py /opt/configmaps/settings/__init__.py
+
+# uwsgi.ini file creation
+echo "[uwsgi]
+http = :80
+plugin = python
+chdir = /srv
+module = vvp.wsgi:application
+master = True
+pidfile = /tmp/project-master.pid
+vacuum = True
+max-requests = 5000
+enable-threads = True
+stats = 0.0.0.0:9000
+stats-http = True" > /opt/configmaps/settings/uwsgi.ini
+
+# storage.py file creation
+echo "from storages.backends.s3boto import S3BotoStorage
+from django.conf import settings
+class S3StaticStorage(S3BotoStorage):
+ custom_domain = '%s/%s' % (settings.AWS_S3_HOST, settings.STATIC_BUCKET)
+ bucket_name = settings.STATIC_BUCKET
+class S3MediaStorage(S3BotoStorage):
+ custom_domain = '%s/%s' % (settings.AWS_S3_HOST, settings.MEDIA_BUCKET)
+ bucket_name = settings.MEDIA_BUCKET" > /opt/configmaps/settings/storage.py
+
+# envbool.py file creation
+echo "import os
+def envbool(key, default=False, unknown=True):
+ return {'true': True, '1': True, 'false': False, '0': False,
+ '': default,}.get(os.getenv(key, '').lower(), unknown)" > /opt/configmaps/settings/envbool.py
+
+# vvp_env.list file creation
+echo "# set enviroment variables
+OAUTHLIB_INSECURE_TRANSPORT=1
+HOST_IP=${IP}
+ENVNAME=${ENVIRONMENT}
+http_proxy=${http_proxy}
+https_proxy=${https_proxy}
+no_proxy=${no_proxy}
+DJANGO_SETTINGS_MODULE=vvp.settings
+# export PYTHONPATH={pwd}
+SECRET_KEY=6mo22&FAKEFALEFALEFKEuq0u*4ksk^aq8lte&)yul
+ENVIRONMENT=development
+SERVICE_PROVIDER=ExampleProvider
+PROGRAM_NAME=VVP
+PROGRAM_NAME_URL_PREFIX=vvp
+SERVICE_PROVIDER_DOMAIN=example-domain.com
+EMAIL_HOST=localhost
+EMAIL_HOST_PASSWORD=
+EMAIL_HOST_USER=
+EMAIL_PORT=25
+PGDATABASE=icedb
+PGUSER=iceuser
+PGPASSWORD=Aa123456
+PGHOST=localhost
+PGPORT=5433
+SECRET_WEBHOOK_TOKEN=AiwiFAKEFAKEFAKEmahch2zahshaGi
+SECRET_GITLAB_AUTH_TOKEN=ieNgFAKEFAKE4zohvee9a
+SECRET_JENKINS_PASSWORD=xaiyiFAKEFAKEqueuBu
+SECRET_CMS_APP_CLIENT_ID=MHmJo0ccDhFAKEFAKEFAKEPAC6H6HAMzhCCM16
+SECRET_CMS_APP_CLIENT_SECRET=nI8QFAKEEEpnw5nTs
+SLACK_API_TOKEN=
+S3_HOST=localhost
+S3_PORT=443
+AWS_ACCESS_KEY_ID=FD2FAKEFAKEFAKEVD1MWRN
+AWS_SECRET_ACCESS_KEY=TKoiwxzFAKEFAKEFAKEFAKEFAKEQ27nP2lCiutEsD
+STATIC_ROOT=/app/htdocs" > ${WORKSPACE}/data/environments/vvp_env.list
+
+ifconfig
+
+IP_ADDRESS=`ip route get 8.8.8.8 | awk '/src/{ print $7 }'`
+export HOST_IP=$IP_ADDRESS
diff --git a/scripts/vvp/docker_health.sh b/scripts/vvp/docker_health.sh
new file mode 100644
index 00000000..520b2dc3
--- /dev/null
+++ b/scripts/vvp/docker_health.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# ONAP CLAMP
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+echo "VVP-Engagement-Manager health-Check:"
+echo ""
+echo ""
+res=`curl -s -X GET -H "Accept: application/json" -H "Content-Type: application/json" "http://localhost:9090/vvp/v1/engmgr/vendors" | wc -w`
+if [ ${res} == 0 ]; then
+ echo "Error [${res}] while performing vvp engagement manager vendor existance check"
+ exit 1
+fi
+echo "check vvp engagement manager vendor existance: OK [${res}]"
diff --git a/scripts/vvp/kill_containers_and_remove_dataFolders.sh b/scripts/vvp/kill_containers_and_remove_dataFolders.sh
new file mode 100644
index 00000000..a6c108eb
--- /dev/null
+++ b/scripts/vvp/kill_containers_and_remove_dataFolders.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Modifications copyright (c) 2017 AT&T Intellectual Property
+#
+
+echo "This is ${WORKSPACE}/test/csit/scripts/vvp/kill_and_remove_dataFolder.sh"
+
+
+CONTAINER_NAME="vvp-engagementmgr"
+
+#kill and remove all vvp dockers
+docker stop $CONTAINER_NAME
+docker rm -f $CONTAINER_NAME
+
+
+#delete data folder
+rm -rf ${WORKSPACE}/data/*
diff --git a/scripts/vvp/start_vvp_containers.sh b/scripts/vvp/start_vvp_containers.sh
new file mode 100644
index 00000000..5f905b6a
--- /dev/null
+++ b/scripts/vvp/start_vvp_containers.sh
@@ -0,0 +1,93 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# ONAP CLAMP
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+echo "This is ${WORKSPACE}/test/csit/scripts/vvp/start_vvp_containers.sh"
+
+export IP=$HOST_IP
+export PREFIX='nexus3.onap.org:10001/openecomp/vvp'
+export RELEASE='latest'
+
+#start Engagement Manager pod:
+docker run \
+--detach \
+--entrypoint="" \
+--name vvp-engagementmgr \
+--env-file ${WORKSPACE}/data/environments/vvp_env.list \
+--log-driver=json-file \
+--log-opt max-size=100m \
+--log-opt max-file=10 \
+--ulimit memlock=-1:-1 \
+--memory 4g \
+--memory-swap=4g \
+--ulimit nofile=4096:100000 \
+--volume /etc/localtime:/etc/localtime:ro \
+--volume /opt/configmaps/settings:/opt/configmaps/settings/ \
+--publish 9090:80 ${PREFIX}/engagementmgr:${RELEASE}
+
+docker cp /opt/configmaps/settings/uwsgi.ini vvp-engagementmgr:/srv/vvp/settings/
+
+echo "please wait while Engagement Manager is starting..."
+echo ""
+c=60 # seconds to wait
+REWRITE="\e[25D\e[1A\e[K"
+while [ $c -gt 0 ]; do
+ c=$((c-1))
+ sleep 1
+ echo -e "${REWRITE}$c"
+done
+echo -e ""
+
+#run migration again:
+docker exec -d vvp-engagementmgr sh -c "python3 /srv/manage.py migrate"
+
+#run initial populate db again:
+docker exec -d vvp-engagementmgr sh -c "python3 /srv/manage.py initial_populate_db"
+
+
+echo "Will copy the generated DB sqlite3 file into the application directory in 30 seconds..."
+sleep 30
+#copy the generated DB sqlite3 file into the application directory:
+docker exec -d vvp-engagementmgr sh -c "cp emdb.db /srv/emdb.db -f"
+
+TIME_OUT=600
+INTERVAL=5
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+ response=$(curl --write-out '%{http_code}' --silent --output /dev/null http://localhost:9090/vvp/v1/engmgr/vendors); echo $response
+
+ if [ "$response" == "200" ]; then
+ echo VVP-Engagement-Manager well started in $TIME seconds
+ break;
+ fi
+
+ echo Sleep: $INTERVAL seconds before testing if VVP-Engagement-Manager is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+ sleep $INTERVAL
+ TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]; then
+ echo TIME OUT: Docker containers not started in $TIME_OUT seconds... Could cause problems for tests...
+else
+ echo "Done starting vvp containers!"
+fi
diff --git a/scripts/vvp/start_vvp_sanity.sh b/scripts/vvp/start_vvp_sanity.sh
new file mode 100644
index 00000000..1de1aaa3
--- /dev/null
+++ b/scripts/vvp/start_vvp_sanity.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+# ONAP CLAMP
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+
+# will run CI for sanity checks
diff --git a/tests/aaf/aaf-sms-suite/__init__.robot b/tests/aaf/aaf-sms-suite/__init__.robot
new file mode 100644
index 00000000..d1da7f38
--- /dev/null
+++ b/tests/aaf/aaf-sms-suite/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Integration - Suite 1 \ No newline at end of file
diff --git a/tests/aaf/aaf-sms-suite/aaf-sms-test.robot b/tests/aaf/aaf-sms-suite/aaf-sms-test.robot
new file mode 100644
index 00000000..78e35222
--- /dev/null
+++ b/tests/aaf/aaf-sms-suite/aaf-sms-test.robot
@@ -0,0 +1,94 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library json
+
+*** Variables ***
+${MESSAGE} {"ping": "ok"}
+
+#global variables
+
+
+*** Test Cases ***
+SMS Check SMS API Docker Container
+ [Documentation] Checks if SMS docker container is running
+ ${rc} ${output}= Run and Return RC and Output docker ps
+ Log To Console *********************
+ Log To Console retrurn_code = ${rc}
+ Log To Console output = ${output}
+ Should Be Equal As Integers ${rc} 0
+ Should Contain ${output} nexus3.onap.org:10001/onap/aaf/sms
+
+SMS GetStatus
+ [Documentation] Gets Backend Status
+ Create Session SMS ${SMS_HOSTNAME}:${SMS_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request SMS /v1/sms/quorum/status headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+SMS CreateDomain
+ [Documentation] Creates a Secret Domain to hold Secrets
+ Create Session SMS ${SMS_HOSTNAME}:${SMS_PORT}
+ ${data} Get Binary File ${CURDIR}${/}data${/}create_domain.json
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Post Request SMS /v1/sms/domain data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 201
+
+SMS CreateSecret
+ [Documentation] Create A Secret within the Domain
+ Create Session SMS ${SMS_HOSTNAME}:${SMS_PORT}
+ ${data} Get Binary File ${CURDIR}${/}data${/}create_secret.json
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Post Request SMS /v1/sms/domain/curltestdomain/secret data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 201
+
+SMS ListSecret
+ [Documentation] Lists all Secret Names within Domain
+ Create Session SMS ${SMS_HOSTNAME}:${SMS_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request SMS /v1/sms/domain/curltestdomain/secret headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+SMS GetSecret
+ [Documentation] Gets a single Secret with Values from Domain
+ Create Session SMS ${SMS_HOSTNAME}:${SMS_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request SMS /v1/sms/domain/curltestdomain/secret/curltestsecret1 headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+SMS DeleteSecret
+ [Documentation] Deletes a Secret referenced by Name from Domain
+ Create Session SMS ${SMS_HOSTNAME}:${SMS_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request SMS /v1/sms/domain/curltestdomain/secret/curltestsecret1 headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 204
+
+SMS DeleteDomain
+ [Documentation] Deletes a Domain referenced by Name
+ Create Session SMS ${SMS_HOSTNAME}:${SMS_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request SMS /v1/sms/domain/curltestdomain headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 204
+
+*** Keywords ***
diff --git a/tests/aaf/aaf-sms-suite/data/create_domain.json b/tests/aaf/aaf-sms-suite/data/create_domain.json
new file mode 100644
index 00000000..176f4443
--- /dev/null
+++ b/tests/aaf/aaf-sms-suite/data/create_domain.json
@@ -0,0 +1,3 @@
+{
+ "name": "curltestdomain"
+}
diff --git a/tests/aaf/aaf-sms-suite/data/create_secret.json b/tests/aaf/aaf-sms-suite/data/create_secret.json
new file mode 100644
index 00000000..d99f4e2e
--- /dev/null
+++ b/tests/aaf/aaf-sms-suite/data/create_secret.json
@@ -0,0 +1,12 @@
+{
+ "name": "curltestsecret1",
+ "values": {
+ "name":"rah",
+ "age":35,
+ "map":{
+ "mapkey1": "mapvalue1",
+ "mapkey2": "mapvalue2"
+ },
+ "array":["golang","c++","java","python"]
+ }
+}
diff --git a/tests/aaf/aafapi/aafapi.robot b/tests/aaf/aafapi/aafapi.robot
new file mode 100644
index 00000000..b1f8e746
--- /dev/null
+++ b/tests/aaf/aafapi/aafapi.robot
@@ -0,0 +1,63 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+Library String
+
+*** Variables ***
+${TARGETURL_NAMESPACE} http://${AAF_IP}:8101/authz/nss/org.openecomp
+${TARGETURL_PERMS} http://${AAF_IP}:8101/authz/perms/user/dgl@openecomp.org
+${TARGETURL_ROLES} http://${AAF_IP}:8101/authz/roles/user/dgl@openecomp.org
+${username} dgl@openecomp.org
+${password} ecomp_admin
+
+
+*** Test Cases ***
+View Namesapce
+ [Tags] get
+ CreateSession aaf http://${AAF_IP}:8101
+ &{headers}= Create Dictionary Authorization=Basic ZGdsQG9wZW5lY29tcC5vcmc6ZWNvbXBfYWRtaW4= Content-Type=application/json Accept=application/json
+ ${resp}= Get Request aaf /authz/nss/org.openecomp headers=&{headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ log 'JSON Response Code :'${resp.text}
+
+View by User Permission
+ [Tags] get
+ CreateSession aaf http://${AAF_IP}:8101
+ &{headers}= Create Dictionary Authorization=Basic ZGdsQG9wZW5lY29tcC5vcmc6ZWNvbXBfYWRtaW4= Content-Type=application/json Accept=application/json
+ ${resp}= Get Request aaf authz/perms/user/dgl@openecomp.org headers=&{headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ log 'JSON Response Code :'${resp.text}
+
+View by User Role
+ [Tags] get
+ CreateSession aaf http://${AAF_IP}:8101
+ &{headers}= Create Dictionary Authorization=Basic ZGdsQG9wZW5lY29tcC5vcmc6ZWNvbXBfYWRtaW4= Content-Type=application/json Accept=application/json
+ ${resp}= Get Request aaf authz/roles/user/dgl@openecomp.org headers=&{headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ log 'JSON Response Code :'${resp.text}
+
+Cleanup Namespace ( 424 Response - Delete dependencies and try again)
+ [Tags] delete
+ CreateSession aaf http://${AAF_IP}:8101
+ &{headers}= Create Dictionary Authorization=Basic ZGdsQG9wZW5lY29tcC5vcmc6ZWNvbXBfYWRtaW4= Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request aaf authz/ns/org.openecomp.dmaapBC headers=&{headers}
+ Should Be Equal As Strings ${resp.status_code} 424
+ log 'JSON Response Code :'${resp.text}
+
+Add Data ( Add Admin to Namespace Explicit )
+ [Tags] post
+ CreateSession aaf http://${AAF_IP}:8101
+ &{headers}= Create Dictionary Authorization=Basic ZGdsQG9wZW5lY29tcC5vcmc6ZWNvbXBfYWRtaW4= Content-Type=application/json Accept=application/json
+ ${resp}= Post Request aaf authz/ns/org.openecomp.dmaapBC/admin/alexD@openecomp.org headers=&{headers}
+ Should Be Equal As Strings ${resp.status_code} 403
+ log 'JSON Response Code :'${resp.text}
+
+View Explicit Permission
+ [Tags] post
+ CreateSession aaf http://${AAF_IP}:8101
+ &{headers}= Create Dictionary Authorization=Basic ZGdsQG9wZW5lY29tcC5vcmc6ZWNvbXBfYWRtaW4= Content-Type=application/json Accept=application/json
+ ${resp}= Post Request aaf authz/perms/user/m99751@dmaapBC.openecomp.org headers=&{headers}
+ Should Be Equal As Strings ${resp.status_code} 406
+ log 'JSON Response Code :'${resp.text} \ No newline at end of file
diff --git a/tests/aai/esr-server/startup/__init__.robot b/tests/aai/esr-server/startup/__init__.robot
new file mode 100644
index 00000000..c1eddc93
--- /dev/null
+++ b/tests/aai/esr-server/startup/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation AAI ESR SERVER - Startup
diff --git a/tests/aai/esr-server/startup/test1.robot b/tests/aai/esr-server/startup/test1.robot
new file mode 100644
index 00000000..d1504a1b
--- /dev/null
+++ b/tests/aai/esr-server/startup/test1.robot
@@ -0,0 +1,15 @@
+*** Settings ***
+Library RequestsLibrary
+
+*** Test Cases ***
+Liveness Test
+ [Documentation] Check various endpoints for basic liveness check
+ Create Session esr-server https://${ESRSERVER_IP}:9518
+ CheckUrl esr-server /api/aai-esr-server/v1/test
+
+*** Keywords ***
+CheckUrl
+ [Arguments] ${session} ${path}
+ ${resp}= Get Request ${session} ${path}
+ Should Be Equal As Integers ${resp.status_code} 200
+
diff --git a/tests/aai/resources/api_suite/__init__.robot b/tests/aai/resources/api_suite/__init__.robot
new file mode 100644
index 00000000..538def84
--- /dev/null
+++ b/tests/aai/resources/api_suite/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Resources - Pserver Suite
diff --git a/tests/aai/resources/api_suite/aai.crt b/tests/aai/resources/api_suite/aai.crt
new file mode 100644
index 00000000..6a28bbb8
--- /dev/null
+++ b/tests/aai/resources/api_suite/aai.crt
@@ -0,0 +1,70 @@
+Bag Attributes
+ friendlyName: aaiopenecomp
+ localKeyID: 54 69 6D 65 20 31 35 30 34 38 33 32 34 34 33 32 39 32
+subject=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=SimpleDemo/CN=aai.api.simpledemo.openecomp.org/emailAddress=aai-host@api.simpledemo.openecomp.org
+issuer=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Server CA X1/emailAddress=simpledemo@openecomp.org
+-----BEGIN CERTIFICATE-----
+MIIEiTCCA3GgAwIBAgIJAIPKfDLcn3MpMA0GCSqGSIb3DQEBCwUAMIGtMQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCTkoxEzARBgNVBAcMCkJlZG1pbnN0ZXIxEjAQBgNV
+BAoMCU9wZW5FQ09NUDETMBEGA1UECwwKc2ltcGxlZGVtbzEqMCgGA1UEAwwhT3Bl
+bkVDT01QIHNpbXBsZWRlbW8gU2VydmVyIENBIFgxMScwJQYJKoZIhvcNAQkBFhhz
+aW1wbGVkZW1vQG9wZW5lY29tcC5vcmcwHhcNMTYxMTMwMTUzODM5WhcNMTcxMTMw
+MTUzODM5WjCBuTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5KMRMwEQYDVQQHDApC
+ZWRtaW5zdGVyMRIwEAYDVQQKDAlPcGVuRUNPTVAxEzARBgNVBAsMClNpbXBsZURl
+bW8xKTAnBgNVBAMMIGFhaS5hcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAub3JnMTQw
+MgYJKoZIhvcNAQkBFiVhYWktaG9zdEBhcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAu
+b3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwQrQl8A0rT0Jjlos
+Mr/7LEhT5UOif4GGPOk+3NCIxT3lOqAbUf+d9ZXyT2jWFRiKWua03vQ+Dxc8c2h2
+RRuH8LwEiOiWqPjWRxNqsARzZMI3ryHFCFBZh0FcpjH9kEeKVlLDYuV68k+ZucKd
+NiqUNn61lD7kbmEGwvzKwf91FrJ09+CBMx1OnWKm3gCNKDqAEFMZCOdn2MgesJYB
+/03lzPBS1jDfBXImXRcTBzpgA+wdCLn0cIQ1eLWUwS5tUqUJNh36nHdVyJ0P2Yjd
+JLuxhFcmBKOz1ShyyO+BBtKBO8EGbU6qKflOiwOw0Fsn8LjKcrHQ58NPui5y04BU
+Rypf3QIDAQABo4GdMIGaMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgO4MB0G
+A1UdDgQWBBQyMUOsE2J+CKzK0qd8KFBD2gaWyjBbBgNVHSAEVDBSMFAGBFUdIAAw
+SDBGBggrBgEFBQcCAjA6GjhLZWVwIGF3YXkgZnJvbSBjaGlsZHJlbi4gIFRoaXMg
+Y2VydGlmaWNhdGUgaXMgbm90IGEgdG95LjANBgkqhkiG9w0BAQsFAAOCAQEAnkoy
+2tWJOyyyIQwtVojUxv1GWQPnw3WCUcKpuX4CJhHXLxNErW1fBg7bmo08BNmBPPpq
+WrJsy5lbBgUo9kgpViux5Stfy1rRIRsRLfl/icgCvJmUAxkmRCZL7yUvwG4K7s+8
+DwT+nW/XuWNP6Hd/qHccexB6COJ8KwvTdVoxAkCdX8qw4MCb/f7Kb1yle/vwBM5Q
+UUONCJ4bEns1vnb9DGlNDUJNwCfwORAaVJpVS38Mv4UnSTmb2KMePtCWcx/dNsYR
+2XrSGqLDnTvHwOpyhbfFTmackysGoSuDytORXy8YbwEiF13BwEK8i3rgNN0Z2ojf
+cpmE2xxmaa+A2uuN6g==
+-----END CERTIFICATE-----
+Bag Attributes
+ friendlyName: root
+ 2.16.840.1.113894.746875.1.1: <Unsupported tag 6>
+subject=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Server CA X1/emailAddress=simpledemo@openecomp.org
+issuer=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Root Certification Authority/emailAddress=simpledemo@openecomp.org
+-----BEGIN CERTIFICATE-----
+MIIFpTCCA42gAwIBAgIJAJqx8dKnCZZoMA0GCSqGSIb3DQEBCwUAMIG9MQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCTkoxEzARBgNVBAcMCkJlZG1pbnN0ZXIxEjAQBgNV
+BAoMCU9wZW5FQ09NUDETMBEGA1UECwwKc2ltcGxlZGVtbzE6MDgGA1UEAwwxT3Bl
+bkVDT01QIHNpbXBsZWRlbW8gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEn
+MCUGCSqGSIb3DQEJARYYc2ltcGxlZGVtb0BvcGVuZWNvbXAub3JnMB4XDTE2MTEy
+ODIxMTQyNloXDTIxMTEyNzIxMTQyNlowga0xCzAJBgNVBAYTAlVTMQswCQYDVQQI
+DAJOSjETMBEGA1UEBwwKQmVkbWluc3RlcjESMBAGA1UECgwJT3BlbkVDT01QMRMw
+EQYDVQQLDApzaW1wbGVkZW1vMSowKAYDVQQDDCFPcGVuRUNPTVAgc2ltcGxlZGVt
+byBTZXJ2ZXIgQ0EgWDExJzAlBgkqhkiG9w0BCQEWGHNpbXBsZWRlbW9Ab3BlbmVj
+b21wLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr4rivKQuRk
+YNf5Ig40e1nqj6s6LB1vgMOYbKfRziOFpPcUpsHPOhusHowiUsrU1vdFSzPz6Ej7
+PjlmNSg2Qka8YCn9kd6QgM7U0KcPJvIucBp+qjifH3EvP0jgDPhDeVRYxzV454dv
+5kQ9uCpswJP7YAnX51dkWeH8nwPUoagt31bOl9LXENSrgxEThxdLYMJnQJWk2CmV
+otXM4tT1dxyJxFUrZ6uJCEAYw5VtlplqihHf8lHy+sWQavtsLz/4dc+sGeXSTfoI
+voKvoh3uZ5gEhGV8yfJxk1veX5y5/AxP80vQ+smWYjTnQL5QQ57y4bciez4XVBmQ
+SWimWtOi4e8CAwEAAaOBtTCBsjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBhjAdBgNVHQ4EFgQUTqdsYgGNGubdJHq9tsaJhM9HE5wwcAYDVR0gBGkwZzBl
+BgRVHSAAMF0wWwYIKwYBBQUHAgIwTxpNSWYgeW91IHRydXN0IHRoaXMgY2VydCB0
+aGVuIHdlIGhhdmUgYSBicmlkZ2UgdGhhdCB5b3UgbWlnaHQgYmUgaW50ZXJlc3Rl
+ZCBpbi4wDQYJKoZIhvcNAQELBQADggIBAKNNlRqFuE/JgV1BHyYK0xoSXH4aZP/7
+IoHtDVcSaZAOOuFOUrwVMUbzRBebbb6RpFwt/X+NLFUGysd+XNLF7W7lzxKtmFNX
+n4OpNkBe0y5O7yurus8rERHzu3jiOSgVo+WzDlGpYSRnG3hI2qPWqD+Puzx/WwI8
+XUTuzEQQ3gUSyVFfXHpay3VpYmLZiLJ9WKY5SDw7Ie6Sxrju4Qm1HwnFY8wHZGcs
+2KMQzorJ1ZNQf523yUTghbT0rKaSFaD8zugPtI2ONfFG/QgrkQXo78opzPsHnHwa
+SxGSiAgeLbwAUCvPNl27zr6k6+7TcNjV0VUivAs0OG3VEAdgi7UWYB+30KfWwHwE
+zGmvd4IAGqIqlqLcSVArN5z8JK1B5nfjQn5UrclU1vK+dnuiKE2X4rKuBTRYRFR/
+km+mj4koYFPKFHndmJl1uv2OCJK9l5CSIuKWeI1qv8BASKqgNdoT/SKBXqxgYlCb
+o+j4IDjxrxChRO+e5vl9lA7INfRrbljCkUjfLRa+v2q9tWQ3+EQUwwnSrSfihh2T
+j0Tksr6b8dDsvMlCdOKG1B+JPcEXORSFKNXVTEfjqpJG8s16kFAocWt3S6xO0k1t
+qbQp+3tWQgW2TGnX0rMZzB6NGRNfWhlYmq2zHgXkiCIZ26Ztgt/LNbwEvN3+VlLo
+z/Rd+SKtlrfb
+-----END CERTIFICATE-----
diff --git a/tests/aai/resources/api_suite/aai.key b/tests/aai/resources/api_suite/aai.key
new file mode 100644
index 00000000..02724df4
--- /dev/null
+++ b/tests/aai/resources/api_suite/aai.key
@@ -0,0 +1,32 @@
+Bag Attributes
+ friendlyName: aaiopenecomp
+ localKeyID: 54 69 6D 65 20 31 35 30 34 38 33 32 34 34 33 32 39 32
+Key Attributes: <No Attributes>
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBCtCXwDStPQmO
+Wiwyv/ssSFPlQ6J/gYY86T7c0IjFPeU6oBtR/531lfJPaNYVGIpa5rTe9D4PFzxz
+aHZFG4fwvASI6Jao+NZHE2qwBHNkwjevIcUIUFmHQVymMf2QR4pWUsNi5XryT5m5
+wp02KpQ2frWUPuRuYQbC/MrB/3UWsnT34IEzHU6dYqbeAI0oOoAQUxkI52fYyB6w
+lgH/TeXM8FLWMN8FciZdFxMHOmAD7B0IufRwhDV4tZTBLm1SpQk2Hfqcd1XInQ/Z
+iN0ku7GEVyYEo7PVKHLI74EG0oE7wQZtTqop+U6LA7DQWyfwuMpysdDnw0+6LnLT
+gFRHKl/dAgMBAAECggEBAJko2HkeIW01mUhdWOXnFgR7WjzzXZEmlffr41lVBr7f
+rejGsQZs9cms73R7rCdOsi8PDoA6bqaQfADg571K659fvYVWbHqh+3im+iWvUlKm
+GYIVG/vNrEq43CZsUU7Qw/xba/QiOFraNxCATTV1sORPwgddouXEi5XW9ZPX9/FJ
+wORx4L/K0DfHX1rr+rtOoHCJdZYhn3Ij87kmR8Mwg0fNeWhHqtxUEyM/itRjCvOe
+mgt2V8DORhmq12L4+5QJctBrkBVRp9Rh6YSZZBGnKbTSgf4q648BdkJDLSK4cguT
+D6BAw3gxj5V4wt5W0wn2JpjadFwnixrTzvMP/yAqfK0CgYEA93nBAoUPw8nzQkwk
+8iWBjfJ999Rw92hnnvk3xbcQcGfgUYuB4dxwe6FQTmFIVylt81er1YUvMb3ao7fo
+5ZcGnI5p1idjsd27kbZJLxb5Oh919hKu5IfkfYsVgnC0UdKCTgH5CaH0U4ATuXwt
+RL6qm0XcLALs5y2OO6z3s+mYhisCgYEAx7EQ8MA45bkXnRQiHBhGcIIcr2sRDfVJ
+OhHmGxx3EcYgtsIYKTqtQOyIt/nQxo6iyNL9bzfzBTybFJLuj63ZG1Ef4LosJedl
+eAU2NsKv5MlKYDSdNbLAJ0Op9I2Xu/pXQecPwY/3MkIQArdQCLevMLEGywCsuJTn
+BjkJNDkb9hcCgYAhoFiaiAwJVYKJSqFmibQd3opBR4uGApi54DE021gPff3b9rHS
+R8q88cFgtRVISqfW/d2qaKtt/dcckdvCfo/2a99zqux/+ZoIBZXSITQCMs4rfoRn
+JxPj/ycQD1JhH9J22QvGxEvXoLqNZJMeGS5DZO2yyT75dpYyA6Gwv5fq+wKBgQC5
+AhV917lfLELyZurLOLpaFlHZO8rLMcusH1UfHRo7v2IjsGOOHyzRD9QDD1IcA55R
+jRj8Z8uhuGq9fvvC5gBVTK3KGPI6E85wifOWfH1V7CAaTeSxEXDxb8EQL/a6U89v
+4VE5tdYCHC6VNZzS1staw0hV38QmJt57Z3Bdj+OV9QKBgE/b9fxpo+SVQ37BzNNY
+SEKTTijaddz8fdomApg6a2eFJL93Ej/op7N7gnHtPWMivPnRRza9ZjfnG+aZ7n2J
+sWyBiZK9xliS2TsF3l3q9Z0Vaq3i1nOlV7Bd20ZS8KjQjDtKnIRfLkQDkvmXbU5L
+emwkdsQZbpPFJch3mCGtI7JW
+-----END PRIVATE KEY-----
diff --git a/tests/aai/resources/api_suite/complex.robot b/tests/aai/resources/api_suite/complex.robot
new file mode 100644
index 00000000..3602f731
--- /dev/null
+++ b/tests/aai/resources/api_suite/complex.robot
@@ -0,0 +1,72 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${COMPLEXKEYVALUE} complex-integration-test1
+${COMPLEXURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/complexes/complex/${COMPLEXKEYVALUE}
+${COMPLEXDATA} {"physical-location-id":"${COMPLEXKEYVALUE}","data-center-code":"example-data-center-code-val-77883","complex-name":"example-complex-name-val-12992","identity-url":"example-identity-url-val-74366","physical-location-type":"example-physical-location-type-val-32854","street1":"example-street1-val-26496","street2":"example-street2-val-6629","city":"example-city-val-30262","state":"example-state-val-9058","postal-code":"example-postal-code-val-44893","country":"example-country-val-98673","region":"example-region-val-10014","latitude":"example-latitude-val-47555","longitude":"example-longitude-val-76903","elevation":"example-elevation-val-63385","lata":"example-lata-val-90935"}
+
+*** Test Cases ***
+
+Run AAI Put complex
+ [Documentation] Create an complex object
+ ${resp}= PutWithCert ${COMPLEXURL} ${COMPLEXDATA}
+ log ${COMPLEXURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get complex
+ [Documentation] Get the complex object just created
+ ${resp} GetWithCert ${COMPLEXURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete complex
+ [Documentation] Delete the complex just created
+ ${resp}= DeleteWithCert ${COMPLEXURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PatchWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.patch('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp} \ No newline at end of file
diff --git a/tests/aai/resources/api_suite/ems.robot b/tests/aai/resources/api_suite/ems.robot
new file mode 100644
index 00000000..0068be35
--- /dev/null
+++ b/tests/aai/resources/api_suite/ems.robot
@@ -0,0 +1,65 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${TARGETURL} https://${HOST_IP}:8443/aai/v11/external-system/esr-ems-list/esr-ems/ems-test1
+${EMSDATA} { "ems-id": "ems-test1", "esr-system-info-list": { "esr-system-info": [{ "esr-system-info-id": "ems-esr-system-info1", "system-name": "fff", "type": "ftp", "vendor": "ZTE", "version": "v1.0", "user-name": "root", "password": "123456", "system-type": "EMS_PERFORMANCE", "ip-address": "10.74.15.28", "port": "6767", "passive": true, "remote-path": "/data/peroformance"},{ "esr-system-info-id": "ems-esr-system-info2", "system-name": "fff", "type": "ftp", "vendor": "ZTE", "version": "v1.0", "user-name": "root", "password": "123456", "system-type": "EMS_RESOUCE", "ip-address": "10.74.15.29", "port": "6666", "passive": true, "remote-path": "/opt/Gcp/data/"},{ "esr-system-info-id": "ems-esr-system-info3", "system-name": "fff", "vendor": "ZTE", "version": "v1.0", "user-name": "root", "password": "123456", "system-type": "EMS_ALARM", "ip-address": "10.74.15.30", "port": "2000"}]}}
+
+*** Test Cases ***
+
+Run AAI Put ems
+ [Documentation] Create an ems object
+ ${resp}= PutWithCert ${TARGETURL} ${EMSDATA}
+ log ${TARGETURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get ems
+ [Documentation] Get the ems object just created
+ ${resp} GetWithCert ${TARGETURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete ems
+ [Documentation] Delete the ems just created
+ ${resp}= DeleteWithCert ${TARGETURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
diff --git a/tests/aai/resources/api_suite/get_all.robot b/tests/aai/resources/api_suite/get_all.robot
new file mode 100644
index 00000000..8e464cbd
--- /dev/null
+++ b/tests/aai/resources/api_suite/get_all.robot
@@ -0,0 +1,105 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${COMPLEXKEYVALUE1} complex-integration-test3-1
+${COMPLEXKEYVALUE2} complex-integration-test3-2
+${COMPLEXURL1} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/complexes/complex/${COMPLEXKEYVALUE1}
+${COMPLEXURL2} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/complexes/complex/${COMPLEXKEYVALUE2}
+${ALLCOMPLEXURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/complexes
+${COMPLEXDATA1} {"physical-location-id":"${COMPLEXKEYVALUE1}","data-center-code":"example-data-center-code-val-77883","complex-name":"example-complex-name-val-12992","identity-url":"example-identity-url-val-74366","physical-location-type":"example-physical-location-type-val-32854","street1":"example-street1-val-26496","street2":"example-street2-val-6629","city":"example-city-val-30262","state":"example-state-val-9058","postal-code":"example-postal-code-val-44893","country":"example-country-val-98673","region":"example-region-val-10014","latitude":"example-latitude-val-47555","longitude":"example-longitude-val-76903","elevation":"example-elevation-val-63385","lata":"example-lata-val-90935"}
+${COMPLEXDATA2} {"physical-location-id":"${COMPLEXKEYVALUE2}","data-center-code":"example-data-center-code-val-7783","complex-name":"example-complex-name-val-1292","identity-url":"example-identity-url-val-7466","physical-location-type":"example-physical-location-type-val-3854","street1":"example-street1-val-2496","street2":"example-street2-val-6629","city":"example-city-val-3062","state":"example-state-val-9058","postal-code":"example-postal-code-val-4493","country":"example-country-val-9873","region":"example-region-val-1004","latitude":"example-latitude-val-4555","longitude":"example-longitude-val-7603","elevation":"example-elevation-val-6335","lata":"example-lata-val-9035"}
+
+*** Test Cases ***
+
+Run AAI Put complex 1
+ [Documentation] Create an complex 1 object
+ ${resp}= PutWithCert ${COMPLEXURL1} ${COMPLEXDATA1}
+ log ${COMPLEXURL1}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put complex 2
+ [Documentation] Create an complex 2 object
+ ${resp}= PutWithCert ${COMPLEXURL2} ${COMPLEXDATA2}
+ log ${COMPLEXURL2}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get all complex
+ [Documentation] Get the complex object just created
+ ${resp} GetWithCert ${ALLCOMPLEXURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get complex 1 to delete
+ [Documentation] Get the complex 1 object to delete
+ ${resp} GetWithCert ${COMPLEXURL1}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete complex 1
+ [Documentation] Delete the complex just created
+ ${resp}= DeleteWithCert ${COMPLEXURL1}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get complex 2 to delete
+ [Documentation] Get the complex 2 object to delete
+ ${resp} GetWithCert ${COMPLEXURL2}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete complex 2
+ [Documentation] Delete the complex just created
+ ${resp}= DeleteWithCert ${COMPLEXURL2}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PatchWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.patch('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp} \ No newline at end of file
diff --git a/tests/aai/resources/api_suite/get_with_depth.robot b/tests/aai/resources/api_suite/get_with_depth.robot
new file mode 100644
index 00000000..8e464cbd
--- /dev/null
+++ b/tests/aai/resources/api_suite/get_with_depth.robot
@@ -0,0 +1,105 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${COMPLEXKEYVALUE1} complex-integration-test3-1
+${COMPLEXKEYVALUE2} complex-integration-test3-2
+${COMPLEXURL1} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/complexes/complex/${COMPLEXKEYVALUE1}
+${COMPLEXURL2} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/complexes/complex/${COMPLEXKEYVALUE2}
+${ALLCOMPLEXURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/complexes
+${COMPLEXDATA1} {"physical-location-id":"${COMPLEXKEYVALUE1}","data-center-code":"example-data-center-code-val-77883","complex-name":"example-complex-name-val-12992","identity-url":"example-identity-url-val-74366","physical-location-type":"example-physical-location-type-val-32854","street1":"example-street1-val-26496","street2":"example-street2-val-6629","city":"example-city-val-30262","state":"example-state-val-9058","postal-code":"example-postal-code-val-44893","country":"example-country-val-98673","region":"example-region-val-10014","latitude":"example-latitude-val-47555","longitude":"example-longitude-val-76903","elevation":"example-elevation-val-63385","lata":"example-lata-val-90935"}
+${COMPLEXDATA2} {"physical-location-id":"${COMPLEXKEYVALUE2}","data-center-code":"example-data-center-code-val-7783","complex-name":"example-complex-name-val-1292","identity-url":"example-identity-url-val-7466","physical-location-type":"example-physical-location-type-val-3854","street1":"example-street1-val-2496","street2":"example-street2-val-6629","city":"example-city-val-3062","state":"example-state-val-9058","postal-code":"example-postal-code-val-4493","country":"example-country-val-9873","region":"example-region-val-1004","latitude":"example-latitude-val-4555","longitude":"example-longitude-val-7603","elevation":"example-elevation-val-6335","lata":"example-lata-val-9035"}
+
+*** Test Cases ***
+
+Run AAI Put complex 1
+ [Documentation] Create an complex 1 object
+ ${resp}= PutWithCert ${COMPLEXURL1} ${COMPLEXDATA1}
+ log ${COMPLEXURL1}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put complex 2
+ [Documentation] Create an complex 2 object
+ ${resp}= PutWithCert ${COMPLEXURL2} ${COMPLEXDATA2}
+ log ${COMPLEXURL2}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get all complex
+ [Documentation] Get the complex object just created
+ ${resp} GetWithCert ${ALLCOMPLEXURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get complex 1 to delete
+ [Documentation] Get the complex 1 object to delete
+ ${resp} GetWithCert ${COMPLEXURL1}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete complex 1
+ [Documentation] Delete the complex just created
+ ${resp}= DeleteWithCert ${COMPLEXURL1}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get complex 2 to delete
+ [Documentation] Get the complex 2 object to delete
+ ${resp} GetWithCert ${COMPLEXURL2}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete complex 2
+ [Documentation] Delete the complex just created
+ ${resp}= DeleteWithCert ${COMPLEXURL2}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PatchWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.patch('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp} \ No newline at end of file
diff --git a/tests/aai/resources/api_suite/patch.robot b/tests/aai/resources/api_suite/patch.robot
new file mode 100644
index 00000000..90544e4d
--- /dev/null
+++ b/tests/aai/resources/api_suite/patch.robot
@@ -0,0 +1,86 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${L3NETWORKKEYVALUE} l3-network-integration-test1
+${L3NETWORKURL} https://${HOST_IP}:8443/aai/v11/network/l3-networks/l3-network/${L3NETWORKKEYVALUE}
+${L3NETWORKDATA} {"network-id":"${L3NETWORKKEYVALUE}","network-name":"example-network-name-val-5468","network-type":"example-network-type-val-5468","network-role":"example-network-role-val-5468","network-technology":"example-network-technology-val-5468","neutron-network-id":"example-neutron-network-id-val-5468","is-bound-to-vpn":"true","service-id":"example-service-id-val-5468","orchestration-status":"example-orchestration-status-val-5468","heat-stack-id":"example-heat-stack-id-val-5468","mso-catalog-key":"example-mso-catalog-key-val-5468"}
+${L3NETWORKPATCHDATA} {"network-id":"${L3NETWORKKEYVALUE}","network-name":"example-network-name-val-5468-patched","network-type":"example-network-type-val-5468-patched"}
+
+*** Test Cases ***
+Run AAI Put l3-network
+ [Documentation] Create l3-network object
+ ${resp}= PutWithCert ${L3NETWORKURL} ${L3NETWORKDATA}
+ log ${L3NETWORKURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get l3-network
+ [Documentation] Get the l3-network object just created
+ ${resp} GetWithCert ${L3NETWORKURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Patch l3-network
+ [Documentation] Update (Parch) l3-network object
+ ${resp}= PatchWithCert ${L3NETWORKURL} ${L3NETWORKPATCHDATA}
+ log ${L3NETWORKURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get l3-network
+ [Documentation] Get the l3-network object just patched
+ ${resp} GetWithCert ${L3NETWORKURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete l3-network
+ [Documentation] Delete the l3-network
+ ${resp}= DeleteWithCert ${L3NETWORKURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PatchWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.patch('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp} \ No newline at end of file
diff --git a/tests/aai/resources/api_suite/pserver.robot b/tests/aai/resources/api_suite/pserver.robot
new file mode 100644
index 00000000..55e57bcc
--- /dev/null
+++ b/tests/aai/resources/api_suite/pserver.robot
@@ -0,0 +1,65 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${TARGETURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/pservers/pserver/pserver-test1
+${PSERVERDATA} {"hostname": "pserver-test1"}
+
+*** Test Cases ***
+
+Run AAI Put Pserver
+ [Documentation] Create an pserver object
+ ${resp}= PutWithCert ${TARGETURL} ${PSERVERDATA}
+ log ${TARGETURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get Pserver
+ [Documentation] Get the pserver object just created
+ ${resp} GetWithCert ${TARGETURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete Pserver
+ [Documentation] Delete the pserver just created
+ ${resp}= DeleteWithCert ${TARGETURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
diff --git a/tests/aai/resources/api_suite/thirdparty_sdnc.robot b/tests/aai/resources/api_suite/thirdparty_sdnc.robot
new file mode 100644
index 00000000..bc27cafa
--- /dev/null
+++ b/tests/aai/resources/api_suite/thirdparty_sdnc.robot
@@ -0,0 +1,65 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${TARGETURL} https://${HOST_IP}:8443/aai/v11/external-system/esr-thirdparty-sdnc-list/esr-thirdparty-sdnc/thirdparty-sdnc-test1
+${SDNCDATA} {"thirdparty-sdnc-id": "thirdparty-sdnc-test1", "location": "edge", "product-name": "aaa", "esr-system-info-list": { "esr-system-info": [{ "esr-system-info-id": "thirdparty-sdnc-esr-system-info-id", "system-name": "sdnc1", "type": "WAN", "vendor": "ZTE", "version": "v1.0", "service-url": "http://10.74.66.12:80", "user-name": "admin", "password": "admin", "system-type": "thirdparty_SDNC", "protocol": "netconf"}]}}
+
+*** Test Cases ***
+
+Run AAI Put thirdparty-sdnc
+ [Documentation] Create an thirdparty-sdnc object
+ ${resp}= PutWithCert ${TARGETURL} ${SDNCDATA}
+ log ${TARGETURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get thirdparty-sdnc
+ [Documentation] Get the thirdparty-sdnc object just created
+ ${resp} GetWithCert ${TARGETURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete thirdparty-sdnc
+ [Documentation] Delete the thirdparty-sdnc just created
+ ${resp}= DeleteWithCert ${TARGETURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
diff --git a/tests/aai/resources/api_suite/vim.robot b/tests/aai/resources/api_suite/vim.robot
new file mode 100644
index 00000000..9a7fc1f9
--- /dev/null
+++ b/tests/aai/resources/api_suite/vim.robot
@@ -0,0 +1,65 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${TARGETURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/VIM-test1/RegionOne1
+${VIMDATA} {"cloud-owner": "VIM-test1", "cloud-region-id": "RegionOne1", "cloud-type": "openstack", "owner-defined-type": "owner-defined-type", "cloud-region-version": "v1.0", "cloud-zone": "cloud zone", "complex-name": "complex name", "cloud-extra-info": "{}", "esr-system-info-list": { "esr-system-info": [{"esr-system-info-id": "vim-esr-system-info-id", "service-url": "http://10.12.25.2:5000/v3", "user-name": "demo", "password": "onapdemo", "system-type": "VIM", "ssl-insecure": true, "cloud-domain": "Default"}]}}
+
+*** Test Cases ***
+
+Run AAI Put VIM
+ [Documentation] Create an VIM object
+ ${resp}= PutWithCert ${TARGETURL} ${VIMDATA}
+ log ${TARGETURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get VIM
+ [Documentation] Get the VIM object just created
+ ${resp} GetWithCert ${TARGETURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete VIM
+ [Documentation] Delete the VIM just created
+ ${resp}= DeleteWithCert ${TARGETURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
diff --git a/tests/aai/resources/api_suite/vnfm.robot b/tests/aai/resources/api_suite/vnfm.robot
new file mode 100644
index 00000000..13b0adf4
--- /dev/null
+++ b/tests/aai/resources/api_suite/vnfm.robot
@@ -0,0 +1,65 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${TARGETURL} https://${HOST_IP}:8443/aai/v11/external-system/esr-vnfm-list/esr-vnfm/vnfm-test1
+${VNFMDATA} {"vnfm-id": "vnfm-test1", "vim-id": "123", "certificate-url": "", "esr-system-info-list": {"esr-system-info": [{"esr-system-info-id":"esr-system-info-vnfm-test1", "system-name": "vnfmtest1", "type": "Tacker", "vendor": "ZTE", "version": "v1.0", "service-url": "http://10.74.44.12", "user-name": "admin", "password": "admin", "system-type": "VNFM"}]}}
+
+*** Test Cases ***
+
+Run AAI Put vnfm
+ [Documentation] Create an vnfm object
+ ${resp}= PutWithCert ${TARGETURL} ${VNFMDATA}
+ log ${TARGETURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get vnfm
+ [Documentation] Get the vnfm object just created
+ ${resp} GetWithCert ${TARGETURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete vnfm
+ [Documentation] Delete the vnfm just created
+ ${resp}= DeleteWithCert ${TARGETURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
diff --git a/tests/aai/resources/db_edge_rule/__init__.robot b/tests/aai/resources/db_edge_rule/__init__.robot
new file mode 100644
index 00000000..538def84
--- /dev/null
+++ b/tests/aai/resources/db_edge_rule/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Resources - Pserver Suite
diff --git a/tests/aai/resources/db_edge_rule/aai.crt b/tests/aai/resources/db_edge_rule/aai.crt
new file mode 100644
index 00000000..6a28bbb8
--- /dev/null
+++ b/tests/aai/resources/db_edge_rule/aai.crt
@@ -0,0 +1,70 @@
+Bag Attributes
+ friendlyName: aaiopenecomp
+ localKeyID: 54 69 6D 65 20 31 35 30 34 38 33 32 34 34 33 32 39 32
+subject=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=SimpleDemo/CN=aai.api.simpledemo.openecomp.org/emailAddress=aai-host@api.simpledemo.openecomp.org
+issuer=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Server CA X1/emailAddress=simpledemo@openecomp.org
+-----BEGIN CERTIFICATE-----
+MIIEiTCCA3GgAwIBAgIJAIPKfDLcn3MpMA0GCSqGSIb3DQEBCwUAMIGtMQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCTkoxEzARBgNVBAcMCkJlZG1pbnN0ZXIxEjAQBgNV
+BAoMCU9wZW5FQ09NUDETMBEGA1UECwwKc2ltcGxlZGVtbzEqMCgGA1UEAwwhT3Bl
+bkVDT01QIHNpbXBsZWRlbW8gU2VydmVyIENBIFgxMScwJQYJKoZIhvcNAQkBFhhz
+aW1wbGVkZW1vQG9wZW5lY29tcC5vcmcwHhcNMTYxMTMwMTUzODM5WhcNMTcxMTMw
+MTUzODM5WjCBuTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5KMRMwEQYDVQQHDApC
+ZWRtaW5zdGVyMRIwEAYDVQQKDAlPcGVuRUNPTVAxEzARBgNVBAsMClNpbXBsZURl
+bW8xKTAnBgNVBAMMIGFhaS5hcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAub3JnMTQw
+MgYJKoZIhvcNAQkBFiVhYWktaG9zdEBhcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAu
+b3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwQrQl8A0rT0Jjlos
+Mr/7LEhT5UOif4GGPOk+3NCIxT3lOqAbUf+d9ZXyT2jWFRiKWua03vQ+Dxc8c2h2
+RRuH8LwEiOiWqPjWRxNqsARzZMI3ryHFCFBZh0FcpjH9kEeKVlLDYuV68k+ZucKd
+NiqUNn61lD7kbmEGwvzKwf91FrJ09+CBMx1OnWKm3gCNKDqAEFMZCOdn2MgesJYB
+/03lzPBS1jDfBXImXRcTBzpgA+wdCLn0cIQ1eLWUwS5tUqUJNh36nHdVyJ0P2Yjd
+JLuxhFcmBKOz1ShyyO+BBtKBO8EGbU6qKflOiwOw0Fsn8LjKcrHQ58NPui5y04BU
+Rypf3QIDAQABo4GdMIGaMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgO4MB0G
+A1UdDgQWBBQyMUOsE2J+CKzK0qd8KFBD2gaWyjBbBgNVHSAEVDBSMFAGBFUdIAAw
+SDBGBggrBgEFBQcCAjA6GjhLZWVwIGF3YXkgZnJvbSBjaGlsZHJlbi4gIFRoaXMg
+Y2VydGlmaWNhdGUgaXMgbm90IGEgdG95LjANBgkqhkiG9w0BAQsFAAOCAQEAnkoy
+2tWJOyyyIQwtVojUxv1GWQPnw3WCUcKpuX4CJhHXLxNErW1fBg7bmo08BNmBPPpq
+WrJsy5lbBgUo9kgpViux5Stfy1rRIRsRLfl/icgCvJmUAxkmRCZL7yUvwG4K7s+8
+DwT+nW/XuWNP6Hd/qHccexB6COJ8KwvTdVoxAkCdX8qw4MCb/f7Kb1yle/vwBM5Q
+UUONCJ4bEns1vnb9DGlNDUJNwCfwORAaVJpVS38Mv4UnSTmb2KMePtCWcx/dNsYR
+2XrSGqLDnTvHwOpyhbfFTmackysGoSuDytORXy8YbwEiF13BwEK8i3rgNN0Z2ojf
+cpmE2xxmaa+A2uuN6g==
+-----END CERTIFICATE-----
+Bag Attributes
+ friendlyName: root
+ 2.16.840.1.113894.746875.1.1: <Unsupported tag 6>
+subject=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Server CA X1/emailAddress=simpledemo@openecomp.org
+issuer=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Root Certification Authority/emailAddress=simpledemo@openecomp.org
+-----BEGIN CERTIFICATE-----
+MIIFpTCCA42gAwIBAgIJAJqx8dKnCZZoMA0GCSqGSIb3DQEBCwUAMIG9MQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCTkoxEzARBgNVBAcMCkJlZG1pbnN0ZXIxEjAQBgNV
+BAoMCU9wZW5FQ09NUDETMBEGA1UECwwKc2ltcGxlZGVtbzE6MDgGA1UEAwwxT3Bl
+bkVDT01QIHNpbXBsZWRlbW8gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEn
+MCUGCSqGSIb3DQEJARYYc2ltcGxlZGVtb0BvcGVuZWNvbXAub3JnMB4XDTE2MTEy
+ODIxMTQyNloXDTIxMTEyNzIxMTQyNlowga0xCzAJBgNVBAYTAlVTMQswCQYDVQQI
+DAJOSjETMBEGA1UEBwwKQmVkbWluc3RlcjESMBAGA1UECgwJT3BlbkVDT01QMRMw
+EQYDVQQLDApzaW1wbGVkZW1vMSowKAYDVQQDDCFPcGVuRUNPTVAgc2ltcGxlZGVt
+byBTZXJ2ZXIgQ0EgWDExJzAlBgkqhkiG9w0BCQEWGHNpbXBsZWRlbW9Ab3BlbmVj
+b21wLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr4rivKQuRk
+YNf5Ig40e1nqj6s6LB1vgMOYbKfRziOFpPcUpsHPOhusHowiUsrU1vdFSzPz6Ej7
+PjlmNSg2Qka8YCn9kd6QgM7U0KcPJvIucBp+qjifH3EvP0jgDPhDeVRYxzV454dv
+5kQ9uCpswJP7YAnX51dkWeH8nwPUoagt31bOl9LXENSrgxEThxdLYMJnQJWk2CmV
+otXM4tT1dxyJxFUrZ6uJCEAYw5VtlplqihHf8lHy+sWQavtsLz/4dc+sGeXSTfoI
+voKvoh3uZ5gEhGV8yfJxk1veX5y5/AxP80vQ+smWYjTnQL5QQ57y4bciez4XVBmQ
+SWimWtOi4e8CAwEAAaOBtTCBsjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBhjAdBgNVHQ4EFgQUTqdsYgGNGubdJHq9tsaJhM9HE5wwcAYDVR0gBGkwZzBl
+BgRVHSAAMF0wWwYIKwYBBQUHAgIwTxpNSWYgeW91IHRydXN0IHRoaXMgY2VydCB0
+aGVuIHdlIGhhdmUgYSBicmlkZ2UgdGhhdCB5b3UgbWlnaHQgYmUgaW50ZXJlc3Rl
+ZCBpbi4wDQYJKoZIhvcNAQELBQADggIBAKNNlRqFuE/JgV1BHyYK0xoSXH4aZP/7
+IoHtDVcSaZAOOuFOUrwVMUbzRBebbb6RpFwt/X+NLFUGysd+XNLF7W7lzxKtmFNX
+n4OpNkBe0y5O7yurus8rERHzu3jiOSgVo+WzDlGpYSRnG3hI2qPWqD+Puzx/WwI8
+XUTuzEQQ3gUSyVFfXHpay3VpYmLZiLJ9WKY5SDw7Ie6Sxrju4Qm1HwnFY8wHZGcs
+2KMQzorJ1ZNQf523yUTghbT0rKaSFaD8zugPtI2ONfFG/QgrkQXo78opzPsHnHwa
+SxGSiAgeLbwAUCvPNl27zr6k6+7TcNjV0VUivAs0OG3VEAdgi7UWYB+30KfWwHwE
+zGmvd4IAGqIqlqLcSVArN5z8JK1B5nfjQn5UrclU1vK+dnuiKE2X4rKuBTRYRFR/
+km+mj4koYFPKFHndmJl1uv2OCJK9l5CSIuKWeI1qv8BASKqgNdoT/SKBXqxgYlCb
+o+j4IDjxrxChRO+e5vl9lA7INfRrbljCkUjfLRa+v2q9tWQ3+EQUwwnSrSfihh2T
+j0Tksr6b8dDsvMlCdOKG1B+JPcEXORSFKNXVTEfjqpJG8s16kFAocWt3S6xO0k1t
+qbQp+3tWQgW2TGnX0rMZzB6NGRNfWhlYmq2zHgXkiCIZ26Ztgt/LNbwEvN3+VlLo
+z/Rd+SKtlrfb
+-----END CERTIFICATE-----
diff --git a/tests/aai/resources/db_edge_rule/aai.key b/tests/aai/resources/db_edge_rule/aai.key
new file mode 100644
index 00000000..02724df4
--- /dev/null
+++ b/tests/aai/resources/db_edge_rule/aai.key
@@ -0,0 +1,32 @@
+Bag Attributes
+ friendlyName: aaiopenecomp
+ localKeyID: 54 69 6D 65 20 31 35 30 34 38 33 32 34 34 33 32 39 32
+Key Attributes: <No Attributes>
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBCtCXwDStPQmO
+Wiwyv/ssSFPlQ6J/gYY86T7c0IjFPeU6oBtR/531lfJPaNYVGIpa5rTe9D4PFzxz
+aHZFG4fwvASI6Jao+NZHE2qwBHNkwjevIcUIUFmHQVymMf2QR4pWUsNi5XryT5m5
+wp02KpQ2frWUPuRuYQbC/MrB/3UWsnT34IEzHU6dYqbeAI0oOoAQUxkI52fYyB6w
+lgH/TeXM8FLWMN8FciZdFxMHOmAD7B0IufRwhDV4tZTBLm1SpQk2Hfqcd1XInQ/Z
+iN0ku7GEVyYEo7PVKHLI74EG0oE7wQZtTqop+U6LA7DQWyfwuMpysdDnw0+6LnLT
+gFRHKl/dAgMBAAECggEBAJko2HkeIW01mUhdWOXnFgR7WjzzXZEmlffr41lVBr7f
+rejGsQZs9cms73R7rCdOsi8PDoA6bqaQfADg571K659fvYVWbHqh+3im+iWvUlKm
+GYIVG/vNrEq43CZsUU7Qw/xba/QiOFraNxCATTV1sORPwgddouXEi5XW9ZPX9/FJ
+wORx4L/K0DfHX1rr+rtOoHCJdZYhn3Ij87kmR8Mwg0fNeWhHqtxUEyM/itRjCvOe
+mgt2V8DORhmq12L4+5QJctBrkBVRp9Rh6YSZZBGnKbTSgf4q648BdkJDLSK4cguT
+D6BAw3gxj5V4wt5W0wn2JpjadFwnixrTzvMP/yAqfK0CgYEA93nBAoUPw8nzQkwk
+8iWBjfJ999Rw92hnnvk3xbcQcGfgUYuB4dxwe6FQTmFIVylt81er1YUvMb3ao7fo
+5ZcGnI5p1idjsd27kbZJLxb5Oh919hKu5IfkfYsVgnC0UdKCTgH5CaH0U4ATuXwt
+RL6qm0XcLALs5y2OO6z3s+mYhisCgYEAx7EQ8MA45bkXnRQiHBhGcIIcr2sRDfVJ
+OhHmGxx3EcYgtsIYKTqtQOyIt/nQxo6iyNL9bzfzBTybFJLuj63ZG1Ef4LosJedl
+eAU2NsKv5MlKYDSdNbLAJ0Op9I2Xu/pXQecPwY/3MkIQArdQCLevMLEGywCsuJTn
+BjkJNDkb9hcCgYAhoFiaiAwJVYKJSqFmibQd3opBR4uGApi54DE021gPff3b9rHS
+R8q88cFgtRVISqfW/d2qaKtt/dcckdvCfo/2a99zqux/+ZoIBZXSITQCMs4rfoRn
+JxPj/ycQD1JhH9J22QvGxEvXoLqNZJMeGS5DZO2yyT75dpYyA6Gwv5fq+wKBgQC5
+AhV917lfLELyZurLOLpaFlHZO8rLMcusH1UfHRo7v2IjsGOOHyzRD9QDD1IcA55R
+jRj8Z8uhuGq9fvvC5gBVTK3KGPI6E85wifOWfH1V7CAaTeSxEXDxb8EQL/a6U89v
+4VE5tdYCHC6VNZzS1staw0hV38QmJt57Z3Bdj+OV9QKBgE/b9fxpo+SVQ37BzNNY
+SEKTTijaddz8fdomApg6a2eFJL93Ej/op7N7gnHtPWMivPnRRza9ZjfnG+aZ7n2J
+sWyBiZK9xliS2TsF3l3q9Z0Vaq3i1nOlV7Bd20ZS8KjQjDtKnIRfLkQDkvmXbU5L
+emwkdsQZbpPFJch3mCGtI7JW
+-----END PRIVATE KEY-----
diff --git a/tests/aai/resources/db_edge_rule/delete_other_v.robot b/tests/aai/resources/db_edge_rule/delete_other_v.robot
new file mode 100644
index 00000000..d7da7ab8
--- /dev/null
+++ b/tests/aai/resources/db_edge_rule/delete_other_v.robot
@@ -0,0 +1,95 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${CUSTOMERKEYVALUE} customer-integration-test3
+${LOGICALLINKKEYVALUE} logical-link-integration-test3
+${CUSTOMERURL} https://${HOST_IP}:8443/aai/v11/business/customers/customer/${CUSTOMERKEYVALUE}
+${LOGICALLINKURL} https://${HOST_IP}:8443/aai/v11/network/logical-links/logical-link/${LOGICALLINKKEYVALUE}
+${CUSTOMERDATA} {"global-customer-id":"${CUSTOMERKEYVALUE}","subscriber-name":"subscriber-name-integration-test","subscriber-type":"subscriber-type-integration-test","service-subscriptions":{"service-subscription":{"service-type":"service-type-987654321-04","service-instances":{"service-instance":{"service-instance-id":"service-instance-id-integration-test","relationship-list":{"relationship":[{"related-to":"logical-link","relationship-data":[{"relationship-key":"logical-link.link-name","relationship-value":"${LOGICALLINKKEYVALUE}"}]}]}}}}}}
+${LOGICALLINKDATA} {"link-name":"${LOGICALLINKKEYVALUE}","link-type":"example-link-type-value-val-126","speed-value":"example-speed-value-val-126","speed-units":"example-speed-units-val-126","ip-version":"example-ip-version-val-126","routing-protocol":"example-routing-protocol-val-126","resource-model-uuid":"example-resource-model-uuid-val-5465"}
+
+*** Test Cases ***
+Run AAI Put logical-link
+ [Documentation] Create an logical-link object
+ ${resp}= PutWithCert ${LOGICALLINKURL} ${LOGICALLINKDATA}
+ log ${LOGICALLINKURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get logical-link
+ [Documentation] Get the logical-link object just created
+ ${resp} GetWithCert ${LOGICALLINKURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put customer rel with logical-link
+ [Documentation] Create customer rel with logical-link
+ ${resp}= PutWithCert ${CUSTOMERURL} ${CUSTOMERDATA}
+ log ${CUSTOMERURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get customer to delete
+ [Documentation] Get the customer
+ ${resp} GetWithCert ${CUSTOMERURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete customer
+ [Documentation] Delete the customer
+ ${resp}= DeleteWithCert ${CUSTOMERURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get logical-link should not found error 404
+ [Documentation] Get logical-link should not found error 404
+ ${resp} GetWithCert ${LOGICALLINKURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 404
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PatchWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.patch('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp} \ No newline at end of file
diff --git a/tests/aai/resources/db_edge_rule/edge_multiplicity_one_2_one.robot b/tests/aai/resources/db_edge_rule/edge_multiplicity_one_2_one.robot
new file mode 100644
index 00000000..bb0a2a40
--- /dev/null
+++ b/tests/aai/resources/db_edge_rule/edge_multiplicity_one_2_one.robot
@@ -0,0 +1,224 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${CRKEYVALUE1} cr-integration-test1
+${CRKEYVALUE2} cr-integration-test2
+${TENANTKEYVALUE} tenant-integration-test1
+${VSERVERKEYVALUE1} vserver-integration-test1
+${VSERVERKEYVALUE2} vserver-integration-test2
+${SNAPSHOTKEYVALUE1} snapshot-integration-test1
+${SNAPSHOTKEYVALUE2} snapshot-integration-test2
+
+${CRURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/${CRKEYVALUE1}/${CRKEYVALUE2}
+${TENANTURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/${CRKEYVALUE1}/${CRKEYVALUE2}/tenants/tenant/${TENANTKEYVALUE}
+${VSERVERURL1} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/${CRKEYVALUE1}/${CRKEYVALUE2}/tenants/tenant/${TENANTKEYVALUE}/vservers/vserver/${VSERVERKEYVALUE1}
+${VSERVERURL2} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/${CRKEYVALUE1}/${CRKEYVALUE2}/tenants/tenant/${TENANTKEYVALUE}/vservers/vserver/${VSERVERKEYVALUE2}
+${SNAPSHOTURL1} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/${CRKEYVALUE1}/${CRKEYVALUE2}/snapshots/snapshot/${SNAPSHOTKEYVALUE1}
+${SNAPSHOTURL2} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/${CRKEYVALUE1}/${CRKEYVALUE2}/snapshots/snapshot/${SNAPSHOTKEYVALUE2}
+${RELATIONSHIPURL1} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/${CRKEYVALUE1}/${CRKEYVALUE2}/tenants/tenant/${TENANTKEYVALUE}/vservers/vserver/${VSERVERKEYVALUE1}/relationship-list/relationship
+${RELATIONSHIPURL2} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/${CRKEYVALUE1}/${CRKEYVALUE2}/snapshots/snapshot/${SNAPSHOTKEYVALUE1}/relationship-list/relationship
+${CRDATA} {"cloud-owner":"${CRKEYVALUE1}","cloud-region-id":"${CRKEYVALUE2}","owner-defined-type":"example-owner-defined-type-987654321-09","cloud-region-version":"example-cloud-region-version-987654321-09","identity-url":"example-identity-url-987654321-09","cloud-zone":"example-cloud-zone-987654321-09","complex-name":"example-complex-name-987654321-09"}
+${TENANTDATA} {"tenant-id":"${TENANTKEYVALUE}","tenant-name":"tenant-name-0999"}
+${VSERVERDATA1} {"vserver-id":"${VSERVERKEYVALUE1}","vserver-name":"example-vserver-name-val-7367","vserver-name2":"example-vserver-name2-val-7367","prov-status":"example-prov-status-val-7367","vserver-selflink":"example-vserver-selflink-val-7367"}
+${VSERVERDATA2} {"vserver-id":"${VSERVERKEYVALUE2}","vserver-name":"example-vserver-name-val-73678","vserver-name2":"example-vserver-name2-val-73867","prov-status":"example-prov-status-val-73867","vserver-selflink":"example-vserver-selflink-val-73687"}
+${SNAPSHOTDATA1} {"snapshot-id":"${SNAPSHOTKEYVALUE1}"}
+${SNAPSHOTDATA2} {"snapshot-id":"${SNAPSHOTKEYVALUE2}"}
+${RELATIONSHIPDATA1} {"related-to":"snapshot","relationship-data":[{"relationship-key":"snapshot.snapshot-id","relationship-value":"${SNAPSHOTKEYVALUE1}"},{"relationship-key":"cloud-region.cloud-owner","relationship-value":"${CRKEYVALUE1}"},{"relationship-key":"cloud-region.cloud-region-id","relationship-value":"${CRKEYVALUE2}"}]}
+${RELATIONSHIPDATA2} {"related-to":"snapshot","relationship-data":[{"relationship-key":"snapshot.snapshot-id","relationship-value":"${SNAPSHOTKEYVALUE2}"},{"relationship-key":"cloud-region.cloud-owner","relationship-value":"${CRKEYVALUE1}"},{"relationship-key":"cloud-region.cloud-region-id","relationship-value":"${CRKEYVALUE2}"}]}
+${RELATIONSHIPDATA3} {"related-to":"vserver","relationship-data":[{"relationship-key":"vserver.vserver-id","relationship-value":"${VSERVERKEYVALUE2}"},{"relationship-key":"tenant.tenant-id","relationship-value":"${TENANTKEYVALUE}"},{"relationship-key":"cloud-region.cloud-owner","relationship-value":"${CRKEYVALUE1}"},{"relationship-key":"cloud-region.cloud-region-id","relationship-value":"${CRKEYVALUE2}"}]}
+
+*** Test Cases ***
+Run AAI Put cloud-region
+ [Documentation] Create an cloud-region object
+ ${resp}= PutWithCert ${CRURL} ${CRDATA}
+ log ${CRURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put tenant
+ [Documentation] Create an tenant object
+ ${resp}= PutWithCert ${TENANTURL} ${TENANTDATA}
+ log ${TENANTURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put vserver1
+ [Documentation] Create an vserver1 object
+ ${resp}= PutWithCert ${VSERVERURL1} ${VSERVERDATA1}
+ log ${VSERVERURL1}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put vserver2
+ [Documentation] Create an vserver2 object
+ ${resp}= PutWithCert ${VSERVERURL2} ${VSERVERDATA2}
+ log ${VSERVERURL2}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put snapshot1
+ [Documentation] Create an snapshot1 object
+ ${resp}= PutWithCert ${SNAPSHOTURL1} ${SNAPSHOTDATA1}
+ log ${SNAPSHOTURL1}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put snapshot2
+ [Documentation] Create an snapshot2 object
+ ${resp}= PutWithCert ${SNAPSHOTURL2} ${SNAPSHOTDATA2}
+ log ${SNAPSHOTURL2}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put relationship vserver1 and snapshot1
+ [Documentation] Create relationship vserver1 and snapshot1
+ ${resp}= PutWithCert ${RELATIONSHIPURL1} ${RELATIONSHIPDATA1}
+ log ${RELATIONSHIPURL1}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put relationship vserver1 and snapshot2 (NOT ALLOW)
+ [Documentation] Create relationship vserver1 and snapshot2 (NOT ALLOW)
+ ${resp}= PutWithCert ${RELATIONSHIPURL1} ${RELATIONSHIPDATA2}
+ log ${RELATIONSHIPURL1}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 400
+
+Run AAI Put relationship snapshot1 and vserver2 (NOT ALLOW)
+ [Documentation] Create relationship snapshot1 and vserver2 (NOT ALLOW)
+ ${resp}= PutWithCert ${RELATIONSHIPURL2} ${RELATIONSHIPDATA3}
+ log ${RELATIONSHIPURL2}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 400
+
+Run AAI Get vserver1 to delete
+ [Documentation] Get vserver1 object to delete
+ ${resp} GetWithCert ${VSERVERURL1}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete vserver1
+ [Documentation] Delete the vserver1
+ ${resp}= DeleteWithCert ${VSERVERURL1}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get vserver2 to delete
+ [Documentation] Get vserver2 object to delete
+ ${resp} GetWithCert ${VSERVERURL2}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete vserver2
+ [Documentation] Delete the vserver2
+ ${resp}= DeleteWithCert ${VSERVERURL2}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get snapshot1 to delete
+ [Documentation] Get snapshot1 object to delete
+ ${resp} GetWithCert ${SNAPSHOTURL1}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete snapshot1
+ [Documentation] Delete the snapshot1
+ ${resp}= DeleteWithCert ${SNAPSHOTURL1}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get snapshot2 to delete
+ [Documentation] Get snapshot2 object to delete
+ ${resp} GetWithCert ${SNAPSHOTURL2}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete snapshot2
+ [Documentation] Delete the snapshot2
+ ${resp}= DeleteWithCert ${SNAPSHOTURL2}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get tenant to delete
+ [Documentation] Get tenant object to delete
+ ${resp} GetWithCert ${TENANTURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete tenant
+ [Documentation] Delete the tenant
+ ${resp}= DeleteWithCert ${TENANTURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get cr to delete
+ [Documentation] Get cr object to delete
+ ${resp} GetWithCert ${CRURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete cr
+ [Documentation] Delete the cr
+ ${resp}= DeleteWithCert ${CRURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PatchWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.patch('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp} \ No newline at end of file
diff --git a/tests/aai/resources/db_edge_rule/prevent_delete.robot b/tests/aai/resources/db_edge_rule/prevent_delete.robot
new file mode 100644
index 00000000..beae2da5
--- /dev/null
+++ b/tests/aai/resources/db_edge_rule/prevent_delete.robot
@@ -0,0 +1,131 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${CRKEYVALUE7} cr-integration-test7
+${CRKEYVALUE8} cr-integration-test8
+${TENANTKEYVALUE} tenant-integration-test7
+${VSERVERKEYVALUE} vserver-integration-test7
+
+${CRURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/${CRKEYVALUE7}/${CRKEYVALUE8}
+${TENANTURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/${CRKEYVALUE7}/${CRKEYVALUE8}/tenants/tenant/${TENANTKEYVALUE}
+${VSERVERURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/${CRKEYVALUE7}/${CRKEYVALUE8}/tenants/tenant/${TENANTKEYVALUE}/vservers/vserver/${VSERVERKEYVALUE}
+${CRDATA} {"cloud-owner":"${CRKEYVALUE7}","cloud-region-id":"${CRKEYVALUE8}","owner-defined-type":"example-owner-defined-type-98787654321-09","cloud-region-version":"example-cloud-region-version-98765784321-09","identity-url":"example-identity-url-98765437821-09","cloud-zone":"example-cloud-zone-98765784321-09","complex-name":"example-complex-name-98765874321-09"}
+${TENANTDATA} {"tenant-id":"${TENANTKEYVALUE}","tenant-name":"example-tenant-name-val-143742","vservers":{"vserver":[{"vserver-id":"${VSERVERKEYVALUE}","vserver-name":"example-vserver-name-val-357201","vserver-name2":"example-vserver-name2-val-672821","prov-status":"example-prov-status-val-137711","vserver-selflink":"example-vserver-selflink-val-58731","in-maint":true,"is-closed-loop-disabled":true}]}}
+
+
+*** Test Cases ***
+Run AAI Put cloud-region
+ [Documentation] Create an cloud-region object
+ ${resp}= PutWithCert ${CRURL} ${CRDATA}
+ log ${CRURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put tenant
+ [Documentation] Create an tenant object
+ ${resp}= PutWithCert ${TENANTURL} ${TENANTDATA}
+ log ${TENANTURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get tenant to delete
+ [Documentation] Get tenant object to delete
+ ${resp} GetWithCert ${TENANTURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete tenant
+ [Documentation] Delete the tenant
+ ${resp}= DeleteWithCert ${TENANTURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 400
+
+Run AAI Get vserver to delete
+ [Documentation] Get vserver object to delete
+ ${resp} GetWithCert ${VSERVERURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete vserver
+ [Documentation] Delete the vserver
+ ${resp}= DeleteWithCert ${VSERVERURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get tenant to delete
+ [Documentation] Get tenant object to delete
+ ${resp} GetWithCert ${TENANTURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete tenant
+ [Documentation] Delete the tenant
+ ${resp}= DeleteWithCert ${TENANTURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get cr to delete
+ [Documentation] Get cr object to delete
+ ${resp} GetWithCert ${CRURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete cr
+ [Documentation] Delete the cr
+ ${resp}= DeleteWithCert ${CRURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PatchWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.patch('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp} \ No newline at end of file
diff --git a/tests/aai/resources/error_handling_suite/__init__.robot b/tests/aai/resources/error_handling_suite/__init__.robot
new file mode 100644
index 00000000..538def84
--- /dev/null
+++ b/tests/aai/resources/error_handling_suite/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Resources - Pserver Suite
diff --git a/tests/aai/resources/error_handling_suite/aai.crt b/tests/aai/resources/error_handling_suite/aai.crt
new file mode 100644
index 00000000..6a28bbb8
--- /dev/null
+++ b/tests/aai/resources/error_handling_suite/aai.crt
@@ -0,0 +1,70 @@
+Bag Attributes
+ friendlyName: aaiopenecomp
+ localKeyID: 54 69 6D 65 20 31 35 30 34 38 33 32 34 34 33 32 39 32
+subject=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=SimpleDemo/CN=aai.api.simpledemo.openecomp.org/emailAddress=aai-host@api.simpledemo.openecomp.org
+issuer=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Server CA X1/emailAddress=simpledemo@openecomp.org
+-----BEGIN CERTIFICATE-----
+MIIEiTCCA3GgAwIBAgIJAIPKfDLcn3MpMA0GCSqGSIb3DQEBCwUAMIGtMQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCTkoxEzARBgNVBAcMCkJlZG1pbnN0ZXIxEjAQBgNV
+BAoMCU9wZW5FQ09NUDETMBEGA1UECwwKc2ltcGxlZGVtbzEqMCgGA1UEAwwhT3Bl
+bkVDT01QIHNpbXBsZWRlbW8gU2VydmVyIENBIFgxMScwJQYJKoZIhvcNAQkBFhhz
+aW1wbGVkZW1vQG9wZW5lY29tcC5vcmcwHhcNMTYxMTMwMTUzODM5WhcNMTcxMTMw
+MTUzODM5WjCBuTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5KMRMwEQYDVQQHDApC
+ZWRtaW5zdGVyMRIwEAYDVQQKDAlPcGVuRUNPTVAxEzARBgNVBAsMClNpbXBsZURl
+bW8xKTAnBgNVBAMMIGFhaS5hcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAub3JnMTQw
+MgYJKoZIhvcNAQkBFiVhYWktaG9zdEBhcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAu
+b3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwQrQl8A0rT0Jjlos
+Mr/7LEhT5UOif4GGPOk+3NCIxT3lOqAbUf+d9ZXyT2jWFRiKWua03vQ+Dxc8c2h2
+RRuH8LwEiOiWqPjWRxNqsARzZMI3ryHFCFBZh0FcpjH9kEeKVlLDYuV68k+ZucKd
+NiqUNn61lD7kbmEGwvzKwf91FrJ09+CBMx1OnWKm3gCNKDqAEFMZCOdn2MgesJYB
+/03lzPBS1jDfBXImXRcTBzpgA+wdCLn0cIQ1eLWUwS5tUqUJNh36nHdVyJ0P2Yjd
+JLuxhFcmBKOz1ShyyO+BBtKBO8EGbU6qKflOiwOw0Fsn8LjKcrHQ58NPui5y04BU
+Rypf3QIDAQABo4GdMIGaMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgO4MB0G
+A1UdDgQWBBQyMUOsE2J+CKzK0qd8KFBD2gaWyjBbBgNVHSAEVDBSMFAGBFUdIAAw
+SDBGBggrBgEFBQcCAjA6GjhLZWVwIGF3YXkgZnJvbSBjaGlsZHJlbi4gIFRoaXMg
+Y2VydGlmaWNhdGUgaXMgbm90IGEgdG95LjANBgkqhkiG9w0BAQsFAAOCAQEAnkoy
+2tWJOyyyIQwtVojUxv1GWQPnw3WCUcKpuX4CJhHXLxNErW1fBg7bmo08BNmBPPpq
+WrJsy5lbBgUo9kgpViux5Stfy1rRIRsRLfl/icgCvJmUAxkmRCZL7yUvwG4K7s+8
+DwT+nW/XuWNP6Hd/qHccexB6COJ8KwvTdVoxAkCdX8qw4MCb/f7Kb1yle/vwBM5Q
+UUONCJ4bEns1vnb9DGlNDUJNwCfwORAaVJpVS38Mv4UnSTmb2KMePtCWcx/dNsYR
+2XrSGqLDnTvHwOpyhbfFTmackysGoSuDytORXy8YbwEiF13BwEK8i3rgNN0Z2ojf
+cpmE2xxmaa+A2uuN6g==
+-----END CERTIFICATE-----
+Bag Attributes
+ friendlyName: root
+ 2.16.840.1.113894.746875.1.1: <Unsupported tag 6>
+subject=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Server CA X1/emailAddress=simpledemo@openecomp.org
+issuer=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Root Certification Authority/emailAddress=simpledemo@openecomp.org
+-----BEGIN CERTIFICATE-----
+MIIFpTCCA42gAwIBAgIJAJqx8dKnCZZoMA0GCSqGSIb3DQEBCwUAMIG9MQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCTkoxEzARBgNVBAcMCkJlZG1pbnN0ZXIxEjAQBgNV
+BAoMCU9wZW5FQ09NUDETMBEGA1UECwwKc2ltcGxlZGVtbzE6MDgGA1UEAwwxT3Bl
+bkVDT01QIHNpbXBsZWRlbW8gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEn
+MCUGCSqGSIb3DQEJARYYc2ltcGxlZGVtb0BvcGVuZWNvbXAub3JnMB4XDTE2MTEy
+ODIxMTQyNloXDTIxMTEyNzIxMTQyNlowga0xCzAJBgNVBAYTAlVTMQswCQYDVQQI
+DAJOSjETMBEGA1UEBwwKQmVkbWluc3RlcjESMBAGA1UECgwJT3BlbkVDT01QMRMw
+EQYDVQQLDApzaW1wbGVkZW1vMSowKAYDVQQDDCFPcGVuRUNPTVAgc2ltcGxlZGVt
+byBTZXJ2ZXIgQ0EgWDExJzAlBgkqhkiG9w0BCQEWGHNpbXBsZWRlbW9Ab3BlbmVj
+b21wLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr4rivKQuRk
+YNf5Ig40e1nqj6s6LB1vgMOYbKfRziOFpPcUpsHPOhusHowiUsrU1vdFSzPz6Ej7
+PjlmNSg2Qka8YCn9kd6QgM7U0KcPJvIucBp+qjifH3EvP0jgDPhDeVRYxzV454dv
+5kQ9uCpswJP7YAnX51dkWeH8nwPUoagt31bOl9LXENSrgxEThxdLYMJnQJWk2CmV
+otXM4tT1dxyJxFUrZ6uJCEAYw5VtlplqihHf8lHy+sWQavtsLz/4dc+sGeXSTfoI
+voKvoh3uZ5gEhGV8yfJxk1veX5y5/AxP80vQ+smWYjTnQL5QQ57y4bciez4XVBmQ
+SWimWtOi4e8CAwEAAaOBtTCBsjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBhjAdBgNVHQ4EFgQUTqdsYgGNGubdJHq9tsaJhM9HE5wwcAYDVR0gBGkwZzBl
+BgRVHSAAMF0wWwYIKwYBBQUHAgIwTxpNSWYgeW91IHRydXN0IHRoaXMgY2VydCB0
+aGVuIHdlIGhhdmUgYSBicmlkZ2UgdGhhdCB5b3UgbWlnaHQgYmUgaW50ZXJlc3Rl
+ZCBpbi4wDQYJKoZIhvcNAQELBQADggIBAKNNlRqFuE/JgV1BHyYK0xoSXH4aZP/7
+IoHtDVcSaZAOOuFOUrwVMUbzRBebbb6RpFwt/X+NLFUGysd+XNLF7W7lzxKtmFNX
+n4OpNkBe0y5O7yurus8rERHzu3jiOSgVo+WzDlGpYSRnG3hI2qPWqD+Puzx/WwI8
+XUTuzEQQ3gUSyVFfXHpay3VpYmLZiLJ9WKY5SDw7Ie6Sxrju4Qm1HwnFY8wHZGcs
+2KMQzorJ1ZNQf523yUTghbT0rKaSFaD8zugPtI2ONfFG/QgrkQXo78opzPsHnHwa
+SxGSiAgeLbwAUCvPNl27zr6k6+7TcNjV0VUivAs0OG3VEAdgi7UWYB+30KfWwHwE
+zGmvd4IAGqIqlqLcSVArN5z8JK1B5nfjQn5UrclU1vK+dnuiKE2X4rKuBTRYRFR/
+km+mj4koYFPKFHndmJl1uv2OCJK9l5CSIuKWeI1qv8BASKqgNdoT/SKBXqxgYlCb
+o+j4IDjxrxChRO+e5vl9lA7INfRrbljCkUjfLRa+v2q9tWQ3+EQUwwnSrSfihh2T
+j0Tksr6b8dDsvMlCdOKG1B+JPcEXORSFKNXVTEfjqpJG8s16kFAocWt3S6xO0k1t
+qbQp+3tWQgW2TGnX0rMZzB6NGRNfWhlYmq2zHgXkiCIZ26Ztgt/LNbwEvN3+VlLo
+z/Rd+SKtlrfb
+-----END CERTIFICATE-----
diff --git a/tests/aai/resources/error_handling_suite/aai.key b/tests/aai/resources/error_handling_suite/aai.key
new file mode 100644
index 00000000..02724df4
--- /dev/null
+++ b/tests/aai/resources/error_handling_suite/aai.key
@@ -0,0 +1,32 @@
+Bag Attributes
+ friendlyName: aaiopenecomp
+ localKeyID: 54 69 6D 65 20 31 35 30 34 38 33 32 34 34 33 32 39 32
+Key Attributes: <No Attributes>
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBCtCXwDStPQmO
+Wiwyv/ssSFPlQ6J/gYY86T7c0IjFPeU6oBtR/531lfJPaNYVGIpa5rTe9D4PFzxz
+aHZFG4fwvASI6Jao+NZHE2qwBHNkwjevIcUIUFmHQVymMf2QR4pWUsNi5XryT5m5
+wp02KpQ2frWUPuRuYQbC/MrB/3UWsnT34IEzHU6dYqbeAI0oOoAQUxkI52fYyB6w
+lgH/TeXM8FLWMN8FciZdFxMHOmAD7B0IufRwhDV4tZTBLm1SpQk2Hfqcd1XInQ/Z
+iN0ku7GEVyYEo7PVKHLI74EG0oE7wQZtTqop+U6LA7DQWyfwuMpysdDnw0+6LnLT
+gFRHKl/dAgMBAAECggEBAJko2HkeIW01mUhdWOXnFgR7WjzzXZEmlffr41lVBr7f
+rejGsQZs9cms73R7rCdOsi8PDoA6bqaQfADg571K659fvYVWbHqh+3im+iWvUlKm
+GYIVG/vNrEq43CZsUU7Qw/xba/QiOFraNxCATTV1sORPwgddouXEi5XW9ZPX9/FJ
+wORx4L/K0DfHX1rr+rtOoHCJdZYhn3Ij87kmR8Mwg0fNeWhHqtxUEyM/itRjCvOe
+mgt2V8DORhmq12L4+5QJctBrkBVRp9Rh6YSZZBGnKbTSgf4q648BdkJDLSK4cguT
+D6BAw3gxj5V4wt5W0wn2JpjadFwnixrTzvMP/yAqfK0CgYEA93nBAoUPw8nzQkwk
+8iWBjfJ999Rw92hnnvk3xbcQcGfgUYuB4dxwe6FQTmFIVylt81er1YUvMb3ao7fo
+5ZcGnI5p1idjsd27kbZJLxb5Oh919hKu5IfkfYsVgnC0UdKCTgH5CaH0U4ATuXwt
+RL6qm0XcLALs5y2OO6z3s+mYhisCgYEAx7EQ8MA45bkXnRQiHBhGcIIcr2sRDfVJ
+OhHmGxx3EcYgtsIYKTqtQOyIt/nQxo6iyNL9bzfzBTybFJLuj63ZG1Ef4LosJedl
+eAU2NsKv5MlKYDSdNbLAJ0Op9I2Xu/pXQecPwY/3MkIQArdQCLevMLEGywCsuJTn
+BjkJNDkb9hcCgYAhoFiaiAwJVYKJSqFmibQd3opBR4uGApi54DE021gPff3b9rHS
+R8q88cFgtRVISqfW/d2qaKtt/dcckdvCfo/2a99zqux/+ZoIBZXSITQCMs4rfoRn
+JxPj/ycQD1JhH9J22QvGxEvXoLqNZJMeGS5DZO2yyT75dpYyA6Gwv5fq+wKBgQC5
+AhV917lfLELyZurLOLpaFlHZO8rLMcusH1UfHRo7v2IjsGOOHyzRD9QDD1IcA55R
+jRj8Z8uhuGq9fvvC5gBVTK3KGPI6E85wifOWfH1V7CAaTeSxEXDxb8EQL/a6U89v
+4VE5tdYCHC6VNZzS1staw0hV38QmJt57Z3Bdj+OV9QKBgE/b9fxpo+SVQ37BzNNY
+SEKTTijaddz8fdomApg6a2eFJL93Ej/op7N7gnHtPWMivPnRRza9ZjfnG+aZ7n2J
+sWyBiZK9xliS2TsF3l3q9Z0Vaq3i1nOlV7Bd20ZS8KjQjDtKnIRfLkQDkvmXbU5L
+emwkdsQZbpPFJch3mCGtI7JW
+-----END PRIVATE KEY-----
diff --git a/tests/aai/resources/error_handling_suite/error_403.robot b/tests/aai/resources/error_handling_suite/error_403.robot
new file mode 100644
index 00000000..8178368a
--- /dev/null
+++ b/tests/aai/resources/error_handling_suite/error_403.robot
@@ -0,0 +1,47 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${COMPLEXURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/complexes?depth=all
+
+*** Test Cases ***
+Run AAI Get all complex
+ [Documentation] Get all complex - not all depth=all
+ ${resp} GetWithCert ${COMPLEXURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 403
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp} \ No newline at end of file
diff --git a/tests/aai/resources/error_handling_suite/error_412_404.robot b/tests/aai/resources/error_handling_suite/error_412_404.robot
new file mode 100644
index 00000000..2d855d51
--- /dev/null
+++ b/tests/aai/resources/error_handling_suite/error_412_404.robot
@@ -0,0 +1,78 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${PSERVERKEYVALUE} pserver-integration-test1
+${PSERVERURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/pservers/pserver/${PSERVERKEYVALUE}
+${PSERVERDATA} {"hostname":"${PSERVERKEYVALUE}"}
+
+*** Test Cases ***
+Run AAI Put Pserver
+ [Documentation] Create an pserver object
+ ${resp}= PutWithCert ${PSERVERURL} ${PSERVERDATA}
+ log ${PSERVERURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put Pserver again
+ [Documentation] Create an pserver object again without resource-version
+ ${resp}= PutWithCert ${PSERVERURL} ${PSERVERDATA}
+ log ${PSERVERURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 412
+
+Run AAI Get Pserver
+ [Documentation] Get the pserver object just created
+ ${resp} GetWithCert ${PSERVERURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete Pserver
+ [Documentation] Delete the pserver just created
+ ${resp}= DeleteWithCert ${PSERVERURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get Pserver
+ [Documentation] Get the pserver object just deleted
+ ${resp} GetWithCert ${PSERVERURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 404
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp} \ No newline at end of file
diff --git a/tests/aai/resources/relationship_suite/__init__.robot b/tests/aai/resources/relationship_suite/__init__.robot
new file mode 100644
index 00000000..de8f659d
--- /dev/null
+++ b/tests/aai/resources/relationship_suite/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Resources - complex Suite
diff --git a/tests/aai/resources/relationship_suite/aai.crt b/tests/aai/resources/relationship_suite/aai.crt
new file mode 100644
index 00000000..6a28bbb8
--- /dev/null
+++ b/tests/aai/resources/relationship_suite/aai.crt
@@ -0,0 +1,70 @@
+Bag Attributes
+ friendlyName: aaiopenecomp
+ localKeyID: 54 69 6D 65 20 31 35 30 34 38 33 32 34 34 33 32 39 32
+subject=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=SimpleDemo/CN=aai.api.simpledemo.openecomp.org/emailAddress=aai-host@api.simpledemo.openecomp.org
+issuer=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Server CA X1/emailAddress=simpledemo@openecomp.org
+-----BEGIN CERTIFICATE-----
+MIIEiTCCA3GgAwIBAgIJAIPKfDLcn3MpMA0GCSqGSIb3DQEBCwUAMIGtMQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCTkoxEzARBgNVBAcMCkJlZG1pbnN0ZXIxEjAQBgNV
+BAoMCU9wZW5FQ09NUDETMBEGA1UECwwKc2ltcGxlZGVtbzEqMCgGA1UEAwwhT3Bl
+bkVDT01QIHNpbXBsZWRlbW8gU2VydmVyIENBIFgxMScwJQYJKoZIhvcNAQkBFhhz
+aW1wbGVkZW1vQG9wZW5lY29tcC5vcmcwHhcNMTYxMTMwMTUzODM5WhcNMTcxMTMw
+MTUzODM5WjCBuTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5KMRMwEQYDVQQHDApC
+ZWRtaW5zdGVyMRIwEAYDVQQKDAlPcGVuRUNPTVAxEzARBgNVBAsMClNpbXBsZURl
+bW8xKTAnBgNVBAMMIGFhaS5hcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAub3JnMTQw
+MgYJKoZIhvcNAQkBFiVhYWktaG9zdEBhcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAu
+b3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwQrQl8A0rT0Jjlos
+Mr/7LEhT5UOif4GGPOk+3NCIxT3lOqAbUf+d9ZXyT2jWFRiKWua03vQ+Dxc8c2h2
+RRuH8LwEiOiWqPjWRxNqsARzZMI3ryHFCFBZh0FcpjH9kEeKVlLDYuV68k+ZucKd
+NiqUNn61lD7kbmEGwvzKwf91FrJ09+CBMx1OnWKm3gCNKDqAEFMZCOdn2MgesJYB
+/03lzPBS1jDfBXImXRcTBzpgA+wdCLn0cIQ1eLWUwS5tUqUJNh36nHdVyJ0P2Yjd
+JLuxhFcmBKOz1ShyyO+BBtKBO8EGbU6qKflOiwOw0Fsn8LjKcrHQ58NPui5y04BU
+Rypf3QIDAQABo4GdMIGaMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgO4MB0G
+A1UdDgQWBBQyMUOsE2J+CKzK0qd8KFBD2gaWyjBbBgNVHSAEVDBSMFAGBFUdIAAw
+SDBGBggrBgEFBQcCAjA6GjhLZWVwIGF3YXkgZnJvbSBjaGlsZHJlbi4gIFRoaXMg
+Y2VydGlmaWNhdGUgaXMgbm90IGEgdG95LjANBgkqhkiG9w0BAQsFAAOCAQEAnkoy
+2tWJOyyyIQwtVojUxv1GWQPnw3WCUcKpuX4CJhHXLxNErW1fBg7bmo08BNmBPPpq
+WrJsy5lbBgUo9kgpViux5Stfy1rRIRsRLfl/icgCvJmUAxkmRCZL7yUvwG4K7s+8
+DwT+nW/XuWNP6Hd/qHccexB6COJ8KwvTdVoxAkCdX8qw4MCb/f7Kb1yle/vwBM5Q
+UUONCJ4bEns1vnb9DGlNDUJNwCfwORAaVJpVS38Mv4UnSTmb2KMePtCWcx/dNsYR
+2XrSGqLDnTvHwOpyhbfFTmackysGoSuDytORXy8YbwEiF13BwEK8i3rgNN0Z2ojf
+cpmE2xxmaa+A2uuN6g==
+-----END CERTIFICATE-----
+Bag Attributes
+ friendlyName: root
+ 2.16.840.1.113894.746875.1.1: <Unsupported tag 6>
+subject=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Server CA X1/emailAddress=simpledemo@openecomp.org
+issuer=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Root Certification Authority/emailAddress=simpledemo@openecomp.org
+-----BEGIN CERTIFICATE-----
+MIIFpTCCA42gAwIBAgIJAJqx8dKnCZZoMA0GCSqGSIb3DQEBCwUAMIG9MQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCTkoxEzARBgNVBAcMCkJlZG1pbnN0ZXIxEjAQBgNV
+BAoMCU9wZW5FQ09NUDETMBEGA1UECwwKc2ltcGxlZGVtbzE6MDgGA1UEAwwxT3Bl
+bkVDT01QIHNpbXBsZWRlbW8gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEn
+MCUGCSqGSIb3DQEJARYYc2ltcGxlZGVtb0BvcGVuZWNvbXAub3JnMB4XDTE2MTEy
+ODIxMTQyNloXDTIxMTEyNzIxMTQyNlowga0xCzAJBgNVBAYTAlVTMQswCQYDVQQI
+DAJOSjETMBEGA1UEBwwKQmVkbWluc3RlcjESMBAGA1UECgwJT3BlbkVDT01QMRMw
+EQYDVQQLDApzaW1wbGVkZW1vMSowKAYDVQQDDCFPcGVuRUNPTVAgc2ltcGxlZGVt
+byBTZXJ2ZXIgQ0EgWDExJzAlBgkqhkiG9w0BCQEWGHNpbXBsZWRlbW9Ab3BlbmVj
+b21wLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr4rivKQuRk
+YNf5Ig40e1nqj6s6LB1vgMOYbKfRziOFpPcUpsHPOhusHowiUsrU1vdFSzPz6Ej7
+PjlmNSg2Qka8YCn9kd6QgM7U0KcPJvIucBp+qjifH3EvP0jgDPhDeVRYxzV454dv
+5kQ9uCpswJP7YAnX51dkWeH8nwPUoagt31bOl9LXENSrgxEThxdLYMJnQJWk2CmV
+otXM4tT1dxyJxFUrZ6uJCEAYw5VtlplqihHf8lHy+sWQavtsLz/4dc+sGeXSTfoI
+voKvoh3uZ5gEhGV8yfJxk1veX5y5/AxP80vQ+smWYjTnQL5QQ57y4bciez4XVBmQ
+SWimWtOi4e8CAwEAAaOBtTCBsjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBhjAdBgNVHQ4EFgQUTqdsYgGNGubdJHq9tsaJhM9HE5wwcAYDVR0gBGkwZzBl
+BgRVHSAAMF0wWwYIKwYBBQUHAgIwTxpNSWYgeW91IHRydXN0IHRoaXMgY2VydCB0
+aGVuIHdlIGhhdmUgYSBicmlkZ2UgdGhhdCB5b3UgbWlnaHQgYmUgaW50ZXJlc3Rl
+ZCBpbi4wDQYJKoZIhvcNAQELBQADggIBAKNNlRqFuE/JgV1BHyYK0xoSXH4aZP/7
+IoHtDVcSaZAOOuFOUrwVMUbzRBebbb6RpFwt/X+NLFUGysd+XNLF7W7lzxKtmFNX
+n4OpNkBe0y5O7yurus8rERHzu3jiOSgVo+WzDlGpYSRnG3hI2qPWqD+Puzx/WwI8
+XUTuzEQQ3gUSyVFfXHpay3VpYmLZiLJ9WKY5SDw7Ie6Sxrju4Qm1HwnFY8wHZGcs
+2KMQzorJ1ZNQf523yUTghbT0rKaSFaD8zugPtI2ONfFG/QgrkQXo78opzPsHnHwa
+SxGSiAgeLbwAUCvPNl27zr6k6+7TcNjV0VUivAs0OG3VEAdgi7UWYB+30KfWwHwE
+zGmvd4IAGqIqlqLcSVArN5z8JK1B5nfjQn5UrclU1vK+dnuiKE2X4rKuBTRYRFR/
+km+mj4koYFPKFHndmJl1uv2OCJK9l5CSIuKWeI1qv8BASKqgNdoT/SKBXqxgYlCb
+o+j4IDjxrxChRO+e5vl9lA7INfRrbljCkUjfLRa+v2q9tWQ3+EQUwwnSrSfihh2T
+j0Tksr6b8dDsvMlCdOKG1B+JPcEXORSFKNXVTEfjqpJG8s16kFAocWt3S6xO0k1t
+qbQp+3tWQgW2TGnX0rMZzB6NGRNfWhlYmq2zHgXkiCIZ26Ztgt/LNbwEvN3+VlLo
+z/Rd+SKtlrfb
+-----END CERTIFICATE-----
diff --git a/tests/aai/resources/relationship_suite/aai.key b/tests/aai/resources/relationship_suite/aai.key
new file mode 100644
index 00000000..02724df4
--- /dev/null
+++ b/tests/aai/resources/relationship_suite/aai.key
@@ -0,0 +1,32 @@
+Bag Attributes
+ friendlyName: aaiopenecomp
+ localKeyID: 54 69 6D 65 20 31 35 30 34 38 33 32 34 34 33 32 39 32
+Key Attributes: <No Attributes>
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBCtCXwDStPQmO
+Wiwyv/ssSFPlQ6J/gYY86T7c0IjFPeU6oBtR/531lfJPaNYVGIpa5rTe9D4PFzxz
+aHZFG4fwvASI6Jao+NZHE2qwBHNkwjevIcUIUFmHQVymMf2QR4pWUsNi5XryT5m5
+wp02KpQ2frWUPuRuYQbC/MrB/3UWsnT34IEzHU6dYqbeAI0oOoAQUxkI52fYyB6w
+lgH/TeXM8FLWMN8FciZdFxMHOmAD7B0IufRwhDV4tZTBLm1SpQk2Hfqcd1XInQ/Z
+iN0ku7GEVyYEo7PVKHLI74EG0oE7wQZtTqop+U6LA7DQWyfwuMpysdDnw0+6LnLT
+gFRHKl/dAgMBAAECggEBAJko2HkeIW01mUhdWOXnFgR7WjzzXZEmlffr41lVBr7f
+rejGsQZs9cms73R7rCdOsi8PDoA6bqaQfADg571K659fvYVWbHqh+3im+iWvUlKm
+GYIVG/vNrEq43CZsUU7Qw/xba/QiOFraNxCATTV1sORPwgddouXEi5XW9ZPX9/FJ
+wORx4L/K0DfHX1rr+rtOoHCJdZYhn3Ij87kmR8Mwg0fNeWhHqtxUEyM/itRjCvOe
+mgt2V8DORhmq12L4+5QJctBrkBVRp9Rh6YSZZBGnKbTSgf4q648BdkJDLSK4cguT
+D6BAw3gxj5V4wt5W0wn2JpjadFwnixrTzvMP/yAqfK0CgYEA93nBAoUPw8nzQkwk
+8iWBjfJ999Rw92hnnvk3xbcQcGfgUYuB4dxwe6FQTmFIVylt81er1YUvMb3ao7fo
+5ZcGnI5p1idjsd27kbZJLxb5Oh919hKu5IfkfYsVgnC0UdKCTgH5CaH0U4ATuXwt
+RL6qm0XcLALs5y2OO6z3s+mYhisCgYEAx7EQ8MA45bkXnRQiHBhGcIIcr2sRDfVJ
+OhHmGxx3EcYgtsIYKTqtQOyIt/nQxo6iyNL9bzfzBTybFJLuj63ZG1Ef4LosJedl
+eAU2NsKv5MlKYDSdNbLAJ0Op9I2Xu/pXQecPwY/3MkIQArdQCLevMLEGywCsuJTn
+BjkJNDkb9hcCgYAhoFiaiAwJVYKJSqFmibQd3opBR4uGApi54DE021gPff3b9rHS
+R8q88cFgtRVISqfW/d2qaKtt/dcckdvCfo/2a99zqux/+ZoIBZXSITQCMs4rfoRn
+JxPj/ycQD1JhH9J22QvGxEvXoLqNZJMeGS5DZO2yyT75dpYyA6Gwv5fq+wKBgQC5
+AhV917lfLELyZurLOLpaFlHZO8rLMcusH1UfHRo7v2IjsGOOHyzRD9QDD1IcA55R
+jRj8Z8uhuGq9fvvC5gBVTK3KGPI6E85wifOWfH1V7CAaTeSxEXDxb8EQL/a6U89v
+4VE5tdYCHC6VNZzS1staw0hV38QmJt57Z3Bdj+OV9QKBgE/b9fxpo+SVQ37BzNNY
+SEKTTijaddz8fdomApg6a2eFJL93Ej/op7N7gnHtPWMivPnRRza9ZjfnG+aZ7n2J
+sWyBiZK9xliS2TsF3l3q9Z0Vaq3i1nOlV7Bd20ZS8KjQjDtKnIRfLkQDkvmXbU5L
+emwkdsQZbpPFJch3mCGtI7JW
+-----END PRIVATE KEY-----
diff --git a/tests/aai/resources/relationship_suite/complex_l3_network.robot b/tests/aai/resources/relationship_suite/complex_l3_network.robot
new file mode 100644
index 00000000..bc08ae91
--- /dev/null
+++ b/tests/aai/resources/relationship_suite/complex_l3_network.robot
@@ -0,0 +1,110 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${COMPLEXKEYVALUE} complex-integration-test2
+${L3NETWORKKEYVALUE} l3-network-integration-test2
+${COMPLEXURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/complexes/complex/${COMPLEXKEYVALUE}
+${L3NETWORKURL} https://${HOST_IP}:8443/aai/v11/network/l3-networks/l3-network/${L3NETWORKKEYVALUE}
+${COMPLEXDATA} {"physical-location-id":"${COMPLEXKEYVALUE}","data-center-code":"example-data-center-code-val-77883","complex-name":"example-complex-name-val-12992","identity-url":"example-identity-url-val-74366","physical-location-type":"example-physical-location-type-val-32854","street1":"example-street1-val-26496","street2":"example-street2-val-6629","city":"example-city-val-30262","state":"example-state-val-9058","postal-code":"example-postal-code-val-44893","country":"example-country-val-98673","region":"example-region-val-10014","latitude":"example-latitude-val-47555","longitude":"example-longitude-val-76903","elevation":"example-elevation-val-63385","lata":"example-lata-val-90935"}
+${L3NETWORKDATA} {"network-id":"${L3NETWORKKEYVALUE}","network-name":"example-network-name-val-5468","network-type":"example-network-type-val-5468","network-role":"example-network-role-val-5468","network-technology":"example-network-technology-val-5468","neutron-network-id":"example-neutron-network-id-val-5468","is-bound-to-vpn":"true","service-id":"example-service-id-val-5468","orchestration-status":"example-orchestration-status-val-5468","heat-stack-id":"example-heat-stack-id-val-5468","mso-catalog-key":"example-mso-catalog-key-val-5468","relationship-list":{"relationship":[{"related-to":"complex","relationship-data":[{"relationship-key":"complex.physical-location-id","relationship-value":"${COMPLEXKEYVALUE}"}]}]}}
+
+*** Test Cases ***
+Run AAI Put complex
+ [Documentation] Create an complex object
+ ${resp}= PutWithCert ${COMPLEXURL} ${COMPLEXDATA}
+ log ${COMPLEXURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get complex
+ [Documentation] Get the complex object just created
+ ${resp} GetWithCert ${COMPLEXURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put l3-network relationship with complex
+ [Documentation] Create l3-network relationship with complex
+ ${resp}= PutWithCert ${L3NETWORKURL} ${L3NETWORKDATA}
+ log ${L3NETWORKURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get l3-network
+ [Documentation] Get the l3-network object just created with relationship with complex
+ ${resp} GetWithCert ${L3NETWORKURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get l3-network to delete
+ [Documentation] Get l3-network object to delete
+ ${resp} GetWithCert ${L3NETWORKURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete l3-network
+ [Documentation] Delete the l3-network just created
+ ${resp}= DeleteWithCert ${L3NETWORKURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get complex to delete
+ [Documentation] Get complex object to delete
+ ${resp} GetWithCert ${COMPLEXURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete complex
+ [Documentation] Delete the complex just created
+ ${resp}= DeleteWithCert ${COMPLEXURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PatchWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.patch('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp} \ No newline at end of file
diff --git a/tests/aai/resources/relationship_suite/pserver_complex_rel_api.robot b/tests/aai/resources/relationship_suite/pserver_complex_rel_api.robot
new file mode 100644
index 00000000..10f2713c
--- /dev/null
+++ b/tests/aai/resources/relationship_suite/pserver_complex_rel_api.robot
@@ -0,0 +1,119 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${COMPLEXKEYVALUE} complex-integration-test3
+${PSERVERKEYVALUE} pserver-integration-test3
+${COMPLEXURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/complexes/complex/${COMPLEXKEYVALUE}
+${PSERVERURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/pservers/pserver/${PSERVERKEYVALUE}
+${PSERVERRELATIONSHIPURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/pservers/pserver/${PSERVERKEYVALUE}/relationship-list/relationship
+${COMPLEXDATA} {"physical-location-id":"${COMPLEXKEYVALUE}","data-center-code":"example-data-center-code-val-77883","complex-name":"example-complex-name-val-12992","identity-url":"example-identity-url-val-74366","physical-location-type":"example-physical-location-type-val-32854","street1":"example-street1-val-26496","street2":"example-street2-val-6629","city":"example-city-val-30262","state":"example-state-val-9058","postal-code":"example-postal-code-val-44893","country":"example-country-val-98673","region":"example-region-val-10014","latitude":"example-latitude-val-47555","longitude":"example-longitude-val-76903","elevation":"example-elevation-val-63385","lata":"example-lata-val-90935"}
+${PSERVERDATA} {"hostname":"${PSERVERKEYVALUE}"}
+${RELATIONSHIPDATA} {"related-to":"complex","relationship-data":[{"relationship-key":"complex.physical-location-id","relationship-value":"${COMPLEXKEYVALUE}"}]}
+
+*** Test Cases ***
+Run AAI Put complex
+ [Documentation] Create an complex object
+ ${resp}= PutWithCert ${COMPLEXURL} ${COMPLEXDATA}
+ log ${COMPLEXURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get complex
+ [Documentation] Get the complex object just created
+ ${resp} GetWithCert ${COMPLEXURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put pserver
+ [Documentation] Create pserver object
+ ${resp}= PutWithCert ${PSERVERURL} ${PSERVERDATA}
+ log ${PSERVERURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get pserver
+ [Documentation] Get the pserver
+ ${resp} GetWithCert ${PSERVERURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put pserver relationship with complex using relationship api
+ [Documentation] Create relationship between pserver and complex
+ ${resp}= PutWithCert ${PSERVERRELATIONSHIPURL} ${RELATIONSHIPDATA}
+ log ${PSERVERRELATIONSHIPURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get pserver to delete
+ [Documentation] Get pserver object to delete
+ ${resp} GetWithCert ${PSERVERURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete pserver
+ [Documentation] Delete the pserver
+ ${resp}= DeleteWithCert ${PSERVERURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get complex to delete
+ [Documentation] Get complex object to delete
+ ${resp} GetWithCert ${COMPLEXURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete complex
+ [Documentation] Delete the complex
+ ${resp}= DeleteWithCert ${COMPLEXURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PatchWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.patch('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp} \ No newline at end of file
diff --git a/tests/aai/resources/relationship_suite/relationship_using_related_link.robot b/tests/aai/resources/relationship_suite/relationship_using_related_link.robot
new file mode 100644
index 00000000..5820d4ac
--- /dev/null
+++ b/tests/aai/resources/relationship_suite/relationship_using_related_link.robot
@@ -0,0 +1,110 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${COMPLEXKEYVALUE} complex-integration-test8
+${L3NETWORKKEYVALUE} l3-network-integration-test8
+${COMPLEXURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/complexes/complex/${COMPLEXKEYVALUE}
+${L3NETWORKURL} https://${HOST_IP}:8443/aai/v11/network/l3-networks/l3-network/${L3NETWORKKEYVALUE}
+${COMPLEXDATA} {"physical-location-id":"${COMPLEXKEYVALUE}","data-center-code":"example-data-center-code-val-77883","complex-name":"example-complex-name-val-12992","identity-url":"example-identity-url-val-74366","physical-location-type":"example-physical-location-type-val-32854","street1":"example-street1-val-26496","street2":"example-street2-val-6629","city":"example-city-val-30262","state":"example-state-val-9058","postal-code":"example-postal-code-val-44893","country":"example-country-val-98673","region":"example-region-val-10014","latitude":"example-latitude-val-47555","longitude":"example-longitude-val-76903","elevation":"example-elevation-val-63385","lata":"example-lata-val-90935"}
+${L3NETWORKDATA} {"network-id":"${L3NETWORKKEYVALUE}","network-name":"example-network-name-val-54688","network-type":"example-network-type-val-57468","network-role":"example-network-role-val-54868","network-technology":"example-network-technology-val-5468","neutron-network-id":"example-neutron-network-id-val-54678","is-bound-to-vpn":"true","service-id":"example-service-id-val-5468","orchestration-status":"example-orchestration-status-val-5468","heat-stack-id":"example-heat-stack-id-val-5468","mso-catalog-key":"example-mso-catalog-key-val-5468","relationship-list":{"relationship":[{"related-to":"complex","related-link":"/aai/v11/cloud-infrastructure/complexes/complex/${COMPLEXKEYVALUE}"}]}}
+
+*** Test Cases ***
+Run AAI Put complex
+ [Documentation] Create an complex object
+ ${resp}= PutWithCert ${COMPLEXURL} ${COMPLEXDATA}
+ log ${COMPLEXURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get complex
+ [Documentation] Get the complex object just created
+ ${resp} GetWithCert ${COMPLEXURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put l3-network relationship with complex
+ [Documentation] Create l3-network relationship with complex
+ ${resp}= PutWithCert ${L3NETWORKURL} ${L3NETWORKDATA}
+ log ${L3NETWORKURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get l3-network
+ [Documentation] Get the l3-network object just created with relationship with complex
+ ${resp} GetWithCert ${L3NETWORKURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get l3-network to delete
+ [Documentation] Get l3-network object to delete
+ ${resp} GetWithCert ${L3NETWORKURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete l3-network
+ [Documentation] Delete the l3-network just created
+ ${resp}= DeleteWithCert ${L3NETWORKURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get complex to delete
+ [Documentation] Get complex object to delete
+ ${resp} GetWithCert ${COMPLEXURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete complex
+ [Documentation] Delete the complex just created
+ ${resp}= DeleteWithCert ${COMPLEXURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PatchWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.patch('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp} \ No newline at end of file
diff --git a/tests/aai/search-data-service/suite1/__init__.robot b/tests/aai/search-data-service/suite1/__init__.robot
new file mode 100644
index 00000000..f14ab69a
--- /dev/null
+++ b/tests/aai/search-data-service/suite1/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Search Service - Suite 1
diff --git a/tests/aai/search-data-service/suite1/private.key b/tests/aai/search-data-service/suite1/private.key
new file mode 100644
index 00000000..3dd54649
--- /dev/null
+++ b/tests/aai/search-data-service/suite1/private.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAmxCmMHlTR7FkdYpW3rEPOYEGEuIC2/tBvzOxsBwhk/G4qyJ4
+4nKRYMJp/4inuh75vzqd/guYqs2bgoywM2eVTsGDv7ccVrub61mB8gs5G/Yc8xFe
+C9yo8WvV3GBMGSnG2VwZceEDygGmapOY4KK0T6eBUf4UFXE33docQPP4OBzTo/LO
+g//FYjQaO+U6y/+pl5cKPorgem78VI82TTo+Kr0z6sPBQy7JpG1j0VaNgy+QwKtG
++VlSgBqysLQEbJFQBugd2TlpbcBnRxVHo0xKUQty8JQWrNpwA5YuB99fdvm+GQ5o
+CyaefObEA1XqzS1KqsPoyaODk5xglbhUUqvCNQIDAQABAoIBADRbOsHDNUtPqgvF
+2e72+Z0A43wcs7py65ATdDtyRCQfyap+yTIsXMm+2utcyMUfEFRxBkdwwuto4MkD
+l7rDjrY4wLNKsFbYoZylbCq9f1rhjoTDqG1449IgBuWR3h/g6zMY1b6NqynZxMbX
+bxbp2NfMRu3YTA+xWpuduUx1E6peCssYU+1+jK30tXhY20eqACBjY6DU8MshIxJu
+Mrxztz5xtjXsiHru8yDtpPhopgAF07TdwCt9JZq9/t+ZOqPl0AIQxOP+prJ+owVU
+nS3yt+QExRsK6Iw9GwoAC0eElDRMnYt957jSxsniOwz1m6po8lkFvblixSQ/OVnt
+h86gWUECgYEAyKyeDy72BO+XRVp0mpQa9R2W5f8eZj+ejFRIsE2m0W1LCaFypV+O
+JZvYcEGj27qFAH5W9WbTSm8okVbLjRbeUU6FPT1l8hbXNnsiwiU6MRyODIbLhkQG
+hHonOfpddsHaUcZe+Hnl3SiSuD/4lPMHYUsQxtnpJI+pcsnuZeYsHAcCgYEAxdD6
+bXLPsjws/RUagph0/yOEEytVUg+plhdmHdihFGuGqHCG/i+eoISX2EfnpyHvYR5m
+9LpaJiWiy04nGSZOn3w32kKQhQYkuwYqw6h1/M5ZwR3j6wc2T8gORHxjC8ZT+LlJ
+OINvCTBQSWmUxFwJ0C1B9JiJtKNGEZm7GlaP2OMCgYBbBvIrsQGn+4aCzyVVeRlB
+Vsq8SZ1ghDtHLHRMhOzG0uzW0YVPvqicJrVnNl89rL3oG2cWqi3t9b5RLy3mMhlm
+iFeoD9HOns3AyNpbdseOv4Uv6XUo0nKiZUal5gu/cu+1aGZsD99VErJ7IYmBBzyx
+xXs2uGIpU4FpsG+TiXU4wQKBgQCQQtD+1IXnY78jaiqFJw3bq1j8adO1Hrr8PGA6
+T+tY6vmvCTFJWg0C3u+lyPqFhlf+qZ9HxkdMHpJUVdBppOgdowdQYs7mVA6hXeP+
+AHLbRNlr3pKCqiXPlQPiqhvJUH+YmfduAVwOhW9nulnFwaFeckLxT/TNCW1mFIjA
+snQBJQKBgQCqH+/K/Dzn0z6vX0APSNM7EBp8ap0qsiLucqGzNxslxwTzinXr5ccl
+8bjJxk6+7qUjWaw66wPn+Qs5buxWrKnbf+T5qmEI0bFaBzUBWrVMx1sMdr1Nj69Y
+waWRQaZ45y8J9wN+flBFp9d5wo5JWk6w54hHMiHeMmuXDCw5zO2YMA==
+-----END RSA PRIVATE KEY-----
diff --git a/tests/aai/search-data-service/suite1/publickey.crt b/tests/aai/search-data-service/suite1/publickey.crt
new file mode 100644
index 00000000..5696aa35
--- /dev/null
+++ b/tests/aai/search-data-service/suite1/publickey.crt
@@ -0,0 +1,25 @@
+Bag Attributes
+ friendlyName: tomcat
+ localKeyID: 54 69 6D 65 20 31 34 39 33 33 32 33 39 32 32 37 35 31
+subject=/C=CA/ST=Ontario/L=Ottawa/O=ONAP/OU=ONAP/CN=ONAP
+issuer=/C=CA/ST=Ontario/L=Ottawa/O=ONAP/OU=ONAP/CN=ONAP
+-----BEGIN CERTIFICATE-----
+MIIDWTCCAkGgAwIBAgIERWHcIzANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJD
+QTEQMA4GA1UECBMHT250YXJpbzEPMA0GA1UEBxMGT3R0YXdhMQ0wCwYDVQQKEwRP
+TkFQMQ0wCwYDVQQLEwRPTkFQMQ0wCwYDVQQDEwRPTkFQMB4XDTE3MDQyNzIwMDUz
+N1oXDTM3MDExMjIwMDUzN1owXTELMAkGA1UEBhMCQ0ExEDAOBgNVBAgTB09udGFy
+aW8xDzANBgNVBAcTBk90dGF3YTENMAsGA1UEChMET05BUDENMAsGA1UECxMET05B
+UDENMAsGA1UEAxMET05BUDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AJsQpjB5U0exZHWKVt6xDzmBBhLiAtv7Qb8zsbAcIZPxuKsieOJykWDCaf+Ip7oe
++b86nf4LmKrNm4KMsDNnlU7Bg7+3HFa7m+tZgfILORv2HPMRXgvcqPFr1dxgTBkp
+xtlcGXHhA8oBpmqTmOCitE+ngVH+FBVxN93aHEDz+Dgc06PyzoP/xWI0GjvlOsv/
+qZeXCj6K4Hpu/FSPNk06Piq9M+rDwUMuyaRtY9FWjYMvkMCrRvlZUoAasrC0BGyR
+UAboHdk5aW3AZ0cVR6NMSlELcvCUFqzacAOWLgffX3b5vhkOaAsmnnzmxANV6s0t
+SqrD6Mmjg5OcYJW4VFKrwjUCAwEAAaMhMB8wHQYDVR0OBBYEFNji+IU70Qgptn4i
+boq/rOKNAg8tMA0GCSqGSIb3DQEBCwUAA4IBAQBc5mJLeeUUzJ4MujZjn0DS3Lvv
+THJTE54Id1euT3ddzfX3htF0Ewd90YzmLuj1y8r8PXj7b/8Bq+cvoKbmJ42c8h3X
+If0tqde+gYWx1X3NAWHwz00Cje9R0KY4Bx1Cvr39jTw/ESnuSQDKPHBnn8WyAS9K
+08ZhvrVSK54d3U7tDVut9UVva8Scdi12utTAWaOIlusLo3bU9Z6t+tgg7AnQBYc0
+N9oCMbq/MACFlLSdc1J6NITYS8XHY2RS8u88eLbWkCcEEx1glYz/PMX3+V1Ow9Uy
+MjenEx8ifl96ZSOe9XsI2gl2TCaevCY/QuREu4LZB9XmO0gncH7gF5w9Bw2b
+-----END CERTIFICATE-----
diff --git a/tests/aai/search-data-service/suite1/test1.robot b/tests/aai/search-data-service/suite1/test1.robot
new file mode 100644
index 00000000..86554a13
--- /dev/null
+++ b/tests/aai/search-data-service/suite1/test1.robot
@@ -0,0 +1,59 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+
+*** Variables ***
+${TARGETURL} https://${HOST_IP}:9509/services/search-data-service/v1/search/indexes/test-index3
+${INDEXDATA} {"fields": [{"name": "Name", "data-type": "string"}, {"name": "Number", "data-type": "long"}]}
+${DOCUMENTDATA} {"Name": "A", "Number": 5}
+
+*** Test Cases ***
+Index Create Test
+ [Documentation] Create an index and verify success
+ ${resp}= PutWithCert ${TARGETURL} ${INDEXDATA}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Insert Document Test
+ [Documentation] Insert a document into the previously created index
+ ${resp}= PutWithCert ${TARGETURL}/documents/testdoc ${DOCUMENTDATA}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Get Document Test
+ [Documentation] Get the document that was just created
+ ${resp} GetWithCert ${TARGETURL}/documents/testdoc
+ ${content}= Evaluate $resp.json().get('content')
+ ${originaljson}= Evaluate json.loads('${DOCUMENTDATA}') json
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Be Equal ${content} ${originaljson}
+
+Delete Index Test
+ [Documentation] Delete the index
+ ${resp}= DeleteWithCert ${TARGETURL}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${certinfo}= Evaluate ('${CURDIR}/publickey.crt', '${CURDIR}/private.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${certinfo}= Evaluate ('${CURDIR}/publickey.crt', '${CURDIR}/private.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${certinfo}= Evaluate ('${CURDIR}/publickey.crt', '${CURDIR}/private.key')
+ ${resp}= Evaluate requests.get('${url}', cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${certinfo}= Evaluate ('${CURDIR}/publickey.crt', '${CURDIR}/private.key')
+ ${resp}= Evaluate requests.delete('${url}', cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
diff --git a/tests/aai/traversal/suite1/__init__.robot b/tests/aai/traversal/suite1/__init__.robot
new file mode 100644
index 00000000..8a1ac102
--- /dev/null
+++ b/tests/aai/traversal/suite1/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Traversal - Suite1
diff --git a/tests/aai/traversal/suite1/aai.crt b/tests/aai/traversal/suite1/aai.crt
new file mode 100644
index 00000000..6a28bbb8
--- /dev/null
+++ b/tests/aai/traversal/suite1/aai.crt
@@ -0,0 +1,70 @@
+Bag Attributes
+ friendlyName: aaiopenecomp
+ localKeyID: 54 69 6D 65 20 31 35 30 34 38 33 32 34 34 33 32 39 32
+subject=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=SimpleDemo/CN=aai.api.simpledemo.openecomp.org/emailAddress=aai-host@api.simpledemo.openecomp.org
+issuer=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Server CA X1/emailAddress=simpledemo@openecomp.org
+-----BEGIN CERTIFICATE-----
+MIIEiTCCA3GgAwIBAgIJAIPKfDLcn3MpMA0GCSqGSIb3DQEBCwUAMIGtMQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCTkoxEzARBgNVBAcMCkJlZG1pbnN0ZXIxEjAQBgNV
+BAoMCU9wZW5FQ09NUDETMBEGA1UECwwKc2ltcGxlZGVtbzEqMCgGA1UEAwwhT3Bl
+bkVDT01QIHNpbXBsZWRlbW8gU2VydmVyIENBIFgxMScwJQYJKoZIhvcNAQkBFhhz
+aW1wbGVkZW1vQG9wZW5lY29tcC5vcmcwHhcNMTYxMTMwMTUzODM5WhcNMTcxMTMw
+MTUzODM5WjCBuTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5KMRMwEQYDVQQHDApC
+ZWRtaW5zdGVyMRIwEAYDVQQKDAlPcGVuRUNPTVAxEzARBgNVBAsMClNpbXBsZURl
+bW8xKTAnBgNVBAMMIGFhaS5hcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAub3JnMTQw
+MgYJKoZIhvcNAQkBFiVhYWktaG9zdEBhcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAu
+b3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwQrQl8A0rT0Jjlos
+Mr/7LEhT5UOif4GGPOk+3NCIxT3lOqAbUf+d9ZXyT2jWFRiKWua03vQ+Dxc8c2h2
+RRuH8LwEiOiWqPjWRxNqsARzZMI3ryHFCFBZh0FcpjH9kEeKVlLDYuV68k+ZucKd
+NiqUNn61lD7kbmEGwvzKwf91FrJ09+CBMx1OnWKm3gCNKDqAEFMZCOdn2MgesJYB
+/03lzPBS1jDfBXImXRcTBzpgA+wdCLn0cIQ1eLWUwS5tUqUJNh36nHdVyJ0P2Yjd
+JLuxhFcmBKOz1ShyyO+BBtKBO8EGbU6qKflOiwOw0Fsn8LjKcrHQ58NPui5y04BU
+Rypf3QIDAQABo4GdMIGaMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgO4MB0G
+A1UdDgQWBBQyMUOsE2J+CKzK0qd8KFBD2gaWyjBbBgNVHSAEVDBSMFAGBFUdIAAw
+SDBGBggrBgEFBQcCAjA6GjhLZWVwIGF3YXkgZnJvbSBjaGlsZHJlbi4gIFRoaXMg
+Y2VydGlmaWNhdGUgaXMgbm90IGEgdG95LjANBgkqhkiG9w0BAQsFAAOCAQEAnkoy
+2tWJOyyyIQwtVojUxv1GWQPnw3WCUcKpuX4CJhHXLxNErW1fBg7bmo08BNmBPPpq
+WrJsy5lbBgUo9kgpViux5Stfy1rRIRsRLfl/icgCvJmUAxkmRCZL7yUvwG4K7s+8
+DwT+nW/XuWNP6Hd/qHccexB6COJ8KwvTdVoxAkCdX8qw4MCb/f7Kb1yle/vwBM5Q
+UUONCJ4bEns1vnb9DGlNDUJNwCfwORAaVJpVS38Mv4UnSTmb2KMePtCWcx/dNsYR
+2XrSGqLDnTvHwOpyhbfFTmackysGoSuDytORXy8YbwEiF13BwEK8i3rgNN0Z2ojf
+cpmE2xxmaa+A2uuN6g==
+-----END CERTIFICATE-----
+Bag Attributes
+ friendlyName: root
+ 2.16.840.1.113894.746875.1.1: <Unsupported tag 6>
+subject=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Server CA X1/emailAddress=simpledemo@openecomp.org
+issuer=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Root Certification Authority/emailAddress=simpledemo@openecomp.org
+-----BEGIN CERTIFICATE-----
+MIIFpTCCA42gAwIBAgIJAJqx8dKnCZZoMA0GCSqGSIb3DQEBCwUAMIG9MQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCTkoxEzARBgNVBAcMCkJlZG1pbnN0ZXIxEjAQBgNV
+BAoMCU9wZW5FQ09NUDETMBEGA1UECwwKc2ltcGxlZGVtbzE6MDgGA1UEAwwxT3Bl
+bkVDT01QIHNpbXBsZWRlbW8gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEn
+MCUGCSqGSIb3DQEJARYYc2ltcGxlZGVtb0BvcGVuZWNvbXAub3JnMB4XDTE2MTEy
+ODIxMTQyNloXDTIxMTEyNzIxMTQyNlowga0xCzAJBgNVBAYTAlVTMQswCQYDVQQI
+DAJOSjETMBEGA1UEBwwKQmVkbWluc3RlcjESMBAGA1UECgwJT3BlbkVDT01QMRMw
+EQYDVQQLDApzaW1wbGVkZW1vMSowKAYDVQQDDCFPcGVuRUNPTVAgc2ltcGxlZGVt
+byBTZXJ2ZXIgQ0EgWDExJzAlBgkqhkiG9w0BCQEWGHNpbXBsZWRlbW9Ab3BlbmVj
+b21wLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr4rivKQuRk
+YNf5Ig40e1nqj6s6LB1vgMOYbKfRziOFpPcUpsHPOhusHowiUsrU1vdFSzPz6Ej7
+PjlmNSg2Qka8YCn9kd6QgM7U0KcPJvIucBp+qjifH3EvP0jgDPhDeVRYxzV454dv
+5kQ9uCpswJP7YAnX51dkWeH8nwPUoagt31bOl9LXENSrgxEThxdLYMJnQJWk2CmV
+otXM4tT1dxyJxFUrZ6uJCEAYw5VtlplqihHf8lHy+sWQavtsLz/4dc+sGeXSTfoI
+voKvoh3uZ5gEhGV8yfJxk1veX5y5/AxP80vQ+smWYjTnQL5QQ57y4bciez4XVBmQ
+SWimWtOi4e8CAwEAAaOBtTCBsjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBhjAdBgNVHQ4EFgQUTqdsYgGNGubdJHq9tsaJhM9HE5wwcAYDVR0gBGkwZzBl
+BgRVHSAAMF0wWwYIKwYBBQUHAgIwTxpNSWYgeW91IHRydXN0IHRoaXMgY2VydCB0
+aGVuIHdlIGhhdmUgYSBicmlkZ2UgdGhhdCB5b3UgbWlnaHQgYmUgaW50ZXJlc3Rl
+ZCBpbi4wDQYJKoZIhvcNAQELBQADggIBAKNNlRqFuE/JgV1BHyYK0xoSXH4aZP/7
+IoHtDVcSaZAOOuFOUrwVMUbzRBebbb6RpFwt/X+NLFUGysd+XNLF7W7lzxKtmFNX
+n4OpNkBe0y5O7yurus8rERHzu3jiOSgVo+WzDlGpYSRnG3hI2qPWqD+Puzx/WwI8
+XUTuzEQQ3gUSyVFfXHpay3VpYmLZiLJ9WKY5SDw7Ie6Sxrju4Qm1HwnFY8wHZGcs
+2KMQzorJ1ZNQf523yUTghbT0rKaSFaD8zugPtI2ONfFG/QgrkQXo78opzPsHnHwa
+SxGSiAgeLbwAUCvPNl27zr6k6+7TcNjV0VUivAs0OG3VEAdgi7UWYB+30KfWwHwE
+zGmvd4IAGqIqlqLcSVArN5z8JK1B5nfjQn5UrclU1vK+dnuiKE2X4rKuBTRYRFR/
+km+mj4koYFPKFHndmJl1uv2OCJK9l5CSIuKWeI1qv8BASKqgNdoT/SKBXqxgYlCb
+o+j4IDjxrxChRO+e5vl9lA7INfRrbljCkUjfLRa+v2q9tWQ3+EQUwwnSrSfihh2T
+j0Tksr6b8dDsvMlCdOKG1B+JPcEXORSFKNXVTEfjqpJG8s16kFAocWt3S6xO0k1t
+qbQp+3tWQgW2TGnX0rMZzB6NGRNfWhlYmq2zHgXkiCIZ26Ztgt/LNbwEvN3+VlLo
+z/Rd+SKtlrfb
+-----END CERTIFICATE-----
diff --git a/tests/aai/traversal/suite1/aai.key b/tests/aai/traversal/suite1/aai.key
new file mode 100644
index 00000000..02724df4
--- /dev/null
+++ b/tests/aai/traversal/suite1/aai.key
@@ -0,0 +1,32 @@
+Bag Attributes
+ friendlyName: aaiopenecomp
+ localKeyID: 54 69 6D 65 20 31 35 30 34 38 33 32 34 34 33 32 39 32
+Key Attributes: <No Attributes>
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBCtCXwDStPQmO
+Wiwyv/ssSFPlQ6J/gYY86T7c0IjFPeU6oBtR/531lfJPaNYVGIpa5rTe9D4PFzxz
+aHZFG4fwvASI6Jao+NZHE2qwBHNkwjevIcUIUFmHQVymMf2QR4pWUsNi5XryT5m5
+wp02KpQ2frWUPuRuYQbC/MrB/3UWsnT34IEzHU6dYqbeAI0oOoAQUxkI52fYyB6w
+lgH/TeXM8FLWMN8FciZdFxMHOmAD7B0IufRwhDV4tZTBLm1SpQk2Hfqcd1XInQ/Z
+iN0ku7GEVyYEo7PVKHLI74EG0oE7wQZtTqop+U6LA7DQWyfwuMpysdDnw0+6LnLT
+gFRHKl/dAgMBAAECggEBAJko2HkeIW01mUhdWOXnFgR7WjzzXZEmlffr41lVBr7f
+rejGsQZs9cms73R7rCdOsi8PDoA6bqaQfADg571K659fvYVWbHqh+3im+iWvUlKm
+GYIVG/vNrEq43CZsUU7Qw/xba/QiOFraNxCATTV1sORPwgddouXEi5XW9ZPX9/FJ
+wORx4L/K0DfHX1rr+rtOoHCJdZYhn3Ij87kmR8Mwg0fNeWhHqtxUEyM/itRjCvOe
+mgt2V8DORhmq12L4+5QJctBrkBVRp9Rh6YSZZBGnKbTSgf4q648BdkJDLSK4cguT
+D6BAw3gxj5V4wt5W0wn2JpjadFwnixrTzvMP/yAqfK0CgYEA93nBAoUPw8nzQkwk
+8iWBjfJ999Rw92hnnvk3xbcQcGfgUYuB4dxwe6FQTmFIVylt81er1YUvMb3ao7fo
+5ZcGnI5p1idjsd27kbZJLxb5Oh919hKu5IfkfYsVgnC0UdKCTgH5CaH0U4ATuXwt
+RL6qm0XcLALs5y2OO6z3s+mYhisCgYEAx7EQ8MA45bkXnRQiHBhGcIIcr2sRDfVJ
+OhHmGxx3EcYgtsIYKTqtQOyIt/nQxo6iyNL9bzfzBTybFJLuj63ZG1Ef4LosJedl
+eAU2NsKv5MlKYDSdNbLAJ0Op9I2Xu/pXQecPwY/3MkIQArdQCLevMLEGywCsuJTn
+BjkJNDkb9hcCgYAhoFiaiAwJVYKJSqFmibQd3opBR4uGApi54DE021gPff3b9rHS
+R8q88cFgtRVISqfW/d2qaKtt/dcckdvCfo/2a99zqux/+ZoIBZXSITQCMs4rfoRn
+JxPj/ycQD1JhH9J22QvGxEvXoLqNZJMeGS5DZO2yyT75dpYyA6Gwv5fq+wKBgQC5
+AhV917lfLELyZurLOLpaFlHZO8rLMcusH1UfHRo7v2IjsGOOHyzRD9QDD1IcA55R
+jRj8Z8uhuGq9fvvC5gBVTK3KGPI6E85wifOWfH1V7CAaTeSxEXDxb8EQL/a6U89v
+4VE5tdYCHC6VNZzS1staw0hV38QmJt57Z3Bdj+OV9QKBgE/b9fxpo+SVQ37BzNNY
+SEKTTijaddz8fdomApg6a2eFJL93Ej/op7N7gnHtPWMivPnRRza9ZjfnG+aZ7n2J
+sWyBiZK9xliS2TsF3l3q9Z0Vaq3i1nOlV7Bd20ZS8KjQjDtKnIRfLkQDkvmXbU5L
+emwkdsQZbpPFJch3mCGtI7JW
+-----END PRIVATE KEY-----
diff --git a/tests/aai/traversal/suite1/custom_query_1.robot b/tests/aai/traversal/suite1/custom_query_1.robot
new file mode 100644
index 00000000..4ced06f2
--- /dev/null
+++ b/tests/aai/traversal/suite1/custom_query_1.robot
@@ -0,0 +1,131 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${GENERICVNFKEYVALUE} generic-vnf-integration-test1
+${PSERVERKEYVALUE} pserver-integration-test1
+${GENERICVNFURL} https://${HOST_IP}:8443/aai/v11/network/generic-vnfs/generic-vnf/${GENERICVNFKEYVALUE}
+${PSERVERURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/pservers/pserver/${PSERVERKEYVALUE}
+${RELATIONSHIPURL} https://${HOST_IP}:8443/aai/v11/network/generic-vnfs/generic-vnf/${GENERICVNFKEYVALUE}/relationship-list/relationship
+${CUSTOMQUERYURL} https://${HOST_IP}:8443/aai/v11/query?format=simple
+${GENERICVNFDATA} { "vnf-id": "${GENERICVNFKEYVALUE}", "vnf-name": "example-vnf-name-val-51663", "vnf-name2": "example-vnf-name2-val-15450", "vnf-type": "example-vnf-type-val-32726", "service-id": "example-service-id-val-49385", "regional-resource-zone": "example-regional-resource-zone-val-41257", "prov-status": "example-prov-status-val-5666", "operational-status": "example-operational-status-val-95008", "license-key": "example-license-key-val-25823", "equipment-role": "example-equipment-role-val-30138", "orchestration-status": "example-orchestration-status-val-18897", "heat-stack-id": "example-heat-stack-id-val-46807", "mso-catalog-key": "example-mso-catalog-key-val-43833", "management-option": "example-management-option-val-92040", "ipv4-oam-address": "example-ipv4-oam-address-val-85170", "ipv4-loopback0-address": "example-ipv4-loopback0-address-val-88650", "nm-lan-v6-address": "example-nm-lan-v6-address-val-76997", "management-v6-address": "example-management-v6-address-val-10065", "vcpu": 5182376, "vcpu-units": "example-vcpu-units-val-52149", "vmemory": 35401466, "vmemory-units": "example-vmemory-units-val-46534", "vdisk": 74255232, "vdisk-units": "example-vdisk-units-val-83649", "in-maint": true, "is-closed-loop-disabled": true, "summary-status": "example-summary-status-val-99435", "encrypted-access-flag": true, "entitlement-assignment-group-uuid": "example-entitlement-assignment-group-uuid-val-50758", "entitlement-resource-uuid": "example-entitlement-resource-uuid-val-21058", "license-assignment-group-uuid": "example-license-assignment-group-uuid-val-99092", "license-key-uuid": "example-license-key-uuid-val-93512", "nf-naming-code": "example-nf-naming-code-val-89", "selflink": "example-selflink-val-42557", "ipv4-oam-gateway-address": "example-ipv4-oam-gateway-address-val-50012", "ipv4-oam-gateway-address-prefix-length": 92759, "vlan-id-outer": 20604980, "nm-profile-name": "example-nm-profile-name-val-35055" }
+${PSERVERDATA} { "hostname": "${PSERVERKEYVALUE}", "ptnii-equip-name": "example-ptnii-equip-name-val-91724", "number-of-cpus": 56461, "disk-in-gigabytes": 13534, "ram-in-megabytes": 66589, "equip-type": "example-equip-type-val-94149", "equip-vendor": "example-equip-vendor-val-91811", "equip-model": "example-equip-model-val-26157", "fqdn": "example-fqdn-val-19743", "pserver-selflink": "example-pserver-selflink-val-67676", "ipv4-oam-address": "example-ipv4-oam-address-val-12819", "serial-number": "example-serial-number-val-33384", "ipaddress-v4-loopback-0": "example-ipaddress-v4-loopback0-val-63311", "ipaddress-v6-loopback-0": "example-ipaddress-v6-loopback0-val-70485", "ipaddress-v4-aim": "example-ipaddress-v4-aim-val-23497", "ipaddress-v6-aim": "example-ipaddress-v6-aim-val-24473", "ipaddress-v6-oam": "example-ipaddress-v6-oam-val-38196", "inv-status": "example-inv-status-val-10016", "pserver-id": "example-pserver-id-val-90123", "internet-topology": "example-internet-topology-val-17042", "in-maint": true, "pserver-name2": "example-pserver-name2-val-12304", "purpose": "example-purpose-val-86719", "prov-status": "example-prov-status-val-68126", "management-option": "example-management-option-val-86521", "host-profile": "example-host-profile-val-48679" }
+${CUSTOMQUERYDATA} {"gremlin":"g.V().has(\\'hostname\\', \\'${PSERVERKEYVALUE}\\')"}
+${PSERVER_GENERIC_VNF_RELATIONSHIPDATA} {"related-to":"pserver","relationship-data":[{"relationship-key":"pserver.hostname","relationship-value":"${PSERVERKEYVALUE}"}]}
+
+*** Test Cases ***
+
+Run AAI Put generic-vnf
+ [Documentation] Create an generic-vnf object
+ ${resp}= PutWithCert ${GENERICVNFURL} ${GENERICVNFDATA}
+ log ${GENERICVNFURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put pserver
+ [Documentation] Create an pserver object
+ ${resp}= PutWithCert ${PSERVERURL} ${PSERVERDATA}
+ log ${PSERVERURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put relationship of pserver and generic-vnf
+ [Documentation] Create relationship of pserver and generic-vnf
+ ${resp}= PutWithCert ${RELATIONSHIPURL} ${PSERVER_GENERIC_VNF_RELATIONSHIPDATA}
+ log ${RELATIONSHIPURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get pserver
+ [Documentation] Get the pserver object just relationship
+ ${resp} GetWithCert ${PSERVERURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get generic-vnf
+ [Documentation] Get the generic-vnf object just relationship
+ ${resp} GetWithCert ${GENERICVNFURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put custom query simple format
+ [Documentation] custom query simple format
+ log ${CUSTOMQUERYDATA}
+ ${resp}= PutWithCert ${CUSTOMQUERYURL} ${CUSTOMQUERYDATA}
+ log ${CUSTOMQUERYURL}
+ log ${resp.text}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get generic-vnf to delete
+ [Documentation] Get the generic-vnf object to delete
+ ${resp} GetWithCert ${GENERICVNFURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete generic-vnf
+ [Documentation] Delete the generic-vnf
+ ${resp}= DeleteWithCert ${GENERICVNFURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get pserver to delete
+ [Documentation] Get the pserver object to delete
+ ${resp} GetWithCert ${PSERVERURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete pserver
+ [Documentation] Delete the pserver
+ ${resp}= DeleteWithCert ${PSERVERURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PatchWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.patch('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
diff --git a/tests/aai/traversal/suite1/custom_query_all_formats.robot b/tests/aai/traversal/suite1/custom_query_all_formats.robot
new file mode 100644
index 00000000..0e582603
--- /dev/null
+++ b/tests/aai/traversal/suite1/custom_query_all_formats.robot
@@ -0,0 +1,190 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${GENERICVNFKEYVALUE} generic-vnf-integration-test1
+${PSERVERKEYVALUE} pserver-integration-test1
+${GENERICVNFURL} https://${HOST_IP}:8443/aai/v11/network/generic-vnfs/generic-vnf/${GENERICVNFKEYVALUE}
+${PSERVERURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/pservers/pserver/${PSERVERKEYVALUE}
+${RELATIONSHIPURL} https://${HOST_IP}:8443/aai/v11/network/generic-vnfs/generic-vnf/${GENERICVNFKEYVALUE}/relationship-list/relationship
+${CUSTOMQUERYURL} https://${HOST_IP}:8443/aai/v11/query?format=simple
+${CUSTOMQUERYURL_GRAPHSON} https://${HOST_IP}:8443/aai/v11/query?format=graphson
+${CUSTOMQUERYURL_ID} https://${HOST_IP}:8443/aai/v11/query?format=id
+${CUSTOMQUERYURL_PATHED} https://${HOST_IP}:8443/aai/v11/query?format=pathed
+${CUSTOMQUERYURL_RESOURCE} https://${HOST_IP}:8443/aai/v11/query?format=resource
+${CUSTOMQUERYURL_RESOURCE_URL} https://${HOST_IP}:8443/aai/v11/query?format=resource_and_url
+${CUSTOMQUERYURL_RAW} https://${HOST_IP}:8443/aai/v11/query?format=raw
+${GENERICVNFDATA} {"vnf-id":"${GENERICVNFKEYVALUE}","vnf-name":"example-vnf-name-val-51663","vnf-name2":"example-vnf-name2-val-15450","vnf-type":"example-vnf-type-val-32726"}
+${PSERVERDATA} { "hostname": "${PSERVERKEYVALUE}", "ptnii-equip-name": "example-ptnii-equip-name-val-91724", "number-of-cpus": 56461, "disk-in-gigabytes": 13534, "ram-in-megabytes": 66589, "equip-type": "example-equip-type-val-94149", "equip-vendor": "example-equip-vendor-val-91811", "equip-model": "example-equip-model-val-26157", "fqdn": "example-fqdn-val-19743", "pserver-selflink": "example-pserver-selflink-val-67676", "ipv4-oam-address": "example-ipv4-oam-address-val-12819", "serial-number": "example-serial-number-val-33384", "ipaddress-v4-loopback-0": "example-ipaddress-v4-loopback0-val-63311", "ipaddress-v6-loopback-0": "example-ipaddress-v6-loopback0-val-70485", "ipaddress-v4-aim": "example-ipaddress-v4-aim-val-23497", "ipaddress-v6-aim": "example-ipaddress-v6-aim-val-24473", "ipaddress-v6-oam": "example-ipaddress-v6-oam-val-38196", "inv-status": "example-inv-status-val-10016", "pserver-id": "example-pserver-id-val-90123", "internet-topology": "example-internet-topology-val-17042", "in-maint": true, "pserver-name2": "example-pserver-name2-val-12304", "purpose": "example-purpose-val-86719", "prov-status": "example-prov-status-val-68126", "management-option": "example-management-option-val-86521", "host-profile": "example-host-profile-val-48679" }
+${CUSTOMQUERYDATA} {"gremlin":"g.V().has(\\'hostname\\', \\'${PSERVERKEYVALUE}\\')"}
+${PSERVER_GENERIC_VNF_RELATIONSHIPDATA} {"related-to":"pserver","relationship-data":[{"relationship-key":"pserver.hostname","relationship-value":"${PSERVERKEYVALUE}"}]}
+
+*** Test Cases ***
+Run AAI Put generic-vnf
+ [Documentation] Create an generic-vnf object
+ ${resp}= PutWithCert ${GENERICVNFURL} ${GENERICVNFDATA}
+ log ${GENERICVNFURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put pserver
+ [Documentation] Create an pserver object
+ ${resp}= PutWithCert ${PSERVERURL} ${PSERVERDATA}
+ log ${PSERVERURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put relationship of pserver and generic-vnf
+ [Documentation] Create relationship of pserver and generic-vnf
+ ${resp}= PutWithCert ${RELATIONSHIPURL} ${PSERVER_GENERIC_VNF_RELATIONSHIPDATA}
+ log ${RELATIONSHIPURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get pserver
+ [Documentation] Get the pserver object just relationship
+ ${resp} GetWithCert ${PSERVERURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get generic-vnf
+ [Documentation] Get the generic-vnf object just relationship
+ ${resp} GetWithCert ${GENERICVNFURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put custom query simple format
+ [Documentation] custom query simple format
+ log ${CUSTOMQUERYDATA}
+ ${resp}= PutWithCert ${CUSTOMQUERYURL} ${CUSTOMQUERYDATA}
+ log ${CUSTOMQUERYURL}
+ log ${resp.text}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put custom query graphson format
+ [Documentation] custom query graphson format
+ log ${CUSTOMQUERYDATA}
+ ${resp}= PutWithCert ${CUSTOMQUERYURL_GRAPHSON} ${CUSTOMQUERYDATA}
+ log ${CUSTOMQUERYURL_GRAPHSON}
+ log ${resp.text}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put custom query id format
+ [Documentation] custom query id format
+ log ${CUSTOMQUERYDATA}
+ ${resp}= PutWithCert ${CUSTOMQUERYURL_ID} ${CUSTOMQUERYDATA}
+ log ${CUSTOMQUERYURL_ID}
+ log ${resp.text}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put custom query pathed format
+ [Documentation] custom query pathed format
+ log ${CUSTOMQUERYDATA}
+ ${resp}= PutWithCert ${CUSTOMQUERYURL_PATHED} ${CUSTOMQUERYDATA}
+ log ${CUSTOMQUERYURL_PATHED}
+ log ${resp.text}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put custom query resource format
+ [Documentation] custom query resource format
+ log ${CUSTOMQUERYDATA}
+ ${resp}= PutWithCert ${CUSTOMQUERYURL_RESOURCE} ${CUSTOMQUERYDATA}
+ log ${CUSTOMQUERYURL_RESOURCE}
+ log ${resp.text}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put custom query resource url format
+ [Documentation] custom query resource url format
+ log ${CUSTOMQUERYDATA}
+ ${resp}= PutWithCert ${CUSTOMQUERYURL_RESOURCE_URL} ${CUSTOMQUERYDATA}
+ log ${CUSTOMQUERYURL_RESOURCE_URL}
+ log ${resp.text}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put custom query raw format
+ [Documentation] custom query raw format
+ log ${CUSTOMQUERYDATA}
+ ${resp}= PutWithCert ${CUSTOMQUERYURL_RAW} ${CUSTOMQUERYDATA}
+ log ${CUSTOMQUERYURL_RAW}
+ log ${resp.text}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get generic-vnf to delete
+ [Documentation] Get the generic-vnf object to delete
+ ${resp} GetWithCert ${GENERICVNFURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete generic-vnf
+ [Documentation] Delete the generic-vnf
+ ${resp}= DeleteWithCert ${GENERICVNFURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get pserver to delete
+ [Documentation] Get the pserver object to delete
+ ${resp} GetWithCert ${PSERVERURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete pserver
+ [Documentation] Delete the pserver
+ ${resp}= DeleteWithCert ${PSERVERURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [Return] ${resp}
+
+PatchWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.patch('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [Return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [Return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [Return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [Return] ${resp}
diff --git a/tests/appc/cdt/__init__.robot b/tests/appc/cdt/__init__.robot
new file mode 100644
index 00000000..b03cdaeb
--- /dev/null
+++ b/tests/appc/cdt/__init__.robot
@@ -0,0 +1,15 @@
+# This does setup and tear down of the suite
+
+# NOTE 1: The subdirectories must include a symbolic link to this file
+# in order to run an individual .robot file (as compared to directory)
+# NOTE 2: The Resource file must also be included in the test case .robot files
+
+*** Settings ***
+
+# Include a file of common variables, keywords and other settings
+| Resource | common.robot
+
+#| Suite Setup | Run Keywords | Setup1 | Setup2
+| Suite Setup | Run Keywords | Setup2 | Setup1
+| Suite Teardown | Close all browsers
+
diff --git a/tests/appc/cdt/cdt.robot b/tests/appc/cdt/cdt.robot
new file mode 100644
index 00000000..b33bfe77
--- /dev/null
+++ b/tests/appc/cdt/cdt.robot
@@ -0,0 +1,194 @@
+*** Settings ***
+| Resource | common.robot
+
+*** Test Cases ***
+# Based on Robot test cases created by Dawn Zelinski (dz2438@att.com).
+| Verify Home page and links
+# Access Home page - All tests files use this as starting point
+| | RefreshMainURL
+# Verify the links
+| | Page should contain link | Home
+| | Page should contain link | MY VNFs
+| | Page should contain link | Test
+| | Page should contain link | About us
+| | Page Should Not Contain | ${USER_ID}
+# Verify MY VNFs link will will ask for user entry
+| | Click Link | MY VNFs
+| | Wait Until Element Is Visible | id=userId | ${LONGTIME}
+| | Input Text | id=userId | ${USERID}
+| | Click Button | Submit
+| | Page Should Contain | ${USER_ID}
+| Verify Logout of user id
+# Access Home page - All tests files use this as starting point
+| | RefreshMainURL
+| | Page Should Contain | ${USER_ID}
+# Log out of user id and then see if My Vnfs asks for user entry
+| | Click Element | id=more-button
+# Line below also works.
+#| | Click Element | xpath=(//*[@class='android-more-button mdl-button mdl-js-button mdl-button--primary'])
+# Now Logout
+| | Wait Until Element Is Visible | xpath=(//*[@class='mdl-menu__item mdl-js-ripple-effect']) | ${LONGTIME}
+| | Click Element | xpath=(//*[@class='mdl-menu__item mdl-js-ripple-effect'])
+| | Page Should Not Contain | ${USER_ID}
+# Verify MY VNFs link will will ask for user entry
+| | Click Link | MY VNFs
+| | Wait Until Element Is Visible | id=userId | ${LONGTIME}
+| | Input Text | id=userId | ${USERID}
+| | Click Button | Submit
+| | Page Should Contain | ${USER_ID}
+
+| Test Uploading an existing VNF Reference file that was previously downloaded
+# Access Home page - All tests files use this as starting point
+| | RefreshMainURL
+| | Click Link | MY VNFs
+# Verify button element is ready before clicking it.
+| | Wait Until Page Contains Element | xpath=(//*[@class='mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--primary']) | ${LONGTIME}
+#| | Click Button | Create New VNF Type or VNFC Type
+| | Click Button | Create New VNF Type
+#| | Page Should Contain | Enter VNF type and VNFC to proceed
+| | Page Should Contain | Enter VNF Type
+| | Page Should Contain Element | id=vnfType
+# Proceed without entering any new information
+#| | Click Button | Proceed anyway
+| | Click Button | Proceed To Upload
+| | Page Should Contain Element | id=cmbAction
+| | Click Button | Upload Reference File
+| | Choose File | id=inputFile | ${CURDIR}/data/reference_AllAction_HealthCheckAnsible_0.0.1V.json
+| | Sleep | ${SHORTTIME}
+# Verify the screen is populated with the HealthCheck (action), dawnMay17 (VNF Type and ANSIBLE (device protocol)
+| | ${theVNFType} | Get Value | id=txtVnfType
+| | ${theAction} | Get Selected List Value | id=cmbAction
+| | ${theProtocol} | Get Selected List Value | id=txtDeviceProtocol
+| | Should Be Equal As Strings | ${theVNFType} | csit
+| | Should Be Equal As Strings | ${theAction} | HealthCheck
+| | Should Be Equal As Strings | ${theProtocol} | ANSIBLE
+
+| Test Creation of VNF
+# Access Home page - All tests files use this as starting point
+| | RefreshMainURL
+| | Click Link | MY VNFs
+# Verify button element is ready before clicking it.
+| | Wait Until Page Contains Element | xpath=(//*[@class='mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--primary']) | ${LONGTIME}
+#| | Click Button | Create New VNF Type or VNFC Type
+| | Click Button | Create New VNF Type
+#| | Page Should Contain | Enter VNF type and VNFC to proceed
+| | Page Should Contain | Enter VNF Type
+| | Page Should Contain Element | id=vnfType
+# Create a date to use in VNF Type to make it unique
+| | ${THEDATE} | Get Current Date | result_format=%m%d%H%M%S | exclude_millis=True
+| | Input Text | id=vnfType | csit${THEDATE}
+| | Click Button | Next
+| | Page Should Contain Element | id=cmbAction
+# Verify 17 selections available
+| | Select From List By Index | id=cmbAction | 17
+# Select HealthCheck and ANSIBLE and verify it gets created
+| | Select From List By Value | id=cmbAction | HealthCheck
+| | Select From List By Value | id=txtDeviceProtocol | ANSIBLE
+| | Click Button | saveToAppc
+| | Sleep | ${SHORTTIME}
+#| | Wait Until Page Contains | successfully uploaded the Reference Data | ${LONGTIME}
+| | Click Link | MY VNFs
+| | Page Should Contain | csit${THEDATE}
+
+| Test Creation of VNF with multiple VNFCs
+# This test is based on the 1806 Releases,
+# APPC-C Design Tool User Guide for Self-Service Onboarding (section 5.1)
+# Access Home page - All tests files use this as starting point
+| | RefreshMainURL
+| | Click Link | MY VNFs
+# Verify button element is ready before clicking it.
+| | Wait Until Page Contains Element | xpath=(//*[@class='mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--primary']) | ${LONGTIME}
+#| | Click Button | Create New VNF Type or VNFC Type
+| | Click Button | Create New VNF Type
+| | Wait Until Page Contains Element | id=vnfType | ${LONGTIME}
+# Create a date to use in VNF Type to make it unique
+| | ${THEDATE} | Get Current Date | result_format=%m%d%H%M%S | exclude_millis=True
+| | Input Text | id=vnfType | csit${THEDATE}
+| | Click Button | Next
+| | Wait Until Page Contains Element | id=cmbAction | ${LONGTIME}
+# Populate the action and protocol
+| | Select From List By Value | id=cmbAction | Configure
+| | Select From List By Value | id=txtDeviceProtocol | NETCONF-XML
+# Populate the other VNF descriptors
+| | Select From List By Value | name=template | Y
+| | Input Text | name=loginUserName | ${USER_ID}
+| | Input Text | name=portNumber | 777
+# Describe the first VNFC Type and enter the number of VMs for this VNFC Type
+| | Input Text | name=samplevnfcType | VNFC_type_A
+| | Input Text | name=samplevnfcFunctionCode | aaa
+| | Select From List By Value | name=sampleIpaddress | Y
+| | Select From List By Value | name=sampleGroupNotation | first-vnfc-name
+| | Input Text | name=sampleGroupValue | pair
+| | Input Text | name=txtNumber23 | 2
+| | Click Button | Add VM Information
+| | Wait Until Page Contains | VM Number: 2 | ${LONGTIME}
+# Clear information about the first VNFC
+| | Click Button | Clear VNFC Info
+# Describe the second VNFC Type and enter the number of VMs for this VNFC Type
+| | Input Text | name=samplevnfcType | VNFC_type_B
+| | Input Text | name=samplevnfcFunctionCode | bbb
+| | Select From List By Value | name=sampleIpaddress | Y
+| | Select From List By Value | name=sampleGroupNotation | first-vnfc-name
+| | Input Text | name=sampleGroupValue | pair
+| | Input Text | name=txtNumber23 | 2
+| | Click Button | Add VM Information
+| | Wait Until Page Contains | VM Number: 4 | ${LONGTIME}
+| | Click Button | saveToAppc
+| | Sleep | ${SHORTTIME}
+#| | Wait Until Page Contains | successfully uploaded the Reference Data | ${LONGTIME}
+| | Click Link | MY VNFs
+| | Wait Until Page Contains | ARTIFACT NAME | ${LONGTIME}
+| | Page Should Contain | csit${THEDATE}
+
+| Test Creation of VNF with VNFC box checked
+# This test is based on the 1806 Releases,
+# APPC-C Design Tool User Guide for Self-Service Onboarding (section 5.1)
+# Access Home page - All tests files use this as starting point
+| | RefreshMainURL
+| | Click Link | MY VNFs
+# Verify button element is ready before clicking it.
+| | Wait Until Page Contains Element | xpath=(//*[@class='mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--primary']) | ${LONGTIME}
+#| | Click Button | Create New VNF Type or VNFC Type
+| | Click Button | Create New VNF Type
+| | Wait Until Page Contains Element | id=vnfType | ${LONGTIME}
+# Create a date to use in VNF Type to make it unique
+| | ${THEDATE} | Get Current Date | result_format=%m%d%H%M%S | exclude_millis=True
+| | Input Text | id=vnfType | csit${THEDATE}
+# Check the box indicating VNFC templates
+| | Select Checkbox | id=vnfcRequired
+#| | Input Text | id=vnfcType | csitVNFC
+| | Click Button | Next
+| | Wait Until Page Contains Element | id=cmbAction | ${LONGTIME}
+# Populate the action and protocol
+| | Select From List By Value | id=cmbAction | Configure
+| | Select From List By Value | id=txtDeviceProtocol | NETCONF-XML
+# Populate the other VNF descriptors
+| | Select From List By Value | name=template | Y
+| | Input Text | name=loginUserName | ${USER_ID}
+| | Input Text | name=portNumber | 777
+# Describe the first VNFC Type and enter the number of VMs for this VNFC Type
+| | Input Text | name=samplevnfcType | csitVNFC
+| | Input Text | name=samplevnfcFunctionCode | aaa
+| | Select From List By Value | name=sampleIpaddress | Y
+| | Select From List By Value | name=sampleGroupNotation | first-vnfc-name
+| | Input Text | name=sampleGroupValue | pair
+| | Input Text | name=txtNumber23 | 2
+| | Click Button | Add VM Information
+| | Wait Until Page Contains | VM Number: 2 | ${LONGTIME}
+# Clear information about the first VNFC
+| | Click Button | Clear VNFC Info
+# Describe the second VNFC Type and enter the number of VMs for this VNFC Type
+| | Input Text | name=samplevnfcType | csitVNFC
+| | Input Text | name=samplevnfcFunctionCode | bbb
+| | Select From List By Value | name=sampleIpaddress | Y
+| | Select From List By Value | name=sampleGroupNotation | first-vnfc-name
+| | Input Text | name=sampleGroupValue | pair
+| | Input Text | name=txtNumber23 | 2
+| | Click Button | Add VM Information
+| | Wait Until Page Contains | VM Number: 4 | ${LONGTIME}
+| | Click Button | saveToAppc
+| | Sleep | ${SHORTTIME}
+| | Click Link | MY VNFs
+| | Wait Until Page Contains | ARTIFACT NAME | ${LONGTIME}
+| | Page Should Contain | csit${THEDATE}
+
diff --git a/tests/appc/cdt/common.robot b/tests/appc/cdt/common.robot
new file mode 100644
index 00000000..3492924f
--- /dev/null
+++ b/tests/appc/cdt/common.robot
@@ -0,0 +1,60 @@
+# CDT Regression Testing # Set the MAINURL via the command line
+# run as:
+# 1) execute a .profile that sets and exports DEV2 and DEV4
+# 2) robot --variable MAINURL:$DEV# filename.robot
+
+
+*** Variables ***
+
+# ${MAINURL} is now set from the command line per above
+| ${BROWSER} | chrome
+| ${SHORTTIME} | 5s
+| ${LONGTIME} | 90s
+| ${TENMINUTES} | 600s
+#| ${FFPROFILE_DIR} | /home/dvz/.mozilla/firefox/s87c07vn.AppCZoomed50
+| ${MAINURL} | http://localhost:8080/index.html
+| ${USER_ID} | csituser
+
+*** Keywords ***
+| Setup1 | Open browser | ${MAINURL} | ${BROWSER} | | | | |
+| Setup2 | SLEEP | 2s
+
+# Refresh the ${MAINURL} which is used as starting point within each test file
+| RefreshMainURL
+| | Go To | ${MAINURL}
+| | Wait Until Page Contains | WELCOME TO CONTROLLER DESIGN TOOL | ${LONGTIME}
+
+
+# Make sure you can get to APPC server - Wrap in implicit wait then reset
+# Want to wait a few seconds to see if Server error appears.
+# Can't add an explicit wait to "Page should not contain"
+| CheckForServerError
+| | [Arguments] | ${WAITTIME}
+| | Set Selenium Implicit Wait | ${WAITTIME}
+| | Page Should Not Contain | Error in connecting to APPC Server
+| | Set Selenium Implicit Wait | 0
+
+
+| ClickButtonByContent
+| | [Arguments] | ${TEXT}
+| | ${RETVAL} | Execute Javascript | function clickButtonByTextContent(buttontext) { var buttons = document.querySelectorAll('button'); for (var i=0, l=buttons.length; i<l; i++) { if (buttons[i].firstChild.nodeValue == buttontext) { buttons[i].click(); return 0 } } return 1 }; var retval=clickButtonByTextContent('${TEXT}'); return retval;
+| | Return From Keyword | ${RETVAL}
+
+| ClickButtonByClassName
+| | [Arguments] | ${TEXT}
+| | ${RETVAL} | Execute Javascript | function clickButtonByClassName(theclass) { var buttons = document.querySelectorAll('button'); for (var i=0, l=buttons.length; i<l; i++) { if (buttons[i].firstChild.nodeValue == theclass) { buttons[i].click(); return 0 } } return 1 }; var retval=clickButtonByClassName(${TEXT}); return retval;
+| | Return From Keyword | ${RETVAL}
+
+| EnterElementByClassName
+| | [Arguments] | ${THECLASS} | ${INPUTVALUE}
+| | ${RETVAL} | Execute Javascript | function enterElementByClassName(theclass,theinput) { var element = document.querySelector('.'+theclass).value = theinput; return 0 }; var retval=enterElementByClassName(${THECLASS},${INPUTVALUE}); return retval;
+| | Return From Keyword | ${RETVAL}
+
+*** Settings ***
+
+| Library | ExtendedSelenium2Library
+| Library | OperatingSystem
+#| Library | Dialogs
+| Library | DateTime
+
+
diff --git a/tests/appc/cdt/data/pd_Configure_vUSP - Revenue Assurance_0.0.1V.yaml b/tests/appc/cdt/data/pd_Configure_vUSP - Revenue Assurance_0.0.1V.yaml
new file mode 100755
index 00000000..ced4a7c5
--- /dev/null
+++ b/tests/appc/cdt/data/pd_Configure_vUSP - Revenue Assurance_0.0.1V.yaml
@@ -0,0 +1,13 @@
+---
+kind: "Property Definition"
+version: V1
+vnf-parameter-list:
+- name: vnf_name
+ type: null
+ description: CSIT
+ required: null
+ default: null
+ source: Manual
+ rule-type: null
+ request-keys: null
+ response-keys: null
diff --git a/tests/appc/cdt/data/reference_AllAction_HealthCheckAnsible_0.0.1V.json b/tests/appc/cdt/data/reference_AllAction_HealthCheckAnsible_0.0.1V.json
new file mode 100755
index 00000000..41678061
--- /dev/null
+++ b/tests/appc/cdt/data/reference_AllAction_HealthCheckAnsible_0.0.1V.json
@@ -0,0 +1,48 @@
+{
+ "reference_data": [
+ {
+ "action": "HealthCheck",
+ "action-level": "vnf",
+ "scope": {
+ "vnf-type": "csit",
+ "vnfc-type-list": ["testvnftype"],
+ "vnfc-type": ""
+ },
+ "template": "Y",
+ "vm": [],
+ "device-protocol": "ANSIBLE",
+ "user-name": "",
+ "port-number": "",
+ "artifact-list": [
+ {
+ "artifact-name": "template_HealthCheck_csit_0.0.1V.json",
+ "artifact-type": "config_template"
+ },
+ {
+ "artifact-name": "pd_HealthCheck_csit_0.0.1V.yaml",
+ "artifact-type": "parameter_definitions"
+ },
+ {
+ "artifact-name": "param_HealthCheck_csit_0.0.1V.json",
+ "artifact-type": "param_values"
+ }
+ ],
+ "scopeType": "vnf-type"
+ },
+ {
+ "action": "AllAction",
+ "action-level": "vnf",
+ "scope": {
+ "vnf-type": "csit",
+ "vnfc-type-list": ["testvnftype"],
+ "vnfc-type": ""
+ },
+ "artifact-list": [
+ {
+ "artifact-name": "reference_AllAction_csit_0.0.1V.json",
+ "artifact-type": "reference_template"
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/appc/cdt/data/reference_AllAction_vUSP - Revenue Assurance_0.0.1V.json b/tests/appc/cdt/data/reference_AllAction_vUSP - Revenue Assurance_0.0.1V.json
new file mode 100755
index 00000000..a575129f
--- /dev/null
+++ b/tests/appc/cdt/data/reference_AllAction_vUSP - Revenue Assurance_0.0.1V.json
@@ -0,0 +1,125 @@
+{
+ "reference_data": [
+ {
+ "action": "Configure",
+ "action-level": "vnf",
+ "scope": {
+ "vnf-type": "vUSP - Revenue Assurance",
+ "vnf-type-list": "testvnftype",
+ "vnfc-type": ""
+ },
+ "template": "Y",
+ "vm": [
+ {
+ "vm-instance": 1,
+ "vnfc": [
+ {
+ "vnfc-instance": "1",
+ "vnfc-function-code": "rar",
+ "ipaddress-v4-oam-vip": "Y",
+ "group-notation-type": "first-vnfc-name",
+ "group-notation-value": "pair",
+ "vnfc-type": "vUSP vRAR"
+ }
+ ]
+ },
+ {
+ "vm-instance": 2,
+ "vnfc": [
+ {
+ "vnfc-instance": "1",
+ "vnfc-function-code": "rar",
+ "ipaddress-v4-oam-vip": "Y",
+ "group-notation-type": "first-vnfc-name",
+ "group-notation-value": "pair",
+ "vnfc-type": "vUSP vRAR"
+ }
+ ]
+ }
+ ],
+ "device-protocol": "ANSIBLE",
+ "user-name": "att",
+ "port-number": "5000",
+ "artifact-list": [
+ {
+ "artifact-name": "template_Configure_vUSP-RevenueAssurance_0.0.1V..json",
+ "artifact-type": "config_template"
+ },
+ {
+ "artifact-name": "pd_Configure_vUSP-RevenueAssurance_0.0.1V.yaml",
+ "artifact-type": "parameter_definitions"
+ },
+ {
+ "artifact-name": "param_Configure_vUSP-RevenueAssurance_0.0.1V.json",
+ "artifact-type": "param_values"
+ }
+ ],
+ "scopeType": "vnf-type"
+ },
+ {
+ "action": "ConfigBackup",
+ "action-level": "vnf",
+ "scope": {
+ "vnf-type": "vUSP - Revenue Assurance",
+ "vnfc-type": "",
+ "vnfc-type-list": ["testvnftype"]
+ },
+ "template": "Y",
+ "vm": [],
+ "device-protocol": "ANSIBLE",
+ "user-name": "att",
+ "port-number": "5000",
+ "artifact-list": [
+ {
+ "artifact-name": "template_ConfigBackup_vUSP-vRAR_0.0.1V.json",
+ "artifact-type": "config_template"
+ },
+ {
+ "artifact-name": "pd_ConfigBackup_vUSP-vRAR_0.0.1V.yaml",
+ "artifact-type": "parameter_definitions"
+ }
+ ],
+ "scopeType": "vnf-type"
+ },
+ {
+ "action": "ConfigRestore",
+ "action-level": "vnf",
+ "scope": {
+ "vnf-type": "vUSP - Revenue Assurance",
+ "vnfc-type": "",
+ "vnfc-type-list": ["testvnftype"]
+ },
+ "template": "Y",
+ "vm": [],
+ "device-protocol": "ANSIBLE",
+ "user-name": "att",
+ "port-number": "5000",
+ "artifact-list": [
+ {
+ "artifact-name": "template_ConfigRestore_vUSP-vRAR_0.0.1V.json",
+ "artifact-type": "config_template"
+ },
+ {
+ "artifact-name": "pd_ConfigRestore_vUSP-vRAR_0.0.1V.yaml",
+ "artifact-type": "parameter_definitions"
+ }
+ ],
+ "scopeType": "vnf-type"
+ },
+ {
+ "action": "AllAction",
+ "action-level": "vnf",
+ "scope": {
+ "vnf-type": "vUSP - Revenue Assurance",
+ "vnfc-type": "",
+ "vnfc-type-list": ["testvnftype"]
+ },
+ "artifact-list": [
+ {
+ "artifact-name": "reference_AllAction_vUSP-RevenueAssurance_0.0.1V.json",
+ "artifact-type": "reference_template"
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/appc/cdt/data/template_Configure_vUSP - Revenue Assurance_0.0.1V.json b/tests/appc/cdt/data/template_Configure_vUSP - Revenue Assurance_0.0.1V.json
new file mode 100755
index 00000000..5dd853c5
--- /dev/null
+++ b/tests/appc/cdt/data/template_Configure_vUSP - Revenue Assurance_0.0.1V.json
@@ -0,0 +1,5 @@
+{
+ "PlaybookName": "rarf/latest/ansible/restore/site.yml",
+ "EnvParameters": {"vnf_instance":"${vnf_name}"},
+ "Timeout": 600
+}
diff --git a/tests/appc/cdt/data/vUSP_User Input Spreadsheet v.07.xlsx b/tests/appc/cdt/data/vUSP_User Input Spreadsheet v.07.xlsx
new file mode 100755
index 00000000..3a5efcb2
--- /dev/null
+++ b/tests/appc/cdt/data/vUSP_User Input Spreadsheet v.07.xlsx
Binary files differ
diff --git a/tests/appc/healthcheck/APPC_GLOBAL_VARIABLES.robot b/tests/appc/healthcheck/APPC_GLOBAL_VARIABLES.robot
new file mode 100644
index 00000000..b869434f
--- /dev/null
+++ b/tests/appc/healthcheck/APPC_GLOBAL_VARIABLES.robot
@@ -0,0 +1,10 @@
+*** Settings ***
+Documentation store all properties that can change or are used in multiple places here
+... format is all caps with underscores between words and prepended with GLOBAL
+... make sure you prepend them with GLOBAL so that other files can easily see it is from this file.
+
+
+*** Variables ***
+${GLOBAL_VNF_RESTART_REQUESTFILE} ${CURDIR}/LCM_VNF_RESTART_REQUEST.txt
+${GLOBAL_VM_RESTART_REQUESTFILE} ${CURDIR}/LCM_VM_RESTART_REQUEST.txt
+${GLOBAL_HEALTHCHECK_REQUESTFILE} ${CURDIR}/LCM_VM_HEALTHCHECK_REQUEST.txt \ No newline at end of file
diff --git a/tests/appc/healthcheck/APPC_Netstat.robot b/tests/appc/healthcheck/APPC_Netstat.robot
new file mode 100644
index 00000000..285fc372
--- /dev/null
+++ b/tests/appc/healthcheck/APPC_Netstat.robot
@@ -0,0 +1,8 @@
+*** Settings ***
+Library OperatingSystem
+
+*** Test Cases ***
+APPC Netstat
+ [Documentation] Checking the active ports
+ ${output}= Run netstat -a | grep -E 8282 | grep LISTEN
+ Log To Console ${output}
diff --git a/tests/appc/healthcheck/LCM_HEALTHCHECK_TIMESTAMP.robot b/tests/appc/healthcheck/LCM_HEALTHCHECK_TIMESTAMP.robot
new file mode 100644
index 00000000..1cea75e9
--- /dev/null
+++ b/tests/appc/healthcheck/LCM_HEALTHCHECK_TIMESTAMP.robot
@@ -0,0 +1,52 @@
+*** Settings ***
+Library Selenium2Library
+Library OperatingSystem
+Library XvfbRobot
+Resource APPC_GLOBAL_VARIABLES.robot
+Resource gettime.robot
+
+*** Variable ***
+${ResponseCode}
+${var}
+
+*** Test Cases ***
+
+APPC LCM API HEALTHCHECK
+ [Documentation] APPC LCM API HEALTHCHECK
+ Start Virtual Display 1920 1080
+ Open Browser http://admin:Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U@localhost:8282/apidoc/explorer/index.html chrome
+# Maximize Browser Window
+# Click Element xpath=.//p[contains(text(),'If you have reason to expect the website is safe, select the I Accept the Risk button to continue.')]//following::img
+
+ Reload Page
+
+# Wait Until Page Contains Element xpath=.//*[contains(text(),'appc-provider-lcm(2016-01-08)')]
+
+# Set Selenium Speed 60
+# Click Element xpath=.//*[contains(text(),'appc-provider-lcm(2016-01-08)')]
+
+
+# wait until page contains element xpath=//*[@id="resource_appc-provider-lcm(2016-01-08)"]/div/h2/a//following::a[contains(text(),'/operations/appc-provider-lcm:health-check')]
+# Set Selenium Speed 60
+# Click link xpath=.//*[contains(text(),'appc-provider-lcm(2016-01-08)')]/following::li[5]/ul/li/div[1]/h3/span[2]/a
+# Click Element xpath=//*[@id="appc-provider-lcm(2016-01-08)_health_check_post_0"]/div[1]/h3/span[2]/a
+
+# Get Server time ${GLOBAL_HEALTHCHECK_REQUESTFILE}
+# ${file_content}= OperatingSystem.Get File ${GLOBAL_HEALTHCHECK_REQUESTFILE}
+
+# wait until page contains element xpath=//*[@id="resource_appc-provider-lcm(2016-01-08)"]/div/h2/a//following::a[contains(text(),'/operations/appc-provider-lcm:health-check')]//following::table
+# Set Selenium Speed 90
+# Input Text xpath=(.//*[contains(text(),'(health-check)input-TOP')])[1]/following::textarea[1] ${file_content}
+# Input Text xpath=//*[@id="resource_appc-provider-lcm(2016-01-08)"]/div/h2/a//following::a[contains(text(),'/operations/appc-provider-lcm:health-check')]//following::table//tbody/tr/td[2]/textarea ${file_content}
+
+# wait until page contains element xpath=//*[@id="resource_appc-provider-lcm(2016-01-08)"]/div/h2/a//following::a[contains(text(),'/operations/appc-provider-lcm:health-check')]//following::form/div[2]/input[1]
+# Set Selenium Speed 90
+# Click Element xpath=//*[@id="appc-provider-lcm(2016-01-08)_health_check_post_0_content"]/form/div[2]/input
+
+## ${var}= Get Value xpath= //*[@id="appc-provider-lcm(2016-01-08)_health_check_post_0_content"]/div[2]/div[3]/pre
+## Element Text Should Be xpath=//*[@id="appc-provider-lcm(2016-01-08)_health_check_post_0_content"]/div[2]/div[3]/pre[1][text()='200'] 200 expected
+
+Tear Down
+
+ [Documentation] Close all browsers
+ Close All Browsers
diff --git a/tests/appc/healthcheck/LCM_VM_HEALTHCHECK_REQUEST.txt b/tests/appc/healthcheck/LCM_VM_HEALTHCHECK_REQUEST.txt
new file mode 100644
index 00000000..d258b492
--- /dev/null
+++ b/tests/appc/healthcheck/LCM_VM_HEALTHCHECK_REQUEST.txt
@@ -0,0 +1,25 @@
+{
+"input" :
+{
+"common-header" :
+{
+"timestamp" : "2017-10-07T01:28:39.615000Z",
+"api-ver" : "2.00",
+"originator-id" : "SDNGP",
+"request-id" : "AppCONAP-lcm-HealthCheck-PhilTest#1",
+"sub-request-id" : "AppCONAP-lcm-HealthCheck-PhilTest#1",
+"flags" :
+{
+"mode" : "NORMAL",
+"force" : "TRUE",
+"ttl" : 3600
+}
+},
+"action" : "HealthCheck",
+"action-identifiers" :
+{
+"vnf-id" : "dbax001v"
+},
+"payload" : "{\"request-parameters\":{\"vnf-name\":\"dbax001v\",\"vnf-host-ip-address\":\"https://135.205.240.68:8080/Dispatch/\"},\"configuration-parameters\":{\"vnf_instance\":\"dbax001v\"}}"
+}
+}
diff --git a/tests/appc/healthcheck/LCM_VM_RESTART_REQUEST.txt b/tests/appc/healthcheck/LCM_VM_RESTART_REQUEST.txt
new file mode 100644
index 00000000..5e199c97
--- /dev/null
+++ b/tests/appc/healthcheck/LCM_VM_RESTART_REQUEST.txt
@@ -0,0 +1,24 @@
+{
+"input" :
+{
+"common-header" :
+{
+"timestamp" : "2017-09-29T16:30:05.44Z",
+"api-ver" : "2.01",
+"originator-id" : "c09ac7d1-de62-0016-2000-e63702155Phil2",
+"request-id" : "c09ac7d1-de62-0016-2000-e63702155Phil2",
+"sub-request-id" : "150",
+"flags" :
+{
+"force" : "TRUE",
+"ttl" : 60000
+}
+},
+"action" : "Restart",
+"action-identifiers" :
+{
+"vnf-id" : "trial-vnf-004"
+},
+"payload" : "{\"vm-id\":\"http://135.25.246.131:8774/v2/81fc2bc61f974de1b5a49e8c2ec090bb/servers/7c95ba81-4aad-4b13-9e94-d6af4f2b06be\",\"identity-url\":\"http://135.25.246.131:5000/v2.0\",\"tenant-id\":\"81fc2bc61f974de1b5a49e8c2ec090bb\"}"
+}
+} \ No newline at end of file
diff --git a/tests/appc/healthcheck/LCM_VM_RESTART_TIMESTAMP.robot b/tests/appc/healthcheck/LCM_VM_RESTART_TIMESTAMP.robot
new file mode 100644
index 00000000..7968d552
--- /dev/null
+++ b/tests/appc/healthcheck/LCM_VM_RESTART_TIMESTAMP.robot
@@ -0,0 +1,47 @@
+*** Settings ***
+Library Selenium2Library
+Library OperatingSystem
+Library XvfbRobot
+Resource APPC_GLOBAL_VARIABLES.robot
+Resource gettime.robot
+
+*** Variable ***
+${ResponseCode}
+${var}
+
+*** Test Cases ***
+APPC LCM API VM RESTART
+ [Documentation] APPC LCM API VM RESTART
+ Start Virtual Display 1920 1080
+ Open Browser http://admin:Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U@localhost:8282/apidoc/explorer/index.html chrome
+# Maximize Browser Window
+# Click Element xpath=.//p[contains(text(),'If you have reason to expect the website is safe, select the I Accept the Risk button to continue.')]//following::img
+
+ Reload Page
+
+# Wait Until Page Contains Element xpath=//*[@id="resource_appc-provider-lcm(2016-01-08)"]/div/h2/a
+# Set Selenium Speed 60
+# Click Element xpath=.//*[contains(text(),'appc-provider-lcm(2016-01-08)')]
+
+# Wait Until Page Contains Element xpath=//*[@id="resource_appc-provider-lcm(2016-01-08)"]/div/h2/a//following::a[contains(text(),'/operations/appc-provider-lcm:restart')]
+# Set Selenium Speed 60
+# Click Element xpath=.//*[contains(text(),'appc-provider-lcm:restart')]
+
+# Get Server time ${GLOBAL_VM_RESTART_REQUESTFILE}
+
+# ${file_content}= OperatingSystem.Get File ${GLOBAL_VM_RESTART_REQUESTFILE}
+
+# Wait Until Page Contains Element xpath=//td[contains(text(), '(restart)input-TOP')]//following::textarea[@name='(restart)input-TOP'][3]
+# Set Selenium Speed 90
+# Input Text xpath=(.//*[contains(text(),'(restart)input-TOP')])[5]/following::textarea[1] ${file_content}
+# Input Text xpath= //td[contains(text(), '(restart)input-TOP')]//following::textarea[@name='(restart)input-TOP'][3] ${file_content}
+
+# Click Element xpath=//*[@id="resource_appc-provider-lcm(2016-01-08)"]/div/h2/a//following::a[contains(text(),'/operations/appc-provider-lcm:restart')]//following::form/div[2]/input[1]
+
+# ${var}= Get Value xpath=//*[@id="resource_appc-provider-lcm(2016-01-08)"]/div/h2/a//following::a[contains(text(),'/operations/appc-provider-lcm:restart')]//following::h4[contains(text(),'Response Code')][1]//following-sibling::div//pre
+# Element Text Should Be xpath=//*[contains(text(),'/operations/appc-provider-lcm:restart')]//following::h4[text()='Response Code'][1]//following-sibling::div//pre[1][text()='200'] 200 expected
+
+
+Tear Down
+ [Documentation] Close all browsers
+ Close All Browsers
diff --git a/tests/appc/healthcheck/LCM_VNF_RESTART_REQUEST.txt b/tests/appc/healthcheck/LCM_VNF_RESTART_REQUEST.txt
new file mode 100644
index 00000000..ee9b8d9b
--- /dev/null
+++ b/tests/appc/healthcheck/LCM_VNF_RESTART_REQUEST.txt
@@ -0,0 +1,24 @@
+{
+"input" :
+{
+"common-header" :
+{
+"timestamp" : "2017-10-07T01:39:54.227000Z",
+"api-ver" : "2.00",
+"originator-id" : "c09ac7d1-de62-0016-2000-e63702155555",
+"request-id" : "c09ac7d1-de62-0016-2000-e63701125555",
+"sub-request-id" : "150",
+"flags" :
+{
+"force" : "TRUE",
+"ttl" : 60000
+}
+},
+"action" : "Restart",
+"action-identifiers" :
+{
+"vnf-id" : "ibcx8888v"
+},
+"payload" : "{\"AICIdentity\" : \"http://135.25.246.162:5000/v2.0\", \"vnf-host-ip-address\" : \"135.21.166.46\"}"
+}
+}
diff --git a/tests/appc/healthcheck/LCM_VNF_RESTART_TIMESTAMP.robot b/tests/appc/healthcheck/LCM_VNF_RESTART_TIMESTAMP.robot
new file mode 100644
index 00000000..93c72d72
--- /dev/null
+++ b/tests/appc/healthcheck/LCM_VNF_RESTART_TIMESTAMP.robot
@@ -0,0 +1,50 @@
+*** Settings ***
+Library Selenium2Library
+Library OperatingSystem
+Library XvfbRobot
+Resource ${CURDIR}/APPC_GLOBAL_VARIABLES.robot
+Resource ${CURDIR}/gettime.robot
+
+
+
+*** Variable ***
+${ResponseCode}
+${var}
+
+*** Test Cases ***
+
+APPC LCM API VNF RESTART
+ [Documentation] APPC LCM API VNF RESTART
+ Start Virtual Display 1920 1080
+ Open Browser http://admin:Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U@localhost:8282/apidoc/explorer/index.html chrome
+# Maximize Browser Window
+# Click Element xpath=.//p[contains(text(),'If you have reason to expect the website is safe, select the I Accept the Risk button to continue.')]//following::img
+
+ Reload Page
+
+# Wait Until Page Contains Element xpath=//*[@id="resource_appc-provider-lcm(2016-01-08)"]/div/h2/a
+# Set Selenium Speed 60
+# Click Element xpath=.//*[contains(text(),'appc-provider-lcm(2016-01-08)')]
+
+
+# Wait Until Page Contains Element xpath=//*[@id="resource_appc-provider-lcm(2016-01-08)"]/div/h2/a//following::a[contains(text(),'/operations/appc-provider-lcm:restart')]
+# Set Selenium Speed 60
+# Click Element xpath=.//*[contains(text(),'appc-provider-lcm:restart')]
+
+# Get Server time ${GLOBAL_VNF_RESTART_REQUESTFILE}
+# ${file_content}= OperatingSystem.Get File ${GLOBAL_VNF_RESTART_REQUESTFILE}
+
+# Wait Until Page Contains Element xpath=//td[contains(text(), '(restart)input-TOP')]//following::textarea[@name='(restart)input-TOP'][3]
+# Set Selenium Speed 90
+# Input Text xpath=(.//*[contains(text(),'(restart)input-TOP')])[5]/following::textarea[1] ${file_content}
+# Click Element xpath=//*[@id="resource_appc-provider-lcm(2016-01-08)"]/div/h2/a//following::a[contains(text(),'/operations/appc-provider-lcm:restart')]//following::form/div[2]/input[1]
+
+# Input Text xpath= //td[contains(text(), '(restart)input-TOP')]//following::textarea[@name='(restart)input-TOP'][3] ${file_content}
+
+# ${var}= Get Value xpath=//*[@id="resource_appc-provider-lcm(2016-01-08)"]/div/h2/a//following::a[contains(text(),'/operations/appc-provider-lcm:restart')]//following::h4[contains(text(),'Response Code')][1]//following-sibling::div//pre
+# Element Text Should Be xpath=//*[contains(text(),'/operations/appc-provider-lcm:restart')]//following::h4[text()='Response Code'][1]//following-sibling::div//pre[1][text()='200'] 200 expected
+
+
+Tear Down
+ [Documentation] Close all browsers
+ Close All Browsers
diff --git a/tests/appc/healthcheck/__init__.robot b/tests/appc/healthcheck/__init__.robot
new file mode 100644
index 00000000..3b8528df
--- /dev/null
+++ b/tests/appc/healthcheck/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation APPC - healthcheck
diff --git a/tests/appc/healthcheck/gettime.robot b/tests/appc/healthcheck/gettime.robot
new file mode 100644
index 00000000..9f376f9b
--- /dev/null
+++ b/tests/appc/healthcheck/gettime.robot
@@ -0,0 +1,40 @@
+*** Settings ***
+Library Selenium2Library
+Library OperatingSystem
+Library DateTime
+Library String
+##Library HttpLibrary.HTTP
+Library Collections
+
+
+*** Keywords ***
+
+Get Server time
+ [Documentation] Getting server time to update the json request
+ [Arguments] ${RequestFile}
+
+ ${date}= Get Current Date time_zone=local result_format=%Y-%m-%dT%H:%M:%S.%fZ exclude_millis=False
+
+ #updating the request file with the server time
+ ${file_content}= OperatingSystem.Get File ${RequestFile}
+ @{list}= Split to lines ${file_content}
+ ${data}= Get from list ${list} 5
+ @{splitted_string}= Split String ${data} : 1
+ ${time}= Get From List ${splitted_string} 1
+ Log ${time}
+ @{splitted_string_time}= Split String ${time} " 2
+ ${times1}= Get From List ${splitted_string_time} 1
+ Log ${times1}
+ ${replaced_string}= Replace String ${data} ${times1} ${date}
+ @{list1}= Split to lines ${file_content}
+ Remove from list ${list1} 5
+ Insert into list ${list1} 5 ${replaced_string}
+ Remove File ${RequestFile}
+ :FOR ${line} IN @{list1}
+ \ Append to File ${RequestFile} ${line} encoding=UTF-8
+ \ Append to File ${RequestFile} ${\n} encoding=UTF-8
+
+
+
+
+ \ No newline at end of file
diff --git a/tests/appc/healthcheck/test1.robot b/tests/appc/healthcheck/test1.robot
new file mode 100644
index 00000000..8bd49860
--- /dev/null
+++ b/tests/appc/healthcheck/test1.robot
@@ -0,0 +1,27 @@
+*** Settings ***
+Library OperatingSystem
+Library Process
+
+*** Variables ***
+
+${bundle_query} ${SCRIPTS}/bundle_query.sh
+${health_check} ${SCRIPTS}/health_check.sh
+${db_query} ${SCRIPTS}/db_query.sh
+
+
+*** Test Cases ***
+Health check test case for APPC
+ [Documentation] Health check
+ ${result_hc}= Run Process bash ${health_check} > log_hc.txt shell=yes
+ Should Be Equal As Integers ${result_hc.rc} 0
+
+Query bundle test case for APPC
+ [Documentation] Query bundles
+ ${result_bq}= Run Process bash ${bundle_query} > log_bq.txt shell=yes
+ Should Be Equal As Integers ${result_bq.rc} 0
+
+Query database test case for APPC
+ [Documentation] Query database
+ ${result_db}= Run Process bash ${db_query} > log_db.txt shell=yes
+ Should Be Equal As Integers ${result_db.rc} 0
+
diff --git a/tests/ccsdk/healthcheck/__init__.robot b/tests/ccsdk/healthcheck/__init__.robot
new file mode 100644
index 00000000..1259b890
--- /dev/null
+++ b/tests/ccsdk/healthcheck/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation CCSDK - healthcheck
diff --git a/tests/ccsdk/healthcheck/test1.robot b/tests/ccsdk/healthcheck/test1.robot
new file mode 100644
index 00000000..3c81d705
--- /dev/null
+++ b/tests/ccsdk/healthcheck/test1.robot
@@ -0,0 +1,16 @@
+*** Settings ***
+Library OperatingSystem
+Library Process
+
+*** Variables ***
+
+${health_check} ${SCRIPTS}/health_check.sh
+
+
+*** Test Cases ***
+Health check test case for CCSDK
+ [Documentation] Health check
+ ${result_hc}= Run Process bash ${health_check} > log_hc.txt shell=yes
+ Should Be Equal As Integers ${result_hc.rc} 0
+
+
diff --git a/tests/clamp/APIs/01__Create_CL_Holmes.robot b/tests/clamp/APIs/01__Create_CL_Holmes.robot
new file mode 100644
index 00000000..ce4c8df6
--- /dev/null
+++ b/tests/clamp/APIs/01__Create_CL_Holmes.robot
@@ -0,0 +1,47 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+${login} admin
+${passw} password
+
+*** Keywords ***
+Create the sessions
+ ${auth}= Create List ${login} ${passw}
+ Create Session clamp https://localhost:8443 auth=${auth} disable_warnings=1
+ Set Global Variable ${clamp_session} clamp
+
+*** Test Cases ***
+Get Requests health check ok
+ Create the sessions
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/healthcheck
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Get Requests verify test template found
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/cldsTempate/template-names
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain Match ${resp} *templateHolmes1*
+ Should Contain Match ${resp} *templateHolmes2*
+ Should Not Contain Match ${resp} *templateHolmes99*
+
+Put Requests to add Close Loop ClHolmes1
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createClHolmes1.json
+ &{headers}= Create Dictionary Content-Type=application/json
+ ${resp}= Put Request ${clamp_session} /restservices/clds/v1/clds/model/ClHolmes1 data=${data} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Put Requests to add Close Loop ClHolmes2
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createClHolmes2.json
+ &{headers}= Create Dictionary Content-Type=application/json
+ ${resp}= Put Request ${clamp_session} /restservices/clds/v1/clds/model/ClHolmes2 data=${data} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Get Requests verify CL1 found
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/model-names
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain Match ${resp} *ClHolmes1*
+ Should Contain Match ${resp} *ClHolmes2*
+ Should Not Contain Match ${resp} *ClHolmes99*
diff --git a/tests/clamp/APIs/02__Create_CL_TCA.robot b/tests/clamp/APIs/02__Create_CL_TCA.robot
new file mode 100644
index 00000000..15ab4b16
--- /dev/null
+++ b/tests/clamp/APIs/02__Create_CL_TCA.robot
@@ -0,0 +1,40 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+${login} admin
+${passw} password
+
+*** Test Cases ***
+Get Requests health check ok
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/healthcheck
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Get Requests verify test template found
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/cldsTempate/template-names
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain Match ${resp} *templateTCA1*
+ Should Contain Match ${resp} *CA2*
+ Should Not Contain Match ${resp} *templateTCA99*
+
+Put Requests to add Close Loop ClHolmes1
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createClTCA1.json
+ &{headers}= Create Dictionary Content-Type=application/json
+ ${resp}= Put Request ${clamp_session} /restservices/clds/v1/clds/model/ClTCA1 data=${data} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Put Requests to add Close Loop ClHolmes2
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createClTCA2.json
+ &{headers}= Create Dictionary Content-Type=application/json
+ ${resp}= Put Request ${clamp_session} /restservices/clds/v1/clds/model/ClTCA2 data=${data} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Get Requests verify CL1 found
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/model-names
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain Match ${resp} *ClTCA1*
+ Should Contain Match ${resp} *ClTCA2*
+ Should Not Contain Match ${resp} *ClTCA99*
diff --git a/tests/clamp/APIs/03__VariousApis.robot b/tests/clamp/APIs/03__VariousApis.robot
new file mode 100644
index 00000000..f3272839
--- /dev/null
+++ b/tests/clamp/APIs/03__VariousApis.robot
@@ -0,0 +1,37 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+${login} admin
+${passw} password
+
+*** Test Cases ***
+Get Clamp properties
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/cldsInfo
+ Dictionary Should Contain Key ${resp.json()} userName
+ Dictionary Should Contain Key ${resp.json()} permissionReadCl
+
+Get Clamp Info
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/cldsInfo
+ Dictionary Should Contain Key ${resp.json()} userName
+ Dictionary Should Contain Key ${resp.json()} cldsVersion
+
+Get model bpmn by name
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/model/bpmn/ClHolmes1
+ Should Contain Match ${resp} *StartEvent_*
+ Should Contain Match ${resp} *VesCollector_*
+ Should Contain Match ${resp} *Holmes_*
+ Should Contain Match ${resp} *Policy_*
+ Should Contain Match ${resp} *EndEvent_*
+
+Get model names
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/model-names
+ Should Contain Match ${resp} *ClHolmes1*
+ Should Contain Match ${resp} *ClHolmes2*
+ Should Contain Match ${resp} *ClTCA1*
+ Should Contain Match ${resp} *ClTCA2*
+ Should Not Contain Match ${resp} *ClHolmes99*
+ Should Not Contain Match ${resp} *ClTCA99*
diff --git a/tests/clamp/APIs/04__Verify_API_Models.robot b/tests/clamp/APIs/04__Verify_API_Models.robot
new file mode 100644
index 00000000..42c5c43d
--- /dev/null
+++ b/tests/clamp/APIs/04__Verify_API_Models.robot
@@ -0,0 +1,67 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+${login} admin
+${passw} password
+
+*** Test Cases ***
+Verify HolmesModel1
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/model/ClHolmes1
+ Should Contain Match ${resp} *templateHolmes1*
+ Should Contain Match ${resp} *DC1*
+ Should Contain Match ${resp} *DC2*
+ Should Contain Match ${resp} *Policy1*
+ Should Contain Match ${resp} *vnfRecipe*
+ Should Contain Match ${resp} *180*
+ Should Contain Match ${resp} *345*
+ Should Contain Match ${resp} *Config Policy name1*
+
+Verify HolmesModel2
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/model/ClHolmes2
+ Should Contain Match ${resp} *templateHolmes2*
+ Should Contain Match ${resp} *DC2*
+ Should Contain Match ${resp} *DC3*
+ Should Contain Match ${resp} *Policy2*
+ Should Contain Match ${resp} *vnfRecipe*
+ Should Contain Match ${resp} *migrate*
+ Should Contain Match ${resp} *360*
+ Should Contain Match ${resp} *345*
+ Should Contain Match ${resp} *Config Policy Name2*
+
+Verify TCAModel1
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/model/ClTCA1
+ Should Contain Match ${resp} *templateTCA1*
+ Should Contain Match ${resp} *enbRecipe*
+ Should Contain Match ${resp} *DC1*
+ Should Contain Match ${resp} *DC2*
+ Should Contain Match ${resp} *Policy3*
+ Should Contain Match ${resp} *345*
+ Should Contain Match ${resp} *200*
+ Should Contain Match ${resp} *ONSET*
+
+Verify TCAModel2
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/model/ClTCA2
+ Should Contain Match ${resp} *templateTCA2*
+ Should Contain Match ${resp} *enbRecipe*
+ Should Contain Match ${resp} *DC1*
+ Should Contain Match ${resp} *DC2*
+ Should Contain Match ${resp} *DC3*
+ Should Contain Match ${resp} *Policy4*
+ Should Contain Match ${resp} *tcaPol*
+ Should Contain Match ${resp} *345*
+ Should Contain Match ${resp} *300*
+ Should Contain Match ${resp} *VM*
+
+Get model names
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/model-names
+ Should Contain Match ${resp} *ClHolmes1*
+ Should Contain Match ${resp} *ClHolmes2*
+ Should Contain Match ${resp} *ClTCA1*
+ Should Contain Match ${resp} *ClTCA2*
+ Should Not Contain Match ${resp} *ClTCA99*
+ Should Not Contain Match ${resp} *ClHolmes99*
+
diff --git a/tests/clamp/APIs/__init__.robot b/tests/clamp/APIs/__init__.robot
new file mode 100644
index 00000000..de57680c
--- /dev/null
+++ b/tests/clamp/APIs/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Clamp - APIs
diff --git a/tests/clamp/APIs/data/createClHolmes1.json b/tests/clamp/APIs/data/createClHolmes1.json
new file mode 100644
index 00000000..5c89efdb
--- /dev/null
+++ b/tests/clamp/APIs/data/createClHolmes1.json
@@ -0,0 +1,10 @@
+{
+ "name":"ClHolmes1",
+ "controlNamePrefix":"ClosedLoop-",
+ "bpmnText":"",
+ "propText":"{\"global\":[{\"name\":\"service\",\"value\":[\"4cc5b45a-1f63-4194-8100-cd8e14248c92\"]},{\"name\":\"vf\",\"value\":[\"07e266fc-49ab-4cd7-8378-ca4676f1b9ec\"]},{\"name\":\"actionSet\",\"value\":[\"vnfRecipe\"]},{\"name\":\"location\",\"value\":[\"DC1\",\"DC2\"]}],\"Holmes_1gxp0mm\":[{\"name\":\"correlationalLogic\",\"value\":\"correlational logic1\"},{\"name\":\"configPolicyName\",\"value\":\"Config Policy name1\"}],\"Policy_136qatf\":{\"Policy1\":[{\"name\":\"pname\",\"value\":\"Policy1\"},{\"name\":\"pid\",\"value\":\"0\"},{\"name\":\"timeout\",\"value\":\"345\"},{\"policyConfigurations\":[[{\"name\":\"recipe\",\"value\":[\"restart\"]},{\"name\":\"maxRetries\",\"value\":[\"3\"]},{\"name\":\"retryTimeLimit\",\"value\":[\"180\"]},{\"name\":\"_id\",\"value\":[\"QxHBjiW\"]},{\"name\":\"parentPolicy\",\"value\":[\"\"]},{\"name\":\"targetResourceId\",\"value\":[\"\"]}]]}]}}",
+ "imageText":"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" viewbox=\"\" width=\"100%\" height=\"100%\"><defs><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"11\" refY=\"10\" id=\"markerSjdype4kmx\"><path d=\"M 1 5 L 11 10 L 1 15 Z\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"20\" markerHeight=\"20\" orient=\"auto\" refX=\"6\" refY=\"6\" id=\"markerSjdype4kmz\"><circle cx=\"6\" cy=\"6\" r=\"3.5\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></circle></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"20\" markerHeight=\"20\" orient=\"auto\" refX=\"8.5\" refY=\"5\" id=\"markerSjdype4km11\"><path d=\"m 1 5 l 0 -3 l 7 3 l -7 3 z\" style=\"stroke-width: 1; stroke-linecap: butt; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"11\" refY=\"10\" id=\"markerSjdype4km13\"><path d=\"M 1 5 L 11 10 L 1 15\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"-1\" refY=\"10\" id=\"markerSjdype4km15\"><path d=\"M 0 10 L 8 6 L 16 10 L 8 14 Z\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"-5\" refY=\"10\" id=\"markerSjdype4km17\"><path d=\"M 1 4 L 5 16\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#000000\" stroke=\"#000000\"></path></marker></defs><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"StartEvent_1\" transform=\"matrix(1,0,0,1,50,162)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"48\" height=\"48\"></rect><g class=\"djs-visual\"><circle cx=\"18\" cy=\"18\" r=\"18\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></circle></g><rect x=\"0\" y=\"0\" width=\"36\" height=\"36\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"StartEvent_1_label\" transform=\"matrix(1,0,0,1,23,198)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"VesCollector_1arss4p\" transform=\"matrix(1,0,0,1,217,140)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"132\" height=\"92\"></rect><g class=\"djs-visual\"><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" rx=\"0\" ry=\"0\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></rect><polyline points=\"120,80 120,20 \" style=\"stroke-width: 2;\" fill=\"none\" stroke=\"#000000\"></polyline><polyline points=\"20,0 20,80 \" style=\"stroke-width: 2;\" fill=\"none\" stroke=\"#000000\"></polyline><text style=\"font-family: Arial,sans-serif; font-size: 12px;\"><tspan x=\"5\" y=\"14\">V</tspan></text><text style=\"font-family: Arial,sans-serif; font-size: 12px;\"><tspan x=\"5\" y=\"26\">E</tspan></text><text style=\"font-family: Arial,sans-serif; font-size: 12px;\"><tspan x=\"5\" y=\"38\">S</tspan></text><text style=\"font-family: Arial,sans-serif; font-size: 12px;\" class=\" djs-label\"><tspan x=\"25.5\" y=\"43.5\">VesCollector</tspan></text></g><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"Holmes_1gxp0mm\" transform=\"matrix(1,0,0,1,463,140)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"132\" height=\"92\"></rect><g class=\"djs-visual\"><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" rx=\"0\" ry=\"0\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></rect><circle cx=\"15\" cy=\"15\" r=\"10\" style=\"stroke-width: 1;\" stroke=\"#000000\" fill=\"#ffffff\"></circle><text style=\"font-family: Arial,sans-serif; font-size: 12px;\"><tspan x=\"11\" y=\"20\">H</tspan></text><text style=\"font-family: Arial,sans-serif; font-size: 12px;\" class=\" djs-label\"><tspan x=\"39\" y=\"43.5\">Holmes</tspan></text></g><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"Policy_136qatf\" transform=\"matrix(1,0,0,1,713,140)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"132\" height=\"92\"></rect><g class=\"djs-visual\"><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" rx=\"0\" ry=\"0\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></rect><polyline points=\"0,40 60,0 \" style=\"stroke-width: 2;\" fill=\"none\" stroke=\"#000000\"></polyline><text style=\"font-family: Arial,sans-serif; font-size: 12px;\" class=\" djs-label\"><tspan x=\"43.5\" y=\"43.5\">Policy</tspan></text></g><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape selected\" data-element-id=\"EndEvent_034z36u\" transform=\"matrix(1,0,0,1,937,162)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"48\" height=\"48\"></rect><g class=\"djs-visual\"><circle cx=\"18\" cy=\"18\" r=\"18\" style=\"stroke-width: 4;\" stroke=\"#000000\" fill=\"#ffffff\"></circle></g><rect x=\"0\" y=\"0\" width=\"36\" height=\"36\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect><g class=\" djs-resizer djs-resizer-nw\" transform=\"matrix(1,0,0,1,0,0)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g><g class=\" djs-resizer djs-resizer-ne\" transform=\"matrix(0,1,-1,0,36,0)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g><g class=\" djs-resizer djs-resizer-se\" transform=\"matrix(-1,0,0,-1,36,36)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g><g class=\" djs-resizer djs-resizer-sw\" transform=\"matrix(0,-1,1,0,0,36)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"EndEvent_034z36u_label\" transform=\"matrix(1,0,0,1,910,198)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_1d9v6ya\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"80\" y=\"174\" width=\"143\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 86,180L217,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmx&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"86,180 217,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_1d9v6ya_label\" transform=\"matrix(1,0,0,1,106.5,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_01q83h9\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"331\" y=\"174\" width=\"138\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 337,180L463,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmx&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"337,180 463,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_01q83h9_label\" transform=\"matrix(1,0,0,1,355,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_1gw4hg3\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"577\" y=\"174\" width=\"142\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 583,180L713,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmx&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"583,180 713,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_1gw4hg3_label\" transform=\"matrix(1,0,0,1,603,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_07go3oi\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"827\" y=\"174\" width=\"116\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 833,180L937,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmx&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"833,180 937,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_07go3oi_label\" transform=\"matrix(1,0,0,1,840,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g></svg>",
+ "templateName":"templateHolmes1",
+ "typeId":null,
+ "deploymentId":null
+} \ No newline at end of file
diff --git a/tests/clamp/APIs/data/createClHolmes2.json b/tests/clamp/APIs/data/createClHolmes2.json
new file mode 100644
index 00000000..69055895
--- /dev/null
+++ b/tests/clamp/APIs/data/createClHolmes2.json
@@ -0,0 +1,10 @@
+{
+ "name":"ClHolmes2",
+ "controlNamePrefix":"ClosedLoop-",
+ "bpmnText":"",
+ "propText":"{\"Holmes_0bsv00m\":[{\"name\":\"correlationalLogic\",\"value\":\"correlation logic2\"},{\"name\":\"configPolicyName\",\"value\":\"Config Policy Name2\"}],\"global\":[{\"name\":\"service\",\"value\":[\"c95b0e7c-c1f0-4287-9928-7964c5377a46\"]},{\"name\":\"vf\",\"value\":[\"48504e0e-f3d3-411d-a52b-eda1b8fec073\"]},{\"name\":\"actionSet\",\"value\":[\"vnfRecipe\"]},{\"name\":\"location\",\"value\":[\"DC2\",\"DC3\"]}],\"Policy_114xo8j\":{\"Policy2\":[{\"name\":\"pname\",\"value\":\"Policy2\"},{\"name\":\"pid\",\"value\":\"0\"},{\"name\":\"timeout\",\"value\":\"345\"},{\"policyConfigurations\":[[{\"name\":\"recipe\",\"value\":[\"migrate\"]},{\"name\":\"maxRetries\",\"value\":[\"3\"]},{\"name\":\"retryTimeLimit\",\"value\":[\"360\"]},{\"name\":\"_id\",\"value\":[\"dHQXiOz\"]},{\"name\":\"parentPolicy\",\"value\":[\"\"]},{\"name\":\"targetResourceId\",\"value\":[\"\"]}]]}]}}",
+ "imageText":"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" viewbox=\"\" width=\"100%\" height=\"100%\"><defs><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"11\" refY=\"10\" id=\"markerSjdype4kmbu\"><path d=\"M 1 5 L 11 10 L 1 15 Z\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"20\" markerHeight=\"20\" orient=\"auto\" refX=\"6\" refY=\"6\" id=\"markerSjdype4kmbw\"><circle cx=\"6\" cy=\"6\" r=\"3.5\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></circle></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"20\" markerHeight=\"20\" orient=\"auto\" refX=\"8.5\" refY=\"5\" id=\"markerSjdype4kmby\"><path d=\"m 1 5 l 0 -3 l 7 3 l -7 3 z\" style=\"stroke-width: 1; stroke-linecap: butt; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"11\" refY=\"10\" id=\"markerSjdype4kmc0\"><path d=\"M 1 5 L 11 10 L 1 15\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"-1\" refY=\"10\" id=\"markerSjdype4kmc2\"><path d=\"M 0 10 L 8 6 L 16 10 L 8 14 Z\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"-5\" refY=\"10\" id=\"markerSjdype4kmc4\"><path d=\"M 1 4 L 5 16\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#000000\" stroke=\"#000000\"></path></marker></defs><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"StartEvent_1\" transform=\"matrix(1,0,0,1,50,162)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"48\" height=\"48\"></rect><g class=\"djs-visual\"><circle cx=\"18\" cy=\"18\" r=\"18\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></circle></g><rect x=\"0\" y=\"0\" width=\"36\" height=\"36\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"StartEvent_1_label\" transform=\"matrix(1,0,0,1,23,198)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"Holmes_0bsv00m\" transform=\"matrix(1,0,0,1,438,140)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"132\" height=\"92\"></rect><g class=\"djs-visual\"><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" rx=\"0\" ry=\"0\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></rect><circle cx=\"15\" cy=\"15\" r=\"10\" style=\"stroke-width: 1;\" stroke=\"#000000\" fill=\"#ffffff\"></circle><text style=\"font-family: Arial,sans-serif; font-size: 12px;\"><tspan x=\"11\" y=\"20\">H</tspan></text><text style=\"font-family: Arial,sans-serif; font-size: 12px;\" class=\" djs-label\"><tspan x=\"39\" y=\"43.5\">Holmes</tspan></text></g><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"VesCollector_1ljyqg8\" transform=\"matrix(1,0,0,1,213,140)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"132\" height=\"92\"></rect><g class=\"djs-visual\"><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" rx=\"0\" ry=\"0\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></rect><polyline points=\"120,80 120,20 \" style=\"stroke-width: 2;\" fill=\"none\" stroke=\"#000000\"></polyline><polyline points=\"20,0 20,80 \" style=\"stroke-width: 2;\" fill=\"none\" stroke=\"#000000\"></polyline><text style=\"font-family: Arial,sans-serif; font-size: 12px;\"><tspan x=\"5\" y=\"14\">V</tspan></text><text style=\"font-family: Arial,sans-serif; font-size: 12px;\"><tspan x=\"5\" y=\"26\">E</tspan></text><text style=\"font-family: Arial,sans-serif; font-size: 12px;\"><tspan x=\"5\" y=\"38\">S</tspan></text><text style=\"font-family: Arial,sans-serif; font-size: 12px;\" class=\" djs-label\"><tspan x=\"25.5\" y=\"43.5\">VesCollector</tspan></text></g><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"Policy_114xo8j\" transform=\"matrix(1,0,0,1,678,140)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"132\" height=\"92\"></rect><g class=\"djs-visual\"><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" rx=\"0\" ry=\"0\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></rect><polyline points=\"0,40 60,0 \" style=\"stroke-width: 2;\" fill=\"none\" stroke=\"#000000\"></polyline><text style=\"font-family: Arial,sans-serif; font-size: 12px;\" class=\" djs-label\"><tspan x=\"43.5\" y=\"43.5\">Policy</tspan></text></g><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape selected\" data-element-id=\"EndEvent_0b4m6bk\" transform=\"matrix(1,0,0,1,901,162)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"48\" height=\"48\"></rect><g class=\"djs-visual\"><circle cx=\"18\" cy=\"18\" r=\"18\" style=\"stroke-width: 4;\" stroke=\"#000000\" fill=\"#ffffff\"></circle></g><rect x=\"0\" y=\"0\" width=\"36\" height=\"36\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect><g class=\" djs-resizer djs-resizer-nw\" transform=\"matrix(1,0,0,1,0,0)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g><g class=\" djs-resizer djs-resizer-ne\" transform=\"matrix(0,1,-1,0,36,0)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g><g class=\" djs-resizer djs-resizer-se\" transform=\"matrix(-1,0,0,-1,36,36)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g><g class=\" djs-resizer djs-resizer-sw\" transform=\"matrix(0,-1,1,0,0,36)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"EndEvent_0b4m6bk_label\" transform=\"matrix(1,0,0,1,874,198)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_1c9hzec\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"80\" y=\"174\" width=\"139\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 86,180L213,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmbu&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"86,180 213,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_1c9hzec_label\" transform=\"matrix(1,0,0,1,104.5,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_1ig3gix\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"327\" y=\"174\" width=\"117\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 333,180L438,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmbu&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"333,180 438,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_1ig3gix_label\" transform=\"matrix(1,0,0,1,340.5,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_0zwbn2r\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"552\" y=\"174\" width=\"132\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 558,180L678,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmbu&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"558,180 678,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_0zwbn2r_label\" transform=\"matrix(1,0,0,1,573,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_0ox6r95\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"792\" y=\"174\" width=\"115\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 798,180L901,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmbu&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"798,180 901,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_0ox6r95_label\" transform=\"matrix(1,0,0,1,804.5,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g></svg>",
+ "templateName":"templateHolmes2",
+ "typeId":null,
+ "deploymentId":null
+} \ No newline at end of file
diff --git a/tests/clamp/APIs/data/createClTCA1.json b/tests/clamp/APIs/data/createClTCA1.json
new file mode 100644
index 00000000..509288b5
--- /dev/null
+++ b/tests/clamp/APIs/data/createClTCA1.json
@@ -0,0 +1,10 @@
+{
+ "name":"ClTCA1",
+ "controlNamePrefix":"ClosedLoop-",
+ "bpmnText":"",
+ "propText":"{\"global\":[{\"name\":\"service\",\"value\":[\"4cc5b45a-1f63-4194-8100-cd8e14248c92\"]},{\"name\":\"vf\",\"value\":[\"023a3f0d-1161-45ff-b4cf-8918a8ccf3ad\"]},{\"name\":\"actionSet\",\"value\":[\"enbRecipe\"]},{\"name\":\"location\",\"value\":[\"DC1\",\"DC2\"]}],\"TCA_1d13unw\":{\"TCA1\":[{\"name\":\"tname\",\"value\":\"TCA1\"},{\"name\":\"tuuid\",\"value\":\"ce57408b-93ba-td02-1622-165abd6c5ff5\"},{\"name\":\"tcaPol\",\"value\":\"Policy3\"},{\"name\":\"eventName\",\"value\":\"vLoadBalancer\"},{\"name\":\"controlLoopSchemaType\",\"value\":\"VNF\"},{\"name\":\"tcaPolId\",\"value\":\"0\"},{\"serviceConfigurations\":[[\"$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsDelta\",\"GREATER\",\"5\",\"ONSET\"]]}]},\"Policy_12lup3h\":{\"Policy3\":[{\"name\":\"pname\",\"value\":\"Policy3\"},{\"name\":\"pid\",\"value\":\"0\"},{\"name\":\"timeout\",\"value\":\"345\"},{\"policyConfigurations\":[[{\"name\":\"recipe\",\"value\":[\"reset\"]},{\"name\":\"maxRetries\",\"value\":[\"3\"]},{\"name\":\"retryTimeLimit\",\"value\":[\"200\"]},{\"name\":\"_id\",\"value\":[\"lecrG3I\"]},{\"name\":\"parentPolicy\",\"value\":[\"\"]},{\"name\":\"targetResourceId\",\"value\":[\"\"]}]]}]}}",
+ "imageText":"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" viewbox=\"\" width=\"100%\" height=\"100%\"><defs><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"11\" refY=\"10\" id=\"markerSjdype4kmnw\"><path d=\"M 1 5 L 11 10 L 1 15 Z\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"20\" markerHeight=\"20\" orient=\"auto\" refX=\"6\" refY=\"6\" id=\"markerSjdype4kmny\"><circle cx=\"6\" cy=\"6\" r=\"3.5\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></circle></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"20\" markerHeight=\"20\" orient=\"auto\" refX=\"8.5\" refY=\"5\" id=\"markerSjdype4kmo0\"><path d=\"m 1 5 l 0 -3 l 7 3 l -7 3 z\" style=\"stroke-width: 1; stroke-linecap: butt; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"11\" refY=\"10\" id=\"markerSjdype4kmo2\"><path d=\"M 1 5 L 11 10 L 1 15\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"-1\" refY=\"10\" id=\"markerSjdype4kmo4\"><path d=\"M 0 10 L 8 6 L 16 10 L 8 14 Z\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"-5\" refY=\"10\" id=\"markerSjdype4kmo6\"><path d=\"M 1 4 L 5 16\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#000000\" stroke=\"#000000\"></path></marker></defs><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"StartEvent_1\" transform=\"matrix(1,0,0,1,50,162)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"48\" height=\"48\"></rect><g class=\"djs-visual\"><circle cx=\"18\" cy=\"18\" r=\"18\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></circle></g><rect x=\"0\" y=\"0\" width=\"36\" height=\"36\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"StartEvent_1_label\" transform=\"matrix(1,0,0,1,23,198)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"VesCollector_1g9cmz0\" transform=\"matrix(1,0,0,1,207,140)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"132\" height=\"92\"></rect><g class=\"djs-visual\"><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" rx=\"0\" ry=\"0\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></rect><polyline points=\"120,80 120,20 \" style=\"stroke-width: 2;\" fill=\"none\" stroke=\"#000000\"></polyline><polyline points=\"20,0 20,80 \" style=\"stroke-width: 2;\" fill=\"none\" stroke=\"#000000\"></polyline><text style=\"font-family: Arial,sans-serif; font-size: 12px;\"><tspan x=\"5\" y=\"14\">V</tspan></text><text style=\"font-family: Arial,sans-serif; font-size: 12px;\"><tspan x=\"5\" y=\"26\">E</tspan></text><text style=\"font-family: Arial,sans-serif; font-size: 12px;\"><tspan x=\"5\" y=\"38\">S</tspan></text><text style=\"font-family: Arial,sans-serif; font-size: 12px;\" class=\" djs-label\"><tspan x=\"25.5\" y=\"43.5\">VesCollector</tspan></text></g><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"TCA_1d13unw\" transform=\"matrix(1,0,0,1,453,140)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"132\" height=\"92\"></rect><g class=\"djs-visual\"><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" rx=\"0\" ry=\"0\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></rect><polyline points=\"0,60 120,60 \" style=\"stroke-width: 2;\" fill=\"none\" stroke=\"#000000\"></polyline><text style=\"font-family: Arial,sans-serif; font-size: 12px;\" class=\" djs-label\"><tspan x=\"48\" y=\"43.5\">TCA</tspan></text></g><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"Policy_12lup3h\" transform=\"matrix(1,0,0,1,687,140)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"132\" height=\"92\"></rect><g class=\"djs-visual\"><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" rx=\"0\" ry=\"0\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></rect><polyline points=\"0,40 60,0 \" style=\"stroke-width: 2;\" fill=\"none\" stroke=\"#000000\"></polyline><text style=\"font-family: Arial,sans-serif; font-size: 12px;\" class=\" djs-label\"><tspan x=\"43.5\" y=\"43.5\">Policy</tspan></text></g><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape selected\" data-element-id=\"EndEvent_16kg9fx\" transform=\"matrix(1,0,0,1,925,162)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"48\" height=\"48\"></rect><g class=\"djs-visual\"><circle cx=\"18\" cy=\"18\" r=\"18\" style=\"stroke-width: 4;\" stroke=\"#000000\" fill=\"#ffffff\"></circle></g><rect x=\"0\" y=\"0\" width=\"36\" height=\"36\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect><g class=\" djs-resizer djs-resizer-nw\" transform=\"matrix(1,0,0,1,0,0)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g><g class=\" djs-resizer djs-resizer-ne\" transform=\"matrix(0,1,-1,0,36,0)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g><g class=\" djs-resizer djs-resizer-se\" transform=\"matrix(-1,0,0,-1,36,36)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g><g class=\" djs-resizer djs-resizer-sw\" transform=\"matrix(0,-1,1,0,0,36)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"EndEvent_16kg9fx_label\" transform=\"matrix(1,0,0,1,898,198)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_1ahk7jg\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"80\" y=\"174\" width=\"133\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 86,180L207,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"86,180 207,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_1ahk7jg_label\" transform=\"matrix(1,0,0,1,101.5,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_18ahat1\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"321\" y=\"174\" width=\"138\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 327,180L453,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"327,180 453,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_18ahat1_label\" transform=\"matrix(1,0,0,1,345,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_1mo9gxb\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"567\" y=\"174\" width=\"126\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 573,180L687,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"573,180 687,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_1mo9gxb_label\" transform=\"matrix(1,0,0,1,585,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_1dgtrrq\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"801\" y=\"174\" width=\"130\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 807,180L925,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"807,180 925,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_1dgtrrq_label\" transform=\"matrix(1,0,0,1,821,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g></svg>",
+ "templateName":"templateTCA1",
+ "typeId":null,
+ "deploymentId":null
+} \ No newline at end of file
diff --git a/tests/clamp/APIs/data/createClTCA2.json b/tests/clamp/APIs/data/createClTCA2.json
new file mode 100644
index 00000000..5754a8e2
--- /dev/null
+++ b/tests/clamp/APIs/data/createClTCA2.json
@@ -0,0 +1,10 @@
+{
+ "name":"ClTCA2",
+ "controlNamePrefix":"ClosedLoop-",
+ "bpmnText":"",
+ "propText":"{\"Policy_1r0guma\":{\"Policy4\":[{\"name\":\"pname\",\"value\":\"Policy4\"},{\"name\":\"pid\",\"value\":\"0\"},{\"name\":\"timeout\",\"value\":\"345\"},{\"policyConfigurations\":[[{\"name\":\"recipe\",\"value\":[\"reset\"]},{\"name\":\"maxRetries\",\"value\":[\"3\"]},{\"name\":\"retryTimeLimit\",\"value\":[\"300\"]},{\"name\":\"_id\",\"value\":[\"JoL9ecT\"]},{\"name\":\"parentPolicy\",\"value\":[\"\"]},{\"name\":\"targetResourceId\",\"value\":[\"\"]}]]}]},\"global\":[{\"name\":\"service\",\"value\":[\"4cc5b45a-1f63-4194-8100-cd8e14248c92\"]},{\"name\":\"vf\",\"value\":[\"023a3f0d-1161-45ff-b4cf-8918a8ccf3ad\"]},{\"name\":\"actionSet\",\"value\":[\"enbRecipe\"]},{\"name\":\"location\",\"value\":[\"DC1\",\"DC2\",\"DC3\"]}],\"TCA_09syovq\":{\"TCA2\":[{\"name\":\"tname\",\"value\":\"TCA2\"},{\"name\":\"tuuid\",\"value\":\"3794f32d-8d95-tf61-444b-0b374cc173b2\"},{\"name\":\"tcaPol\",\"value\":\"Policy4\"},{\"name\":\"eventName\",\"value\":\"vLoadBalancer\"},{\"name\":\"controlLoopSchemaType\",\"value\":\"VM\"},{\"name\":\"tcaPolId\",\"value\":\"0\"},{\"serviceConfigurations\":[[\"$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsDelta\",\"GREATER\",\"15\",\"ONSET\",\"undefined\"]]}]}}",
+ "imageText":"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" viewbox=\"\" width=\"100%\" height=\"100%\"><defs><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"11\" refY=\"10\" id=\"markerSjdype4kmyk\"><path d=\"M 1 5 L 11 10 L 1 15 Z\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"20\" markerHeight=\"20\" orient=\"auto\" refX=\"6\" refY=\"6\" id=\"markerSjdype4kmym\"><circle cx=\"6\" cy=\"6\" r=\"3.5\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></circle></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"20\" markerHeight=\"20\" orient=\"auto\" refX=\"8.5\" refY=\"5\" id=\"markerSjdype4kmyo\"><path d=\"m 1 5 l 0 -3 l 7 3 l -7 3 z\" style=\"stroke-width: 1; stroke-linecap: butt; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"11\" refY=\"10\" id=\"markerSjdype4kmyq\"><path d=\"M 1 5 L 11 10 L 1 15\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"-1\" refY=\"10\" id=\"markerSjdype4kmys\"><path d=\"M 0 10 L 8 6 L 16 10 L 8 14 Z\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#ffffff\" stroke=\"#000000\"></path></marker><marker viewBox=\"0 0 20 20\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto\" refX=\"-5\" refY=\"10\" id=\"markerSjdype4kmyu\"><path d=\"M 1 4 L 5 16\" style=\"stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;\" fill=\"#000000\" stroke=\"#000000\"></path></marker></defs><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"StartEvent_1\" transform=\"matrix(1,0,0,1,50,162)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"48\" height=\"48\"></rect><g class=\"djs-visual\"><circle cx=\"18\" cy=\"18\" r=\"18\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></circle></g><rect x=\"0\" y=\"0\" width=\"36\" height=\"36\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"StartEvent_1_label\" transform=\"matrix(1,0,0,1,23,198)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"VesCollector_1u6hupb\" transform=\"matrix(1,0,0,1,231,140)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"132\" height=\"92\"></rect><g class=\"djs-visual\"><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" rx=\"0\" ry=\"0\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></rect><polyline points=\"120,80 120,20 \" style=\"stroke-width: 2;\" fill=\"none\" stroke=\"#000000\"></polyline><polyline points=\"20,0 20,80 \" style=\"stroke-width: 2;\" fill=\"none\" stroke=\"#000000\"></polyline><text style=\"font-family: Arial,sans-serif; font-size: 12px;\"><tspan x=\"5\" y=\"14\">V</tspan></text><text style=\"font-family: Arial,sans-serif; font-size: 12px;\"><tspan x=\"5\" y=\"26\">E</tspan></text><text style=\"font-family: Arial,sans-serif; font-size: 12px;\"><tspan x=\"5\" y=\"38\">S</tspan></text><text style=\"font-family: Arial,sans-serif; font-size: 12px;\" class=\" djs-label\"><tspan x=\"25.5\" y=\"43.5\">VesCollector</tspan></text></g><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"TCA_09syovq\" transform=\"matrix(1,0,0,1,472,140)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"132\" height=\"92\"></rect><g class=\"djs-visual\"><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" rx=\"0\" ry=\"0\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></rect><polyline points=\"0,60 120,60 \" style=\"stroke-width: 2;\" fill=\"none\" stroke=\"#000000\"></polyline><text style=\"font-family: Arial,sans-serif; font-size: 12px;\" class=\" djs-label\"><tspan x=\"48\" y=\"43.5\">TCA</tspan></text></g><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"Policy_1r0guma\" transform=\"matrix(1,0,0,1,721,140)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"132\" height=\"92\"></rect><g class=\"djs-visual\"><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" rx=\"0\" ry=\"0\" style=\"stroke-width: 2;\" stroke=\"#000000\" fill=\"#ffffff\"></rect><polyline points=\"0,40 60,0 \" style=\"stroke-width: 2;\" fill=\"none\" stroke=\"#000000\"></polyline><text style=\"font-family: Arial,sans-serif; font-size: 12px;\" class=\" djs-label\"><tspan x=\"43.5\" y=\"43.5\">Policy</tspan></text></g><rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape selected\" data-element-id=\"EndEvent_04x88vg\" transform=\"matrix(1,0,0,1,966,162)\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"48\" height=\"48\"></rect><g class=\"djs-visual\"><circle cx=\"18\" cy=\"18\" r=\"18\" style=\"stroke-width: 4;\" stroke=\"#000000\" fill=\"#ffffff\"></circle></g><rect x=\"0\" y=\"0\" width=\"36\" height=\"36\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect><g class=\" djs-resizer djs-resizer-nw\" transform=\"matrix(1,0,0,1,0,0)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g><g class=\" djs-resizer djs-resizer-ne\" transform=\"matrix(0,1,-1,0,36,0)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g><g class=\" djs-resizer djs-resizer-se\" transform=\"matrix(-1,0,0,-1,36,36)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g><g class=\" djs-resizer djs-resizer-sw\" transform=\"matrix(0,-1,1,0,0,36)\"><rect x=\"-7\" y=\"-7\" width=\"5\" height=\"5\" class=\" djs-resizer-visual\"></rect><rect x=\"-7\" y=\"-7\" width=\"20\" height=\"20\" class=\" djs-resizer-hit\"></rect></g></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"EndEvent_04x88vg_label\" transform=\"matrix(1,0,0,1,939,198)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_0y4m01s\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"80\" y=\"174\" width=\"157\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 86,180L231,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmyk&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"86,180 231,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_0y4m01s_label\" transform=\"matrix(1,0,0,1,113.5,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_10vqotq\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"345\" y=\"174\" width=\"133\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 351,180L472,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmyk&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"351,180 472,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_10vqotq_label\" transform=\"matrix(1,0,0,1,366.5,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_0fpkygk\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"586\" y=\"174\" width=\"141\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 592,180L721,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmyk&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"592,180 721,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_0fpkygk_label\" transform=\"matrix(1,0,0,1,611.5,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-connection\" data-element-id=\"SequenceFlow_0jsvuvu\" style=\"display: block;\"><rect fill=\"none\" class=\"djs-outline\" x=\"835\" y=\"174\" width=\"137\" height=\"12\"></rect><g class=\"djs-visual\"><path d=\"m 841,180L966,180 \" style=\"stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmyk&quot;);\" fill=\"none\" stroke=\"#000000\"></path></g><polyline points=\"841,180 966,180 \" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></polyline></g></g><g class=\"djs-group\" xmlns=\"http://www.w3.org/2000/svg\"><g class=\"djs-element djs-shape\" data-element-id=\"SequenceFlow_0jsvuvu_label\" transform=\"matrix(1,0,0,1,858.5,170)\" style=\"display: none;\"><rect fill=\"none\" class=\"djs-outline\" x=\"-6\" y=\"-6\" width=\"102\" height=\"32\"></rect><g class=\"djs-visual\"><text style=\"font-family: Arial,sans-serif; font-size: 11px;\" class=\" djs-label\"><tspan x=\"45\" y=\"0\"></tspan></text></g><rect x=\"0\" y=\"0\" width=\"90\" height=\"20\" style=\"stroke-opacity: 0; stroke-width: 15;\" fill=\"none\" stroke=\"#ffffff\" class=\"djs-hit\"></rect></g></g></svg>",
+ "templateName":"templateTCA2",
+ "typeId":null,
+ "deploymentId":null
+} \ No newline at end of file
diff --git a/tests/clamp/UIs/01__Create_Holmes_model.robot b/tests/clamp/UIs/01__Create_Holmes_model.robot
new file mode 100644
index 00000000..e8b1429d
--- /dev/null
+++ b/tests/clamp/UIs/01__Create_Holmes_model.robot
@@ -0,0 +1,95 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library ../../../scripts/clamp/python-lib/CustomSeleniumLibrary.py
+Library XvfbRobot
+
+*** Variables ***
+${login} admin
+${passw} password
+${SELENIUM_SPEED_FAST} .2 seconds
+${SELENIUM_SPEED_SLOW} .5 seconds
+${BASE_URL} https://localhost:8443
+
+*** Keywords ***
+Create the sessions
+ ${auth}= Create List ${login} ${passw}
+ Create Session clamp ${BASE_URL} auth=${auth} disable_warnings=1
+ Set Global Variable ${clamp_session} clamp
+
+*** Test Cases ***
+Get Requests health check ok
+ Create the sessions
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/healthcheck
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Open Browser
+# Next line is to be enabled for Headless tests only (jenkins?). To see the tests disable the line.
+ Start Virtual Display 1920 1080
+ Set Selenium Speed ${SELENIUM_SPEED_SLOW}
+ Open Browser ${BASE_URL}/designer/index.html browser=firefox
+
+Reply to authentication popup
+ Run Keyword And Ignore Error Insert into prompt ${login} ${passw}
+ Confirm action
+
+Good Login to Clamp UI and Verify logged in
+ Set Window Size 1920 1080
+ ${title}= Get Title
+ Should Be Equal CLDS ${title}
+ Wait Until Element Is Visible xpath=//*[@class="navbar-brand logo_name ng-binding"] timeout=60
+ Element Text Should Be xpath=//*[@class="navbar-brand logo_name ng-binding"] expected=Hello:admin
+
+Create Model from Menu
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[1]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[1]/a
+ Wait Until Element Is Visible locator=Create CL timeout=60
+ Click Element locator=Create CL
+ Input Text locator=modelName text=HolmesModel1
+ Select From List By Label id=templateName templateHolmes1
+ Click Button locator=Create
+
+Set Properties for HolmesModel1
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[1]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[1]/a
+ Wait Until Element Is Visible locator=Properties CL timeout=60
+ Click Element locator=Properties CL
+ Select From List By Label id=service vFirewall
+ Select From List By Label id=vf vFirewall 0
+ Select From List By Label id=actionSet VNF
+ Select From List By Label id=location Data Center 2 Data Center 3
+ Input Text locator=deployParameters text={}
+ Click Button locator=Save
+
+Set Policy Box properties for HolmesModel1
+ Wait Until Element Is Visible xpath=//*[@data-element-id="Policy_136qatf"] timeout=60
+ Click Element xpath=//*[@data-element-id="Policy_136qatf"]
+ Click Button locator=New Policy
+ Input Text locator=//*[@id="pname"] text=Policy1
+ Select From List By Label id=recipe Migrate
+ Input Text locator=maxRetries text=5
+ Input Text locator=retryTimeLimit text=240
+ Input Text locator=timeout text=390
+ Click Button locator=Close
+
+Set Holmes Box properties for HolmesModel1
+ Wait Until Element Is Visible xpath=//*[@data-element-id="Holmes_1gxp0mm"] timeout=60
+ Click Element xpath=//*[@data-element-id="Holmes_1gxp0mm"]
+ Input Text locator=correlationalLogic text=correlational Logic1
+ Input Text locator=configPolicyName text=config Policy Name1
+ Click Button locator=Save
+
+Save Model from Menu
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[1]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[1]/a
+ Wait Until Element Is Visible locator=Save CL timeout=60
+ Set Selenium Speed ${SELENIUM_SPEED_FAST}
+ Click Element locator=Save CL
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:SAVE
+ Set Selenium Speed ${SELENIUM_SPEED_SLOW}
+
+Close Browser
+ Close Browser
diff --git a/tests/clamp/UIs/02__Create_TCA_model.robot b/tests/clamp/UIs/02__Create_TCA_model.robot
new file mode 100644
index 00000000..bdc537ea
--- /dev/null
+++ b/tests/clamp/UIs/02__Create_TCA_model.robot
@@ -0,0 +1,95 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library ../../../scripts/clamp/python-lib/CustomSeleniumLibrary.py
+Library XvfbRobot
+
+*** Variables ***
+${login} admin
+${passw} password
+${SELENIUM_SPEED_FAST} .2 seconds
+${SELENIUM_SPEED_SLOW} .5 seconds
+${BASE_URL} https://localhost:8443
+
+*** Test Cases ***
+Get Requests health check ok
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/healthcheck
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Open Browser
+# Next line is to be enabled for Headless tests only (jenkins?). To see the tests disable the line.
+ Start Virtual Display 1920 1080
+ Set Selenium Speed ${SELENIUM_SPEED_SLOW}
+ Open Browser ${BASE_URL}/designer/index.html browser=firefox
+
+Reply to authentication popup
+ Run Keyword And Ignore Error Insert into prompt ${login} ${passw}
+ Confirm action
+
+Good Login to Clamp UI and Verify logged in
+ Set Window Size 1920 1080
+ ${title}= Get Title
+ Should Be Equal CLDS ${title}
+ Wait Until Element Is Visible xpath=//*[@class="navbar-brand logo_name ng-binding"] timeout=60
+ Element Text Should Be xpath=//*[@class="navbar-brand logo_name ng-binding"] expected=Hello:admin
+
+Create Model from Menu
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[1]/a
+ Wait Until Element Is Visible locator=Create CL timeout=60
+ Click Element locator=Create CL
+ Input Text locator=modelName text=TCAModel1
+ Select From List By Label id=templateName templateTCA1
+ Click Button locator=Create
+
+Set Properties for TCAModel1
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[1]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[1]/a
+ Wait Until Element Is Visible locator=Properties CL timeout=60
+ Click Element locator=Properties CL
+ Select From List By Label id=service vLoadBalancer
+ Select From List By Label id=vf vLoadBalancer 0
+ Select From List By Label id=actionSet VNF
+ Select From List By Label id=location Data Center 1 Data Center 3
+ Input Text locator=deployParameters text={}
+ Click Button locator=Save
+
+Set Policy Box properties for TCAModel1
+ Wait Until Element Is Visible xpath=//*[@data-element-id="Policy_12lup3h"] timeout=60
+ Click Element xpath=//*[@data-element-id="Policy_12lup3h"]
+ Click Button locator=New Policy
+ Input Text locator=//*[@id="pname"] text=Policy2
+ Select From List By Label id=recipe Restart
+ Input Text locator=maxRetries text=6
+ Input Text locator=retryTimeLimit text=280
+ Input Text locator=timeout text=400
+ Click Button locator=Close
+
+Set TCA Box properties for TCAModel1
+ Wait Until Element Is Visible xpath=//*[@data-element-id="Policy_12lup3h"] timeout=60
+ Click Element xpath=//*[@data-element-id="TCA_1d13unw"]
+ Input Text xpath=(//input[@id='tname'])[2] text=TCA1
+ Select From List By Label xpath=//*[@id="tcaPol"] Policy2
+ Select From List By Label xpath=//*[@id="eventName"] vLoadBalancer
+### Cannot set all TCA box attributes due to element not interractable with Selenium
+# Select From List By Label xpath=//*[@id="controlLoopSchemaType"] VNF
+# Select From List By Index xpath=//*[@id="controlLoopSchemaType"] 1
+ Click Element xpath=(//button[@id='createNewThresh'])[2]
+ Input Text xpath=(//input[@id='threshold'])[2] 6
+# Select From List By Label xpath=//*[@id="closedLoopEventStatus"] ONSET
+ Click Button id=savePropsBtn
+
+Save Model from Menu
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[1]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[1]/a
+ Wait Until Element Is Visible locator=Save CL timeout=60
+ Set Selenium Speed ${SELENIUM_SPEED_FAST}
+ Click Element locator=Save CL
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:SAVE
+ Set Selenium Speed ${SELENIUM_SPEED_SLOW}
+
+Close Browser
+ Close Browser
diff --git a/tests/clamp/UIs/03__Verify_UI_Models.robot b/tests/clamp/UIs/03__Verify_UI_Models.robot
new file mode 100644
index 00000000..66bc3b15
--- /dev/null
+++ b/tests/clamp/UIs/03__Verify_UI_Models.robot
@@ -0,0 +1,52 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+${login} admin
+${passw} password
+
+*** Test Cases ***
+Verify Holmes CL well created
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/model-names
+ Should Contain Match ${resp} *HolmesModel1*
+ Should Not Contain Match ${resp} *HolmesModel99*
+
+Verify TCA CL well create
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/model-names
+ Should Contain Match ${resp} *TCAModel1*
+ Should Not Contain Match ${resp} *TCAModel99*
+
+Verify HolmesModel1
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/model/HolmesModel1
+ Should Contain Match ${resp} *templateHolmes1*
+ Should Contain Match ${resp} *DC2*
+ Should Contain Match ${resp} *DC3*
+ Should Contain Match ${resp} *Policy1*
+ Should Contain Match ${resp} *07e266fc-49ab-4cd7-8378-ca4676f1b9ec*
+ Should Contain Match ${resp} *migrate*
+ Should Contain Match ${resp} *240*
+ Should Contain Match ${resp} *390*
+ Should Contain Match ${resp} *Logic1*
+ Should Contain Match ${resp} *config Policy Name1*
+
+Verify TCAModel1
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/model/TCAModel1
+ Should Contain Match ${resp} *templateTCA1*
+ Should Contain Match ${resp} *DESIGN*
+ Should Contain Match ${resp} *vnfRecipe*
+ Should Contain Match ${resp} *DC1*
+ Should Contain Match ${resp} *DC3*
+ Should Contain Match ${resp} *Policy2*
+ Should Contain Match ${resp} *restart*
+ Should Contain Match ${resp} *280*
+ Should Contain Match ${resp} *400*
+
+Get model names
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/clds/model-names
+ Should Contain Match ${resp} *HolmesModel1*
+ Should Contain Match ${resp} *TCAModel1*
+ Should Not Contain Match ${resp} *TCAModel99*
+ Should Not Contain Match ${resp} *HolmesModel99*
diff --git a/tests/clamp/UIs/04__Submit_deploy_chain_Holmes.robot b/tests/clamp/UIs/04__Submit_deploy_chain_Holmes.robot
new file mode 100644
index 00000000..de10a27c
--- /dev/null
+++ b/tests/clamp/UIs/04__Submit_deploy_chain_Holmes.robot
@@ -0,0 +1,131 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library ../../../scripts/clamp/python-lib/CustomSeleniumLibrary.py
+Library XvfbRobot
+
+*** Variables ***
+${login} admin
+${passw} password
+${SELENIUM_SPEED_FAST} .2 seconds
+${SELENIUM_SPEED_SLOW} .5 seconds
+${BASE_URL} https://localhost:8443
+
+*** Test Cases ***
+Get Requests health check ok
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/healthcheck
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Open Browser
+# Next line is to be enabled for Headless tests only (jenkins?). To see the tests disable the line.
+ Start Virtual Display 1920 1080
+ Set Selenium Speed ${SELENIUM_SPEED_SLOW}
+ Open Browser ${BASE_URL}/designer/index.html browser=firefox
+
+Reply to authentication popup
+ Run Keyword And Ignore Error Insert into prompt ${login} ${passw}
+ Confirm action
+
+Good Login to Clamp UI and Verify logged in
+ Set Window Size 1920 1080
+ ${title}= Get Title
+ Should Be Equal CLDS ${title}
+ Wait Until Element Is Visible xpath=//*[@class="navbar-brand logo_name ng-binding"] timeout=60
+ Element Text Should Be xpath=//*[@class="navbar-brand logo_name ng-binding"] expected=Hello:admin
+
+Open Holmes CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[1]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[1]/a
+ Wait Until Element Is Visible locator=Open CL timeout=60
+ Click Element locator=Open CL
+ Select From List By Label id=modelName HolmesModel1
+ Click Button locator=OK
+ Element Should Contain xpath=//*[@id="modeler_name"] Closed Loop Modeler - HolmesModel1
+ Element Should Contain xpath=//*[@id="status_clds"] DESIGN
+
+Validate-Test Holmes CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=Validation Test timeout=60
+ Click Element locator=Validation Test
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:TEST
+ Element Should Contain xpath=//*[@id="status_clds"] DESIGN
+
+Submit Holmes CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=Submit timeout=60
+ Click Element locator=Submit
+ Click Button locator=Yes
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:SUBMIT
+ Element Should Contain xpath=//*[@id="status_clds"] DISTRIBUTED
+
+Resubmit Holmes CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=Resubmit timeout=60
+ Click Element locator=Resubmit
+ Click Button locator=Yes
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:RESUBMIT
+ Element Should Contain xpath=//*[@id="status_clds"] DISTRIBUTED
+
+Deploy Holmes CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=Deploy timeout=60
+ Click Element locator=Deploy
+# Wait Until Element Is Visible xpath=//*[@id="deployProperties"] timeout=60
+# Input Text xpath=//*[@id="deployProperties"] text={}
+ Click Button locator=Deploy
+ Click Button locator=Yes
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:deploy
+ Element Should Contain xpath=//*[@id="status_clds"] ACTIVE
+
+Update Holmes CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=Update timeout=60
+ Click Element locator=Update
+ Click Button locator=Yes
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:UPDATE
+ Element Should Contain xpath=//*[@id="status_clds"] ACTIVE
+
+Stop Holmes CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=Stop timeout=60
+ Click Element locator=Stop
+ Click Button locator=Yes
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:STOP
+ Element Should Contain xpath=//*[@id="status_clds"] STOPPED
+
+Restart Holmes CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=Restart timeout=60
+ Click Element locator=Restart
+ Click Button locator=Yes
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:RESTART
+ Element Should Contain xpath=//*[@id="status_clds"] ACTIVE
+
+UnDeploy Holmes CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=UnDeploy timeout=60
+ Click Element locator=UnDeploy
+ Click Button locator=Yes
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:undeploy
+ Element Should Contain xpath=//*[@id="status_clds"] DISTRIBUTED
+
+Close Browser
+ Close Browser
diff --git a/tests/clamp/UIs/05__Submit_deploy_chain_TCA.robot b/tests/clamp/UIs/05__Submit_deploy_chain_TCA.robot
new file mode 100644
index 00000000..2b95530a
--- /dev/null
+++ b/tests/clamp/UIs/05__Submit_deploy_chain_TCA.robot
@@ -0,0 +1,131 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library ../../../scripts/clamp/python-lib/CustomSeleniumLibrary.py
+Library XvfbRobot
+
+*** Variables ***
+${login} admin
+${passw} password
+${SELENIUM_SPEED_FAST} .2 seconds
+${SELENIUM_SPEED_SLOW} .5 seconds
+${BASE_URL} https://localhost:8443
+
+*** Test Cases ***
+Get Requests health check ok
+ ${resp}= Get Request ${clamp_session} /restservices/clds/v1/healthcheck
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Open Browser
+# Next line is to be enabled for Headless tests only (jenkins?). To see the tests disable the line.
+ Start Virtual Display 1920 1080
+ Set Selenium Speed ${SELENIUM_SPEED_SLOW}
+ Open Browser ${BASE_URL}/designer/index.html browser=firefox
+
+Reply to authentication popup
+ Run Keyword And Ignore Error Insert into prompt ${login} ${passw}
+ Confirm action
+
+Good Login to Clamp UI and Verify logged in
+ Set Window Size 1920 1080
+ ${title}= Get Title
+ Should Be Equal CLDS ${title}
+ Wait Until Element Is Visible xpath=//*[@class="navbar-brand logo_name ng-binding"] timeout=60
+ Element Text Should Be xpath=//*[@class="navbar-brand logo_name ng-binding"] expected=Hello:admin
+
+Open TCA CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[1]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[1]/a
+ Wait Until Element Is Visible locator=Open CL timeout=60
+ Click Element locator=Open CL
+ Select From List By Label id=modelName TCAModel1
+ Click Button locator=OK
+ Element Should Contain xpath=//*[@id="modeler_name"] Closed Loop Modeler - TCAModel1
+ Element Should Contain xpath=//*[@id="status_clds"] DESIGN
+
+Validate-Test TCA CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=Validation Test timeout=60
+ Click Element locator=Validation Test
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:TEST
+ Element Should Contain xpath=//*[@id="status_clds"] DESIGN
+
+Submit TCA CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=Submit timeout=60
+ Click Element locator=Submit
+ Click Button locator=Yes
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:SUBMIT
+ Element Should Contain xpath=//*[@id="status_clds"] DISTRIBUTED
+
+Resubmit TCA CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=Resubmit timeout=60
+ Click Element locator=Resubmit
+ Click Button locator=Yes
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:RESUBMIT
+ Element Should Contain xpath=//*[@id="status_clds"] DISTRIBUTED
+
+Deploy TCA CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=Deploy timeout=60
+ Click Element locator=Deploy
+# Wait Until Element Is Visible xpath=//*[@id="deployProperties"] timeout=60
+# Input Text xpath=//*[@id="deployProperties"] text={}
+ Click Button locator=Deploy
+ Click Button locator=Yes
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:deploy
+ Element Should Contain xpath=//*[@id="status_clds"] ACTIVE
+
+Update TCA CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=Update timeout=60
+ Click Element locator=Update
+ Click Button locator=Yes
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:UPDATE
+ Element Should Contain xpath=//*[@id="status_clds"] ACTIVE
+
+Stop TCA CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=Stop timeout=60
+ Click Element locator=Stop
+ Click Button locator=Yes
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:STOP
+ Element Should Contain xpath=//*[@id="status_clds"] STOPPED
+
+Restart TCA CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=Restart timeout=60
+ Click Element locator=Restart
+ Click Button locator=Yes
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:RESTART
+ Element Should Contain xpath=//*[@id="status_clds"] ACTIVE
+
+UnDeploy TCA CL
+ Wait Until Element Is Visible xpath=//*[@id="navbar"]/ul/li[2]/a timeout=60
+ Click Element xpath=//*[@id="navbar"]/ul/li[2]/a
+ Wait Until Element Is Visible locator=UnDeploy timeout=60
+ Click Element locator=UnDeploy
+ Click Button locator=Yes
+ Wait Until Element Is Visible xpath=//*[@id="alert_message_"] timeout=60
+ Element Text Should Be xpath=//*[@id="alert_message_"] expected=Action Successful:undeploy
+ Element Should Contain xpath=//*[@id="status_clds"] DISTRIBUTED
+
+Close Browser
+ Close Browser
diff --git a/tests/clamp/UIs/__init__.robot b/tests/clamp/UIs/__init__.robot
new file mode 100644
index 00000000..fc9f2734
--- /dev/null
+++ b/tests/clamp/UIs/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Clamp - UIs
diff --git a/tests/clamp/UIs/data/TCA_template_properties.yml b/tests/clamp/UIs/data/TCA_template_properties.yml
new file mode 100644
index 00000000..101dc2c0
--- /dev/null
+++ b/tests/clamp/UIs/data/TCA_template_properties.yml
@@ -0,0 +1,82 @@
+tosca_definitions_version: cloudify_dsl_1_3
+imports:
+- http://www.getcloudify.org/spec/cloudify/3.4/types.yaml
+- https://onap.org:8443/repository/solutioning01-mte2-raw/type_files/docker/2.2.0/node-type.yaml
+- https://onap.org:8443/repository/solutioning01-mte2-raw/type_files/relationship/1.0.0/node-type.yaml
+- http://onap.org:8081/repository/solutioning01-mte2-raw/type_files/dmaap/dmaap_mr.yaml
+inputs:
+ location_id:
+ type: string
+ service_id:
+ type: string
+node_templates:
+ cdap_host_host:
+ type: dcae.nodes.StreamingAnalytics.SelectedCDAPInfrastructure
+ properties:
+ location_id:
+ get_input: location_id
+ scn_override: cdap_broker.solutioning-central.dcae.onap.org
+ interfaces:
+ cloudify.interfaces.lifecycle: {
+ }
+ tca_tca:
+ type: dcae.nodes.MicroService.cdap
+ properties:
+ app_config:
+ appDescription: DCAE Analytics Threshold Crossing Alert Application
+ appName: dcae-tca
+ tcaSubscriberOutputStreamName: TCASubscriberOutputStream
+ tcaVESAlertsTableName: TCAVESAlertsTable
+ tcaVESAlertsTableTTLSeconds: '1728000'
+ tcaVESMessageStatusTableName: TCAVESMessageStatusTable
+ tcaVESMessageStatusTableTTLSeconds: '86400'
+ thresholdCalculatorFlowletInstances: '2'
+ app_preferences:
+ publisherContentType: application/json
+ publisherHostName: mrlocal-mtnjftle01.onap.org
+ publisherHostPort: '3905'
+ publisherMaxBatchSize: '10'
+ publisherMaxRecoveryQueueSize: '100000'
+ publisherPollingInterval: '20000'
+ publisherProtocol: https
+ publisherTopicName: org.onap.dcae.dmaap.mtnje2.DcaeTestVESPub
+ publisherUserName: m00502@tca.af.dcae.onap.org
+ publisherUserPassword: Te5021abc
+ subscriberConsumerGroup: OpenDCAE-c12
+ subscriberConsumerId: c12
+ subscriberContentType: application/json
+ subscriberHostName: mrlocal-mtnjftle01.onap.org
+ subscriberHostPort: '3905'
+ subscriberMessageLimit: '-1'
+ subscriberPollingInterval: '20000'
+ subscriberProtocol: https
+ subscriberTimeoutMS: '-1'
+ subscriberTopicName: org.onap.dcae.dmaap.mtnje2.DcaeTestVESSub
+ subscriberUserName: m00502@tca.af.dcae.onap.org
+ subscriberUserPassword: Te5021abc
+ tca_policy: null
+ artifact_name: dcae-analytics-tca
+ artifact_version: 1.0.0
+ connections:
+ streams_publishes: [
+ ]
+ streams_subscribes: [
+ ]
+ jar_url: http://somejar
+ location_id:
+ get_input: location_id
+ namespace: cdap_tca_hi_lo
+ programs:
+ - program_id: TCAVESCollectorFlow
+ program_type: flows
+ - program_id: TCADMaaPMRSubscriberWorker
+ program_type: workers
+ - program_id: TCADMaaPMRPublisherWorker
+ program_type: workers
+ service_component_type: cdap_app_tca
+ service_id:
+ get_input: service_id
+ streamname: TCASubscriberOutputStream
+ relationships:
+ - target: cdap_host_host
+ type: dcae.relationships.component_contained_in \ No newline at end of file
diff --git a/tests/cli/startup/__init__.robot b/tests/cli/startup/__init__.robot
new file mode 100644
index 00000000..9eca6917
--- /dev/null
+++ b/tests/cli/startup/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation cli - Startup
diff --git a/tests/cli/startup/startup_check.robot b/tests/cli/startup/startup_check.robot
new file mode 100644
index 00000000..18788ddd
--- /dev/null
+++ b/tests/cli/startup/startup_check.robot
@@ -0,0 +1,104 @@
+*** Settings ***
+Library RequestsLibrary
+Library Process
+
+*** Variables ***
+
+${cli_exec} docker exec cli onap
+${cli_exec_cli_10_help} docker exec cli bash -c "export CLI_PRODUCT_VERSION=cli-1.0 && onap --help"
+${cli_exec_cli_10_version} docker exec cli bash -c "export CLI_PRODUCT_VERSION=cli-1.0 && onap --version"
+${cli_exec_cli_10_schema_refresh} docker exec cli bash -c "export CLI_PRODUCT_VERSION=cli-1.0 && onap schema-refresh"
+${cli_exec_cli_10_schema_validate} docker exec cli bash -c "export CLI_PRODUCT_VERSION=cli-1.0 && onap schema-validate -i -l schema-refresh.yaml"
+${cli_exec_cli_10_schema_validate_invalid} docker exec cli bash -c "export CLI_PRODUCT_VERSION=cli-1.0 && onap schema-validate -i -l invalid-yaml-path.yaml"
+${cli_exec_cli_10_schema_validate_empty} docker exec cli bash -c "export CLI_PRODUCT_VERSION=cli-1.0 && onap schema-validate"
+
+${cli_exec_onap_11} docker exec cli bash -c "export CLI_PRODUCT_VERSION=onap-1.1 && onap"
+${cli_exec_onap_11_microservice_create} docker exec cli bash -c "export CLI_PRODUCT_VERSION=onap-1.1 && onap microservice-create --service-name test-service --service-version v1 --service-url /api/test/v1 --host-url http://${MSB_IAG_IP}:80 23.14.15.156 80"
+${cli_exec_onap_11_microservice_list} docker exec cli bash -c "export CLI_PRODUCT_VERSION=onap-1.1 && onap microservice-list --host-url http://${MSB_IAG_IP}:80 --long"
+${cli_exec_onap_11_microservice_show} docker exec cli bash -c "export CLI_PRODUCT_VERSION=onap-1.1 && onap microservice-show --service-name test-service --service-version v1 --host-url http://${MSB_IAG_IP}:80"
+${cli_exec_onap_11_microservice_delete} docker exec cli bash -c "export CLI_PRODUCT_VERSION=onap-1.1 && onap microservice-delete --service-name test-service --service-version v1 --host-url http://${MSB_IAG_IP}:80 --node-ip 23.14.15.156 --node-port 80"
+
+*** Test Cases ***
+Liveness Test
+ [Documentation] Check cli liveness check
+ Create Session cli http://${CLI_IP}:8080
+ CheckUrl cli /
+
+Check Cli help
+ [Documentation] check cli help command
+ ${cli_cmd_output}= Run Process ${cli_exec_cli_10_help} shell=yes
+ Log ${cli_cmd_output.stdout}
+ Should Be Equal As Strings ${cli_cmd_output.rc} 0
+ Should Contain ${cli_cmd_output.stdout} CLI version
+
+Check Cli Version Default
+ [Documentation] check cli default version
+ ${cli_cmd_output}= Run Process ${cli_exec_cli_10_version} shell=yes
+ Log ${cli_cmd_output.stdout}
+ Should Be Equal As Strings ${cli_cmd_output.rc} 0
+ Should Contain ${cli_cmd_output.stdout} : cli-1.0
+
+Check Cli Scheam Refresh
+ [Documentation] check cli schema-refresh command
+ ${cli_cmd_output}= Run Process ${cli_exec_cli_10_schema_refresh} shell=yes
+ Log ${cli_cmd_output.stdout}
+ Should Be Equal As Strings ${cli_cmd_output.rc} 0
+ Should Contain ${cli_cmd_output.stdout} sl-no
+ Should Contain ${cli_cmd_output.stdout} command
+ Should Contain ${cli_cmd_output.stdout} product-version
+ Should Contain ${cli_cmd_output.stdout} schema
+ Should Contain ${cli_cmd_output.stdout} version
+
+Check Cli Schema Validate With Valid Path
+ [Documentation] check cli schema-validate command with valid path
+ ${cli_cmd_output}= Run Process ${cli_exec_cli_10_schema_validate} shell=yes
+ Log ${cli_cmd_output.stdout}
+ Should Be Equal As Strings ${cli_cmd_output.rc} 0
+ Should Contain ${cli_cmd_output.stdout} sl-no
+ Should Contain ${cli_cmd_output.stdout} error
+
+Check Cli Scheam Validate With Invalid Path
+ [Documentation] check cli schema-validate command with invalid path
+ ${cli_cmd_output}= Run Process ${cli_exec_cli_10_schema_validate_invalid} shell=yes
+ Log ${cli_cmd_output.stdout}
+ Should Be Equal As Strings ${cli_cmd_output.rc} 1
+ Should Contain ${cli_cmd_output.stdout} 0xb001
+
+Check Cli Scheam Validate Empty Argument
+ [Documentation] check cli schema-validate with empty argument
+ ${cli_cmd_output}= Run Process ${cli_exec_cli_10_schema_validate_empty} shell=yes
+ Log ${cli_cmd_output.stdout}
+ Should Be Equal As Strings ${cli_cmd_output.rc} 1
+ Should Contain ${cli_cmd_output.stdout} 0x7003
+
+Check Cli create microservice
+ [Documentation] check create microservice
+ ${cli_cmd_output}= Run Process ${cli_exec_onap_11_microservice_create} shell=yes
+ Log ${cli_cmd_output.stdout}
+ Should Be Equal As Strings ${cli_cmd_output.rc} 0
+
+Check Cli list microservice
+ [Documentation] check list microservice
+ ${cli_cmd_output}= Run Process ${cli_exec_onap_11_microservice_list} shell=yes
+ Log ${cli_cmd_output.stdout}
+ Should Be Equal As Strings ${cli_cmd_output.rc} 0
+
+Check Cli show microservice
+ [Documentation] check show microservice
+ ${cli_cmd_output}= Run Process ${cli_exec_onap_11_microservice_show} shell=yes
+ Log ${cli_cmd_output.stdout}
+ Should Be Equal As Strings ${cli_cmd_output.rc} 0
+
+Check Cli delete microservice
+ [Documentation] check delete microservice
+ ${cli_cmd_output}= Run Process ${cli_exec_onap_11_microservice_delete} shell=yes
+ Log ${cli_cmd_output.stdout}
+ Should Be Equal As Strings ${cli_cmd_output.rc} 0
+
+
+
+*** Keywords ***
+CheckUrl
+ [Arguments] ${session} ${path}
+ ${resp}= Get Request ${session} ${path}
+ Should Be Equal As Integers ${resp.status_code} 200
diff --git a/tests/common.robot b/tests/common.robot
new file mode 100644
index 00000000..f0dea255
--- /dev/null
+++ b/tests/common.robot
@@ -0,0 +1,30 @@
+#Robot functions that will be shared also with other tests
+*** Settings ***
+Library OperatingSystem
+Library HttpLibrary.HTTP
+
+*** Keywords ***
+json_from_file
+#Robot function to extract the json object from a file
+ [Arguments] ${file_path}
+ ${json_file}= Get File ${file_path}
+ ${json_object}= Evaluate json.loads('''${json_file}''') json
+ [Return] ${json_object}
+
+string_from_json
+#Robot function to transform the json object to a string
+ [Arguments] ${json_value}
+ ${json_string}= Stringify Json ${json_value}
+ [Return] ${json_string}
+
+random_ip
+#Robot function to generate a random IP
+ [Arguments]
+ ${numbers}= Evaluate random.sample([x for x in range(1, 256)], 4) random
+ ${generated_ip}= Catenate ${numbers[0]}.${numbers[1]}.${numbers[2]}.${numbers[3]}
+ [Return] ${generated_ip}
+
+Get Data From File
+ [Arguments] ${file}
+ ${data}= Get File ${file}
+ [Return] ${data}
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/__init__.robot b/tests/dcaegen2-collectors-hv-ves/testcases/__init__.robot
new file mode 100644
index 00000000..c0a96dbc
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/__init__.robot
@@ -0,0 +1,56 @@
+*** Settings ***
+Library DcaeAppSimulatorLibrary
+Library ConsulLibrary
+Library VesHvContainersUtilsLibrary
+
+Suite Setup HV-VES Collector Suites Setup
+
+*** Keywords ***
+HV-VES Collector Suites Setup
+ Log Started Suite: HV-VES
+ Configure collector
+ Configure Dcae App
+ Log Suite setup finished
+
+
+Configure collector
+ ${CONSUL_API_ACCESS}= Get Consul Api Access Url ${HTTP_METHOD_URL} ${CONSUL_CONTAINER_HOST} ${CONSUL_CONTAINER_PORT}
+ ${CONSUL_API_URL}= Catenate SEPARATOR= ${CONSUL_API_ACCESS} ${CONSUL_VES_HV_CONFIGURATION_KEY_PATH}
+ Publish HV VES Configuration In Consul ${CONSUL_API_URL} ${VES_HV_CONFIGURATION_JSON_FILEPATH}
+
+Configure Dcae App
+ ${DCAE_APP_API_ACCESS}= Get Dcae App Api Access Url ${HTTP_METHOD_URL} ${DCAE_APP_CONTAINER_HOST} ${DCAE_APP_CONTAINER_PORT}
+
+ ${DCAE_APP_API_MESSAGE_RESET_URL}= Catenate SEPARATOR= ${DCAE_APP_API_ACCESS} ${DCAE_APP_API_MESSAGES_RESET_PATH}
+ Set Suite Variable ${DCAE_APP_API_MESSAGE_RESET_URL} children=True
+
+ ${DCAE_APP_API_MESSAGES_COUNT_URL}= Catenate SEPARATOR= ${DCAE_APP_API_ACCESS} ${DCAE_APP_API_MESSAGES_COUNT_PATH}
+ Set Suite Variable ${DCAE_APP_API_MESSAGES_COUNT_URL} children=True
+
+ ${DCAE_APP_API_MESSAGES_VALIDATION_URL}= Catenate SEPARATOR= ${DCAE_APP_API_ACCESS} ${DCAE_APP_API_MESSAGES_VALIDATION_PATH}
+ Set Suite Variable ${DCAE_APP_API_MESSAGES_VALIDATION_URL} children=True
+
+ ${DCAE_APP_API_TOPIC_CONFIGURATION_URL}= Catenate SEPARATOR= ${DCAE_APP_API_ACCESS} ${DCAE_APP_API_TOPIC_CONFIGURATION_PATH}
+ Wait until keyword succeeds 10 sec 5 sec
+ ... Configure Dcae App Simulator To Consume Messages From Topics ${DCAE_APP_API_TOPIC_CONFIGURATION_URL} ${ROUTED_MESSAGES_TOPIC}
+
+
+*** Variables ***
+${HTTP_METHOD_URL} http://
+
+${CONSUL_CONTAINER_HOST} consul
+${CONSUL_CONTAINER_PORT} 8500
+${CONSUL_VES_HV_CONFIGURATION_KEY_PATH} /v1/kv/veshv-config
+
+${DCAE_APP_CONTAINER_HOST} dcae-app-simulator
+${DCAE_APP_CONTAINER_PORT} 6063
+${DCAE_APP_API_TOPIC_CONFIGURATION_PATH} /configuration/topics
+${DCAE_APP_API_MESSAGES_RESET_PATH} /messages
+${DCAE_APP_API_MESSAGES_PATH} /messages/all
+${DCAE_APP_API_MESSAGES_COUNT_PATH} ${DCAE_APP_API_MESSAGES_PATH}/count
+${DCAE_APP_API_MESSAGES_VALIDATION_PATH} ${DCAE_APP_API_MESSAGES_PATH}/validate
+
+${ROUTED_MESSAGES_TOPIC} test-hv-ran-meas
+
+${VES_HV_RESOURCES} %{WORKSPACE}/test/csit/tests/dcaegen2-collectors-hv-ves/testcases/resources
+${VES_HV_CONFIGURATION_JSON_FILEPATH} ${VES_HV_RESOURCES}/ves-hv-configuration.json
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/authorization.robot b/tests/dcaegen2-collectors-hv-ves/testcases/authorization.robot
new file mode 100644
index 00000000..15c1c489
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/authorization.robot
@@ -0,0 +1,62 @@
+*** Settings ***
+Library DcaeAppSimulatorLibrary
+
+Resource resources/common-keywords.robot
+
+Suite Setup Client Authorization Suite Setup
+Suite Teardown VES-HV Collector Suite Teardown
+Test Teardown VES-HV Collector Test Shutdown
+
+*** Keywords ***
+Client Authorization Suite Setup
+ Log Started Suite: VES-HV Client Authorization
+ ${XNF_PORTS_LIST}= Create List 7000
+ ${XNF_WITH_INVALID_CERTIFICATES}= Configure xNF Simulators ${XNF_PORTS_LIST}
+ ... should_use_valid_certs=${false}
+ Set Suite Variable ${XNF_WITH_INVALID_CERTIFICATES}
+ ${XNF_PORTS_LIST}= Create List 7001
+ ${XNF_WITHOUT_SSL}= Configure xNF Simulators ${XNF_PORTS_LIST}
+ ... should_disable_ssl=${true}
+ Set Suite Variable ${XNF_WITHOUT_SSL}
+ ${XNF_PORTS_LIST}= Create List 7002
+ ${XNF_WITHOUT_SSL_CONNECTING_TO_UNENCRYPTED_HV_VES}= Configure xNF Simulators ${XNF_PORTS_LIST}
+ ... should_disable_ssl=${true}
+ ... should_connect_to_unencrypted_hv_ves=${true}
+ Set Suite Variable ${XNF_WITHOUT_SSL_CONNECTING_TO_UNENCRYPTED_HV_VES}
+ Log Suite setup finished
+
+*** Test Cases ***
+Authorization
+ [Documentation] VES-HV Collector should not authorize XNF with invalid certificate and not route any message
+ ... to topics
+
+ Send Messages From xNF Simulators ${XNF_WITH_INVALID_CERTIFICATES} ${XNF_VALID_MESSAGES_REQUEST}
+
+ Wait until keyword succeeds 60 sec 5 sec
+ ... Assert Dcae App Consumed ${DCAE_APP_API_MESSAGES_COUNT_URL} ${AMOUNT_0}
+
+Unencrypted connection from client
+ [Documentation] VES-HV Collector should not authorize XNF trying to connect through unencrypted connection
+
+ Send Messages From xNF Simulators ${XNF_WITHOUT_SSL} ${XNF_VALID_MESSAGES_REQUEST}
+
+ Wait until keyword succeeds 60 sec 5 sec
+ ... Assert Dcae App Consumed ${DCAE_APP_API_MESSAGES_COUNT_URL} ${AMOUNT_0}
+
+Unencrypted connection on both ends
+ [Documentation] When run without SSL turned on, VES-HV Collector should route all valid messages
+ ... from xNF trying to connect through unencrypted connection
+
+ Send Messages From xNF Simulators ${XNF_WITHOUT_SSL_CONNECTING_TO_UNENCRYPTED_HV_VES} ${XNF_VALID_MESSAGES_REQUEST}
+
+ Wait until keyword succeeds 60 sec 5 sec
+ ... Assert Dcae App Consumed ${DCAE_APP_API_MESSAGES_COUNT_URL} ${AMOUNT_5000}
+
+
+*** Variables ***
+${VES_HV_SCENARIOS} %{WORKSPACE}/test/csit/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios
+
+${XNF_VALID_MESSAGES_REQUEST} ${VES_HV_SCENARIOS}/authorization/xnf-valid-messages-request.json
+
+${AMOUNT_0} 0
+${AMOUNT_5000} 5000
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/libraries/ConsulLibrary.py b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/ConsulLibrary.py
new file mode 100644
index 00000000..52d7e0ea
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/ConsulLibrary.py
@@ -0,0 +1,16 @@
+from robot.api import logger
+import HttpRequests
+
+CONSUL_NAME = "Consul"
+
+class ConsulLibrary:
+
+ def publish_hv_ves_configuration_in_consul(self, consul_url, consul_configuration_filepath):
+ logger.info("Reading consul configuration file from: " + consul_configuration_filepath)
+ file = open(consul_configuration_filepath, "rb")
+ data = file.read()
+ file.close()
+
+ logger.info("PUT at: " + consul_url)
+ resp = HttpRequests.session_without_env().put(consul_url, data=data, timeout=5)
+ HttpRequests.checkStatusCode(resp.status_code, CONSUL_NAME) \ No newline at end of file
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/libraries/DcaeAppSimulatorLibrary.py b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/DcaeAppSimulatorLibrary.py
new file mode 100644
index 00000000..9edad2cc
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/DcaeAppSimulatorLibrary.py
@@ -0,0 +1,46 @@
+import HttpRequests
+from robot.api import logger
+
+DCAE_APP_NAME = "DCAE App"
+
+
+class DcaeAppSimulatorLibrary:
+
+ def configure_dcae_app_simulator_to_consume_messages_from_topics(self, app_url, topics):
+ logger.info("PUT at: " + app_url)
+ resp = HttpRequests.session_without_env().put(app_url, data={'topics': topics}, timeout=10)
+ HttpRequests.checkStatusCode(resp.status_code, DCAE_APP_NAME)
+
+ def assert_DCAE_app_consumed(self, app_url, expected_messages_amount):
+ logger.info("GET at: " + app_url)
+ resp = HttpRequests.session_without_env().get(app_url, timeout=10)
+ HttpRequests.checkStatusCode(resp.status_code, DCAE_APP_NAME)
+
+ assert resp.content == expected_messages_amount, \
+ "Messages consumed by simulator: " + resp.content + " expecting: " + expected_messages_amount
+
+ def assert_DCAE_app_consumed_less_equal_than(self, app_url, messages_threshold):
+ logger.info("GET at: " + app_url)
+ resp = HttpRequests.session_without_env().get(app_url, timeout=10)
+ HttpRequests.checkStatusCode(resp.status_code, DCAE_APP_NAME)
+
+ logger.debug("Messages consumed by simulator: " + resp.content +
+ " expecting more than 0 and less/equal than " + messages_threshold)
+
+ assert 0 < int(resp.content) <= int(messages_threshold), \
+ "Messages consumed by simulator: " + resp.content + \
+ " expecting more than 0 and less/equal than " + messages_threshold
+
+ def reset_DCAE_app_simulator(self, app_url):
+ logger.info("DELETE at: " + app_url)
+ resp = HttpRequests.session_without_env().delete(app_url, timeout=10)
+ HttpRequests.checkStatusCode(resp.status_code, DCAE_APP_NAME)
+
+ def assert_DCAE_app_consumed_proper_messages(self, app_url, message_filepath):
+ logger.info("POST at: " + app_url)
+ file = open(message_filepath, "rb")
+ data = file.read()
+ file.close()
+
+ resp = HttpRequests.session_without_env().post(app_url, data=data, timeout=10)
+ HttpRequests.checkStatusCode(resp.status_code, DCAE_APP_NAME)
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/libraries/HttpRequests.py b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/HttpRequests.py
new file mode 100644
index 00000000..c0dcd81d
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/HttpRequests.py
@@ -0,0 +1,19 @@
+import requests
+from robot.api import logger
+
+valid_status_codes = [
+ requests.codes.ok,
+ requests.codes.accepted
+]
+
+
+def session_without_env():
+ session = requests.Session()
+ session.trust_env = False
+ return session
+
+
+def checkStatusCode(status_code, server_name):
+ if status_code not in valid_status_codes:
+ logger.error("Response status code from " + server_name + ": " + str(status_code))
+ raise (Exception(server_name + " returned status code " + status_code))
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/libraries/VesHvContainersUtilsLibrary.py b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/VesHvContainersUtilsLibrary.py
new file mode 100644
index 00000000..989a796c
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/VesHvContainersUtilsLibrary.py
@@ -0,0 +1,69 @@
+from time import time
+
+from robot.api import logger
+import os.path
+import docker
+from io import BytesIO
+from os.path import basename
+from tarfile import TarFile, TarInfo
+
+LOCALHOST = "localhost"
+
+
+class VesHvContainersUtilsLibrary:
+
+ def get_consul_api_access_url(self, method, image_name, port):
+ return self.create_url(
+ method,
+ self.get_instance_address(image_name, port)
+ )
+
+ def get_xnf_sim_api_access_url(self, method, host):
+ if is_running_inside_docker():
+ return self.create_url(method, host)
+ else:
+ logger.info("File `/.dockerenv` not found. Assuming local environment and using localhost.")
+ port_from_container_name = str(host)[-4:]
+ return self.create_url(method, LOCALHOST + ":" + port_from_container_name)
+
+ def get_dcae_app_api_access_url(self, method, image_name, port):
+ return self.create_url(
+ method,
+ self.get_instance_address(image_name, port)
+ )
+
+ def get_instance_address(self, image_name, port):
+ if is_running_inside_docker():
+ return image_name + ":" + port
+ else:
+ logger.info("File `/.dockerenv` not found. Assuming local environment and using localhost.")
+ return LOCALHOST + ":" + port
+
+ def create_url(self, method, host_address):
+ return method + host_address
+
+def is_running_inside_docker():
+ return os.path.isfile("/.dockerenv")
+
+def copy_to_container(container_id, filepaths, path='/etc/ves-hv'):
+ with create_archive(filepaths) as archive:
+ docker.APIClient('unix:///var/run/docker.sock') \
+ .put_archive(container=container_id, path=(path), data=archive)
+
+
+def create_archive(filepaths):
+ tarstream = BytesIO()
+ tarfile = TarFile(fileobj=tarstream, mode='w')
+ for filepath in filepaths:
+ file = open(filepath, 'r')
+ file_data = file.read()
+
+ tarinfo = TarInfo(name=basename(file.name))
+ tarinfo.size = len(file_data)
+ tarinfo.mtime = time()
+
+ tarfile.addfile(tarinfo, BytesIO(file_data))
+
+ tarfile.close()
+ tarstream.seek(0)
+ return tarstream
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/libraries/XnfSimulatorLibrary.py b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/XnfSimulatorLibrary.py
new file mode 100644
index 00000000..f6a97875
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/XnfSimulatorLibrary.py
@@ -0,0 +1,166 @@
+import HttpRequests
+import os
+import docker
+from robot.api import logger
+from time import sleep
+
+XNF_SIMULATOR_NAME = "xNF Simulator"
+SIMULATOR_IMAGE_NAME = "onap/org.onap.dcaegen2.collectors.hv-ves.hv-collector-xnf-simulator"
+SIMULATOR_IMAGE_FULL_NAME = os.getenv("DOCKER_REGISTRY_PREFIX") + SIMULATOR_IMAGE_NAME + ":latest"
+WORKSPACE_ENV = os.getenv("WORKSPACE")
+certificates_dir_path = WORKSPACE_ENV + "/test/csit/plans/dcaegen2-collectors-hv-ves/testsuites/ssl/"
+collector_certs_lookup_dir = "/etc/ves-hv/"
+ONE_SECOND_IN_NANOS = 10 ** 9
+
+
+class XnfSimulatorLibrary:
+
+ def start_xnf_simulators(self, list_of_ports,
+ should_use_valid_certs=True,
+ should_disable_ssl=False,
+ should_connect_to_unencrypted_hv_ves=False):
+ logger.info("Creating " + str(len(list_of_ports)) + " xNF Simulator containers")
+ dockerClient = docker.from_env()
+
+ self.pullImageIfAbsent(dockerClient)
+ logger.info("Using image: " + SIMULATOR_IMAGE_FULL_NAME)
+
+ simulators_addresses = self.create_containers(dockerClient,
+ list_of_ports,
+ should_use_valid_certs,
+ should_disable_ssl,
+ should_connect_to_unencrypted_hv_ves)
+
+ self.assert_containers_startup_was_successful(dockerClient)
+ dockerClient.close()
+ return simulators_addresses
+
+ def pullImageIfAbsent(self, dockerClient):
+ try:
+ dockerClient.images.get(SIMULATOR_IMAGE_FULL_NAME)
+ except:
+ logger.console("Image " + SIMULATOR_IMAGE_FULL_NAME + " will be pulled from repository. "
+ "This can take a while.")
+ dockerClient.images.pull(SIMULATOR_IMAGE_FULL_NAME)
+
+ def create_containers(self,
+ dockerClient,
+ list_of_ports,
+ should_use_valid_certs,
+ should_disable_ssl,
+ should_connect_to_unencrypted_hv_ves):
+ simulators_addresses = []
+ for port in list_of_ports:
+ xnf = XnfSimulator(port, should_use_valid_certs, should_disable_ssl, should_connect_to_unencrypted_hv_ves)
+ container = self.run_simulator(dockerClient, xnf)
+ logger.info("Started container: " + container.name + " " + container.id)
+ simulators_addresses.append(container.name + ":" + xnf.port)
+ return simulators_addresses
+
+ def run_simulator(self, dockerClient, xnf):
+ xNF_startup_command = xnf.get_startup_command()
+ xNF_healthcheck_command = xnf.get_healthcheck_command()
+ port = xnf.port
+ logger.info("Startup command: " + str(xNF_startup_command))
+ logger.info("Healthcheck command: " + str(xNF_healthcheck_command))
+ return dockerClient.containers.run(SIMULATOR_IMAGE_FULL_NAME,
+ command=xNF_startup_command,
+ healthcheck=xNF_healthcheck_command,
+ detach=True,
+ network="ves-hv-default",
+ ports={port + "/tcp": port},
+ volumes=self.container_volumes(),
+ name=xnf.container_name_prefix + port)
+
+ def container_volumes(self):
+ return {certificates_dir_path: {"bind": collector_certs_lookup_dir, "mode": 'rw'}}
+
+ def assert_containers_startup_was_successful(self, dockerClient):
+ checks_amount = 6
+ check_interval_in_seconds = 5
+ for _ in range(checks_amount):
+ sleep(check_interval_in_seconds)
+ all_containers_healthy = True
+ for container in self.get_simulators_list(dockerClient):
+ all_containers_healthy = all_containers_healthy and self.is_container_healthy(container)
+ if (all_containers_healthy):
+ return
+ raise ContainerException("One of xNF simulators containers did not pass the healthcheck.")
+
+ def is_container_healthy(self, container):
+ container_health = container.attrs['State']['Health']['Status']
+ return container_health == 'healthy' and container.status == 'running'
+
+ def stop_and_remove_all_xnf_simulators(self, suite_name):
+ dockerClient = docker.from_env()
+ for container in self.get_simulators_list(dockerClient):
+ logger.info("Stopping and removing container: " + container.id)
+ log_filename = WORKSPACE_ENV + "/archives/containers_logs/" + \
+ suite_name.split(".")[-1] + "_" + container.name + ".log"
+ file = open(log_filename, "w+")
+ file.write(container.logs())
+ file.close()
+ container.stop()
+ container.remove()
+ dockerClient.close()
+
+ def get_simulators_list(self, dockerClient):
+ return dockerClient.containers.list(filters={"ancestor": SIMULATOR_IMAGE_FULL_NAME}, all=True)
+
+ def send_messages(self, simulator_url, message_filepath):
+ logger.info("Reading message to simulator from: " + message_filepath)
+
+ file = open(message_filepath, "rb")
+ data = file.read()
+ file.close()
+
+ logger.info("POST at: " + simulator_url)
+ resp = HttpRequests.session_without_env().post(simulator_url, data=data, timeout=5)
+ HttpRequests.checkStatusCode(resp.status_code, XNF_SIMULATOR_NAME)
+
+
+class XnfSimulator:
+ container_name_prefix = "ves-hv-collector-xnf-simulator"
+
+ def __init__(self,
+ port,
+ should_use_valid_certs,
+ should_disable_ssl,
+ should_connect_to_unencrypted_hv_ves):
+ self.port = port
+ cert_name_prefix = "" if should_use_valid_certs else "untrusted"
+ certificates_path_with_file_prefix = collector_certs_lookup_dir + cert_name_prefix
+ self.key_store_path = certificates_path_with_file_prefix + "client.p12"
+ self.trust_store_path = certificates_path_with_file_prefix + "trust.p12"
+ self.sec_store_passwd = "onaponap"
+ self.disable_ssl = should_disable_ssl
+ self.hv_collector_host = "unencrypted-ves-hv-collector" \
+ if should_connect_to_unencrypted_hv_ves else "ves-hv-collector"
+
+ def get_startup_command(self):
+ startup_command = ["--listen-port", self.port,
+ "--ves-host", self.hv_collector_host,
+ "--ves-port", "6061",
+ "--key-store", self.key_store_path,
+ "--trust-store", self.trust_store_path,
+ "--key-store-password", self.sec_store_passwd,
+ "--trust-store-password", self.sec_store_passwd
+ ]
+ if self.disable_ssl:
+ startup_command.append("--ssl-disable")
+ return startup_command
+
+ def get_healthcheck_command(self):
+ return {
+ "interval": 5 * ONE_SECOND_IN_NANOS,
+ "timeout": 3 * ONE_SECOND_IN_NANOS,
+ "retries": 1,
+ "test": ["CMD", "curl", "--request", "GET",
+ "--fail", "--silent", "--show-error",
+ "localhost:" + self.port + "/healthcheck"]
+ }
+
+
+class ContainerException(Exception):
+ def __init__(self, message):
+ super(ContainerException, self).__init__(message)
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/message-routing.robot b/tests/dcaegen2-collectors-hv-ves/testcases/message-routing.robot
new file mode 100644
index 00000000..89208e45
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/message-routing.robot
@@ -0,0 +1,93 @@
+*** Settings ***
+Library DcaeAppSimulatorLibrary
+Library XnfSimulatorLibrary
+Library VesHvContainersUtilsLibrary
+Library Collections
+
+Resource resources/common-keywords.robot
+
+Suite Setup Message Routing Suite Setup
+Suite Teardown VES-HV Collector Suite Teardown
+Test Teardown VES-HV Collector Test Shutdown
+
+*** Keywords ***
+Message Routing Suite Setup
+ Log Started Suite: VES-HV Message Routing
+ ${XNF_PORTS_LIST}= Create List 7000
+ Configure xNF Simulators Using Valid Certificates On Ports ${XNF_PORTS_LIST}
+ Log Suite setup finished
+
+*** Test Cases ***
+Correct Messages Routing
+ [Documentation] VES-HV Collector should route all valid messages to topics specified in configuration
+ ... and do not change message payload generated in XNF simulator
+
+ ${XNF_SIMULATOR}= Get xNF Simulators Using Valid Certificates
+ Send Messages From xNF Simulators ${XNF_SIMULATOR} ${XNF_FIXED_PAYLOAD_REQUEST}
+
+ Wait until keyword succeeds 60 sec 5 sec
+ ... Assert Dcae App Consumed ${DCAE_APP_API_MESSAGES_COUNT_URL} ${AMOUNT_25000}
+ Assert Dcae App Consumed Proper Messages ${DCAE_APP_API_MESSAGES_VALIDATION_URL} ${DCAE_FIXED_PAYLOAD_REQUEST}
+
+
+Too big payload message handling
+ [Documentation] VES-HV Collector should interrupt the stream when encountered message with too big payload
+
+ ${XNF_SIMULATOR}= Get xNF Simulators Using Valid Certificates
+ Send Messages From xNF Simulators ${XNF_SIMULATOR} ${XNF_TOO_BIG_PAYLOAD_REQUEST}
+
+ Wait until keyword succeeds 60 sec 5 sec
+ ... Assert Dcae App Consumed Less Equal Than ${DCAE_APP_API_MESSAGES_COUNT_URL} ${AMOUNT_25000}
+
+
+Invalid wire frame message handling
+ [Documentation] VES-HV Collector should skip messages with invalid wire frame
+
+ ${XNF_SIMULATOR}= Get xNF Simulators Using Valid Certificates
+ Send Messages From xNF Simulators ${XNF_SIMULATOR} ${XNF_INVALID_WIRE_FRAME_REQUEST}
+
+ Wait until keyword succeeds 60 sec 5 sec
+ ... Assert Dcae App Consumed ${DCAE_APP_API_MESSAGES_COUNT_URL} ${AMOUNT_50000}
+ Assert Dcae App Consumed Proper Messages ${DCAE_APP_API_MESSAGES_VALIDATION_URL} ${DCAE_INVALID_WIRE_FRAME_REQUEST}
+
+
+Invalid GPB data message handling
+ [Documentation] VES-HV Collector should skip messages with invalid GPB data
+
+ ${XNF_SIMULATOR}= Get xNF Simulators Using Valid Certificates
+ Send Messages From xNF Simulators ${XNF_SIMULATOR} ${XNF_INVALID_GPB_DATA_REQUEST}
+
+ Wait until keyword succeeds 60 sec 5 sec
+ ... Assert Dcae App Consumed ${DCAE_APP_API_MESSAGES_COUNT_URL} ${AMOUNT_50000}
+ Assert Dcae App Consumed Proper Messages ${DCAE_APP_API_MESSAGES_VALIDATION_URL} ${DCAE_INVALID_GPB_DATA_REQUEST}
+
+
+Unsupported domain message handling
+ [Documentation] VES-HV Collector should skip messages with unsupported domain
+
+ ${XNF_SIMULATOR}= Get xNF Simulators Using Valid Certificates
+ Send Messages From xNF Simulators ${XNF_SIMULATOR} ${XNF_UNSUPPORTED_DOMAIN_REQUEST}
+
+ Wait until keyword succeeds 60 sec 5 sec
+ ... Assert Dcae App Consumed ${DCAE_APP_API_MESSAGES_COUNT_URL} ${AMOUNT_50000}
+ Assert Dcae App Consumed Proper Messages ${DCAE_APP_API_MESSAGES_VALIDATION_URL} ${DCAE_UNSUPPORTED_DOMAIN_REQUEST}
+
+*** Variables ***
+${HTTP_METHOD_URL} http://
+
+${XNF_SIM_API_PATH} /simulator/async
+
+${VES_HV_SCENARIOS} %{WORKSPACE}/test/csit/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios
+${XNF_FIXED_PAYLOAD_REQUEST} ${VES_HV_SCENARIOS}/fixed-payload/xnf-fixed-payload-request.json
+${XNF_TOO_BIG_PAYLOAD_REQUEST} ${VES_HV_SCENARIOS}/too-big-payload/xnf-too-big-payload-request.json
+${XNF_INVALID_WIRE_FRAME_REQUEST} ${VES_HV_SCENARIOS}/invalid-wire-frame/xnf-invalid-wire-frame-request.json
+${XNF_INVALID_GPB_DATA_REQUEST} ${VES_HV_SCENARIOS}/invalid-gpb-data/xnf-invalid-gpb-data-request.json
+${XNF_UNSUPPORTED_DOMAIN_REQUEST} ${VES_HV_SCENARIOS}/unsupported-domain/xnf-unsupported-domain-request.json
+
+${DCAE_FIXED_PAYLOAD_REQUEST} ${VES_HV_SCENARIOS}/fixed-payload/dcae-fixed-payload-request.json
+${DCAE_INVALID_WIRE_FRAME_REQUEST} ${VES_HV_SCENARIOS}/invalid-wire-frame/dcae-invalid-wire-frame-request.json
+${DCAE_INVALID_GPB_DATA_REQUEST} ${VES_HV_SCENARIOS}/invalid-gpb-data/dcae-invalid-gpb-data-request.json
+${DCAE_UNSUPPORTED_DOMAIN_REQUEST} ${VES_HV_SCENARIOS}/unsupported-domain/dcae-unsupported-domain-request.json
+
+${AMOUNT_25000} 25000
+${AMOUNT_50000} 50000
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/multiple-clients.robot b/tests/dcaegen2-collectors-hv-ves/testcases/multiple-clients.robot
new file mode 100644
index 00000000..9b1982a6
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/multiple-clients.robot
@@ -0,0 +1,35 @@
+*** Settings ***
+Library DcaeAppSimulatorLibrary
+
+Resource resources/common-keywords.robot
+
+Suite Setup Multiple Clients Handling Suite Setup
+Suite Teardown VES-HV Collector Suite Teardown
+Test Teardown VES-HV Collector Test Shutdown
+
+*** Keywords ***
+Multiple Clients Handling Suite Setup
+ Log Started Suite: VES-HV Multiple Clients Handling
+ ${XNF_PORTS_LIST}= Create List 7000 7001 7002
+ Configure xNF Simulators Using Valid Certificates On Ports ${XNF_PORTS_LIST}
+ Log Suite setup finished
+
+*** Test Cases ***
+Handle Multiple Connections
+ [Documentation] VES-HV Collector should handle multiple incoming transmissions
+
+ ${SIMULATORS_LIST}= Get xNF Simulators Using Valid Certificates 3
+ Send Messages From xNF Simulators ${SIMULATORS_LIST} ${XNF_SMALLER_PAYLOAD_REQUEST}
+
+ Wait until keyword succeeds 60 sec 5 sec
+ ... Assert Dcae App Consumed ${DCAE_APP_API_MESSAGES_COUNT_URL} ${AMOUNT_15000}
+ Assert Dcae App Consumed Proper Messages ${DCAE_APP_API_MESSAGES_VALIDATION_URL} ${DCAE_SMALLER_PAYLOAD_REQUEST}
+
+
+*** Variables ***
+${VES_HV_SCENARIOS} %{WORKSPACE}/test/csit/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios
+
+${XNF_SMALLER_PAYLOAD_REQUEST} ${VES_HV_SCENARIOS}/multiple-simulators-payload/xnf-simulator-smaller-valid-request.json
+${DCAE_SMALLER_PAYLOAD_REQUEST} ${VES_HV_SCENARIOS}/multiple-simulators-payload/dcae-smaller-valid-request.json
+
+${AMOUNT_15000} 15000
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/resources/common-keywords.robot b/tests/dcaegen2-collectors-hv-ves/testcases/resources/common-keywords.robot
new file mode 100644
index 00000000..58f5cbc1
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/resources/common-keywords.robot
@@ -0,0 +1,48 @@
+*** Settings ***
+Library XnfSimulatorLibrary
+Library VesHvContainersUtilsLibrary
+Library Collections
+
+*** Keywords ***
+Configure xNF Simulators Using Valid Certificates On Ports
+ [Arguments] ${XNF_PORTS_LIST}
+ ${VALID_XNF_SIMULATORS_ADDRESSES}= Configure xNF Simulators ${XNF_PORTS_LIST}
+ Set Suite Variable ${VALID_XNF_SIMULATORS_ADDRESSES}
+
+Configure xNF Simulators
+ [Arguments] ${XNF_PORTS_LIST}
+ ... ${should_use_valid_certs}=${true}
+ ... ${should_disable_ssl}=${false}
+ ... ${should_connect_to_unencrypted_hv_ves}=${false}
+ ${XNF_SIMULATORS_ADDRESSES}= Start Xnf Simulators ${XNF_PORTS_LIST}
+ ... ${should_use_valid_certs}
+ ... ${should_disable_ssl}
+ ... ${should_connect_to_unencrypted_hv_ves}
+ [Return] ${XNF_SIMULATORS_ADDRESSES}
+
+Get xNF Simulators Using Valid Certificates
+ [Arguments] ${AMOUNT}=1
+ ${SIMULATORS}= Get Slice From List ${VALID_XNF_SIMULATORS_ADDRESSES} 0 ${AMOUNT}
+ [Return] ${SIMULATORS}
+
+
+Send Messages From xNF Simulators
+ [Arguments] ${XNF_HOSTS_LIST} ${MESSAGE_FILEPATH}
+ :FOR ${HOST} IN @{XNF_HOSTS_LIST}
+ \ ${XNF_SIM_API_ACCESS}= Get xNF Sim Api Access Url ${HTTP_METHOD_URL} ${HOST}
+ \ ${XNF_SIM_API_URL}= Catenate SEPARATOR= ${XNF_SIM_API_ACCESS} ${XNF_SIM_API_PATH}
+ \ Send messages ${XNF_SIM_API_URL} ${MESSAGE_FILEPATH}
+
+
+VES-HV Collector Test Shutdown
+ Reset DCAE App Simulator ${DCAE_APP_API_MESSAGE_RESET_URL}
+
+
+VES-HV Collector Suite Teardown
+ Stop And Remove All Xnf Simulators ${SUITE NAME}
+
+*** Variables ***
+${HTTP_METHOD_URL} http://
+
+${XNF_SIM_API_PATH} /simulator/async
+
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/authorization/xnf-valid-messages-request.json b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/authorization/xnf-valid-messages-request.json
new file mode 100644
index 00000000..9aca4015
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/authorization/xnf-valid-messages-request.json
@@ -0,0 +1,24 @@
+[
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "VALID",
+ "messagesAmount": 5000
+ }
+] \ No newline at end of file
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/fixed-payload/dcae-fixed-payload-request.json b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/fixed-payload/dcae-fixed-payload-request.json
new file mode 100644
index 00000000..642c7d56
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/fixed-payload/dcae-fixed-payload-request.json
@@ -0,0 +1,24 @@
+[
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "FIXED_PAYLOAD",
+ "messagesAmount": 25000
+ }
+]
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/fixed-payload/xnf-fixed-payload-request.json b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/fixed-payload/xnf-fixed-payload-request.json
new file mode 100644
index 00000000..642c7d56
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/fixed-payload/xnf-fixed-payload-request.json
@@ -0,0 +1,24 @@
+[
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "FIXED_PAYLOAD",
+ "messagesAmount": 25000
+ }
+]
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-gpb-data/dcae-invalid-gpb-data-request.json b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-gpb-data/dcae-invalid-gpb-data-request.json
new file mode 100644
index 00000000..f38e9aa0
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-gpb-data/dcae-invalid-gpb-data-request.json
@@ -0,0 +1,24 @@
+[
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "VALID",
+ "messagesAmount": 50000
+ }
+]
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-gpb-data/xnf-invalid-gpb-data-request.json b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-gpb-data/xnf-invalid-gpb-data-request.json
new file mode 100644
index 00000000..22d48c5f
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-gpb-data/xnf-invalid-gpb-data-request.json
@@ -0,0 +1,68 @@
+[
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "VALID",
+ "messagesAmount": 25000
+ },
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "INVALID_GPB_DATA",
+ "messagesAmount": 100
+ },
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "VALID",
+ "messagesAmount": 25000
+ }
+]
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-wire-frame/dcae-invalid-wire-frame-request.json b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-wire-frame/dcae-invalid-wire-frame-request.json
new file mode 100644
index 00000000..f38e9aa0
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-wire-frame/dcae-invalid-wire-frame-request.json
@@ -0,0 +1,24 @@
+[
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "VALID",
+ "messagesAmount": 50000
+ }
+]
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-wire-frame/xnf-invalid-wire-frame-request.json b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-wire-frame/xnf-invalid-wire-frame-request.json
new file mode 100644
index 00000000..a7d22190
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/invalid-wire-frame/xnf-invalid-wire-frame-request.json
@@ -0,0 +1,68 @@
+[
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "VALID",
+ "messagesAmount": 25000
+ },
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "INVALID_WIRE_FRAME",
+ "messagesAmount": 100
+ },
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "VALID",
+ "messagesAmount": 25000
+ }
+]
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/multiple-simulators-payload/dcae-smaller-valid-request.json b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/multiple-simulators-payload/dcae-smaller-valid-request.json
new file mode 100644
index 00000000..89f3e067
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/multiple-simulators-payload/dcae-smaller-valid-request.json
@@ -0,0 +1,24 @@
+[
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "FIXED_PAYLOAD",
+ "messagesAmount": 15000
+ }
+] \ No newline at end of file
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/multiple-simulators-payload/xnf-simulator-smaller-valid-request.json b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/multiple-simulators-payload/xnf-simulator-smaller-valid-request.json
new file mode 100644
index 00000000..60c81a89
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/multiple-simulators-payload/xnf-simulator-smaller-valid-request.json
@@ -0,0 +1,24 @@
+[
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "FIXED_PAYLOAD",
+ "messagesAmount": 5000
+ }
+] \ No newline at end of file
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/too-big-payload/xnf-too-big-payload-request.json b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/too-big-payload/xnf-too-big-payload-request.json
new file mode 100644
index 00000000..54836bf3
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/too-big-payload/xnf-too-big-payload-request.json
@@ -0,0 +1,68 @@
+[
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "VALID",
+ "messagesAmount": 25000
+ },
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "TOO_BIG_PAYLOAD",
+ "messagesAmount": 100
+ },
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "VALID",
+ "messagesAmount": 25000
+ }
+]
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/unsupported-domain/dcae-unsupported-domain-request.json b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/unsupported-domain/dcae-unsupported-domain-request.json
new file mode 100644
index 00000000..f38e9aa0
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/unsupported-domain/dcae-unsupported-domain-request.json
@@ -0,0 +1,24 @@
+[
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "VALID",
+ "messagesAmount": 50000
+ }
+]
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/unsupported-domain/xnf-unsupported-domain-request.json b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/unsupported-domain/xnf-unsupported-domain-request.json
new file mode 100644
index 00000000..b3aada5b
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/resources/scenarios/unsupported-domain/xnf-unsupported-domain-request.json
@@ -0,0 +1,68 @@
+[
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "VALID",
+ "messagesAmount": 25000
+ },
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "FAULT",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "VALID",
+ "messagesAmount": 100
+ },
+ {
+ "commonEventHeader": {
+ "version": "sample-version",
+ "domain": "HVMEAS",
+ "sequence": 1,
+ "priority": 1,
+ "eventId": "sample-event-id",
+ "eventName": "sample-event-name",
+ "eventType": "sample-event-type",
+ "startEpochMicrosec": 120034455,
+ "lastEpochMicrosec": 120034455,
+ "nfNamingCode": "sample-nf-naming-code",
+ "nfcNamingCode": "sample-nfc-naming-code",
+ "reportingEntityId": "sample-reporting-entity-id",
+ "reportingEntityName": "sample-reporting-entity-name",
+ "sourceId": "sample-source-id",
+ "sourceName": "sample-source-name",
+ "vesEventListenerVersion": "another-version"
+ },
+ "messageType": "VALID",
+ "messagesAmount": 25000
+ }
+]
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/resources/ves-hv-configuration.json b/tests/dcaegen2-collectors-hv-ves/testcases/resources/ves-hv-configuration.json
new file mode 100644
index 00000000..b9e1a4b5
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/resources/ves-hv-configuration.json
@@ -0,0 +1,9 @@
+{
+ "dmaap.kafkaBootstrapServers": "kafka:9092",
+ "collector.routing": [
+ {
+ "fromDomain": "HVMEAS",
+ "toTopic": "test-hv-ran-meas"
+ }
+ ]
+} \ No newline at end of file
diff --git a/tests/dcaegen2/prh-testcases/__init__.robot b/tests/dcaegen2/prh-testcases/__init__.robot
new file mode 100644
index 00000000..f13ba6df
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Integration - PRH suite \ No newline at end of file
diff --git a/tests/dcaegen2/prh-testcases/assets/json_events/event_with_IPV4.json b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_IPV4.json
new file mode 100644
index 00000000..2ffe356f
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_IPV4.json
@@ -0,0 +1,11 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "sourceName":"NOK6061ZW2"
+ },
+ "pnfRegistrationFields": {
+ "oamV4IpAddress":"10.17.123.234",
+ "oamV6IpAddress":""
+ }
+ }
+}
diff --git a/tests/dcaegen2/prh-testcases/assets/json_events/event_with_IPV6.json b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_IPV6.json
new file mode 100644
index 00000000..c4a0e727
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_IPV6.json
@@ -0,0 +1,11 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "sourceName":"ERI6061ZW3"
+ },
+ "pnfRegistrationFields": {
+ "oamV4IpAddress":"",
+ "oamV6IpAddress":"2001:0db8:85a3:0000:0000:8b2e:0370:7334"
+ }
+ }
+}
diff --git a/tests/dcaegen2/prh-testcases/assets/json_events/event_with_all_fields.json b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_all_fields.json
new file mode 100644
index 00000000..16963e1b
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_all_fields.json
@@ -0,0 +1,11 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "sourceName":"NOK6061ZW1"
+ },
+ "pnfRegistrationFields": {
+ "oamV4IpAddress":"10.16.123.234",
+ "oamV6IpAddress":"2001:0db8:85a3:0000:0000:8a2e:0370:7334"
+ }
+ }
+}
diff --git a/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_IPV4_and_IPV6.json b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_IPV4_and_IPV6.json
new file mode 100644
index 00000000..1e3afa9d
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_IPV4_and_IPV6.json
@@ -0,0 +1,11 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "sourceName":"NOK6061ZW4"
+ },
+ "pnfRegistrationFields": {
+ "oamV4IpAddress":"",
+ "oamV6IpAddress":""
+ }
+ }
+}
diff --git a/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName.json b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName.json
new file mode 100644
index 00000000..126987fd
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName.json
@@ -0,0 +1,11 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "sourceName":""
+ },
+ "pnfRegistrationFields": {
+ "oamV4IpAddress":"10.18.123.234",
+ "oamV6IpAddress":"2001:0db8:85a3:0000:0000:8a2a:0370:7334"
+ }
+ }
+}
diff --git a/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName_IPV4_and_IPV6.json b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName_IPV4_and_IPV6.json
new file mode 100644
index 00000000..de1f576c
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName_IPV4_and_IPV6.json
@@ -0,0 +1,11 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "sourceName":""
+ },
+ "pnfRegistrationFields": {
+ "oamV4IpAddress":"",
+ "oamV6IpAddress":""
+ }
+ }
+}
diff --git a/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName_and_IPV4.json b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName_and_IPV4.json
new file mode 100644
index 00000000..4838f1b0
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName_and_IPV4.json
@@ -0,0 +1,11 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "sourceName":""
+ },
+ "pnfRegistrationFields": {
+ "oamV4IpAddress":"",
+ "oamV6IpAddress":"2001:0db8:85a3:0000:0000:8b2f:0370:7334"
+ }
+ }
+}
diff --git a/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName_and_IPV6.json b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName_and_IPV6.json
new file mode 100644
index 00000000..04ab7ceb
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName_and_IPV6.json
@@ -0,0 +1,11 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "sourceName":""
+ },
+ "pnfRegistrationFields": {
+ "oamV4IpAddress":"10.17.163.234",
+ "oamV6IpAddress":""
+ }
+ }
+}
diff --git a/tests/dcaegen2/prh-testcases/assets/json_events/not_json_format.json b/tests/dcaegen2/prh-testcases/assets/json_events/not_json_format.json
new file mode 100644
index 00000000..c87e188f
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/assets/json_events/not_json_format.json
@@ -0,0 +1,11 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "sourceName":"NOK6061ZW1"
+ },
+ "pnfRegistrationFields": {
+ "oamV4IpAddress":"10.16.123.234",
+ "oamV6IpAddress":"2001:0db8:85a3:0000:0000:8a2e:0370:7334",
+ }
+ }
+}
diff --git a/tests/dcaegen2/prh-testcases/prh_tests.robot b/tests/dcaegen2/prh-testcases/prh_tests.robot
new file mode 100644
index 00000000..23d86663
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/prh_tests.robot
@@ -0,0 +1,65 @@
+*** Settings ***
+Documentation Integration tests for PRH.
+... PRH receive events from DMaaP and produce or not PNF_READY notification depends on required fields in received event.
+Suite Setup Run keywords Create header Create sessions
+Library resources/PrhLibrary.py
+Resource resources/prh_library.robot
+Resource ../../common.robot
+
+*** Variables ***
+${DMAAP_SIMULATOR_URL} http://${DMAAP_SIMULATOR}
+${AAI_SIMULATOR_URL} http://${AAI_SIMULATOR}
+${PRH_URL} http://${PRH}
+${EVENT_WITH_ALL_VALID_REQUIRED_FIELDS} %{WORKSPACE}/test/csit/tests/dcaegen2/prh-testcases/assets/json_events/event_with_all_fields.json
+${EVENT_WITH_IPV4} %{WORKSPACE}/test/csit/tests/dcaegen2/prh-testcases/assets/json_events/event_with_IPV4.json
+${EVENT_WITH_IPV6} %{WORKSPACE}/test/csit/tests/dcaegen2/prh-testcases/assets/json_events/event_with_IPV6.json
+${EVENT_WITH_MISSING_IPV4_AND_IPV6} %{WORKSPACE}/test/csit/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_IPV4_and_IPV6.json
+${EVENT_WITH_MISSING_SOURCENAME} %{WORKSPACE}/test/csit/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName.json
+${EVENT_WITH_MISSING_SOURCENAME_AND_IPV4} %{WORKSPACE}/test/csit/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName_and_IPV4.json
+${EVENT_WITH_MISSING_SOURCENAME_AND_IPV6} %{WORKSPACE}/test/csit/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName_and_IPV6.json
+${EVENT_WITH_MISSING_SOURCENAME_IPV4_AND_IPV6} %{WORKSPACE}/test/csit/tests/dcaegen2/prh-testcases/assets/json_events/event_with_missing_sourceName_IPV4_and_IPV6.json
+${Not_json_format} %{WORKSPACE}/test/csit/tests/dcaegen2/prh-testcases/assets/json_events/not_json_format.json
+
+*** Test Cases ***
+Valid DMaaP event can be converted to PNF_READY notification
+ [Documentation] PRH get valid event from DMaaP with required fields - PRH produce PNF_READY notification
+ [Tags] PRH Valid event
+ [Template] Valid event processing
+ ${EVENT_WITH_ALL_VALID_REQUIRED_FIELDS}
+ ${EVENT_WITH_IPV4}
+ ${EVENT_WITH_IPV6}
+
+Invalid DMaaP event cannot be converted to PNF_READY notification
+ [Documentation] PRH get invalid event from DMaaP with missing required fields - PRH does not produce PNF_READY notification
+ [Tags] PRH Invalid event
+ [Template] Invalid event processing
+ ${EVENT_WITH_MISSING_IPV4_AND_IPV6}
+ ${EVENT_WITH_MISSING_SOURCENAME}
+ ${EVENT_WITH_MISSING_SOURCENAME_AND_IPV4}
+ ${EVENT_WITH_MISSING_SOURCENAME_AND_IPV6}
+ ${EVENT_WITH_MISSING_SOURCENAME_IPV4_AND_IPV6}
+
+Get valid event from DMaaP and record in AAI does not exist
+ [Documentation] PRH get valid event from DMaaP with all required fields and in AAI record doesn't exist - PRH does not produce PNF_READY notification
+ [Tags] PRH Missing AAI record
+ [Timeout] 30s
+ ${data}= Get Data From File ${EVENT_WITH_ALL_VALID_REQUIRED_FIELDS}
+ Set PNF name in AAI wrong_aai_record
+ Set event in DMaaP ${data}
+ Wait Until Keyword Succeeds 100x 300ms Check PRH log java.io.IOException: Connection closed prematurely
+
+Event in DMaaP is not JSON format
+ [Documentation] PRH get not JSON format event from DMaaP - PRH does not produce PNF_READY notification
+ [Tags] PRH
+ ${data}= Get Data From File ${Not_json_format}
+ Set event in DMaaP ${data}
+ Wait Until Keyword Succeeds 100x 300ms Check PRH log |java.lang.IllegalStateException: Not a JSON Array:
+
+Get valid event from DMaaP and AAI is not responding
+ [Documentation] PRH get valid event from DMaaP with all required fields and AAI is not responding - PRH does not produce PNF_READY notification
+ [Tags] PRH AAI
+ [Timeout] 180s
+ ${data}= Get Data From File ${EVENT_WITH_ALL_VALID_REQUIRED_FIELDS}
+ Stop AAI
+ Set event in DMaaP ${data}
+ Wait Until Keyword Succeeds 100x 300ms Check PRH log java.net.UnknownHostException: aai
diff --git a/tests/dcaegen2/prh-testcases/resources/PrhLibrary.py b/tests/dcaegen2/prh-testcases/resources/PrhLibrary.py
new file mode 100644
index 00000000..6a95c71e
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/resources/PrhLibrary.py
@@ -0,0 +1,46 @@
+import json
+
+import docker
+
+
+class PrhLibrary(object):
+
+ def __init__(self):
+ pass
+
+ @staticmethod
+ def check_for_log(search_for):
+ client = docker.from_env()
+ container = client.containers.get('prh')
+ for line in container.logs(stream=True):
+ if search_for in line.strip():
+ return True
+ else:
+ return False
+
+ @staticmethod
+ def create_pnf_ready_notification(json_file):
+ json_to_python = json.loads(json_file)
+ ipv4 = json_to_python["event"]["pnfRegistrationFields"]["oamV4IpAddress"]
+ ipv6 = json_to_python["event"]["pnfRegistrationFields"]["oamV6IpAddress"]
+ correlationId = json_to_python["event"]["commonEventHeader"]["sourceName"]
+ str_json = '{"correlationId":"' + correlationId + '","ipaddress-v4-oam":"' + ipv4 + '","ipaddress-v6-oam":"' + ipv6 + '"}'
+ python_to_json = json.dumps(str_json)
+ return python_to_json.replace("\\", "")[1:-1]
+
+ @staticmethod
+ def create_pnf_name(json_file):
+ json_to_python = json.loads(json_file)
+ correlationId = json_to_python["event"]["commonEventHeader"]["sourceName"]
+ return correlationId
+
+ @staticmethod
+ def stop_aai():
+ client = docker.from_env()
+ container = client.containers.get('aai_simulator')
+ container.stop()
+
+ def create_invalid_notification(self, json_file):
+ return self.create_pnf_ready_notification(json_file).replace("\":", "\": ")\
+ .replace("ipaddress-v4-oam", "oamV4IpAddress").replace("ipaddress-v6-oam", "oamV6IpAddress")\
+ .replace("}", "\\n}")
diff --git a/tests/dcaegen2/prh-testcases/resources/docker-compose.yml b/tests/dcaegen2/prh-testcases/resources/docker-compose.yml
new file mode 100644
index 00000000..67921e8e
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/resources/docker-compose.yml
@@ -0,0 +1,41 @@
+version: '3'
+services:
+ prh:
+ image: nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.prh.prh-app-server:latest
+ command: >
+ --dmaap.dmaapConsumerConfiguration.dmaapHostName=dmaap
+ --dmaap.dmaapConsumerConfiguration.dmaapPortNumber=2222
+ --dmaap.dmaapProducerConfiguration.dmaapHostName=dmaap
+ --dmaap.dmaapProducerConfiguration.dmaapPortNumber=2222
+ --aai.aaiClientConfiguration.aaiHostPortNumber=3333
+ --aai.aaiClientConfiguration.aaiHost=aai
+ --aai.aaiClientConfiguration.aaiProtocol=http
+ entrypoint:
+ - java
+ - -Dspring.profiles.active=dev
+ - -Dlogging.level.org.onap.dcaegen2.services.prh=TRACE
+ - -jar
+ - /opt/prh-app-server.jar
+ ports:
+ - "8100:8100"
+ - "8433:8433"
+ container_name: prh
+ depends_on:
+ - dmaap
+ - aai
+
+ dmaap:
+ build:
+ context: simulator
+ dockerfile: DMaaP_simulator
+ ports:
+ - "2222:2222"
+ container_name: dmaap_simulator
+
+ aai:
+ build:
+ context: simulator
+ dockerfile: AAI_simulator
+ ports:
+ - "3333:3333"
+ container_name: aai_simulator
diff --git a/tests/dcaegen2/prh-testcases/resources/prh_library.robot b/tests/dcaegen2/prh-testcases/resources/prh_library.robot
new file mode 100644
index 00000000..73ce2a2c
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/resources/prh_library.robot
@@ -0,0 +1,56 @@
+*** Settings ***
+Library RequestsLibrary
+Library Collections
+Library PrhLibrary.py
+Resource ../../../common.robot
+
+*** Keywords ***
+Create header
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ Set Suite Variable ${suite_headers} ${headers}
+
+Create sessions
+ Create Session dmaap_session ${DMAAP_SIMULATOR_URL}
+ Set Suite Variable ${suite_dmaap_session} dmaap_session
+ Create Session aai_session ${AAI_SIMULATOR_URL}
+ Set Suite Variable ${suite_aai_session} aai_session
+
+Invalid event processing
+ [Arguments] ${input_invalid_event_in_dmaap}
+ [Timeout] 30s
+ ${data}= Get Data From File ${input_invalid_event_in_dmaap}
+ Set event in DMaaP ${data}
+ ${invalid_notification}= Create invalid notification ${data}
+ ${notification}= Catenate SEPARATOR= \\n |org.onap.dcaegen2.services.prh.exceptions.DmaapNotFoundException: Incorrect json, consumerDmaapModel can not be created: ${invalid_notification}
+ Wait Until Keyword Succeeds 100x 100ms Check PRH log ${notification}
+
+Valid event processing
+ [Arguments] ${input_valid_event_in_dmaap}
+ [Timeout] 30s
+ ${data}= Get Data From File ${input_valid_event_in_dmaap}
+ ${posted_event_to_dmaap}= Create PNF_Ready notification ${data}
+ ${pnf_name}= Create PNF name ${data}
+ Set PNF name in AAI ${pnf_name}
+ Set event in DMaaP ${data}
+ Wait Until Keyword Succeeds 100x 300ms Check PNF_READY notification ${posted_event_to_dmaap}
+
+Check PRH log
+ [Arguments] ${searched_log}
+ ${status}= Check for log ${searched_log}
+ Should Be Equal As Strings ${status} True
+
+Check PNF_READY notification
+ [Arguments] ${posted_event_to_dmaap}
+ ${resp}= Get Request ${suite_dmaap_session} /events/pnfReady headers=${suite_headers}
+ Should Be Equal ${resp.text} ${posted_event_to_dmaap}
+
+Set PNF name in AAI
+ [Arguments] ${pnfs_name}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=text/html
+ ${resp}= Put Request ${suite_aai_session} /set_pnfs headers=${headers} data=${pnfs_name}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Set event in DMaaP
+ [Arguments] ${event_in_dmaap}
+ ${resp}= Put Request ${suite_dmaap_session} /set_get_event headers=${suite_headers} data=${event_in_dmaap}
+ Should Be Equal As Strings ${resp.status_code} 200
diff --git a/tests/dcaegen2/prh-testcases/resources/simulator/AAI.py b/tests/dcaegen2/prh-testcases/resources/simulator/AAI.py
new file mode 100644
index 00000000..c57903c3
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/resources/simulator/AAI.py
@@ -0,0 +1,56 @@
+from http.server import BaseHTTPRequestHandler
+from http.server import HTTPServer
+import re
+import sys
+
+pnfs = 'Empty'
+
+
+class AAIHandler(BaseHTTPRequestHandler):
+
+ def do_PUT(self):
+ if re.search('/set_pnfs', self.path):
+ global pnfs
+ content_length = int(self.headers['Content-Length'])
+ pnfs = self.rfile.read(content_length)
+ _header_200_and_json(self)
+
+ return
+
+ def do_PATCH(self):
+ pnfs_name = '/aai/v12/network/pnfs/pnf/' + pnfs.decode()
+ if re.search('wrong_aai_record', self.path):
+ self.send_response(400)
+ self.end_headers()
+ elif re.search(pnfs_name, self.path):
+ self.send_response(200)
+ self.end_headers()
+
+ return
+
+
+def _header_200_and_json(self):
+ self.send_response(200)
+ self.send_header('Content-Type', 'application/json')
+ self.end_headers()
+
+
+def _main_(handler_class=AAIHandler, server_class=HTTPServer, protocol="HTTP/1.0"):
+
+ if sys.argv[1:]:
+ port = int(sys.argv[1])
+ else:
+ port = 3333
+
+ server_address = ('', port)
+
+ handler_class.protocol_version = protocol
+ httpd = server_class(server_address, handler_class)
+
+ sa = httpd.socket.getsockname()
+ print("Serving HTTP on", sa[0], "port", sa[1], "...")
+ httpd.serve_forever()
+
+
+if __name__ == '__main__':
+ _main_()
diff --git a/tests/dcaegen2/prh-testcases/resources/simulator/AAI_simulator b/tests/dcaegen2/prh-testcases/resources/simulator/AAI_simulator
new file mode 100644
index 00000000..89a266eb
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/resources/simulator/AAI_simulator
@@ -0,0 +1,15 @@
+FROM alpine:3.8
+
+RUN apk add --no-cache python3 && \
+ python3 -m ensurepip && \
+ rm -r /usr/lib/python*/ensurepip && \
+ pip3 install --upgrade pip setuptools && \
+ if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi && \
+ if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 /usr/bin/python; fi && \
+ rm -r /root/.cache
+
+ADD AAI.py /
+
+EXPOSE 3333
+
+CMD [ "python", "./AAI.py" ]
diff --git a/tests/dcaegen2/prh-testcases/resources/simulator/DMaaP.py b/tests/dcaegen2/prh-testcases/resources/simulator/DMaaP.py
new file mode 100644
index 00000000..96e22a14
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/resources/simulator/DMaaP.py
@@ -0,0 +1,65 @@
+from http.server import BaseHTTPRequestHandler
+from http.server import HTTPServer
+import re
+import sys
+
+posted_event_from_prh = b'Empty'
+received_event_to_get_method = 'Empty'
+
+
+class DMaaPHandler(BaseHTTPRequestHandler):
+
+ def do_PUT(self):
+ if re.search('/set_get_event', self.path):
+ global received_event_to_get_method
+ content_length = int(self.headers['Content-Length'])
+ received_event_to_get_method = self.rfile.read(content_length)
+ _header_200_and_json(self)
+
+ return
+
+ def do_POST(self):
+ if re.search('/events/unauthenticated.PNF_READY', self.path):
+ global posted_event_from_prh
+ content_length = int(self.headers['Content-Length'])
+ posted_event_from_prh = self.rfile.read(content_length)
+ _header_200_and_json(self)
+
+ return
+
+ def do_GET(self):
+ if re.search('/events/unauthenticated.VES_PNFREG_OUTPUT/OpenDcae-c12/c12', self.path):
+ _header_200_and_json(self)
+ self.wfile.write(received_event_to_get_method)
+ elif re.search('/events/pnfReady', self.path):
+ _header_200_and_json(self)
+ self.wfile.write(posted_event_from_prh)
+
+ return
+
+
+def _header_200_and_json(self):
+ self.send_response(200)
+ self.send_header('Content-Type', 'application/json')
+ self.end_headers()
+
+
+def _main_(handler_class=DMaaPHandler, server_class=HTTPServer, protocol="HTTP/1.0"):
+
+ if sys.argv[1:]:
+ port = int(sys.argv[1])
+ else:
+ port = 2222
+
+ server_address = ('', port)
+
+ handler_class.protocol_version = protocol
+ httpd = server_class(server_address, handler_class)
+
+ sa = httpd.socket.getsockname()
+ print("Serving HTTP on", sa[0], "port", sa[1], "...")
+ httpd.serve_forever()
+
+
+if __name__ == '__main__':
+ _main_()
diff --git a/tests/dcaegen2/prh-testcases/resources/simulator/DMaaP_simulator b/tests/dcaegen2/prh-testcases/resources/simulator/DMaaP_simulator
new file mode 100644
index 00000000..9cf21dc9
--- /dev/null
+++ b/tests/dcaegen2/prh-testcases/resources/simulator/DMaaP_simulator
@@ -0,0 +1,15 @@
+FROM alpine:3.8
+
+RUN apk add --no-cache python3 && \
+ python3 -m ensurepip && \
+ rm -r /usr/lib/python*/ensurepip && \
+ pip3 install --upgrade pip setuptools && \
+ if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi && \
+ if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 /usr/bin/python; fi && \
+ rm -r /root/.cache
+
+ADD DMaaP.py /
+
+EXPOSE 2222
+
+CMD [ "python", "./DMaaP.py" ]
diff --git a/tests/dcaegen2/testcases/__init__.robot b/tests/dcaegen2/testcases/__init__.robot
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/dcaegen2/testcases/__init__.robot
diff --git a/tests/dcaegen2/testcases/assets/json_events/CommonEventFormat_28.3.json b/tests/dcaegen2/testcases/assets/json_events/CommonEventFormat_28.3.json
new file mode 100644
index 00000000..90f6d81a
--- /dev/null
+++ b/tests/dcaegen2/testcases/assets/json_events/CommonEventFormat_28.3.json
@@ -0,0 +1,1866 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+
+ "definitions": {
+ "attCopyrightNotice": {
+ "description": "Copyright (c) <2017>, AT&T Intellectual Property. All rights reserved. Licensed under the Apache License, Version 2.0 (the License)",
+ "type": "object",
+ "properties": {
+ "useAndRedistribution": {
+ "description": "You may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0",
+ "type": "string"
+ },
+ "licenseLink": {
+ "description": "http://www.apache.org/licenses/LICENSE-2.0",
+ "type":"string"
+ },
+ "condition1": {
+ "description": "Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an AS IS BASIS,",
+ "type": "string"
+ },
+ "condition2": {
+ "description": "Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.",
+ "type": "string"
+ },
+ "condition3": {
+ "description": "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.",
+ "type": "string"
+ },
+ "condition4": {
+ "description": "See the License for the specific language governing permissions and limitations under the License.",
+ "type": "string"
+ },
+ "Trademarks": {
+ "description": "ECOMP and OpenECOMP are trademarks and service marks of AT&T Intellectual Property.",
+ "type": "string"
+ }
+ }
+ },
+
+ "codecsInUse": {
+ "description": "number of times an identified codec was used over the measurementInterval",
+ "type": "object",
+ "properties": {
+ "codecIdentifier": { "type": "string" },
+ "numberInUse": { "type": "integer" }
+ },
+ "required": [ "codecIdentifier", "numberInUse" ]
+ },
+ "command": {
+ "description": "command from an event collector toward an event source",
+ "type": "object",
+ "properties": {
+ "commandType": {
+ "type": "string",
+ "enum": [
+ "heartbeatIntervalChange",
+ "measurementIntervalChange",
+ "provideThrottlingState",
+ "throttlingSpecification"
+ ]
+ },
+ "eventDomainThrottleSpecification": { "$ref": "#/definitions/eventDomainThrottleSpecification" },
+ "heartbeatInterval": { "type": "integer" },
+ "measurementInterval": { "type": "integer" }
+ },
+ "required": [ "commandType" ]
+ },
+ "commandList": {
+ "description": "array of commands from an event collector toward an event source",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/command"
+ },
+ "minItems": 0
+ },
+ "commonEventHeader": {
+ "description": "fields common to all events",
+ "type": "object",
+ "properties": {
+ "domain": {
+ "description": "the eventing domain associated with the event",
+ "type": "string",
+ "enum": [
+ "fault",
+ "heartbeat",
+ "measurementsForVfScaling",
+ "mobileFlow",
+ "other",
+ "sipSignaling",
+ "stateChange",
+ "syslog",
+ "thresholdCrossingAlert",
+ "voiceQuality"
+ ]
+ },
+ "eventId": {
+ "description": "event key that is unique to the event source",
+ "type": "string"
+ },
+ "eventName": {
+ "description": "unique event name",
+ "type": "string"
+ },
+ "eventType": {
+ "description": "for example - applicationVnf, guestOS, hostOS, platform",
+ "type": "string"
+ },
+ "internalHeaderFields": { "$ref": "#/definitions/internalHeaderFields" },
+ "lastEpochMicrosec": {
+ "description": "the latest unix time aka epoch time associated with the event from any component--as microseconds elapsed since 1 Jan 1970 not including leap seconds",
+ "type": "number"
+ },
+ "nfcNamingCode": {
+ "description": "3 character network function component type, aligned with vfc naming standards",
+ "type": "string"
+ },
+ "nfNamingCode": {
+ "description": "4 character network function type, aligned with vnf naming standards",
+ "type": "string"
+ },
+ "priority": {
+ "description": "processing priority",
+ "type": "string",
+ "enum": [
+ "High",
+ "Medium",
+ "Normal",
+ "Low"
+ ]
+ },
+ "reportingEntityId": {
+ "description": "UUID identifying the entity reporting the event, for example an OAM VM; must be populated by the ATT enrichment process",
+ "type": "string"
+ },
+ "reportingEntityName": {
+ "description": "name of the entity reporting the event, for example, an EMS name; may be the same as sourceName",
+ "type": "string"
+ },
+ "sequence": {
+ "description": "ordering of events communicated by an event source instance or 0 if not needed",
+ "type": "integer"
+ },
+ "sourceId": {
+ "description": "UUID identifying the entity experiencing the event issue; must be populated by the ATT enrichment process",
+ "type": "string"
+ },
+ "sourceName": {
+ "description": "name of the entity experiencing the event issue",
+ "type": "string"
+ },
+ "startEpochMicrosec": {
+ "description": "the earliest unix time aka epoch time associated with the event from any component--as microseconds elapsed since 1 Jan 1970 not including leap seconds",
+ "type": "number"
+ },
+ "version": {
+ "description": "version of the event header",
+ "type": "number"
+ }
+ },
+ "required": [ "domain", "eventId", "eventName", "lastEpochMicrosec",
+ "priority", "reportingEntityName", "sequence", "sourceName",
+ "startEpochMicrosec", "version" ]
+ },
+ "counter": {
+ "description": "performance counter",
+ "type": "object",
+ "properties": {
+ "criticality": { "type": "string", "enum": [ "CRIT", "MAJ" ] },
+ "name": { "type": "string" },
+ "thresholdCrossed": { "type": "string" },
+ "value": { "type": "string"}
+ },
+ "required": [ "criticality", "name", "thresholdCrossed", "value" ]
+ },
+ "cpuUsage": {
+ "description": "usage of an identified CPU",
+ "type": "object",
+ "properties": {
+ "cpuIdentifier": {
+ "description": "cpu identifer",
+ "type": "string"
+ },
+ "cpuIdle": {
+ "description": "percentage of CPU time spent in the idle task",
+ "type": "number"
+ },
+ "cpuUsageInterrupt": {
+ "description": "percentage of time spent servicing interrupts",
+ "type": "number"
+ },
+ "cpuUsageNice": {
+ "description": "percentage of time spent running user space processes that have been niced",
+ "type": "number"
+ },
+ "cpuUsageSoftIrq": {
+ "description": "percentage of time spent handling soft irq interrupts",
+ "type": "number"
+ },
+ "cpuUsageSteal": {
+ "description": "percentage of time spent in involuntary wait which is neither user, system or idle time and is effectively time that went missing",
+ "type": "number"
+ },
+ "cpuUsageSystem": {
+ "description": "percentage of time spent on system tasks running the kernel",
+ "type": "number"
+ },
+ "cpuUsageUser": {
+ "description": "percentage of time spent running un-niced user space processes",
+ "type": "number"
+ },
+ "cpuWait": {
+ "description": "percentage of CPU time spent waiting for I/O operations to complete",
+ "type": "number"
+ },
+ "percentUsage": {
+ "description": "aggregate cpu usage of the virtual machine on which the VNFC reporting the event is running",
+ "type": "number"
+ }
+ },
+ "required": [ "cpuIdentifier", "percentUsage" ]
+ },
+ "diskUsage": {
+ "description": "usage of an identified disk",
+ "type": "object",
+ "properties": {
+ "diskIdentifier": {
+ "description": "disk identifier",
+ "type": "string"
+ },
+ "diskIoTimeAvg": {
+ "description": "milliseconds spent doing input/output operations over 1 sec; treat this metric as a device load percentage where 1000ms matches 100% load; provide the average over the measurement interval",
+ "type": "number"
+ },
+ "diskIoTimeLast": {
+ "description": "milliseconds spent doing input/output operations over 1 sec; treat this metric as a device load percentage where 1000ms matches 100% load; provide the last value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskIoTimeMax": {
+ "description": "milliseconds spent doing input/output operations over 1 sec; treat this metric as a device load percentage where 1000ms matches 100% load; provide the maximum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskIoTimeMin": {
+ "description": "milliseconds spent doing input/output operations over 1 sec; treat this metric as a device load percentage where 1000ms matches 100% load; provide the minimum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedReadAvg": {
+ "description": "number of logical read operations that were merged into physical read operations, e.g., two logical reads were served by one physical disk access; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedReadLast": {
+ "description": "number of logical read operations that were merged into physical read operations, e.g., two logical reads were served by one physical disk access; provide the last value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedReadMax": {
+ "description": "number of logical read operations that were merged into physical read operations, e.g., two logical reads were served by one physical disk access; provide the maximum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedReadMin": {
+ "description": "number of logical read operations that were merged into physical read operations, e.g., two logical reads were served by one physical disk access; provide the minimum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedWriteAvg": {
+ "description": "number of logical write operations that were merged into physical write operations, e.g., two logical writes were served by one physical disk access; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedWriteLast": {
+ "description": "number of logical write operations that were merged into physical write operations, e.g., two logical writes were served by one physical disk access; provide the last value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedWriteMax": {
+ "description": "number of logical write operations that were merged into physical write operations, e.g., two logical writes were served by one physical disk access; provide the maximum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedWriteMin": {
+ "description": "number of logical write operations that were merged into physical write operations, e.g., two logical writes were served by one physical disk access; provide the minimum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsReadAvg": {
+ "description": "number of octets per second read from a disk or partition; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsReadLast": {
+ "description": "number of octets per second read from a disk or partition; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsReadMax": {
+ "description": "number of octets per second read from a disk or partition; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsReadMin": {
+ "description": "number of octets per second read from a disk or partition; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsWriteAvg": {
+ "description": "number of octets per second written to a disk or partition; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsWriteLast": {
+ "description": "number of octets per second written to a disk or partition; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsWriteMax": {
+ "description": "number of octets per second written to a disk or partition; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsWriteMin": {
+ "description": "number of octets per second written to a disk or partition; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsReadAvg": {
+ "description": "number of read operations per second issued to the disk; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsReadLast": {
+ "description": "number of read operations per second issued to the disk; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsReadMax": {
+ "description": "number of read operations per second issued to the disk; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsReadMin": {
+ "description": "number of read operations per second issued to the disk; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsWriteAvg": {
+ "description": "number of write operations per second issued to the disk; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsWriteLast": {
+ "description": "number of write operations per second issued to the disk; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsWriteMax": {
+ "description": "number of write operations per second issued to the disk; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsWriteMin": {
+ "description": "number of write operations per second issued to the disk; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskPendingOperationsAvg": {
+ "description": "queue size of pending I/O operations per second; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskPendingOperationsLast": {
+ "description": "queue size of pending I/O operations per second; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskPendingOperationsMax": {
+ "description": "queue size of pending I/O operations per second; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskPendingOperationsMin": {
+ "description": "queue size of pending I/O operations per second; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeReadAvg": {
+ "description": "milliseconds a read operation took to complete; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeReadLast": {
+ "description": "milliseconds a read operation took to complete; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeReadMax": {
+ "description": "milliseconds a read operation took to complete; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeReadMin": {
+ "description": "milliseconds a read operation took to complete; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeWriteAvg": {
+ "description": "milliseconds a write operation took to complete; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeWriteLast": {
+ "description": "milliseconds a write operation took to complete; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeWriteMax": {
+ "description": "milliseconds a write operation took to complete; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeWriteMin": {
+ "description": "milliseconds a write operation took to complete; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ }
+ },
+ "required": [ "diskIdentifier" ]
+ },
+ "endOfCallVqmSummaries": {
+ "description": "provides end of call voice quality metrics",
+ "type": "object",
+ "properties": {
+ "adjacencyName": {
+ "description": " adjacency name",
+ "type": "string"
+ },
+ "endpointDescription": {
+ "description": "Either Caller or Callee",
+ "type": "string",
+ "enum": ["Caller", "Callee"]
+ },
+ "endpointJitter": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpOctetsDiscarded": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpOctetsReceived": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpOctetsSent": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpPacketsDiscarded": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpPacketsReceived": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpPacketsSent": {
+ "description": "",
+ "type": "number"
+ },
+ "localJitter": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpOctetsDiscarded": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpOctetsReceived": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpOctetsSent": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpPacketsDiscarded": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpPacketsReceived": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpPacketsSent": {
+ "description": "",
+ "type": "number"
+ },
+ "mosCqe": {
+ "description": "1-5 1dp",
+ "type": "number"
+ },
+ "packetsLost": {
+ "description": "",
+ "type": "number"
+ },
+ "packetLossPercent": {
+ "description" : "Calculated percentage packet loss based on Endpoint RTP packets lost (as reported in RTCP) and Local RTP packets sent. Direction is based on Endpoint description (Caller, Callee). Decimal (2 dp)",
+ "type": "number"
+ },
+ "rFactor": {
+ "description": "0-100",
+ "type": "number"
+ },
+ "roundTripDelay": {
+ "description": "millisecs",
+ "type": "number"
+ }
+ },
+ "required": [ "adjacencyName", "endpointDescription" ]
+ },
+ "event": {
+ "description": "the root level of the common event format",
+ "type": "object",
+ "properties": {
+ "commonEventHeader": { "$ref": "#/definitions/commonEventHeader" },
+ "faultFields": { "$ref": "#/definitions/faultFields" },
+ "heartbeatFields": { "$ref": "#/definitions/heartbeatFields" },
+ "measurementsForVfScalingFields": { "$ref": "#/definitions/measurementsForVfScalingFields" },
+ "mobileFlowFields": { "$ref": "#/definitions/mobileFlowFields" },
+ "otherFields": { "$ref": "#/definitions/otherFields" },
+ "sipSignalingFields": { "$ref": "#/definitions/sipSignalingFields" },
+ "stateChangeFields": { "$ref": "#/definitions/stateChangeFields" },
+ "syslogFields": { "$ref": "#/definitions/syslogFields" },
+ "thresholdCrossingAlertFields": { "$ref": "#/definitions/thresholdCrossingAlertFields" },
+ "voiceQualityFields": { "$ref": "#/definitions/voiceQualityFields" }
+ },
+ "required": [ "commonEventHeader" ]
+ },
+ "eventDomainThrottleSpecification": {
+ "description": "specification of what information to suppress within an event domain",
+ "type": "object",
+ "properties": {
+ "eventDomain": {
+ "description": "Event domain enum from the commonEventHeader domain field",
+ "type": "string"
+ },
+ "suppressedFieldNames": {
+ "description": "List of optional field names in the event block that should not be sent to the Event Listener",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "suppressedNvPairsList": {
+ "description": "Optional list of specific NvPairsNames to suppress within a given Name-Value Field",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/suppressedNvPairs"
+ }
+ }
+ },
+ "required": [ "eventDomain" ]
+ },
+ "eventDomainThrottleSpecificationList": {
+ "description": "array of eventDomainThrottleSpecifications",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/eventDomainThrottleSpecification"
+ },
+ "minItems": 0
+ },
+ "eventList": {
+ "description": "array of events",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/event"
+ }
+ },
+ "eventThrottlingState": {
+ "description": "reports the throttling in force at the event source",
+ "type": "object",
+ "properties": {
+ "eventThrottlingMode": {
+ "description": "Mode the event manager is in",
+ "type": "string",
+ "enum": [
+ "normal",
+ "throttled"
+ ]
+ },
+ "eventDomainThrottleSpecificationList": { "$ref": "#/definitions/eventDomainThrottleSpecificationList" }
+ },
+ "required": [ "eventThrottlingMode" ]
+ },
+ "faultFields": {
+ "description": "fields specific to fault events",
+ "type": "object",
+ "properties": {
+ "alarmAdditionalInformation": {
+ "description": "additional alarm information",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "alarmCondition": {
+ "description": "alarm condition reported by the device",
+ "type": "string"
+ },
+ "alarmInterfaceA": {
+ "description": "card, port, channel or interface name of the device generating the alarm",
+ "type": "string"
+ },
+ "eventCategory": {
+ "description": "Event category, for example: license, link, routing, security, signaling",
+ "type": "string"
+ },
+ "eventSeverity": {
+ "description": "event severity",
+ "type": "string",
+ "enum": [
+ "CRITICAL",
+ "MAJOR",
+ "MINOR",
+ "WARNING",
+ "NORMAL"
+ ]
+ },
+ "eventSourceType": {
+ "description": "type of event source; examples: card, host, other, port, portThreshold, router, slotThreshold, switch, virtualMachine, virtualNetworkFunction",
+ "type": "string"
+ },
+ "faultFieldsVersion": {
+ "description": "version of the faultFields block",
+ "type": "number"
+ },
+ "specificProblem": {
+ "description": "short description of the alarm or problem",
+ "type": "string"
+ },
+ "vfStatus": {
+ "description": "virtual function status enumeration",
+ "type": "string",
+ "enum": [
+ "Active",
+ "Idle",
+ "Preparing to terminate",
+ "Ready to terminate",
+ "Requesting termination"
+ ]
+ }
+ },
+ "required": [ "alarmCondition", "eventSeverity", "eventSourceType",
+ "faultFieldsVersion", "specificProblem", "vfStatus" ]
+ },
+ "featuresInUse": {
+ "description": "number of times an identified feature was used over the measurementInterval",
+ "type": "object",
+ "properties": {
+ "featureIdentifier": { "type": "string" },
+ "featureUtilization": { "type": "integer" }
+ },
+ "required": [ "featureIdentifier", "featureUtilization" ]
+ },
+ "field": {
+ "description": "name value pair",
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "value": { "type": "string" }
+ },
+ "required": [ "name", "value" ]
+ },
+ "filesystemUsage": {
+ "description": "disk usage of an identified virtual machine in gigabytes and/or gigabytes per second",
+ "type": "object",
+ "properties": {
+ "blockConfigured": { "type": "number" },
+ "blockIops": { "type": "number" },
+ "blockUsed": { "type": "number" },
+ "ephemeralConfigured": { "type": "number" },
+ "ephemeralIops": { "type": "number" },
+ "ephemeralUsed": { "type": "number" },
+ "filesystemName": { "type": "string" }
+ },
+ "required": [ "blockConfigured", "blockIops", "blockUsed", "ephemeralConfigured",
+ "ephemeralIops", "ephemeralUsed", "filesystemName" ]
+ },
+ "gtpPerFlowMetrics": {
+ "description": "Mobility GTP Protocol per flow metrics",
+ "type": "object",
+ "properties": {
+ "avgBitErrorRate": {
+ "description": "average bit error rate",
+ "type": "number"
+ },
+ "avgPacketDelayVariation": {
+ "description": "Average packet delay variation or jitter in milliseconds for received packets: Average difference between the packet timestamp and time received for all pairs of consecutive packets",
+ "type": "number"
+ },
+ "avgPacketLatency": {
+ "description": "average delivery latency",
+ "type": "number"
+ },
+ "avgReceiveThroughput": {
+ "description": "average receive throughput",
+ "type": "number"
+ },
+ "avgTransmitThroughput": {
+ "description": "average transmit throughput",
+ "type": "number"
+ },
+ "durConnectionFailedStatus": {
+ "description": "duration of failed state in milliseconds, computed as the cumulative time between a failed echo request and the next following successful error request, over this reporting interval",
+ "type": "number"
+ },
+ "durTunnelFailedStatus": {
+ "description": "Duration of errored state, computed as the cumulative time between a tunnel error indicator and the next following non-errored indicator, over this reporting interval",
+ "type": "number"
+ },
+ "flowActivatedBy": {
+ "description": "Endpoint activating the flow",
+ "type": "string"
+ },
+ "flowActivationEpoch": {
+ "description": "Time the connection is activated in the flow (connection) being reported on, or transmission time of the first packet if activation time is not available",
+ "type": "number"
+ },
+ "flowActivationMicrosec": {
+ "description": "Integer microseconds for the start of the flow connection",
+ "type": "number"
+ },
+ "flowActivationTime": {
+ "description": "time the connection is activated in the flow being reported on, or transmission time of the first packet if activation time is not available; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "flowDeactivatedBy": {
+ "description": "Endpoint deactivating the flow",
+ "type": "string"
+ },
+ "flowDeactivationEpoch": {
+ "description": "Time for the start of the flow connection, in integer UTC epoch time aka UNIX time",
+ "type": "number"
+ },
+ "flowDeactivationMicrosec": {
+ "description": "Integer microseconds for the start of the flow connection",
+ "type": "number"
+ },
+ "flowDeactivationTime": {
+ "description": "Transmission time of the first packet in the flow connection being reported on; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "flowStatus": {
+ "description": "connection status at reporting time as a working / inactive / failed indicator value",
+ "type": "string"
+ },
+ "gtpConnectionStatus": {
+ "description": "Current connection state at reporting time",
+ "type": "string"
+ },
+ "gtpTunnelStatus": {
+ "description": "Current tunnel state at reporting time",
+ "type": "string"
+ },
+ "ipTosCountList": {
+ "description": "array of key: value pairs where the keys are drawn from the IP Type-of-Service identifiers which range from '0' to '255', and the values are the count of packets that had those ToS identifiers in the flow",
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": [
+ { "type": "string" },
+ { "type": "number" }
+ ]
+ }
+ },
+ "ipTosList": {
+ "description": "Array of unique IP Type-of-Service values observed in the flow where values range from '0' to '255'",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "largePacketRtt": {
+ "description": "large packet round trip time",
+ "type": "number"
+ },
+ "largePacketThreshold": {
+ "description": "large packet threshold being applied",
+ "type": "number"
+ },
+ "maxPacketDelayVariation": {
+ "description": "Maximum packet delay variation or jitter in milliseconds for received packets: Maximum of the difference between the packet timestamp and time received for all pairs of consecutive packets",
+ "type": "number"
+ },
+ "maxReceiveBitRate": {
+ "description": "maximum receive bit rate",
+ "type": "number"
+ },
+ "maxTransmitBitRate": {
+ "description": "maximum transmit bit rate",
+ "type": "number"
+ },
+ "mobileQciCosCountList": {
+ "description": "array of key: value pairs where the keys are drawn from LTE QCI or UMTS class of service strings, and the values are the count of packets that had those strings in the flow",
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": [
+ { "type": "string" },
+ { "type": "number" }
+ ]
+ }
+ },
+ "mobileQciCosList": {
+ "description": "Array of unique LTE QCI or UMTS class-of-service values observed in the flow",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "numActivationFailures": {
+ "description": "Number of failed activation requests, as observed by the reporting node",
+ "type": "number"
+ },
+ "numBitErrors": {
+ "description": "number of errored bits",
+ "type": "number"
+ },
+ "numBytesReceived": {
+ "description": "number of bytes received, including retransmissions",
+ "type": "number"
+ },
+ "numBytesTransmitted": {
+ "description": "number of bytes transmitted, including retransmissions",
+ "type": "number"
+ },
+ "numDroppedPackets": {
+ "description": "number of received packets dropped due to errors per virtual interface",
+ "type": "number"
+ },
+ "numGtpEchoFailures": {
+ "description": "Number of Echo request path failures where failed paths are defined in 3GPP TS 29.281 sec 7.2.1 and 3GPP TS 29.060 sec. 11.2",
+ "type": "number"
+ },
+ "numGtpTunnelErrors": {
+ "description": "Number of tunnel error indications where errors are defined in 3GPP TS 29.281 sec 7.3.1 and 3GPP TS 29.060 sec. 11.1",
+ "type": "number"
+ },
+ "numHttpErrors": {
+ "description": "Http error count",
+ "type": "number"
+ },
+ "numL7BytesReceived": {
+ "description": "number of tunneled layer 7 bytes received, including retransmissions",
+ "type": "number"
+ },
+ "numL7BytesTransmitted": {
+ "description": "number of tunneled layer 7 bytes transmitted, excluding retransmissions",
+ "type": "number"
+ },
+ "numLostPackets": {
+ "description": "number of lost packets",
+ "type": "number"
+ },
+ "numOutOfOrderPackets": {
+ "description": "number of out-of-order packets",
+ "type": "number"
+ },
+ "numPacketErrors": {
+ "description": "number of errored packets",
+ "type": "number"
+ },
+ "numPacketsReceivedExclRetrans": {
+ "description": "number of packets received, excluding retransmission",
+ "type": "number"
+ },
+ "numPacketsReceivedInclRetrans": {
+ "description": "number of packets received, including retransmission",
+ "type": "number"
+ },
+ "numPacketsTransmittedInclRetrans": {
+ "description": "number of packets transmitted, including retransmissions",
+ "type": "number"
+ },
+ "numRetries": {
+ "description": "number of packet retries",
+ "type": "number"
+ },
+ "numTimeouts": {
+ "description": "number of packet timeouts",
+ "type": "number"
+ },
+ "numTunneledL7BytesReceived": {
+ "description": "number of tunneled layer 7 bytes received, excluding retransmissions",
+ "type": "number"
+ },
+ "roundTripTime": {
+ "description": "round trip time",
+ "type": "number"
+ },
+ "tcpFlagCountList": {
+ "description": "array of key: value pairs where the keys are drawn from TCP Flags and the values are the count of packets that had that TCP Flag in the flow",
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": [
+ { "type": "string" },
+ { "type": "number" }
+ ]
+ }
+ },
+ "tcpFlagList": {
+ "description": "Array of unique TCP Flags observed in the flow",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "timeToFirstByte": {
+ "description": "Time in milliseconds between the connection activation and first byte received",
+ "type": "number"
+ }
+ },
+ "required": [ "avgBitErrorRate", "avgPacketDelayVariation", "avgPacketLatency",
+ "avgReceiveThroughput", "avgTransmitThroughput",
+ "flowActivationEpoch", "flowActivationMicrosec",
+ "flowDeactivationEpoch", "flowDeactivationMicrosec",
+ "flowDeactivationTime", "flowStatus",
+ "maxPacketDelayVariation", "numActivationFailures",
+ "numBitErrors", "numBytesReceived", "numBytesTransmitted",
+ "numDroppedPackets", "numL7BytesReceived",
+ "numL7BytesTransmitted", "numLostPackets",
+ "numOutOfOrderPackets", "numPacketErrors",
+ "numPacketsReceivedExclRetrans",
+ "numPacketsReceivedInclRetrans",
+ "numPacketsTransmittedInclRetrans",
+ "numRetries", "numTimeouts", "numTunneledL7BytesReceived",
+ "roundTripTime", "timeToFirstByte"
+ ]
+ },
+ "heartbeatFields": {
+ "description": "optional field block for fields specific to heartbeat events",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional heartbeat fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "heartbeatFieldsVersion": {
+ "description": "version of the heartbeatFields block",
+ "type": "number"
+ },
+ "heartbeatInterval": {
+ "description": "current heartbeat interval in seconds",
+ "type": "integer"
+ }
+ },
+ "required": [ "heartbeatFieldsVersion", "heartbeatInterval" ]
+ },
+ "internalHeaderFields": {
+ "description": "enrichment fields for internal VES Event Listener service use only, not supplied by event sources",
+ "type": "object"
+ },
+ "jsonObject": {
+ "description": "json object schema, name and other meta-information along with one or more object instances",
+ "type": "object",
+ "properties": {
+ "objectInstances": {
+ "description": "one or more instances of the jsonObject",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/jsonObjectInstance"
+ }
+ },
+ "objectName": {
+ "description": "name of the JSON Object",
+ "type": "string"
+ },
+ "objectSchema": {
+ "description": "json schema for the object",
+ "type": "string"
+ },
+ "objectSchemaUrl": {
+ "description": "Url to the json schema for the object",
+ "type": "string"
+ },
+ "nfSubscribedObjectName": {
+ "description": "name of the object associated with the nfSubscriptonId",
+ "type": "string"
+ },
+ "nfSubscriptionId": {
+ "description": "identifies an openConfig telemetry subscription on a network function, which configures the network function to send complex object data associated with the jsonObject",
+ "type": "string"
+ }
+ },
+ "required": [ "objectInstances", "objectName" ]
+ },
+ "jsonObjectInstance": {
+ "description": "meta-information about an instance of a jsonObject along with the actual object instance",
+ "type": "object",
+ "properties": {
+ "objectInstance": {
+ "description": "an instance conforming to the jsonObject schema",
+ "type": "object"
+ },
+ "objectInstanceEpochMicrosec": {
+ "description": "the unix time aka epoch time associated with this objectInstance--as microseconds elapsed since 1 Jan 1970 not including leap seconds",
+ "type": "number"
+ },
+ "objectKeys": {
+ "description": "an ordered set of keys that identifies this particular instance of jsonObject",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/key"
+ }
+ }
+ },
+ "required": [ "objectInstance" ]
+ },
+ "key": {
+ "description": "tuple which provides the name of a key along with its value and relative order",
+ "type": "object",
+ "properties": {
+ "keyName": {
+ "description": "name of the key",
+ "type": "string"
+ },
+ "keyOrder": {
+ "description": "relative sequence or order of the key with respect to other keys",
+ "type": "integer"
+ },
+ "keyValue": {
+ "description": "value of the key",
+ "type": "string"
+ }
+ },
+ "required": [ "keyName" ]
+ },
+ "latencyBucketMeasure": {
+ "description": "number of counts falling within a defined latency bucket",
+ "type": "object",
+ "properties": {
+ "countsInTheBucket": { "type": "number" },
+ "highEndOfLatencyBucket": { "type": "number" },
+ "lowEndOfLatencyBucket": { "type": "number" }
+ },
+ "required": [ "countsInTheBucket" ]
+ },
+ "measurementsForVfScalingFields": {
+ "description": "measurementsForVfScaling fields",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional name-value-pair fields",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "additionalMeasurements": {
+ "description": "array of named name-value-pair arrays",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/namedArrayOfFields"
+ }
+ },
+ "additionalObjects": {
+ "description": "array of JSON objects described by name, schema and other meta-information",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/jsonObject"
+ }
+ },
+ "codecUsageArray": {
+ "description": "array of codecs in use",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/codecsInUse"
+ }
+ },
+ "concurrentSessions": {
+ "description": "peak concurrent sessions for the VM or VNF over the measurementInterval",
+ "type": "integer"
+ },
+ "configuredEntities": {
+ "description": "over the measurementInterval, peak total number of: users, subscribers, devices, adjacencies, etc., for the VM, or subscribers, devices, etc., for the VNF",
+ "type": "integer"
+ },
+ "cpuUsageArray": {
+ "description": "usage of an array of CPUs",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/cpuUsage"
+ }
+ },
+ "diskUsageArray": {
+ "description": "usage of an array of disks",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/diskUsage"
+ }
+ },
+ "featureUsageArray": {
+ "description": "array of features in use",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/featuresInUse"
+ }
+ },
+ "filesystemUsageArray": {
+ "description": "filesystem usage of the VM on which the VNFC reporting the event is running",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/filesystemUsage"
+ }
+ },
+ "latencyDistribution": {
+ "description": "array of integers representing counts of requests whose latency in milliseconds falls within per-VNF configured ranges",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/latencyBucketMeasure"
+ }
+ },
+ "meanRequestLatency": {
+ "description": "mean seconds required to respond to each request for the VM on which the VNFC reporting the event is running",
+ "type": "number"
+ },
+ "measurementInterval": {
+ "description": "interval over which measurements are being reported in seconds",
+ "type": "number"
+ },
+ "measurementsForVfScalingVersion": {
+ "description": "version of the measurementsForVfScaling block",
+ "type": "number"
+ },
+ "memoryUsageArray": {
+ "description": "memory usage of an array of VMs",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/memoryUsage"
+ }
+ },
+ "numberOfMediaPortsInUse": {
+ "description": "number of media ports in use",
+ "type": "integer"
+ },
+ "requestRate": {
+ "description": "peak rate of service requests per second to the VNF over the measurementInterval",
+ "type": "number"
+ },
+ "vnfcScalingMetric": {
+ "description": "represents busy-ness of the VNF from 0 to 100 as reported by the VNFC",
+ "type": "integer"
+ },
+ "vNicPerformanceArray": {
+ "description": "usage of an array of virtual network interface cards",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/vNicPerformance"
+ }
+ }
+ },
+ "required": [ "measurementInterval", "measurementsForVfScalingVersion" ]
+ },
+ "memoryUsage": {
+ "description": "memory usage of an identified virtual machine",
+ "type": "object",
+ "properties": {
+ "memoryBuffered": {
+ "description": "kibibytes of temporary storage for raw disk blocks",
+ "type": "number"
+ },
+ "memoryCached": {
+ "description": "kibibytes of memory used for cache",
+ "type": "number"
+ },
+ "memoryConfigured": {
+ "description": "kibibytes of memory configured in the virtual machine on which the VNFC reporting the event is running",
+ "type": "number"
+ },
+ "memoryFree": {
+ "description": "kibibytes of physical RAM left unused by the system",
+ "type": "number"
+ },
+ "memorySlabRecl": {
+ "description": "the part of the slab that can be reclaimed such as caches measured in kibibytes",
+ "type": "number"
+ },
+ "memorySlabUnrecl": {
+ "description": "the part of the slab that cannot be reclaimed even when lacking memory measured in kibibytes",
+ "type": "number"
+ },
+ "memoryUsed": {
+ "description": "total memory minus the sum of free, buffered, cached and slab memory measured in kibibytes",
+ "type": "number"
+ },
+ "vmIdentifier": {
+ "description": "virtual machine identifier associated with the memory metrics",
+ "type": "string"
+ }
+ },
+ "required": [ "memoryFree", "memoryUsed", "vmIdentifier" ]
+ },
+ "mobileFlowFields": {
+ "description": "mobileFlow fields",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional mobileFlow fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "applicationType": {
+ "description": "Application type inferred",
+ "type": "string"
+ },
+ "appProtocolType": {
+ "description": "application protocol",
+ "type": "string"
+ },
+ "appProtocolVersion": {
+ "description": "application protocol version",
+ "type": "string"
+ },
+ "cid": {
+ "description": "cell id",
+ "type": "string"
+ },
+ "connectionType": {
+ "description": "Abbreviation referencing a 3GPP reference point e.g., S1-U, S11, etc",
+ "type": "string"
+ },
+ "ecgi": {
+ "description": "Evolved Cell Global Id",
+ "type": "string"
+ },
+ "flowDirection": {
+ "description": "Flow direction, indicating if the reporting node is the source of the flow or destination for the flow",
+ "type": "string"
+ },
+ "gtpPerFlowMetrics": { "$ref": "#/definitions/gtpPerFlowMetrics" },
+ "gtpProtocolType": {
+ "description": "GTP protocol",
+ "type": "string"
+ },
+ "gtpVersion": {
+ "description": "GTP protocol version",
+ "type": "string"
+ },
+ "httpHeader": {
+ "description": "HTTP request header, if the flow connects to a node referenced by HTTP",
+ "type": "string"
+ },
+ "imei": {
+ "description": "IMEI for the subscriber UE used in this flow, if the flow connects to a mobile device",
+ "type": "string"
+ },
+ "imsi": {
+ "description": "IMSI for the subscriber UE used in this flow, if the flow connects to a mobile device",
+ "type": "string"
+ },
+ "ipProtocolType": {
+ "description": "IP protocol type e.g., TCP, UDP, RTP...",
+ "type": "string"
+ },
+ "ipVersion": {
+ "description": "IP protocol version e.g., IPv4, IPv6",
+ "type": "string"
+ },
+ "lac": {
+ "description": "location area code",
+ "type": "string"
+ },
+ "mcc": {
+ "description": "mobile country code",
+ "type": "string"
+ },
+ "mnc": {
+ "description": "mobile network code",
+ "type": "string"
+ },
+ "mobileFlowFieldsVersion": {
+ "description": "version of the mobileFlowFields block",
+ "type": "number"
+ },
+ "msisdn": {
+ "description": "MSISDN for the subscriber UE used in this flow, as an integer, if the flow connects to a mobile device",
+ "type": "string"
+ },
+ "otherEndpointIpAddress": {
+ "description": "IP address for the other endpoint, as used for the flow being reported on",
+ "type": "string"
+ },
+ "otherEndpointPort": {
+ "description": "IP Port for the reporting entity, as used for the flow being reported on",
+ "type": "integer"
+ },
+ "otherFunctionalRole": {
+ "description": "Functional role of the other endpoint for the flow being reported on e.g., MME, S-GW, P-GW, PCRF...",
+ "type": "string"
+ },
+ "rac": {
+ "description": "routing area code",
+ "type": "string"
+ },
+ "radioAccessTechnology": {
+ "description": "Radio Access Technology e.g., 2G, 3G, LTE",
+ "type": "string"
+ },
+ "reportingEndpointIpAddr": {
+ "description": "IP address for the reporting entity, as used for the flow being reported on",
+ "type": "string"
+ },
+ "reportingEndpointPort": {
+ "description": "IP port for the reporting entity, as used for the flow being reported on",
+ "type": "integer"
+ },
+ "sac": {
+ "description": "service area code",
+ "type": "string"
+ },
+ "samplingAlgorithm": {
+ "description": "Integer identifier for the sampling algorithm or rule being applied in calculating the flow metrics if metrics are calculated based on a sample of packets, or 0 if no sampling is applied",
+ "type": "integer"
+ },
+ "tac": {
+ "description": "transport area code",
+ "type": "string"
+ },
+ "tunnelId": {
+ "description": "tunnel identifier",
+ "type": "string"
+ },
+ "vlanId": {
+ "description": "VLAN identifier used by this flow",
+ "type": "string"
+ }
+ },
+ "required": [ "flowDirection", "gtpPerFlowMetrics", "ipProtocolType", "ipVersion",
+ "mobileFlowFieldsVersion", "otherEndpointIpAddress", "otherEndpointPort",
+ "reportingEndpointIpAddr", "reportingEndpointPort" ]
+ },
+ "namedArrayOfFields": {
+ "description": "an array of name value pairs along with a name for the array",
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "arrayOfFields": {
+ "description": "array of name value pairs",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ }
+ },
+ "required": [ "name", "arrayOfFields" ]
+ },
+ "otherFields": {
+ "description": "fields for events belonging to the 'other' domain of the commonEventHeader domain enumeration",
+ "type": "object",
+ "properties": {
+ "hashOfNameValuePairArrays": {
+ "description": "array of named name-value-pair arrays",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/namedArrayOfFields"
+ }
+ },
+ "jsonObjects": {
+ "description": "array of JSON objects described by name, schema and other meta-information",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/jsonObject"
+ }
+ },
+ "nameValuePairs": {
+ "description": "array of name-value pairs",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "otherFieldsVersion": {
+ "description": "version of the otherFields block",
+ "type": "number"
+ }
+ },
+ "required": [ "otherFieldsVersion" ]
+ },
+ "requestError": {
+ "description": "standard request error data structure",
+ "type": "object",
+ "properties": {
+ "messageId": {
+ "description": "Unique message identifier of the format ABCnnnn where ABC is either SVC for Service Exceptions or POL for Policy Exception",
+ "type": "string"
+ },
+ "text": {
+ "description": "Message text, with replacement variables marked with %n, where n is an index into the list of <variables> elements, starting at 1",
+ "type": "string"
+ },
+ "url": {
+ "description": "Hyperlink to a detailed error resource e.g., an HTML page for browser user agents",
+ "type": "string"
+ },
+ "variables": {
+ "description": "List of zero or more strings that represent the contents of the variables used by the message text",
+ "type": "string"
+ }
+ },
+ "required": [ "messageId", "text" ]
+ },
+ "sipSignalingFields": {
+ "description": "sip signaling fields",
+ "type": "object",
+ "properties": {
+ "additionalInformation": {
+ "description": "additional sip signaling fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "compressedSip": {
+ "description": "the full SIP request/response including headers and bodies",
+ "type": "string"
+ },
+ "correlator": {
+ "description": "this is the same for all events on this call",
+ "type": "string"
+ },
+ "localIpAddress": {
+ "description": "IP address on VNF",
+ "type": "string"
+ },
+ "localPort": {
+ "description": "port on VNF",
+ "type": "string"
+ },
+ "remoteIpAddress": {
+ "description": "IP address of peer endpoint",
+ "type": "string"
+ },
+ "remotePort": {
+ "description": "port of peer endpoint",
+ "type": "string"
+ },
+ "sipSignalingFieldsVersion": {
+ "description": "version of the sipSignalingFields block",
+ "type": "number"
+ },
+ "summarySip": {
+ "description": "the SIP Method or Response (‘INVITE’, ‘200 OK’, ‘BYE’, etc)",
+ "type": "string"
+ },
+ "vendorVnfNameFields": {
+ "$ref": "#/definitions/vendorVnfNameFields"
+ }
+ },
+ "required": [ "correlator", "localIpAddress", "localPort", "remoteIpAddress",
+ "remotePort", "sipSignalingFieldsVersion", "vendorVnfNameFields" ]
+ },
+ "stateChangeFields": {
+ "description": "stateChange fields",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional stateChange fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "newState": {
+ "description": "new state of the entity",
+ "type": "string",
+ "enum": [
+ "inService",
+ "maintenance",
+ "outOfService"
+ ]
+ },
+ "oldState": {
+ "description": "previous state of the entity",
+ "type": "string",
+ "enum": [
+ "inService",
+ "maintenance",
+ "outOfService"
+ ]
+ },
+ "stateChangeFieldsVersion": {
+ "description": "version of the stateChangeFields block",
+ "type": "number"
+ },
+ "stateInterface": {
+ "description": "card or port name of the entity that changed state",
+ "type": "string"
+ }
+ },
+ "required": [ "newState", "oldState", "stateChangeFieldsVersion", "stateInterface" ]
+ },
+ "suppressedNvPairs": {
+ "description": "List of specific NvPairsNames to suppress within a given Name-Value Field for event Throttling",
+ "type": "object",
+ "properties": {
+ "nvPairFieldName": {
+ "description": "Name of the field within which are the nvpair names to suppress",
+ "type": "string"
+ },
+ "suppressedNvPairNames": {
+ "description": "Array of nvpair names to suppress within the nvpairFieldName",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "required": [ "nvPairFieldName", "suppressedNvPairNames" ]
+ },
+ "syslogFields": {
+ "description": "sysLog fields",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional syslog fields if needed provided as name=value delimited by a pipe ‘|’ symbol, for example: 'name1=value1|name2=value2|…'",
+ "type": "string"
+ },
+ "eventSourceHost": {
+ "description": "hostname of the device",
+ "type": "string"
+ },
+ "eventSourceType": {
+ "description": "type of event source; examples: other, router, switch, host, card, port, slotThreshold, portThreshold, virtualMachine, virtualNetworkFunction",
+ "type": "string"
+ },
+ "syslogFacility": {
+ "description": "numeric code from 0 to 23 for facility--see table in documentation",
+ "type": "integer"
+ },
+ "syslogFieldsVersion": {
+ "description": "version of the syslogFields block",
+ "type": "number"
+ },
+ "syslogMsg": {
+ "description": "syslog message",
+ "type": "string"
+ },
+ "syslogPri": {
+ "description": "0-192 combined severity and facility",
+ "type": "integer"
+ },
+ "syslogProc": {
+ "description": "identifies the application that originated the message",
+ "type": "string"
+ },
+ "syslogProcId": {
+ "description": "a change in the value of this field indicates a discontinuity in syslog reporting",
+ "type": "number"
+ },
+ "syslogSData": {
+ "description": "syslog structured data consisting of a structured data Id followed by a set of key value pairs",
+ "type": "string"
+ },
+ "syslogSdId": {
+ "description": "0-32 char in format name@number for example ourSDID@32473",
+ "type": "string"
+ },
+ "syslogSev": {
+ "description": "numerical Code for severity derived from syslogPri as remaider of syslogPri / 8",
+ "type": "string",
+ "enum": [
+ "Alert",
+ "Critical",
+ "Debug",
+ "Emergency",
+ "Error",
+ "Info",
+ "Notice",
+ "Warning"
+ ]
+ },
+ "syslogTag": {
+ "description": "msgId indicating the type of message such as TCPOUT or TCPIN; NILVALUE should be used when no other value can be provided",
+ "type": "string"
+ },
+ "syslogVer": {
+ "description": "IANA assigned version of the syslog protocol specification - typically 1",
+ "type": "number"
+ }
+ },
+ "required": [ "eventSourceType", "syslogFieldsVersion", "syslogMsg", "syslogTag" ]
+ },
+ "thresholdCrossingAlertFields": {
+ "description": "fields specific to threshold crossing alert events",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional threshold crossing alert fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "additionalParameters": {
+ "description": "performance counters",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/counter"
+ }
+ },
+ "alertAction": {
+ "description": "Event action",
+ "type": "string",
+ "enum": [
+ "CLEAR",
+ "CONT",
+ "SET"
+ ]
+ },
+ "alertDescription": {
+ "description": "Unique short alert description such as IF-SHUB-ERRDROP",
+ "type": "string"
+ },
+ "alertType": {
+ "description": "Event type",
+ "type": "string",
+ "enum": [
+ "CARD-ANOMALY",
+ "ELEMENT-ANOMALY",
+ "INTERFACE-ANOMALY",
+ "SERVICE-ANOMALY"
+ ]
+ },
+ "alertValue": {
+ "description": "Calculated API value (if applicable)",
+ "type": "string"
+ },
+ "associatedAlertIdList": {
+ "description": "List of eventIds associated with the event being reported",
+ "type": "array",
+ "items": { "type": "string" }
+ },
+ "collectionTimestamp": {
+ "description": "Time when the performance collector picked up the data; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "dataCollector": {
+ "description": "Specific performance collector instance used",
+ "type": "string"
+ },
+ "elementType": {
+ "description": "type of network element - internal ATT field",
+ "type": "string"
+ },
+ "eventSeverity": {
+ "description": "event severity or priority",
+ "type": "string",
+ "enum": [
+ "CRITICAL",
+ "MAJOR",
+ "MINOR",
+ "WARNING",
+ "NORMAL"
+ ]
+ },
+ "eventStartTimestamp": {
+ "description": "Time closest to when the measurement was made; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "interfaceName": {
+ "description": "Physical or logical port or card (if applicable)",
+ "type": "string"
+ },
+ "networkService": {
+ "description": "network name - internal ATT field",
+ "type": "string"
+ },
+ "possibleRootCause": {
+ "description": "Reserved for future use",
+ "type": "string"
+ },
+ "thresholdCrossingFieldsVersion": {
+ "description": "version of the thresholdCrossingAlertFields block",
+ "type": "number"
+ }
+ },
+ "required": [
+ "additionalParameters",
+ "alertAction",
+ "alertDescription",
+ "alertType",
+ "collectionTimestamp",
+ "eventSeverity",
+ "eventStartTimestamp",
+ "thresholdCrossingFieldsVersion"
+ ]
+ },
+ "vendorVnfNameFields": {
+ "description": "provides vendor, vnf and vfModule identifying information",
+ "type": "object",
+ "properties": {
+ "vendorName": {
+ "description": "VNF vendor name",
+ "type": "string"
+ },
+ "vfModuleName": {
+ "description": "ASDC vfModuleName for the vfModule generating the event",
+ "type": "string"
+ },
+ "vnfName": {
+ "description": "ASDC modelName for the VNF generating the event",
+ "type": "string"
+ }
+ },
+ "required": [ "vendorName" ]
+ },
+ "vNicPerformance": {
+ "description": "describes the performance and errors of an identified virtual network interface card",
+ "type": "object",
+ "properties": {
+ "receivedBroadcastPacketsAccumulated": {
+ "description": "Cumulative count of broadcast packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedBroadcastPacketsDelta": {
+ "description": "Count of broadcast packets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedDiscardedPacketsAccumulated": {
+ "description": "Cumulative count of discarded packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedDiscardedPacketsDelta": {
+ "description": "Count of discarded packets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedErrorPacketsAccumulated": {
+ "description": "Cumulative count of error packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedErrorPacketsDelta": {
+ "description": "Count of error packets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedMulticastPacketsAccumulated": {
+ "description": "Cumulative count of multicast packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedMulticastPacketsDelta": {
+ "description": "Count of multicast packets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedOctetsAccumulated": {
+ "description": "Cumulative count of octets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedOctetsDelta": {
+ "description": "Count of octets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedTotalPacketsAccumulated": {
+ "description": "Cumulative count of all packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedTotalPacketsDelta": {
+ "description": "Count of all packets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedUnicastPacketsAccumulated": {
+ "description": "Cumulative count of unicast packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedUnicastPacketsDelta": {
+ "description": "Count of unicast packets received within the measurement interval",
+ "type": "number"
+ },
+ "transmittedBroadcastPacketsAccumulated": {
+ "description": "Cumulative count of broadcast packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedBroadcastPacketsDelta": {
+ "description": "Count of broadcast packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedDiscardedPacketsAccumulated": {
+ "description": "Cumulative count of discarded packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedDiscardedPacketsDelta": {
+ "description": "Count of discarded packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedErrorPacketsAccumulated": {
+ "description": "Cumulative count of error packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedErrorPacketsDelta": {
+ "description": "Count of error packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedMulticastPacketsAccumulated": {
+ "description": "Cumulative count of multicast packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedMulticastPacketsDelta": {
+ "description": "Count of multicast packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedOctetsAccumulated": {
+ "description": "Cumulative count of octets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedOctetsDelta": {
+ "description": "Count of octets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedTotalPacketsAccumulated": {
+ "description": "Cumulative count of all packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedTotalPacketsDelta": {
+ "description": "Count of all packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedUnicastPacketsAccumulated": {
+ "description": "Cumulative count of unicast packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedUnicastPacketsDelta": {
+ "description": "Count of unicast packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "valuesAreSuspect": {
+ "description": "Indicates whether vNicPerformance values are likely inaccurate due to counter overflow or other condtions",
+ "type": "string",
+ "enum": [ "true", "false" ]
+ },
+ "vNicIdentifier": {
+ "description": "vNic identification",
+ "type": "string"
+ }
+ },
+ "required": [ "valuesAreSuspect", "vNicIdentifier" ]
+ },
+ "voiceQualityFields": {
+ "description": "provides statistics related to customer facing voice products",
+ "type": "object",
+ "properties": {
+ "additionalInformation": {
+ "description": "additional voice quality fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "calleeSideCodec": {
+ "description": "callee codec for the call",
+ "type": "string"
+ },
+ "callerSideCodec": {
+ "description": "caller codec for the call",
+ "type": "string"
+ },
+ "correlator": {
+ "description": "this is the same for all events on this call",
+ "type": "string"
+ },
+ "endOfCallVqmSummaries": {
+ "$ref": "#/definitions/endOfCallVqmSummaries"
+ },
+ "phoneNumber": {
+ "description": "phone number associated with the correlator",
+ "type": "string"
+ },
+ "midCallRtcp": {
+ "description": "Base64 encoding of the binary RTCP data excluding Eth/IP/UDP headers",
+ "type": "string"
+ },
+ "vendorVnfNameFields": {
+ "$ref": "#/definitions/vendorVnfNameFields"
+ },
+ "voiceQualityFieldsVersion": {
+ "description": "version of the voiceQualityFields block",
+ "type": "number"
+ }
+ },
+ "required": [ "calleeSideCodec", "callerSideCodec", "correlator", "midCallRtcp",
+ "vendorVnfNameFields", "voiceQualityFieldsVersion" ]
+ }
+ },
+ "title": "Event Listener",
+ "type": "object",
+ "properties": {
+ "event": {"$ref": "#/definitions/event"}
+ }
+}
diff --git a/tests/dcaegen2/testcases/assets/json_events/dcae_healthcheck.json b/tests/dcaegen2/testcases/assets/json_events/dcae_healthcheck.json
new file mode 100644
index 00000000..d612b082
--- /dev/null
+++ b/tests/dcaegen2/testcases/assets/json_events/dcae_healthcheck.json
@@ -0,0 +1,5 @@
+{
+ "path": "/reports/dcae/service-instances",
+ "start": "-24hour",
+ "end": "now"
+} \ No newline at end of file
diff --git a/tests/dcaegen2/testcases/assets/json_events/ves_pnf_registration_event.json b/tests/dcaegen2/testcases/assets/json_events/ves_pnf_registration_event.json
new file mode 100644
index 00000000..49d77eb1
--- /dev/null
+++ b/tests/dcaegen2/testcases/assets/json_events/ves_pnf_registration_event.json
@@ -0,0 +1,34 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "domain": "other",
+ "eventName": "pnfRegistration_5GDU",
+ "eventId": "QTFCOC540002E-reg",
+ "eventType": "pnfRegistration",
+ "internalHeaderFields": {},
+ "lastEpochMicrosec": 1519837825682,
+ "nfNamingCode": "5GRAN",
+ "nfcNamingCode": "5DU",
+ "priority": "Normal",
+ "reportingEntityName": "5GRAN_DU",
+ "sequence": 0,
+ "sourceId": "QTFCOC540002E",
+ "sourceName": "5GRAN_DU",
+ "startEpochMicrosec": 1519837825682,
+ "version": 3
+ },
+ "otherFields": {
+ "pnfVendorName": "Nokia",
+ "pnfOamIpv4Address": "10.16.123.234",
+ "pnfOamIpv6Address": "<<NONE>>",
+ "pnfFamily": "BBU",
+ "pnfType": "AirScale",
+ "pnfModelNumber": "AJ02",
+ "pnfSerialNumber": "QTFCOC540002E",
+ "pnfSoftwareVersion": "v4.5.0.1",
+ "pnfManufactureDate": 1516406400,
+ "pnfLastServiceDate": 1517206400,
+ "otherFieldsVersion": 1
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/dcaegen2/testcases/assets/json_events/ves_vfirewall_measurement.json b/tests/dcaegen2/testcases/assets/json_events/ves_vfirewall_measurement.json
new file mode 100644
index 00000000..5820fc8b
--- /dev/null
+++ b/tests/dcaegen2/testcases/assets/json_events/ves_vfirewall_measurement.json
@@ -0,0 +1,36 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "reportingEntityName": "VM name will be provided by ECOMP",
+ "startEpochMicrosec": 1506008587564787,
+ "lastEpochMicrosec": 1506008587564787,
+ "eventName": "Measurement_VFirewall_VNicStat",
+ "eventId": "0b2b5790-3673-480a-a4bd-5a00b88e5af6",
+ "sourceName": "Dummy VM name - No Metadata available",
+ "sequence": 18123,
+ "priority": "Normal",
+ "functionalRole": "vFirewall",
+ "domain": "measurementsForVfScaling",
+ "reportingEntityId": "VM UUID will be provided by ECOMP",
+ "sourceId": "Dummy VM UUID - No Metadata available",
+ "version": 1.1
+ },
+ "measurementsForVfScalingFields": {
+ "measurementInterval": 10,
+ "measurementsForVfScalingVersion": 1.1,
+ "vNicUsageArray": [{
+ "multicastPacketsIn": 0,
+ "bytesIn": 3896,
+ "unicastPacketsIn": 0,
+ "multicastPacketsOut": 0,
+ "broadcastPacketsOut": 0,
+ "packetsOut": 28,
+ "bytesOut": 12178,
+ "broadcastPacketsIn": 0,
+ "packetsIn": 58,
+ "unicastPacketsOut": 0,
+ "vNicIdentifier": "eth0"
+ }]
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/dcaegen2/testcases/assets/json_events/ves_volte_fault_eventlist_batch.json b/tests/dcaegen2/testcases/assets/json_events/ves_volte_fault_eventlist_batch.json
new file mode 100644
index 00000000..2d931a96
--- /dev/null
+++ b/tests/dcaegen2/testcases/assets/json_events/ves_volte_fault_eventlist_batch.json
@@ -0,0 +1,62 @@
+{
+ "eventList": [
+ {
+ "commonEventHeader": {
+ "version": 3.0,
+ "domain": "fault",
+ "eventName": "Fault_MobileCallRecording_PilotNumberPoolExhaustion",
+ "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546016",
+ "sequence": 0,
+ "priority": "High",
+ "reportingEntityId": "cc305d54-75b4-431b-adb2-eb6b9e541234",
+ "reportingEntityName": "EricssonOamVf",
+ "sourceId": "de305d54-75b4-431b-adb2-eb6b9e546014",
+ "sourceName": "scfx0001vm002cap001",
+ "nfNamingCode": "scfx",
+ "nfcNamingCode": "ssc",
+ "startEpochMicrosec": 1413378172000000,
+ "lastEpochMicrosec": 1413378172000000
+ },
+ "faultFields": {
+ "faultFieldsVersion": 2.0,
+ "alarmCondition": "PilotNumberPoolExhaustion",
+ "eventSourceType": "other",
+ "specificProblem": "Calls cannot complete - pilot numbers are unavailable",
+ "eventSeverity": "CRITICAL",
+ "vfStatus": "Active",
+ "alarmAdditionalInformation": [
+ {
+ "name": "PilotNumberPoolSize",
+ "value": "1000"
+ }
+ ]
+ }
+ },
+ {
+ "commonEventHeader": {
+ "version": 3.0,
+ "domain": "fault",
+ "eventName": "Fault_MobileCallRecording_RecordingServerUnreachable",
+ "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546025",
+ "sequence": 0,
+ "priority": "High",
+ "reportingEntityId": "cc305d54-75b4-431b-adb2-eb6b9e541234",
+ "reportingEntityName": "EricssonOamVf",
+ "sourceId": "de305d54-75b4-431b-adb2-eb6b9e546014",
+ "sourceName": "scfx0001vm002cap001",
+ "nfNamingCode": "scfx",
+ "nfcNamingCode": "ssc",
+ "startEpochMicrosec": 1413378172000010,
+ "lastEpochMicrosec": 1413378172000010
+ },
+ "faultFields": {
+ "faultFieldsVersion": 2.0,
+ "alarmCondition": "RecordingServerUnreachable",
+ "eventSourceType": "other",
+ "specificProblem": "Recording server unreachable",
+ "eventSeverity": "CRITICAL",
+ "vfStatus": "Active"
+ }
+ }
+ ]
+}
diff --git a/tests/dcaegen2/testcases/assets/json_events/ves_volte_single_fault_event.json b/tests/dcaegen2/testcases/assets/json_events/ves_volte_single_fault_event.json
new file mode 100644
index 00000000..2ccb3f64
--- /dev/null
+++ b/tests/dcaegen2/testcases/assets/json_events/ves_volte_single_fault_event.json
@@ -0,0 +1,34 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "version": 3.0,
+ "domain": "fault",
+ "eventName": "Fault_MobileCallRecording_PilotNumberPoolExhaustion",
+ "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546015",
+ "sequence": 0,
+ "priority": "High",
+ "reportingEntityId": "cc305d54-75b4-431b-adb2-eb6b9e541234",
+ "reportingEntityName": "EricssonOamVf",
+ "sourceId": "de305d54-75b4-431b-adb2-eb6b9e546014",
+ "sourceName": "scfx0001vm002cap001",
+ "nfNamingCode": "scfx",
+ "nfcNamingCode": "ssc",
+ "startEpochMicrosec": 1413378172000000,
+ "lastEpochMicrosec": 1413378172000000
+ },
+ "faultFields": {
+ "faultFieldsVersion": 2.0,
+ "alarmCondition": "PilotNumberPoolExhaustion",
+ "eventSourceType": "other",
+ "specificProblem": "Calls cannot complete - pilot numbers are unavailable",
+ "eventSeverity": "CRITICAL",
+ "vfStatus": "Active",
+ "alarmAdditionalInformation": [
+ {
+ "name": "PilotNumberPoolSize",
+ "value": "1000"
+ }
+ ]
+ }
+ }
+}
diff --git a/tests/dcaegen2/testcases/assets/json_events/ves_volte_single_fault_event_bad.json b/tests/dcaegen2/testcases/assets/json_events/ves_volte_single_fault_event_bad.json
new file mode 100644
index 00000000..b36c27df
--- /dev/null
+++ b/tests/dcaegen2/testcases/assets/json_events/ves_volte_single_fault_event_bad.json
@@ -0,0 +1,34 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "version": 3.0
+ "domain": "fault",
+ "eventName": "Fault_MobileCallRecording_PilotNumberPoolExhaustion",
+ "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546015",
+ "sequence": 0,
+ "priority": "High",
+ "reportingEntityId": "cc305d54-75b4-431b-adb2-eb6b9e541234",
+ "reportingEntityName": "EricssonOamVf",
+ "sourceId": "de305d54-75b4-431b-adb2-eb6b9e546014",
+ "sourceName": "scfx0001vm002cap001",
+ "nfNamingCode": "scfx",
+ "nfcNamingCode": "ssc",
+ "startEpochMicrosec": 1413378172000000,
+ "lastEpochMicrosec": 1413378172000000
+ },
+ "faultFields": {
+ "faultFieldsVersion": 2.0,
+ "alarmCondition": "PilotNumberPoolExhaustion",
+ "eventSourceType": "other",
+ "specificProblem": "Calls cannot complete - pilot numbers are unavailable",
+ "eventSeverity": "CRITICAL",
+ "vfStatus": "Active",
+ "alarmAdditionalInformation": [
+ {
+ "name": "PilotNumberPoolSize",
+ "value": "1000"
+ }
+ ]
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/dcaegen2/testcases/dcae_ves.robot b/tests/dcaegen2/testcases/dcae_ves.robot
new file mode 100644
index 00000000..daed35fa
--- /dev/null
+++ b/tests/dcaegen2/testcases/dcae_ves.robot
@@ -0,0 +1,171 @@
+*** Settings ***
+Documentation Testing DCAE VES Listener with various event feeds from VoLTE, vDNS, vFW and cCPE use scenarios
+Library RequestsLibrary
+Library OperatingSystem
+Library Collections
+Library DcaeLibrary
+Resource resources/dcae_keywords.robot
+Resource ../../common.robot
+Test Setup Cleanup VES Events
+Suite Setup Run keywords VES Collector Suite Setup DMaaP Create sessions Create header
+Suite Teardown VES Collector Suite Shutdown DMaaP
+
+*** Variables ***
+${VESC_URL_HTTPS} https://%{VESC_IP}:8443
+${VESC_URL} http://%{VESC_IP}:8080
+${VES_ANY_EVENT_PATH} /eventListener/v5
+${VES_BATCH_EVENT_PATH} /eventListener/v5/eventBatch
+${VES_THROTTLE_STATE_EVENT_PATH} /eventListener/v5/clientThrottlingState
+${EVENT_DATA_FILE} %{WORKSPACE}/test/csit/tests/dcaegen2/testcases/assets/json_events/ves_volte_single_fault_event.json
+${EVENT_MEASURE_FILE} %{WORKSPACE}/test/csit/tests/dcaegen2/testcases/assets/json_events/ves_vfirewall_measurement.json
+${EVENT_DATA_FILE_BAD} %{WORKSPACE}/test/csit/tests/dcaegen2/testcases/assets/json_events/ves_volte_single_fault_event_bad.json
+${EVENT_BATCH_DATA_FILE} %{WORKSPACE}/test/csit/tests/dcaegen2/testcases/assets/json_events/ves_volte_fault_eventlist_batch.json
+${EVENT_THROTTLING_STATE_DATA_FILE} %{WORKSPACE}/test/csit/tests/dcaegen2/testcases/assets/json_events/ves_volte_fault_provide_throttle_state.json
+${EVENT_PNF_REGISTRATION} %{WORKSPACE}/test/csit/tests/dcaegen2/testcases/assets/json_events/ves_pnf_registration_event.json
+
+#DCAE Health Check
+${CONFIG_BINDING_URL} http://localhost:8443
+${CB_HEALTHCHECK_PATH} /healthcheck
+${CB_SERVICE_COMPONENT_PATH} /service_component/
+${VES_Service_Name1} dcae-controller-ves-collector
+${VES_Service_Name2} ves-collector-not-exist
+
+*** Test Cases ***
+VES Collector Health Check
+ [Tags] DCAE-VESC-R1
+ [Documentation] Ves Collector Health Check
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=*/* X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Get Request ${suite_dcae_vesc_url_session} /healthcheck headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Publish Single VES VoLTE Fault Event
+ [Tags] DCAE-VESC-R1
+ [Documentation] Post single event and expect 200 Response
+ ${evtdata}= Get Data From File ${EVENT_DATA_FILE}
+ ${resp}= Publish Event To VES Collector No Auth ${VES_ANY_EVENT_PATH} ${evtdata}
+ Log Receive HTTP Status code ${resp.status_code}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${isEmpty}= Is Json Empty ${resp}
+ Run Keyword If '${isEmpty}' == False Log ${resp.json()}
+ ${ret}= DMaaP Message Receive ab305d54-85b4-a31b-7db2-fb6b9e546015
+ Should Be Equal As Strings ${ret} true
+
+Publish Single VES VNF Measurement Event
+ [Tags] DCAE-VESC-R1
+ [Documentation] Post single event and expect 200 Response
+ ${evtdata}= Get Data From File ${EVENT_MEASURE_FILE}
+ ${resp}= Publish Event To VES Collector No Auth ${VES_ANY_EVENT_PATH} ${evtdata}
+ Log Receive HTTP Status code ${resp.status_code}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${isEmpty}= Is Json Empty ${resp}
+ Run Keyword If '${isEmpty}' == False Log ${resp.json()}
+ ${ret}= DMaaP Message Receive 0b2b5790-3673-480a-a4bd-5a00b88e5af6
+ Should Be Equal As Strings ${ret} true
+
+Publish VES VoLTE Fault Batch Events
+ [Tags] DCAE-VESC-R1
+ [Documentation] Post batched events and expect 200 Response
+ ${evtdata}= Get Data From File ${EVENT_BATCH_DATA_FILE}
+ ${resp}= Publish Event To VES Collector No Auth ${VES_BATCH_EVENT_PATH} ${evtdata}
+ Should Be Equal As Strings ${resp.status_code} 200
+ #${ret}= DMaaP Message Receive ab305d54-85b4-a31b-7db2-fb6b9e546016
+ ${ret}= DMaaP Message Receive ab305d54-85b4-a31b-7db2-fb6b9e546025
+ Should Be Equal As Strings ${ret} true
+
+Publish Single VES VoLTE Fault Event With Bad Data
+ [Tags] DCAE-VESC-R1
+ [Documentation] Run with JSON Envent with missing comma to expect 400 response
+ ${evtdata}= Get Data From File ${EVENT_DATA_FILE_BAD}
+ Log Send HTTP Request with invalid Json Event Data
+ ${resp}= Publish Event To VES Collector No Auth ${VES_ANY_EVENT_PATH} ${evtdata}
+ Log Receive HTTP Status code ${resp.status_code}
+ Should Be Equal As Strings ${resp.status_code} 400
+ ${isEmpty}= Is Json Empty ${resp}
+ Run Keyword If '${isEmpty}' == False Log ${resp.json()}
+
+Publish VES Event With Invalid Method
+ [Tags] DCAE-VESC-R1
+ [Documentation] Use invalid Put instead of Post method to expect 405 response
+ ${evtdata}= Get Data From File ${EVENT_DATA_FILE}
+ Log Send HTTP Request with invalid method Put instead of Post
+ ${resp}= Publish Event To VES Collector With Put Method No Auth ${VES_ANY_EVENT_PATH} ${evtdata}
+ Log Receive HTTP Status code ${resp.status_code}
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Publish VES Event With Invalid URL Path
+ [Tags] DCAE-VESC-R1
+ [Documentation] Use invalid url path to expect 404 response
+ ${evtdata}= Get Data From File ${EVENT_DATA_FILE}
+ Log Send HTTP Request with invalid /listener/v5/ instead of /eventListener/v5 path
+ ${resp}= Publish Event To VES Collector No Auth /listener/v5/ ${evtdata}
+ Log Receive HTTP Status code ${resp.status_code}
+ Should Be Equal As Strings ${resp.status_code} 404
+
+#Enable VESC HTTPS And Basic Auth
+ #[Tags] DCAE-VESC-R1
+ #[Documentation] Enable VESC Https and Authentication, Disable Http and Run Health Check
+ #Enable VESC Https Auth
+ #
+ #${auth}= Create List ${VESC_HTTPS_USER} ${VESC_HTTPS_PD}
+ #${session}= Create Session dcaegen2-r1 ${VESC_URL_HTTPS} auth=${auth} disable_warnings=1
+ #${headers}= Create Dictionary Accept=*/* X-FromAppId=${GLOBAL_APPLICATION_ID}
+ #${resp}= Get Request dcaegen2-r1 /healthcheck headers=${headers}
+ #Should Be Equal As Strings ${resp.status_code} 200
+
+Publish Single VES Fault Event Over HTTPS
+ [Tags] DCAE-VESC-R1
+ [Documentation] Post single event and expect 200 Response
+ ${evtdata}= Get Data From File ${EVENT_DATA_FILE}
+ Log Login User=${VESC_HTTPS_USER}, Pd=${VESC_HTTPS_PD}
+ ${resp}= Publish Event To VES Collector ${VES_ANY_EVENT_PATH} ${evtdata}
+ Log Receive HTTP Status code ${resp.status_code}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${isEmpty}= Is Json Empty ${resp}
+ Run Keyword If '${isEmpty}' == False Log ${resp.json()}
+ ${ret}= DMaaP Message Receive ab305d54-85b4-a31b-7db2-fb6b9e546015
+ Should Be Equal As Strings ${ret} true
+
+Publish Single VES Measurement Event Over HTTPS
+ [Tags] DCAE-VESC-R1
+ [Documentation] Post single event and expect 200 Response
+ ${evtdata}= Get Data From File ${EVENT_MEASURE_FILE}
+ ${resp}= Publish Event To VES Collector ${VES_ANY_EVENT_PATH} ${evtdata}
+ Log Receive HTTP Status code ${resp.status_code}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${isEmpty}= Is Json Empty ${resp}
+ Run Keyword If '${isEmpty}' == False Log ${resp.json()}
+ ${ret}= DMaaP Message Receive 0b2b5790-3673-480a-a4bd-5a00b88e5af6
+ Should Be Equal As Strings ${ret} true
+
+Publish VES Fault Batch Events Over HTTPS
+ [Tags] DCAE-VESC-R1
+ [Documentation] Post batched events and expect 202 Response
+ ${evtdata}= Get Data From File ${EVENT_BATCH_DATA_FILE}
+ ${resp}= Publish Event To VES Collector ${VES_BATCH_EVENT_PATH} ${evtdata}
+ Should Be Equal As Strings ${resp.status_code} 200
+ #${ret}= DMaaP Message Receive ab305d54-85b4-a31b-7db2-fb6b9e546016
+ ${ret}= DMaaP Message Receive ab305d54-85b4-a31b-7db2-fb6b9e546025
+ Should Be Equal As Strings ${ret} true
+
+Publish VES Event With Invalid URL Path HTTPS
+ [Tags] DCAE-VESC-R1
+ [Documentation] Use invalid url path to expect 404 response
+ ${evtdata}= Get Data From File ${EVENT_DATA_FILE}
+ Log Send HTTP Request with invalid /eventlistener/v5/ instead of /eventListener/v5 path
+ ${resp}= Publish Event To VES Collector /eventlistener/v5 ${evtdata}
+ Log Receive HTTP Status code ${resp.status_code}
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Publish PNF Registration Event
+ [Tags] DCAE-VESC-R1
+ [Documentation] Post PNF registration event and expect 200 Response
+ ${evtdata}= Get Data From File ${EVENT_PNF_REGISTRATION}
+ ${resp}= Publish Event To VES Collector No Auth ${VES_ANY_EVENT_PATH} ${evtdata}
+ Log Receive HTTP Status code ${resp.status_code}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${isEmpty}= Is Json Empty ${resp}
+ Run Keyword If '${isEmpty}' == False Log ${resp.json()}
+ ${ret}= DMaaP Message Receive QTFCOC540002E-reg
+ Should Be Equal As Strings ${ret} true
+ \ No newline at end of file
diff --git a/tests/dcaegen2/testcases/resources/CommonEventFormat_28.3.json b/tests/dcaegen2/testcases/resources/CommonEventFormat_28.3.json
new file mode 100644
index 00000000..90f6d81a
--- /dev/null
+++ b/tests/dcaegen2/testcases/resources/CommonEventFormat_28.3.json
@@ -0,0 +1,1866 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+
+ "definitions": {
+ "attCopyrightNotice": {
+ "description": "Copyright (c) <2017>, AT&T Intellectual Property. All rights reserved. Licensed under the Apache License, Version 2.0 (the License)",
+ "type": "object",
+ "properties": {
+ "useAndRedistribution": {
+ "description": "You may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0",
+ "type": "string"
+ },
+ "licenseLink": {
+ "description": "http://www.apache.org/licenses/LICENSE-2.0",
+ "type":"string"
+ },
+ "condition1": {
+ "description": "Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an AS IS BASIS,",
+ "type": "string"
+ },
+ "condition2": {
+ "description": "Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.",
+ "type": "string"
+ },
+ "condition3": {
+ "description": "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.",
+ "type": "string"
+ },
+ "condition4": {
+ "description": "See the License for the specific language governing permissions and limitations under the License.",
+ "type": "string"
+ },
+ "Trademarks": {
+ "description": "ECOMP and OpenECOMP are trademarks and service marks of AT&T Intellectual Property.",
+ "type": "string"
+ }
+ }
+ },
+
+ "codecsInUse": {
+ "description": "number of times an identified codec was used over the measurementInterval",
+ "type": "object",
+ "properties": {
+ "codecIdentifier": { "type": "string" },
+ "numberInUse": { "type": "integer" }
+ },
+ "required": [ "codecIdentifier", "numberInUse" ]
+ },
+ "command": {
+ "description": "command from an event collector toward an event source",
+ "type": "object",
+ "properties": {
+ "commandType": {
+ "type": "string",
+ "enum": [
+ "heartbeatIntervalChange",
+ "measurementIntervalChange",
+ "provideThrottlingState",
+ "throttlingSpecification"
+ ]
+ },
+ "eventDomainThrottleSpecification": { "$ref": "#/definitions/eventDomainThrottleSpecification" },
+ "heartbeatInterval": { "type": "integer" },
+ "measurementInterval": { "type": "integer" }
+ },
+ "required": [ "commandType" ]
+ },
+ "commandList": {
+ "description": "array of commands from an event collector toward an event source",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/command"
+ },
+ "minItems": 0
+ },
+ "commonEventHeader": {
+ "description": "fields common to all events",
+ "type": "object",
+ "properties": {
+ "domain": {
+ "description": "the eventing domain associated with the event",
+ "type": "string",
+ "enum": [
+ "fault",
+ "heartbeat",
+ "measurementsForVfScaling",
+ "mobileFlow",
+ "other",
+ "sipSignaling",
+ "stateChange",
+ "syslog",
+ "thresholdCrossingAlert",
+ "voiceQuality"
+ ]
+ },
+ "eventId": {
+ "description": "event key that is unique to the event source",
+ "type": "string"
+ },
+ "eventName": {
+ "description": "unique event name",
+ "type": "string"
+ },
+ "eventType": {
+ "description": "for example - applicationVnf, guestOS, hostOS, platform",
+ "type": "string"
+ },
+ "internalHeaderFields": { "$ref": "#/definitions/internalHeaderFields" },
+ "lastEpochMicrosec": {
+ "description": "the latest unix time aka epoch time associated with the event from any component--as microseconds elapsed since 1 Jan 1970 not including leap seconds",
+ "type": "number"
+ },
+ "nfcNamingCode": {
+ "description": "3 character network function component type, aligned with vfc naming standards",
+ "type": "string"
+ },
+ "nfNamingCode": {
+ "description": "4 character network function type, aligned with vnf naming standards",
+ "type": "string"
+ },
+ "priority": {
+ "description": "processing priority",
+ "type": "string",
+ "enum": [
+ "High",
+ "Medium",
+ "Normal",
+ "Low"
+ ]
+ },
+ "reportingEntityId": {
+ "description": "UUID identifying the entity reporting the event, for example an OAM VM; must be populated by the ATT enrichment process",
+ "type": "string"
+ },
+ "reportingEntityName": {
+ "description": "name of the entity reporting the event, for example, an EMS name; may be the same as sourceName",
+ "type": "string"
+ },
+ "sequence": {
+ "description": "ordering of events communicated by an event source instance or 0 if not needed",
+ "type": "integer"
+ },
+ "sourceId": {
+ "description": "UUID identifying the entity experiencing the event issue; must be populated by the ATT enrichment process",
+ "type": "string"
+ },
+ "sourceName": {
+ "description": "name of the entity experiencing the event issue",
+ "type": "string"
+ },
+ "startEpochMicrosec": {
+ "description": "the earliest unix time aka epoch time associated with the event from any component--as microseconds elapsed since 1 Jan 1970 not including leap seconds",
+ "type": "number"
+ },
+ "version": {
+ "description": "version of the event header",
+ "type": "number"
+ }
+ },
+ "required": [ "domain", "eventId", "eventName", "lastEpochMicrosec",
+ "priority", "reportingEntityName", "sequence", "sourceName",
+ "startEpochMicrosec", "version" ]
+ },
+ "counter": {
+ "description": "performance counter",
+ "type": "object",
+ "properties": {
+ "criticality": { "type": "string", "enum": [ "CRIT", "MAJ" ] },
+ "name": { "type": "string" },
+ "thresholdCrossed": { "type": "string" },
+ "value": { "type": "string"}
+ },
+ "required": [ "criticality", "name", "thresholdCrossed", "value" ]
+ },
+ "cpuUsage": {
+ "description": "usage of an identified CPU",
+ "type": "object",
+ "properties": {
+ "cpuIdentifier": {
+ "description": "cpu identifer",
+ "type": "string"
+ },
+ "cpuIdle": {
+ "description": "percentage of CPU time spent in the idle task",
+ "type": "number"
+ },
+ "cpuUsageInterrupt": {
+ "description": "percentage of time spent servicing interrupts",
+ "type": "number"
+ },
+ "cpuUsageNice": {
+ "description": "percentage of time spent running user space processes that have been niced",
+ "type": "number"
+ },
+ "cpuUsageSoftIrq": {
+ "description": "percentage of time spent handling soft irq interrupts",
+ "type": "number"
+ },
+ "cpuUsageSteal": {
+ "description": "percentage of time spent in involuntary wait which is neither user, system or idle time and is effectively time that went missing",
+ "type": "number"
+ },
+ "cpuUsageSystem": {
+ "description": "percentage of time spent on system tasks running the kernel",
+ "type": "number"
+ },
+ "cpuUsageUser": {
+ "description": "percentage of time spent running un-niced user space processes",
+ "type": "number"
+ },
+ "cpuWait": {
+ "description": "percentage of CPU time spent waiting for I/O operations to complete",
+ "type": "number"
+ },
+ "percentUsage": {
+ "description": "aggregate cpu usage of the virtual machine on which the VNFC reporting the event is running",
+ "type": "number"
+ }
+ },
+ "required": [ "cpuIdentifier", "percentUsage" ]
+ },
+ "diskUsage": {
+ "description": "usage of an identified disk",
+ "type": "object",
+ "properties": {
+ "diskIdentifier": {
+ "description": "disk identifier",
+ "type": "string"
+ },
+ "diskIoTimeAvg": {
+ "description": "milliseconds spent doing input/output operations over 1 sec; treat this metric as a device load percentage where 1000ms matches 100% load; provide the average over the measurement interval",
+ "type": "number"
+ },
+ "diskIoTimeLast": {
+ "description": "milliseconds spent doing input/output operations over 1 sec; treat this metric as a device load percentage where 1000ms matches 100% load; provide the last value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskIoTimeMax": {
+ "description": "milliseconds spent doing input/output operations over 1 sec; treat this metric as a device load percentage where 1000ms matches 100% load; provide the maximum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskIoTimeMin": {
+ "description": "milliseconds spent doing input/output operations over 1 sec; treat this metric as a device load percentage where 1000ms matches 100% load; provide the minimum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedReadAvg": {
+ "description": "number of logical read operations that were merged into physical read operations, e.g., two logical reads were served by one physical disk access; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedReadLast": {
+ "description": "number of logical read operations that were merged into physical read operations, e.g., two logical reads were served by one physical disk access; provide the last value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedReadMax": {
+ "description": "number of logical read operations that were merged into physical read operations, e.g., two logical reads were served by one physical disk access; provide the maximum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedReadMin": {
+ "description": "number of logical read operations that were merged into physical read operations, e.g., two logical reads were served by one physical disk access; provide the minimum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedWriteAvg": {
+ "description": "number of logical write operations that were merged into physical write operations, e.g., two logical writes were served by one physical disk access; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedWriteLast": {
+ "description": "number of logical write operations that were merged into physical write operations, e.g., two logical writes were served by one physical disk access; provide the last value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedWriteMax": {
+ "description": "number of logical write operations that were merged into physical write operations, e.g., two logical writes were served by one physical disk access; provide the maximum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedWriteMin": {
+ "description": "number of logical write operations that were merged into physical write operations, e.g., two logical writes were served by one physical disk access; provide the minimum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsReadAvg": {
+ "description": "number of octets per second read from a disk or partition; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsReadLast": {
+ "description": "number of octets per second read from a disk or partition; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsReadMax": {
+ "description": "number of octets per second read from a disk or partition; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsReadMin": {
+ "description": "number of octets per second read from a disk or partition; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsWriteAvg": {
+ "description": "number of octets per second written to a disk or partition; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsWriteLast": {
+ "description": "number of octets per second written to a disk or partition; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsWriteMax": {
+ "description": "number of octets per second written to a disk or partition; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsWriteMin": {
+ "description": "number of octets per second written to a disk or partition; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsReadAvg": {
+ "description": "number of read operations per second issued to the disk; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsReadLast": {
+ "description": "number of read operations per second issued to the disk; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsReadMax": {
+ "description": "number of read operations per second issued to the disk; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsReadMin": {
+ "description": "number of read operations per second issued to the disk; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsWriteAvg": {
+ "description": "number of write operations per second issued to the disk; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsWriteLast": {
+ "description": "number of write operations per second issued to the disk; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsWriteMax": {
+ "description": "number of write operations per second issued to the disk; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsWriteMin": {
+ "description": "number of write operations per second issued to the disk; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskPendingOperationsAvg": {
+ "description": "queue size of pending I/O operations per second; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskPendingOperationsLast": {
+ "description": "queue size of pending I/O operations per second; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskPendingOperationsMax": {
+ "description": "queue size of pending I/O operations per second; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskPendingOperationsMin": {
+ "description": "queue size of pending I/O operations per second; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeReadAvg": {
+ "description": "milliseconds a read operation took to complete; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeReadLast": {
+ "description": "milliseconds a read operation took to complete; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeReadMax": {
+ "description": "milliseconds a read operation took to complete; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeReadMin": {
+ "description": "milliseconds a read operation took to complete; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeWriteAvg": {
+ "description": "milliseconds a write operation took to complete; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeWriteLast": {
+ "description": "milliseconds a write operation took to complete; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeWriteMax": {
+ "description": "milliseconds a write operation took to complete; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeWriteMin": {
+ "description": "milliseconds a write operation took to complete; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ }
+ },
+ "required": [ "diskIdentifier" ]
+ },
+ "endOfCallVqmSummaries": {
+ "description": "provides end of call voice quality metrics",
+ "type": "object",
+ "properties": {
+ "adjacencyName": {
+ "description": " adjacency name",
+ "type": "string"
+ },
+ "endpointDescription": {
+ "description": "Either Caller or Callee",
+ "type": "string",
+ "enum": ["Caller", "Callee"]
+ },
+ "endpointJitter": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpOctetsDiscarded": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpOctetsReceived": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpOctetsSent": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpPacketsDiscarded": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpPacketsReceived": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpPacketsSent": {
+ "description": "",
+ "type": "number"
+ },
+ "localJitter": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpOctetsDiscarded": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpOctetsReceived": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpOctetsSent": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpPacketsDiscarded": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpPacketsReceived": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpPacketsSent": {
+ "description": "",
+ "type": "number"
+ },
+ "mosCqe": {
+ "description": "1-5 1dp",
+ "type": "number"
+ },
+ "packetsLost": {
+ "description": "",
+ "type": "number"
+ },
+ "packetLossPercent": {
+ "description" : "Calculated percentage packet loss based on Endpoint RTP packets lost (as reported in RTCP) and Local RTP packets sent. Direction is based on Endpoint description (Caller, Callee). Decimal (2 dp)",
+ "type": "number"
+ },
+ "rFactor": {
+ "description": "0-100",
+ "type": "number"
+ },
+ "roundTripDelay": {
+ "description": "millisecs",
+ "type": "number"
+ }
+ },
+ "required": [ "adjacencyName", "endpointDescription" ]
+ },
+ "event": {
+ "description": "the root level of the common event format",
+ "type": "object",
+ "properties": {
+ "commonEventHeader": { "$ref": "#/definitions/commonEventHeader" },
+ "faultFields": { "$ref": "#/definitions/faultFields" },
+ "heartbeatFields": { "$ref": "#/definitions/heartbeatFields" },
+ "measurementsForVfScalingFields": { "$ref": "#/definitions/measurementsForVfScalingFields" },
+ "mobileFlowFields": { "$ref": "#/definitions/mobileFlowFields" },
+ "otherFields": { "$ref": "#/definitions/otherFields" },
+ "sipSignalingFields": { "$ref": "#/definitions/sipSignalingFields" },
+ "stateChangeFields": { "$ref": "#/definitions/stateChangeFields" },
+ "syslogFields": { "$ref": "#/definitions/syslogFields" },
+ "thresholdCrossingAlertFields": { "$ref": "#/definitions/thresholdCrossingAlertFields" },
+ "voiceQualityFields": { "$ref": "#/definitions/voiceQualityFields" }
+ },
+ "required": [ "commonEventHeader" ]
+ },
+ "eventDomainThrottleSpecification": {
+ "description": "specification of what information to suppress within an event domain",
+ "type": "object",
+ "properties": {
+ "eventDomain": {
+ "description": "Event domain enum from the commonEventHeader domain field",
+ "type": "string"
+ },
+ "suppressedFieldNames": {
+ "description": "List of optional field names in the event block that should not be sent to the Event Listener",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "suppressedNvPairsList": {
+ "description": "Optional list of specific NvPairsNames to suppress within a given Name-Value Field",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/suppressedNvPairs"
+ }
+ }
+ },
+ "required": [ "eventDomain" ]
+ },
+ "eventDomainThrottleSpecificationList": {
+ "description": "array of eventDomainThrottleSpecifications",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/eventDomainThrottleSpecification"
+ },
+ "minItems": 0
+ },
+ "eventList": {
+ "description": "array of events",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/event"
+ }
+ },
+ "eventThrottlingState": {
+ "description": "reports the throttling in force at the event source",
+ "type": "object",
+ "properties": {
+ "eventThrottlingMode": {
+ "description": "Mode the event manager is in",
+ "type": "string",
+ "enum": [
+ "normal",
+ "throttled"
+ ]
+ },
+ "eventDomainThrottleSpecificationList": { "$ref": "#/definitions/eventDomainThrottleSpecificationList" }
+ },
+ "required": [ "eventThrottlingMode" ]
+ },
+ "faultFields": {
+ "description": "fields specific to fault events",
+ "type": "object",
+ "properties": {
+ "alarmAdditionalInformation": {
+ "description": "additional alarm information",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "alarmCondition": {
+ "description": "alarm condition reported by the device",
+ "type": "string"
+ },
+ "alarmInterfaceA": {
+ "description": "card, port, channel or interface name of the device generating the alarm",
+ "type": "string"
+ },
+ "eventCategory": {
+ "description": "Event category, for example: license, link, routing, security, signaling",
+ "type": "string"
+ },
+ "eventSeverity": {
+ "description": "event severity",
+ "type": "string",
+ "enum": [
+ "CRITICAL",
+ "MAJOR",
+ "MINOR",
+ "WARNING",
+ "NORMAL"
+ ]
+ },
+ "eventSourceType": {
+ "description": "type of event source; examples: card, host, other, port, portThreshold, router, slotThreshold, switch, virtualMachine, virtualNetworkFunction",
+ "type": "string"
+ },
+ "faultFieldsVersion": {
+ "description": "version of the faultFields block",
+ "type": "number"
+ },
+ "specificProblem": {
+ "description": "short description of the alarm or problem",
+ "type": "string"
+ },
+ "vfStatus": {
+ "description": "virtual function status enumeration",
+ "type": "string",
+ "enum": [
+ "Active",
+ "Idle",
+ "Preparing to terminate",
+ "Ready to terminate",
+ "Requesting termination"
+ ]
+ }
+ },
+ "required": [ "alarmCondition", "eventSeverity", "eventSourceType",
+ "faultFieldsVersion", "specificProblem", "vfStatus" ]
+ },
+ "featuresInUse": {
+ "description": "number of times an identified feature was used over the measurementInterval",
+ "type": "object",
+ "properties": {
+ "featureIdentifier": { "type": "string" },
+ "featureUtilization": { "type": "integer" }
+ },
+ "required": [ "featureIdentifier", "featureUtilization" ]
+ },
+ "field": {
+ "description": "name value pair",
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "value": { "type": "string" }
+ },
+ "required": [ "name", "value" ]
+ },
+ "filesystemUsage": {
+ "description": "disk usage of an identified virtual machine in gigabytes and/or gigabytes per second",
+ "type": "object",
+ "properties": {
+ "blockConfigured": { "type": "number" },
+ "blockIops": { "type": "number" },
+ "blockUsed": { "type": "number" },
+ "ephemeralConfigured": { "type": "number" },
+ "ephemeralIops": { "type": "number" },
+ "ephemeralUsed": { "type": "number" },
+ "filesystemName": { "type": "string" }
+ },
+ "required": [ "blockConfigured", "blockIops", "blockUsed", "ephemeralConfigured",
+ "ephemeralIops", "ephemeralUsed", "filesystemName" ]
+ },
+ "gtpPerFlowMetrics": {
+ "description": "Mobility GTP Protocol per flow metrics",
+ "type": "object",
+ "properties": {
+ "avgBitErrorRate": {
+ "description": "average bit error rate",
+ "type": "number"
+ },
+ "avgPacketDelayVariation": {
+ "description": "Average packet delay variation or jitter in milliseconds for received packets: Average difference between the packet timestamp and time received for all pairs of consecutive packets",
+ "type": "number"
+ },
+ "avgPacketLatency": {
+ "description": "average delivery latency",
+ "type": "number"
+ },
+ "avgReceiveThroughput": {
+ "description": "average receive throughput",
+ "type": "number"
+ },
+ "avgTransmitThroughput": {
+ "description": "average transmit throughput",
+ "type": "number"
+ },
+ "durConnectionFailedStatus": {
+ "description": "duration of failed state in milliseconds, computed as the cumulative time between a failed echo request and the next following successful error request, over this reporting interval",
+ "type": "number"
+ },
+ "durTunnelFailedStatus": {
+ "description": "Duration of errored state, computed as the cumulative time between a tunnel error indicator and the next following non-errored indicator, over this reporting interval",
+ "type": "number"
+ },
+ "flowActivatedBy": {
+ "description": "Endpoint activating the flow",
+ "type": "string"
+ },
+ "flowActivationEpoch": {
+ "description": "Time the connection is activated in the flow (connection) being reported on, or transmission time of the first packet if activation time is not available",
+ "type": "number"
+ },
+ "flowActivationMicrosec": {
+ "description": "Integer microseconds for the start of the flow connection",
+ "type": "number"
+ },
+ "flowActivationTime": {
+ "description": "time the connection is activated in the flow being reported on, or transmission time of the first packet if activation time is not available; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "flowDeactivatedBy": {
+ "description": "Endpoint deactivating the flow",
+ "type": "string"
+ },
+ "flowDeactivationEpoch": {
+ "description": "Time for the start of the flow connection, in integer UTC epoch time aka UNIX time",
+ "type": "number"
+ },
+ "flowDeactivationMicrosec": {
+ "description": "Integer microseconds for the start of the flow connection",
+ "type": "number"
+ },
+ "flowDeactivationTime": {
+ "description": "Transmission time of the first packet in the flow connection being reported on; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "flowStatus": {
+ "description": "connection status at reporting time as a working / inactive / failed indicator value",
+ "type": "string"
+ },
+ "gtpConnectionStatus": {
+ "description": "Current connection state at reporting time",
+ "type": "string"
+ },
+ "gtpTunnelStatus": {
+ "description": "Current tunnel state at reporting time",
+ "type": "string"
+ },
+ "ipTosCountList": {
+ "description": "array of key: value pairs where the keys are drawn from the IP Type-of-Service identifiers which range from '0' to '255', and the values are the count of packets that had those ToS identifiers in the flow",
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": [
+ { "type": "string" },
+ { "type": "number" }
+ ]
+ }
+ },
+ "ipTosList": {
+ "description": "Array of unique IP Type-of-Service values observed in the flow where values range from '0' to '255'",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "largePacketRtt": {
+ "description": "large packet round trip time",
+ "type": "number"
+ },
+ "largePacketThreshold": {
+ "description": "large packet threshold being applied",
+ "type": "number"
+ },
+ "maxPacketDelayVariation": {
+ "description": "Maximum packet delay variation or jitter in milliseconds for received packets: Maximum of the difference between the packet timestamp and time received for all pairs of consecutive packets",
+ "type": "number"
+ },
+ "maxReceiveBitRate": {
+ "description": "maximum receive bit rate",
+ "type": "number"
+ },
+ "maxTransmitBitRate": {
+ "description": "maximum transmit bit rate",
+ "type": "number"
+ },
+ "mobileQciCosCountList": {
+ "description": "array of key: value pairs where the keys are drawn from LTE QCI or UMTS class of service strings, and the values are the count of packets that had those strings in the flow",
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": [
+ { "type": "string" },
+ { "type": "number" }
+ ]
+ }
+ },
+ "mobileQciCosList": {
+ "description": "Array of unique LTE QCI or UMTS class-of-service values observed in the flow",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "numActivationFailures": {
+ "description": "Number of failed activation requests, as observed by the reporting node",
+ "type": "number"
+ },
+ "numBitErrors": {
+ "description": "number of errored bits",
+ "type": "number"
+ },
+ "numBytesReceived": {
+ "description": "number of bytes received, including retransmissions",
+ "type": "number"
+ },
+ "numBytesTransmitted": {
+ "description": "number of bytes transmitted, including retransmissions",
+ "type": "number"
+ },
+ "numDroppedPackets": {
+ "description": "number of received packets dropped due to errors per virtual interface",
+ "type": "number"
+ },
+ "numGtpEchoFailures": {
+ "description": "Number of Echo request path failures where failed paths are defined in 3GPP TS 29.281 sec 7.2.1 and 3GPP TS 29.060 sec. 11.2",
+ "type": "number"
+ },
+ "numGtpTunnelErrors": {
+ "description": "Number of tunnel error indications where errors are defined in 3GPP TS 29.281 sec 7.3.1 and 3GPP TS 29.060 sec. 11.1",
+ "type": "number"
+ },
+ "numHttpErrors": {
+ "description": "Http error count",
+ "type": "number"
+ },
+ "numL7BytesReceived": {
+ "description": "number of tunneled layer 7 bytes received, including retransmissions",
+ "type": "number"
+ },
+ "numL7BytesTransmitted": {
+ "description": "number of tunneled layer 7 bytes transmitted, excluding retransmissions",
+ "type": "number"
+ },
+ "numLostPackets": {
+ "description": "number of lost packets",
+ "type": "number"
+ },
+ "numOutOfOrderPackets": {
+ "description": "number of out-of-order packets",
+ "type": "number"
+ },
+ "numPacketErrors": {
+ "description": "number of errored packets",
+ "type": "number"
+ },
+ "numPacketsReceivedExclRetrans": {
+ "description": "number of packets received, excluding retransmission",
+ "type": "number"
+ },
+ "numPacketsReceivedInclRetrans": {
+ "description": "number of packets received, including retransmission",
+ "type": "number"
+ },
+ "numPacketsTransmittedInclRetrans": {
+ "description": "number of packets transmitted, including retransmissions",
+ "type": "number"
+ },
+ "numRetries": {
+ "description": "number of packet retries",
+ "type": "number"
+ },
+ "numTimeouts": {
+ "description": "number of packet timeouts",
+ "type": "number"
+ },
+ "numTunneledL7BytesReceived": {
+ "description": "number of tunneled layer 7 bytes received, excluding retransmissions",
+ "type": "number"
+ },
+ "roundTripTime": {
+ "description": "round trip time",
+ "type": "number"
+ },
+ "tcpFlagCountList": {
+ "description": "array of key: value pairs where the keys are drawn from TCP Flags and the values are the count of packets that had that TCP Flag in the flow",
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": [
+ { "type": "string" },
+ { "type": "number" }
+ ]
+ }
+ },
+ "tcpFlagList": {
+ "description": "Array of unique TCP Flags observed in the flow",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "timeToFirstByte": {
+ "description": "Time in milliseconds between the connection activation and first byte received",
+ "type": "number"
+ }
+ },
+ "required": [ "avgBitErrorRate", "avgPacketDelayVariation", "avgPacketLatency",
+ "avgReceiveThroughput", "avgTransmitThroughput",
+ "flowActivationEpoch", "flowActivationMicrosec",
+ "flowDeactivationEpoch", "flowDeactivationMicrosec",
+ "flowDeactivationTime", "flowStatus",
+ "maxPacketDelayVariation", "numActivationFailures",
+ "numBitErrors", "numBytesReceived", "numBytesTransmitted",
+ "numDroppedPackets", "numL7BytesReceived",
+ "numL7BytesTransmitted", "numLostPackets",
+ "numOutOfOrderPackets", "numPacketErrors",
+ "numPacketsReceivedExclRetrans",
+ "numPacketsReceivedInclRetrans",
+ "numPacketsTransmittedInclRetrans",
+ "numRetries", "numTimeouts", "numTunneledL7BytesReceived",
+ "roundTripTime", "timeToFirstByte"
+ ]
+ },
+ "heartbeatFields": {
+ "description": "optional field block for fields specific to heartbeat events",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional heartbeat fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "heartbeatFieldsVersion": {
+ "description": "version of the heartbeatFields block",
+ "type": "number"
+ },
+ "heartbeatInterval": {
+ "description": "current heartbeat interval in seconds",
+ "type": "integer"
+ }
+ },
+ "required": [ "heartbeatFieldsVersion", "heartbeatInterval" ]
+ },
+ "internalHeaderFields": {
+ "description": "enrichment fields for internal VES Event Listener service use only, not supplied by event sources",
+ "type": "object"
+ },
+ "jsonObject": {
+ "description": "json object schema, name and other meta-information along with one or more object instances",
+ "type": "object",
+ "properties": {
+ "objectInstances": {
+ "description": "one or more instances of the jsonObject",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/jsonObjectInstance"
+ }
+ },
+ "objectName": {
+ "description": "name of the JSON Object",
+ "type": "string"
+ },
+ "objectSchema": {
+ "description": "json schema for the object",
+ "type": "string"
+ },
+ "objectSchemaUrl": {
+ "description": "Url to the json schema for the object",
+ "type": "string"
+ },
+ "nfSubscribedObjectName": {
+ "description": "name of the object associated with the nfSubscriptonId",
+ "type": "string"
+ },
+ "nfSubscriptionId": {
+ "description": "identifies an openConfig telemetry subscription on a network function, which configures the network function to send complex object data associated with the jsonObject",
+ "type": "string"
+ }
+ },
+ "required": [ "objectInstances", "objectName" ]
+ },
+ "jsonObjectInstance": {
+ "description": "meta-information about an instance of a jsonObject along with the actual object instance",
+ "type": "object",
+ "properties": {
+ "objectInstance": {
+ "description": "an instance conforming to the jsonObject schema",
+ "type": "object"
+ },
+ "objectInstanceEpochMicrosec": {
+ "description": "the unix time aka epoch time associated with this objectInstance--as microseconds elapsed since 1 Jan 1970 not including leap seconds",
+ "type": "number"
+ },
+ "objectKeys": {
+ "description": "an ordered set of keys that identifies this particular instance of jsonObject",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/key"
+ }
+ }
+ },
+ "required": [ "objectInstance" ]
+ },
+ "key": {
+ "description": "tuple which provides the name of a key along with its value and relative order",
+ "type": "object",
+ "properties": {
+ "keyName": {
+ "description": "name of the key",
+ "type": "string"
+ },
+ "keyOrder": {
+ "description": "relative sequence or order of the key with respect to other keys",
+ "type": "integer"
+ },
+ "keyValue": {
+ "description": "value of the key",
+ "type": "string"
+ }
+ },
+ "required": [ "keyName" ]
+ },
+ "latencyBucketMeasure": {
+ "description": "number of counts falling within a defined latency bucket",
+ "type": "object",
+ "properties": {
+ "countsInTheBucket": { "type": "number" },
+ "highEndOfLatencyBucket": { "type": "number" },
+ "lowEndOfLatencyBucket": { "type": "number" }
+ },
+ "required": [ "countsInTheBucket" ]
+ },
+ "measurementsForVfScalingFields": {
+ "description": "measurementsForVfScaling fields",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional name-value-pair fields",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "additionalMeasurements": {
+ "description": "array of named name-value-pair arrays",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/namedArrayOfFields"
+ }
+ },
+ "additionalObjects": {
+ "description": "array of JSON objects described by name, schema and other meta-information",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/jsonObject"
+ }
+ },
+ "codecUsageArray": {
+ "description": "array of codecs in use",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/codecsInUse"
+ }
+ },
+ "concurrentSessions": {
+ "description": "peak concurrent sessions for the VM or VNF over the measurementInterval",
+ "type": "integer"
+ },
+ "configuredEntities": {
+ "description": "over the measurementInterval, peak total number of: users, subscribers, devices, adjacencies, etc., for the VM, or subscribers, devices, etc., for the VNF",
+ "type": "integer"
+ },
+ "cpuUsageArray": {
+ "description": "usage of an array of CPUs",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/cpuUsage"
+ }
+ },
+ "diskUsageArray": {
+ "description": "usage of an array of disks",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/diskUsage"
+ }
+ },
+ "featureUsageArray": {
+ "description": "array of features in use",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/featuresInUse"
+ }
+ },
+ "filesystemUsageArray": {
+ "description": "filesystem usage of the VM on which the VNFC reporting the event is running",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/filesystemUsage"
+ }
+ },
+ "latencyDistribution": {
+ "description": "array of integers representing counts of requests whose latency in milliseconds falls within per-VNF configured ranges",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/latencyBucketMeasure"
+ }
+ },
+ "meanRequestLatency": {
+ "description": "mean seconds required to respond to each request for the VM on which the VNFC reporting the event is running",
+ "type": "number"
+ },
+ "measurementInterval": {
+ "description": "interval over which measurements are being reported in seconds",
+ "type": "number"
+ },
+ "measurementsForVfScalingVersion": {
+ "description": "version of the measurementsForVfScaling block",
+ "type": "number"
+ },
+ "memoryUsageArray": {
+ "description": "memory usage of an array of VMs",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/memoryUsage"
+ }
+ },
+ "numberOfMediaPortsInUse": {
+ "description": "number of media ports in use",
+ "type": "integer"
+ },
+ "requestRate": {
+ "description": "peak rate of service requests per second to the VNF over the measurementInterval",
+ "type": "number"
+ },
+ "vnfcScalingMetric": {
+ "description": "represents busy-ness of the VNF from 0 to 100 as reported by the VNFC",
+ "type": "integer"
+ },
+ "vNicPerformanceArray": {
+ "description": "usage of an array of virtual network interface cards",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/vNicPerformance"
+ }
+ }
+ },
+ "required": [ "measurementInterval", "measurementsForVfScalingVersion" ]
+ },
+ "memoryUsage": {
+ "description": "memory usage of an identified virtual machine",
+ "type": "object",
+ "properties": {
+ "memoryBuffered": {
+ "description": "kibibytes of temporary storage for raw disk blocks",
+ "type": "number"
+ },
+ "memoryCached": {
+ "description": "kibibytes of memory used for cache",
+ "type": "number"
+ },
+ "memoryConfigured": {
+ "description": "kibibytes of memory configured in the virtual machine on which the VNFC reporting the event is running",
+ "type": "number"
+ },
+ "memoryFree": {
+ "description": "kibibytes of physical RAM left unused by the system",
+ "type": "number"
+ },
+ "memorySlabRecl": {
+ "description": "the part of the slab that can be reclaimed such as caches measured in kibibytes",
+ "type": "number"
+ },
+ "memorySlabUnrecl": {
+ "description": "the part of the slab that cannot be reclaimed even when lacking memory measured in kibibytes",
+ "type": "number"
+ },
+ "memoryUsed": {
+ "description": "total memory minus the sum of free, buffered, cached and slab memory measured in kibibytes",
+ "type": "number"
+ },
+ "vmIdentifier": {
+ "description": "virtual machine identifier associated with the memory metrics",
+ "type": "string"
+ }
+ },
+ "required": [ "memoryFree", "memoryUsed", "vmIdentifier" ]
+ },
+ "mobileFlowFields": {
+ "description": "mobileFlow fields",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional mobileFlow fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "applicationType": {
+ "description": "Application type inferred",
+ "type": "string"
+ },
+ "appProtocolType": {
+ "description": "application protocol",
+ "type": "string"
+ },
+ "appProtocolVersion": {
+ "description": "application protocol version",
+ "type": "string"
+ },
+ "cid": {
+ "description": "cell id",
+ "type": "string"
+ },
+ "connectionType": {
+ "description": "Abbreviation referencing a 3GPP reference point e.g., S1-U, S11, etc",
+ "type": "string"
+ },
+ "ecgi": {
+ "description": "Evolved Cell Global Id",
+ "type": "string"
+ },
+ "flowDirection": {
+ "description": "Flow direction, indicating if the reporting node is the source of the flow or destination for the flow",
+ "type": "string"
+ },
+ "gtpPerFlowMetrics": { "$ref": "#/definitions/gtpPerFlowMetrics" },
+ "gtpProtocolType": {
+ "description": "GTP protocol",
+ "type": "string"
+ },
+ "gtpVersion": {
+ "description": "GTP protocol version",
+ "type": "string"
+ },
+ "httpHeader": {
+ "description": "HTTP request header, if the flow connects to a node referenced by HTTP",
+ "type": "string"
+ },
+ "imei": {
+ "description": "IMEI for the subscriber UE used in this flow, if the flow connects to a mobile device",
+ "type": "string"
+ },
+ "imsi": {
+ "description": "IMSI for the subscriber UE used in this flow, if the flow connects to a mobile device",
+ "type": "string"
+ },
+ "ipProtocolType": {
+ "description": "IP protocol type e.g., TCP, UDP, RTP...",
+ "type": "string"
+ },
+ "ipVersion": {
+ "description": "IP protocol version e.g., IPv4, IPv6",
+ "type": "string"
+ },
+ "lac": {
+ "description": "location area code",
+ "type": "string"
+ },
+ "mcc": {
+ "description": "mobile country code",
+ "type": "string"
+ },
+ "mnc": {
+ "description": "mobile network code",
+ "type": "string"
+ },
+ "mobileFlowFieldsVersion": {
+ "description": "version of the mobileFlowFields block",
+ "type": "number"
+ },
+ "msisdn": {
+ "description": "MSISDN for the subscriber UE used in this flow, as an integer, if the flow connects to a mobile device",
+ "type": "string"
+ },
+ "otherEndpointIpAddress": {
+ "description": "IP address for the other endpoint, as used for the flow being reported on",
+ "type": "string"
+ },
+ "otherEndpointPort": {
+ "description": "IP Port for the reporting entity, as used for the flow being reported on",
+ "type": "integer"
+ },
+ "otherFunctionalRole": {
+ "description": "Functional role of the other endpoint for the flow being reported on e.g., MME, S-GW, P-GW, PCRF...",
+ "type": "string"
+ },
+ "rac": {
+ "description": "routing area code",
+ "type": "string"
+ },
+ "radioAccessTechnology": {
+ "description": "Radio Access Technology e.g., 2G, 3G, LTE",
+ "type": "string"
+ },
+ "reportingEndpointIpAddr": {
+ "description": "IP address for the reporting entity, as used for the flow being reported on",
+ "type": "string"
+ },
+ "reportingEndpointPort": {
+ "description": "IP port for the reporting entity, as used for the flow being reported on",
+ "type": "integer"
+ },
+ "sac": {
+ "description": "service area code",
+ "type": "string"
+ },
+ "samplingAlgorithm": {
+ "description": "Integer identifier for the sampling algorithm or rule being applied in calculating the flow metrics if metrics are calculated based on a sample of packets, or 0 if no sampling is applied",
+ "type": "integer"
+ },
+ "tac": {
+ "description": "transport area code",
+ "type": "string"
+ },
+ "tunnelId": {
+ "description": "tunnel identifier",
+ "type": "string"
+ },
+ "vlanId": {
+ "description": "VLAN identifier used by this flow",
+ "type": "string"
+ }
+ },
+ "required": [ "flowDirection", "gtpPerFlowMetrics", "ipProtocolType", "ipVersion",
+ "mobileFlowFieldsVersion", "otherEndpointIpAddress", "otherEndpointPort",
+ "reportingEndpointIpAddr", "reportingEndpointPort" ]
+ },
+ "namedArrayOfFields": {
+ "description": "an array of name value pairs along with a name for the array",
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "arrayOfFields": {
+ "description": "array of name value pairs",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ }
+ },
+ "required": [ "name", "arrayOfFields" ]
+ },
+ "otherFields": {
+ "description": "fields for events belonging to the 'other' domain of the commonEventHeader domain enumeration",
+ "type": "object",
+ "properties": {
+ "hashOfNameValuePairArrays": {
+ "description": "array of named name-value-pair arrays",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/namedArrayOfFields"
+ }
+ },
+ "jsonObjects": {
+ "description": "array of JSON objects described by name, schema and other meta-information",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/jsonObject"
+ }
+ },
+ "nameValuePairs": {
+ "description": "array of name-value pairs",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "otherFieldsVersion": {
+ "description": "version of the otherFields block",
+ "type": "number"
+ }
+ },
+ "required": [ "otherFieldsVersion" ]
+ },
+ "requestError": {
+ "description": "standard request error data structure",
+ "type": "object",
+ "properties": {
+ "messageId": {
+ "description": "Unique message identifier of the format ABCnnnn where ABC is either SVC for Service Exceptions or POL for Policy Exception",
+ "type": "string"
+ },
+ "text": {
+ "description": "Message text, with replacement variables marked with %n, where n is an index into the list of <variables> elements, starting at 1",
+ "type": "string"
+ },
+ "url": {
+ "description": "Hyperlink to a detailed error resource e.g., an HTML page for browser user agents",
+ "type": "string"
+ },
+ "variables": {
+ "description": "List of zero or more strings that represent the contents of the variables used by the message text",
+ "type": "string"
+ }
+ },
+ "required": [ "messageId", "text" ]
+ },
+ "sipSignalingFields": {
+ "description": "sip signaling fields",
+ "type": "object",
+ "properties": {
+ "additionalInformation": {
+ "description": "additional sip signaling fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "compressedSip": {
+ "description": "the full SIP request/response including headers and bodies",
+ "type": "string"
+ },
+ "correlator": {
+ "description": "this is the same for all events on this call",
+ "type": "string"
+ },
+ "localIpAddress": {
+ "description": "IP address on VNF",
+ "type": "string"
+ },
+ "localPort": {
+ "description": "port on VNF",
+ "type": "string"
+ },
+ "remoteIpAddress": {
+ "description": "IP address of peer endpoint",
+ "type": "string"
+ },
+ "remotePort": {
+ "description": "port of peer endpoint",
+ "type": "string"
+ },
+ "sipSignalingFieldsVersion": {
+ "description": "version of the sipSignalingFields block",
+ "type": "number"
+ },
+ "summarySip": {
+ "description": "the SIP Method or Response (‘INVITE’, ‘200 OK’, ‘BYE’, etc)",
+ "type": "string"
+ },
+ "vendorVnfNameFields": {
+ "$ref": "#/definitions/vendorVnfNameFields"
+ }
+ },
+ "required": [ "correlator", "localIpAddress", "localPort", "remoteIpAddress",
+ "remotePort", "sipSignalingFieldsVersion", "vendorVnfNameFields" ]
+ },
+ "stateChangeFields": {
+ "description": "stateChange fields",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional stateChange fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "newState": {
+ "description": "new state of the entity",
+ "type": "string",
+ "enum": [
+ "inService",
+ "maintenance",
+ "outOfService"
+ ]
+ },
+ "oldState": {
+ "description": "previous state of the entity",
+ "type": "string",
+ "enum": [
+ "inService",
+ "maintenance",
+ "outOfService"
+ ]
+ },
+ "stateChangeFieldsVersion": {
+ "description": "version of the stateChangeFields block",
+ "type": "number"
+ },
+ "stateInterface": {
+ "description": "card or port name of the entity that changed state",
+ "type": "string"
+ }
+ },
+ "required": [ "newState", "oldState", "stateChangeFieldsVersion", "stateInterface" ]
+ },
+ "suppressedNvPairs": {
+ "description": "List of specific NvPairsNames to suppress within a given Name-Value Field for event Throttling",
+ "type": "object",
+ "properties": {
+ "nvPairFieldName": {
+ "description": "Name of the field within which are the nvpair names to suppress",
+ "type": "string"
+ },
+ "suppressedNvPairNames": {
+ "description": "Array of nvpair names to suppress within the nvpairFieldName",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "required": [ "nvPairFieldName", "suppressedNvPairNames" ]
+ },
+ "syslogFields": {
+ "description": "sysLog fields",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional syslog fields if needed provided as name=value delimited by a pipe ‘|’ symbol, for example: 'name1=value1|name2=value2|…'",
+ "type": "string"
+ },
+ "eventSourceHost": {
+ "description": "hostname of the device",
+ "type": "string"
+ },
+ "eventSourceType": {
+ "description": "type of event source; examples: other, router, switch, host, card, port, slotThreshold, portThreshold, virtualMachine, virtualNetworkFunction",
+ "type": "string"
+ },
+ "syslogFacility": {
+ "description": "numeric code from 0 to 23 for facility--see table in documentation",
+ "type": "integer"
+ },
+ "syslogFieldsVersion": {
+ "description": "version of the syslogFields block",
+ "type": "number"
+ },
+ "syslogMsg": {
+ "description": "syslog message",
+ "type": "string"
+ },
+ "syslogPri": {
+ "description": "0-192 combined severity and facility",
+ "type": "integer"
+ },
+ "syslogProc": {
+ "description": "identifies the application that originated the message",
+ "type": "string"
+ },
+ "syslogProcId": {
+ "description": "a change in the value of this field indicates a discontinuity in syslog reporting",
+ "type": "number"
+ },
+ "syslogSData": {
+ "description": "syslog structured data consisting of a structured data Id followed by a set of key value pairs",
+ "type": "string"
+ },
+ "syslogSdId": {
+ "description": "0-32 char in format name@number for example ourSDID@32473",
+ "type": "string"
+ },
+ "syslogSev": {
+ "description": "numerical Code for severity derived from syslogPri as remaider of syslogPri / 8",
+ "type": "string",
+ "enum": [
+ "Alert",
+ "Critical",
+ "Debug",
+ "Emergency",
+ "Error",
+ "Info",
+ "Notice",
+ "Warning"
+ ]
+ },
+ "syslogTag": {
+ "description": "msgId indicating the type of message such as TCPOUT or TCPIN; NILVALUE should be used when no other value can be provided",
+ "type": "string"
+ },
+ "syslogVer": {
+ "description": "IANA assigned version of the syslog protocol specification - typically 1",
+ "type": "number"
+ }
+ },
+ "required": [ "eventSourceType", "syslogFieldsVersion", "syslogMsg", "syslogTag" ]
+ },
+ "thresholdCrossingAlertFields": {
+ "description": "fields specific to threshold crossing alert events",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional threshold crossing alert fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "additionalParameters": {
+ "description": "performance counters",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/counter"
+ }
+ },
+ "alertAction": {
+ "description": "Event action",
+ "type": "string",
+ "enum": [
+ "CLEAR",
+ "CONT",
+ "SET"
+ ]
+ },
+ "alertDescription": {
+ "description": "Unique short alert description such as IF-SHUB-ERRDROP",
+ "type": "string"
+ },
+ "alertType": {
+ "description": "Event type",
+ "type": "string",
+ "enum": [
+ "CARD-ANOMALY",
+ "ELEMENT-ANOMALY",
+ "INTERFACE-ANOMALY",
+ "SERVICE-ANOMALY"
+ ]
+ },
+ "alertValue": {
+ "description": "Calculated API value (if applicable)",
+ "type": "string"
+ },
+ "associatedAlertIdList": {
+ "description": "List of eventIds associated with the event being reported",
+ "type": "array",
+ "items": { "type": "string" }
+ },
+ "collectionTimestamp": {
+ "description": "Time when the performance collector picked up the data; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "dataCollector": {
+ "description": "Specific performance collector instance used",
+ "type": "string"
+ },
+ "elementType": {
+ "description": "type of network element - internal ATT field",
+ "type": "string"
+ },
+ "eventSeverity": {
+ "description": "event severity or priority",
+ "type": "string",
+ "enum": [
+ "CRITICAL",
+ "MAJOR",
+ "MINOR",
+ "WARNING",
+ "NORMAL"
+ ]
+ },
+ "eventStartTimestamp": {
+ "description": "Time closest to when the measurement was made; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "interfaceName": {
+ "description": "Physical or logical port or card (if applicable)",
+ "type": "string"
+ },
+ "networkService": {
+ "description": "network name - internal ATT field",
+ "type": "string"
+ },
+ "possibleRootCause": {
+ "description": "Reserved for future use",
+ "type": "string"
+ },
+ "thresholdCrossingFieldsVersion": {
+ "description": "version of the thresholdCrossingAlertFields block",
+ "type": "number"
+ }
+ },
+ "required": [
+ "additionalParameters",
+ "alertAction",
+ "alertDescription",
+ "alertType",
+ "collectionTimestamp",
+ "eventSeverity",
+ "eventStartTimestamp",
+ "thresholdCrossingFieldsVersion"
+ ]
+ },
+ "vendorVnfNameFields": {
+ "description": "provides vendor, vnf and vfModule identifying information",
+ "type": "object",
+ "properties": {
+ "vendorName": {
+ "description": "VNF vendor name",
+ "type": "string"
+ },
+ "vfModuleName": {
+ "description": "ASDC vfModuleName for the vfModule generating the event",
+ "type": "string"
+ },
+ "vnfName": {
+ "description": "ASDC modelName for the VNF generating the event",
+ "type": "string"
+ }
+ },
+ "required": [ "vendorName" ]
+ },
+ "vNicPerformance": {
+ "description": "describes the performance and errors of an identified virtual network interface card",
+ "type": "object",
+ "properties": {
+ "receivedBroadcastPacketsAccumulated": {
+ "description": "Cumulative count of broadcast packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedBroadcastPacketsDelta": {
+ "description": "Count of broadcast packets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedDiscardedPacketsAccumulated": {
+ "description": "Cumulative count of discarded packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedDiscardedPacketsDelta": {
+ "description": "Count of discarded packets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedErrorPacketsAccumulated": {
+ "description": "Cumulative count of error packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedErrorPacketsDelta": {
+ "description": "Count of error packets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedMulticastPacketsAccumulated": {
+ "description": "Cumulative count of multicast packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedMulticastPacketsDelta": {
+ "description": "Count of multicast packets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedOctetsAccumulated": {
+ "description": "Cumulative count of octets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedOctetsDelta": {
+ "description": "Count of octets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedTotalPacketsAccumulated": {
+ "description": "Cumulative count of all packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedTotalPacketsDelta": {
+ "description": "Count of all packets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedUnicastPacketsAccumulated": {
+ "description": "Cumulative count of unicast packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedUnicastPacketsDelta": {
+ "description": "Count of unicast packets received within the measurement interval",
+ "type": "number"
+ },
+ "transmittedBroadcastPacketsAccumulated": {
+ "description": "Cumulative count of broadcast packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedBroadcastPacketsDelta": {
+ "description": "Count of broadcast packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedDiscardedPacketsAccumulated": {
+ "description": "Cumulative count of discarded packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedDiscardedPacketsDelta": {
+ "description": "Count of discarded packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedErrorPacketsAccumulated": {
+ "description": "Cumulative count of error packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedErrorPacketsDelta": {
+ "description": "Count of error packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedMulticastPacketsAccumulated": {
+ "description": "Cumulative count of multicast packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedMulticastPacketsDelta": {
+ "description": "Count of multicast packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedOctetsAccumulated": {
+ "description": "Cumulative count of octets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedOctetsDelta": {
+ "description": "Count of octets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedTotalPacketsAccumulated": {
+ "description": "Cumulative count of all packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedTotalPacketsDelta": {
+ "description": "Count of all packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedUnicastPacketsAccumulated": {
+ "description": "Cumulative count of unicast packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedUnicastPacketsDelta": {
+ "description": "Count of unicast packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "valuesAreSuspect": {
+ "description": "Indicates whether vNicPerformance values are likely inaccurate due to counter overflow or other condtions",
+ "type": "string",
+ "enum": [ "true", "false" ]
+ },
+ "vNicIdentifier": {
+ "description": "vNic identification",
+ "type": "string"
+ }
+ },
+ "required": [ "valuesAreSuspect", "vNicIdentifier" ]
+ },
+ "voiceQualityFields": {
+ "description": "provides statistics related to customer facing voice products",
+ "type": "object",
+ "properties": {
+ "additionalInformation": {
+ "description": "additional voice quality fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "calleeSideCodec": {
+ "description": "callee codec for the call",
+ "type": "string"
+ },
+ "callerSideCodec": {
+ "description": "caller codec for the call",
+ "type": "string"
+ },
+ "correlator": {
+ "description": "this is the same for all events on this call",
+ "type": "string"
+ },
+ "endOfCallVqmSummaries": {
+ "$ref": "#/definitions/endOfCallVqmSummaries"
+ },
+ "phoneNumber": {
+ "description": "phone number associated with the correlator",
+ "type": "string"
+ },
+ "midCallRtcp": {
+ "description": "Base64 encoding of the binary RTCP data excluding Eth/IP/UDP headers",
+ "type": "string"
+ },
+ "vendorVnfNameFields": {
+ "$ref": "#/definitions/vendorVnfNameFields"
+ },
+ "voiceQualityFieldsVersion": {
+ "description": "version of the voiceQualityFields block",
+ "type": "number"
+ }
+ },
+ "required": [ "calleeSideCodec", "callerSideCodec", "correlator", "midCallRtcp",
+ "vendorVnfNameFields", "voiceQualityFieldsVersion" ]
+ }
+ },
+ "title": "Event Listener",
+ "type": "object",
+ "properties": {
+ "event": {"$ref": "#/definitions/event"}
+ }
+}
diff --git a/tests/dcaegen2/testcases/resources/DMaaP.py b/tests/dcaegen2/testcases/resources/DMaaP.py
new file mode 100644
index 00000000..092b6081
--- /dev/null
+++ b/tests/dcaegen2/testcases/resources/DMaaP.py
@@ -0,0 +1,431 @@
+'''
+Created on Aug 15, 2017
+
+@author: sw6830
+'''
+import os
+import posixpath
+import BaseHTTPServer
+import urllib
+import urlparse
+import cgi
+import sys
+import shutil
+import mimetypes
+from jsonschema import validate
+import jsonschema
+import json
+import DcaeVariables
+import SimpleHTTPServer
+from robot.api import logger
+
+
+try:
+ from cStringIO import StringIO
+except ImportError:
+ from StringIO import StringIO
+
+EvtSchema = None
+DMaaPHttpd = None
+
+
+def clean_up_event():
+ sz = DcaeVariables.VESEventQ.qsize()
+ for i in range(sz):
+ try:
+ self.evtQueue.get_nowait()
+ except:
+ pass
+
+
+def enque_event(evt):
+ if DcaeVariables.VESEventQ is not None:
+ try:
+ DcaeVariables.VESEventQ.put(evt)
+ if DcaeVariables.IsRobotRun:
+ logger.console("DMaaP Event enqued - size=" + str(len(evt)))
+ else:
+ print ("DMaaP Event enqueued - size=" + str(len(evt)))
+ return True
+ except Exception as e:
+ print (str(e))
+ return False
+ return False
+
+
+def deque_event(wait_sec=25):
+ if DcaeVariables.IsRobotRun:
+ logger.console("Enter DequeEvent")
+ try:
+ evt = DcaeVariables.VESEventQ.get(True, wait_sec)
+ if DcaeVariables.IsRobotRun:
+ logger.console("DMaaP Event dequeued - size=" + str(len(evt)))
+ else:
+ print("DMaaP Event dequeued - size=" + str(len(evt)))
+ return evt
+ except Exception as e:
+ if DcaeVariables.IsRobotRun:
+ logger.console(str(e))
+ logger.console("DMaaP Event dequeue timeout")
+ else:
+ print("DMaaP Event dequeue timeout")
+ return None
+
+
+class DMaaPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
+
+ def do_PUT(self):
+ self.send_response(405)
+ return
+
+ def do_POST(self):
+
+ resp_code = 0
+ # Parse the form data posted
+ '''
+ form = cgi.FieldStorage(
+ fp=self.rfile,
+ headers=self.headers,
+ environ={'REQUEST_METHOD':'POST',
+ 'CONTENT_TYPE':self.headers['Content-Type'],
+ })
+
+
+ form = cgi.FieldStorage(
+ fp=self.rfile,
+ headers=self.headers,
+ environ={"REQUEST_METHOD": "POST"})
+
+ for item in form.list:
+ print "%s=%s" % (item.name, item.value)
+
+ '''
+
+ if 'POST' not in self.requestline:
+ resp_code = 405
+
+ '''
+ if resp_code == 0:
+ if '/eventlistener/v5' not in self.requestline and '/eventlistener/v5/eventBatch' not in self.requestline and \
+ '/eventlistener/v5/clientThrottlingState' not in self.requestline:
+ resp_code = 404
+
+
+ if resp_code == 0:
+ if 'Y29uc29sZTpaakprWWpsbE1qbGpNVEkyTTJJeg==' not in str(self.headers):
+ resp_code = 401
+ '''
+
+ if resp_code == 0:
+ content_len = int(self.headers.getheader('content-length', 0))
+ post_body = self.rfile.read(content_len)
+
+ if DcaeVariables.IsRobotRun:
+ logger.console("\n" + "DMaaP Receive Event:\n" + post_body)
+ else:
+ print("\n" + "DMaaP Receive Event:")
+ print (post_body)
+
+ indx = post_body.index("{")
+ if indx != 0:
+ post_body = post_body[indx:]
+
+ if not enque_event(post_body):
+ print "enque event fails"
+
+ global EvtSchema
+ try:
+ if EvtSchema is None:
+ with open(DcaeVariables.CommonEventSchemaV5) as opened_file:
+ EvtSchema = json.load(opened_file)
+ decoded_body = json.loads(post_body)
+ jsonschema.validate(decoded_body, EvtSchema)
+ except:
+ resp_code = 400
+
+ # Begin the response
+ if not DcaeVariables.IsRobotRun:
+ print ("Response Message:")
+
+ '''
+ {
+ "200" : {
+ "description" : "Success",
+ "schema" : {
+ "$ref" : "#/definitions/DR_Pub"
+ }
+ }
+
+ rspStr = "{'responses' : {'200' : {'description' : 'Success'}}}"
+ rspStr1 = "{'count': 1, 'serverTimeMs': 3}"
+
+ '''
+
+ if resp_code == 0:
+ if 'clientThrottlingState' in self.requestline:
+ self.send_response(204)
+ else:
+ self.send_response(200)
+ self.send_header('Content-Type', 'application/json')
+ self.end_headers()
+ # self.wfile.write("{'responses' : {'200' : {'description' : 'Success'}}}")
+ self.wfile.write("{'count': 1, 'serverTimeMs': 3}")
+ self.wfile.close()
+ else:
+ self.send_response(resp_code)
+
+ '''
+ self.end_headers()
+ self.wfile.write('Client: %s\n' % str(self.client_address))
+ self.wfile.write('User-agent: %s\n' % str(self.headers['user-agent']))
+ self.wfile.write('Path: %s\n' % self.path)
+ self.wfile.write('Form data:\n')
+ self.wfile.close()
+
+ # Echo back information about what was posted in the form
+ for field in form.keys():
+ field_item = form[field]
+ if field_item.filename:
+ # The field contains an uploaded file
+ file_data = field_item.file.read()
+ file_len = len(file_data)
+ del file_data
+ self.wfile.write('\tUploaded %s as "%s" (%d bytes)\n' % \
+ (field, field_item.filename, file_len))
+ else:
+ # Regular form value
+ self.wfile.write('\t%s=%s\n' % (field, form[field].value))
+ '''
+ return
+
+ def do_GET(self):
+ """Serve a GET request."""
+ f = self.send_head()
+ if f:
+ try:
+ self.copyfile(f, self.wfile)
+ finally:
+ f.close()
+
+ def do_HEAD(self):
+ """Serve a HEAD request."""
+ f = self.send_head()
+ if f:
+ f.close()
+
+ def send_head(self):
+ """Common code for GET and HEAD commands.
+
+ This sends the response code and MIME headers.
+
+ Return value is either a file object (which has to be copied
+ to the outputfile by the caller unless the command was HEAD,
+ and must be closed by the caller under all circumstances), or
+ None, in which case the caller has nothing further to do.
+
+ """
+ path = self.translate_path(self.path)
+ if os.path.isdir(path):
+ parts = urlparse.urlsplit(self.path)
+ if not parts.path.endswith('/'):
+ # redirect browser - doing basically what apache does
+ self.send_response(301)
+ new_parts = (parts[0], parts[1], parts[2] + '/',
+ parts[3], parts[4])
+ new_url = urlparse.urlunsplit(new_parts)
+ self.send_header("Location", new_url)
+ self.end_headers()
+ return None
+ for index in "index.html", "index.htm":
+ index = os.path.join(path, index)
+ if os.path.exists(index):
+ path = index
+ break
+ else:
+ return self.list_directory(path)
+ ctype = self.guess_type(path)
+ try:
+ # Always read in binary mode. Opening files in text mode may cause
+ # newline translations, making the actual size of the content
+ # transmitted *less* than the content-length!
+ f = open(path, 'rb')
+ except IOError:
+ self.send_error(404, "File not found")
+ return None
+ try:
+ self.send_response(200)
+ self.send_header("Content-type", ctype)
+ fs = os.fstat(f.fileno())
+ self.send_header("Content-Length", str(fs[6]))
+ self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
+ self.end_headers()
+ return f
+ except:
+ f.close()
+ raise
+
+ def list_directory(self, path):
+ """Helper to produce a directory listing (absent index.html).
+
+ Return value is either a file object, or None (indicating an
+ error). In either case, the headers are sent, making the
+ interface the same as for send_head().
+
+ """
+ try:
+ list_dir = os.listdir(path)
+ except os.error:
+ self.send_error(404, "No permission to list directory")
+ return None
+ list_dir.sort(key=lambda a: a.lower())
+ f = StringIO()
+ displaypath = cgi.escape(urllib.unquote(self.path))
+ f.write('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">')
+ f.write("<html>\n<title>Directory listing for %s</title>\n" % displaypath)
+ f.write("<body>\n<h2>Directory listing for %s</h2>\n" % displaypath)
+ f.write("<hr>\n<ul>\n")
+ for name in list_dir:
+ fullname = os.path.join(path, name)
+ displayname = linkname = name
+ # Append / for directories or @ for symbolic links
+ if os.path.isdir(fullname):
+ displayname = name + "/"
+ linkname = name + "/"
+ if os.path.islink(fullname):
+ displayname = name + "@"
+ # Note: a link to a directory displays with @ and links with /
+ f.write('<li><a href="%s">%s</a>\n'
+ % (urllib.quote(linkname), cgi.escape(displayname)))
+ f.write("</ul>\n<hr>\n</body>\n</html>\n")
+ length = f.tell()
+ f.seek(0)
+ self.send_response(200)
+ encoding = sys.getfilesystemencoding()
+ self.send_header("Content-type", "text/html; charset=%s" % encoding)
+ self.send_header("Content-Length", str(length))
+ self.end_headers()
+ return f
+
+ @staticmethod
+ def translate_path(path):
+ """Translate a /-separated PATH to the local filename syntax.
+
+ Components that mean special things to the local file system
+ (e.g. drive or directory names) are ignored. (XXX They should
+ probably be diagnosed.)
+
+ """
+ # abandon query parameters
+ path = path.split('?', 1)[0]
+ path = path.split('#', 1)[0]
+ # Don't forget explicit trailing slash when normalizing. Issue17324
+ trailing_slash = path.rstrip().endswith('/')
+ path = posixpath.normpath(urllib.unquote(path))
+ words = path.split('/')
+ words = filter(None, words)
+ path = os.getcwd()
+ for word in words:
+ if os.path.dirname(word) or word in (os.curdir, os.pardir):
+ # Ignore components that are not a simple file/directory name
+ continue
+ path = os.path.join(path, word)
+ if trailing_slash:
+ path += '/'
+ return path
+
+ @staticmethod
+ def copyfile(source, outputfile):
+ """Copy all data between two file objects.
+
+ The SOURCE argument is a file object open for reading
+ (or anything with a read() method) and the DESTINATION
+ argument is a file object open for writing (or
+ anything with a write() method).
+
+ The only reason for overriding this would be to change
+ the block size or perhaps to replace newlines by CRLF
+ -- note however that this the default server uses this
+ to copy binary data as well.
+
+ """
+ shutil.copyfileobj(source, outputfile)
+
+ def guess_type(self, path):
+ """Guess the type of a file.
+
+ Argument is a PATH (a filename).
+
+ Return value is a string of the form type/subtype,
+ usable for a MIME Content-type header.
+
+ The default implementation looks the file's extension
+ up in the table self.extensions_map, using application/octet-stream
+ as a default; however it would be permissible (if
+ slow) to look inside the data to make a better guess.
+
+ """
+
+ base, ext = posixpath.splitext(path)
+ if ext in self.extensions_map:
+ return self.extensions_map[ext]
+ ext = ext.lower()
+ if ext in self.extensions_map:
+ return self.extensions_map[ext]
+ else:
+ return self.extensions_map['']
+
+ if not mimetypes.inited:
+ mimetypes.init() # try to read system mime.types
+ extensions_map = mimetypes.types_map.copy()
+ extensions_map.update({
+ '': 'application/octet-stream', # Default
+ '.py': 'text/plain',
+ '.c': 'text/plain',
+ '.h': 'text/plain',
+ })
+
+
+def test(handler_class=DMaaPHandler, server_class=BaseHTTPServer.HTTPServer, protocol="HTTP/1.0", port=3904):
+ print "Load event schema file: " + DcaeVariables.CommonEventSchemaV5
+ with open(DcaeVariables.CommonEventSchemaV5) as opened_file:
+ global EvtSchema
+ EvtSchema = json.load(opened_file)
+
+ server_address = ('', port)
+
+ handler_class.protocol_version = protocol
+ httpd = server_class(server_address, handler_class)
+
+ global DMaaPHttpd
+ DMaaPHttpd = httpd
+ DcaeVariables.HTTPD = httpd
+
+ sa = httpd.socket.getsockname()
+ print "Serving HTTP on", sa[0], "port", sa[1], "..."
+ # httpd.serve_forever()
+
+
+def _main_(handler_class=DMaaPHandler, server_class=BaseHTTPServer.HTTPServer, protocol="HTTP/1.0"):
+
+ if sys.argv[1:]:
+ port = int(sys.argv[1])
+ else:
+ port = 3904
+
+ print "Load event schema file: " + DcaeVariables.CommonEventSchemaV5
+ with open(DcaeVariables.CommonEventSchemaV5) as opened_file:
+ global EvtSchema
+ EvtSchema = json.load(opened_file)
+
+ server_address = ('', port)
+
+ handler_class.protocol_version = protocol
+ httpd = server_class(server_address, handler_class)
+
+ sa = httpd.socket.getsockname()
+ print "Serving HTTP on", sa[0], "port", sa[1], "..."
+ httpd.serve_forever()
+
+
+if __name__ == '__main__':
+ _main_()
diff --git a/tests/dcaegen2/testcases/resources/DcaeLibrary.py b/tests/dcaegen2/testcases/resources/DcaeLibrary.py
new file mode 100644
index 00000000..b43ee29e
--- /dev/null
+++ b/tests/dcaegen2/testcases/resources/DcaeLibrary.py
@@ -0,0 +1,173 @@
+'''
+Created on Aug 18, 2017
+
+@author: sw6830
+'''
+from robot.api import logger
+from Queue import Queue
+import uuid
+import time
+import datetime
+import json
+import threading
+import os
+import platform
+import subprocess
+import paramiko
+import DcaeVariables
+import DMaaP
+
+
+class DcaeLibrary(object):
+
+ def __init__(self):
+ pass
+
+ @staticmethod
+ def setup_dmaap_server(port_num=3904):
+ if DcaeVariables.HttpServerThread is not None:
+ DMaaP.clean_up_event()
+ logger.console("Clean up event from event queue before test")
+ logger.info("DMaaP Server already started")
+ return "true"
+
+ DcaeVariables.IsRobotRun = True
+ DMaaP.test(port=port_num)
+ try:
+ DcaeVariables.VESEventQ = Queue()
+ DcaeVariables.HttpServerThread = threading.Thread(name='DMAAP_HTTPServer', target=DMaaP.DMaaPHttpd.serve_forever)
+ DcaeVariables.HttpServerThread.start()
+ logger.console("DMaaP Mockup Sever started")
+ time.sleep(2)
+ return "true"
+ except Exception as e:
+ print (str(e))
+ return "false"
+
+ @staticmethod
+ def shutdown_dmaap():
+ if DcaeVariables.HTTPD is not None:
+ DcaeVariables.HTTPD.shutdown()
+ logger.console("DMaaP Server shut down")
+ time.sleep(3)
+ return "true"
+ else:
+ return "false"
+
+ @staticmethod
+ def cleanup_ves_events():
+ if DcaeVariables.HttpServerThread is not None:
+ DMaaP.clean_up_event()
+ logger.console("DMaaP event queue is cleaned up")
+ return "true"
+ logger.console("DMaaP server not started yet")
+ return "false"
+
+ @staticmethod
+ def enable_vesc_https_auth():
+ global client
+ if 'Windows' in platform.system():
+ try:
+ client = paramiko.SSHClient()
+ client.load_system_host_keys()
+ # client.set_missing_host_key_policy(paramiko.WarningPolicy)
+ client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+
+ client.connect(os.environ['CSIT_IP'], port=22, username=os.environ['CSIT_USER'], password=os.environ['CSIT_PD'])
+ stdin, stdout, stderr = client.exec_command('%{WORKSPACE}/test/csit/tests/dcaegen2/testcases/resources/vesc_enable_https_auth.sh')
+ logger.console(stdout.read())
+ finally:
+ client.close()
+ return
+ ws = os.environ['WORKSPACE']
+ script2run = ws + "/test/csit/tests/dcaegen2/testcases/resources/vesc_enable_https_auth.sh"
+ logger.info("Running script: " + script2run)
+ logger.console("Running script: " + script2run)
+ subprocess.call(script2run)
+ time.sleep(5)
+ return
+
+ @staticmethod
+ def dmaap_message_receive(evtobj, action='contain'):
+
+ evt_str = DMaaP.deque_event()
+ while evt_str != None:
+ logger.console("DMaaP receive VES Event:\n" + evt_str)
+ if action == 'contain':
+ if evtobj in evt_str:
+ logger.info("DMaaP Receive Expected Publish Event:\n" + evt_str)
+ return 'true'
+ if action == 'sizematch':
+ if len(evtobj) == len(evt_str):
+ return 'true'
+ if action == 'dictmatch':
+ evt_dict = json.loads(evt_str)
+ if cmp(evtobj, evt_dict) == 0:
+ return 'true'
+ evt_str = DMaaP.deque_event()
+ return 'false'
+
+ @staticmethod
+ def is_json_empty(resp):
+ logger.info("Enter is_json_empty: resp.text: " + resp.text)
+ if resp.text is None or len(resp.text) < 2:
+ return 'True'
+ return 'False'
+
+ @staticmethod
+ def generate_uuid():
+ """generate a uuid"""
+ return uuid.uuid4()
+
+ @staticmethod
+ def get_json_value_list(jsonstr, keyval):
+ logger.info("Enter Get_Json_Key_Value_List")
+ if jsonstr is None or len(jsonstr) < 2:
+ logger.info("No Json data found")
+ return []
+ try:
+ data = json.loads(jsonstr)
+ nodelist = []
+ for item in data:
+ nodelist.append(item[keyval])
+ return nodelist
+ except Exception as e:
+ logger.info("Json data parsing fails")
+ print str(e)
+ return []
+
+ @staticmethod
+ def generate_millitimestamp_uuid():
+ """generate a millisecond timestamp uuid"""
+ then = datetime.datetime.now()
+ return int(time.mktime(then.timetuple())*1e3 + then.microsecond/1e3)
+
+ @staticmethod
+ def test():
+ import json
+ from pprint import pprint
+
+ with open('robot/assets/dcae/ves_volte_single_fault_event.json') as data_file:
+ data = json.load(data_file)
+
+ data['event']['commonEventHeader']['version'] = '5.0'
+ pprint(data)
+
+
+if __name__ == '__main__':
+ '''
+ dictStr = "action=getTable,Accept=application/json,Content-Type=application/json,X-FromAppId=1234908903284"
+ cls = DcaeLibrary()
+ #dict = cls.create_header_from_string(dictStr)
+ #print str(dict)
+ jsonStr = "[{'Node': 'onapfcnsl00', 'CheckID': 'serfHealth', 'Name': 'Serf Health Status', 'ServiceName': '', 'Notes': '', 'ModifyIndex': 6, 'Status': 'passing', 'ServiceID': '', 'ServiceTags': [], 'Output': 'Agent alive and reachable', 'CreateIndex': 6}]"
+ lsObj = cls.get_json_value_list(jsonStr, 'Status')
+ print lsObj
+ '''
+
+ lib = DcaeLibrary()
+ lib.enable_vesc_https_auth()
+
+ ret = lib.setup_dmaap_server()
+ print ret
+ time.sleep(100000)
diff --git a/tests/dcaegen2/testcases/resources/DcaeVariables.py b/tests/dcaegen2/testcases/resources/DcaeVariables.py
new file mode 100644
index 00000000..a9456d0f
--- /dev/null
+++ b/tests/dcaegen2/testcases/resources/DcaeVariables.py
@@ -0,0 +1,17 @@
+import os
+
+
+def get_environment_variable(env_varstr):
+ return os.environ.get(env_varstr)
+
+
+DCAE_HEALTH_CHECK_URL = "http://135.205.228.129:8500"
+DCAE_HEALTH_CHECK_URL1 = "http://135.205.228.170:8500"
+
+CommonEventSchemaV5 = get_environment_variable('WORKSPACE') + "/test/csit/tests/dcaegen2/testcases/assets/json_events/CommonEventFormat_28.3.json"
+
+HttpServerThread = None
+HTTPD = None
+VESEventQ = None
+IsRobotRun = False
+
diff --git a/tests/dcaegen2/testcases/resources/VES-4.27.2-dataformat.json b/tests/dcaegen2/testcases/resources/VES-4.27.2-dataformat.json
new file mode 100644
index 00000000..45faaa5a
--- /dev/null
+++ b/tests/dcaegen2/testcases/resources/VES-4.27.2-dataformat.json
@@ -0,0 +1,1161 @@
+{
+ "self": {
+ "name": "VES_specification",
+ "version": "4.27.2",
+ "description": "VES spec from v4.1 and 27.2 spec"
+
+ },
+ "dataformatversion": "1.0.0",
+ "jsonschema":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+
+ "definitions": {
+ "attCopyrightNotice": {
+ "description": "Copyright (c) 2017 AT&T Intellectual Property. All rights reserved.",
+ "type": "object",
+ "properties": {
+ "useAndRedistribution": {
+ "description": "Unless otherwise specified, all software contained herein is licensed under the Apache License, Version 2.0 (the License); you may not use this file except in compliance with the License.You may obtain a copy of the License at",
+ "type": "string"
+ },
+ "licenseLink": "http://www.apache.org/licenses/LICENSE-2.0",
+ "condition1": {
+ "description": "Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an AS IS BASIS,",
+ "type": "string"
+ },
+ "condition2": {
+ "description": "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.",
+ "type": "string"
+ },
+ "condition3": {
+ "description": "See the License for the specific language governing permissions and limitations under the License.",
+ "type": "string"
+ },
+ "Trademarks": {
+ "description": "ECOMP is a trademark and service mark of AT&T Intellectual Property.",
+ "type": "string"
+ }
+ }
+ },
+ "codecsInUse": {
+ "description": "number of times an identified codec was used over the measurementInterval",
+ "type": "object",
+ "properties": {
+ "codecIdentifier": { "type": "string" },
+ "numberInUse": { "type": "number" }
+ },
+ "required": [ "codecIdentifier", "numberInUse" ]
+ },
+ "command": {
+ "description": "command from an event collector toward an event source",
+ "type": "object",
+ "properties": {
+ "commandType": {
+ "type": "string",
+ "enum": [
+ "heartbeatIntervalChange",
+ "measurementIntervalChange",
+ "provideThrottlingState",
+ "throttlingSpecification"
+ ]
+ },
+ "eventDomainThrottleSpecification": { "$ref": "#/definitions/eventDomainThrottleSpecification" },
+ "measurementInterval": { "type": "number" }
+ },
+ "required": [ "commandType" ]
+ },
+ "commandList": {
+ "description": "array of commands from an event collector toward an event source",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/commandListEntry"
+ },
+ "minItems": 0
+ },
+ "commandListEntry": {
+ "description": "reference to a command object",
+ "type": "object",
+ "properties": {
+ "command": {"$ref": "#/definitions/command"}
+ },
+ "required": [ "command" ]
+ },
+ "commonEventHeader": {
+ "description": "fields common to all events",
+ "type": "object",
+ "properties": {
+ "domain": {
+ "description": "the eventing domain associated with the event",
+ "type": "string",
+ "enum": [
+ "fault",
+ "heartbeat",
+ "measurementsForVfScaling",
+ "mobileFlow",
+ "other",
+ "stateChange",
+ "syslog",
+ "thresholdCrossingAlert"
+ ]
+ },
+ "eventId": {
+ "description": "event key that is unique to the event source",
+ "type": "string"
+ },
+ "eventType": {
+ "description": "unique event topic name",
+ "type": "string"
+ },
+ "functionalRole": {
+ "description": "function of the event source e.g., eNodeB, MME, PCRF",
+ "type": "string"
+ },
+ "internalHeaderFields": { "$ref": "#/definitions/internalHeaderFields" },
+ "lastEpochMicrosec": {
+ "description": "the latest unix time aka epoch time associated with the event from any component--as microseconds elapsed since 1 Jan 1970 not including leap seconds",
+ "type": "number"
+ },
+ "priority": {
+ "description": "processing priority",
+ "type": "string",
+ "enum": [
+ "High",
+ "Medium",
+ "Normal",
+ "Low"
+ ]
+ },
+ "reportingEntityId": {
+ "description": "UUID identifying the entity reporting the event, for example an OAM VM; must be populated by the ATT enrichment process",
+ "type": "string"
+ },
+ "reportingEntityName": {
+ "description": "name of the entity reporting the event, for example, an OAM VM",
+ "type": "string"
+ },
+ "sequence": {
+ "description": "ordering of events communicated by an event source instance or 0 if not needed",
+ "type": "integer"
+ },
+ "sourceId": {
+ "description": "UUID identifying the entity experiencing the event issue; must be populated by the ATT enrichment process",
+ "type": "string"
+ },
+ "sourceName": {
+ "description": "name of the entity experiencing the event issue",
+ "type": "string"
+ },
+ "startEpochMicrosec": {
+ "description": "the earliest unix time aka epoch time associated with the event from any component--as microseconds elapsed since 1 Jan 1970 not including leap seconds",
+ "type": "number"
+ },
+ "version": {
+ "description": "version of the event header",
+ "type": "number"
+ }
+ },
+ "required": [ "domain", "eventId", "functionalRole", "lastEpochMicrosec",
+ "priority", "reportingEntityName", "sequence",
+ "sourceName", "startEpochMicrosec" ]
+ },
+ "counter": {
+ "description": "performance counter",
+ "type": "object",
+ "properties": {
+ "criticality": { "type": "string", "enum": [ "CRIT", "MAJ" ] },
+ "name": { "type": "string" },
+ "thresholdCrossed": { "type": "string" },
+ "value": { "type": "string"}
+ },
+ "required": [ "criticality", "name", "thresholdCrossed", "value" ]
+ },
+ "cpuUsage": {
+ "description": "percent usage of an identified CPU",
+ "type": "object",
+ "properties": {
+ "cpuIdentifier": { "type": "string" },
+ "percentUsage": { "type": "number" }
+ },
+ "required": [ "cpuIdentifier", "percentUsage" ]
+ },
+ "errors": {
+ "description": "receive and transmit errors for the measurements domain",
+ "type": "object",
+ "properties": {
+ "receiveDiscards": { "type": "number" },
+ "receiveErrors": { "type": "number" },
+ "transmitDiscards": { "type": "number" },
+ "transmitErrors": { "type": "number" }
+ },
+ "required": [ "receiveDiscards", "receiveErrors", "transmitDiscards", "transmitErrors" ]
+ },
+ "event": {
+ "description": "the root level of the common event format",
+ "type": "object",
+ "properties": {
+ "commonEventHeader": { "$ref": "#/definitions/commonEventHeader" },
+ "faultFields": { "$ref": "#/definitions/faultFields" },
+ "measurementsForVfScalingFields": { "$ref": "#/definitions/measurementsForVfScalingFields" },
+ "mobileFlowFields": { "$ref": "#/definitions/mobileFlowFields" },
+ "otherFields": { "$ref": "#/definitions/otherFields" },
+ "stateChangeFields": { "$ref": "#/definitions/stateChangeFields" },
+ "syslogFields": { "$ref": "#/definitions/syslogFields" },
+ "thresholdCrossingAlertFields": { "$ref": "#/definitions/thresholdCrossingAlertFields" }
+ },
+ "required": [ "commonEventHeader" ]
+ },
+ "eventDomainThrottleSpecification": {
+ "description": "specification of what information to suppress within an event domain",
+ "type": "object",
+ "properties": {
+ "eventDomain": {
+ "description": "Event domain enum from the commonEventHeader domain field",
+ "type": "string"
+ },
+ "suppressedFieldNames": {
+ "description": "List of optional field names in the event block that should not be sent to the Event Listener",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "suppressedNvPairsList": {
+ "description": "Optional list of specific NvPairsNames to suppress within a given Name-Value Field",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/suppressedNvPairs"
+ }
+ }
+ },
+ "required": [ "eventDomain" ]
+ },
+ "eventDomainThrottleSpecificationList": {
+ "description": "array of eventDomainThrottleSpecifications",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/eventDomainThrottleSpecification"
+ },
+ "minItems": 0
+ },
+ "eventList": {
+ "description": "array of events",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/event"
+ }
+ },
+ "eventThrottlingState": {
+ "description": "reports the throttling in force at the event source",
+ "type": "object",
+ "properties": {
+ "eventThrottlingMode": {
+ "description": "Mode the event manager is in",
+ "type": "string",
+ "enum": [
+ "normal",
+ "throttled"
+ ]
+ },
+ "eventDomainThrottleSpecificationList": { "$ref": "#/definitions/eventDomainThrottleSpecificationList" }
+ },
+ "required": [ "eventThrottlingMode" ]
+ },
+ "faultFields": {
+ "description": "fields specific to fault events",
+ "type": "object",
+ "properties": {
+ "alarmAdditionalInformation": {
+ "description": "additional alarm information",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "alarmCondition": {
+ "description": "alarm condition reported by the device",
+ "type": "string"
+ },
+ "alarmInterfaceA": {
+ "description": "card, port, channel or interface name of the device generating the alarm",
+ "type": "string"
+ },
+ "eventSeverity": {
+ "description": "event severity or priority",
+ "type": "string",
+ "enum": [
+ "CRITICAL",
+ "MAJOR",
+ "MINOR",
+ "WARNING",
+ "NORMAL"
+ ]
+ },
+ "eventSourceType": {
+ "description": "type of event source; examples: other, router, switch, host, card, port, slotThreshold, portThreshold, virtualMachine, virtualNetworkFunction",
+ "type": "string"
+ },
+ "faultFieldsVersion": {
+ "description": "version of the faultFields block",
+ "type": "number"
+ },
+ "specificProblem": {
+ "description": "short description of the alarm or problem",
+ "type": "string"
+ },
+ "vfStatus": {
+ "description": "virtual function status enumeration",
+ "type": "string",
+ "enum": [
+ "Active",
+ "Idle",
+ "Preparing to terminate",
+ "Ready to terminate",
+ "Requesting termination"
+ ]
+ }
+ },
+ "required": [ "alarmCondition", "eventSeverity",
+ "eventSourceType", "specificProblem", "vfStatus" ]
+ },
+ "featuresInUse": {
+ "description": "number of times an identified feature was used over the measurementInterval",
+ "type": "object",
+ "properties": {
+ "featureIdentifier": { "type": "string" },
+ "featureUtilization": { "type": "number" }
+ },
+ "required": [ "featureIdentifier", "featureUtilization" ]
+ },
+ "field": {
+ "description": "name value pair",
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "value": { "type": "string" }
+ },
+ "required": [ "name", "value" ]
+ },
+ "filesystemUsage": {
+ "description": "disk usage of an identified virtual machine in gigabytes and/or gigabytes per second",
+ "type": "object",
+ "properties": {
+ "blockConfigured": { "type": "number" },
+ "blockIops": { "type": "number" },
+ "blockUsed": { "type": "number" },
+ "ephemeralConfigured": { "type": "number" },
+ "ephemeralIops": { "type": "number" },
+ "ephemeralUsed": { "type": "number" },
+ "filesystemName": { "type": "string" }
+ },
+ "required": [ "blockConfigured", "blockIops", "blockUsed", "ephemeralConfigured",
+ "ephemeralIops", "ephemeralUsed", "filesystemName" ]
+ },
+ "gtpPerFlowMetrics": {
+ "description": "Mobility GTP Protocol per flow metrics",
+ "type": "object",
+ "properties": {
+ "avgBitErrorRate": {
+ "description": "average bit error rate",
+ "type": "number"
+ },
+ "avgPacketDelayVariation": {
+ "description": "Average packet delay variation or jitter in milliseconds for received packets: Average difference between the packet timestamp and time received for all pairs of consecutive packets",
+ "type": "number"
+ },
+ "avgPacketLatency": {
+ "description": "average delivery latency",
+ "type": "number"
+ },
+ "avgReceiveThroughput": {
+ "description": "average receive throughput",
+ "type": "number"
+ },
+ "avgTransmitThroughput": {
+ "description": "average transmit throughput",
+ "type": "number"
+ },
+ "durConnectionFailedStatus": {
+ "description": "duration of failed state in milliseconds, computed as the cumulative time between a failed echo request and the next following successful error request, over this reporting interval",
+ "type": "number"
+ },
+ "durTunnelFailedStatus": {
+ "description": "Duration of errored state, computed as the cumulative time between a tunnel error indicator and the next following non-errored indicator, over this reporting interval",
+ "type": "number"
+ },
+ "flowActivatedBy": {
+ "description": "Endpoint activating the flow",
+ "type": "string"
+ },
+ "flowActivationEpoch": {
+ "description": "Time the connection is activated in the flow (connection) being reported on, or transmission time of the first packet if activation time is not available",
+ "type": "number"
+ },
+ "flowActivationMicrosec": {
+ "description": "Integer microseconds for the start of the flow connection",
+ "type": "number"
+ },
+ "flowActivationTime": {
+ "description": "time the connection is activated in the flow being reported on, or transmission time of the first packet if activation time is not available; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "flowDeactivatedBy": {
+ "description": "Endpoint deactivating the flow",
+ "type": "string"
+ },
+ "flowDeactivationEpoch": {
+ "description": "Time for the start of the flow connection, in integer UTC epoch time aka UNIX time",
+ "type": "number"
+ },
+ "flowDeactivationMicrosec": {
+ "description": "Integer microseconds for the start of the flow connection",
+ "type": "number"
+ },
+ "flowDeactivationTime": {
+ "description": "Transmission time of the first packet in the flow connection being reported on; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "flowStatus": {
+ "description": "connection status at reporting time as a working / inactive / failed indicator value",
+ "type": "string"
+ },
+ "gtpConnectionStatus": {
+ "description": "Current connection state at reporting time",
+ "type": "string"
+ },
+ "gtpTunnelStatus": {
+ "description": "Current tunnel state at reporting time",
+ "type": "string"
+ },
+ "ipTosCountList": {
+ "description": "array of key: value pairs where the keys are drawn from the IP Type-of-Service identifiers which range from '0' to '255', and the values are the count of packets that had those ToS identifiers in the flow",
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": [
+ { "type": "string" },
+ { "type": "number" }
+ ]
+ }
+ },
+ "ipTosList": {
+ "description": "Array of unique IP Type-of-Service values observed in the flow where values range from '0' to '255'",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "largePacketRtt": {
+ "description": "large packet round trip time",
+ "type": "number"
+ },
+ "largePacketThreshold": {
+ "description": "large packet threshold being applied",
+ "type": "number"
+ },
+ "maxPacketDelayVariation": {
+ "description": "Maximum packet delay variation or jitter in milliseconds for received packets: Maximum of the difference between the packet timestamp and time received for all pairs of consecutive packets",
+ "type": "number"
+ },
+ "maxReceiveBitRate": {
+ "description": "maximum receive bit rate",
+ "type": "number"
+ },
+ "maxTransmitBitRate": {
+ "description": "maximum transmit bit rate",
+ "type": "number"
+ },
+ "mobileQciCosCountList": {
+ "description": "array of key: value pairs where the keys are drawn from LTE QCI or UMTS class of service strings, and the values are the count of packets that had those strings in the flow",
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": [
+ { "type": "string" },
+ { "type": "number" }
+ ]
+ }
+ },
+ "mobileQciCosList": {
+ "description": "Array of unique LTE QCI or UMTS class-of-service values observed in the flow",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "numActivationFailures": {
+ "description": "Number of failed activation requests, as observed by the reporting node",
+ "type": "number"
+ },
+ "numBitErrors": {
+ "description": "number of errored bits",
+ "type": "number"
+ },
+ "numBytesReceived": {
+ "description": "number of bytes received, including retransmissions",
+ "type": "number"
+ },
+ "numBytesTransmitted": {
+ "description": "number of bytes transmitted, including retransmissions",
+ "type": "number"
+ },
+ "numDroppedPackets": {
+ "description": "number of received packets dropped due to errors per virtual interface",
+ "type": "number"
+ },
+ "numGtpEchoFailures": {
+ "description": "Number of Echo request path failures where failed paths are defined in 3GPP TS 29.281 sec 7.2.1 and 3GPP TS 29.060 sec. 11.2",
+ "type": "number"
+ },
+ "numGtpTunnelErrors": {
+ "description": "Number of tunnel error indications where errors are defined in 3GPP TS 29.281 sec 7.3.1 and 3GPP TS 29.060 sec. 11.1",
+ "type": "number"
+ },
+ "numHttpErrors": {
+ "description": "Http error count",
+ "type": "number"
+ },
+ "numL7BytesReceived": {
+ "description": "number of tunneled layer 7 bytes received, including retransmissions",
+ "type": "number"
+ },
+ "numL7BytesTransmitted": {
+ "description": "number of tunneled layer 7 bytes transmitted, excluding retransmissions",
+ "type": "number"
+ },
+ "numLostPackets": {
+ "description": "number of lost packets",
+ "type": "number"
+ },
+ "numOutOfOrderPackets": {
+ "description": "number of out-of-order packets",
+ "type": "number"
+ },
+ "numPacketErrors": {
+ "description": "number of errored packets",
+ "type": "number"
+ },
+ "numPacketsReceivedExclRetrans": {
+ "description": "number of packets received, excluding retransmission",
+ "type": "number"
+ },
+ "numPacketsReceivedInclRetrans": {
+ "description": "number of packets received, including retransmission",
+ "type": "number"
+ },
+ "numPacketsTransmittedInclRetrans": {
+ "description": "number of packets transmitted, including retransmissions",
+ "type": "number"
+ },
+ "numRetries": {
+ "description": "number of packet retries",
+ "type": "number"
+ },
+ "numTimeouts": {
+ "description": "number of packet timeouts",
+ "type": "number"
+ },
+ "numTunneledL7BytesReceived": {
+ "description": "number of tunneled layer 7 bytes received, excluding retransmissions",
+ "type": "number"
+ },
+ "roundTripTime": {
+ "description": "round trip time",
+ "type": "number"
+ },
+ "tcpFlagCountList": {
+ "description": "array of key: value pairs where the keys are drawn from TCP Flags and the values are the count of packets that had that TCP Flag in the flow",
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": [
+ { "type": "string" },
+ { "type": "number" }
+ ]
+ }
+ },
+ "tcpFlagList": {
+ "description": "Array of unique TCP Flags observed in the flow",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "timeToFirstByte": {
+ "description": "Time in milliseconds between the connection activation and first byte received",
+ "type": "number"
+ }
+ },
+ "required": [ "avgBitErrorRate", "avgPacketDelayVariation", "avgPacketLatency",
+ "avgReceiveThroughput", "avgTransmitThroughput",
+ "flowActivationEpoch", "flowActivationMicrosec",
+ "flowDeactivationEpoch", "flowDeactivationMicrosec",
+ "flowDeactivationTime", "flowStatus",
+ "maxPacketDelayVariation", "numActivationFailures",
+ "numBitErrors", "numBytesReceived", "numBytesTransmitted",
+ "numDroppedPackets", "numL7BytesReceived",
+ "numL7BytesTransmitted", "numLostPackets",
+ "numOutOfOrderPackets", "numPacketErrors",
+ "numPacketsReceivedExclRetrans",
+ "numPacketsReceivedInclRetrans",
+ "numPacketsTransmittedInclRetrans",
+ "numRetries", "numTimeouts", "numTunneledL7BytesReceived",
+ "roundTripTime", "timeToFirstByte"
+ ]
+ },
+ "internalHeaderFields": {
+ "description": "enrichment fields for internal VES Event Listener service use only, not supplied by event sources",
+ "type": "object"
+ },
+ "latencyBucketMeasure": {
+ "description": "number of counts falling within a defined latency bucket",
+ "type": "object",
+ "properties": {
+ "countsInTheBucket": { "type": "number" },
+ "highEndOfLatencyBucket": { "type": "number" },
+ "lowEndOfLatencyBucket": { "type": "number" }
+ },
+ "required": [ "countsInTheBucket" ]
+ },
+ "measurementGroup": {
+ "description": "measurement group",
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "measurements": {
+ "description": "array of name value pair measurements",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ }
+ },
+ "required": [ "name", "measurements" ]
+ },
+ "measurementsForVfScalingFields": {
+ "description": "measurementsForVfScaling fields",
+ "type": "object",
+ "properties": {
+ "additionalMeasurements": {
+ "description": "additional measurement fields",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/measurementGroup"
+ }
+ },
+ "aggregateCpuUsage": {
+ "description": "aggregate CPU usage of the VM on which the VNFC reporting the event is running",
+ "type": "number"
+ },
+ "codecUsageArray": {
+ "description": "array of codecs in use",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/codecsInUse"
+ }
+ },
+ "concurrentSessions": {
+ "description": "peak concurrent sessions for the VM or VNF over the measurementInterval",
+ "type": "number"
+ },
+ "configuredEntities": {
+ "description": "over the measurementInterval, peak total number of: users, subscribers, devices, adjacencies, etc., for the VM, or subscribers, devices, etc., for the VNF",
+ "type": "number"
+ },
+ "cpuUsageArray": {
+ "description": "usage of an array of CPUs",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/cpuUsage"
+ }
+ },
+ "errors": { "$ref": "#/definitions/errors" },
+ "featureUsageArray": {
+ "description": "array of features in use",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/featuresInUse"
+ }
+ },
+ "filesystemUsageArray": {
+ "description": "filesystem usage of the VM on which the VNFC reporting the event is running",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/filesystemUsage"
+ }
+ },
+ "latencyDistribution": {
+ "description": "array of integers representing counts of requests whose latency in milliseconds falls within per-VNF configured ranges",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/latencyBucketMeasure"
+ }
+ },
+ "meanRequestLatency": {
+ "description": "mean seconds required to respond to each request for the VM on which the VNFC reporting the event is running",
+ "type": "number"
+ },
+ "measurementInterval": {
+ "description": "interval over which measurements are being reported in seconds",
+ "type": "number"
+ },
+ "measurementsForVfScalingVersion": {
+ "description": "version of the measurementsForVfScaling block",
+ "type": "number"
+ },
+ "memoryConfigured": {
+ "description": "memory in MB configured in the VM on which the VNFC reporting the event is running",
+ "type": "number"
+ },
+ "memoryUsed": {
+ "description": "memory usage in MB of the VM on which the VNFC reporting the event is running",
+ "type": "number"
+ },
+ "numberOfMediaPortsInUse": {
+ "description": "number of media ports in use",
+ "type": "number"
+ },
+ "requestRate": {
+ "description": "peak rate of service requests per second to the VNF over the measurementInterval",
+ "type": "number"
+ },
+ "vnfcScalingMetric": {
+ "description": "represents busy-ness of the VNF from 0 to 100 as reported by the VNFC",
+ "type": "number"
+ },
+ "vNicUsageArray": {
+ "description": "usage of an array of virtual network interface cards",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/vNicUsage"
+ }
+ }
+ },
+ "required": [ "measurementInterval" ]
+ },
+ "mobileFlowFields": {
+ "description": "mobileFlow fields",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional mobileFlow fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "applicationType": {
+ "description": "Application type inferred",
+ "type": "string"
+ },
+ "appProtocolType": {
+ "description": "application protocol",
+ "type": "string"
+ },
+ "appProtocolVersion": {
+ "description": "application protocol version",
+ "type": "string"
+ },
+ "cid": {
+ "description": "cell id",
+ "type": "string"
+ },
+ "connectionType": {
+ "description": "Abbreviation referencing a 3GPP reference point e.g., S1-U, S11, etc",
+ "type": "string"
+ },
+ "ecgi": {
+ "description": "Evolved Cell Global Id",
+ "type": "string"
+ },
+ "flowDirection": {
+ "description": "Flow direction, indicating if the reporting node is the source of the flow or destination for the flow",
+ "type": "string"
+ },
+ "gtpPerFlowMetrics": { "$ref": "#/definitions/gtpPerFlowMetrics" },
+ "gtpProtocolType": {
+ "description": "GTP protocol",
+ "type": "string"
+ },
+ "gtpVersion": {
+ "description": "GTP protocol version",
+ "type": "string"
+ },
+ "httpHeader": {
+ "description": "HTTP request header, if the flow connects to a node referenced by HTTP",
+ "type": "string"
+ },
+ "imei": {
+ "description": "IMEI for the subscriber UE used in this flow, if the flow connects to a mobile device",
+ "type": "string"
+ },
+ "imsi": {
+ "description": "IMSI for the subscriber UE used in this flow, if the flow connects to a mobile device",
+ "type": "string"
+ },
+ "ipProtocolType": {
+ "description": "IP protocol type e.g., TCP, UDP, RTP...",
+ "type": "string"
+ },
+ "ipVersion": {
+ "description": "IP protocol version e.g., IPv4, IPv6",
+ "type": "string"
+ },
+ "lac": {
+ "description": "location area code",
+ "type": "string"
+ },
+ "mcc": {
+ "description": "mobile country code",
+ "type": "string"
+ },
+ "mnc": {
+ "description": "mobile network code",
+ "type": "string"
+ },
+ "mobileFlowFieldsVersion": {
+ "description": "version of the mobileFlowFields block",
+ "type": "number"
+ },
+ "msisdn": {
+ "description": "MSISDN for the subscriber UE used in this flow, as an integer, if the flow connects to a mobile device",
+ "type": "string"
+ },
+ "otherEndpointIpAddress": {
+ "description": "IP address for the other endpoint, as used for the flow being reported on",
+ "type": "string"
+ },
+ "otherEndpointPort": {
+ "description": "IP Port for the reporting entity, as used for the flow being reported on",
+ "type": "number"
+ },
+ "otherFunctionalRole": {
+ "description": "Functional role of the other endpoint for the flow being reported on e.g., MME, S-GW, P-GW, PCRF...",
+ "type": "string"
+ },
+ "rac": {
+ "description": "routing area code",
+ "type": "string"
+ },
+ "radioAccessTechnology": {
+ "description": "Radio Access Technology e.g., 2G, 3G, LTE",
+ "type": "string"
+ },
+ "reportingEndpointIpAddr": {
+ "description": "IP address for the reporting entity, as used for the flow being reported on",
+ "type": "string"
+ },
+ "reportingEndpointPort": {
+ "description": "IP port for the reporting entity, as used for the flow being reported on",
+ "type": "number"
+ },
+ "sac": {
+ "description": "service area code",
+ "type": "string"
+ },
+ "samplingAlgorithm": {
+ "description": "Integer identifier for the sampling algorithm or rule being applied in calculating the flow metrics if metrics are calculated based on a sample of packets, or 0 if no sampling is applied",
+ "type": "number"
+ },
+ "tac": {
+ "description": "transport area code",
+ "type": "string"
+ },
+ "tunnelId": {
+ "description": "tunnel identifier",
+ "type": "string"
+ },
+ "vlanId": {
+ "description": "VLAN identifier used by this flow",
+ "type": "string"
+ }
+ },
+ "required": [ "flowDirection", "gtpPerFlowMetrics", "ipProtocolType",
+ "ipVersion", "otherEndpointIpAddress", "otherEndpointPort",
+ "reportingEndpointIpAddr", "reportingEndpointPort" ]
+ },
+ "otherFields": {
+ "description": "additional fields not reported elsewhere",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "requestError": {
+ "description": "standard request error data structure",
+ "type": "object",
+ "properties": {
+ "messageId": {
+ "description": "Unique message identifier of the format ABCnnnn where ABC is either SVC for Service Exceptions or POL for Policy Exception",
+ "type": "string"
+ },
+ "text": {
+ "description": "Message text, with replacement variables marked with %n, where n is an index into the list of <variables> elements, starting at 1",
+ "type": "string"
+ },
+ "url": {
+ "description": "Hyperlink to a detailed error resource e.g., an HTML page for browser user agents",
+ "type": "string"
+ },
+ "variables": {
+ "description": "List of zero or more strings that represent the contents of the variables used by the message text",
+ "type": "string"
+ }
+ },
+ "required": [ "messageId", "text" ]
+ },
+ "stateChangeFields": {
+ "description": "stateChange fields",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional stateChange fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "newState": {
+ "description": "new state of the entity",
+ "type": "string",
+ "enum": [
+ "inService",
+ "maintenance",
+ "outOfService"
+ ]
+ },
+ "oldState": {
+ "description": "previous state of the entity",
+ "type": "string",
+ "enum": [
+ "inService",
+ "maintenance",
+ "outOfService"
+ ]
+ },
+ "stateChangeFieldsVersion": {
+ "description": "version of the stateChangeFields block",
+ "type": "number"
+ },
+ "stateInterface": {
+ "description": "card or port name of the entity that changed state",
+ "type": "string"
+ }
+ },
+ "required": [ "newState", "oldState", "stateInterface" ]
+ },
+ "suppressedNvPairs": {
+ "description": "List of specific NvPairsNames to suppress within a given Name-Value Field for event Throttling",
+ "type": "object",
+ "properties": {
+ "nvPairFieldName": {
+ "description": "Name of the field within which are the nvpair names to suppress",
+ "type": "string"
+ },
+ "suppressedNvPairNames": {
+ "description": "Array of nvpair names to suppress within the nvpairFieldName",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "required": [ "nvPairFieldName", "suppressedNvPairNames" ]
+ },
+ "syslogFields": {
+ "description": "sysLog fields",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional syslog fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "eventSourceHost": {
+ "description": "hostname of the device",
+ "type": "string"
+ },
+ "eventSourceType": {
+ "description": "type of event source; examples: other, router, switch, host, card, port, slotThreshold, portThreshold, virtualMachine, virtualNetworkFunction",
+ "type": "string"
+ },
+ "syslogFacility": {
+ "description": "numeric code from 0 to 23 for facility--see table in documentation",
+ "type": "number"
+ },
+ "syslogFieldsVersion": {
+ "description": "version of the syslogFields block",
+ "type": "number"
+ },
+ "syslogMsg": {
+ "description": "syslog message",
+ "type": "string"
+ },
+ "syslogPri": {
+ "description": "0-192 combined severity and facility",
+ "type": "number"
+ },
+ "syslogProc": {
+ "description": "identifies the application that originated the message",
+ "type": "string"
+ },
+ "syslogProcId": {
+ "description": "a change in the value of this field indicates a discontinuity in syslog reporting",
+ "type": "number"
+ },
+ "syslogSData": {
+ "description": "syslog structured data consisting of a structured data Id followed by a set of key value pairs",
+ "type": "string"
+ },
+ "syslogSdId": {
+ "description": "0-32 char in format name@number for example ourSDID@32473",
+ "type": "string"
+ },
+ "syslogSev": {
+ "description": "numerical Code for severity derived from syslogPri as remaider of syslogPri / 8",
+ "type": "string"
+ },
+ "syslogTag": {
+ "description": "msgId indicating the type of message such as TCPOUT or TCPIN; NILVALUE should be used when no other value can be provided",
+ "type": "string"
+ },
+ "syslogVer": {
+ "description": "IANA assigned version of the syslog protocol specification - typically 1",
+ "type": "number"
+ }
+ },
+ "required": [ "eventSourceType", "syslogMsg", "syslogTag" ]
+ },
+ "thresholdCrossingAlertFields": {
+ "description": "fields specific to threshold crossing alert events",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional threshold crossing alert fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "additionalParameters": {
+ "description": "performance counters",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/counter"
+ }
+ },
+ "alertAction": {
+ "description": "Event action",
+ "type": "string",
+ "enum": [
+ "CLEAR",
+ "CONT",
+ "SET"
+ ]
+ },
+ "alertDescription": {
+ "description": "Unique short alert description such as IF-SHUB-ERRDROP",
+ "type": "string"
+ },
+ "alertType": {
+ "description": "Event type",
+ "type": "string",
+ "enum": [
+ "CARD-ANOMALY",
+ "ELEMENT-ANOMALY",
+ "INTERFACE-ANOMALY",
+ "SERVICE-ANOMALY"
+ ]
+ },
+ "alertValue": {
+ "description": "Calculated API value (if applicable)",
+ "type": "string"
+ },
+ "associatedAlertIdList": {
+ "description": "List of eventIds associated with the event being reported",
+ "type": "array",
+ "items": { "type": "string" }
+ },
+ "collectionTimestamp": {
+ "description": "Time when the performance collector picked up the data; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "dataCollector": {
+ "description": "Specific performance collector instance used",
+ "type": "string"
+ },
+ "elementType": {
+ "description": "type of network element - internal ATT field",
+ "type": "string"
+ },
+ "eventSeverity": {
+ "description": "event severity or priority",
+ "type": "string",
+ "enum": [
+ "CRITICAL",
+ "MAJOR",
+ "MINOR",
+ "WARNING",
+ "NORMAL"
+ ]
+ },
+ "eventStartTimestamp": {
+ "description": "Time closest to when the measurement was made; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "interfaceName": {
+ "description": "Physical or logical port or card (if applicable)",
+ "type": "string"
+ },
+ "networkService": {
+ "description": "network name - internal ATT field",
+ "type": "string"
+ },
+ "possibleRootCause": {
+ "description": "Reserved for future use",
+ "type": "string"
+ },
+ "thresholdCrossingFieldsVersion": {
+ "description": "version of the thresholdCrossingAlertFields block",
+ "type": "number"
+ }
+ },
+ "required": [
+ "additionalParameters",
+ "alertAction",
+ "alertDescription",
+ "alertType",
+ "collectionTimestamp",
+ "eventSeverity",
+ "eventStartTimestamp"
+ ]
+ },
+ "vNicUsage": {
+ "description": "usage of identified virtual network interface card",
+ "type": "object",
+ "properties": {
+ "broadcastPacketsIn": { "type": "number" },
+ "broadcastPacketsOut": { "type": "number" },
+ "bytesIn": { "type": "number" },
+ "bytesOut": { "type": "number" },
+ "multicastPacketsIn": { "type": "number" },
+ "multicastPacketsOut": { "type": "number" },
+ "packetsIn": { "type": "number" },
+ "packetsOut": { "type": "number" },
+ "unicastPacketsIn": { "type": "number" },
+ "unicastPacketsOut": { "type": "number" },
+ "vNicIdentifier": { "type": "string" }
+ },
+ "required": [ "bytesIn", "bytesOut", "packetsIn", "packetsOut", "vNicIdentifier"]
+ }
+ },
+ "title": "Event Listener",
+ "type": "object",
+ "properties": {
+ "event": {"$ref": "#/definitions/event"}
+ }
+ }
+
+}
diff --git a/tests/dcaegen2/testcases/resources/VES-5.28.4-dataformat.json b/tests/dcaegen2/testcases/resources/VES-5.28.4-dataformat.json
new file mode 100644
index 00000000..386b5e67
--- /dev/null
+++ b/tests/dcaegen2/testcases/resources/VES-5.28.4-dataformat.json
@@ -0,0 +1,1995 @@
+{
+ "self": {
+ "name": "VES_specification",
+ "version": "5.28.4",
+ "description": "VES spec for 5.4"
+ },
+ "dataformatversion": "1.0.0",
+ "jsonschema": {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "VES Event Listener",
+ "type": "object",
+ "properties": {
+ "event": {
+ "$ref": "#/definitions/event"
+ },
+ "eventList": {
+ "$ref": "#/definitions/eventList"
+ }
+ },
+
+ "definitions": {
+ "schemaHeaderBlock": {
+ "description": "schema date, version, author and associated API",
+ "type": "object",
+ "properties": {
+ "associatedApi": {
+ "description": "VES Event Listener",
+ "type": "string"
+ },
+ "lastUpdatedBy": {
+ "description": "re2947",
+ "type": "string"
+ },
+ "schemaDate": {
+ "description": "September 12, 2017",
+ "type": "string"
+ },
+ "schemaVersion": {
+ "description": "28.4",
+ "type": "number"
+ }
+ }
+ },
+ "attCopyrightNotice": {
+ "description": "Copyright (c) <2017>, AT&T Intellectual Property. All rights reserved. Licensed under the Apache License, Version 2.0 (the License)",
+ "type": "object",
+ "properties": {
+ "useAndRedistribution": {
+ "description": "You may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0",
+ "type": "string"
+ },
+ "licenseLink": {
+ "description": "http://www.apache.org/licenses/LICENSE-2.0",
+ "type":"string"
+ },
+ "condition1": {
+ "description": "Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an AS IS BASIS,",
+ "type": "string"
+ },
+ "condition2": {
+ "description": "Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.",
+ "type": "string"
+ },
+ "condition3": {
+ "description": "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.",
+ "type": "string"
+ },
+ "condition4": {
+ "description": "See the License for the specific language governing permissions and limitations under the License.",
+ "type": "string"
+ },
+ "Trademarks": {
+ "description": "ECOMP and OpenECOMP are trademarks and service marks of AT&T Intellectual Property.",
+ "type": "string"
+ }
+ }
+ },
+
+ "codecsInUse": {
+ "description": "number of times an identified codec was used over the measurementInterval",
+ "type": "object",
+ "properties": {
+ "codecIdentifier": {
+ "type": "string"
+ },
+ "numberInUse": {
+ "type": "integer"
+ }
+ },
+ "required": ["codecIdentifier", "numberInUse"]
+ },
+ "command": {
+ "description": "command from an event collector toward an event source",
+ "type": "object",
+ "properties": {
+ "commandType": {
+ "type": "string",
+ "enum": [
+ "heartbeatIntervalChange",
+ "measurementIntervalChange",
+ "provideThrottlingState",
+ "throttlingSpecification"
+ ]
+ },
+ "eventDomainThrottleSpecification": {
+ "$ref": "#/definitions/eventDomainThrottleSpecification"
+ },
+ "heartbeatInterval": {
+ "type": "integer"
+ },
+ "measurementInterval": {
+ "type": "integer"
+ }
+ },
+ "required": ["commandType"]
+ },
+ "commandList": {
+ "description": "array of commands from an event collector toward an event source",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/command"
+ },
+ "minItems": 0
+ },
+ "commonEventHeader": {
+ "description": "fields common to all events",
+ "type": "object",
+ "properties": {
+ "domain": {
+ "description": "the eventing domain associated with the event",
+ "type": "string",
+ "enum": [
+ "fault",
+ "heartbeat",
+ "measurementsForVfScaling",
+ "mobileFlow",
+ "other",
+ "sipSignaling",
+ "stateChange",
+ "syslog",
+ "thresholdCrossingAlert",
+ "voiceQuality"
+ ]
+ },
+ "eventId": {
+ "description": "event key that is unique to the event source",
+ "type": "string"
+ },
+ "eventName": {
+ "description": "unique event name",
+ "type": "string"
+ },
+ "eventType": {
+ "description": "for example - applicationVnf, guestOS, hostOS, platform",
+ "type": "string"
+ },
+ "internalHeaderFields": {
+ "$ref": "#/definitions/internalHeaderFields"
+ },
+ "lastEpochMicrosec": {
+ "description": "the latest unix time aka epoch time associated with the event from any component--as microseconds elapsed since 1 Jan 1970 not including leap seconds",
+ "type": "number"
+ },
+ "nfcNamingCode": {
+ "description": "3 character network function component type, aligned with vfc naming standards",
+ "type": "string"
+ },
+ "nfNamingCode": {
+ "description": "4 character network function type, aligned with vnf naming standards",
+ "type": "string"
+ },
+ "priority": {
+ "description": "processing priority",
+ "type": "string",
+ "enum": [
+ "High",
+ "Medium",
+ "Normal",
+ "Low"
+ ]
+ },
+ "reportingEntityId": {
+ "description": "UUID identifying the entity reporting the event, for example an OAM VM; must be populated by the ATT enrichment process",
+ "type": "string"
+ },
+ "reportingEntityName": {
+ "description": "name of the entity reporting the event, for example, an EMS name; may be the same as sourceName",
+ "type": "string"
+ },
+ "sequence": {
+ "description": "ordering of events communicated by an event source instance or 0 if not needed",
+ "type": "integer"
+ },
+ "sourceId": {
+ "description": "UUID identifying the entity experiencing the event issue; must be populated by the ATT enrichment process",
+ "type": "string"
+ },
+ "sourceName": {
+ "description": "name of the entity experiencing the event issue",
+ "type": "string"
+ },
+ "startEpochMicrosec": {
+ "description": "the earliest unix time aka epoch time associated with the event from any component--as microseconds elapsed since 1 Jan 1970 not including leap seconds",
+ "type": "number"
+ },
+ "version": {
+ "description": "version of the event header",
+ "type": "number"
+ }
+ },
+ "required": ["domain", "eventId", "eventName", "lastEpochMicrosec",
+ "priority", "reportingEntityName", "sequence", "sourceName",
+ "startEpochMicrosec", "version"
+ ]
+ },
+ "counter": {
+ "description": "performance counter",
+ "type": "object",
+ "properties": {
+ "criticality": {
+ "type": "string",
+ "enum": ["CRIT", "MAJ"]
+ },
+ "name": {
+ "type": "string"
+ },
+ "thresholdCrossed": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "required": ["criticality", "name", "thresholdCrossed", "value"]
+ },
+ "cpuUsage": {
+ "description": "usage of an identified CPU",
+ "type": "object",
+ "properties": {
+ "cpuIdentifier": {
+ "description": "cpu identifer",
+ "type": "string"
+ },
+ "cpuIdle": {
+ "description": "percentage of CPU time spent in the idle task",
+ "type": "number"
+ },
+ "cpuUsageInterrupt": {
+ "description": "percentage of time spent servicing interrupts",
+ "type": "number"
+ },
+ "cpuUsageNice": {
+ "description": "percentage of time spent running user space processes that have been niced",
+ "type": "number"
+ },
+ "cpuUsageSoftIrq": {
+ "description": "percentage of time spent handling soft irq interrupts",
+ "type": "number"
+ },
+ "cpuUsageSteal": {
+ "description": "percentage of time spent in involuntary wait which is neither user, system or idle time and is effectively time that went missing",
+ "type": "number"
+ },
+ "cpuUsageSystem": {
+ "description": "percentage of time spent on system tasks running the kernel",
+ "type": "number"
+ },
+ "cpuUsageUser": {
+ "description": "percentage of time spent running un-niced user space processes",
+ "type": "number"
+ },
+ "cpuWait": {
+ "description": "percentage of CPU time spent waiting for I/O operations to complete",
+ "type": "number"
+ },
+ "percentUsage": {
+ "description": "aggregate cpu usage of the virtual machine on which the VNFC reporting the event is running",
+ "type": "number"
+ }
+ },
+ "required": ["cpuIdentifier", "percentUsage"]
+ },
+ "diskUsage": {
+ "description": "usage of an identified disk",
+ "type": "object",
+ "properties": {
+ "diskIdentifier": {
+ "description": "disk identifier",
+ "type": "string"
+ },
+ "diskIoTimeAvg": {
+ "description": "milliseconds spent doing input/output operations over 1 sec; treat this metric as a device load percentage where 1000ms matches 100% load; provide the average over the measurement interval",
+ "type": "number"
+ },
+ "diskIoTimeLast": {
+ "description": "milliseconds spent doing input/output operations over 1 sec; treat this metric as a device load percentage where 1000ms matches 100% load; provide the last value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskIoTimeMax": {
+ "description": "milliseconds spent doing input/output operations over 1 sec; treat this metric as a device load percentage where 1000ms matches 100% load; provide the maximum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskIoTimeMin": {
+ "description": "milliseconds spent doing input/output operations over 1 sec; treat this metric as a device load percentage where 1000ms matches 100% load; provide the minimum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedReadAvg": {
+ "description": "number of logical read operations that were merged into physical read operations, e.g., two logical reads were served by one physical disk access; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedReadLast": {
+ "description": "number of logical read operations that were merged into physical read operations, e.g., two logical reads were served by one physical disk access; provide the last value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedReadMax": {
+ "description": "number of logical read operations that were merged into physical read operations, e.g., two logical reads were served by one physical disk access; provide the maximum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedReadMin": {
+ "description": "number of logical read operations that were merged into physical read operations, e.g., two logical reads were served by one physical disk access; provide the minimum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedWriteAvg": {
+ "description": "number of logical write operations that were merged into physical write operations, e.g., two logical writes were served by one physical disk access; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedWriteLast": {
+ "description": "number of logical write operations that were merged into physical write operations, e.g., two logical writes were served by one physical disk access; provide the last value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedWriteMax": {
+ "description": "number of logical write operations that were merged into physical write operations, e.g., two logical writes were served by one physical disk access; provide the maximum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskMergedWriteMin": {
+ "description": "number of logical write operations that were merged into physical write operations, e.g., two logical writes were served by one physical disk access; provide the minimum value measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsReadAvg": {
+ "description": "number of octets per second read from a disk or partition; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsReadLast": {
+ "description": "number of octets per second read from a disk or partition; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsReadMax": {
+ "description": "number of octets per second read from a disk or partition; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsReadMin": {
+ "description": "number of octets per second read from a disk or partition; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsWriteAvg": {
+ "description": "number of octets per second written to a disk or partition; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsWriteLast": {
+ "description": "number of octets per second written to a disk or partition; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsWriteMax": {
+ "description": "number of octets per second written to a disk or partition; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOctetsWriteMin": {
+ "description": "number of octets per second written to a disk or partition; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsReadAvg": {
+ "description": "number of read operations per second issued to the disk; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsReadLast": {
+ "description": "number of read operations per second issued to the disk; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsReadMax": {
+ "description": "number of read operations per second issued to the disk; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsReadMin": {
+ "description": "number of read operations per second issued to the disk; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsWriteAvg": {
+ "description": "number of write operations per second issued to the disk; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsWriteLast": {
+ "description": "number of write operations per second issued to the disk; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsWriteMax": {
+ "description": "number of write operations per second issued to the disk; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskOpsWriteMin": {
+ "description": "number of write operations per second issued to the disk; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskPendingOperationsAvg": {
+ "description": "queue size of pending I/O operations per second; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskPendingOperationsLast": {
+ "description": "queue size of pending I/O operations per second; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskPendingOperationsMax": {
+ "description": "queue size of pending I/O operations per second; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskPendingOperationsMin": {
+ "description": "queue size of pending I/O operations per second; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeReadAvg": {
+ "description": "milliseconds a read operation took to complete; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeReadLast": {
+ "description": "milliseconds a read operation took to complete; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeReadMax": {
+ "description": "milliseconds a read operation took to complete; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeReadMin": {
+ "description": "milliseconds a read operation took to complete; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeWriteAvg": {
+ "description": "milliseconds a write operation took to complete; provide the average measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeWriteLast": {
+ "description": "milliseconds a write operation took to complete; provide the last measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeWriteMax": {
+ "description": "milliseconds a write operation took to complete; provide the maximum measurement within the measurement interval",
+ "type": "number"
+ },
+ "diskTimeWriteMin": {
+ "description": "milliseconds a write operation took to complete; provide the minimum measurement within the measurement interval",
+ "type": "number"
+ }
+ },
+ "required": ["diskIdentifier"]
+ },
+ "endOfCallVqmSummaries": {
+ "description": "provides end of call voice quality metrics",
+ "type": "object",
+ "properties": {
+ "adjacencyName": {
+ "description": " adjacency name",
+ "type": "string"
+ },
+ "endpointDescription": {
+ "description": "Either Caller or Callee",
+ "type": "string",
+ "enum": ["Caller", "Callee"]
+ },
+ "endpointJitter": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpOctetsDiscarded": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpOctetsReceived": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpOctetsSent": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpPacketsDiscarded": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpPacketsReceived": {
+ "description": "",
+ "type": "number"
+ },
+ "endpointRtpPacketsSent": {
+ "description": "",
+ "type": "number"
+ },
+ "localJitter": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpOctetsDiscarded": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpOctetsReceived": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpOctetsSent": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpPacketsDiscarded": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpPacketsReceived": {
+ "description": "",
+ "type": "number"
+ },
+ "localRtpPacketsSent": {
+ "description": "",
+ "type": "number"
+ },
+ "mosCqe": {
+ "description": "1-5 1dp",
+ "type": "number"
+ },
+ "packetsLost": {
+ "description": "",
+ "type": "number"
+ },
+ "packetLossPercent": {
+ "description": "Calculated percentage packet loss based on Endpoint RTP packets lost (as reported in RTCP) and Local RTP packets sent. Direction is based on Endpoint description (Caller, Callee). Decimal (2 dp)",
+ "type": "number"
+ },
+ "rFactor": {
+ "description": "0-100",
+ "type": "number"
+ },
+ "roundTripDelay": {
+ "description": "millisecs",
+ "type": "number"
+ }
+ },
+ "required": ["adjacencyName", "endpointDescription"]
+ },
+ "event": {
+ "description": "the root level of the common event format",
+ "type": "object",
+ "properties": {
+ "commonEventHeader": {
+ "$ref": "#/definitions/commonEventHeader"
+ },
+ "faultFields": {
+ "$ref": "#/definitions/faultFields"
+ },
+ "heartbeatFields": {
+ "$ref": "#/definitions/heartbeatFields"
+ },
+ "measurementsForVfScalingFields": {
+ "$ref": "#/definitions/measurementsForVfScalingFields"
+ },
+ "mobileFlowFields": {
+ "$ref": "#/definitions/mobileFlowFields"
+ },
+ "otherFields": {
+ "$ref": "#/definitions/otherFields"
+ },
+ "sipSignalingFields": {
+ "$ref": "#/definitions/sipSignalingFields"
+ },
+ "stateChangeFields": {
+ "$ref": "#/definitions/stateChangeFields"
+ },
+ "syslogFields": {
+ "$ref": "#/definitions/syslogFields"
+ },
+ "thresholdCrossingAlertFields": {
+ "$ref": "#/definitions/thresholdCrossingAlertFields"
+ },
+ "voiceQualityFields": {
+ "$ref": "#/definitions/voiceQualityFields"
+ }
+ },
+ "required": ["commonEventHeader"]
+ },
+ "eventDomainThrottleSpecification": {
+ "description": "specification of what information to suppress within an event domain",
+ "type": "object",
+ "properties": {
+ "eventDomain": {
+ "description": "Event domain enum from the commonEventHeader domain field",
+ "type": "string"
+ },
+ "suppressedFieldNames": {
+ "description": "List of optional field names in the event block that should not be sent to the Event Listener",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "suppressedNvPairsList": {
+ "description": "Optional list of specific NvPairsNames to suppress within a given Name-Value Field",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/suppressedNvPairs"
+ }
+ }
+ },
+ "required": ["eventDomain"]
+ },
+ "eventDomainThrottleSpecificationList": {
+ "description": "array of eventDomainThrottleSpecifications",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/eventDomainThrottleSpecification"
+ },
+ "minItems": 0
+ },
+ "eventList": {
+ "description": "array of events",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/event"
+ }
+ },
+ "eventThrottlingState": {
+ "description": "reports the throttling in force at the event source",
+ "type": "object",
+ "properties": {
+ "eventThrottlingMode": {
+ "description": "Mode the event manager is in",
+ "type": "string",
+ "enum": [
+ "normal",
+ "throttled"
+ ]
+ },
+ "eventDomainThrottleSpecificationList": {
+ "$ref": "#/definitions/eventDomainThrottleSpecificationList"
+ }
+ },
+ "required": ["eventThrottlingMode"]
+ },
+ "faultFields": {
+ "description": "fields specific to fault events",
+ "type": "object",
+ "properties": {
+ "alarmAdditionalInformation": {
+ "description": "additional alarm information",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "alarmCondition": {
+ "description": "alarm condition reported by the device",
+ "type": "string"
+ },
+ "alarmInterfaceA": {
+ "description": "card, port, channel or interface name of the device generating the alarm",
+ "type": "string"
+ },
+ "eventCategory": {
+ "description": "Event category, for example: license, link, routing, security, signaling",
+ "type": "string"
+ },
+ "eventSeverity": {
+ "description": "event severity",
+ "type": "string",
+ "enum": [
+ "CRITICAL",
+ "MAJOR",
+ "MINOR",
+ "WARNING",
+ "NORMAL"
+ ]
+ },
+ "eventSourceType": {
+ "description": "type of event source; examples: card, host, other, port, portThreshold, router, slotThreshold, switch, virtualMachine, virtualNetworkFunction",
+ "type": "string"
+ },
+ "faultFieldsVersion": {
+ "description": "version of the faultFields block",
+ "type": "number"
+ },
+ "specificProblem": {
+ "description": "short description of the alarm or problem",
+ "type": "string"
+ },
+ "vfStatus": {
+ "description": "virtual function status enumeration",
+ "type": "string",
+ "enum": [
+ "Active",
+ "Idle",
+ "Preparing to terminate",
+ "Ready to terminate",
+ "Requesting termination"
+ ]
+ }
+ },
+ "required": ["alarmCondition", "eventSeverity", "eventSourceType",
+ "faultFieldsVersion", "specificProblem", "vfStatus"
+ ]
+ },
+ "featuresInUse": {
+ "description": "number of times an identified feature was used over the measurementInterval",
+ "type": "object",
+ "properties": {
+ "featureIdentifier": {
+ "type": "string"
+ },
+ "featureUtilization": {
+ "type": "integer"
+ }
+ },
+ "required": ["featureIdentifier", "featureUtilization"]
+ },
+ "field": {
+ "description": "name value pair",
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "required": ["name", "value"]
+ },
+ "filesystemUsage": {
+ "description": "disk usage of an identified virtual machine in gigabytes and/or gigabytes per second",
+ "type": "object",
+ "properties": {
+ "blockConfigured": {
+ "type": "number"
+ },
+ "blockIops": {
+ "type": "number"
+ },
+ "blockUsed": {
+ "type": "number"
+ },
+ "ephemeralConfigured": {
+ "type": "number"
+ },
+ "ephemeralIops": {
+ "type": "number"
+ },
+ "ephemeralUsed": {
+ "type": "number"
+ },
+ "filesystemName": {
+ "type": "string"
+ }
+ },
+ "required": ["blockConfigured", "blockIops", "blockUsed", "ephemeralConfigured",
+ "ephemeralIops", "ephemeralUsed", "filesystemName"
+ ]
+ },
+ "gtpPerFlowMetrics": {
+ "description": "Mobility GTP Protocol per flow metrics",
+ "type": "object",
+ "properties": {
+ "avgBitErrorRate": {
+ "description": "average bit error rate",
+ "type": "number"
+ },
+ "avgPacketDelayVariation": {
+ "description": "Average packet delay variation or jitter in milliseconds for received packets: Average difference between the packet timestamp and time received for all pairs of consecutive packets",
+ "type": "number"
+ },
+ "avgPacketLatency": {
+ "description": "average delivery latency",
+ "type": "number"
+ },
+ "avgReceiveThroughput": {
+ "description": "average receive throughput",
+ "type": "number"
+ },
+ "avgTransmitThroughput": {
+ "description": "average transmit throughput",
+ "type": "number"
+ },
+ "durConnectionFailedStatus": {
+ "description": "duration of failed state in milliseconds, computed as the cumulative time between a failed echo request and the next following successful error request, over this reporting interval",
+ "type": "number"
+ },
+ "durTunnelFailedStatus": {
+ "description": "Duration of errored state, computed as the cumulative time between a tunnel error indicator and the next following non-errored indicator, over this reporting interval",
+ "type": "number"
+ },
+ "flowActivatedBy": {
+ "description": "Endpoint activating the flow",
+ "type": "string"
+ },
+ "flowActivationEpoch": {
+ "description": "Time the connection is activated in the flow (connection) being reported on, or transmission time of the first packet if activation time is not available",
+ "type": "number"
+ },
+ "flowActivationMicrosec": {
+ "description": "Integer microseconds for the start of the flow connection",
+ "type": "number"
+ },
+ "flowActivationTime": {
+ "description": "time the connection is activated in the flow being reported on, or transmission time of the first packet if activation time is not available; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "flowDeactivatedBy": {
+ "description": "Endpoint deactivating the flow",
+ "type": "string"
+ },
+ "flowDeactivationEpoch": {
+ "description": "Time for the start of the flow connection, in integer UTC epoch time aka UNIX time",
+ "type": "number"
+ },
+ "flowDeactivationMicrosec": {
+ "description": "Integer microseconds for the start of the flow connection",
+ "type": "number"
+ },
+ "flowDeactivationTime": {
+ "description": "Transmission time of the first packet in the flow connection being reported on; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "flowStatus": {
+ "description": "connection status at reporting time as a working / inactive / failed indicator value",
+ "type": "string"
+ },
+ "gtpConnectionStatus": {
+ "description": "Current connection state at reporting time",
+ "type": "string"
+ },
+ "gtpTunnelStatus": {
+ "description": "Current tunnel state at reporting time",
+ "type": "string"
+ },
+ "ipTosCountList": {
+ "description": "array of key: value pairs where the keys are drawn from the IP Type-of-Service identifiers which range from '0' to '255', and the values are the count of packets that had those ToS identifiers in the flow",
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": [{
+ "type": "string"
+ },
+ {
+ "type": "number"
+ }
+ ]
+ }
+ },
+ "ipTosList": {
+ "description": "Array of unique IP Type-of-Service values observed in the flow where values range from '0' to '255'",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "largePacketRtt": {
+ "description": "large packet round trip time",
+ "type": "number"
+ },
+ "largePacketThreshold": {
+ "description": "large packet threshold being applied",
+ "type": "number"
+ },
+ "maxPacketDelayVariation": {
+ "description": "Maximum packet delay variation or jitter in milliseconds for received packets: Maximum of the difference between the packet timestamp and time received for all pairs of consecutive packets",
+ "type": "number"
+ },
+ "maxReceiveBitRate": {
+ "description": "maximum receive bit rate",
+ "type": "number"
+ },
+ "maxTransmitBitRate": {
+ "description": "maximum transmit bit rate",
+ "type": "number"
+ },
+ "mobileQciCosCountList": {
+ "description": "array of key: value pairs where the keys are drawn from LTE QCI or UMTS class of service strings, and the values are the count of packets that had those strings in the flow",
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": [{
+ "type": "string"
+ },
+ {
+ "type": "number"
+ }
+ ]
+ }
+ },
+ "mobileQciCosList": {
+ "description": "Array of unique LTE QCI or UMTS class-of-service values observed in the flow",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "numActivationFailures": {
+ "description": "Number of failed activation requests, as observed by the reporting node",
+ "type": "number"
+ },
+ "numBitErrors": {
+ "description": "number of errored bits",
+ "type": "number"
+ },
+ "numBytesReceived": {
+ "description": "number of bytes received, including retransmissions",
+ "type": "number"
+ },
+ "numBytesTransmitted": {
+ "description": "number of bytes transmitted, including retransmissions",
+ "type": "number"
+ },
+ "numDroppedPackets": {
+ "description": "number of received packets dropped due to errors per virtual interface",
+ "type": "number"
+ },
+ "numGtpEchoFailures": {
+ "description": "Number of Echo request path failures where failed paths are defined in 3GPP TS 29.281 sec 7.2.1 and 3GPP TS 29.060 sec. 11.2",
+ "type": "number"
+ },
+ "numGtpTunnelErrors": {
+ "description": "Number of tunnel error indications where errors are defined in 3GPP TS 29.281 sec 7.3.1 and 3GPP TS 29.060 sec. 11.1",
+ "type": "number"
+ },
+ "numHttpErrors": {
+ "description": "Http error count",
+ "type": "number"
+ },
+ "numL7BytesReceived": {
+ "description": "number of tunneled layer 7 bytes received, including retransmissions",
+ "type": "number"
+ },
+ "numL7BytesTransmitted": {
+ "description": "number of tunneled layer 7 bytes transmitted, excluding retransmissions",
+ "type": "number"
+ },
+ "numLostPackets": {
+ "description": "number of lost packets",
+ "type": "number"
+ },
+ "numOutOfOrderPackets": {
+ "description": "number of out-of-order packets",
+ "type": "number"
+ },
+ "numPacketErrors": {
+ "description": "number of errored packets",
+ "type": "number"
+ },
+ "numPacketsReceivedExclRetrans": {
+ "description": "number of packets received, excluding retransmission",
+ "type": "number"
+ },
+ "numPacketsReceivedInclRetrans": {
+ "description": "number of packets received, including retransmission",
+ "type": "number"
+ },
+ "numPacketsTransmittedInclRetrans": {
+ "description": "number of packets transmitted, including retransmissions",
+ "type": "number"
+ },
+ "numRetries": {
+ "description": "number of packet retries",
+ "type": "number"
+ },
+ "numTimeouts": {
+ "description": "number of packet timeouts",
+ "type": "number"
+ },
+ "numTunneledL7BytesReceived": {
+ "description": "number of tunneled layer 7 bytes received, excluding retransmissions",
+ "type": "number"
+ },
+ "roundTripTime": {
+ "description": "round trip time",
+ "type": "number"
+ },
+ "tcpFlagCountList": {
+ "description": "array of key: value pairs where the keys are drawn from TCP Flags and the values are the count of packets that had that TCP Flag in the flow",
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": [{
+ "type": "string"
+ },
+ {
+ "type": "number"
+ }
+ ]
+ }
+ },
+ "tcpFlagList": {
+ "description": "Array of unique TCP Flags observed in the flow",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "timeToFirstByte": {
+ "description": "Time in milliseconds between the connection activation and first byte received",
+ "type": "number"
+ }
+ },
+ "required": ["avgBitErrorRate", "avgPacketDelayVariation", "avgPacketLatency",
+ "avgReceiveThroughput", "avgTransmitThroughput",
+ "flowActivationEpoch", "flowActivationMicrosec",
+ "flowDeactivationEpoch", "flowDeactivationMicrosec",
+ "flowDeactivationTime", "flowStatus",
+ "maxPacketDelayVariation", "numActivationFailures",
+ "numBitErrors", "numBytesReceived", "numBytesTransmitted",
+ "numDroppedPackets", "numL7BytesReceived",
+ "numL7BytesTransmitted", "numLostPackets",
+ "numOutOfOrderPackets", "numPacketErrors",
+ "numPacketsReceivedExclRetrans",
+ "numPacketsReceivedInclRetrans",
+ "numPacketsTransmittedInclRetrans",
+ "numRetries", "numTimeouts", "numTunneledL7BytesReceived",
+ "roundTripTime", "timeToFirstByte"
+ ]
+ },
+ "heartbeatFields": {
+ "description": "optional field block for fields specific to heartbeat events",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional heartbeat fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "heartbeatFieldsVersion": {
+ "description": "version of the heartbeatFields block",
+ "type": "number"
+ },
+ "heartbeatInterval": {
+ "description": "current heartbeat interval in seconds",
+ "type": "integer"
+ }
+ },
+ "required": ["heartbeatFieldsVersion", "heartbeatInterval"]
+ },
+ "internalHeaderFields": {
+ "description": "enrichment fields for internal VES Event Listener service use only, not supplied by event sources",
+ "type": "object"
+ },
+ "jsonObject": {
+ "description": "json object schema, name and other meta-information along with one or more object instances",
+ "type": "object",
+ "properties": {
+ "objectInstances": {
+ "description": "one or more instances of the jsonObject",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/jsonObjectInstance"
+ }
+ },
+ "objectName": {
+ "description": "name of the JSON Object",
+ "type": "string"
+ },
+ "objectSchema": {
+ "description": "json schema for the object",
+ "type": "string"
+ },
+ "objectSchemaUrl": {
+ "description": "Url to the json schema for the object",
+ "type": "string"
+ },
+ "nfSubscribedObjectName": {
+ "description": "name of the object associated with the nfSubscriptonId",
+ "type": "string"
+ },
+ "nfSubscriptionId": {
+ "description": "identifies an openConfig telemetry subscription on a network function, which configures the network function to send complex object data associated with the jsonObject",
+ "type": "string"
+ }
+ },
+ "required": ["objectInstances", "objectName"]
+ },
+ "jsonObjectInstance": {
+ "description": "meta-information about an instance of a jsonObject along with the actual object instance",
+ "type": "object",
+ "properties": {
+ "objectInstance": {
+ "description": "an instance conforming to the jsonObject schema",
+ "type": "object"
+ },
+ "objectInstanceEpochMicrosec": {
+ "description": "the unix time aka epoch time associated with this objectInstance--as microseconds elapsed since 1 Jan 1970 not including leap seconds",
+ "type": "number"
+ },
+ "objectKeys": {
+ "description": "an ordered set of keys that identifies this particular instance of jsonObject",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/key"
+ }
+ }
+ },
+ "required": ["objectInstance"]
+ },
+ "key": {
+ "description": "tuple which provides the name of a key along with its value and relative order",
+ "type": "object",
+ "properties": {
+ "keyName": {
+ "description": "name of the key",
+ "type": "string"
+ },
+ "keyOrder": {
+ "description": "relative sequence or order of the key with respect to other keys",
+ "type": "integer"
+ },
+ "keyValue": {
+ "description": "value of the key",
+ "type": "string"
+ }
+ },
+ "required": ["keyName"]
+ },
+ "latencyBucketMeasure": {
+ "description": "number of counts falling within a defined latency bucket",
+ "type": "object",
+ "properties": {
+ "countsInTheBucket": {
+ "type": "number"
+ },
+ "highEndOfLatencyBucket": {
+ "type": "number"
+ },
+ "lowEndOfLatencyBucket": {
+ "type": "number"
+ }
+ },
+ "required": ["countsInTheBucket"]
+ },
+ "measurementsForVfScalingFields": {
+ "description": "measurementsForVfScaling fields",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional name-value-pair fields",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "additionalMeasurements": {
+ "description": "array of named name-value-pair arrays",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/namedArrayOfFields"
+ }
+ },
+ "additionalObjects": {
+ "description": "array of JSON objects described by name, schema and other meta-information",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/jsonObject"
+ }
+ },
+ "codecUsageArray": {
+ "description": "array of codecs in use",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/codecsInUse"
+ }
+ },
+ "concurrentSessions": {
+ "description": "peak concurrent sessions for the VM or VNF over the measurementInterval",
+ "type": "integer"
+ },
+ "configuredEntities": {
+ "description": "over the measurementInterval, peak total number of: users, subscribers, devices, adjacencies, etc., for the VM, or subscribers, devices, etc., for the VNF",
+ "type": "integer"
+ },
+ "cpuUsageArray": {
+ "description": "usage of an array of CPUs",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/cpuUsage"
+ }
+ },
+ "diskUsageArray": {
+ "description": "usage of an array of disks",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/diskUsage"
+ }
+ },
+ "featureUsageArray": {
+ "description": "array of features in use",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/featuresInUse"
+ }
+ },
+ "filesystemUsageArray": {
+ "description": "filesystem usage of the VM on which the VNFC reporting the event is running",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/filesystemUsage"
+ }
+ },
+ "latencyDistribution": {
+ "description": "array of integers representing counts of requests whose latency in milliseconds falls within per-VNF configured ranges",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/latencyBucketMeasure"
+ }
+ },
+ "meanRequestLatency": {
+ "description": "mean seconds required to respond to each request for the VM on which the VNFC reporting the event is running",
+ "type": "number"
+ },
+ "measurementInterval": {
+ "description": "interval over which measurements are being reported in seconds",
+ "type": "number"
+ },
+ "measurementsForVfScalingVersion": {
+ "description": "version of the measurementsForVfScaling block",
+ "type": "number"
+ },
+ "memoryUsageArray": {
+ "description": "memory usage of an array of VMs",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/memoryUsage"
+ }
+ },
+ "numberOfMediaPortsInUse": {
+ "description": "number of media ports in use",
+ "type": "integer"
+ },
+ "requestRate": {
+ "description": "peak rate of service requests per second to the VNF over the measurementInterval",
+ "type": "number"
+ },
+ "vnfcScalingMetric": {
+ "description": "represents busy-ness of the VNF from 0 to 100 as reported by the VNFC",
+ "type": "integer"
+ },
+ "vNicPerformanceArray": {
+ "description": "usage of an array of virtual network interface cards",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/vNicPerformance"
+ }
+ }
+ },
+ "required": ["measurementInterval", "measurementsForVfScalingVersion"]
+ },
+ "memoryUsage": {
+ "description": "memory usage of an identified virtual machine",
+ "type": "object",
+ "properties": {
+ "memoryBuffered": {
+ "description": "kibibytes of temporary storage for raw disk blocks",
+ "type": "number"
+ },
+ "memoryCached": {
+ "description": "kibibytes of memory used for cache",
+ "type": "number"
+ },
+ "memoryConfigured": {
+ "description": "kibibytes of memory configured in the virtual machine on which the VNFC reporting the event is running",
+ "type": "number"
+ },
+ "memoryFree": {
+ "description": "kibibytes of physical RAM left unused by the system",
+ "type": "number"
+ },
+ "memorySlabRecl": {
+ "description": "the part of the slab that can be reclaimed such as caches measured in kibibytes",
+ "type": "number"
+ },
+ "memorySlabUnrecl": {
+ "description": "the part of the slab that cannot be reclaimed even when lacking memory measured in kibibytes",
+ "type": "number"
+ },
+ "memoryUsed": {
+ "description": "total memory minus the sum of free, buffered, cached and slab memory measured in kibibytes",
+ "type": "number"
+ },
+ "vmIdentifier": {
+ "description": "virtual machine identifier associated with the memory metrics",
+ "type": "string"
+ }
+ },
+ "required": ["memoryFree", "memoryUsed", "vmIdentifier"]
+ },
+ "mobileFlowFields": {
+ "description": "mobileFlow fields",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional mobileFlow fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "applicationType": {
+ "description": "Application type inferred",
+ "type": "string"
+ },
+ "appProtocolType": {
+ "description": "application protocol",
+ "type": "string"
+ },
+ "appProtocolVersion": {
+ "description": "application protocol version",
+ "type": "string"
+ },
+ "cid": {
+ "description": "cell id",
+ "type": "string"
+ },
+ "connectionType": {
+ "description": "Abbreviation referencing a 3GPP reference point e.g., S1-U, S11, etc",
+ "type": "string"
+ },
+ "ecgi": {
+ "description": "Evolved Cell Global Id",
+ "type": "string"
+ },
+ "flowDirection": {
+ "description": "Flow direction, indicating if the reporting node is the source of the flow or destination for the flow",
+ "type": "string"
+ },
+ "gtpPerFlowMetrics": {
+ "$ref": "#/definitions/gtpPerFlowMetrics"
+ },
+ "gtpProtocolType": {
+ "description": "GTP protocol",
+ "type": "string"
+ },
+ "gtpVersion": {
+ "description": "GTP protocol version",
+ "type": "string"
+ },
+ "httpHeader": {
+ "description": "HTTP request header, if the flow connects to a node referenced by HTTP",
+ "type": "string"
+ },
+ "imei": {
+ "description": "IMEI for the subscriber UE used in this flow, if the flow connects to a mobile device",
+ "type": "string"
+ },
+ "imsi": {
+ "description": "IMSI for the subscriber UE used in this flow, if the flow connects to a mobile device",
+ "type": "string"
+ },
+ "ipProtocolType": {
+ "description": "IP protocol type e.g., TCP, UDP, RTP...",
+ "type": "string"
+ },
+ "ipVersion": {
+ "description": "IP protocol version e.g., IPv4, IPv6",
+ "type": "string"
+ },
+ "lac": {
+ "description": "location area code",
+ "type": "string"
+ },
+ "mcc": {
+ "description": "mobile country code",
+ "type": "string"
+ },
+ "mnc": {
+ "description": "mobile network code",
+ "type": "string"
+ },
+ "mobileFlowFieldsVersion": {
+ "description": "version of the mobileFlowFields block",
+ "type": "number"
+ },
+ "msisdn": {
+ "description": "MSISDN for the subscriber UE used in this flow, as an integer, if the flow connects to a mobile device",
+ "type": "string"
+ },
+ "otherEndpointIpAddress": {
+ "description": "IP address for the other endpoint, as used for the flow being reported on",
+ "type": "string"
+ },
+ "otherEndpointPort": {
+ "description": "IP Port for the reporting entity, as used for the flow being reported on",
+ "type": "integer"
+ },
+ "otherFunctionalRole": {
+ "description": "Functional role of the other endpoint for the flow being reported on e.g., MME, S-GW, P-GW, PCRF...",
+ "type": "string"
+ },
+ "rac": {
+ "description": "routing area code",
+ "type": "string"
+ },
+ "radioAccessTechnology": {
+ "description": "Radio Access Technology e.g., 2G, 3G, LTE",
+ "type": "string"
+ },
+ "reportingEndpointIpAddr": {
+ "description": "IP address for the reporting entity, as used for the flow being reported on",
+ "type": "string"
+ },
+ "reportingEndpointPort": {
+ "description": "IP port for the reporting entity, as used for the flow being reported on",
+ "type": "integer"
+ },
+ "sac": {
+ "description": "service area code",
+ "type": "string"
+ },
+ "samplingAlgorithm": {
+ "description": "Integer identifier for the sampling algorithm or rule being applied in calculating the flow metrics if metrics are calculated based on a sample of packets, or 0 if no sampling is applied",
+ "type": "integer"
+ },
+ "tac": {
+ "description": "transport area code",
+ "type": "string"
+ },
+ "tunnelId": {
+ "description": "tunnel identifier",
+ "type": "string"
+ },
+ "vlanId": {
+ "description": "VLAN identifier used by this flow",
+ "type": "string"
+ }
+ },
+ "required": ["flowDirection", "gtpPerFlowMetrics", "ipProtocolType", "ipVersion",
+ "mobileFlowFieldsVersion", "otherEndpointIpAddress", "otherEndpointPort",
+ "reportingEndpointIpAddr", "reportingEndpointPort"
+ ]
+ },
+ "namedArrayOfFields": {
+ "description": "an array of name value pairs along with a name for the array",
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "arrayOfFields": {
+ "description": "array of name value pairs",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ }
+ },
+ "required": ["name", "arrayOfFields"]
+ },
+ "otherFields": {
+ "description": "fields for events belonging to the 'other' domain of the commonEventHeader domain enumeration",
+ "type": "object",
+ "properties": {
+ "hashOfNameValuePairArrays": {
+ "description": "array of named name-value-pair arrays",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/namedArrayOfFields"
+ }
+ },
+ "jsonObjects": {
+ "description": "array of JSON objects described by name, schema and other meta-information",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/jsonObject"
+ }
+ },
+ "nameValuePairs": {
+ "description": "array of name-value pairs",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "otherFieldsVersion": {
+ "description": "version of the otherFields block",
+ "type": "number"
+ }
+ },
+ "required": ["otherFieldsVersion"]
+ },
+ "requestError": {
+ "description": "standard request error data structure",
+ "type": "object",
+ "properties": {
+ "messageId": {
+ "description": "Unique message identifier of the format ABCnnnn where ABC is either SVC for Service Exceptions or POL for Policy Exception",
+ "type": "string"
+ },
+ "text": {
+ "description": "Message text, with replacement variables marked with %n, where n is an index into the list of <variables> elements, starting at 1",
+ "type": "string"
+ },
+ "url": {
+ "description": "Hyperlink to a detailed error resource e.g., an HTML page for browser user agents",
+ "type": "string"
+ },
+ "variables": {
+ "description": "List of zero or more strings that represent the contents of the variables used by the message text",
+ "type": "string"
+ }
+ },
+ "required": ["messageId", "text"]
+ },
+ "sipSignalingFields": {
+ "description": "sip signaling fields",
+ "type": "object",
+ "properties": {
+ "additionalInformation": {
+ "description": "additional sip signaling fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "compressedSip": {
+ "description": "the full SIP request/response including headers and bodies",
+ "type": "string"
+ },
+ "correlator": {
+ "description": "this is the same for all events on this call",
+ "type": "string"
+ },
+ "localIpAddress": {
+ "description": "IP address on VNF",
+ "type": "string"
+ },
+ "localPort": {
+ "description": "port on VNF",
+ "type": "string"
+ },
+ "remoteIpAddress": {
+ "description": "IP address of peer endpoint",
+ "type": "string"
+ },
+ "remotePort": {
+ "description": "port of peer endpoint",
+ "type": "string"
+ },
+ "sipSignalingFieldsVersion": {
+ "description": "version of the sipSignalingFields block",
+ "type": "number"
+ },
+ "summarySip": {
+ "description": "the SIP Method or Response (‘INVITE’, ‘200 OK’, ‘BYE’, etc)",
+ "type": "string"
+ },
+ "vendorVnfNameFields": {
+ "$ref": "#/definitions/vendorVnfNameFields"
+ }
+ },
+ "required": ["correlator", "localIpAddress", "localPort", "remoteIpAddress",
+ "remotePort", "sipSignalingFieldsVersion", "vendorVnfNameFields"
+ ]
+ },
+ "stateChangeFields": {
+ "description": "stateChange fields",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional stateChange fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "newState": {
+ "description": "new state of the entity",
+ "type": "string",
+ "enum": [
+ "inService",
+ "maintenance",
+ "outOfService"
+ ]
+ },
+ "oldState": {
+ "description": "previous state of the entity",
+ "type": "string",
+ "enum": [
+ "inService",
+ "maintenance",
+ "outOfService"
+ ]
+ },
+ "stateChangeFieldsVersion": {
+ "description": "version of the stateChangeFields block",
+ "type": "number"
+ },
+ "stateInterface": {
+ "description": "card or port name of the entity that changed state",
+ "type": "string"
+ }
+ },
+ "required": ["newState", "oldState", "stateChangeFieldsVersion", "stateInterface"]
+ },
+ "suppressedNvPairs": {
+ "description": "List of specific NvPairsNames to suppress within a given Name-Value Field for event Throttling",
+ "type": "object",
+ "properties": {
+ "nvPairFieldName": {
+ "description": "Name of the field within which are the nvpair names to suppress",
+ "type": "string"
+ },
+ "suppressedNvPairNames": {
+ "description": "Array of nvpair names to suppress within the nvpairFieldName",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "required": ["nvPairFieldName", "suppressedNvPairNames"]
+ },
+ "syslogFields": {
+ "description": "sysLog fields",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional syslog fields if needed provided as name=value delimited by a pipe ‘|’ symbol, for example: 'name1=value1|name2=value2|…'",
+ "type": "string"
+ },
+ "eventSourceHost": {
+ "description": "hostname of the device",
+ "type": "string"
+ },
+ "eventSourceType": {
+ "description": "type of event source; examples: other, router, switch, host, card, port, slotThreshold, portThreshold, virtualMachine, virtualNetworkFunction",
+ "type": "string"
+ },
+ "syslogFacility": {
+ "description": "numeric code from 0 to 23 for facility--see table in documentation",
+ "type": "integer"
+ },
+ "syslogFieldsVersion": {
+ "description": "version of the syslogFields block",
+ "type": "number"
+ },
+ "syslogMsg": {
+ "description": "syslog message",
+ "type": "string"
+ },
+ "syslogPri": {
+ "description": "0-192 combined severity and facility",
+ "type": "integer"
+ },
+ "syslogProc": {
+ "description": "identifies the application that originated the message",
+ "type": "string"
+ },
+ "syslogProcId": {
+ "description": "a change in the value of this field indicates a discontinuity in syslog reporting",
+ "type": "number"
+ },
+ "syslogSData": {
+ "description": "syslog structured data consisting of a structured data Id followed by a set of key value pairs",
+ "type": "string"
+ },
+ "syslogSdId": {
+ "description": "0-32 char in format name@number for example ourSDID@32473",
+ "type": "string"
+ },
+ "syslogSev": {
+ "description": "numerical Code for severity derived from syslogPri as remaider of syslogPri / 8",
+ "type": "string",
+ "enum": [
+ "Alert",
+ "Critical",
+ "Debug",
+ "Emergency",
+ "Error",
+ "Info",
+ "Notice",
+ "Warning"
+ ]
+ },
+ "syslogTag": {
+ "description": "msgId indicating the type of message such as TCPOUT or TCPIN; NILVALUE should be used when no other value can be provided",
+ "type": "string"
+ },
+ "syslogVer": {
+ "description": "IANA assigned version of the syslog protocol specification - typically 1",
+ "type": "number"
+ }
+ },
+ "required": ["eventSourceType", "syslogFieldsVersion", "syslogMsg", "syslogTag"]
+ },
+ "thresholdCrossingAlertFields": {
+ "description": "fields specific to threshold crossing alert events",
+ "type": "object",
+ "properties": {
+ "additionalFields": {
+ "description": "additional threshold crossing alert fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "additionalParameters": {
+ "description": "performance counters",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/counter"
+ }
+ },
+ "alertAction": {
+ "description": "Event action",
+ "type": "string",
+ "enum": [
+ "CLEAR",
+ "CONT",
+ "SET"
+ ]
+ },
+ "alertDescription": {
+ "description": "Unique short alert description such as IF-SHUB-ERRDROP",
+ "type": "string"
+ },
+ "alertType": {
+ "description": "Event type",
+ "type": "string",
+ "enum": [
+ "CARD-ANOMALY",
+ "ELEMENT-ANOMALY",
+ "INTERFACE-ANOMALY",
+ "SERVICE-ANOMALY"
+ ]
+ },
+ "alertValue": {
+ "description": "Calculated API value (if applicable)",
+ "type": "string"
+ },
+ "associatedAlertIdList": {
+ "description": "List of eventIds associated with the event being reported",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "collectionTimestamp": {
+ "description": "Time when the performance collector picked up the data; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "dataCollector": {
+ "description": "Specific performance collector instance used",
+ "type": "string"
+ },
+ "elementType": {
+ "description": "type of network element - internal ATT field",
+ "type": "string"
+ },
+ "eventSeverity": {
+ "description": "event severity or priority",
+ "type": "string",
+ "enum": [
+ "CRITICAL",
+ "MAJOR",
+ "MINOR",
+ "WARNING",
+ "NORMAL"
+ ]
+ },
+ "eventStartTimestamp": {
+ "description": "Time closest to when the measurement was made; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 -0800",
+ "type": "string"
+ },
+ "interfaceName": {
+ "description": "Physical or logical port or card (if applicable)",
+ "type": "string"
+ },
+ "networkService": {
+ "description": "network name - internal ATT field",
+ "type": "string"
+ },
+ "possibleRootCause": {
+ "description": "Reserved for future use",
+ "type": "string"
+ },
+ "thresholdCrossingFieldsVersion": {
+ "description": "version of the thresholdCrossingAlertFields block",
+ "type": "number"
+ }
+ },
+ "required": [
+ "additionalParameters",
+ "alertAction",
+ "alertDescription",
+ "alertType",
+ "collectionTimestamp",
+ "eventSeverity",
+ "eventStartTimestamp",
+ "thresholdCrossingFieldsVersion"
+ ]
+ },
+ "vendorVnfNameFields": {
+ "description": "provides vendor, vnf and vfModule identifying information",
+ "type": "object",
+ "properties": {
+ "vendorName": {
+ "description": "VNF vendor name",
+ "type": "string"
+ },
+ "vfModuleName": {
+ "description": "ASDC vfModuleName for the vfModule generating the event",
+ "type": "string"
+ },
+ "vnfName": {
+ "description": "ASDC modelName for the VNF generating the event",
+ "type": "string"
+ }
+ },
+ "required": ["vendorName"]
+ },
+ "vNicPerformance": {
+ "description": "describes the performance and errors of an identified virtual network interface card",
+ "type": "object",
+ "properties": {
+ "receivedBroadcastPacketsAccumulated": {
+ "description": "Cumulative count of broadcast packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedBroadcastPacketsDelta": {
+ "description": "Count of broadcast packets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedDiscardedPacketsAccumulated": {
+ "description": "Cumulative count of discarded packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedDiscardedPacketsDelta": {
+ "description": "Count of discarded packets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedErrorPacketsAccumulated": {
+ "description": "Cumulative count of error packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedErrorPacketsDelta": {
+ "description": "Count of error packets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedMulticastPacketsAccumulated": {
+ "description": "Cumulative count of multicast packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedMulticastPacketsDelta": {
+ "description": "Count of multicast packets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedOctetsAccumulated": {
+ "description": "Cumulative count of octets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedOctetsDelta": {
+ "description": "Count of octets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedTotalPacketsAccumulated": {
+ "description": "Cumulative count of all packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedTotalPacketsDelta": {
+ "description": "Count of all packets received within the measurement interval",
+ "type": "number"
+ },
+ "receivedUnicastPacketsAccumulated": {
+ "description": "Cumulative count of unicast packets received as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "receivedUnicastPacketsDelta": {
+ "description": "Count of unicast packets received within the measurement interval",
+ "type": "number"
+ },
+ "transmittedBroadcastPacketsAccumulated": {
+ "description": "Cumulative count of broadcast packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedBroadcastPacketsDelta": {
+ "description": "Count of broadcast packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedDiscardedPacketsAccumulated": {
+ "description": "Cumulative count of discarded packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedDiscardedPacketsDelta": {
+ "description": "Count of discarded packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedErrorPacketsAccumulated": {
+ "description": "Cumulative count of error packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedErrorPacketsDelta": {
+ "description": "Count of error packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedMulticastPacketsAccumulated": {
+ "description": "Cumulative count of multicast packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedMulticastPacketsDelta": {
+ "description": "Count of multicast packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedOctetsAccumulated": {
+ "description": "Cumulative count of octets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedOctetsDelta": {
+ "description": "Count of octets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedTotalPacketsAccumulated": {
+ "description": "Cumulative count of all packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedTotalPacketsDelta": {
+ "description": "Count of all packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "transmittedUnicastPacketsAccumulated": {
+ "description": "Cumulative count of unicast packets transmitted as read at the end of the measurement interval",
+ "type": "number"
+ },
+ "transmittedUnicastPacketsDelta": {
+ "description": "Count of unicast packets transmitted within the measurement interval",
+ "type": "number"
+ },
+ "valuesAreSuspect": {
+ "description": "Indicates whether vNicPerformance values are likely inaccurate due to counter overflow or other condtions",
+ "type": "string",
+ "enum": ["true", "false"]
+ },
+ "vNicIdentifier": {
+ "description": "vNic identification",
+ "type": "string"
+ }
+ },
+ "required": ["valuesAreSuspect", "vNicIdentifier"]
+ },
+ "voiceQualityFields": {
+ "description": "provides statistics related to customer facing voice products",
+ "type": "object",
+ "properties": {
+ "additionalInformation": {
+ "description": "additional voice quality fields if needed",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/field"
+ }
+ },
+ "calleeSideCodec": {
+ "description": "callee codec for the call",
+ "type": "string"
+ },
+ "callerSideCodec": {
+ "description": "caller codec for the call",
+ "type": "string"
+ },
+ "correlator": {
+ "description": "this is the same for all events on this call",
+ "type": "string"
+ },
+ "endOfCallVqmSummaries": {
+ "$ref": "#/definitions/endOfCallVqmSummaries"
+ },
+ "phoneNumber": {
+ "description": "phone number associated with the correlator",
+ "type": "string"
+ },
+ "midCallRtcp": {
+ "description": "Base64 encoding of the binary RTCP data excluding Eth/IP/UDP headers",
+ "type": "string"
+ },
+ "vendorVnfNameFields": {
+ "$ref": "#/definitions/vendorVnfNameFields"
+ },
+ "voiceQualityFieldsVersion": {
+ "description": "version of the voiceQualityFields block",
+ "type": "number"
+ }
+ },
+ "required": ["calleeSideCodec", "callerSideCodec", "correlator", "midCallRtcp",
+ "vendorVnfNameFields", "voiceQualityFieldsVersion"
+ ]
+ }
+ }
+ }
+}
diff --git a/tests/dcaegen2/testcases/resources/collector.properties b/tests/dcaegen2/testcases/resources/collector.properties
new file mode 100755
index 00000000..1c5c8411
--- /dev/null
+++ b/tests/dcaegen2/testcases/resources/collector.properties
@@ -0,0 +1,74 @@
+###############################################################################
+##
+## Collector Server config
+##
+## - Default values are shown as commented settings.
+##
+###############################################################################
+##
+## HTTP(S) service
+##
+## Normally:
+##
+## - 8080 is http service
+## - https is disabled by default (-1)
+##
+## - At this time, the server always binds to 0.0.0.0
+##
+## The default port when header.authflag is disabled (0)
+#collector.service.port=8080
+
+## The secure port is required if header.authflag is set to 1 (true)
+## Authentication is only supported via secure port
+## When enabled - require valid keystore defined
+collector.service.secure.port=8443
+
+## The keystore must be setup per installation when secure port is configured
+collector.keystore.file.location=../etc/keystore
+collector.keystore.passwordfile=./etc/passwordfile
+collector.keystore.alias=tomcat
+
+
+###############################################################################
+## Processing
+##
+## If there's a problem that prevents the collector from processing alarms,
+## it's normally better to apply back pressure to the caller than to try to
+## buffer beyond a reasonable size limit. With a limit, the server won't crash
+## due to being out of memory, and the caller will get a 5xx reply saying the
+## server is in trouble.
+collector.inputQueue.maxPending=8096
+
+## Schema Validation checkflag
+## default no validation checkflag (-1)
+## If enabled (1) - schemafile location must be specified
+collector.schema.checkflag=1
+collector.schema.file={\"v1\":\"./etc/CommonEventFormat_27.2.json\",\"v2\":\"./etc/CommonEventFormat_27.2.json\",\"v3\":\"./etc/CommonEventFormat_27.2.json\",\"v4\":\"./etc/CommonEventFormat_27.2.json\",\"v5\":\"./etc/CommonEventFormat_28.3.json\"}
+
+## List all streamid per domain to be supported. The streamid should match to channel name on dmaapfile
+collector.dmaap.streamid=fault=sec_fault|syslog=sec_syslog|heartbeat=sec_heartbeat|measurementsForVfScaling=sec_measurement|mobileFlow=sec_mobileflow|other=sec_other|stateChange=sec_statechange|thresholdCrossingAlert=sec_thresholdCrossingAlert|voiceQuality=ves_voicequality|sipSignaling=ves_sipsignaling
+collector.dmaapfile=./etc/DmaapConfig.json
+
+## Custom ExceptionConfiguration
+exceptionConfig=./etc/ExceptionConfig.json
+
+## authflag control authentication by the collector
+## If enabled (1) - then authlist has to be defined
+## When authflag is enabled, only secure port will be supported
+## To disable enter 0
+header.authflag=1
+## Combination of userid,base64 encoded pwd list to be supported
+## userid and pwd comma separated; pipe delimitation between each pair
+header.authlist=sample1,c2FtcGxlMQ==|vdnsagg,dmRuc2FnZw==
+
+## Event transformation Flag - when set expects configurable transformation
+## defined under ./etc/eventTransform.json
+## Enabled by default; to disable set to 0
+event.transform.flag=0
+
+###############################################################################
+##
+## Tomcat control
+##
+#tomcat.maxthreads=(tomcat default, which is usually 200)
+
diff --git a/tests/dcaegen2/testcases/resources/dcae_keywords.robot b/tests/dcaegen2/testcases/resources/dcae_keywords.robot
new file mode 100644
index 00000000..6820050f
--- /dev/null
+++ b/tests/dcaegen2/testcases/resources/dcae_keywords.robot
@@ -0,0 +1,145 @@
+*** Settings ***
+Documentation The main interface for interacting with DCAE. It handles low level stuff like managing the http request library and DCAE required fields
+Library RequestsLibrary
+Library DcaeLibrary
+Library OperatingSystem
+Library Collections
+Variables ../resources/DcaeVariables.py
+Resource ../resources/dcae_properties.robot
+
+*** Variables ***
+${DCAE_HEALTH_CHECK_BODY} %{WORKSPACE}/test/csit/tests/dcae/testcases/assets/json_events/dcae_healthcheck.json
+
+*** Keywords ***
+Create sessions
+ [Documentation] Create all required sessions
+ Create Session dcae_vesc_url ${VESC_URL}
+ Set Suite Variable ${suite_dcae_vesc_url_session} dcae_vesc_url
+ ${auth}= Create List ${VESC_HTTPS_USER} ${VESC_HTTPS_PD}
+ Create Session dcae_vesc_url_https ${VESC_URL_HTTPS} auth=${auth} disable_warnings=1
+ Set Suite Variable ${suite_dcae_vesc_url_https_session} dcae_vesc_url_https
+
+Create header
+ ${headers}= Create Dictionary Content-Type=application/json
+ Set Suite Variable ${suite_headers} ${headers}
+
+Get DCAE Nodes
+ [Documentation] Get DCAE Nodes from Consul Catalog
+ #Log Creating session ${GLOBAL_DCAE_CONSUL_URL}
+ ${session}= Create Session dcae ${GLOBAL_DCAE_CONSUL_URL}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-Consul-Token=abcd1234 X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Get Request dcae /v1/catalog/nodes headers=${headers}
+ Log Received response from dcae consul: ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${NodeList}= Get Json Value List ${resp.text} Node
+ ${NodeListLength}= Get Length ${NodeList}
+ ${len}= Get Length ${NodeList}
+ Should Not Be Equal As Integers ${len} 0
+ [Return] ${NodeList}
+
+DCAE Node Health Check
+ [Documentation] Perform DCAE Node Health Check
+ [Arguments] ${NodeName}
+ ${session}= Create Session dcae-${NodeName} ${GLOBAL_DCAE_CONSUL_URL}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-Consul-Token=abcd1234 X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${hcpath}= Catenate SEPARATOR= /v1/health/node/ ${NodeName}
+ ${resp}= Get Request dcae-${NodeName} ${hcpath} headers=${headers}
+ Log Received response from dcae consul: ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${StatusList}= Get Json Value List ${resp.text} Status
+ ${len}= Get Length ${StatusList}
+ Should Not Be Equal As Integers ${len} 0
+ DCAE Check Health Status ${NodeName} ${StatusList[0]} Serf Health Status
+ #Run Keyword if ${len} > 1 DCAE Check Health Status ${NodeName} ${StatusList[1]} Serf Health Status
+
+DCAE Check Health Status
+ [Arguments] ${NodeName} ${ItemStatus} ${CheckType}
+ Should Be Equal As Strings ${ItemStatus} passing
+ Log Node: ${NodeName} ${CheckType} check pass ok
+
+VES Collector Suite Setup DMaaP
+ [Documentation] Start DMaaP Mockup Server
+ ${ret}= Setup DMaaP Server
+ Should Be Equal As Strings ${ret} true
+
+VES Collector Suite Shutdown DMaaP
+ [Documentation] Shutdown DMaaP Mockup Server
+ ${ret}= Shutdown DMaap
+ Should Be Equal As Strings ${ret} true
+
+Check DCAE Results
+ [Documentation] Parse DCAE JSON response and make sure all rows have healthTestStatus=GREEN
+ [Arguments] ${json}
+ @{rows}= Get From Dictionary ${json['returns']} rows
+ @{headers}= Get From Dictionary ${json['returns']} columns
+ # Retrieve column names from headers
+ ${columns}= Create List
+ :for ${header} in @{headers}
+ \ ${colName}= Get From Dictionary ${header} colName
+ \ Append To List ${columns} ${colName}
+ # Process each row making sure status=GREEN
+ :for ${row} in @{rows}
+ \ ${cells}= Get From Dictionary ${row} cells
+ \ ${dict}= Make A Dictionary ${cells} ${columns}
+ \ Dictionary Should Contain Item ${dict} healthTestStatus GREEN
+
+Make A Dictionary
+ [Documentation] Given a list of column names and a list of dictionaries, map columname=value
+ [Arguments] ${columns} ${names} ${valuename}=value
+ ${dict}= Create Dictionary
+ ${collength}= Get Length ${columns}
+ ${namelength}= Get Length ${names}
+ :for ${index} in range 0 ${collength}
+ \ ${name}= Evaluate ${names}[${index}]
+ \ ${valued}= Evaluate ${columns}[${index}]
+ \ ${value}= Get From Dictionary ${valued} ${valueName}
+ \ Set To Dictionary ${dict} ${name} ${value}
+ [Return] ${dict}
+
+Json String To Dictionary
+ [Arguments] ${json_string}
+ ${json_dict}= evaluate json.loads('''${json_string}''') json
+ [Return] ${json_dict}
+
+Dictionary To Json String
+ [Arguments] ${json_dict}
+ ${json_string}= evaluate json.dumps(${json_dict}) json
+ [Return] ${json_string}
+
+Get DCAE Service Component Status
+ [Documentation] Get the status of a DCAE Service Component
+ [Arguments] ${url} ${urlpath} ${usr} ${passwd}
+ ${auth}= Create List ${usr} ${passwd}
+ ${session}= Create Session dcae-service-component ${url} auth=${auth}
+ ${resp}= Get Request dcae-service-component ${urlpath}
+ [Return] ${resp}
+
+Publish Event To VES Collector No Auth
+ [Documentation] Send an event to VES Collector
+ [Arguments] ${evtpath} ${evtdata}
+ ${resp}= Post Request ${suite_dcae_vesc_url_session} ${evtpath} data=${evtdata} headers=${suite_headers}
+ #Log Received response from dcae ${resp.json()}
+ [Return] ${resp}
+
+Publish Event To VES Collector
+ [Documentation] Send an event to VES Collector
+ [Arguments] ${evtpath} ${evtdata}
+ ${resp}= Post Request ${suite_dcae_vesc_url_https_session} ${evtpath} data=${evtdata} headers=${suite_headers}
+ #Log Received response from dcae ${resp.json()}
+ [Return] ${resp}
+
+Publish Event To VES Collector With Put Method
+ [Documentation] Send an event to VES Collector
+ [Arguments] ${evtpath} ${evtdata}
+ ${resp}= Put Request ${suite_dcae_vesc_url_https_session} ${evtpath} data=${evtdata} headers=${suite_headers}
+ #Log Received response from dcae ${resp.json()}
+ [Return] ${resp}
+
+Publish Event To VES Collector With Put Method No Auth
+ [Documentation] Send an event to VES Collector
+ [Arguments] ${evtpath} ${evtdata}
+ ${resp}= Put Request ${suite_dcae_vesc_url_session} ${evtpath} data=${evtdata} headers=${suite_headers}
+ #Log Received response from dcae ${resp.json()}
+ [Return] ${resp}
diff --git a/tests/dcaegen2/testcases/resources/dcae_properties.robot b/tests/dcaegen2/testcases/resources/dcae_properties.robot
new file mode 100644
index 00000000..135ff263
--- /dev/null
+++ b/tests/dcaegen2/testcases/resources/dcae_properties.robot
@@ -0,0 +1,14 @@
+*** Settings ***
+Documentation store all properties that can change or are used in multiple places here
+... format is all caps with underscores between words and prepended with GLOBAL
+... make sure you prepend them with GLOBAL so that other files can easily see it is from this file.
+
+*** Variables ***
+${GLOBAL_APPLICATION_ID} robot-dcaegen2
+${GLOBAL_DCAE_CONSUL_URL} http://135.205.228.129:8500
+${GLOBAL_DCAE_CONSUL_URL1} http://135.205.228.170:8500
+${GLOBAL_DCAE_VES_URL} http://localhost:8443/eventlistener/v5
+${GLOBAL_DCAE_USERNAME} console
+${GLOBAL_DCAE_PASSWORD} ZjJkYjllMjljMTI2M2Iz
+${VESC_HTTPS_USER} sample1
+${VESC_HTTPS_PD} sample1
diff --git a/tests/dcaegen2/testcases/resources/index.htm b/tests/dcaegen2/testcases/resources/index.htm
new file mode 100644
index 00000000..5ab2f8a4
--- /dev/null
+++ b/tests/dcaegen2/testcases/resources/index.htm
@@ -0,0 +1 @@
+Hello \ No newline at end of file
diff --git a/tests/dcaegen2/testcases/resources/vesc_enable_https_auth.sh b/tests/dcaegen2/testcases/resources/vesc_enable_https_auth.sh
new file mode 100755
index 00000000..12989911
--- /dev/null
+++ b/tests/dcaegen2/testcases/resources/vesc_enable_https_auth.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+docker exec -it vesc /opt/app/VESCollector/bin/VESrestfulCollector.sh stop
+sleep 2
+docker cp ${WORKSPACE}/test/csit/tests/dcaegen2/testcases/resources/collector.properties vesc:/opt/app/VESCollector/etc
+sleep 10
+docker exec -id vesc /opt/app/VESCollector/bin/VESrestfulCollector.sh start
+sleep 5
+echo "VES Collector Restarted"
diff --git a/tests/dmaap-buscontroller/single-mr-suite/__init__.robot b/tests/dmaap-buscontroller/single-mr-suite/__init__.robot
new file mode 100644
index 00000000..41c7a003
--- /dev/null
+++ b/tests/dmaap-buscontroller/single-mr-suite/__init__.robot
@@ -0,0 +1,3 @@
+*** Settings ***
+Documentation dmaap-buscontroller - Suite 1
+
diff --git a/tests/dmaap-buscontroller/single-mr-suite/test1.robot b/tests/dmaap-buscontroller/single-mr-suite/test1.robot
new file mode 100644
index 00000000..d68b9ed1
--- /dev/null
+++ b/tests/dmaap-buscontroller/single-mr-suite/test1.robot
@@ -0,0 +1,104 @@
+*** Settings ***
+Resource ../../common.robot
+Library Collections
+Library json
+Library OperatingSystem
+Library RequestsLibrary
+Library HttpLibrary.HTTP
+Library String
+
+
+*** Variables ***
+${MESSAGE} Hello, world!
+${DBC_URI} webapi
+${DBC_URL} http://${DMAAPBC_IP}:8080/${DBC_URI}
+${TOPIC_NS} org.onap.dmaap.onapCSIT
+${LOC} csit-sanfrancisco
+${PUB_CORE} "dcaeLocationName": "${LOC}", "clientRole": "org.onap.dmaap.client.pub", "action": [ "pub", "view" ]
+${SUB_CORE} "dcaeLocationName": "${LOC}", "clientRole": "org.onap.dmaap.client.sub", "action": [ "sub", "view" ]
+${PUB} { ${PUB_CORE} }
+${SUB} { ${SUB_CORE} }
+${TOPIC1_DATA} { "topicName":"singleMRtopic1", "topicDescription":"generated for CSIT", "owner":"dgl"}
+${TOPIC2_DATA} { "topicName":"singleMRtopic2", "topicDescription":"generated for CSIT", "owner":"dgl", "clients": [ ${PUB}, ${SUB}] }
+${TOPIC3_DATA} { "topicName":"singleMRtopic3", "topicDescription":"generated for CSIT", "owner":"dgl"}
+${PUB3_DATA} { "fqtn": "${TOPIC_NS}.singleMRtopic3", ${PUB_CORE} }
+${SUB3_DATA} { "fqtn": "${TOPIC_NS}.singleMRtopic3", ${SUB_CORE} }
+
+
+
+*** Test Cases ***
+Url Test
+ [Documentation] Check if www.onap.org can be reached
+ Create Session sanity http://onap.readthedocs.io
+ ${resp}= Get Request sanity /
+ Should Be Equal As Integers ${resp.status_code} 200
+
+(DMAAP-293)
+ [Documentation] Create Topic w no clients POST ${DBC_URI}/topics endpoint
+ ${resp}= PostCall ${DBC_URL}/topics ${TOPIC1_DATA}
+ Should Be Equal As Integers ${resp.status_code} 201
+
+(DMAAP-294)
+ [Documentation] Create Topic w pub and sub clients POST ${DBC_URI}/topics endpoint
+ ${resp}= PostCall ${DBC_URL}/topics ${TOPIC2_DATA}
+ Should Be Equal As Integers ${resp.status_code} 201
+
+(DMAAP-295)
+ [Documentation] Create Topic w no clients and then add a client POST ${DBC_URI}/mr_clients endpoint
+ ${resp}= PostCall ${DBC_URL}/topics ${TOPIC3_DATA}
+ Should Be Equal As Integers ${resp.status_code} 201
+ ${resp}= PostCall ${DBC_URL}/mr_clients ${PUB3_DATA}
+ Should Be Equal As Integers ${resp.status_code} 200
+ ${resp}= PostCall ${DBC_URL}/mr_clients ${SUB3_DATA}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+(DMAAP-297)
+ [Documentation] Query for all topics and specific topic
+ Create Session get ${DBC_URL}
+ ${resp}= Get Request get /topics
+ Should Be Equal As Integers ${resp.status_code} 200
+ ${resp}= Get Request get /topics/${TOPIC_NS}.singleMRtopic3
+ Should Be Equal As Integers ${resp.status_code} 200
+
+(DMAAP-301)
+ [Documentation] Delete a subscriber
+ Create Session get ${DBC_URL}
+ ${resp}= Get Request get /topics/${TOPIC_NS}.singleMRtopic3
+ Should Be Equal As Integers ${resp.status_code} 200
+ ${tmp}= Get Json Value ${resp.text} /clients/1/mrClientId
+ ${clientId}= Remove String ${tmp} \"
+ ${resp}= DelCall ${DBC_URL}/mr_clients/${clientId}
+ Should Be Equal As Integers ${resp.status_code} 204
+
+(DMAAP-302)
+ [Documentation] Delete a publisher
+ Create Session get ${DBC_URL}
+ ${resp}= Get Request get /topics/${TOPIC_NS}.singleMRtopic3
+ Should Be Equal As Integers ${resp.status_code} 200
+ ${tmp}= Get Json Value ${resp.text} /clients/0/mrClientId
+ ${clientId}= Remove String ${tmp} \"
+ ${resp}= DelCall ${DBC_URL}/mr_clients/${clientId}
+ Should Be Equal As Integers ${resp.status_code} 204
+
+
+*** Keywords ***
+CheckDir
+ [Arguments] ${path}
+ Directory Should Exist ${path}
+
+CheckUrl
+ [Arguments] ${session} ${path} ${expect}
+ ${resp}= Get Request ${session} ${path}
+ Should Be Equal As Integers ${resp.status_code} ${expect}
+
+PostCall
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ ${resp}= Evaluate requests.post('${url}',data='${data}', headers=${headers},verify=False) requests
+ [Return] ${resp}
+
+DelCall
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers},verify=False) requests
+ [Return] ${resp}
diff --git a/tests/dmaap-buscontroller/ssl_suite/__init__.robot b/tests/dmaap-buscontroller/ssl_suite/__init__.robot
new file mode 100644
index 00000000..41c7a003
--- /dev/null
+++ b/tests/dmaap-buscontroller/ssl_suite/__init__.robot
@@ -0,0 +1,3 @@
+*** Settings ***
+Documentation dmaap-buscontroller - Suite 1
+
diff --git a/tests/dmaap-buscontroller/ssl_suite/test1.robot b/tests/dmaap-buscontroller/ssl_suite/test1.robot
new file mode 100644
index 00000000..999c6baf
--- /dev/null
+++ b/tests/dmaap-buscontroller/ssl_suite/test1.robot
@@ -0,0 +1,77 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library HttpLibrary.HTTP
+Library Collections
+Library String
+
+*** Variables ***
+${MESSAGE} Hello, world!
+${DBC_URI} /webapi
+
+*** Test Cases ***
+String Equality Test
+ Should Be Equal ${MESSAGE} Hello, world!
+
+Dir Test
+ [Documentation] Check if /tmp exists
+ Log ${MESSAGE}
+ CheckDir /tmp
+
+Url Test
+ [Documentation] Check if www.onap.org can be reached
+ Create Session openo http://www.onap.org
+ CheckUrl openo / 200
+
+HTTPS Heartbeat Test
+ [Documentation] Check ${DBC_URI}/info SSL endpoint
+ Create Session heartbeat https://${DMAAPBC_IP}:8443
+ CheckUrl heartbeat ${DBC_URI}/info 204
+
+HTTPS Dmaap Init Test
+ [Documentation] Check ${DBC_URI}/dmaap SSL endpoint
+ Create Session heartbeat https://${DMAAPBC_IP}:8443
+ CheckStatus heartbeat ${DBC_URI}/dmaap "VALID"
+
+HTTPS Dmaap dcaeLocations Test
+ [Documentation] Check ${DBC_URI}/dcaeLocations SSL endpoint
+ Create Session heartbeat https://${DMAAPBC_IP}:8443
+ CheckStatus0 heartbeat ${DBC_URI}/dcaeLocations "VALID"
+
+HTTPS Dmaap mr_clusters Test
+ [Documentation] Check ${DBC_URI}/mr_clusters SSL endpoint
+ Create Session heartbeat https://${DMAAPBC_IP}:8443
+ CheckStatus0 heartbeat ${DBC_URI}/mr_clusters "VALID"
+
+
+*** Keywords ***
+CheckDir
+ [Arguments] ${path}
+ Directory Should Exist ${path}
+
+CheckUrl
+ [Arguments] ${session} ${path} ${expect}
+ ${resp}= Get Request ${session} ${path}
+ Should Be Equal As Integers ${resp.status_code} ${expect}
+
+CheckStatus
+ [Arguments] ${session} ${path} ${expect}
+ ${resp}= Get Request ${session} ${path}
+ log ${resp.content}
+ ${val}= Get Json value ${resp.content} /status
+ log ${val}
+ should be equal as strings ${val} ${expect}
+
+CheckStatus0
+ [Arguments] ${session} ${path} ${expect}
+ ${resp}= Get Request ${session} ${path}
+ log ${resp.json()}
+ log ${resp.content}
+# silliness to strip off the brackets returned for a List to get a Dict
+ ${t1}= Remove String ${resp.content} [
+ ${dict}= Remove String ${t1} ]
+ log ${dict}
+ ${val}= Get Json value ${dict} /status
+ log ${val}
+ should be equal as strings ${val} ${expect}
+
diff --git a/tests/dmaap-buscontroller/suite1/__init__.robot b/tests/dmaap-buscontroller/suite1/__init__.robot
new file mode 100644
index 00000000..41c7a003
--- /dev/null
+++ b/tests/dmaap-buscontroller/suite1/__init__.robot
@@ -0,0 +1,3 @@
+*** Settings ***
+Documentation dmaap-buscontroller - Suite 1
+
diff --git a/tests/dmaap-buscontroller/suite1/test1.robot b/tests/dmaap-buscontroller/suite1/test1.robot
new file mode 100644
index 00000000..be4e8cc6
--- /dev/null
+++ b/tests/dmaap-buscontroller/suite1/test1.robot
@@ -0,0 +1,42 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+
+*** Variables ***
+${MESSAGE} Hello, world!
+${DBC_URI} /webapi
+
+*** Test Cases ***
+String Equality Test
+ Should Be Equal ${MESSAGE} Hello, world!
+
+Dir Test
+ [Documentation] Check if /tmp exists
+ Log ${MESSAGE}
+ CheckDir /tmp
+
+Url Test
+ [Documentation] Check if www.onap.org can be reached
+ Create Session openo http://www.onap.org
+ CheckUrl openo / 200
+
+Mock Hello Server Test
+ [Documentation] Check /hello endpoint
+ Create Session hello http://${AAF_IP}:1080
+ CheckUrl hello /hello 200
+
+Heartbeat Test
+ [Documentation] Check ${DBC_URI}/info endpoint
+ Create Session heartbeat http://${DMAAPBC_IP}:8080
+ CheckUrl heartbeat ${DBC_URI}/info 204
+
+*** Keywords ***
+CheckDir
+ [Arguments] ${path}
+ Directory Should Exist ${path}
+
+CheckUrl
+ [Arguments] ${session} ${path} ${expect}
+ ${resp}= Get Request ${session} ${path}
+ Should Be Equal As Integers ${resp.status_code} ${expect}
+
diff --git a/tests/dmaap-buscontroller/with_dr/orig b/tests/dmaap-buscontroller/with_dr/orig
new file mode 100755
index 00000000..fcac2026
--- /dev/null
+++ b/tests/dmaap-buscontroller/with_dr/orig
@@ -0,0 +1,116 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+Library String
+
+*** Variables ***
+${TARGET_URL} https://${DR_PROV_IP}:8443
+${TARGET_URL_FEED} https://${DR_PROV_IP}:8443/feed/1
+${TARGET_URL_SUBSCRIBE} https://${DR_PROV_IP}:8443/subscribe/1
+${TARGET_URL_SUBSCRIPTION} https://${DR_PROV_IP}:8443/subs/1
+${TARGET_URL_PUBLISH} https://${DR_NODE_IP}:8443/publish/1/csit_test
+${CREATE_FEED_DATA} {"name": "CSIT_Test", "version": "m1.0", "description": "CSIT_Test", "business_description": "CSIT_Test", "suspend": false, "deleted": false, "changeowner": true, "authorization": {"classification": "unclassified", "endpoint_addrs": [], "endpoint_ids": [{"password": "rs873m", "id": "rs873m"}]}}
+${UPDATE_FEED_DATA} {"name": "CSIT_Test", "version": "m1.0", "description": "UPDATED-CSIT_Test", "business_description": "CSIT_Test", "suspend": true, "deleted": false, "changeowner": true, "authorization": {"classification": "unclassified", "endpoint_addrs": [], "endpoint_ids": [{"password": "rs873m", "id": "rs873m"}]}}
+${SUBSCRIBE_DATA} {"delivery":{ "url":"https://${DR_PROV_IP}:8080/", "user":"rs873m", "password":"rs873m", "use100":true}, "metadataOnly":false, "suspend":false, "groupid":29, "subscriber":"sg481n"}
+${UPDATE_SUBSCRIPTION_DATA} {"delivery":{ "url":"https://${DR_PROV_IP}:8080/", "user":"sg481n", "password":"sg481n", "use100":true}, "metadataOnly":false, "suspend":true, "groupid":29, "subscriber":"sg481n"}
+${FEED_CONTENT_TYPE} application/vnd.att-dr.feed
+${SUBSCRIBE_CONTENT_TYPE} application/vnd.att-dr.subscription
+${PUBLISH_FEED_CONTENT_TYPE} application/octet-stream
+
+*** Test Cases ***
+Run Feed Creation
+ [Documentation] Feed Creation
+ [Timeout] 1 minute
+ ${resp}= PostCall ${TARGET_URL} ${CREATE_FEED_DATA} ${FEED_CONTENT_TYPE} rs873m
+ log ${TARGET_URL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+ log 'JSON Response Code:'${resp}
+
+Run Subscribe to Feed
+ [Documentation] Subscribe to Feed
+ [Timeout] 1 minute
+ ${resp}= PostCall ${TARGET_URL_SUBSCRIBE} ${SUBSCRIBE_DATA} ${SUBSCRIBE_CONTENT_TYPE} sg481n
+ log ${TARGET_URL_SUBSCRIBE}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+ log 'JSON Response Code:'${resp}
+
+Run Publish Feed
+ [Documentation] Publish to Feed
+ [Timeout] 1 minute
+ Sleep 10s Behaviour was noticed where feed was not created in time for publish to be sent
+ ${resp}= PutCall ${TARGET_URL_PUBLISH} ${CREATE_FEED_DATA} ${PUBLISH_FEED_CONTENT_TYPE} rs873m
+ log ${TARGET_URL_PUBLISH}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+ log 'JSON Response Code:'${resp}
+
+Run Update Subscription
+ [Documentation] Update Subscription to suspend and change delivery credentials
+ [Timeout] 1 minute
+ ${resp}= PutCall ${TARGET_URL_SUBSCRIPTION} ${UPDATE_SUBSCRIPTION_DATA} ${SUBSCRIBE_CONTENT_TYPE} sg481n
+ log ${TARGET_URL_SUBSCRIPTION}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+ log 'JSON Response Code:'${resp}
+ ${resp}= GetCall ${TARGET_URL_SUBSCRIPTION} ${SUBSCRIBE_CONTENT_TYPE} sg481n
+ log ${resp.text}
+ Should Contain ${resp.text} "password":"sg481n","user":"sg481n"
+ log 'JSON Response Code:'${resp}
+
+Run Update Feed
+ [Documentation] Update Feed description and suspend
+ [Timeout] 1 minute
+ ${resp}= PutCall ${TARGET_URL_FEED} ${UPDATE_FEED_DATA} ${FEED_CONTENT_TYPE} rs873m
+ log ${TARGET_URL_FEED}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+ log 'JSON Response Code:'${resp}
+ ${resp}= GetCall ${TARGET_URL_FEED} ${FEED_CONTENT_TYPE} rs873m
+ log ${resp.text}
+ Should Contain ${resp.text} "UPDATED-CSIT_Test"
+ log 'JSON Response Code:'${resp}
+
+Run Delete Subscription
+ [Documentation] Delete Subscription
+ [Timeout] 1 minute
+ ${resp}= DeleteCall ${TARGET_URL_SUBSCRIPTION} sg481n
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+ log 'JSON Response Code:'${resp}
+
+Run Delete Feed
+ [Documentation] Delete Feed
+ [Timeout] 1 minute
+ ${resp}= DeleteCall ${TARGET_URL_FEED} rs873m
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+ log 'JSON Response Code:'${resp}
+
+*** Keywords ***
+PostCall
+ [Arguments] ${url} ${data} ${content_type} ${user}
+ ${headers}= Create Dictionary X-ATT-DR-ON-BEHALF-OF=${user} Content-Type=${content_type}
+ ${resp}= Evaluate requests.post('${url}',data='${data}', headers=${headers},verify=False) requests
+ [Return] ${resp}
+
+PutCall
+ [Arguments] ${url} ${data} ${content_type} ${user}
+ ${headers}= Create Dictionary X-ATT-DR-ON-BEHALF-OF=${user} Content-Type=${content_type} Authorization=Basic cnM4NzNtOnJzODczbQ==
+ ${resp}= Evaluate requests.put('${url}',data='${data}', headers=${headers},verify=False) requests
+ [Return] ${resp}
+
+GetCall
+ [Arguments] ${url} ${content_type} ${user}
+ ${headers}= Create Dictionary X-ATT-DR-ON-BEHALF-OF=${user} Content-Type=${content_type}
+ ${resp}= Evaluate requests.get('${url}', headers=${headers},verify=False) requests
+ [Return] ${resp}
+
+DeleteCall
+ [Arguments] ${url} ${user}
+ ${headers}= Create Dictionary X-ATT-DR-ON-BEHALF-OF=${user}
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers},verify=False) requests
+ [Return] ${resp}
diff --git a/tests/dmaap-buscontroller/with_dr/test1.robot b/tests/dmaap-buscontroller/with_dr/test1.robot
new file mode 100644
index 00000000..a3aef42b
--- /dev/null
+++ b/tests/dmaap-buscontroller/with_dr/test1.robot
@@ -0,0 +1,143 @@
+*** Settings ***
+Resource ../../common.robot
+Library Collections
+Library json
+Library OperatingSystem
+Library RequestsLibrary
+Library HttpLibrary.HTTP
+Library String
+
+
+*** Variables ***
+${MESSAGE} Hello, world!
+${DBC_URI} webapi
+${DBC_URL} http://${DMAAPBC_IP}:8080/${DBC_URI}
+${LOC} csit-sanfrancisco
+${PUB_CORE} "dcaeLocationName": "${LOC}", "clientRole": "org.onap.dmaap.client.pub", "action": [ "pub", "view" ]
+${SUB_CORE} "dcaeLocationName": "${LOC}", "clientRole": "org.onap.dmaap.client.sub", "action": [ "sub", "view" ]
+${PUB} { ${PUB_CORE} }
+${SUB} { ${SUB_CORE} }
+${FEED1_DATA} { "feedName":"feed1", "feedVersion": "csit", "feedDescription":"generated for CSIT", "owner":"dgl", "asprClassification": "unclassified" }
+${FEED2_DATA} { "feedName":"feed2", "feedVersion": "csit", "feedDescription":"generated for CSIT", "owner":"dgl", "asprClassification": "unclassified" }
+${PUB2_DATA} { "dcaeLocationName": "${LOC}", "username": "pub2", "userpwd": "topSecret123", "feedId": "2" }
+${SUB2_DATA} { "dcaeLocationName": "${LOC}", "username": "sub2", "userpwd": "someSecret123", "deliveryURL": "https://${DMAAPBC_IP}:8443/webapi/noURI", "feedId": "2" }
+${TOPIC2_DATA} { "topicName":"singleMRtopic2", "topicDescription":"generated for CSIT", "owner":"dgl", "clients": [ ${PUB}, ${SUB}] }
+${TOPIC3_DATA} { "topicName":"singleMRtopic3", "topicDescription":"generated for CSIT", "owner":"dgl"}
+#${PUB3_DATA} { "fqtn": "${TOPIC_NS}.singleMRtopic3", ${PUB_CORE} }
+#${SUB3_DATA} { "fqtn": "${TOPIC_NS}.singleMRtopic3", ${SUB_CORE} }
+
+
+
+*** Test Cases ***
+Url Test
+ [Documentation] Check if www.onap.org can be reached
+ Create Session sanity http://onap.readthedocs.io
+ ${resp}= Get Request sanity /
+ Should Be Equal As Integers ${resp.status_code} 200
+
+(DMAAP-441c1)
+ [Documentation] Create Feed w no clients POST ${DBC_URI}/feeds endpoint
+ ${resp}= PostCall ${DBC_URL}/feeds ${FEED1_DATA}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+(DMAAP-441c2)
+ [Documentation] Create Feed w clients POST ${DBC_URI}/feeds endpoint
+ ${resp}= PostCall ${DBC_URL}/feeds ${FEED2_DATA}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+(DMAAP-441c3)
+ [Documentation] Add Publisher to existing feed
+ ${resp}= PostCall ${DBC_URL}/dr_pubs ${PUB2_DATA}
+ Should Be Equal As Integers ${resp.status_code} 201
+ ${tmp}= Get Json Value ${resp.text} /pubId
+ ${tmp}= Remove String ${tmp} \"
+ Set Suite Variable ${pubId} ${tmp}
+
+(DMAAP-441c4)
+ [Documentation] Add Subscriber to existing feed
+ ${resp}= PostCall ${DBC_URL}/dr_subs ${SUB2_DATA}
+ Should Be Equal As Integers ${resp.status_code} 201
+ ${tmp}= Get Json Value ${resp.text} /subId
+ ${tmp}= Remove String ${tmp} \"
+ Set Suite Variable ${subId} ${tmp}
+
+(DMAAP-443)
+ [Documentation] List existing feeds
+ Create Session get ${DBC_URL}
+ ${resp}= Get Request get /feeds
+ Should Be Equal As Integers ${resp.status_code} 200
+
+(DMAAP-444)
+ [Documentation] Delete existing subscriber
+ ${resp}= DelCall ${DBC_URL}/dr_subs/${subId}
+ Should Be Equal As Integers ${resp.status_code} 204
+
+(DMAAP-445)
+ [Documentation] Delete existing publisher
+ ${resp}= DelCall ${DBC_URL}/dr_pubs/${pubId}
+ Should Be Equal As Integers ${resp.status_code} 204
+
+#(DMAAP-294)
+# [Documentation] Create Topic w pub and sub clients POST ${DBC_URI}/topics endpoint
+# ${resp}= PostCall ${DBC_URL}/topics ${TOPIC2_DATA}
+# Should Be Equal As Integers ${resp.status_code} 201
+#
+#(DMAAP-295)
+# [Documentation] Create Topic w no clients and then add a client POST ${DBC_URI}/mr_clients endpoint
+# ${resp}= PostCall ${DBC_URL}/topics ${TOPIC3_DATA}
+# Should Be Equal As Integers ${resp.status_code} 201
+# ${resp}= PostCall ${DBC_URL}/mr_clients ${PUB3_DATA}
+# Should Be Equal As Integers ${resp.status_code} 200
+# ${resp}= PostCall ${DBC_URL}/mr_clients ${SUB3_DATA}
+# Should Be Equal As Integers ${resp.status_code} 200
+#
+#(DMAAP-297)
+# [Documentation] Query for all topics and specific topic
+# Create Session get ${DBC_URL}
+# ${resp}= Get Request get /topics
+# Should Be Equal As Integers ${resp.status_code} 200
+# ${resp}= Get Request get /topics/${TOPIC_NS}.singleMRtopic3
+# Should Be Equal As Integers ${resp.status_code} 200
+#
+#(DMAAP-301)
+# [Documentation] Delete a subscriber
+# Create Session get ${DBC_URL}
+# ${resp}= Get Request get /topics/${TOPIC_NS}.singleMRtopic3
+# Should Be Equal As Integers ${resp.status_code} 200
+# ${tmp}= Get Json Value ${resp.text} /clients/1/mrClientId
+# ${clientId}= Remove String ${tmp} \"
+# ${resp}= DelCall ${DBC_URL}/mr_clients/${clientId}
+# Should Be Equal As Integers ${resp.status_code} 204
+#
+#(DMAAP-302)
+# [Documentation] Delete a publisher
+# Create Session get ${DBC_URL}
+# ${resp}= Get Request get /topics/${TOPIC_NS}.singleMRtopic3
+# Should Be Equal As Integers ${resp.status_code} 200
+# ${tmp}= Get Json Value ${resp.text} /clients/0/mrClientId
+# ${clientId}= Remove String ${tmp} \"
+# ${resp}= DelCall ${DBC_URL}/mr_clients/${clientId}
+# Should Be Equal As Integers ${resp.status_code} 204
+
+
+*** Keywords ***
+CheckDir
+ [Arguments] ${path}
+ Directory Should Exist ${path}
+
+CheckUrl
+ [Arguments] ${session} ${path} ${expect}
+ ${resp}= Get Request ${session} ${path}
+ Should Be Equal As Integers ${resp.status_code} ${expect}
+
+PostCall
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ ${resp}= Evaluate requests.post('${url}',data='${data}', headers=${headers},verify=False) requests
+ [Return] ${resp}
+
+DelCall
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers},verify=False) requests
+ [Return] ${resp}
diff --git a/tests/dmaap-datarouter/dr-suite/dr-suite.robot b/tests/dmaap-datarouter/dr-suite/dr-suite.robot
new file mode 100755
index 00000000..fcac2026
--- /dev/null
+++ b/tests/dmaap-datarouter/dr-suite/dr-suite.robot
@@ -0,0 +1,116 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+Library String
+
+*** Variables ***
+${TARGET_URL} https://${DR_PROV_IP}:8443
+${TARGET_URL_FEED} https://${DR_PROV_IP}:8443/feed/1
+${TARGET_URL_SUBSCRIBE} https://${DR_PROV_IP}:8443/subscribe/1
+${TARGET_URL_SUBSCRIPTION} https://${DR_PROV_IP}:8443/subs/1
+${TARGET_URL_PUBLISH} https://${DR_NODE_IP}:8443/publish/1/csit_test
+${CREATE_FEED_DATA} {"name": "CSIT_Test", "version": "m1.0", "description": "CSIT_Test", "business_description": "CSIT_Test", "suspend": false, "deleted": false, "changeowner": true, "authorization": {"classification": "unclassified", "endpoint_addrs": [], "endpoint_ids": [{"password": "rs873m", "id": "rs873m"}]}}
+${UPDATE_FEED_DATA} {"name": "CSIT_Test", "version": "m1.0", "description": "UPDATED-CSIT_Test", "business_description": "CSIT_Test", "suspend": true, "deleted": false, "changeowner": true, "authorization": {"classification": "unclassified", "endpoint_addrs": [], "endpoint_ids": [{"password": "rs873m", "id": "rs873m"}]}}
+${SUBSCRIBE_DATA} {"delivery":{ "url":"https://${DR_PROV_IP}:8080/", "user":"rs873m", "password":"rs873m", "use100":true}, "metadataOnly":false, "suspend":false, "groupid":29, "subscriber":"sg481n"}
+${UPDATE_SUBSCRIPTION_DATA} {"delivery":{ "url":"https://${DR_PROV_IP}:8080/", "user":"sg481n", "password":"sg481n", "use100":true}, "metadataOnly":false, "suspend":true, "groupid":29, "subscriber":"sg481n"}
+${FEED_CONTENT_TYPE} application/vnd.att-dr.feed
+${SUBSCRIBE_CONTENT_TYPE} application/vnd.att-dr.subscription
+${PUBLISH_FEED_CONTENT_TYPE} application/octet-stream
+
+*** Test Cases ***
+Run Feed Creation
+ [Documentation] Feed Creation
+ [Timeout] 1 minute
+ ${resp}= PostCall ${TARGET_URL} ${CREATE_FEED_DATA} ${FEED_CONTENT_TYPE} rs873m
+ log ${TARGET_URL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+ log 'JSON Response Code:'${resp}
+
+Run Subscribe to Feed
+ [Documentation] Subscribe to Feed
+ [Timeout] 1 minute
+ ${resp}= PostCall ${TARGET_URL_SUBSCRIBE} ${SUBSCRIBE_DATA} ${SUBSCRIBE_CONTENT_TYPE} sg481n
+ log ${TARGET_URL_SUBSCRIBE}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+ log 'JSON Response Code:'${resp}
+
+Run Publish Feed
+ [Documentation] Publish to Feed
+ [Timeout] 1 minute
+ Sleep 10s Behaviour was noticed where feed was not created in time for publish to be sent
+ ${resp}= PutCall ${TARGET_URL_PUBLISH} ${CREATE_FEED_DATA} ${PUBLISH_FEED_CONTENT_TYPE} rs873m
+ log ${TARGET_URL_PUBLISH}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+ log 'JSON Response Code:'${resp}
+
+Run Update Subscription
+ [Documentation] Update Subscription to suspend and change delivery credentials
+ [Timeout] 1 minute
+ ${resp}= PutCall ${TARGET_URL_SUBSCRIPTION} ${UPDATE_SUBSCRIPTION_DATA} ${SUBSCRIBE_CONTENT_TYPE} sg481n
+ log ${TARGET_URL_SUBSCRIPTION}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+ log 'JSON Response Code:'${resp}
+ ${resp}= GetCall ${TARGET_URL_SUBSCRIPTION} ${SUBSCRIBE_CONTENT_TYPE} sg481n
+ log ${resp.text}
+ Should Contain ${resp.text} "password":"sg481n","user":"sg481n"
+ log 'JSON Response Code:'${resp}
+
+Run Update Feed
+ [Documentation] Update Feed description and suspend
+ [Timeout] 1 minute
+ ${resp}= PutCall ${TARGET_URL_FEED} ${UPDATE_FEED_DATA} ${FEED_CONTENT_TYPE} rs873m
+ log ${TARGET_URL_FEED}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+ log 'JSON Response Code:'${resp}
+ ${resp}= GetCall ${TARGET_URL_FEED} ${FEED_CONTENT_TYPE} rs873m
+ log ${resp.text}
+ Should Contain ${resp.text} "UPDATED-CSIT_Test"
+ log 'JSON Response Code:'${resp}
+
+Run Delete Subscription
+ [Documentation] Delete Subscription
+ [Timeout] 1 minute
+ ${resp}= DeleteCall ${TARGET_URL_SUBSCRIPTION} sg481n
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+ log 'JSON Response Code:'${resp}
+
+Run Delete Feed
+ [Documentation] Delete Feed
+ [Timeout] 1 minute
+ ${resp}= DeleteCall ${TARGET_URL_FEED} rs873m
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+ log 'JSON Response Code:'${resp}
+
+*** Keywords ***
+PostCall
+ [Arguments] ${url} ${data} ${content_type} ${user}
+ ${headers}= Create Dictionary X-ATT-DR-ON-BEHALF-OF=${user} Content-Type=${content_type}
+ ${resp}= Evaluate requests.post('${url}',data='${data}', headers=${headers},verify=False) requests
+ [Return] ${resp}
+
+PutCall
+ [Arguments] ${url} ${data} ${content_type} ${user}
+ ${headers}= Create Dictionary X-ATT-DR-ON-BEHALF-OF=${user} Content-Type=${content_type} Authorization=Basic cnM4NzNtOnJzODczbQ==
+ ${resp}= Evaluate requests.put('${url}',data='${data}', headers=${headers},verify=False) requests
+ [Return] ${resp}
+
+GetCall
+ [Arguments] ${url} ${content_type} ${user}
+ ${headers}= Create Dictionary X-ATT-DR-ON-BEHALF-OF=${user} Content-Type=${content_type}
+ ${resp}= Evaluate requests.get('${url}', headers=${headers},verify=False) requests
+ [Return] ${resp}
+
+DeleteCall
+ [Arguments] ${url} ${user}
+ ${headers}= Create Dictionary X-ATT-DR-ON-BEHALF-OF=${user}
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers},verify=False) requests
+ [Return] ${resp}
diff --git a/tests/dmaap/mrpubsub/mrpubsub.robot b/tests/dmaap/mrpubsub/mrpubsub.robot
new file mode 100755
index 00000000..c711bd75
--- /dev/null
+++ b/tests/dmaap/mrpubsub/mrpubsub.robot
@@ -0,0 +1,73 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+Library String
+
+*** Variables ***
+${TARGETURL_PUBLISH} http://${DMAAP_MR_IP}:3904/events/TestTopic1
+${TARGETURL_TOPICS} http://${DMAAP_MR_IP}:3904/topics
+${TARGETURL_SUBSCR} http://${DMAAP_MR_IP}:3904/events/TestTopic1/CG1/C1?timeout=1000
+${TEST_DATA} {"topicName": "TestTopic1"}
+${TOPIC_DATA} {"topicName":"FirstTopic","topicDescription":"This is a TestTopic","partitionCount":"1","replicationCount":"3","transactionEnabled":"true"}
+
+*** Test Cases ***
+Run Topic Creation and Publish
+ [Documentation] Topic Creation
+ [Timeout] 1 minute
+ ${resp}= PostCall ${TARGETURL_PUBLISH} ${TEST_DATA}
+ log ${TARGETURL_PUBLISH}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${count}= Evaluate $resp.json().get('count')
+ log 'JSON Response Code:'${resp}
+
+Run Subscribing a message status
+ [Documentation] Subscribide message status
+ [Timeout] 1 minute
+ ${resp}= GetCall ${TARGETURL_SUBSCR}
+ log ${TARGETURL_SUBSCR}
+ Should Be Equal As Strings ${resp.status_code} 200
+ log 'JSON Response Code :'${resp}
+
+Run check topics are exisiting
+ [Documentation] Get the count of the Topics
+ [Timeout] 1 minute
+ ${resp}= GetCall ${TARGETURL_TOPICS}
+ log ${TARGETURL_TOPICS}
+ Should Be Equal As Strings ${resp.status_code} 200
+ log 'JSON Response Code :'${resp}
+ ${topics}= Evaluate $resp.json().get('topics')
+ log ${topics}
+ ${ListLength}= Get Length ${topics}
+ log ${ListLength}
+ List Should Contain Value ${topics} TestTopic1
+
+Run Publich and Subscribe a message
+ [Documentation] Publish and Subscribe the message
+ [Timeout] 1 minute
+ ${resp}= PostCall ${TARGETURL_PUBLISH} ${TEST_DATA}
+ log ${TARGETURL_PUBLISH}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${sub_resp}= GetCall ${TARGETURL_SUBSCR}
+ log ${TARGETURL_SUBSCR}
+ Should Be Equal As Strings ${sub_resp.status_code} 200
+ log 'JSON Response Code :'${sub_resp}
+ ${ListLength}= Get Length ${sub_resp.json()}
+ log ${ListLength}
+ List Should Contain Value ${sub_resp.json()} {"topicName":"TestTopic1"} case_insensitive=yes
+
+*** Keywords ***
+PostCall
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ ${resp}= Evaluate requests.post('${url}',data='${data}', headers=${headers},verify=False) requests
+ [Return] ${resp}
+
+GetCall
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, verify=False) requests
+ [Return] ${resp}
diff --git a/tests/externalapi-nbi/healthcheck/__init__.robot b/tests/externalapi-nbi/healthcheck/__init__.robot
new file mode 100644
index 00000000..82635078
--- /dev/null
+++ b/tests/externalapi-nbi/healthcheck/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation ExternalAPI-NBI - healthcheck
diff --git a/tests/externalapi-nbi/healthcheck/healthcheck.robot b/tests/externalapi-nbi/healthcheck/healthcheck.robot
new file mode 100644
index 00000000..6c3ec296
--- /dev/null
+++ b/tests/externalapi-nbi/healthcheck/healthcheck.robot
@@ -0,0 +1,33 @@
+*** Settings ***
+Documentation The main interface for interacting with External API/NBI
+Library RequestsLibrary
+Library Collections
+
+*** Variables ***
+${GLOBAL_NBI_SERVER_PROTOCOL} http
+${GLOBAL_INJECTED_NBI_IP_ADDR} localhost
+${GLOBAL_NBI_SERVER_PORT} 8080
+${NBI_HEALTH_CHECK_PATH} /nbi/api/v3/status
+${NBI_ENDPOINT} ${GLOBAL_NBI_SERVER_PROTOCOL}://${GLOBAL_INJECTED_NBI_IP_ADDR}:${GLOBAL_NBI_SERVER_PORT}
+
+*** Test Cases ***
+NBI Health Check
+ Run NBI Health Check
+
+*** Keywords ***
+Run NBI Health Check
+ [Documentation] Runs NBI Health check
+ ${resp}= Run NBI Get Request ${NBI_HEALTH_CHECK_PATH}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+Run NBI Get Request
+ [Documentation] Runs NBI Get request
+ [Arguments] ${data_path}
+ ${session}= Create Session session ${NBI_ENDPOINT}
+ ${resp}= Get Request session ${data_path}
+ Should Be Equal As Integers ${resp.status_code} 200
+ Log Received response from NBI ${resp.text}
+ ${json}= Set Variable ${resp.json()}
+ ${status}= Get From Dictionary ${json} status
+ Should Be Equal ${status} ok
+ [Return] ${resp}
diff --git a/tests/holmes/testcase/CommonKeywords/HttpRequest.robot b/tests/holmes/testcase/CommonKeywords/HttpRequest.robot
new file mode 100644
index 00000000..45bec5ef
--- /dev/null
+++ b/tests/holmes/testcase/CommonKeywords/HttpRequest.robot
@@ -0,0 +1,37 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Resource ../RuleMgt/Rule-Keywords.robot
+
+*** Keywords ***
+httpPut
+ [Arguments] ${restHost} ${restUrl} ${data}
+ ${headers} create dictionary Content-Type=application/json;charset=utf-8 Accept=application/json
+ create session microservices ${restHost} ${headers}
+ log ${data}
+ ${putResponse} put request microservices ${restUrl} ${data} \ ${EMPTY}
+ ... ${headers}
+ log ${putResponse}
+ [Return] ${putResponse}
+
+httpGet
+ [Arguments] ${restHost} ${restUrl}
+ create session microservices ${restHost}
+ ${getResponse} get request microservices ${restUrl}
+ [Return] ${getResponse}
+
+httpPost
+ [Arguments] ${restHost} ${restUrl} ${data}
+ ${headers} create dictionary Content-Type=application/json Accept=application/json
+ create session microservices ${restHost} ${headers}
+ log ${data}
+ ${postResponse} post request microservices ${restUrl} ${data}
+ Comment log ${postResponse.content}
+ [Return] ${postResponse}
+
+httpDelete
+ [Arguments] ${restHost} ${restUrl}
+ ${headers} create dictionary Content-Type=application/json Accept=application/json
+ create session microservices ${restHost} ${headers}
+ ${deleteResponse} delete request microservices ${restUrl}
+ [Return] ${deleteResponse}
diff --git a/tests/holmes/testcase/EngineMgt/Engine-Keywords.robot b/tests/holmes/testcase/EngineMgt/Engine-Keywords.robot
new file mode 100644
index 00000000..aac86767
--- /dev/null
+++ b/tests/holmes/testcase/EngineMgt/Engine-Keywords.robot
@@ -0,0 +1,34 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Resource ../CommonKeywords/HttpRequest.robot
+Resource EngineAddr.robot
+
+*** Keywords ***
+deleteEngineRule
+ [Arguments] ${packageName} ${codeFlag}=1
+ [Documentation] ${packageName} :The data type is string!
+ ${headers} create dictionary Content-Type=application/json
+ create session microservices ${engineHost} ${headers}
+ ${deleteUrl} set variable ${engineUrl}/${packageName}
+ ${deleteResponse} delete request microservices ${deleteUrl}
+ log ${deleteResponse.content}
+ run keyword if ${codeFlag}==1 Should be equal as strings ${deleteResponse.status_code} 200
+ run keyword if ${codeFlag}!=1 Should be equal as strings ${deleteResponse.status_code} 499
+ [Return] ${deleteResponse}
+
+verifyEngineRule
+ [Arguments] ${checkContent} ${codeFlag}=1
+ ${response} httpPost ${engineHost} ${engineUrl} ${checkContent}
+ log ${response.content}
+ run keyword if ${codeFlag}==1 Should be equal as strings ${response.status_code} 200
+ run keyword if ${codeFlag}!=1 Should be equal as strings ${response.status_code} 499
+ [Return] ${response}
+
+deployEngineRule
+ [Arguments] ${jsonParams} ${codeFlag}=1
+ ${response} httpPut ${engineHost} ${engineUrl} ${jsonParams}
+ log ${response.content}
+ run keyword if ${codeFlag}==1 Should be equal as strings ${response.status_code} 200
+ run keyword if ${codeFlag}!=1 Should be equal as strings ${response.status_code} 499
+ [Return] ${response}
diff --git a/tests/holmes/testcase/EngineMgt/Engine-Mgt.robot b/tests/holmes/testcase/EngineMgt/Engine-Mgt.robot
new file mode 100644
index 00000000..5a8e8114
--- /dev/null
+++ b/tests/holmes/testcase/EngineMgt/Engine-Mgt.robot
@@ -0,0 +1,41 @@
+*** Settings ***
+Suite Setup
+Suite Teardown Delete All Sessions
+Test Teardown
+Test Timeout
+Library demjson
+Resource Engine-Keywords.robot
+Resource ../RuleMgt/Rule-Keywords.robot
+
+*** Test Cases ***
+verify_invalid_rule
+ [Documentation] Verify a rule with invalid contents.
+ ${dic1} create dictionary content=123123123
+ ${Jsonparam} encode ${dic1}
+ verifyEngineRule ${Jsonparam} -1
+
+verify_valid_rule
+ [Documentation] Verify a rule with valid contents.
+ ${dic2} create dictionary content=package rule03080001
+ ${Jsonparam} encode ${dic2}
+ verifyEngineRule ${Jsonparam}
+
+deploy_invalid_rule
+ [Documentation] Add a rule with invalid contents to the engine.
+ ${dic3} create dictionary content=789789789 engineId=""
+ ${Jsonparam} encode ${dic3}
+ ${response} deployEngineRule ${Jsonparam} -1
+
+deploy_valid_rule
+ [Documentation] Add a rule with valid contents to the engine.
+ ${dic4} create dictionary content=package rule03080002;\n\nimport java.util.Locale; engineId="" loopControlName=test
+ ${Jsonparam} encode ${dic4}
+ ${response} deployEngineRule ${Jsonparam}
+
+delete_existing_rule
+ [Documentation] Delete an existing rule using an existing package ID from the engine.
+ deleteEngineRule rule03080002
+
+delete_non_existing_rule
+ [Documentation] Delete an existing rule using a non-existing package ID from the engine.
+ deleteEngineRule rule03080002 -1
diff --git a/tests/holmes/testcase/EngineMgt/EngineAddr.robot b/tests/holmes/testcase/EngineMgt/EngineAddr.robot
new file mode 100644
index 00000000..71354d33
--- /dev/null
+++ b/tests/holmes/testcase/EngineMgt/EngineAddr.robot
@@ -0,0 +1,3 @@
+*** Variables ***
+${engineHost} http://${MSB_IP}
+${engineUrl} /api/holmes-engine-mgmt/v1/rule
diff --git a/tests/holmes/testcase/EngineMgt/__init__.txt b/tests/holmes/testcase/EngineMgt/__init__.txt
new file mode 100644
index 00000000..a69b32dc
--- /dev/null
+++ b/tests/holmes/testcase/EngineMgt/__init__.txt
@@ -0,0 +1,2 @@
+*** Settings ***
+Suite Setup
diff --git a/tests/holmes/testcase/RuleMgt/Rule-Keywords.robot b/tests/holmes/testcase/RuleMgt/Rule-Keywords.robot
new file mode 100644
index 00000000..3ce4be48
--- /dev/null
+++ b/tests/holmes/testcase/RuleMgt/Rule-Keywords.robot
@@ -0,0 +1,80 @@
+*** Settings ***
+Library RequestsLibrary
+Library Collections
+Resource RuleAddr.robot
+Resource ../CommonKeywords/HttpRequest.robot
+
+*** Keywords ***
+prepareRules
+ ${rule1} create dictionary rulename=ying001 content=package rule0001 enabled=1 description=this is first description
+ ${rule2} create dictionary rulename=ying002 content=package rule0002 enabled=0 description=this is seconddescription
+ ${rule3} create dictionary rulename=ying003 content=package rule0003 enabled=1 description=this is third description
+ @{rulesList} create list ${rule1} ${rule2} ${rule3}
+ : FOR ${row} IN @{rulesList}
+ \ ${rulejson} encode ${row}
+ \ log ${rulejson}
+ \ createRule ${rulejson}
+
+ruleMgtSuiteVariable
+ ${RULEDIC} create dictionary rulename=gy2017001 description=create a new rule! content=package rule2017001 enabled=1
+ set suite variable ${RULEDIC}
+
+queryConditionRule
+ [Arguments] ${queryParam} ${codeFlag}=1
+ [Documentation] ${queryParam} : The data type is Json .
+ create session microservices ${ruleMgtHost}
+ Comment ${param} set variable queryrequest\=${queryParam}
+ ${getResponse} get request microservices ${ruleMgtUrl}?queryrequest\=${queryParam}
+ log ${getResponse.content}
+ run keyword if ${codeFlag}==1 Should be equal as strings ${getResponse.status_code} 200
+ run keyword if ${codeFlag}!=1 Should be equal as strings ${getResponse.status_code} 499
+ [Return] ${getResponse}
+
+traversalRuleAttribute
+ [Arguments] ${responseJsonData} ${expectAttrDic}
+ [Documentation] ${expectAttrDic} : The data type is dictionary;
+ ... key is the name of the attribute, value is the expected value of the attribute.
+ @{responseRules} Get From Dictionary ${responseJsonData} correlationRules
+ : FOR ${rule} IN @{responseRules}
+ \ log ${rule}
+ \ verifyRuleAttribute ${rule} ${expectAttrDic}
+
+verifyRuleAttribute
+ [Arguments] ${singleRule} ${expectAttrDic}
+ [Documentation] ${expectAttrDic} : The data type is dictionary; key is the name of the attributes to be traversaled, value is the expected value of the attributes.
+ log ${singleRule}
+ log ${expectAttrDic}
+ @{attrsKeys} get dictionary keys ${expectAttrDic}
+ : FOR ${attr} IN @{attrsKeys}
+ \ log ${attr}
+ \ ${actualResponse} get from dictionary ${singleRule} ${attr}
+ \ ${expectResponse} get from dictionary ${expectAttrDic} ${attr}
+ \ Comment log ${actualResponse}
+ \ Comment log ${expectResponse}
+ Should be equal as strings ${actualResponse} ${expectResponse}
+
+createRule
+ [Arguments] ${jsonParams} ${codeFlag}=1
+ [Documentation] ${codeFlag} : The data type is string, defult value is 1, indicating that the case need to assert thatthe statues code is 200.
+ ... Then other values indicating that the case need to assert that the statues code is 499.
+ ${response} httpPut ${ruleMgtHost} ${ruleMgtUrl} ${jsonParams}
+ log ${response.content}
+ run keyword if ${codeFlag}==1 Should be equal as strings ${response.status_code} 200
+ run keyword if ${codeFlag}!=1 Should be equal as strings ${response.status_code} 499
+ [Return] ${response}
+
+modifyRule
+ [Arguments] ${jsonParams} ${codeFlag}=1
+ ${response} httpPost ${ruleMgtHost} ${ruleMgtUrl} ${jsonParams}
+ log ${response.content}
+ run keyword if ${codeFlag}==1 Should be equal as strings ${response.status_code} 200
+ run keyword if ${codeFlag}!=1 Should be equal as strings ${response.status_code} 499
+ [Return] ${response}
+
+deleteRule
+ [Arguments] ${ruleId} ${codeFlag}=1
+ ${response} httpDelete ${ruleMgtHost} ${ruleMgtUrl}/${ruleId}
+ log ${response.content}
+ run keyword if ${codeFlag}==1 Should be equal as strings ${response.status_code} 200
+ run keyword if ${codeFlag}!=1 Should be equal as strings ${response.status_code} 499
+ [Return] ${response}
diff --git a/tests/holmes/testcase/RuleMgt/Rule-Mgt.robot b/tests/holmes/testcase/RuleMgt/Rule-Mgt.robot
new file mode 100644
index 00000000..55e57ecd
--- /dev/null
+++ b/tests/holmes/testcase/RuleMgt/Rule-Mgt.robot
@@ -0,0 +1,127 @@
+*** Settings ***
+Suite Setup
+Suite Teardown Delete All Sessions
+Test Timeout
+Library demjson
+Resource Rule-Keywords.robot
+
+*** Test Cases ***
+add_valid_rule
+ [Documentation] Add a valid rule.
+ ${dict2} create dictionary ruleName=youbowu0314 description=create a new rule! content=package ruleqwertasd;\n\nimport java.util.Locale; enabled=1 loopControlName=closedControlLoop
+ ${jsonParams} encode ${dict2}
+ ${response} createRule ${jsonParams}
+ ${respJson} to json ${response.content}
+ ${RULEID} get from dictionary ${respJson} ruleId
+ set global variable ${RULEID}
+ log ${RULEID}
+
+add_invalid_content_rule
+ [Documentation] Add an invalid rule of which the content is incorrect!!
+ ${dict1} create dictionary ruleName=gy0307001 description=create a new rule! content=123123123 enabled=1
+ ${jsonParams} encode ${dict1}
+ ${response} createRule ${jsonParams} -1
+ log ${response.content}
+
+add_deficient_rule
+ [Documentation] Add an invalid rule of which some mandatory fields are missing.(rulename)
+ ${dict3} create dictionary description=create a valid rule! content=package rule2017 enabled=1
+ ${jsonParams} encode ${dict3}
+ ${response} createRule ${jsonParams} -1
+
+query_rule_with_existing_id
+ [Documentation] Query a rule with an existing ID.
+ should not be empty ${RULEID}
+ ${response} queryConditionRule {"ruleid":"${RULEID}"}
+ ${respJson} to json ${response.content}
+ ${count} get from dictionary ${respJson} totalCount
+ run keyword if ${count}!=1 fail Can't find the rule with the specified ruleid.
+
+query_rule_with_non_existing_id
+ [Documentation] Query a rule with a non-existing ID.
+ ${response} queryConditionRule {"ruleId":"invalidid"}
+ ${respJson} to json ${response.content}
+ ${count} get from dictionary ${respJson} totalCount
+ run keyword if ${count}!=0 fail
+
+query_rule_with_partial_existing_name
+ [Documentation] Query rules with (a part of) an existing name.
+ ${response} queryConditionRule {"ruleName":"youbowu"}
+ ${respJson} to json ${response.content}
+ ${count} get from dictionary ${respJson} totalCount
+ run keyword if ${count}<1 fail Can't find the rule with (a part of) an existing name
+
+query_rule_with_partial_non_existing_name
+ [Documentation] Query rules with (a part of) a non-existing name.
+ ${response} queryConditionRule {"ruleName":"zte2017"}
+ ${respJson} to json ${response.content}
+ ${count} get from dictionary ${respJson} totalCount
+ run keyword if ${count}!=0 fail
+
+query_rule_with_vaild_status
+ [Documentation] Query rules with a valid status.
+ ${response} queryConditionRule {"enabled":1}
+ ${respJson} to json ${response.content}
+ ${count} get from dictionary ${respJson} totalCount
+ run keyword if ${count}<0 fail Can't find the rule with the status valued 1.
+
+query_rule_with_invalid_status
+ [Documentation] Query rules with an invalid status.
+ ${response} queryConditionRule {"enabled":99}
+ ${respJson} to json ${response.content}
+ ${count} get from dictionary ${respJson} totalCount
+ run keyword if ${count}!=0 fail
+
+query_rule_with_empty_status
+ [Documentation] Query rules with the status left empty.
+ ${response} queryConditionRule {"enabled":null}
+ ${respJson} to json ${response.content}
+ ${count} get from dictionary ${respJson} totalCount
+ run keyword if ${count}!=0 fail
+
+query_rule_with_combinational_fields
+ [Documentation] Query rules using the combination of different fields.
+ ${dic} create dictionary ruleName=youbowu0314 enabled=1
+ ${paramJson} encode ${dic}
+ ${response} queryConditionRule ${paramJson}
+ ${respJson} to json ${response.content}
+ ${count} get from dictionary ${respJson} totalCount
+ run keyword if ${count}<1 fail Can't find the rules with the combination of different fields. ELSE traversalRuleAttribute ${respJson}
+ ... ${dic}
+
+modify_rule_with_status
+ [Documentation] modify the rule with a valid status.
+ ${dic} create dictionary ruleId=${RULEID} enabled=0 content=package rule03140002 loopControlName=closedControlLoop
+ ${modifyParam} encode ${dic}
+ ${modifyResp} modifyRule ${modifyParam}
+ ${response} queryConditionRule {"ruleId":"${RULEID}"}
+ ${respJson} to json ${response.content}
+ ${count} get from dictionary ${respJson} totalCount
+ run keyword if ${count}!=1 fail query rule fails! (can't find the rule modified!) ELSE traversalRuleAttribute ${respJson}
+ ... ${dic}
+
+modify_rule_with_invalid_status
+ [Documentation] modify the rule with an invalid status.
+ ${dic} create dictionary ruleId=${RULEID} enabled=88 content=package rule03140002
+ ${modifyParam} encode ${dic}
+ ${modifyResponse} modifyRule ${modifyParam} -1
+
+modify_rule_with_description
+ [Documentation] modify the description of the rule with the new string.
+ ${dic} create dictionary ruleId=${RULEID} description=now, i modifying the description of the rule. content=package rule03140002 loopControlName=closedControlLoop
+ ${modifyParam} encode ${dic}
+ ${modifyResp} modifyRule ${modifyParam}
+ ${response} queryConditionRule {"ruleId":'${RULEID}'} 1
+ ${respJson} to json ${response.content}
+ ${count} get from dictionary ${respJson} totalCount
+ run keyword if ${count}!=1 fail query rule fails! ELSE traversalRuleAttribute ${respJson}
+ ... ${dic}
+
+delete_existing_rule
+ [Documentation] Delete an existing rule.
+ should not be empty ${RULEID}
+ deleteRule ${RULEID}
+
+delete_non_existing_rule
+ [Documentation] Delete a non-existing rule.
+ deleteRule ${RULEID} -1
diff --git a/tests/holmes/testcase/RuleMgt/RuleAddr.robot b/tests/holmes/testcase/RuleMgt/RuleAddr.robot
new file mode 100644
index 00000000..be738420
--- /dev/null
+++ b/tests/holmes/testcase/RuleMgt/RuleAddr.robot
@@ -0,0 +1,3 @@
+*** Variables ***
+${ruleMgtHost} http://${MSB_IP}
+${ruleMgtUrl} /api/holmes-rule-mgmt/v1/rule
diff --git a/tests/holmes/testcase/RuleMgt/__init__.txt b/tests/holmes/testcase/RuleMgt/__init__.txt
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/holmes/testcase/RuleMgt/__init__.txt
diff --git a/tests/integration/suite1/__init__.robot b/tests/integration/suite1/__init__.robot
new file mode 100644
index 00000000..f310a65b
--- /dev/null
+++ b/tests/integration/suite1/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Integration - Suite 1
diff --git a/tests/integration/suite1/test1.robot b/tests/integration/suite1/test1.robot
new file mode 100644
index 00000000..10e68521
--- /dev/null
+++ b/tests/integration/suite1/test1.robot
@@ -0,0 +1,30 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+
+*** Variables ***
+${MESSAGE} Hello, world!
+
+*** Test Cases ***
+String Equality Test
+ Should Be Equal ${MESSAGE} Hello, world!
+
+Dir Test
+ [Documentation] Check if /tmp exists
+ Log ${MESSAGE}
+ CheckDir /tmp
+
+Url Test
+ [Documentation] Check if google.com can be reached
+ CheckUrl http://www.google.com
+
+*** Keywords ***
+CheckDir
+ [Arguments] ${path}
+ Directory Should Exist ${path}
+
+CheckUrl
+ [Arguments] ${url}
+ Create Session session ${url}
+ ${resp}= Get Request session /
+ Should Be Equal As Integers ${resp.status_code} 200
diff --git a/tests/integration/suite2/__init__.robot b/tests/integration/suite2/__init__.robot
new file mode 100644
index 00000000..f04a3af2
--- /dev/null
+++ b/tests/integration/suite2/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Integration - Suite 2
diff --git a/tests/integration/suite2/test1.robot b/tests/integration/suite2/test1.robot
new file mode 100644
index 00000000..722dadfb
--- /dev/null
+++ b/tests/integration/suite2/test1.robot
@@ -0,0 +1,35 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+
+*** Variables ***
+${MESSAGE} Hello, world!
+
+*** Test Cases ***
+String Equality Test
+ Should Be Equal ${MESSAGE} Hello, world!
+
+Dir Test
+ [Documentation] Check if /tmp exists
+ Log ${MESSAGE}
+ CheckDir /tmp
+
+Url Test
+ [Documentation] Check if www.onap.org can be reached
+ Create Session openo http://www.onap.org
+ CheckUrl openo /
+
+Mock Hello Server Test
+ [Documentation] Check /hello endpoint
+ Create Session hello http://${MOCK_IP}:1080
+ CheckUrl hello /hello
+
+*** Keywords ***
+CheckDir
+ [Arguments] ${path}
+ Directory Should Exist ${path}
+
+CheckUrl
+ [Arguments] ${session} ${path}
+ ${resp}= Get Request ${session} ${path}
+ Should Be Equal As Integers ${resp.status_code} 200
diff --git a/tests/integration/vCPE/__init__.robot b/tests/integration/vCPE/__init__.robot
new file mode 100644
index 00000000..b2057b0d
--- /dev/null
+++ b/tests/integration/vCPE/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Integration - vCPE
diff --git a/tests/integration/vCPE/test1.robot b/tests/integration/vCPE/test1.robot
new file mode 100644
index 00000000..1dd7c1bb
--- /dev/null
+++ b/tests/integration/vCPE/test1.robot
@@ -0,0 +1,60 @@
+*** Settings ***
+Suite Setup Suite Setup
+Suite Teardown Suite Teardown
+Library OperatingSystem
+Library RequestsLibrary
+Library Process
+Library eteutils/UUID.py
+
+*** Variables ***
+${GLOBAL_APPLICATION_ID} csit-vCPE
+${GLOBAL_MSO_USERNAME} InfraPortalClient
+${GLOBAL_MSO_PASSWORD} password1$
+
+*** Test Cases ***
+SO ServiceInstance health check
+ ${auth}= Create List ${GLOBAL_MSO_USERNAME} ${GLOBAL_MSO_PASSWORD}
+ ${session}= Create Session so http://${SO_IP}:8080
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=text/html Content-Type=text/html X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Get Request so /ecomp/mso/infra/globalhealthcheck headers=${headers}
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Get Request so /ecomp/mso/infra/orchestrationRequests/v2 headers=${headers}
+ Should Not Contain ${resp.content} null
+
+*** Keywords ***
+Run Docker
+ [Arguments] ${image} ${name} ${parameters}=${EMPTY}
+ ${result}= Run Process docker run --name ${name} ${parameters} -d ${image} shell=True
+ Should Be Equal As Integers ${result.rc} 0
+ Log ${result.stdout}
+ ${result}= Run Process docker inspect --format '{{ .NetworkSettings.IPAddress }}' ${name} shell=True
+ Should Be Equal As Integers ${result.rc} 0
+ Log ${result.stdout}
+ [Return] ${result.stdout}
+
+Kill Docker
+ [Arguments] ${name}
+ ${result}= Run Process docker logs ${name} shell=True
+ Should Be Equal As Integers ${result.rc} 0
+ Log ${result.stdout}
+ ${result}= Run Process docker kill ${name} shell=True
+ Should Be Equal As Integers ${result.rc} 0
+ Log ${result.stdout}
+ ${result}= Run Process docker rm ${name} shell=True
+ Should Be Equal As Integers ${result.rc} 0
+ Log ${result.stdout}
+
+CheckUrl
+ [Arguments] ${url}
+ Create Session session ${url} disable_warnings=True
+ ${resp}= Get Request session /
+ Should Be Equal As Integers ${resp.status_code} 200
+
+Suite Setup
+ ${SO_IP}= Run Docker nexus3.onap.org:10001/openecomp/mso i-so
+ Wait Until Keyword Succeeds 1 min 5 sec CheckUrl http://${SO_IP}:8080
+ Set Suite Variable ${SO_IP}
+
+Suite Teardown
+ Kill Docker i-so
diff --git a/tests/modeling-toscaparsers-javatoscachecker/APIs/__init__.robot b/tests/modeling-toscaparsers-javatoscachecker/APIs/__init__.robot
new file mode 100644
index 00000000..8064d6b0
--- /dev/null
+++ b/tests/modeling-toscaparsers-javatoscachecker/APIs/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation javatoscachecker - APIs
diff --git a/tests/modeling-toscaparsers-javatoscachecker/APIs/basics.robot b/tests/modeling-toscaparsers-javatoscachecker/APIs/basics.robot
new file mode 100644
index 00000000..053b2824
--- /dev/null
+++ b/tests/modeling-toscaparsers-javatoscachecker/APIs/basics.robot
@@ -0,0 +1,62 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+
+*** Test Cases ***
+Check service up/non existent namespace
+ CreateSession checkerservice http://localhost:8080
+ &{headers}= Create Dictionary Accept=application/json
+ ${resp}= Get Request checkerservice /check_template/nosuchcatalog headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Check standalone template
+ CreateSession checkerservice http://localhost:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}standalone.yaml
+ &{headers}= Create Dictionary Accept=application/json
+ ${resp}= Post Request checkerservice /check_template/ data=${data} headers=${headers}
+ Log Response received from checker ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Be Equal As Strings ${resp.text} []
+
+Check standalone template with errors
+ CreateSession checkerservice http://localhost:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}standalone_with_errors.yaml
+ &{headers}= Create Dictionary Accept=application/json
+ ${resp}= Post Request checkerservice /check_template/ data=${data} headers=${headers}
+ Log Response received from checker ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Not Be Equal As Strings ${resp.text} []
+
+Check schema new namespace
+ CreateSession checkerservice http://localhost:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}test_schema.yaml
+ &{headers}= Create Dictionary Accept=application/json
+ ${resp}= Post Request checkerservice /check_template/test/schema.yaml data=${data} headers=${headers}
+ Log Response received from checker ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Be Equal As Strings ${resp.text} []
+
+Check template in namespace
+ CreateSession checkerservice http://localhost:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}test_template.yaml
+ &{headers}= Create Dictionary Accept=application/json
+ ${resp}= Post Request checkerservice /check_template/test/ data=${data} headers=${headers}
+ Log Response received from checker ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Be Equal As Strings ${resp.text} []
+
+Check named template does not exist
+ CreateSession checkerservice http://localhost:8080
+ &{headers}= Create Dictionary Accept=application/json
+ ${resp}= Get Request checkerservice /check_template/test/nosuchtemplate.yaml headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Check delete existing namespace
+ CreateSession checkerservice http://localhost:8080
+ &{headers}= Create Dictionary Accept=application/json
+ ${resp}= Delete Request checkerservice /check_template/test/ headers=${headers}
+ Log Response received from checker ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
diff --git a/tests/modeling-toscaparsers-javatoscachecker/APIs/data/standalone.yaml b/tests/modeling-toscaparsers-javatoscachecker/APIs/data/standalone.yaml
new file mode 100644
index 00000000..26797aba
--- /dev/null
+++ b/tests/modeling-toscaparsers-javatoscachecker/APIs/data/standalone.yaml
@@ -0,0 +1,21 @@
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+topology_template:
+ node_templates:
+ my_server:
+ type: tosca.nodes.Compute
+ capabilities:
+ # Host container properties
+ host:
+ properties:
+ num_cpus: 1
+ disk_size: 10 GB
+ mem_size: 4096 MB
+ # Guest Operating System properties
+ os:
+ properties:
+ # host Operating System image properties
+ architecture: x86_64
+ type: linux
+ distribution: rhel
+ version: 6.5
diff --git a/tests/modeling-toscaparsers-javatoscachecker/APIs/data/standalone_with_errors.yaml b/tests/modeling-toscaparsers-javatoscachecker/APIs/data/standalone_with_errors.yaml
new file mode 100644
index 00000000..d5c1a158
--- /dev/null
+++ b/tests/modeling-toscaparsers-javatoscachecker/APIs/data/standalone_with_errors.yaml
@@ -0,0 +1,23 @@
+tosca_definitions_version: tosca_simple_yaml_1_0
+description: uses unknown capability propertya to trigger an error
+
+topology_template:
+ node_templates:
+ my_server:
+ type: tosca.nodes.Compute
+ capabilities:
+ # Host container properties
+ host:
+ properties:
+ num_cpus: 1
+ disk_size: 10 GB
+ mem_size: 4096 MB
+ virtualization_support: true
+ # Guest Operating System properties
+ os:
+ properties:
+ # host Operating System image properties
+ architecture: x86_64
+ type: linux
+ distribution: rhel
+ version: 6.5
diff --git a/tests/modeling-toscaparsers-javatoscachecker/APIs/data/test_schema.yaml b/tests/modeling-toscaparsers-javatoscachecker/APIs/data/test_schema.yaml
new file mode 100644
index 00000000..9575e27c
--- /dev/null
+++ b/tests/modeling-toscaparsers-javatoscachecker/APIs/data/test_schema.yaml
@@ -0,0 +1,17 @@
+tosca_definitions_version: tosca_simple_yaml_1_1
+
+data_types:
+ org.onap.tosca.checker.service.Person:
+ properties:
+ firstName:
+ type: string
+ required: true
+ lastName:
+ type: string
+ required: true
+
+node_types:
+ org.onap.tosca.checker.service.Residence:
+ properties:
+ owner:
+ type: org.onap.tosca.checker.service.Person
diff --git a/tests/modeling-toscaparsers-javatoscachecker/APIs/data/test_template.yaml b/tests/modeling-toscaparsers-javatoscachecker/APIs/data/test_template.yaml
new file mode 100644
index 00000000..478aec05
--- /dev/null
+++ b/tests/modeling-toscaparsers-javatoscachecker/APIs/data/test_template.yaml
@@ -0,0 +1,11 @@
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+imports:
+ - schema: schema.yaml
+
+topology_template:
+ node_templates:
+ my_house:
+ type: org.onap.tosca.checker.service.Residence
+ properties:
+ owner: {firstName: "Serban", lastName: "Jora"}
diff --git a/tests/msb/rest-service-api-gateway/__init__.robot b/tests/msb/rest-service-api-gateway/__init__.robot
new file mode 100644
index 00000000..efd2221f
--- /dev/null
+++ b/tests/msb/rest-service-api-gateway/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Microservices Service Bus - Messag Broker
diff --git a/tests/msb/rest-service-api-gateway/test1.robot b/tests/msb/rest-service-api-gateway/test1.robot
new file mode 100644
index 00000000..8a15bf2b
--- /dev/null
+++ b/tests/msb/rest-service-api-gateway/test1.robot
@@ -0,0 +1,9 @@
+*** Settings ***
+Library Collections
+Library requests
+
+*** Test Cases ***
+REST service Test1
+ [Documentation] Check if test rest service can be accessed via aip gateway
+ ${result} = get http://${MSB_IAG_IP}/api/test/v1/people
+ Should Be Equal ${result.status_code} ${200}
diff --git a/tests/msb/rest-service-discovery/__init__.robot b/tests/msb/rest-service-discovery/__init__.robot
new file mode 100644
index 00000000..efd2221f
--- /dev/null
+++ b/tests/msb/rest-service-discovery/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Microservices Service Bus - Messag Broker
diff --git a/tests/msb/rest-service-discovery/test1.robot b/tests/msb/rest-service-discovery/test1.robot
new file mode 100644
index 00000000..bb48d3fd
--- /dev/null
+++ b/tests/msb/rest-service-discovery/test1.robot
@@ -0,0 +1,14 @@
+*** Settings ***
+Library Collections
+Library requests
+
+*** Test Cases ***
+Messag Broker Test
+ [Documentation] Check if the test service enpoint can be get from MSB
+ ${result} = get http://${MSB_DISCOVERY_IP}:10081/api/microservices/v1/services/test/version/v1
+ Should Be Equal ${result.status_code} ${200}
+ ${json} = Set Variable ${result.json()}
+ ${serviceName} = Get From Dictionary ${json} serviceName
+ ${protocol} = Get From Dictionary ${json} protocol
+ Should Be Equal ${serviceName} test
+ Should Be Equal ${protocol} REST \ No newline at end of file
diff --git a/tests/msb/startup/__init__.robot b/tests/msb/startup/__init__.robot
new file mode 100644
index 00000000..2f645262
--- /dev/null
+++ b/tests/msb/startup/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Microservices Service Bus - Startup
diff --git a/tests/msb/startup/test1.robot b/tests/msb/startup/test1.robot
new file mode 100644
index 00000000..99ad603c
--- /dev/null
+++ b/tests/msb/startup/test1.robot
@@ -0,0 +1,16 @@
+*** Settings ***
+Library RequestsLibrary
+
+*** Test Cases ***
+Liveness Test
+ [Documentation] Check various endpoints for basic liveness check
+ Create Session msb http://${MSB_IAG_IP}:80
+ CheckUrl msb /msb
+ CheckUrl msb /iui/microservices/default.html
+
+*** Keywords ***
+CheckUrl
+ [Arguments] ${session} ${path}
+ ${resp}= Get Request ${session} ${path}
+ Should Be Equal As Integers ${resp.status_code} 200
+
diff --git a/tests/msb/tcp-service-access/__init__.robot b/tests/msb/tcp-service-access/__init__.robot
new file mode 100644
index 00000000..efd2221f
--- /dev/null
+++ b/tests/msb/tcp-service-access/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Microservices Service Bus - Messag Broker
diff --git a/tests/msb/tcp-service-access/test1.robot b/tests/msb/tcp-service-access/test1.robot
new file mode 100644
index 00000000..e84c7e1a
--- /dev/null
+++ b/tests/msb/tcp-service-access/test1.robot
@@ -0,0 +1,16 @@
+*** Settings ***
+Library Collections
+Library requests
+
+*** Test Cases ***
+Messag Broker Test1
+ [Documentation] Check if ActiveMQ index page can be accessed
+ ${result} = get http://${MSB_DISCOVERY_IP}:10081/api/microservices/v1/services/ActiveMQ/version/null
+ Should Be Equal ${result.status_code} ${200}
+ ${json} = Set Variable ${result.json()}
+ ${activeMQ_ip} = Set Variable ${json["nodes"][0]["ip"]}
+ ${activeMQ_port} = Set Variable ${json["nodes"][0]["port"]}
+
+ ${result} = get http://${activeMQ_ip}:8161
+ Should Be Equal ${result.status_code} ${200}
+
diff --git a/tests/msb/tcp-service-access/test2.robot b/tests/msb/tcp-service-access/test2.robot
new file mode 100644
index 00000000..58e5471b
--- /dev/null
+++ b/tests/msb/tcp-service-access/test2.robot
@@ -0,0 +1,15 @@
+*** Settings ***
+Library Collections
+Library requests
+Library Telnet
+
+*** Test Cases ***
+Messag Broker Test2
+ [Documentation] Check if ActiveMQ listening port can be accessed
+ ${result} = get http://${MSB_DISCOVERY_IP}:10081/api/microservices/v1/services/ActiveMQ/version/null
+ Should Be Equal ${result.status_code} ${200}
+ ${json} = Set Variable ${result.json()}
+ ${activeMQ_ip} = Set Variable ${json["nodes"][0]["ip"]}
+ ${activeMQ_port} = Set Variable ${json["nodes"][0]["port"]}
+
+ Open Connection ${activeMQ_ip} port=${activeMQ_port}
diff --git a/tests/msb/tcp-service-discovery/__init__.robot b/tests/msb/tcp-service-discovery/__init__.robot
new file mode 100644
index 00000000..efd2221f
--- /dev/null
+++ b/tests/msb/tcp-service-discovery/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Microservices Service Bus - Messag Broker
diff --git a/tests/msb/tcp-service-discovery/test1.robot b/tests/msb/tcp-service-discovery/test1.robot
new file mode 100644
index 00000000..da6cb3ef
--- /dev/null
+++ b/tests/msb/tcp-service-discovery/test1.robot
@@ -0,0 +1,14 @@
+*** Settings ***
+Library Collections
+Library requests
+
+*** Test Cases ***
+Messag Broker Test
+ [Documentation] Check if the message broker enpoint can be get from MSB
+ ${result} = get http://${MSB_DISCOVERY_IP}:10081/api/microservices/v1/services/ActiveMQ/version/null
+ Should Be Equal ${result.status_code} ${200}
+ ${json} = Set Variable ${result.json()}
+ ${serviceName} = Get From Dictionary ${json} serviceName
+ ${protocol} = Get From Dictionary ${json} protocol
+ Should Be Equal ${serviceName} ActiveMQ
+ Should Be Equal ${protocol} TCP \ No newline at end of file
diff --git a/tests/multicloud-ocata/provision/hpa_multicloud.robot b/tests/multicloud-ocata/provision/hpa_multicloud.robot
new file mode 100644
index 00000000..95d4d554
--- /dev/null
+++ b/tests/multicloud-ocata/provision/hpa_multicloud.robot
@@ -0,0 +1,17 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryregistration_url} /api/multicloud-ocata/v0/CloudOwner_RegionOne/registry
+
+
+*** Test Cases ***
+OcataRegistryTest
+ [Documentation] Register openstack cloud resources
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${SERVICE_IP}:${SERVICE_PORT} headers=${headers}
+ ${resp}= Post Request web_session ${queryregistration_url}
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
diff --git a/tests/multicloud-ocata/provision/sanity_test_multicloud.robot b/tests/multicloud-ocata/provision/sanity_test_multicloud.robot
new file mode 100644
index 00000000..c6262524
--- /dev/null
+++ b/tests/multicloud-ocata/provision/sanity_test_multicloud.robot
@@ -0,0 +1,22 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryswagger_ocata_url} /api/multicloud-ocata/v0/swagger.json
+
+
+*** Test Cases ***
+OcataSwaggerTest
+ [Documentation] query swagger info rest test
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${SERVICE_IP}:${SERVICE_PORT} headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_ocata_url}
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0
diff --git a/tests/multicloud-pike/provision/hpa_multicloud.robot b/tests/multicloud-pike/provision/hpa_multicloud.robot
new file mode 100644
index 00000000..f96b542b
--- /dev/null
+++ b/tests/multicloud-pike/provision/hpa_multicloud.robot
@@ -0,0 +1,17 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryregistration_url} /api/multicloud-pike/v0/CloudOwner_RegionOne/registry
+
+
+*** Test Cases ***
+OcataRegistryTest
+ [Documentation] Register openstack cloud resources
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${SERVICE_IP}:${SERVICE_PORT} headers=${headers}
+ ${resp}= Post Request web_session ${queryregistration_url}
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
diff --git a/tests/multicloud-pike/provision/sanity_test_multicloud.robot b/tests/multicloud-pike/provision/sanity_test_multicloud.robot
new file mode 100644
index 00000000..36fcea3f
--- /dev/null
+++ b/tests/multicloud-pike/provision/sanity_test_multicloud.robot
@@ -0,0 +1,22 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryswagger_pike_url} /api/multicloud-pike/v0/swagger.json
+
+
+*** Test Cases ***
+OcataSwaggerTest
+ [Documentation] query swagger info rest test
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${SERVICE_IP}:${SERVICE_PORT} headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_pike_url}
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0
diff --git a/tests/multicloud-vmware/hosts/sanity-host.robot b/tests/multicloud-vmware/hosts/sanity-host.robot
new file mode 100644
index 00000000..e74a7997
--- /dev/null
+++ b/tests/multicloud-vmware/hosts/sanity-host.robot
@@ -0,0 +1,24 @@
+*** settings ***
+Resource ../../common.robot
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+
+
+*** Test Cases ***
+
+TestGetHost
+ [Documentation] Sanity Test - Get Host
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session api/multicloud-vio/v0/vmware_fake/1234/hosts/1
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ #Log To Console ${response_json}
diff --git a/tests/multicloud-vmware/images/sanity-image.robot b/tests/multicloud-vmware/images/sanity-image.robot
new file mode 100644
index 00000000..390433d5
--- /dev/null
+++ b/tests/multicloud-vmware/images/sanity-image.robot
@@ -0,0 +1,24 @@
+*** settings ***
+Resource ../../common.robot
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+
+
+*** Test Cases ***
+
+TestGetHost
+ [Documentation] Sanity Test - Get Image
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session api/multicloud-vio/v0/vmware_fake/1234/images/1
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ #Log To Console ${response_json}
diff --git a/tests/multicloud-vmware/networks/sanity-network.robot b/tests/multicloud-vmware/networks/sanity-network.robot
new file mode 100644
index 00000000..5433f18c
--- /dev/null
+++ b/tests/multicloud-vmware/networks/sanity-network.robot
@@ -0,0 +1,24 @@
+*** settings ***
+Resource ../../common.robot
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+
+
+*** Test Cases ***
+
+TestGetHost
+ [Documentation] Sanity Test - Get Network
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session api/multicloud-vio/v0/vmware_fake/1234/networks/1
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ #Log To Console ${response_json}
diff --git a/tests/multicloud-vmware/nova/jsoninput/multicloud_create_server.json b/tests/multicloud-vmware/nova/jsoninput/multicloud_create_server.json
new file mode 100644
index 00000000..ecaaa12d
--- /dev/null
+++ b/tests/multicloud-vmware/nova/jsoninput/multicloud_create_server.json
@@ -0,0 +1,16 @@
+{
+ "server":
+ {
+ "name": "server-csit-1",
+ "boot":
+ {
+ "type":2,
+ "imageId": "08edf57c-e65d-4778-957a-1524ff795c4b"
+ },
+ "flavorId": "1",
+ "nicArray":
+ [{
+ "portId": "71847500-8edf-42f9-be69-78432ccadc6e"
+ }]
+ }
+} \ No newline at end of file
diff --git a/tests/multicloud-vmware/nova/sanity-flavor.robot b/tests/multicloud-vmware/nova/sanity-flavor.robot
new file mode 100644
index 00000000..5adafb5a
--- /dev/null
+++ b/tests/multicloud-vmware/nova/sanity-flavor.robot
@@ -0,0 +1,62 @@
+*** settings ***
+Resource ../../common.robot
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${get_token_url} /api/multicloud-vio/v0/vmware_fake/identity/v3/auth/tokens
+
+#json files
+${auth_info_json} ${SCRIPTS}/../tests/multicloud-vmware/provision/jsoninput/auth_info.json
+
+#global vars
+${TOKEN}
+${TENANTID}
+${flavor1Id}
+
+*** Test Cases ***
+
+GetAuthToken
+ [Documentation] Sanity test - Get Auth Token
+ ${json_value}= json_from_file ${auth_info_json}
+ ${json_string}= string_from_json ${json_value}
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= POST Request web_session ${get_token_url} ${json_string}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${TOKEN}= Convert To String ${response_json['token']['value']}
+ ${TENANTID}= Convert To String ${response_json['token']['project']['id']}
+ Set Global Variable ${TOKEN}
+ Set Global Variable ${TENANTID}
+
+
+ListFlavorsFuncTest
+ [Documentation] get a list of flavors info rest test
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= GET Request web_session api/multicloud-vio/v0/vmware_fake/nova/${TENANTID}/flavors
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ #Log To Console ${response_json}
+ ${flavor1Id}= Convert To String ${response_json['flavors'][0]['id']}
+ Set Global Variable ${flavor1Id}
+ #Log To Console ${flavor1Id}
+
+GetFlavorFuncTest
+ [Documentation] get the specific flavor info rest test
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= GET Request web_session api/multicloud-vio/v0/vmware_fake/nova/${TENANTID}/flavors/${flavor1Id}
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ #Log To Console ${response_json}
+
diff --git a/tests/multicloud-vmware/nova/sanity-host.robot b/tests/multicloud-vmware/nova/sanity-host.robot
new file mode 100644
index 00000000..444c68e1
--- /dev/null
+++ b/tests/multicloud-vmware/nova/sanity-host.robot
@@ -0,0 +1,83 @@
+*** settings ***
+Resource ../../common.robot
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${get_token_url} /api/multicloud-vio/v0/vmware_fake/identity/v3/auth/tokens
+
+#json files
+${auth_info_json} ${SCRIPTS}/../tests/multicloud-vmware/provision/jsoninput/auth_info.json
+
+#global vars
+${TOKEN}
+${TENANTID}
+${host1Id}
+
+*** Test Cases ***
+
+GetAuthToken
+ [Documentation] Sanity test - Get Auth Token
+ ${json_value}= json_from_file ${auth_info_json}
+ ${json_string}= string_from_json ${json_value}
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= POST Request web_session ${get_token_url} ${json_string}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${TOKEN}= Convert To String ${response_json['token']['value']}
+ ${TENANTID}= Convert To String ${response_json['token']['project']['id']}
+ Set Global Variable ${TOKEN}
+ Set Global Variable ${TENANTID}
+
+TestListHosts
+ [Documentation] Sanity Test - List Hosts
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session api/multicloud-vio/v0/vmware_fake/nova/${TENANTID}/os-hypervisors/detail
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ #Log To Console ${response_json}
+ ${host1Id}= Convert To String ${response_json['hypervisors'][0]['service']['id']}
+ Set Global Variable ${host1Id}
+
+TestGetHost
+ [Documentation] Sanity Test - Get Host
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session api/multicloud-vio/v0/vmware_fake/nova/${TENANTID}/os-hypervisors/${host1Id}
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ #Log To Console ${response_json}
+
+TestHostUptime
+ [Documentation] Sanity Test - Host Uptime
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session api/multicloud-vio/v0/vmware_fake/nova/${TENANTID}/os-hypervisors/uptime
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ #Log To Console ${response_json}
+
+
+TestHostAggregates
+ [Documentation] Sanity Test - Host Aggregates
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session api/multicloud-vio/v0/vmware_fake/nova/${TENANTID}/os-aggregates
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ #Log To Console ${response_json}
+
+
+
diff --git a/tests/multicloud-vmware/nova/sanity-server.robot b/tests/multicloud-vmware/nova/sanity-server.robot
new file mode 100755
index 00000000..7a092e6f
--- /dev/null
+++ b/tests/multicloud-vmware/nova/sanity-server.robot
@@ -0,0 +1,105 @@
+*** settings ***
+Resource ../../common.robot
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+@{delete_ok_list}= 200 204
+${get_token_url} /api/multicloud-vio/v0/vmware_fake/identity/v3/auth/tokens
+
+#json files
+${auth_info_json} ${SCRIPTS}/../tests/multicloud-vmware/provision/jsoninput/auth_info.json
+${multicloud_create_server_json} ${SCRIPTS}/../tests/multicloud-vmware/nova/jsoninput/multicloud_create_server.json
+
+#global vars
+${TOKEN}
+${TENANTID}
+${server1Id}
+
+*** Test Cases ***
+
+GetAuthToken
+ [Documentation] Sanity test - Get Auth Token
+ ${json_value}= json_from_file ${auth_info_json}
+ ${json_string}= string_from_json ${json_value}
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= POST Request web_session ${get_token_url} ${json_string}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${TOKEN}= Convert To String ${response_json['token']['value']}
+ ${TENANTID}= Convert To String ${response_json['token']['project']['id']}
+ Set Global Variable ${TOKEN}
+ Set Global Variable ${TENANTID}
+
+CreateServerFuncTest
+ [Documentation] Sanity Test - Create Server
+ ${json_value}= json_from_file ${multicloud_create_server_json}
+ ${json_string}= string_from_json ${json_value}
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ Set Request Body ${json_string}
+ #Log To Console ${json_string}
+ ${resp}= Post Request web_session api/multicloud-vio/v0/vmware_fake/nova/${TENANTID}/servers ${json_string}
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ #Log To Console ${response_json}
+ ${server1Id}= Convert To String ${response_json['server']['id']}
+ Set Global Variable ${server1Id}
+
+
+GetServersFuncTest
+ [Documentation] Sanity Test - Get Servers
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session api/multicloud-vio/v0/vmware_fake/nova/${TENANTID}/servers
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ #Log To Console ${response_json}
+ #Log To Console ${server1Id}
+
+GetServerDetailFuncTest
+ [Documentation] Sanity Test - Get Server Detail
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session api/multicloud-vio/v0/vmware_fake/nova/${TENANTID}/servers/detail
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ #Log To Console ${response_json}
+
+GetServerFuncTest
+ [Documentation] Sanity Test - Get Server
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session api/multicloud-vio/v0/vmware_fake/nova/${TENANTID}/servers/${server1Id}
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ #Log To Console ${response_json}
+
+ServerActionFuncTest
+ [Documentation] Sanity Test - Server Action
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session api/multicloud-vio/v0/vmware_fake/nova/${TENANTID}/servers/${server1Id}/action
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${response_code}
+ ${response_json} json.loads ${resp.content}
+ #Log To Console ${response_json}
+
+DeleteServerFuncTest
+ [Documentation] Sanity Test - Delete Server
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Delete Request web_session api/multicloud-vio/v0/vmware_fake/nova/${TENANTID}/servers/${server1Id}
+ ${response_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${delete_ok_list} ${response_code}
diff --git a/tests/multicloud-vmware/provision/jsoninput/auth_info.json b/tests/multicloud-vmware/provision/jsoninput/auth_info.json
new file mode 100644
index 00000000..6d42f84d
--- /dev/null
+++ b/tests/multicloud-vmware/provision/jsoninput/auth_info.json
@@ -0,0 +1,10 @@
+{
+ "auth":
+ {
+ "scope": {"project": {"id": "a71c87345ad14533aa6496fca69d4840"}},
+ "identity":
+ {
+ "password": {"user": {"domain": {"name": "Default"}, "password": "vmware", "name": "admin"}}, "methods": ["password"]
+ }
+ }
+}
diff --git a/tests/multicloud-vmware/provision/jsoninput/image_file.json b/tests/multicloud-vmware/provision/jsoninput/image_file.json
new file mode 100644
index 00000000..1e3cac6f
--- /dev/null
+++ b/tests/multicloud-vmware/provision/jsoninput/image_file.json
@@ -0,0 +1,7 @@
+{
+ "name": "cirros-0.3.2-x86_64-disk",
+ "container_format": "bare",
+ "disk_format": "qcow2",
+ "visibility": "public",
+ "schema": "/v2/schemas/image"
+} \ No newline at end of file
diff --git a/tests/multicloud-vmware/provision/sanity_test_image.robot b/tests/multicloud-vmware/provision/sanity_test_image.robot
new file mode 100644
index 00000000..e8e36dc1
--- /dev/null
+++ b/tests/multicloud-vmware/provision/sanity_test_image.robot
@@ -0,0 +1,110 @@
+*** settings ***
+Resource ../../common.robot
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+@{delete_ok_list}= 200 204
+${get_token_url} /api/multicloud-vio/v0/vmware_fake/identity/v3/auth/tokens
+${get_image_url} /api/multicloud-vio/v0/vmware_fake/glance/v2/images
+${get_image_schema_url} /api/multicloud-vio/v0/vmware_fake/glance/v2/schemas/image
+${image_service} /api/multicloud-vio/v0/vmware_fake/glance/v2/image/file
+
+
+
+#json files
+${auth_info_json} ${SCRIPTS}/../tests/multicloud-vmware/provision/jsoninput/auth_info.json
+${image_file} ${SCRIPTS}/../tests/multicloud-vmware/provision/jsoninput/image_file.json
+
+#global vars
+${TOKEN}
+${IMAGEID}
+
+*** Test Cases ***
+
+GetAuthToken
+ [Documentation] Sanity test - Get Auth Token
+ ${json_value}= json_from_file ${auth_info_json}
+ ${json_string}= string_from_json ${json_value}
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= POST Request web_session ${get_token_url} ${json_string}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${TOKEN}= Convert To String ${response_json['token']['value']}
+ ${TENANTID}= Convert To String ${response_json['token']['project']['id']}
+ Set Global Variable ${TOKEN}
+
+
+
+
+
+TestCaseShowImageSchema
+ [Documentation] Sanity test - Show Image Schema
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session ${get_image_schema_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+
+
+
+
+TestCaseListImages
+ [Documentation] Sanity test - List Images
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session ${get_image_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${IMAGEID}= Convert To String ${response_json['images'][0]['id']}
+ Set Global Variable ${IMAGEID}
+
+
+
+
+TestCaseShowImage
+ [Documentation] Sanity test - Show Image
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session ${get_image_url}/${IMAGEID}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ Should Be Equal ${response_json['status']} active
+
+
+
+
+TestCaseUploadImage
+ [Documentation] Sanity test - Upload Image
+ ${json_value}= json_from_file ${image_file}
+ ${json_string}= string_from_json ${json_value}
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= POST Request web_session ${image_service} ${json_string}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${IMAGEID}= Convert To String ${response_json['id']}
+ Set Global Variable ${IMAGEID}
+
+
+
+
+TestCaseDownloadImage
+ [Documentation] Sanity test - Download Image
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session ${image_service}/${IMAGEID}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ Should Be Equal ${response_json['status']} active \ No newline at end of file
diff --git a/tests/multicloud-vmware/provision/sanity_test_neutron.robot b/tests/multicloud-vmware/provision/sanity_test_neutron.robot
new file mode 100644
index 00000000..d38b9983
--- /dev/null
+++ b/tests/multicloud-vmware/provision/sanity_test_neutron.robot
@@ -0,0 +1,62 @@
+*** settings ***
+Resource ../../common.robot
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+@{delete_ok_list}= 200 204
+${get_token_url} /api/multicloud-vio/v0/vmware_fake/identity/v3/auth/tokens
+${get_networks_url} /api/multicloud-vio/v0/vmware_fake/neutron/networks
+
+#json files
+${auth_info_json} ${SCRIPTS}/../tests/multicloud-vmware/provision/jsoninput/auth_info.json
+
+#global vars
+${TOKEN}
+${NETWORKID}
+
+*** Test Cases ***
+
+GetAuthToken
+ [Documentation] Sanity test - Get Auth Token
+ ${json_value}= json_from_file ${auth_info_json}
+ ${json_string}= string_from_json ${json_value}
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= POST Request web_session ${get_token_url} ${json_string}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${TOKEN}= Convert To String ${response_json['token']['value']}
+ ${TENANTID}= Convert To String ${response_json['token']['project']['id']}
+ Set Global Variable ${TOKEN}
+
+
+TestCaseListNetworks
+ [Documentation] Sanity test - List Networks
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session ${get_networks_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${NETWORKID}= Convert To String ${response_json['networks'][0]['id']}
+ Set Global Variable ${NETWORKID}
+
+
+
+
+TestCaseShowNetwork
+ [Documentation] Sanity test - Show Network
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session ${get_networks_url}/${NETWORKID}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ Should Be Equal ${response_json['network']['status']} ACTIVE
diff --git a/tests/multicloud-vmware/provision/sanity_test_tenant.robot b/tests/multicloud-vmware/provision/sanity_test_tenant.robot
new file mode 100644
index 00000000..86d569ee
--- /dev/null
+++ b/tests/multicloud-vmware/provision/sanity_test_tenant.robot
@@ -0,0 +1,59 @@
+*** settings ***
+Resource ../../common.robot
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+@{delete_ok_list}= 200 204
+${get_token_url} /api/multicloud-vio/v0/vmware_fake/identity/v3/auth/tokens
+${get_project_url} /api/multicloud-vio/v0/vmware_fake/identity/projects
+
+#json files
+${auth_info_json} ${SCRIPTS}/../tests/multicloud-vmware/provision/jsoninput/auth_info.json
+
+#global vars
+${TOKEN}
+${TENANTID}
+
+*** Test Cases ***
+
+GetAuthToken
+ [Documentation] Sanity test - Get Auth Token
+ ${json_value}= json_from_file ${auth_info_json}
+ ${json_string}= string_from_json ${json_value}
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= POST Request web_session ${get_token_url} ${json_string}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${TOKEN}= Convert To String ${response_json['token']['value']}
+ ${TENANTID}= Convert To String ${response_json['token']['project']['id']}
+ Set Global Variable ${TOKEN}
+ Set Global Variable ${TENANTID}
+
+
+TestCaseListTenants
+ [Documentation] Sanity test - List Tenants
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session ${get_project_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+
+
+
+TestCaseShowTenants
+ [Documentation] Sanity test - Show Tenant
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json X-Auth-Token=${TOKEN}
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session ${get_project_url}/${TENANTID}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
diff --git a/tests/multicloud-vmware/provision/sanity_test_vio.robot b/tests/multicloud-vmware/provision/sanity_test_vio.robot
new file mode 100644
index 00000000..d353f1da
--- /dev/null
+++ b/tests/multicloud-vmware/provision/sanity_test_vio.robot
@@ -0,0 +1,22 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryswagger_vio_url} /api/multicloud-vio/v0/swagger.json
+
+
+*** Test Cases ***
+VioSwaggerTest
+ [Documentation] query swagger info rest test
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_vio_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0
diff --git a/tests/multicloud-vmware/samples/sanity-sample.robot b/tests/multicloud-vmware/samples/sanity-sample.robot
new file mode 100644
index 00000000..fcb784b2
--- /dev/null
+++ b/tests/multicloud-vmware/samples/sanity-sample.robot
@@ -0,0 +1,25 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${querysample_vio_url} /samples
+
+*** Test Cases ***
+VioSwaggerTest
+ [Documentation] query swagger info rest test
+ ${headers} Create Dictionary Content-Type=application/json X-TRANSACTIONID=123456 Accept=application/json
+ Create Session web_session http://${VIO_IP}:9004 headers=${headers}
+ ${resp}= Get Request web_session ${querysample_vio_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ # verify logging output
+ ${response_json} json.loads ${resp.content}
+ ${logs}= Convert To String ${response_json['logs']}
+ Log To Console ${logs}
+ Should Contain ${logs} 123456
+ Should Contain ${logs} multicloud-vio
+ Should Contain ${logs} vio.samples.views \ No newline at end of file
diff --git a/tests/multicloud-windriver/provision/sanity_test_multicloud.robot b/tests/multicloud-windriver/provision/sanity_test_multicloud.robot
new file mode 100644
index 00000000..c257e33f
--- /dev/null
+++ b/tests/multicloud-windriver/provision/sanity_test_multicloud.robot
@@ -0,0 +1,22 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryswagger_windriver_url} /api/multicloud-titanium_cloud/v0/swagger.json
+
+
+*** Test Cases ***
+TitaniumCloudSwaggerTest
+ [Documentation] query swagger info rest test
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${SERVICE_IP}:${SERVICE_PORT} headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_windriver_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0
diff --git a/tests/multicloud/provision/data/capacity.json b/tests/multicloud/provision/data/capacity.json
new file mode 100644
index 00000000..9b1130d0
--- /dev/null
+++ b/tests/multicloud/provision/data/capacity.json
@@ -0,0 +1,6 @@
+{
+ "vCPU": 1,
+ "Memory": 1,
+ "Storage": 1,
+ "VIMs": ["vmware_fake"]
+} \ No newline at end of file
diff --git a/tests/multicloud/provision/sanity_test_multivim.robot b/tests/multicloud/provision/sanity_test_multivim.robot
new file mode 100644
index 00000000..4848b745
--- /dev/null
+++ b/tests/multicloud/provision/sanity_test_multivim.robot
@@ -0,0 +1,33 @@
+*** settings ***
+Resource ../../common.robot
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryswagger_broker_url} /api/multicloud/v0/swagger.json
+${check_capacity_broker_url} /api/multicloud/v0/check_vim_capacity
+
+
+*** Test Cases ***
+BrokerSwaggerTest
+ [Documentation] query swagger info rest test
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${BROKER_IP}:9001 headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_broker_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0
+
+BrokerCapacityTest
+ [Documentation] Check VIMs capacity
+ ${data}= Get Binary File ${CURDIR}${/}data${/}capacity.json
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${BROKER_IP}:9001 headers=${headers}
+ ${resp}= Post Request web_session ${check_capacity_broker_url} ${data}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
diff --git a/tests/music/music-distributed-kv-store-suite/__init__.robot b/tests/music/music-distributed-kv-store-suite/__init__.robot
new file mode 100644
index 00000000..d1da7f38
--- /dev/null
+++ b/tests/music/music-distributed-kv-store-suite/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Integration - Suite 1 \ No newline at end of file
diff --git a/tests/music/music-distributed-kv-store-suite/data/register_domain.json b/tests/music/music-distributed-kv-store-suite/data/register_domain.json
new file mode 100644
index 00000000..96811ee9
--- /dev/null
+++ b/tests/music/music-distributed-kv-store-suite/data/register_domain.json
@@ -0,0 +1,3 @@
+{
+ "domain":"test_domain"
+} \ No newline at end of file
diff --git a/tests/music/music-distributed-kv-store-suite/music-distributed-kv-store-test.robot b/tests/music/music-distributed-kv-store-suite/music-distributed-kv-store-test.robot
new file mode 100644
index 00000000..de26e5f6
--- /dev/null
+++ b/tests/music/music-distributed-kv-store-suite/music-distributed-kv-store-test.robot
@@ -0,0 +1,53 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library json
+
+*** Variables ***
+${MESSAGE} {"ping": "ok"}
+
+#global variables
+${generatedAID}
+
+*** Test Cases ***
+DKV Check Distributed KV Store API Docker Container
+ [Documentation] Checks if DKV docker container is running
+ ${rc} ${output}= Run and Return RC and Output docker ps
+ Log To Console *********************
+ Log To Console retrurn_code = ${rc}
+ Log To Console output = ${output}
+ Should Be Equal As Integers ${rc} 0
+ Should Contain ${output} nexus3.onap.org:10001/onap/music/distributed-kv-store
+
+DKV LoadDefaultProperties
+ [Documentation] Loads default configuration files into Consul
+ Create Session dkv ${DKV_HOSTNAME}:${DKV_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request dkv /v1/config/load-default headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+DKV FetchDefaultProperties
+ [Documentation] Fetches all default keys from Consul
+ Create Session dkv ${DKV_HOSTNAME}:${DKV_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request dkv /v1/getconfigs headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+#DKV RegisterDomain
+# [Documentation] Send a POST request to create a domain
+# Create Session dkv ${DKV_HOSTNAME}:${DKV_PORT}
+# ${data}= Get Binary File ${CURDIR}${/}data${/}register_domain.json
+# &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+# ${resp}= Post Request dkv v1/register data=${data} headers=${headers}
+# Log To Console *********************
+# Log To Console response = ${resp}
+# Log To Console body = ${resp.text}
+# Should Be Equal As Integers ${resp.status_code} 200
+
+*** Keywords ***
diff --git a/tests/music/music-suite/__init__.robot b/tests/music/music-suite/__init__.robot
new file mode 100644
index 00000000..fb654d7b
--- /dev/null
+++ b/tests/music/music-suite/__init__.robot
@@ -0,0 +1,4 @@
+*** Settings ***
+Documentation Integration - Suite 1
+
+
diff --git a/tests/music/music-suite/data/createkeyspace-network.json b/tests/music/music-suite/data/createkeyspace-network.json
new file mode 100644
index 00000000..9514bae9
--- /dev/null
+++ b/tests/music/music-suite/data/createkeyspace-network.json
@@ -0,0 +1,6 @@
+{
+ "consistencyInfo":{"type":"eventual"},
+ "durabilityOfWrites":"true",
+ "keyspaceName":"txt",
+ "replicationInfo":{"class" :"NetworkTopologyStrategy","DC1":"1", "DC2":"1", "DC3":"1"}
+}
diff --git a/tests/music/music-suite/data/createkeyspace-simple.json b/tests/music/music-suite/data/createkeyspace-simple.json
new file mode 100644
index 00000000..31f4b6a5
--- /dev/null
+++ b/tests/music/music-suite/data/createkeyspace-simple.json
@@ -0,0 +1,6 @@
+{
+ "consistencyInfo":{"type":"eventual"},
+ "durabilityOfWrites":"true",
+ "keyspaceName":"txt",
+ "replicationInfo":{"class" :"SimpleStrategy","replication_factor": 1}
+}
diff --git a/tests/music/music-suite/data/createkeyspace.json b/tests/music/music-suite/data/createkeyspace.json
new file mode 100644
index 00000000..31f4b6a5
--- /dev/null
+++ b/tests/music/music-suite/data/createkeyspace.json
@@ -0,0 +1,6 @@
+{
+ "consistencyInfo":{"type":"eventual"},
+ "durabilityOfWrites":"true",
+ "keyspaceName":"txt",
+ "replicationInfo":{"class" :"SimpleStrategy","replication_factor": 1}
+}
diff --git a/tests/music/music-suite/data/createtable.json b/tests/music/music-suite/data/createtable.json
new file mode 100644
index 00000000..71b47163
--- /dev/null
+++ b/tests/music/music-suite/data/createtable.json
@@ -0,0 +1,12 @@
+{
+ "clusteringOrder":null,
+ "consistencyInfo":{"type":"eventual"},
+ "fields":{"PRIMARY KEY":"(name)",
+ "name":"text","job":"text","threadIndex":"int"},
+ "keyspaceName":null,
+ "primaryKey":null,
+ "properties":null,
+ "sortingKey":null,
+ "tableName":null
+}
+
diff --git a/tests/music/music-suite/data/deleterow_eventual.json b/tests/music/music-suite/data/deleterow_eventual.json
new file mode 100644
index 00000000..ed9a2894
--- /dev/null
+++ b/tests/music/music-suite/data/deleterow_eventual.json
@@ -0,0 +1,5 @@
+{
+ "consistencyInfo": {"type":"eventual"},
+ "timestamp":null,
+ "ttl":null
+}
diff --git a/tests/music/music-suite/data/dropkeyspace.json b/tests/music/music-suite/data/dropkeyspace.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/tests/music/music-suite/data/dropkeyspace.json
@@ -0,0 +1 @@
+{}
diff --git a/tests/music/music-suite/data/droptable.json b/tests/music/music-suite/data/droptable.json
new file mode 100644
index 00000000..71b47163
--- /dev/null
+++ b/tests/music/music-suite/data/droptable.json
@@ -0,0 +1,12 @@
+{
+ "clusteringOrder":null,
+ "consistencyInfo":{"type":"eventual"},
+ "fields":{"PRIMARY KEY":"(name)",
+ "name":"text","job":"text","threadIndex":"int"},
+ "keyspaceName":null,
+ "primaryKey":null,
+ "properties":null,
+ "sortingKey":null,
+ "tableName":null
+}
+
diff --git a/tests/music/music-suite/data/getrow_atomic.json b/tests/music/music-suite/data/getrow_atomic.json
new file mode 100644
index 00000000..65f9d76f
--- /dev/null
+++ b/tests/music/music-suite/data/getrow_atomic.json
@@ -0,0 +1,3 @@
+{
+ "consistencyInfo": {"type":"atomic"}
+}
diff --git a/tests/music/music-suite/data/insertrow_eventual.json b/tests/music/music-suite/data/insertrow_eventual.json
new file mode 100644
index 00000000..56e1762e
--- /dev/null
+++ b/tests/music/music-suite/data/insertrow_eventual.json
@@ -0,0 +1,8 @@
+{
+ "consistencyInfo": {"type":"eventual"},
+ "row_specification": null,
+ "timestamp": null,
+ "ttl": null,
+ "values":{"name":"emp1","job":"researcher1518791824160","threadIndex":"0"}
+}
+
diff --git a/tests/music/music-suite/data/onboard.json b/tests/music/music-suite/data/onboard.json
new file mode 100644
index 00000000..5c74f82d
--- /dev/null
+++ b/tests/music/music-suite/data/onboard.json
@@ -0,0 +1,6 @@
+{
+"appname": "lb7254",
+"userId": "music",
+"password": "music",
+"isAAF": "false"
+}
diff --git a/tests/music/music-suite/data/updaterow_atomic.json b/tests/music/music-suite/data/updaterow_atomic.json
new file mode 100644
index 00000000..782da144
--- /dev/null
+++ b/tests/music/music-suite/data/updaterow_atomic.json
@@ -0,0 +1,7 @@
+{
+ "consistencyInfo": {"type":"atomic"},
+ "row_specification":null,
+ "timestamp":null,
+ "ttl":null,
+ "values":{"job":"star-wars-actor"}
+}
diff --git a/tests/music/music-suite/data/updaterow_eventual.json b/tests/music/music-suite/data/updaterow_eventual.json
new file mode 100644
index 00000000..f8b3e9d2
--- /dev/null
+++ b/tests/music/music-suite/data/updaterow_eventual.json
@@ -0,0 +1,7 @@
+{
+ "consistencyInfo": {"type":"eventual"},
+ "row_specification":null,
+ "timestamp":null,
+ "ttl":null,
+ "values":{"job":"star-wars-actor"}
+}
diff --git a/tests/music/music-suite/music-test.robot b/tests/music/music-suite/music-test.robot
new file mode 100644
index 00000000..4eda8691
--- /dev/null
+++ b/tests/music/music-suite/music-test.robot
@@ -0,0 +1,208 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library json
+
+*** Variables ***
+${MESSAGE} {"ping": "ok"}
+${BASIC} Basic
+${AUTHVALUE} bXVzaWM6bXVzaWM=
+${Authorization} ${BASIC} ${AUTHVALUE}
+
+#global variables
+${generatedAID}
+
+*** Test Cases ***
+Check Cassandra Docker Container
+ [Documentation] It checks cassandra docker container is running
+ ${rc} ${output}= Run and Return RC and Output docker ps
+ Log To Console *********************
+ Log To Console retrurn_code = ${rc}
+ Log To Console output = ${output}
+ Should Be Equal As Integers ${rc} 0
+ Should Contain ${output} music-db
+
+Check Zookeeper Docker Container
+ [Documentation] It checks zookeeper docker container is running
+ ${rc} ${output}= Run and Return RC and Output docker ps
+ Log To Console *********************
+ Log To Console retrurn_code = ${rc}
+ Log To Console output = ${output}
+ Should Be Equal As Integers ${rc} 0
+ Should Contain ${output} music-zk
+
+Check Tomcat Docker Container
+ [Documentation] It checks tomcat docker container is running
+ ${rc} ${output}= Run and Return RC and Output docker ps
+ Log To Console *********************
+ Log To Console retrurn_code = ${rc}
+ Log To Console output = ${output}
+ Should Be Equal As Integers ${rc} 0
+ Should Contain ${output} music-tomcat
+
+Check Music War Docker Container
+ [Documentation] It checks music.war docker container is running
+ ${rc} ${output}= Run and Return RC and Output docker ps
+ Log To Console *********************
+ Log To Console retrurn_code = ${rc}
+ Log To Console output = ${output}
+ Should Be Equal As Integers ${rc} 0
+ Should Contain ${output} music-war
+
+Healthcheck Cassandra
+ [Documentation] It sends a REST GET request to retrieve the Music.war version
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request musicaas /MUSIC/rest/v2/service/pingCassandra/ONE headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+Healthcheck Zookeeper
+ [Documentation] It sends a REST GET request to retrieve the Music.war version
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request musicaas /MUSIC/rest/v2/service/pingZookeeper headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+Get Music Version
+ [Documentation] It sends a REST GET request to retrieve the Music.war version
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request musicaas /MUSIC/rest/v2/version headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+Music AddOnBoarding
+ [Documentation] It sends a REST POST request to Music to Onboard a new application
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}onboard.json
+ &{headers}= Create Dictionary ns=lb7254 Authorization=${Authorization} Content-Type=application/json Accept=application/json
+ ${resp}= Post Request musicaas /MUSIC/rest/v2/admin/onboardAppWithMusic data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ ${response_json} json.loads ${resp.content}
+ ${generatedAID}= Convert To String ${response_json['Generated AID']}
+ Set Global Variable ${generatedAID}
+ Log To Console generatedAID = ${generatedAID}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+Music CreateKeyspace
+ [Documentation] It sends a REST POST request to Music to create a new keyspace in Cassandra
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createkeyspace.json
+ &{headers}= Create Dictionary ns=lb7254 Authorization=${Authorization} aid=${generatedAID} Content-Type=application/json Accept=application/json
+ ${resp}= Post Request musicaas /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+Music CreateTable
+ [Documentation] It sends a REST POST request to Music to create a new Table in Cassandra
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createtable.json
+ &{headers}= Create Dictionary ns=lb7254 Authorization=${Authorization} aid=${generatedAID} Content-Type=application/json Accept=application/json
+ ${resp}= Post Request musicaas /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace/tables/MusicOnapTable data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+Music InsertRow
+ [Documentation] It sends a REST POST request to Music to create a new row in Cassandra
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}insertrow_eventual.json
+ &{headers}= Create Dictionary ns=lb7254 Authorization=${Authorization} aid=${generatedAID} Content-Type=application/json Accept=application/json
+ ${resp}= Post Request musicaas /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace/tables/MusicOnapTable/rows/?row=emp1 data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+Music ReadRowJustInserted
+ [Documentation] It sends a REST GET request to Music to Read the row just inserted in Cassandra
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ &{headers}= Create Dictionary ns=lb7254 Authorization=${Authorization} aid=${generatedAID} Content-Type=application/json Accept=application/json
+ ${resp}= Get Request musicaas /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace/tables/MusicOnapTable/rows?name=emp1 headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+Music UpdateRowInAtomicWay
+ [Documentation] It sends a REST PUT request to Music to create a new row in Cassandra
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}updaterow_atomic.json
+ &{headers}= Create Dictionary ns=lb7254 Authorization=${Authorization} aid=${generatedAID} Content-Type=application/json Accept=application/json
+ ${resp}= Put Request musicaas /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace/tables/MusicOnapTable/rows?name=emp1 data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+Music ReadRowAfterUpdate
+ [Documentation] It sends a REST GET request to Music to Read the row just inserted in Cassandra
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ &{headers}= Create Dictionary ns=lb7254 Authorization=${Authorization} aid=${generatedAID} Content-Type=application/json Accept=application/json
+ ${resp}= Get Request musicaas /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace/tables/MusicOnapTable/rows?name=emp1 headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+Music DeleteRow
+ [Documentation] It sends a REST DELETE request to Music to delete a row in Cassandra
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}deleterow_eventual.json
+ &{headers}= Create Dictionary ns=lb7254 Authorization=${Authorization} aid=${generatedAID} Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request musicaas /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace/tables/MusicOnapTable/rows?name=emp1 data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+Music DropTable
+ [Documentation] It sends a REST Delete request to Music to drop one existing Table in Cassandra
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}droptable.json
+ &{headers}= Create Dictionary ns=lb7254 Authorization=${Authorization} aid=${generatedAID} Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request musicaas /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace/tables/MusicOnapTable data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+Music DropKeyspace
+ [Documentation] It sends a REST DELETE request to Music to drop one existing keyspace in Cassandra
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}dropkeyspace.json
+ &{headers}= Create Dictionary ns=lb7254 Authorization=${Authorization} aid=${generatedAID} Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request musicaas /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+
+Music DeleteOnBoarding
+ [Documentation] It sends a REST DELETE request to Music to remove a previosly onboarded application
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}onboard.json
+ &{headers}= Create Dictionary ns=lb7254 Authorization=${Authorization} aid=${generatedAID} Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request musicaas /MUSIC/rest/v2/admin/onboardAppWithMusic data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+
+*** Keywords ***
+
diff --git a/tests/optf-has/has/__init__.robot b/tests/optf-has/has/__init__.robot
new file mode 100644
index 00000000..fb654d7b
--- /dev/null
+++ b/tests/optf-has/has/__init__.robot
@@ -0,0 +1,4 @@
+*** Settings ***
+Documentation Integration - Suite 1
+
+
diff --git a/tests/optf-has/has/data/healthcheck.json b/tests/optf-has/has/data/healthcheck.json
new file mode 100644
index 00000000..926bb289
--- /dev/null
+++ b/tests/optf-has/has/data/healthcheck.json
@@ -0,0 +1,19 @@
+{
+ "consistencyInfo": {
+ "type": "eventual"
+ },
+ "values": {
+ "created": 1479482603641,
+ "message": "",
+ "name": "foo",
+ "recommend_max": 1,
+ "solution": "{\"healthcheck\": \" healthcheck\"}",
+ "status": "solved",
+ "template": "{\"healthcheck\": \"healthcheck\"}",
+ "timeout": 3600,
+ "translation": "{\"healthcheck\": \" healthcheck\"}",
+ "updated": 1484324150629
+ }
+}
+
+
diff --git a/tests/optf-has/has/data/onboard.json b/tests/optf-has/has/data/onboard.json
new file mode 100644
index 00000000..a4939c45
--- /dev/null
+++ b/tests/optf-has/has/data/onboard.json
@@ -0,0 +1,6 @@
+{
+ "appname": "conductor",
+ "userId": "conductor",
+ "isAAF": "false",
+ "password": "c0nduct0r"
+}
diff --git a/tests/optf-has/has/data/plan_with_hpa.json b/tests/optf-has/has/data/plan_with_hpa.json
new file mode 100644
index 00000000..21985776
--- /dev/null
+++ b/tests/optf-has/has/data/plan_with_hpa.json
@@ -0,0 +1,260 @@
+{
+ "name":"vCPE-with-HPA",
+ "template":{
+ "homing_template_version":"2017-10-10",
+ "parameters":{
+ "service_name":"Residential vCPE",
+ "service_id":"vcpe_service_id",
+ "customer_lat":45.395968,
+ "customer_long":-71.135344,
+ "REQUIRED_MEM":4,
+ "REQUIRED_DISK":100,
+ "pnf_id":"some_pnf_id"
+ },
+ "locations":{
+ "customer_loc":{
+ "latitude":{
+ "get_param":"customer_lat"
+ },
+ "longitude":{
+ "get_param":"customer_long"
+ }
+ }
+ },
+ "demands":{
+ "vG":[
+ {
+ "inventory_provider":"aai",
+ "inventory_type":"cloud"
+ }
+ ]
+ },
+ "constraints":{
+ "constraint_vg_customer":{
+ "type":"distance_to_location",
+ "demands":[
+ "vG"
+ ],
+ "properties":{
+ "distance":"< 100 km",
+ "location":"customer_loc"
+ }
+ },
+ "hpa_constraint":{
+ "type":"hpa",
+ "demands":[
+ "vG"
+ ],
+ "properties":{
+ "evaluate":[
+ {
+ "id":"vg_1",
+ "type":"vnfc",
+ "directives":[
+ {
+ "type": "flavor_directives",
+ "attributes":[
+ {
+ "attribute_name":"flavor_label_1",
+ "attribute_value":""
+ }
+ ]
+ }
+ ],
+ "flavorProperties":[
+ {
+ "hpa-feature":"basicCapabilities",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "False",
+ "score": "5",
+ "directives": [],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"numVirtualCpu",
+ "hpa-attribute-value":"4",
+ "operator":">="
+ },
+ {
+ "hpa-attribute-key":"virtualMemSize",
+ "hpa-attribute-value":"4",
+ "operator":">=",
+ "unit":"GB"
+ }
+ ]
+ },
+ {
+ "hpa-feature":"numa",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "False",
+ "score": "5",
+ "directives": [],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"numaNodes",
+ "hpa-attribute-value":"2",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"numaCpu-0",
+ "hpa-attribute-value":"2",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"numaCpu-1",
+ "hpa-attribute-value":"4",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"numaMem-0",
+ "hpa-attribute-value":"2",
+ "operator":"=",
+ "unit":"GB"
+ },
+ {
+ "hpa-attribute-key":"numaMem-1",
+ "hpa-attribute-value":"4",
+ "operator":"=",
+ "unit":"GB"
+ }
+ ]
+ },
+ {
+ "hpa-feature":"cpuPinning",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "False",
+ "score": "5",
+ "directives": [],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"logicalCpuThreadPinningPolicy",
+ "hpa-attribute-value":"prefer",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"logicalCpuPinningPolicy",
+ "hpa-attribute-value":"dedicated",
+ "operator":"="
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id":"vg_2",
+ "type":"vnfc",
+ "directives":[
+ {
+ "type":"flavor_directives",
+ "attributes":[
+ {
+ "attribute_name":"flavor_label_2",
+ "attribute_value":""
+ }
+ ]
+ }
+ ],
+ "flavorProperties":[
+ {
+ "hpa-feature":"basicCapabilities",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "False",
+ "score": "5",
+ "directives":[],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"numVirtualCpu",
+ "hpa-attribute-value":"8",
+ "operator":">="
+ },
+ {
+ "hpa-attribute-key":"virtualMemSize",
+ "hpa-attribute-value":"16",
+ "operator":">=",
+ "unit":"GB"
+ }
+ ]
+ },
+ {
+ "hpa-feature":"numa",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "False",
+ "score": "5",
+ "directives":[],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"numaNodes",
+ "hpa-attribute-value":"2",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"numaCpu-0",
+ "hpa-attribute-value":"2",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"numaCpu-1",
+ "hpa-attribute-value":"4",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"numaMem-0",
+ "hpa-attribute-value":"2",
+ "operator":"=",
+ "unit":"GB"
+ },
+ {
+ "hpa-attribute-key":"numaMem-1",
+ "hpa-attribute-value":"4",
+ "operator":"=",
+ "unit":"GB"
+ }
+ ]
+ },
+ {
+ "hpa-feature":"ovsDpdk",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "False",
+ "score": "5",
+ "directives":[],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"dataProcessingAccelerationLibrary",
+ "hpa-attribute-value":"v18.02",
+ "operator":"="
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+ "optimization":{
+ "minimize":{
+ "sum":[
+ {
+ "distance_between":[
+ "customer_loc",
+ "vG"
+ ]
+ },
+ {
+ "distance_between":[
+ "customer_loc",
+ "vG"
+ ]
+ }
+ ]
+ }
+ }
+ },
+ "timeout":5,
+ "limit":3
+}
diff --git a/tests/optf-has/has/data/plan_with_hpa_requirements_mandatory.json b/tests/optf-has/has/data/plan_with_hpa_requirements_mandatory.json
new file mode 100644
index 00000000..bb613abd
--- /dev/null
+++ b/tests/optf-has/has/data/plan_with_hpa_requirements_mandatory.json
@@ -0,0 +1,193 @@
+{
+ "name":"vCPE-with-HPA-requirement-mandatory",
+ "template":{
+ "homing_template_version":"2017-10-10",
+ "parameters":{
+ "service_name":"Residential vCPE",
+ "service_id":"vcpe_service_id",
+ "customer_lat":45.395968,
+ "customer_long":-71.135344,
+ "REQUIRED_MEM":4,
+ "REQUIRED_DISK":100,
+ "pnf_id":"some_pnf_id"
+ },
+ "locations":{
+ "customer_loc":{
+ "latitude":{
+ "get_param":"customer_lat"
+ },
+ "longitude":{
+ "get_param":"customer_long"
+ }
+ }
+ },
+ "demands":{
+ "vG":[
+ {
+ "inventory_provider":"aai",
+ "inventory_type":"cloud"
+ }
+ ]
+ },
+ "constraints":{
+ "constraint_vg_customer":{
+ "type":"distance_to_location",
+ "demands":[
+ "vG"
+ ],
+ "properties":{
+ "distance":"< 100 km",
+ "location":"customer_loc"
+ }
+ },
+ "hpa_constraint":{
+ "type":"hpa",
+ "demands":[
+ "vG"
+ ],
+ "properties":{
+ "evaluate":[
+ {
+ "id":"vg_1",
+ "type":"vnfc",
+ "directives":[
+ {
+ "type":"flavor_directives",
+ "attributes":[
+ {
+ "attribute_name":"flavor_label_1",
+ "attribute_value":""
+ }
+ ]
+ }
+ ],
+ "flavorProperties":[
+ {
+ "hpa-feature":"basicCapabilities",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "True",
+ "directives":[],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"numVirtualCpu",
+ "hpa-attribute-value":"64",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"virtualMemSize",
+ "hpa-attribute-value":"64",
+ "operator":"=",
+ "unit":"GB"
+ }
+ ]
+ },
+ {
+ "hpa-feature":"numa",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory":"True",
+ "directives":[],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"numaNodes",
+ "hpa-attribute-value":"2",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"numaCpu-0",
+ "hpa-attribute-value":"2",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"numaCpu-1",
+ "hpa-attribute-value":"4",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"numaMem-0",
+ "hpa-attribute-value":"2",
+ "operator":"=",
+ "unit":"GB"
+ },
+ {
+ "hpa-attribute-key":"numaMem-1",
+ "hpa-attribute-value":"4",
+ "operator":"=",
+ "unit":"GB"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id":"vg_2",
+ "type":"vnfc",
+ "directives":[
+ {
+ "type":"flavor_directives",
+ "attributes":[
+ {
+ "attribute_name":"flavor_label_2",
+ "attribute_value":""
+ }
+ ]
+ }
+ ],
+ "flavorProperties":[
+ {
+ "hpa-feature":"basicCapabilities",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "True",
+ "directives":[],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"numVirtualCpu",
+ "hpa-attribute-value":"32",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"virtualMemSize",
+ "hpa-attribute-value":"128",
+ "operator":"=",
+ "unit":"GB"
+ }
+ ]
+ },
+ {
+ "hpa-feature":"ovsDpdk",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "True",
+ "directives":[],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"dataProcessingAccelerationLibrary",
+ "hpa-attribute-value":"v18.02",
+ "operator":"="
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+ "optimization":{
+ "minimize":{
+ "sum":[
+ {
+ "distance_between":[
+ "customer_loc",
+ "vG"
+ ]
+ }
+ ]
+ }
+ }
+ },
+ "timeout":5,
+ "limit":3
+}
diff --git a/tests/optf-has/has/data/plan_with_hpa_requirements_optionals.json b/tests/optf-has/has/data/plan_with_hpa_requirements_optionals.json
new file mode 100644
index 00000000..50c23ee8
--- /dev/null
+++ b/tests/optf-has/has/data/plan_with_hpa_requirements_optionals.json
@@ -0,0 +1,247 @@
+{
+ "name":"vCPE-HPA-Requirement-Optional",
+ "template":{
+ "homing_template_version":"2017-10-10",
+ "parameters":{
+ "service_name":"Residential vCPE",
+ "service_id":"vcpe_service_id",
+ "customer_lat":45.395968,
+ "customer_long":-71.135344,
+ "REQUIRED_MEM":4,
+ "REQUIRED_DISK":100,
+ "pnf_id":"some_pnf_id"
+ },
+ "locations":{
+ "customer_loc":{
+ "latitude":{
+ "get_param":"customer_lat"
+ },
+ "longitude":{
+ "get_param":"customer_long"
+ }
+ }
+ },
+ "demands":{
+ "vG":[
+ {
+ "inventory_provider":"aai",
+ "inventory_type":"cloud"
+ }
+ ]
+ },
+ "constraints":{
+ "constraint_vg_customer":{
+ "type":"distance_to_location",
+ "demands":[
+ "vG"
+ ],
+ "properties":{
+ "distance":"< 100 km",
+ "location":"customer_loc"
+ }
+ },
+ "hpa_constraint":{
+ "type":"hpa",
+ "demands":[
+ "vG"
+ ],
+ "properties":{
+ "evaluate":[
+ {
+ "id":"vg_1",
+ "type":"vnfc",
+ "directives":[
+ {
+ "type":"flavor_directives",
+ "attributes":[
+ {
+ "attribute_name":"flavor_label_1",
+ "attribute_value":""
+ }
+ ]
+ }
+ ],
+ "flavorProperties":[
+ {
+ "hpa-feature":"basicCapabilities",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "True",
+ "directives":[],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"numVirtualCpu",
+ "hpa-attribute-value":"4",
+ "operator":">="
+ },
+ {
+ "hpa-attribute-key":"virtualMemSize",
+ "hpa-attribute-value":"8",
+ "operator":">=",
+ "unit":"GB"
+ }
+ ]
+ },
+ {
+ "hpa-feature":"instructionSetExtensions",
+ "hpa-version":"v1",
+ "architecture":"Intel64",
+ "mandatory": "True",
+ "directives":[],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"instructionSetExtensions",
+ "hpa-attribute-value":["aes", "sse", "avx", "smt"],
+ "operator":"ALL",
+ "unit":""
+ }
+ ]
+ },
+ {
+ "hpa-feature":"numa",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory":"False",
+ "score":"3",
+ "directives":[],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"numaNodes",
+ "hpa-attribute-value":"2",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"numaCpu-0",
+ "hpa-attribute-value":"2",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"numaCpu-1",
+ "hpa-attribute-value":"4",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"numaMem-0",
+ "hpa-attribute-value":"2",
+ "operator":"=",
+ "unit":"GB"
+ },
+ {
+ "hpa-attribute-key":"numaMem-1",
+ "hpa-attribute-value":"4",
+ "operator":"=",
+ "unit":"GB"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id":"vg_2",
+ "type":"vnfc",
+ "directives":[
+ {
+ "type":"flavor_directives",
+ "attributes":[
+ {
+ "attribute_name":"flavor_label_2",
+ "attribute_value":""
+ }
+ ]
+ }
+ ],
+ "flavorProperties":[
+ {
+ "hpa-feature":"basicCapabilities",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "True",
+ "directives":[],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"numVirtualCpu",
+ "hpa-attribute-value":"4",
+ "operator":">="
+ },
+ {
+ "hpa-attribute-key":"virtualMemSize",
+ "hpa-attribute-value":"8",
+ "operator":">=",
+ "unit":"GB"
+ }
+ ]
+ },
+ {
+ "hpa-feature":"ovsDpdk",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "False",
+ "score":"5",
+ "directives":[],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"dataProcessingAccelerationLibrary",
+ "hpa-attribute-value":"v18.02",
+ "operator":"="
+ }
+ ]
+ },
+ {
+ "hpa-feature":"numa",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory":"False",
+ "score":"3",
+ "directives":[],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"numaNodes",
+ "hpa-attribute-value":"2",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"numaCpu-0",
+ "hpa-attribute-value":"2",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"numaCpu-1",
+ "hpa-attribute-value":"4",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"numaMem-0",
+ "hpa-attribute-value":"2",
+ "operator":"=",
+ "unit":"GB"
+ },
+ {
+ "hpa-attribute-key":"numaMem-1",
+ "hpa-attribute-value":"4",
+ "operator":"=",
+ "unit":"GB"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+ "optimization":{
+ "minimize":{
+ "sum":[
+ {
+ "distance_between":[
+ "customer_loc",
+ "vG"
+ ]
+ }
+ ]
+ }
+ }
+ },
+ "timeout":5,
+ "limit":3
+}
diff --git a/tests/optf-has/has/data/plan_with_hpa_score_multi_objective.json b/tests/optf-has/has/data/plan_with_hpa_score_multi_objective.json
new file mode 100644
index 00000000..4a6d3bc8
--- /dev/null
+++ b/tests/optf-has/has/data/plan_with_hpa_score_multi_objective.json
@@ -0,0 +1,267 @@
+{
+ "name": "vCPE-HPA-Requirement-Optional",
+ "template": {
+ "homing_template_version": "2017-10-10",
+ "parameters": {
+ "service_name": "Residential vCPE",
+ "service_id": "vcpe_service_id",
+ "customer_lat": 45.395968,
+ "customer_long": -71.135344,
+ "REQUIRED_MEM": 4,
+ "REQUIRED_DISK": 100,
+ "pnf_id": "some_pnf_id"
+ },
+ "locations": {
+ "customer_loc": {
+ "latitude": {
+ "get_param": "customer_lat"
+ },
+ "longitude": {
+ "get_param": "customer_long"
+ }
+ }
+ },
+ "demands": {
+ "vG": [
+ {
+ "inventory_provider": "aai",
+ "inventory_type": "cloud"
+ }
+ ]
+ },
+ "constraints": {
+ "constraint_vg_customer": {
+ "type": "distance_to_location",
+ "demands": [
+ "vG"
+ ],
+ "properties": {
+ "distance": "< 100 km",
+ "location": "customer_loc"
+ }
+ },
+ "hpa_constraint": {
+ "type": "hpa",
+ "demands": [
+ "vG"
+ ],
+ "properties": {
+ "evaluate": [
+ {
+ "id":"vg_1",
+ "type":"vnfc",
+ "directives":[
+ {
+ "type":"flavor_directives",
+ "attributes":[
+ {
+ "attribute_name":"flavor_label_1",
+ "attribute_value":""
+ }
+ ]
+ }
+ ],
+ "flavorProperties": [
+ {
+ "hpa-feature": "basicCapabilities",
+ "hpa-version": "v1",
+ "architecture": "generic",
+ "mandatory": "True",
+ "directives":[],
+ "hpa-feature-attributes": [
+ {
+ "hpa-attribute-key": "numVirtualCpu",
+ "hpa-attribute-value": "4",
+ "operator": ">="
+ },
+ {
+ "hpa-attribute-key": "virtualMemSize",
+ "hpa-attribute-value": "8",
+ "operator": ">=",
+ "unit": "GB"
+ }
+ ]
+ },
+ {
+ "hpa-feature": "instructionSetExtensions",
+ "hpa-version": "v1",
+ "architecture": "Intel64",
+ "mandatory": "True",
+ "directives":[],
+ "hpa-feature-attributes": [
+ {
+ "hpa-attribute-key": "instructionSetExtensions",
+ "hpa-attribute-value": [
+ "aes",
+ "sse",
+ "avx",
+ "smt"
+ ],
+ "operator": "ALL",
+ "unit": ""
+ }
+ ]
+ },
+ {
+ "hpa-feature": "numa",
+ "hpa-version": "v1",
+ "architecture": "generic",
+ "mandatory": "False",
+ "score": "3",
+ "directives":[],
+ "hpa-feature-attributes": [
+ {
+ "hpa-attribute-key": "numaNodes",
+ "hpa-attribute-value": "2",
+ "operator": "="
+ },
+ {
+ "hpa-attribute-key": "numaCpu-0",
+ "hpa-attribute-value": "2",
+ "operator": "="
+ },
+ {
+ "hpa-attribute-key": "numaCpu-1",
+ "hpa-attribute-value": "4",
+ "operator": "="
+ },
+ {
+ "hpa-attribute-key": "numaMem-0",
+ "hpa-attribute-value": "2",
+ "operator": "=",
+ "unit": "GB"
+ },
+ {
+ "hpa-attribute-key": "numaMem-1",
+ "hpa-attribute-value": "4",
+ "operator": "=",
+ "unit": "GB"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id":"vg_2",
+ "type":"vnfc",
+ "directives":[
+ {
+ "type":"flavor_directives",
+ "attributes":[
+ {
+ "attribute_name":"flavor_label_2",
+ "attribute_value":""
+ }
+ ]
+ }
+ ],
+ "flavorProperties": [
+ {
+ "hpa-feature": "basicCapabilities",
+ "hpa-version": "v1",
+ "architecture": "generic",
+ "mandatory": "True",
+ "directives":[],
+ "hpa-feature-attributes": [
+ {
+ "hpa-attribute-key": "numVirtualCpu",
+ "hpa-attribute-value": "4",
+ "operator": ">="
+ },
+ {
+ "hpa-attribute-key": "virtualMemSize",
+ "hpa-attribute-value": "8",
+ "operator": ">=",
+ "unit": "GB"
+ }
+ ]
+ },
+ {
+ "hpa-feature": "ovsDpdk",
+ "hpa-version": "v1",
+ "architecture": "generic",
+ "mandatory": "False",
+ "score": "5",
+ "directives":[],
+ "hpa-feature-attributes": [
+ {
+ "hpa-attribute-key": "dataProcessingAccelerationLibrary",
+ "hpa-attribute-value": "v18.02",
+ "operator": "="
+ }
+ ]
+ },
+ {
+ "hpa-feature": "numa",
+ "hpa-version": "v1",
+ "architecture": "generic",
+ "mandatory": "False",
+ "score": "3",
+ "directives":[],
+ "hpa-feature-attributes": [
+ {
+ "hpa-attribute-key": "numaNodes",
+ "hpa-attribute-value": "2",
+ "operator": "="
+ },
+ {
+ "hpa-attribute-key": "numaCpu-0",
+ "hpa-attribute-value": "2",
+ "operator": "="
+ },
+ {
+ "hpa-attribute-key": "numaCpu-1",
+ "hpa-attribute-value": "4",
+ "operator": "="
+ },
+ {
+ "hpa-attribute-key": "numaMem-0",
+ "hpa-attribute-value": "2",
+ "operator": "=",
+ "unit": "GB"
+ },
+ {
+ "hpa-attribute-key": "numaMem-1",
+ "hpa-attribute-value": "4",
+ "operator": "=",
+ "unit": "GB"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+ "optimization": {
+ "minimize": {
+ "sum": [
+ {
+ "product": [
+ 100,
+ {
+ "distance_between": [
+ "customer_loc",
+ "vG"
+ ]
+ }
+ ]
+ },
+ {
+ "product": [
+ 200,
+ {
+ "hpa_score": [
+ "vG"
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+ "timeout": 5,
+ "limit": 3
+}
diff --git a/tests/optf-has/has/data/plan_with_hpa_simple.json b/tests/optf-has/has/data/plan_with_hpa_simple.json
new file mode 100644
index 00000000..d343dc80
--- /dev/null
+++ b/tests/optf-has/has/data/plan_with_hpa_simple.json
@@ -0,0 +1,156 @@
+{
+ "name":"vCPE-with-HPA",
+ "template":{
+ "homing_template_version":"2017-10-10",
+ "parameters":{
+ "service_name":"Residential vCPE",
+ "service_id":"vcpe_service_id",
+ "customer_lat":45.395968,
+ "customer_long":-71.135344,
+ "REQUIRED_MEM":4,
+ "REQUIRED_DISK":100,
+ "pnf_id":"some_pnf_id"
+ },
+ "locations":{
+ "customer_loc":{
+ "latitude":{
+ "get_param":"customer_lat"
+ },
+ "longitude":{
+ "get_param":"customer_long"
+ }
+ }
+ },
+ "demands":{
+ "vG":[
+ {
+ "inventory_provider":"aai",
+ "inventory_type":"cloud"
+ }
+ ]
+ },
+ "constraints":{
+ "hpa_constraint":{
+ "type":"hpa",
+ "demands":[
+ "vG"
+ ],
+ "properties":{
+ "evaluate":[
+ {
+ "id":"vg_1",
+ "type":"vnfc",
+ "directives":[
+ {
+ "type":"flavor_directives",
+ "attributes":[
+ {
+ "attribute_name":"flavor_label_1",
+ "attribute_value":""
+ }
+ ]
+ }
+ ],
+ "flavorProperties":[
+ {
+ "hpa-feature":"basicCapabilities",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "False",
+ "directives":[],
+ "score": "5",
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"numVirtualCpu",
+ "hpa-attribute-value":"32",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"virtualMemSize",
+ "hpa-attribute-value":"64",
+ "operator":"=",
+ "unit":"GB"
+ }
+ ]
+ },
+ {
+ "hpa-feature":"ovsDpdk",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "False",
+ "directives":[],
+ "score": "5",
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"dataProcessingAccelerationLibrary",
+ "hpa-attribute-value":"v18.02",
+ "operator":"="
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id":"vg_2",
+ "type":"vnfc",
+ "directives":[
+ {
+ "type":"flavor_directives",
+ "attributes":[
+ {
+ "attribute_name":"flavor_label_2",
+ "attribute_value":""
+ }
+ ]
+ }
+ ],
+ "flavorProperties":[
+ {
+ "hpa-feature":"basicCapabilities",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "False",
+ "directives":[],
+ "score": "5",
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"numVirtualCpu",
+ "hpa-attribute-value":"8",
+ "operator":">="
+ },
+ {
+ "hpa-attribute-key":"virtualMemSize",
+ "hpa-attribute-value":"16",
+ "operator":">=",
+ "unit":"GB"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+ "optimization":{
+ "minimize":{
+ "sum":[
+ {
+ "distance_between":[
+ "customer_loc",
+ "vG"
+ ]
+ },
+ {
+ "distance_between":[
+ "customer_loc",
+ "vG"
+ ]
+ }
+ ]
+ }
+ }
+ },
+ "timeout":5,
+ "limit":3
+}
diff --git a/tests/optf-has/has/data/plan_with_hpa_unmatched.json b/tests/optf-has/has/data/plan_with_hpa_unmatched.json
new file mode 100644
index 00000000..e95ecedd
--- /dev/null
+++ b/tests/optf-has/has/data/plan_with_hpa_unmatched.json
@@ -0,0 +1,143 @@
+{
+ "name":"vCPE-with-HPA-unmatched-requirements",
+ "template":{
+ "homing_template_version":"2017-10-10",
+ "parameters":{
+ "service_name":"Residential vCPE",
+ "service_id":"vcpe_service_id",
+ "customer_lat":45.395968,
+ "customer_long":-71.135344,
+ "REQUIRED_MEM":4,
+ "REQUIRED_DISK":100,
+ "pnf_id":"some_pnf_id"
+ },
+ "locations":{
+ "customer_loc":{
+ "latitude":{
+ "get_param":"customer_lat"
+ },
+ "longitude":{
+ "get_param":"customer_long"
+ }
+ }
+ },
+ "demands":{
+ "vG":[
+ {
+ "inventory_provider":"aai",
+ "inventory_type":"cloud"
+ }
+ ]
+ },
+ "constraints":{
+ "constraint_vgmux_customer":{
+ "type":"distance_to_location",
+ "demands":[
+ "vG"
+ ],
+ "properties":{
+ "distance":"< 100 km",
+ "location":"customer_loc"
+ }
+ },
+ "hpa_constraint":{
+ "type":"hpa",
+ "demands":[
+ "vG"
+ ],
+ "properties":{
+ "evaluate":[
+ {
+ "id":"vg_1",
+ "type":"vnfc",
+ "directives":[
+ {
+ "type":"flavor_directives",
+ "attributes":[
+ {
+ "attribute_name":"flavor_label_1",
+ "attribute_value":""
+ }
+ ]
+ }
+ ],
+ "flavorProperties":[
+ {
+ "hpa-feature":"basicCapabilities",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory": "True",
+ "directives":[],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"numVirtualCpu",
+ "hpa-attribute-value":"60",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"virtualMemSize",
+ "hpa-attribute-value":"64",
+ "operator":"=",
+ "unit":"GB"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id":"vg_2",
+ "type":"vnfc",
+ "directives":[
+ {
+ "type":"flavor_directives",
+ "attributes":[
+ {
+ "attribute_name":"flavor_label_2",
+ "attribute_value":""
+ }
+ ]
+ }
+ ],
+ "flavorProperties":[
+ {
+ "hpa-feature":"basicCapabilities",
+ "hpa-version":"v1",
+ "architecture":"generic",
+ "mandatory":"True",
+ "directives":[],
+ "hpa-feature-attributes":[
+ {
+ "hpa-attribute-key":"numVirtualCpu",
+ "hpa-attribute-value":"30",
+ "operator":"="
+ },
+ {
+ "hpa-attribute-key":"virtualMemSize",
+ "hpa-attribute-value":"128",
+ "operator":"=",
+ "unit":"GB"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+ "optimization":{
+ "minimize":{
+ "sum":[
+ {
+ "distance_between":[
+ "customer_loc",
+ "vG"
+ ]
+ }
+ ]
+ }
+ }
+ },
+ "timeout":5,
+ "limit":3
+}
diff --git a/tests/optf-has/has/data/plan_with_lati_and_longi.json b/tests/optf-has/has/data/plan_with_lati_and_longi.json
new file mode 100644
index 00000000..5e35d6ab
--- /dev/null
+++ b/tests/optf-has/has/data/plan_with_lati_and_longi.json
@@ -0,0 +1,41 @@
+{
+ "name":"onap template with lati and longi without constraints and without optimizations",
+ "template":{
+ "homing_template_version":"2017-10-10",
+ "parameters":{
+ "service_name":"Residential vCPE",
+ "service_id":"vcpe_service_id",
+ "customer_lat":45.395968,
+ "customer_long":-71.135344,
+ "physical_location":"DLLSTX233",
+ "REQUIRED_MEM":4,
+ "REQUIRED_DISK":100,
+ "pnf_id":"some_pnf_id"
+ },
+ "locations":{
+ "customer_loc":{
+ "latitude":{
+ "get_param":"customer_lat"
+ },
+ "longitude":{
+ "get_param":"customer_long"
+ }
+ }
+ },
+ "demands":{
+ "vG":[
+ {
+ "inventory_provider":"aai",
+ "inventory_type":"cloud"
+ }
+ ]
+ },
+ "constraints":{
+
+ },
+ "optimization":{
+
+ }
+ }
+}
+
diff --git a/tests/optf-has/has/data/plan_with_short_distance_constraint.json b/tests/optf-has/has/data/plan_with_short_distance_constraint.json
new file mode 100644
index 00000000..68a7e119
--- /dev/null
+++ b/tests/optf-has/has/data/plan_with_short_distance_constraint.json
@@ -0,0 +1,64 @@
+{
+ "name":"onap template with short distance constraint",
+ "template":{
+ "homing_template_version":"2017-10-10",
+ "parameters":{
+ "service_name":"Residential vCPE",
+ "service_id":"vcpe_service_id",
+ "customer_lat":25.395968,
+ "customer_long":-51.135344,
+ "physical_location":"DLLSTX233",
+ "REQUIRED_MEM":4,
+ "REQUIRED_DISK":100,
+ "pnf_id":"some_pnf_id"
+ },
+ "locations":{
+ "customer_loc":{
+ "latitude":{
+ "get_param":"customer_lat"
+ },
+ "longitude":{
+ "get_param":"customer_long"
+ }
+ }
+ },
+ "demands":{
+ "vG":[
+ {
+ "inventory_provider":"aai",
+ "inventory_type":"cloud"
+ }
+ ]
+ },
+ "constraints":{
+ "distance-vg":{
+ "type":"distance_to_location",
+ "demands":[
+ "vG"
+ ],
+ "properties":{
+ "distance":"< 1 km",
+ "location":"customer_loc"
+ }
+ }
+ },
+ "optimization":{
+ "minimize": {
+ "sum": [
+ {
+ "distance_between": [
+ "customer_loc",
+ "vG"
+ ]
+ },
+ {
+ "distance_between": [
+ "customer_loc",
+ "vG"
+ ]
+ }
+ ]
+ }
+ }
+ }
+}
diff --git a/tests/optf-has/has/data/plan_with_vim_fit.json b/tests/optf-has/has/data/plan_with_vim_fit.json
new file mode 100644
index 00000000..00a59912
--- /dev/null
+++ b/tests/optf-has/has/data/plan_with_vim_fit.json
@@ -0,0 +1,89 @@
+{
+ "name":"vCPE-Sanity1",
+ "template":{
+ "homing_template_version":"2017-10-10",
+ "parameters":{
+ "service_name":"Residential vCPE",
+ "service_id":"vcpe_service_id",
+ "customer_lat":45.395968,
+ "customer_long":-71.135344,
+ "REQUIRED_MEM":4,
+ "REQUIRED_DISK":100,
+ "pnf_id":"some_pnf_id"
+ },
+ "locations":{
+ "customer_loc":{
+ "latitude":{
+ "get_param":"customer_lat"
+ },
+ "longitude":{
+ "get_param":"customer_long"
+ }
+ }
+ },
+ "demands":{
+ "vG":[
+ {
+ "inventory_provider":"aai",
+ "inventory_type":"cloud"
+ }
+ ]
+ },
+ "constraints":{
+ "constraint_vg_customer":{
+ "type":"distance_to_location",
+ "demands":[
+ "vG"
+ ],
+ "properties":{
+ "distance":"< 100 km",
+ "location":"customer_loc"
+ }
+ },
+ "check_cloud_capacity":{
+ "type":"vim_fit",
+ "demands":[
+ "vG"
+ ],
+ "properties":{
+ "controller":"multicloud",
+ "request":{
+ "vCPU":10,
+ "Memory":{
+ "quantity":{
+ "get_param":"REQUIRED_MEM"
+ },
+ "unit":"GB"
+ },
+ "Storage":{
+ "quantity":{
+ "get_param":"REQUIRED_DISK"
+ },
+ "unit":"GB"
+ }
+ }
+ }
+ }
+ },
+ "optimization":{
+ "minimize":{
+ "sum":[
+ {
+ "distance_between":[
+ "customer_loc",
+ "vG"
+ ]
+ },
+ {
+ "distance_between":[
+ "customer_loc",
+ "vG"
+ ]
+ }
+ ]
+ }
+ }
+ },
+ "timeout":5,
+ "limit":3
+}
diff --git a/tests/optf-has/has/data/plan_with_wrong_distance_constraint.json b/tests/optf-has/has/data/plan_with_wrong_distance_constraint.json
new file mode 100644
index 00000000..9f25c2df
--- /dev/null
+++ b/tests/optf-has/has/data/plan_with_wrong_distance_constraint.json
@@ -0,0 +1,63 @@
+{
+ "name":"onap template with wrong distance constraint",
+ "template":{
+ "homing_template_version":"2017-10-10",
+ "parameters":{
+ "service_name":"Residential vCPE",
+ "service_id":"vcpe_service_id",
+ "customer_lat":45.395968,
+ "customer_long":-71.135344,
+ "physical_location":"DLLSTX233",
+ "REQUIRED_MEM":4,
+ "REQUIRED_DISK":100,
+ "pnf_id":"some_pnf_id"
+ },
+ "locations":{
+ "customer_loc":{
+ "latitude":{
+ "get_param":"customer_lat"
+ },
+ "longitude":{
+ "get_param":"customer_long"
+ }
+ }
+ },
+ "demands":{
+ "vG":[
+ {
+ "inventory_provider":"aai",
+ "inventory_type":"cloud"
+ }
+ ]
+ },
+ "constraints":{
+ "distance-vg":{
+ "demands":[
+ "vG"
+ ],
+ "properties":{
+ "distance":"< 1 km",
+ "location":"customer_loc"
+ }
+ }
+ },
+ "optimization":{
+ "minimize": {
+ "sum": [
+ {
+ "distance_between": [
+ "customer_loc",
+ "vG"
+ ]
+ },
+ {
+ "distance_between": [
+ "customer_loc",
+ "vG"
+ ]
+ }
+ ]
+ }
+ }
+ }
+}
diff --git a/tests/optf-has/has/data/plan_with_wrong_version.json b/tests/optf-has/has/data/plan_with_wrong_version.json
new file mode 100644
index 00000000..c0618bfb
--- /dev/null
+++ b/tests/optf-has/has/data/plan_with_wrong_version.json
@@ -0,0 +1,41 @@
+{
+ "name":"onap template with wrong version",
+ "template":{
+ "homing_template_version":"xxxx-yy-zz",
+ "parameters":{
+ "service_name":"Residential vCPE",
+ "service_id":"vcpe_service_id",
+ "customer_lat":45.395968,
+ "customer_long":-71.135344,
+ "physical_location":"DLLSTX233",
+ "REQUIRED_MEM":4,
+ "REQUIRED_DISK":100,
+ "pnf_id":"some_pnf_id"
+ },
+ "locations":{
+ "customer_loc":{
+ "latitude":{
+ "get_param":"customer_lat"
+ },
+ "longitude":{
+ "get_param":"customer_long"
+ }
+ }
+ },
+ "demands":{
+ "vG":[
+ {
+ "inventory_provider":"aai",
+ "inventory_type":"cloud"
+ }
+ ]
+ },
+ "constraints":{
+
+ },
+ "optimization":{
+
+ }
+ }
+}
+
diff --git a/tests/optf-has/has/data/plan_without_demand_section.json b/tests/optf-has/has/data/plan_without_demand_section.json
new file mode 100644
index 00000000..fe5d2fa6
--- /dev/null
+++ b/tests/optf-has/has/data/plan_without_demand_section.json
@@ -0,0 +1,33 @@
+{
+ "name":"onap template without demand section",
+ "template":{
+ "homing_template_version":"2017-10-10",
+ "parameters":{
+ "service_name":"Residential vCPE",
+ "service_id":"vcpe_service_id",
+ "customer_lat":45.395968,
+ "customer_long":-71.135344,
+ "physical_location":"DLLSTX233",
+ "REQUIRED_MEM":4,
+ "REQUIRED_DISK":100,
+ "pnf_id":"some_pnf_id"
+ },
+ "locations":{
+ "customer_loc":{
+ "latitude":{
+ "get_param":"customer_lat"
+ },
+ "longitude":{
+ "get_param":"customer_long"
+ }
+ }
+ },
+ "constraints":{
+
+ },
+ "optimization":{
+
+ }
+ }
+}
+
diff --git a/tests/optf-has/has/optf_has_test.robot b/tests/optf-has/has/optf_has_test.robot
new file mode 100644
index 00000000..3b3ee7a0
--- /dev/null
+++ b/tests/optf-has/has/optf_has_test.robot
@@ -0,0 +1,523 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library json
+
+*** Variables ***
+${MESSAGE} {"ping": "ok"}
+${RESP_STATUS} "error"
+${RESP_MESSAGE_WRONG_VERSION} "conductor_template_version must be one of: 2016-11-01"
+${RESP_MESSAGE_WITHOUT_DEMANDS} Undefined Demand
+
+#global variables
+${generatedPlanId}
+${generatedAID}
+${resultStatus}
+
+*** Test Cases ***
+Check Cassandra Docker Container
+ [Documentation] It checks cassandra docker container is running
+ ${rc} ${output}= Run and Return RC and Output docker ps
+ Log To Console *********************
+ Log To Console retrurn_code = ${rc}
+ Log To Console output = ${output}
+ Should Be Equal As Integers ${rc} 0
+ Should Contain ${output} music-db
+
+Check Zookeeper Docker Container
+ [Documentation] It checks zookeeper docker container is running
+ ${rc} ${output}= Run and Return RC and Output docker ps
+ Log To Console *********************
+ Log To Console retrurn_code = ${rc}
+ Log To Console output = ${output}
+ Should Be Equal As Integers ${rc} 0
+ Should Contain ${output} music-zk
+
+Check Tomcat Docker Container
+ [Documentation] It checks tomcat docker container is running
+ ${rc} ${output}= Run and Return RC and Output docker ps
+ Log To Console *********************
+ Log To Console retrurn_code = ${rc}
+ Log To Console output = ${output}
+ Should Be Equal As Integers ${rc} 0
+ Should Contain ${output} music-tomcat
+
+Check Music War Docker Container
+ [Documentation] It checks music.war docker container is running
+ ${rc} ${output}= Run and Return RC and Output docker ps
+ Log To Console *********************
+ Log To Console retrurn_code = ${rc}
+ Log To Console output = ${output}
+ Should Be Equal As Integers ${rc} 0
+ Should Contain ${output} music-war
+
+Get Music Version
+ [Documentation] It sends a REST GET request to retrieve the Music.war version
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request musicaas /MUSIC/rest/v2/version headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+Check ConductorApi Docker Container
+ [Documentation] It checks conductor-api docker container is running
+ ${rc} ${output}= Run and Return RC and Output docker ps
+ Log To Console *********************
+ Log To Console retrurn_code = ${rc}
+ Log To Console output = ${output}
+ Should Be Equal As Integers ${rc} 0
+ Should Contain ${output} cond-api
+
+Check ConductorController Docker Container
+ [Documentation] It checks conductor-controller docker container is running
+ ${rc} ${output}= Run and Return RC and Output docker ps
+ Log To Console *********************
+ Log To Console retrurn_code = ${rc}
+ Log To Console output = ${output}
+ Should Be Equal As Integers ${rc} 0
+ Should Contain ${output} cond-cont
+
+Check ConductorSolver Docker Container
+ [Documentation] It checks conductor-solver docker container is running
+ ${rc} ${output}= Run and Return RC and Output docker ps
+ Log To Console *********************
+ Log To Console retrurn_code = ${rc}
+ Log To Console output = ${output}
+ Should Be Equal As Integers ${rc} 0
+ Should Contain ${output} cond-solv
+
+Check ConductorReservation Docker Container
+ [Documentation] It checks conductor-reservation docker container is running
+ ${rc} ${output}= Run and Return RC and Output docker ps
+ Log To Console *********************
+ Log To Console retrurn_code = ${rc}
+ Log To Console output = ${output}
+ Should Be Equal As Integers ${rc} 0
+ Should Contain ${output} cond-resv
+
+Check ConductorData Docker Container
+ [Documentation] It checks conductor-data docker container is running
+ ${rc} ${output}= Run and Return RC and Output docker ps
+ Log To Console *********************
+ Log To Console retrurn_code = ${rc}
+ Log To Console output = ${output}
+ Should Be Equal As Integers ${rc} 0
+ Should Contain ${output} cond-data
+
+Get Root Url
+ [Documentation] It sends a REST GET request to root url
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request optf-cond / headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+ Sleep 10s Wait For 10 seconds
+
+Conductor AddHealthcheck Row Into Music
+ [Documentation] It sends a REST PUT request to Music to inject healthcheck plan
+ Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}healthcheck.json
+ &{headers}= Create Dictionary ns=conductor userId=conductor password=c0nduct0r Content-Type=application/json Accept=application/json
+ ${resp}= Put Request musicaas /MUSIC/rest/v2/keyspaces/conductor/tables/plans/rows?id=healthcheck data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ ${response_json} json.loads ${resp.content}
+ Should Be Equal As Integers ${resp.status_code} 200
+ Sleep 5s Wait Injection effectiveness
+
+Healthcheck
+ [Documentation] It sends a REST GET request to healthcheck url
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request optf-cond /v1/plans/healthcheck headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+
+SendPlanWithWrongVersion
+ [Documentation] It sends a POST request to conductor
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_wrong_version.json
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ ${response_json} json.loads ${resp.content}
+ ${generatedPlanId}= Convert To String ${response_json['id']}
+ Set Global Variable ${generatedPlanId}
+ Log To Console generatedPlanId = ${generatedPlanId}
+ Should Be Equal As Integers ${resp.status_code} 201
+ Sleep 10s Wait Plan Resolution
+
+GetPlanWithWrongVersion
+ [Documentation] It sends a REST GET request to capture error
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ ${response_json} json.loads ${resp.content}
+ ${resultStatus}= Convert To String ${response_json['plans'][0]['status']}
+ Set Global Variable ${resultStatus}
+ Log To Console resultStatus = ${resultStatus}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+ Should Be Equal error ${resultStatus}
+
+SendPlanWithoutDemandSection
+ [Documentation] It sends a POST request to conductor
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}plan_without_demand_section.json
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ ${response_json} json.loads ${resp.content}
+ ${generatedPlanId}= Convert To String ${response_json['id']}
+ Set Global Variable ${generatedPlanId}
+ Log To Console generatedPlanId = ${generatedPlanId}
+ Should Be Equal As Integers ${resp.status_code} 201
+ Sleep 10s Wait Plan Resolution
+
+GetPlanWithoutDemandSection
+ [Documentation] It sends a REST GET request to capture error
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ ${response_json} json.loads ${resp.content}
+ ${resultStatus}= Convert To String ${response_json['plans'][0]['status']}
+ Set Global Variable ${resultStatus}
+ Log To Console resultStatus = ${resultStatus}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+ Should Be Equal error ${resultStatus}
+
+SendPlanWithWrongConstraint
+ [Documentation] It sends a POST request to conductor
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_wrong_distance_constraint.json
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ ${response_json} json.loads ${resp.content}
+ ${generatedPlanId}= Convert To String ${response_json['id']}
+ Set Global Variable ${generatedPlanId}
+ Log To Console generatedPlanId = ${generatedPlanId}
+ Should Be Equal As Integers ${resp.status_code} 201
+ Sleep 10s Wait Plan Resolution
+
+GetPlanWithWrongConstraint
+ [Documentation] It sends a REST GET request to capture error
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ ${response_json} json.loads ${resp.content}
+ ${resultStatus}= Convert To String ${response_json['plans'][0]['status']}
+ Set Global Variable ${resultStatus}
+ Log To Console resultStatus = ${resultStatus}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+ Should Be Equal error ${resultStatus}
+
+
+SendPlanWithLatiAndLongi
+ [Documentation] It sends a POST request to conductor
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_lati_and_longi.json
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ ${response_json} json.loads ${resp.content}
+ ${generatedPlanId}= Convert To String ${response_json['id']}
+ Set Global Variable ${generatedPlanId}
+ Log To Console generatedPlanId = ${generatedPlanId}
+ Should Be Equal As Integers ${resp.status_code} 201
+ Sleep 60s Wait Plan Resolution
+
+GetPlanWithLatiAndLongi
+ [Documentation] It sends a REST GET request to capture recommendations
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ ${response_json} json.loads ${resp.content}
+ ${resultStatus}= Convert To String ${response_json['plans'][0]['status']}
+ Set Global Variable ${resultStatus}
+ Log To Console resultStatus = ${resultStatus}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+ Should Be Equal done ${resultStatus}
+
+SendPlanWithShortDistanceConstraint
+ [Documentation] It sends a POST request to conductor
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_short_distance_constraint.json
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ ${response_json} json.loads ${resp.content}
+ ${generatedPlanId}= Convert To String ${response_json['id']}
+ Set Global Variable ${generatedPlanId}
+ Log To Console generatedPlanId = ${generatedPlanId}
+ Should Be Equal As Integers ${resp.status_code} 201
+ Sleep 60s Wait Plan Resolution
+
+GetPlanWithShortDistanceConstraint
+ [Documentation] It sends a REST GET request to capture recommendations
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ ${response_json} json.loads ${resp.content}
+ ${resultStatus}= Convert To String ${response_json['plans'][0]['status']}
+ Set Global Variable ${resultStatus}
+ Log To Console resultStatus = ${resultStatus}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+ Should Be Equal not found ${resultStatus}
+
+SendPlanWithVimFit
+ [Documentation] It sends a POST request to conductor
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_vim_fit.json
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ ${response_json} json.loads ${resp.content}
+ ${generatedPlanId}= Convert To String ${response_json['id']}
+ Set Global Variable ${generatedPlanId}
+ Log To Console generatedPlanId = ${generatedPlanId}
+ Should Be Equal As Integers ${resp.status_code} 201
+ Sleep 60s Wait Plan Resolution
+
+GetPlanWithVimFit
+ [Documentation] It sends a REST GET request to capture recommendations
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ ${response_json} json.loads ${resp.content}
+ ${resultStatus}= Convert To String ${response_json['plans'][0]['status']}
+ Set Global Variable ${resultStatus}
+ Log To Console resultStatus = ${resultStatus}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+ Should Be Equal done ${resultStatus}
+
+SendPlanWithHpa
+ [Documentation] It sends a POST request to conductor
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_hpa.json
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ ${response_json} json.loads ${resp.content}
+ ${generatedPlanId}= Convert To String ${response_json['id']}
+ Set Global Variable ${generatedPlanId}
+ Log To Console generatedPlanId = ${generatedPlanId}
+ Should Be Equal As Integers ${resp.status_code} 201
+ Sleep 60s Wait Plan Resolution
+
+GetPlanWithHpa
+ [Documentation] It sends a REST GET request to capture recommendations
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ ${response_json} json.loads ${resp.content}
+ ${resultStatus}= Convert To String ${response_json['plans'][0]['status']}
+ Set Global Variable ${resultStatus}
+ Log To Console resultStatus = ${resultStatus}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+ Should Be Equal done ${resultStatus}
+
+SendPlanWithHpaSimple
+ [Documentation] It sends a POST request to conductor
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_hpa_simple.json
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ ${response_json} json.loads ${resp.content}
+ ${generatedPlanId}= Convert To String ${response_json['id']}
+ Set Global Variable ${generatedPlanId}
+ Log To Console generatedPlanId = ${generatedPlanId}
+ Should Be Equal As Integers ${resp.status_code} 201
+ Sleep 60s Wait Plan Resolution
+
+GetPlanWithHpaSimple
+ [Documentation] It sends a REST GET request to capture recommendations
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ ${response_json} json.loads ${resp.content}
+ ${resultStatus}= Convert To String ${response_json['plans'][0]['status']}
+ Set Global Variable ${resultStatus}
+ Log To Console resultStatus = ${resultStatus}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+ Should Be Equal done ${resultStatus}
+
+SendPlanWithHpaMandatory
+ [Documentation] It sends a POST request to conductor
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_hpa_requirements_mandatory.json
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ ${response_json} json.loads ${resp.content}
+ ${generatedPlanId}= Convert To String ${response_json['id']}
+ Set Global Variable ${generatedPlanId}
+ Log To Console generatedPlanId = ${generatedPlanId}
+ Should Be Equal As Integers ${resp.status_code} 201
+ Sleep 60s Wait Plan Resolution
+
+GetPlanWithHpaMandatory
+ [Documentation] It sends a REST GET request to capture recommendations
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ ${response_json} json.loads ${resp.content}
+ ${resultStatus}= Convert To String ${response_json['plans'][0]['status']}
+ Set Global Variable ${resultStatus}
+ Log To Console resultStatus = ${resultStatus}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+ Should Be Equal done ${resultStatus}
+
+SendPlanWithHpaOptionals
+ [Documentation] It sends a POST request to conductor
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_hpa_requirements_optionals.json
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ ${response_json} json.loads ${resp.content}
+ ${generatedPlanId}= Convert To String ${response_json['id']}
+ Set Global Variable ${generatedPlanId}
+ Log To Console generatedPlanId = ${generatedPlanId}
+ Should Be Equal As Integers ${resp.status_code} 201
+ Sleep 60s Wait Plan Resolution
+
+GetPlanWithHpaOptionals
+ [Documentation] It sends a REST GET request to capture recommendations
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ ${response_json} json.loads ${resp.content}
+ ${resultStatus}= Convert To String ${response_json['plans'][0]['status']}
+ Set Global Variable ${resultStatus}
+ Log To Console resultStatus = ${resultStatus}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+ Should Be Equal done ${resultStatus}
+
+SendPlanWithHpaUnmatched
+ [Documentation] It sends a POST request to conductor
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_hpa_unmatched.json
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ ${response_json} json.loads ${resp.content}
+ ${generatedPlanId}= Convert To String ${response_json['id']}
+ Set Global Variable ${generatedPlanId}
+ Log To Console generatedPlanId = ${generatedPlanId}
+ Should Be Equal As Integers ${resp.status_code} 201
+ Sleep 60s Wait Plan Resolution
+
+GetPlanWithHpaUnmatched
+ [Documentation] It sends a REST GET request to capture recommendations
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ ${response_json} json.loads ${resp.content}
+ ${resultStatus}= Convert To String ${response_json['plans'][0]['status']}
+ Set Global Variable ${resultStatus}
+ Log To Console resultStatus = ${resultStatus}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+ Should Be Equal not found ${resultStatus}
+
+# HPA Score Multi objective Optimization
+SendPlanWithHpaScoreMultiObj
+ [Documentation] It sends a POST request to conductor
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ ${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_hpa_score_multi_objective.json
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ Log To Console body = ${resp.text}
+ ${response_json} json.loads ${resp.content}
+ ${generatedPlanId}= Convert To String ${response_json['id']}
+ Set Global Variable ${generatedPlanId}
+ Log To Console generatedPlanId = ${generatedPlanId}
+ Should Be Equal As Integers ${resp.status_code} 201
+ Sleep 60s Wait Plan Resolution
+
+GetPlanWithHpaScoreMultiObj
+ [Documentation] It sends a REST GET request to capture recommendations
+ Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
+ Log To Console *********************
+ Log To Console response = ${resp}
+ ${response_json} json.loads ${resp.content}
+ ${resultStatus}= Convert To String ${response_json['plans'][0]['status']}
+ ${vim-id}= Convert To String ${response_json['plans'][0]['recommendations'][0]['vG']['candidate']['vim-id']}
+ # ${hpa_score}= Convert To String ${response_json['plans'][0]['recommendations']['vG']['hpa_score']}
+ Set Global Variable ${resultStatus}
+ Log To Console resultStatus = ${resultStatus}
+ Log To Console body = ${resp.text}
+ Should Be Equal As Integers ${resp.status_code} 200
+ Should Be Equal done ${resultStatus}
+ Should Be Equal HPA-cloud_cloud-region-1 ${vim-id}
+
+
+*** Keywords ***
+
+
diff --git a/tests/optf-has/osdf/data/sampletest.txt b/tests/optf-has/osdf/data/sampletest.txt
new file mode 100644
index 00000000..9f4e8d7d
--- /dev/null
+++ b/tests/optf-has/osdf/data/sampletest.txt
@@ -0,0 +1 @@
+#test
diff --git a/tests/policy/apex-pdp/apex-pdp-test.robot b/tests/policy/apex-pdp/apex-pdp-test.robot
new file mode 100644
index 00000000..f1dea17d
--- /dev/null
+++ b/tests/policy/apex-pdp/apex-pdp-test.robot
@@ -0,0 +1,14 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Test Cases ***
+
+Call Apex Policy
+ Create Session apexSession http://${APEX_IP}:23324 max_retries=3
+ ${data}= Get Binary File ${CURDIR}${/}data${/}event.json
+ &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ ${resp}= Put Request apexSession /apex/FirstConsumer/EventIn data=${data} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
diff --git a/tests/policy/apex-pdp/data/event.json b/tests/policy/apex-pdp/data/event.json
new file mode 100644
index 00000000..9dbf2790
--- /dev/null
+++ b/tests/policy/apex-pdp/data/event.json
@@ -0,0 +1,11 @@
+{
+ "nameSpace": "org.onap.policy.apex.sample.events",
+ "name": "Event0000",
+ "version": "0.0.1",
+ "source": "REST_0",
+ "target": "apex",
+ "TestSlogan": "Test slogan for External Event0",
+ "TestMatchCase": 3,
+ "TestTimestamp": 1536363522018,
+ "TestTemperature": 9080.866
+}
diff --git a/tests/policy/distribution/distribution-test.robot b/tests/policy/distribution/distribution-test.robot
new file mode 100644
index 00000000..1b9fa212
--- /dev/null
+++ b/tests/policy/distribution/distribution-test.robot
@@ -0,0 +1,17 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Test Cases ***
+Healthcheck
+ [Documentation] Runs Policy Distribution Health check
+ ${auth}= Create List healthcheck zb!XztG34
+ Log Creating session http://${POLICY_DISTRIBUTION_IP}:6969
+ ${session}= Create Session policy http://${POLICY_DISTRIBUTION_IP}:6969 auth=${auth}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ ${resp}= Get Request policy /healthcheck headers=${headers}
+ Log Received response from policy ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Be Equal As Strings ${resp.json()['code']} 200
diff --git a/tests/policy/suite1/Policy-CSIT.robot b/tests/policy/suite1/Policy-CSIT.robot
new file mode 100644
index 00000000..785619f9
--- /dev/null
+++ b/tests/policy/suite1/Policy-CSIT.robot
@@ -0,0 +1,360 @@
+*** Settings ***
+Documentation Policy ONAP CSIT Test cases
+Library String
+Library HttpLibrary.HTTP
+LIbrary Process
+Library BuiltIn
+Resource policy_interface.robot
+Resource json_templater.robot
+
+*** Variables ***
+${RESOURCE_PATH_CREATE} /pdp/api/createPolicy
+${RESOURCE_PATH_CREATE_PUSH} /pdp/api/pushPolicy
+${RESOURCE_PATH_CREATE_DELETE} /pdp/api/deletePolicy
+${RESOURCE_PATH_GET_CONFIG} /pdp/api/getConfig
+${CREATE_CONFIG_VFW_TEMPLATE} ${CURDIR}/configpolicy_vFW_R1.template
+${CREATE_CONFIG_VDNS_TEMPLATE} ${CURDIR}/configpolicy_vDNS_R1.template
+${CREATE_CONFIG_VCPE_TEMPLATE} ${CURDIR}/configpolicy_vCPE_R1.template
+${CREATE_OPS_VFW_TEMPLATE} ${CURDIR}/opspolicy_VFW_R1.template
+${CREATE_OOF_HPA_TEMPLATE} ${CURDIR}/oofpolicy_HPA_R1.template
+${CREATE_SDNC_VFW_TEMPLATE} ${CURDIR}/sdncnamingpolicy_vFW.template
+${CREATE_SDNC_VPG_TEMPLATE} ${CURDIR}/sdncnamingpolicy_vPG.template
+${PUSH_POLICY_TEMPLATE} ${CURDIR}/pushpolicy.template
+${CREATE_OPS_VDNS_TEMPLATE} ${CURDIR}/opspolicy_VDNS_R1.template
+${DEL_POLICY_TEMPLATE} ${CURDIR}/deletepolicy.template
+${GETCONFIG_TEMPLATE} ${CURDIR}/getconfigpolicy.template
+${GETOOF_TEMPLATE} ${CURDIR}/getoofpolicy.template
+${CONFIG_POLICY_VFW_NAME} vFirewall
+${CONFIG_POLICY_VFW_TYPE} MicroService
+${CONFIG_POLICY_VDNS_NAME} vLoadBalancer
+${CONFIG_POLICY_VDNS_TYPE} MicroService
+${OPS_POLICY_VFW_NAME} vFirewall
+${OPS_POLICY_VFW_TYPE} BRMS_PARAM
+${OPS_POLICY_VDNS_NAME} vLoadBalancer
+${OPS_POLICY_VDNS_TYPE} BRMS_PARAM
+${CONFIG_POLICY_VCPE_NAME} vCPE
+${CONFIG_POLICY_VCPE_TYPE} MicroService
+${OPS_POLICY_VCPE_NAME} vCPE
+${OPS_POLICY_VCPE_TYPE} BRMS_PARAM
+${OPS_POLICY_VOLTE_NAME} VoLTE
+${OPS_POLICY_VOLTE_TYPE} BRMS_PARAM
+${OOF_POLICY_HPA_NAME} HPA
+${OOF_POLICY_HPA_TYPE} Optimization
+${SDNC_POLICY_VFW_NAME} ONAP_vFW_Naming
+${SDNC_POLICY_VPG_NAME} ONAP_vPG_Naming
+${file_path} ../testsuite/robot/assets/templates/ControlLoopDemo__closedLoopControlName.drl
+${RESOURCE_PATH_UPLOAD} /pdp/api/policyEngineImport?importParametersJson=%7B%22serviceName%22%3A%22Manyu456%22%2C%20%22serviceType%22%3A%22BRMSPARAM%22%7D
+${CREATE_OPS_VCPE_TEMPLATE} ${CURDIR}/opspolicy_vCPE_R1.template
+${CREATE_OPS_VOLTE_TEMPLATE} ${CURDIR}/opspolicy_vOLTE_R1.template
+
+
+*** Test Cases ***
+Policy Health check
+ Run Policy Health Check
+
+VFW Config Policy
+ ${CONFIG_POLICY_VFW_NAME}= Create Config VFW Policy
+ Push Config Policy ${CONFIG_POLICY_VFW_NAME} ${CONFIG_POLICY_VFW_TYPE}
+ #VFW Policy Tests
+
+VDNS Config Policy
+ ${CONFIG_POLICY_VDNS_NAME}= Create Config VDNS Policy
+ Push Config Policy ${CONFIG_POLICY_VDNS_NAME} ${CONFIG_POLICY_VDNS_TYPE}
+ #VDNS Policy Tests
+
+VCPE Config Policy
+ ${CONFIG_POLICY_VCPE_NAME}= Create Config VCPE Policy
+ Push Config Policy ${CONFIG_POLICY_VCPE_NAME} ${CONFIG_POLICY_VCPE_TYPE}
+ #VCPE Policy Tests
+
+VFW Ops Policy
+ ${OPS_POLICY_VFW_NAME}= Create Ops VFW Policy
+ Push Ops Policy ${OPS_POLICY_VFW_NAME} ${OPS_POLICY_VFW_TYPE}
+
+VDNS Ops Policy
+ ${OPS_POLICY_VDNS_NAME}= Create Ops VDNS Policy
+ Push Ops Policy ${OPS_POLICY_VDNS_NAME} ${OPS_POLICY_VDNS_TYPE}
+
+VCPE Ops Policy
+ ${OPS_POLICY_VCPE_NAME}= Create Ops VCPE Policy
+ Push Ops Policy ${OPS_POLICY_VCPE_NAME} ${OPS_POLICY_VCPE_TYPE}
+
+VOLTE Ops Policy
+ ${OPS_POLICY_VOLTE_NAME}= Create Ops VOLTE Policy
+ Push Ops Policy ${OPS_POLICY_VOLTE_NAME} ${OPS_POLICY_VOLTE_TYPE}
+ #VOLTE Policy Tests
+
+VFW SDNC Naming Policy
+ ${SDNC_POLICY_VFW_NAME}= Create VFW SDNC Naming Policy
+ Push Config Policy ${SDNC_POLICY_VFW_NAME} ${CONFIG_POLICY_VFW_TYPE}
+ #VFW Policy Tests
+
+VPG SDNC Naming Policy
+ ${SDNC_POLICY_VPG_NAME}= Create VPG SDNC Naming Policy
+ Push Config Policy ${SDNC_POLICY_VPG_NAME} ${CONFIG_POLICY_VFW_TYPE}
+ #VPG Policy Tests
+
+HPA OOF Policy
+ ${OOF_POLICY_HPA_NAME}= Create OOF HPA Policy
+ Push Config Policy ${OOF_POLICY_HPA_NAME} ${OOF_POLICY_HPA_TYPE}
+ #HPA Policy Tests
+
+VFW Get Configs Policy
+ Sleep 5s
+ Get Configs VFW Policy
+
+VDNS Get Configs Policy
+ Sleep 5s
+ Get Configs VDNS Policy
+
+VCPE Get Configs Policy
+ Sleep 5s
+ Get Configs VCPE Policy
+
+HPA Get OOF Policy
+ Sleep 5s
+ Get OOF HPA Policy
+
+*** Keywords ***
+
+VFW Policy Tests
+ ${CONFIG_POLICY_VFW_NAME}= Create Config VFW Policy
+ Push Config Policy ${CONFIG_POLICY_VFW_NAME} ${CONFIG_POLICY_VFW_TYPE}
+ Get Configs VFW Policy
+ ${OPS_POLICY_VFW_NAME}= Create Ops VFW Policy
+ Push Ops Policy ${OPS_POLICY_VFW_NAME} ${OPS_POLICY_VFW_TYPE}
+ ${SDNC_POLICY_VFW_NAME}= Create VFW SDNC Naming Policy
+ Push Config Policy ${CONFIG_POLICY_VFW_NAME} ${CONFIG_POLICY_VFW_TYPE}
+
+VDNS Policy Tests
+ ${CONFIG_POLICY_VDNS_NAME}= Create Config VDNS Policy
+ Push Config Policy ${CONFIG_POLICY_VDNS_NAME} ${CONFIG_POLICY_VDNS_TYPE}
+ Get Configs VDNS Policy
+ ${OPS_POLICY_VDNS_NAME}= Create Ops VDNS Policy
+ Push Ops Policy ${OPS_POLICY_VDNS_NAME} ${OPS_POLICY_VDNS_TYPE}
+
+VCPE Policy Tests
+ ${CONFIG_POLICY_VCPE_NAME}= Create Config VCPE Policy
+ Push Config Policy ${CONFIG_POLICY_VCPE_NAME} ${CONFIG_POLICY_VCPE_TYPE}
+ Get Configs VCPE Policy
+ ${OPS_POLICY_VCPE_NAME}= Create Ops VCPE Policy
+ Push Ops Policy ${OPS_POLICY_VCPE_NAME} ${OPS_POLICY_VCPE_TYPE}
+
+VPG Policy Tests
+ ${SDNC_POLICY_VPG_NAME}= Create VPG SDNC Naming Policy
+ Push Config Policy ${SDNC_POLICY_VPG_NAME} ${CONFIG_POLICY_VFW_TYPE}
+
+VOLTE Policy Tests
+ ${OPS_POLICY_VOLTE_NAME}= Create Ops VOLTE Policy
+ Push Ops Policy ${OPS_POLICY_VOLTE_NAME} ${OPS_POLICY_VOLTE_TYPE}
+
+HPA Policy Tests
+ ${OOF_POLICY_HPA_NAME}= Create OOF HPA Policy
+ Push Config Policy ${OOF_POLICY_HPA_NAME} ${OOF_POLICY_HPA_TYPE}
+ Get OOF HPA Policy
+
+Get Configs VFW Policy
+ [Documentation] Get Config Policy for VFW
+ ${getconfigpolicy}= Catenate .*${CONFIG_POLICY_VFW_NAME}*
+ ${configpolicy_name}= Create Dictionary config_policy_name=${getconfigpolicy}
+ ${output} = Fill JSON Template File ${GETCONFIG_TEMPLATE} ${configpolicy_name}
+ ${get_resp} = Run Policy Get Configs Request ${RESOURCE_PATH_GET_CONFIG} ${output}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+
+Create OOF HPA Policy
+ [Documentation] Create OOF Policy
+ ${randompolicyname} = Create Policy Name
+ ${policyname1}= Catenate com.${randompolicyname}_HPA
+ ${OOF_POLICY_HPA_NAME}= Set Test Variable ${policyname1}
+ ${hpapolicy}= Create Dictionary policy_name=${policyname1}
+ ${output} = Fill JSON Template File ${CREATE_OOF_HPA_TEMPLATE} ${hpapolicy}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE} ${output}
+ Log ${put_resp}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+ [Return] ${policyname1}
+
+Get OOF HPA Policy
+ [Documentation] Get OOF Policy for HPA
+ ${gethpapolicy}= Catenate .*${OOF_POLICY_HPA_NAME}*
+ ${hpapolicy_name}= Create Dictionary oof_policy_name=${gethpapolicy}
+ ${output} = Fill JSON Template File ${GETOOF_TEMPLATE} ${hpapolicy_name}
+ ${get_resp} = Run Policy Get Configs Request ${RESOURCE_PATH_GET_CONFIG} ${output}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+
+Create Config VFW Policy
+ [Documentation] Create Config Policy
+ ${randompolicyname} = Create Policy Name
+ ${policyname1}= Catenate com.${randompolicyname}_vFirewall
+ ${CONFIG_POLICY_VFW_NAME}= Set Test Variable ${policyname1}
+ ${configpolicy}= Create Dictionary policy_name=${policyname1}
+ ${output} = Fill JSON Template File ${CREATE_CONFIG_VFW_TEMPLATE} ${configpolicy}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE} ${output}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+ [Return] ${policyname1}
+
+Create VPG SDNC Naming Policy
+ [Documentation] Create VPG SDNC Naming Policy
+ ${randompolicyname} = Create Policy Name
+ ${policyname1}= Catenate com.${randompolicyname}_ONAP_vPG_Naming
+ ${SDNC_POLICY_VPG_NAME}= Set Test Variable ${policyname1}
+ ${sdncpolicy}= Create Dictionary policy_name=${policyname1}
+ ${output} = Fill JSON Template File ${CREATE_SDNC_VPG_TEMPLATE} ${sdncpolicy}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE} ${output}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+ [Return] ${policyname1}
+
+Create VFW SDNC Naming Policy
+ [Documentation] Create VFW SDNC Naming Policy
+ ${randompolicyname} = Create Policy Name
+ ${policyname1}= Catenate com.${randompolicyname}_ONAP_vFW_Naming
+ ${SDNC_POLICY_VFW_NAME}= Set Test Variable ${policyname1}
+ ${sdncpolicy}= Create Dictionary policy_name=${policyname1}
+ ${output} = Fill JSON Template File ${CREATE_SDNC_VFW_TEMPLATE} ${sdncpolicy}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE} ${output}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+ [Return] ${policyname1}
+
+Create Policy Name
+ [Documentation] Generate Policy Name
+ [Arguments] ${prefix}=CSIT_
+ ${random}= Generate Random String 15 [LOWER][NUMBERS]
+ ${policyname}= Catenate ${prefix}${random}
+ [Return] ${policyname}
+
+Create Ops VFW Policy
+ [Documentation] Create Operational Policy
+ ${randompolicyname} = Create Policy Name
+ ${policyname1}= Catenate com.${randompolicyname}_vFirewall
+ ${OPS_POLICY_VFW_NAME}= Set Test Variable ${policyname1}
+ ${dict}= Create Dictionary policy_name=${policyname1}
+ ${output} = Fill JSON Template File ${CREATE_OPS_VFW_TEMPLATE} ${dict}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE} ${output}
+ Log ${put_resp}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+ [Return] ${policyname1}
+
+Push Ops Policy
+ [Documentation] Push Ops Policy
+ [Arguments] ${policyname} ${policytype}
+ ${dict}= Create Dictionary policy_name=${policyname} policy_type=${policytype}
+ ${output} = Fill JSON Template File ${PUSH_POLICY_TEMPLATE} ${dict}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE_PUSH} ${output}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+
+Push Config Policy
+ [Documentation] Push Config Policy
+ [Arguments] ${policyname} ${policytype}
+ ${dict}= Create Dictionary policy_name=${policyname} policy_type=${policytype}
+ ${output} = Fill JSON Template File ${PUSH_POLICY_TEMPLATE} ${dict}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE_PUSH} ${output}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+
+Delete Ops Policy
+ [Documentation] Delete Config Policy
+ [Arguments] ${policy_name}
+ ${policyname3}= Catenate com.Config_BRMS_Param_${policyname}.1.xml
+ ${dict}= Create Dictionary policy_name=${policyname3}
+ ${output} = Fill JSON Template ${DEL_POLICY_TEMPLATE} ${dict}
+ ${put_resp} = Run Policy Delete Request ${RESOURCE_PATH_CREATE_DELETE} ${output}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+
+Delete Config Policy
+ [Documentation] Delete Ops Policy
+ [Arguments] ${policy_name}
+ ${policyname3}= Catenate com.Config_MS_com.${policy_name}.1.xml
+ ${dict}= Create Dictionary policy_name=${policyname3}
+ ${output} = Fill JSON Template ${DEL_POLICY_TEMPLATE} ${dict}
+ ${put_resp} = Run Policy Delete Request ${RESOURCE_PATH_CREATE_DELETE} ${output}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+
+Delete OOF Policy
+ [Documentation] Delete OOF Policy
+ [Arguments] ${policy_name}
+ ${policyname3}= Catenate com.Config_OOF_${policy_name}.1.xml
+ ${dict}= Create Dictionary policy_name=${policyname3}
+ ${output} = Fill JSON Template ${DEL_POLICY_TEMPLATE} ${dict}
+ ${put_resp} = Run Policy Delete Request ${RESOURCE_PATH_CREATE_DELETE} ${output}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+
+Get Configs VDNS Policy
+ [Documentation] Get Config Policy for VDNS
+ ${getconfigpolicy}= Catenate .*${CONFIG_POLICY_VDNS_NAME}*
+ ${configpolicy_name}= Create Dictionary config_policy_name=${getconfigpolicy}
+ ${output} = Fill JSON Template File ${GETCONFIG_TEMPLATE} ${configpolicy_name}
+ ${get_resp} = Run Policy Get Configs Request ${RESOURCE_PATH_GET_CONFIG} ${output}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+
+Create Config VDNS Policy
+ [Documentation] Create Config Policy
+ ${randompolicyname} = Create Policy Name
+ ${policyname1}= Catenate com.${randompolicyname}_vLoadBalancer
+ ${CONFIG_POLICY_VDNS_NAME}= Set Test Variable ${policyname1}
+ ${configpolicy}= Create Dictionary policy_name=${policyname1}
+ ${output} = Fill JSON Template File ${CREATE_CONFIG_VDNS_TEMPLATE} ${configpolicy}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE} ${output}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+ [Return] ${policyname1}
+
+Create Ops VDNS Policy
+ [Documentation] Create Operational Policy
+ ${randompolicyname} = Create Policy Name
+ ${policyname1}= Catenate com.${randompolicyname}_vLoadBalancer
+ ${OPS_POLICY_VDNS_NAME}= Set Test Variable ${policyname1}
+ ${dict}= Create Dictionary policy_name=${policyname1}
+ ${output} = Fill JSON Template File ${CREATE_OPS_VDNS_TEMPLATE} ${dict}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE} ${output}
+ Log ${put_resp}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+ [Return] ${policyname1}
+
+Create Config VCPE Policy
+ [Documentation] Create Config Policy
+ ${randompolicyname} = Create Policy Name
+ ${policyname1}= Catenate com.${randompolicyname}_vCPE
+ ${CONFIG_POLICY_VCPE_NAME}= Set Test Variable ${policyname1}
+ ${configpolicy}= Create Dictionary policy_name=${policyname1}
+ ${output} = Fill JSON Template File ${CREATE_CONFIG_VCPE_TEMPLATE} ${configpolicy}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE} ${output}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+ [Return] ${policyname1}
+
+Get Configs VCPE Policy
+ [Documentation] Get Config Policy for VCPE
+ ${getconfigpolicy}= Catenate .*${CONFIG_POLICY_VCPE_NAME}*
+ ${configpolicy_name}= Create Dictionary config_policy_name=${getconfigpolicy}
+ ${output} = Fill JSON Template File ${GETCONFIG_TEMPLATE} ${configpolicy_name}
+ ${get_resp} = Run Policy Get Configs Request ${RESOURCE_PATH_GET_CONFIG} ${output}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+
+Create Ops vCPE Policy
+ [Documentation] Create Operational Policy
+ ${randompolicyname} = Create Policy Name
+ ${policyname1}= Catenate com.${randompolicyname}_vCPE
+ ${OPS_POLICY_VCPE_NAME}= Set Test Variable ${policyname1}
+ ${dict}= Create Dictionary policy_name=${policyname1}
+ ${output} = Fill JSON Template File ${CREATE_OPS_VCPE_TEMPLATE} ${dict}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE} ${output}
+ Log ${put_resp}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+ [Return] ${policyname1}
+
+Create Ops VolTE Policy
+ [Documentation] Create Operational Policy
+ ${randompolicyname} = Create Policy Name
+ ${policyname1}= Catenate com.${randompolicyname}_VoLTE
+ ${dict}= Create Dictionary policy_name=${policyname1}
+ ${output} = Fill JSON Template File ${CREATE_OPS_VOLTE_TEMPLATE} ${dict}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE} ${output}
+ Log ${put_resp}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+ [Return] ${policyname1}
+
+Upload DRL file
+ [Documentation] Upload DRL file1
+ ${file_data}= Get Binary File ${file_path}
+ ${files}= Create Dictionary file=${file_data}
+ #${CONFIG_POLICY_VDNS_NAME}= Set Test Variable ${policyname1}
+ # ${files2} = {'file': open('../testsuite/robot/assets/templates/ControlLoopDemo__closedLoopControlName.drl', 'rb')}
+ # ${files}= Create Dictionary file ${file_data}
+ ${put_resp} = Run Policy Post form Request ${RESOURCE_PATH_UPLOAD} ${files}
+ Should Be Equal As Strings ${put_resp.status_code} 200
diff --git a/tests/policy/suite1/__init__.robot b/tests/policy/suite1/__init__.robot
new file mode 100644
index 00000000..c7970e6a
--- /dev/null
+++ b/tests/policy/suite1/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Policy - Suite 1
diff --git a/tests/policy/suite1/configpolicy_vCPE.template b/tests/policy/suite1/configpolicy_vCPE.template
new file mode 100644
index 00000000..e3e3a2d0
--- /dev/null
+++ b/tests/policy/suite1/configpolicy_vCPE.template
@@ -0,0 +1,6 @@
+{
+"configBody": "{ \"service\": \"policy_tosca_tca\", \"location\": \"SampleServiceLocation\", \"uuid\": \"test\", \"policyName\": \"MicroServicevCPE\", \"description\": \"MicroService vCPE Policy\", \"configName\": \"SampleConfigName\", \"templateVersion\": \"OpenSource.version.1\", \"version\": \"1.0.0\", \"priority\": \"1\", \"policyScope\": \"resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=SampleClosedLoop\", \"riskType\": \"SampleRiskType\", \"riskLevel\": \"1\", \"guard\": \"False\", \"content\": { \"policyVersion\": \"v0.0.1\", \"threshholds\": [{ \"severity\": \"MAJOR\", \"fieldPath\": \"$$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsDelta\", \"thresholdValue\": \"0\", \"closedLoopEventStatus\": \"ABATED\", \"closedLoopControlName\": \"CL-vCPEvGMUX-TRAFFIC-SIG-FB480F95-A453-6F24-B767-FD703241ABA1\", \"version\": \"1.0.2\", \"direction\": \"EQUAL\" }, { \"severity\": \"CRITICAL\", \"fieldPath\": \"$$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsDelta\", \"thresholdValue\": \"1000\", \"closedLoopEventStatus\": \"ONSET\", \"closedLoopControlName\": \"CL-vCPEvGMUX-TRAFFIC-SIG-FB480F95-A453-6F24-B767-FD703241ABA1\", \"version\": \"1.0.2\", \"direction\": \"GREATER_OR_EQUAL\" }], \"policyName\": \"DCAE.Config_tca-hi-lo\", \"controlLoopSchemaType\": \"VM\", \"policyScope\": \"DCAE\", \"eventName\": \"vCPEvGMUXPacketLoss\" } }",
+"policyConfigType": "MicroService",
+"policyName": "${policy_name}",
+"ecompName": "DCAE"
+}
diff --git a/tests/policy/suite1/configpolicy_vCPE_R1.template b/tests/policy/suite1/configpolicy_vCPE_R1.template
new file mode 100644
index 00000000..77653c3f
--- /dev/null
+++ b/tests/policy/suite1/configpolicy_vCPE_R1.template
@@ -0,0 +1,7 @@
+{
+ "configBody": "{ \"service\": \"tca_policy\", \"location\": \"SampleServiceLocation\", \"uuid\": \"test\", \"policyName\": \"MicroServicevCPE\", \"description\": \"MicroService vCPE Policy\", \"configName\": \"SampleConfigName\", \"templateVersion\": \"OpenSource.version.1\", \"version\": \"1.1.0\", \"priority\": \"1\", \"policyScope\": \"resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e\", \"riskType\": \"SampleRiskType\", \"riskLevel\": \"1\", \"guard\": \"False\", \"content\": { \"policyVersion\": \"v0.0.1\", \"threshholds\": [{ \"severity\": \"MAJOR\", \"fieldPath\": \"$$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value\", \"thresholdValue\": \"0\", \"closedLoopEventStatus\": \"ABATED\", \"closedLoopControlName\": \"ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e\", \"version\": \"1.0.2\", \"direction\": \"EQUAL\" }, { \"severity\": \"CRITICAL\", \"fieldPath\": \"$$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value\", \"thresholdValue\": \"0\", \"closedLoopEventStatus\": \"ONSET\", \"closedLoopControlName\": \"ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e\", \"version\": \"1.0.2\", \"direction\": \"GREATER\" }], \"policyName\": \"DCAE.Config_tca-hi-lo\", \"controlLoopSchemaType\": \"VNF\", \"policyScope\": \"DCAE\", \"eventName\": \"Measurement_vGMUX\" } }",
+ "policyConfigType": "MicroService",
+ "policyName": "${policy_name}",
+ "onapName": "DCAE",
+ "priority": "5"
+}
diff --git a/tests/policy/suite1/configpolicy_vDNS.template b/tests/policy/suite1/configpolicy_vDNS.template
new file mode 100644
index 00000000..ab1d2e0d
--- /dev/null
+++ b/tests/policy/suite1/configpolicy_vDNS.template
@@ -0,0 +1,6 @@
+{
+"configBody": "{\"service\": \"policy_tosca_tca\",\"location\": \"TestMSLocation\",\"uuid\": \"/services/cdap-tca-hi-lo/instances/dfw1/configuration/metricsPerFunctionalRole/vLoadBalancer\",\"policyName\": \"vLoadBalancer\",\"description\": \"vLoadBalancer\",\"configName\": \"TestConfigName\",\"templateVersion\": \"1607\",\"version\": \"8.7.6.5\",\"priority\": \"1\",\"policyScope\": \"resource=TestResource,service=TestService,type=TestType,closedLoopControlName=TestClosedLoop\",\"riskType\": \"test\",\"riskLevel\": \"2\",\"guard\": \"False\",\"content\": {\"policyVersion\": \"v0.0.1\",\"threshholds\": [{\"severity\": \"MAJOR\",\"fieldPath\": \"$$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated\",\"thresholdValue\": \"500\",\"closedLoopControlName\": \"CL-LBAL-LOW-TRAFFIC-SIG-FB480F95-A453-6F24-B767-FD703241AB1A\",\"version\": \"1.0.2\",\"direction\": \"LESS_OR_EQUAL\"}, {\"severity\": \"CRITICAL\",\"fieldPath\": \"$$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated\",\"thresholdValue\": \"5000\",\"closedLoopControlName\": \"CL-LBAL-HIGH-TRAFFIC-SIG-0C5920A6-B564-8035-C878-0E814352BC2B\",\"version\": \"1.0.2\",\"direction\": \"GREATER_OR_EQUAL\"}],\"policyName\": \"configuration.ae.microservice.tca.xml\",\"functionalRole\": \"ClosedLoop_F5-d925ed73-8231-4d02-9545-db4e101f88f8\"}}",
+"policyConfigType": "MicroService",
+"policyName": "${policy_name}",
+"ecompName": "DCAE"
+} \ No newline at end of file
diff --git a/tests/policy/suite1/configpolicy_vDNS_R1.template b/tests/policy/suite1/configpolicy_vDNS_R1.template
new file mode 100644
index 00000000..185a7c72
--- /dev/null
+++ b/tests/policy/suite1/configpolicy_vDNS_R1.template
@@ -0,0 +1,7 @@
+{
+ "configBody": "{ \"service\": \"tca_policy\", \"location\": \"SampleServiceLocation\", \"uuid\": \"test\", \"policyName\": \"MicroServicevDNS\", \"description\": \"MicroService vDNS Policy\", \"configName\": \"SampleConfigName\", \"templateVersion\": \"OpenSource.version.1\", \"version\": \"1.1.0\", \"priority\": \"1\", \"policyScope\": \"resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3\", \"riskType\": \"SampleRiskType\", \"riskLevel\": \"1\", \"guard\": \"False\", \"content\": { \"policyVersion\": \"v0.0.1\", \"threshholds\": [{ \"severity\": \"CRITICAL\", \"fieldPath\": \"$$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta\", \"thresholdValue\": \"300\", \"closedLoopEventStatus\": \"ONSET\", \"closedLoopControlName\": \"ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3\", \"version\": \"1.0.2\", \"direction\": \"GREATER_OR_EQUAL\" }], \"policyName\": \"DCAE.Config_tca-hi-lo\", \"controlLoopSchemaType\": \"VM\", \"policyScope\": \"DCAE\", \"eventName\": \"vLoadBalancer\" } }",
+ "policyConfigType": "MicroService",
+ "policyName": "${policy_name}",
+ "onapName": "DCAE",
+ "priority": "5"
+}
diff --git a/tests/policy/suite1/configpolicy_vFW.template b/tests/policy/suite1/configpolicy_vFW.template
new file mode 100644
index 00000000..39e99e7b
--- /dev/null
+++ b/tests/policy/suite1/configpolicy_vFW.template
@@ -0,0 +1,6 @@
+{
+"configBody": "{\"service\": \"policy_tosca_tca\",\"location\": \"Ravi\",\"uuid\": \"/services/cdap-tca-hi-lo/instances/dfw1/configuration/metricsPerFunctionalRole/vFireWall\",\"policyName\": \"vFireWall\",\"description\": \"vFireWall\",\"configName\": \"TestConfigName\",\"templateVersion\": \"1607\",\"version\": \"8.7.6.5\",\"priority\": \"1\",\"policyScope\": \"resource=TestResource,service=TestService,type=TestType,closedLoopControlName=TestClosedLoop\",\"riskType\": \"test\",\"riskLevel\": \"2\",\"guard\": \"False\",\"content\": {\"policyVersion\": \"v0.0.1\",\"threshholds\": [{\"severity\": \"MAJOR\",\"fieldPath\": \"$$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated\",\"thresholdValue\": \"4000\",\"closedLoopControlName\": \"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\",\"version\": \"1.0.2\",\"direction\": \"LESS_OR_EQUAL\"}, {\"severity\": \"CRITICAL\",\"fieldPath\": \"$$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated\",\"thresholdValue\": \"20000\",\"closedLoopControlName\": \"CL-FRWL-HIGH-TRAFFIC-SIG-EA36FE84-9342-5E13-A656-EC5F21309A09\",\"version\": \"1.0.2\",\"direction\": \"GREATER_OR_EQUAL\"}],\"policyName\": \"configuration.ae.microservice.tca.xml\",\"functionalRole\": \"ClosedLoop_F5-d925ed73-8231-4d02-9545-db4e101f88f8\"}}",
+"policyConfigType": "MicroService",
+"policyName": "${policy_name}",
+"ecompName": "DCAE"
+} \ No newline at end of file
diff --git a/tests/policy/suite1/configpolicy_vFW_R1.template b/tests/policy/suite1/configpolicy_vFW_R1.template
new file mode 100644
index 00000000..067ed07f
--- /dev/null
+++ b/tests/policy/suite1/configpolicy_vFW_R1.template
@@ -0,0 +1,7 @@
+{
+ "configBody": "{\"service\": \"tca_policy\",\"location\": \"SampleServiceLocation\",\"uuid\": \"test\",\"policyName\": \"MicroServicevFirewall\",\"description\": \"MicroService vFirewall Policy\",\"configName\": \"SampleConfigName\",\"templateVersion\": \"OpenSource.version.1\",\"version\": \"1.1.0\",\"priority\": \"1\",\"policyScope\": \"resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a\",\"riskType\": \"SampleRiskType\",\"riskLevel\": \"1\",\"guard\": \"False\",\"content\": {\"policyVersion\": \"v0.0.1\",\"threshholds\": [{\"severity\": \"MAJOR\",\"fieldPath\": \"$$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta\",\"thresholdValue\": \"300\",\"closedLoopEventStatus\": \"ONSET\",\"closedLoopControlName\": \"ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a\",\"version\": \"1.0.2\",\"direction\": \"LESS_OR_EQUAL\"}, {\"severity\": \"CRITICAL\",\"fieldPath\": \"$$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta\",\"thresholdValue\": \"700\",\"closedLoopEventStatus\": \"ONSET\",\"closedLoopControlName\": \"ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a\",\"version\": \"1.0.2\",\"direction\": \"GREATER_OR_EQUAL\"}],\"policyName\": \"DCAE.Config_tca-hi-lo\",\"controlLoopSchemaType\": \"VNF\",\"policyScope\": \"DCAE\",\"eventName\": \"vFirewallBroadcastPackets\"}}",
+ "policyConfigType": "MicroService",
+ "policyName": "${policy_name}",
+ "onapName": "DCAE",
+ "priority": "5"
+}
diff --git a/tests/policy/suite1/createpolicy.template b/tests/policy/suite1/createpolicy.template
new file mode 100644
index 00000000..7c693e84
--- /dev/null
+++ b/tests/policy/suite1/createpolicy.template
@@ -0,0 +1,21 @@
+{
+ "policyConfigType": "BRMS_PARAM",
+ "policyName": "${policy_name}",
+ "policyDescription": "Create BRMS Param policy",
+ "attributes": {
+ "RULE": {
+ "templateName": "ClosedLoopDemo_closedLoopControlName",
+ "aaiNamedQueryUUID": "2",
+ "aaiPassword": "2",
+ "aaiPatternMatch": "2",
+ "aaiURL": "2",
+ "actor": "2",
+ "appcTopic": "2",
+ "closedLoopControlName": "2",
+ "msoPassword": "2",
+ "msoURL": "2",
+ "msoUsername": "2",
+ "aaiUsername": "3"
+ }
+ }
+}
diff --git a/tests/policy/suite1/deletepolicy.template b/tests/policy/suite1/deletepolicy.template
new file mode 100644
index 00000000..55510102
--- /dev/null
+++ b/tests/policy/suite1/deletepolicy.template
@@ -0,0 +1,5 @@
+{
+ "pdpGroup": "default",
+ "policyComponent": "PDP",
+ "policyName": "${policy_name}"
+}
diff --git a/tests/policy/suite1/getconfigpolicy.template b/tests/policy/suite1/getconfigpolicy.template
new file mode 100644
index 00000000..611e65d0
--- /dev/null
+++ b/tests/policy/suite1/getconfigpolicy.template
@@ -0,0 +1,8 @@
+{
+ "configAttributes" : {
+ },
+ "configName" : ".*",
+ "ecompName" : "DCAE",
+ "policyName" : "${config_policy_name}",
+ "unique" : false
+} \ No newline at end of file
diff --git a/tests/policy/suite1/getoofpolicy.template b/tests/policy/suite1/getoofpolicy.template
new file mode 100644
index 00000000..37fe0471
--- /dev/null
+++ b/tests/policy/suite1/getoofpolicy.template
@@ -0,0 +1,6 @@
+{
+ "configAttributes" : {
+ },
+ "policyName" : "${oof_policy_name}",
+ "unique" : false
+}
diff --git a/tests/policy/suite1/global_properties.robot b/tests/policy/suite1/global_properties.robot
new file mode 100644
index 00000000..60826bbc
--- /dev/null
+++ b/tests/policy/suite1/global_properties.robot
@@ -0,0 +1,30 @@
+*** Settings ***
+Documentation store all properties that can change or are used in multiple places here
+... format is all caps with underscores between words and prepended with GLOBAL
+... make sure you prepend them with GLOBAL so that other files can easily see it is from this file.
+
+
+*** Variables ***
+${GLOBAL_APPLICATION_ID} robot-ete
+${GLOBAL_MSO_STATUS_PATH} /ecomp/mso/infra/orchestrationRequests/v2/
+${GLOBAL_SELENIUM_BROWSER} chrome
+${GLOBAL_SELENIUM_BROWSER_CAPABILITIES} Create Dictionary
+${GLOBAL_SELENIUM_DELAY} 0
+${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT} 5
+${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT} 15
+${GLOBAL_OPENSTACK_HEAT_SERVICE_TYPE} orchestration
+${GLOBAL_OPENSTACK_CINDER_SERVICE_TYPE} volume
+${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} compute
+${GLOBAL_OPENSTACK_NEUTRON_SERVICE_TYPE} network
+${GLOBAL_OPENSTACK_GLANCE_SERVICE_TYPE} image
+${GLOBAL_OPENSTACK_KEYSTONE_SERVICE_TYPE} identity
+${GLOBAL_AAI_CLOUD_OWNER} Rackspace
+${GLOBAL_BUILD_NUMBER} 31
+${GLOBAL_VM_PRIVATE_KEY} ${EXECDIR}/robot/assets/keys/robot_ssh_private_key.pvt
+# policy info - everything is from the private oam network (also called ecomp private network)
+${GLOBAL_POLICY_SERVER_URL} https://%{PDP_IP}:8081
+${GLOBAL_POLICY_AUTH} dGVzdHBkcDphbHBoYTEyMw==
+${GLOBAL_POLICY_CLIENTAUTH} cHl0aG9uOnRlc3Q=
+${GLOBAL_POLICY_HEALTHCHECK_URL} https://%{POLICY_IP}:6969
+${GLOBAL_POLICY_USERNAME} healthcheck
+${GLOBAL_POLICY_PASSWORD} zb!XztG34
diff --git a/tests/policy/suite1/json_templater.robot b/tests/policy/suite1/json_templater.robot
new file mode 100644
index 00000000..a1cc7e35
--- /dev/null
+++ b/tests/policy/suite1/json_templater.robot
@@ -0,0 +1,21 @@
+*** Settings ***
+Documentation This resource is filling out json string templates and returning the json back
+Library RequestsLibrary
+Library eteutils/StringTemplater.py
+Library OperatingSystem
+Resource global_properties.robot
+
+*** Keywords ***
+Fill JSON Template
+ [Documentation] Runs substitution on template to return a filled in json
+ [Arguments] ${json} ${arguments}
+ ${returned_string}= Template String ${json} ${arguments}
+ ${returned_json}= To Json ${returned_string}
+ [Return] ${returned_json}
+
+Fill JSON Template File
+ [Documentation] Runs substitution on template to return a filled in json
+ [Arguments] ${json_file} ${arguments}
+ ${json}= OperatingSystem.Get File ${json_file}
+ ${returned_json}= Fill JSON Template ${json} ${arguments}
+ [Return] ${returned_json} \ No newline at end of file
diff --git a/tests/policy/suite1/oofpolicy_HPA_R1.template b/tests/policy/suite1/oofpolicy_HPA_R1.template
new file mode 100644
index 00000000..3a170b20
--- /dev/null
+++ b/tests/policy/suite1/oofpolicy_HPA_R1.template
@@ -0,0 +1,6 @@
+{
+ "configBody": "{\"service\":\"hpaPolicy\",\"policyName\":\"testWorkingTOSCA\",\"description\":\"testing\",\"templateVersion\":\"OpenSource.version.1\",\"version\":\"CSIT\",\"priority\":\"5\",\"riskType\":\"SampleRiskType\",\"riskLevel\":\"3\",\"guard\":\"False\",\"content\":{\"identity\":\"testIdentity\",\"policyScope\":[\"test1\",\"test2\",\"test3\"],\"policyType\":\"hpaPolicy\",\"resources\":\"testResources1\",\"flavorFeatures\":[{\"flavorLabel\":\"testFlavor\",\"flavorProperties\":[{\"score\":\"testScore\",\"featureAttributes\":[{\"unit\":\"testUnit\",\"attribute\":\"teatFeatureAttribute\",\"value\":\"testValue\",\"operator\":\"any\"}],\"mandatory\":\"testMandatory\",\"hpaFeature\":\"testHAPFeature\",\"architecture\":\"testArch\"}]}]}}",
+ "policyConfigType": "Optimization",
+ "policyName": "${policy_name}",
+ "onapName": "OOF"
+}
diff --git a/tests/policy/suite1/opspolicy_VDNS.template b/tests/policy/suite1/opspolicy_VDNS.template
new file mode 100644
index 00000000..801773d5
--- /dev/null
+++ b/tests/policy/suite1/opspolicy_VDNS.template
@@ -0,0 +1,26 @@
+{
+ "policyConfigType": "BRMS_PARAM",
+ "policyName": "${policy_name}",
+ "policyDescription": "Create BRMS Param policy for vLB",
+ "attributes": {
+ "MATCHING": {
+ "controller": "vDNS"
+ },
+ "RULE": {
+ "templateName": "ControlLoopDemo__closedLoopControlName",
+ "closedLoopControlName": "CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8",
+ "policyVersion": "v1.0",
+ "actor": "MSO",
+ "aaiNamedQueryUUID": "4ff56a54-9e3f-46b7-a337-07a1d3c6b469",
+ "aaiURL": "https://aai.api.simpledemo.openecomp.org:8443/aai/search/named-query",
+ "aaiUsername": "POLICY",
+ "aaiPassword": "POLICY",
+ "msoURL": "http://vm1.mso.simpledemo.openecomp.org:8080/ecomp/mso/infra",
+ "msoUsername": "InfraPortalClient",
+ "msoPassword": "password11",
+ "aaiPatternMatch": 0,
+ "notificationTopic": "POLICY-CL-MGT",
+ "appcTopic": "APPC-CL"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/policy/suite1/opspolicy_VDNS_R1.template b/tests/policy/suite1/opspolicy_VDNS_R1.template
new file mode 100644
index 00000000..92627cc2
--- /dev/null
+++ b/tests/policy/suite1/opspolicy_VDNS_R1.template
@@ -0,0 +1,16 @@
+{
+ "policyConfigType": "BRMS_PARAM",
+ "policyName": "${policy_name}",
+ "policyDescription": "BRMS Param vDNS policy",
+ "policyScope": "com",
+ "attributes": {
+ "MATCHING": {
+ "controller" : "amsterdam"
+ },
+ "RULE": {
+ "templateName": "ClosedLoopControlName",
+ "closedLoopControlName": "ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3",
+ "controlLoopYaml": "controlLoop%3A%0D%0A++version%3A+2.0.0%0D%0A++controlLoopName%3A+ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3%0D%0A++trigger_policy%3A+unique-policy-id-1-scale-up%0D%0A++timeout%3A+1200%0D%0A++abatement%3A+false%0D%0Apolicies%3A%0D%0A++-+id%3A+unique-policy-id-1-scale-up%0D%0A++++name%3A+Create+a+new+VF+Module%0D%0A++++description%3A%0D%0A++++actor%3A+SO%0D%0A++++recipe%3A+VF+Module+Create%0D%0A++++target%3A%0D%0A++++++type%3A+VNF%0D%0A++++retry%3A+0%0D%0A++++timeout%3A+1200%0D%0A++++success%3A+final_success%0D%0A++++failure%3A+final_failure%0D%0A++++failure_timeout%3A+final_failure_timeout%0D%0A++++failure_retries%3A+final_failure_retries%0D%0A++++failure_exception%3A+final_failure_exception%0D%0A++++failure_guard%3A+final_failure_guard"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/policy/suite1/opspolicy_VFW.template b/tests/policy/suite1/opspolicy_VFW.template
new file mode 100644
index 00000000..224f5cf4
--- /dev/null
+++ b/tests/policy/suite1/opspolicy_VFW.template
@@ -0,0 +1,24 @@
+{
+ "policyConfigType": "BRMS_PARAM",
+ "policyName": "${policy_name}",
+ "policyDescription": "Create BRMS Param policy for vFW",
+ "attributes": {
+ "RULE": {
+ "templateName": "ControlLoopDemo__closedLoopControlName",
+ "closedLoopControlName": "ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a",
+ "policyVersion": "v1.0",
+ "aaiNamedQueryUUID": "null",
+ "aaiPassword": "null",
+ "aaiURL": "null",
+ "actor": "APPC",
+ "appcTopic": "APPC-CL",
+ "msoPassword": "null",
+ "msoURL": "null",
+ "msoUsername": "null",
+ "aaiUsername": "null",
+ "notificationTopic": "POLICY-CL-MGT",
+ "aaiPatternMatch": 1
+ }
+ }
+}
+
diff --git a/tests/policy/suite1/opspolicy_VFW_R1.template b/tests/policy/suite1/opspolicy_VFW_R1.template
new file mode 100644
index 00000000..a93063f7
--- /dev/null
+++ b/tests/policy/suite1/opspolicy_VFW_R1.template
@@ -0,0 +1,16 @@
+{
+ "policyConfigType": "BRMS_PARAM",
+ "policyName": "${policy_name}",
+ "policyDescription": "BRMS Param vFirewall policy",
+ "policyScope": "com",
+ "attributes": {
+ "MATCHING": {
+ "controller" : "amsterdam"
+ },
+ "RULE": {
+ "templateName": "ClosedLoopControlName",
+ "closedLoopControlName": "ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a",
+ "controlLoopYaml": "controlLoop%3A%0D%0A++version%3A+2.0.0%0D%0A++controlLoopName%3A+ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a%0D%0A++trigger_policy%3A+unique-policy-id-1-modifyConfig%0D%0A++timeout%3A+1200%0D%0A++abatement%3A+false%0D%0A+%0D%0Apolicies%3A%0D%0A++-+id%3A+unique-policy-id-1-modifyConfig%0D%0A++++name%3A+modify+packet+gen+config%0D%0A++++description%3A%0D%0A++++actor%3A+APPC%0D%0A++++recipe%3A+ModifyConfig%0D%0A++++target%3A%0D%0A++++++%23+TBD+-+Cannot+be+known+until+instantiation+is+done%0D%0A++++++resourceID%3A+Eace933104d443b496b8.nodes.heat.vpg%0D%0A++++++type%3A+VNF%0D%0A++++retry%3A+0%0D%0A++++timeout%3A+300%0D%0A++++success%3A+final_success%0D%0A++++failure%3A+final_failure%0D%0A++++failure_timeout%3A+final_failure_timeout%0D%0A++++failure_retries%3A+final_failure_retries%0D%0A++++failure_exception%3A+final_failure_exception%0D%0A++++failure_guard%3A+final_failure_guard"
+ }
+ }
+}
diff --git a/tests/policy/suite1/opspolicy_vCPE.template b/tests/policy/suite1/opspolicy_vCPE.template
new file mode 100644
index 00000000..c17a1bc6
--- /dev/null
+++ b/tests/policy/suite1/opspolicy_vCPE.template
@@ -0,0 +1,16 @@
+{
+ "policyConfigType": "BRMS_PARAM",
+ "policyName": "${policy_name}",
+ "policyDescription": "BRMS Param vCPE policy",
+ "policyScope": "com",
+ "attributes": {
+ "MATCHING": {
+ "controller" : "amsterdam"
+ },
+ "RULE": {
+ "templateName": "ClosedLoopControlName",
+ "closedLoopControlName": "ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e",
+ "controlLoopYaml": "controlLoop%3A%0D%0A++version%3A+2.0.0%0D%0A++controlLoopName%3A+ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e%0D%0A++trigger_policy%3A+unique-policy-id-1-restart%0D%0A++timeout%3A+3600%0D%0A+%0D%0Apolicies%3A%0D%0A++-+id%3A+unique-policy-id-1-restart%0D%0A++++name%3A+Restart+the+VM%0D%0A++++description%3A%0D%0A++++actor%3A+APPC%0D%0A++++recipe%3A+Restart%0D%0A++++target%3A%0D%0A++++++type%3A+VM%0D%0A++++retry%3A+3%0D%0A++++timeout%3A+1200%0D%0A++++success%3A+final_success%0D%0A++++failure%3A+final_failure%0D%0A++++failure_timeout%3A+final_failure_timeout%0D%0A++++failure_retries%3A+final_failure_retries%0D%0A++++failure_exception%3A+final_failure_exception%0D%0A++++failure_guard%3A+final_failure_guard"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/policy/suite1/opspolicy_vCPE_R1.template b/tests/policy/suite1/opspolicy_vCPE_R1.template
new file mode 100644
index 00000000..36695daa
--- /dev/null
+++ b/tests/policy/suite1/opspolicy_vCPE_R1.template
@@ -0,0 +1,16 @@
+{
+ "policyConfigType": "BRMS_PARAM",
+ "policyName": "${policy_name}",
+ "policyDescription": "BRMS Param vCPE policy",
+ "policyScope": "com",
+ "attributes": {
+ "MATCHING": {
+ "controller" : "amsterdam"
+ },
+ "RULE": {
+ "templateName": "ClosedLoopControlName",
+ "closedLoopControlName": "ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e",
+ "controlLoopYaml": "controlLoop%3A%0D%0A++version%3A+2.0.0%0D%0A++controlLoopName%3A+ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e%0D%0A++trigger_policy%3A+unique-policy-id-1-restart%0D%0A++timeout%3A+3600%0D%0A++abatement%3A+true%0D%0A+%0D%0Apolicies%3A%0D%0A++-+id%3A+unique-policy-id-1-restart%0D%0A++++name%3A+Restart+the+VM%0D%0A++++description%3A%0D%0A++++actor%3A+APPC%0D%0A++++recipe%3A+Restart%0D%0A++++target%3A%0D%0A++++++type%3A+VM%0D%0A++++retry%3A+3%0D%0A++++timeout%3A+1200%0D%0A++++success%3A+final_success%0D%0A++++failure%3A+final_failure%0D%0A++++failure_timeout%3A+final_failure_timeout%0D%0A++++failure_retries%3A+final_failure_retries%0D%0A++++failure_exception%3A+final_failure_exception%0D%0A++++failure_guard%3A+final_failure_guard"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/policy/suite1/opspolicy_vOLTE.template b/tests/policy/suite1/opspolicy_vOLTE.template
new file mode 100644
index 00000000..e43a3e6f
--- /dev/null
+++ b/tests/policy/suite1/opspolicy_vOLTE.template
@@ -0,0 +1,16 @@
+{
+ "policyConfigType": "BRMS_PARAM",
+ "policyName": "${policy_name}",
+ "policyDescription": "BRMS Param VOLTE policy",
+ "policyScope": "com",
+ "attributes": {
+ "MATCHING": {
+ "controller" : "amsterdam"
+ },
+ "RULE": {
+ "templateName": "ClosedLoopControlName",
+ "closedLoopControlName": "ControlLoop-VOLTE-2179b738-fd36-4843-a71a-a8c24c70c55b",
+ "controlLoopYaml": "controlLoop%3A%0D%0A++version%3A+2.0.0%0D%0A++controlLoopName%3A+ControlLoop-VOLTE-2179b738-fd36-4843-a71a-a8c24c70c55b%0D%0A++trigger_policy%3A+unique-policy-id-1-restart%0D%0A++timeout%3A+3600%0D%0A+%0D%0Apolicies%3A%0D%0A++-+id%3A+unique-policy-id-1-restart%0D%0A++++name%3A+Restart+the+VM%0D%0A++++description%3A%0D%0A++++actor%3A+VFC%0D%0A++++recipe%3A+Restart%0D%0A++++target%3A%0D%0A++++++type%3A+VM%0D%0A++++retry%3A+3%0D%0A++++timeout%3A+1200%0D%0A++++success%3A+final_success%0D%0A++++failure%3A+final_failure%0D%0A++++failure_timeout%3A+final_failure_timeout%0D%0A++++failure_retries%3A+final_failure_retries%0D%0A++++failure_exception%3A+final_failure_exception%0D%0A++++failure_guard%3A+final_failure_guard"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/policy/suite1/opspolicy_vOLTE_R1.template b/tests/policy/suite1/opspolicy_vOLTE_R1.template
new file mode 100644
index 00000000..ff5fc42c
--- /dev/null
+++ b/tests/policy/suite1/opspolicy_vOLTE_R1.template
@@ -0,0 +1,16 @@
+{
+ "policyConfigType": "BRMS_PARAM",
+ "policyName": "${policy_name}",
+ "policyDescription": "BRMS Param VOLTE policy",
+ "policyScope": "com",
+ "attributes": {
+ "MATCHING": {
+ "controller" : "amsterdam"
+ },
+ "RULE": {
+ "templateName": "ClosedLoopControlName",
+ "closedLoopControlName": "ControlLoop-VOLTE-2179b738-fd36-4843-a71a-a8c24c70c55b",
+ "controlLoopYaml": "controlLoop%3A%0D%0A++version%3A+2.0.0%0D%0A++controlLoopName%3A+ControlLoop-VOLTE-2179b738-fd36-4843-a71a-a8c24c70c55b%0D%0A++trigger_policy%3A+unique-policy-id-1-restart%0D%0A++timeout%3A+3600%0D%0A++abatement%3A+false%0D%0A+%0D%0Apolicies%3A%0D%0A++-+id%3A+unique-policy-id-1-restart%0D%0A++++name%3A+Restart+the+VM%0D%0A++++description%3A%0D%0A++++actor%3A+VFC%0D%0A++++recipe%3A+Restart%0D%0A++++target%3A%0D%0A++++++type%3A+VM%0D%0A++++retry%3A+3%0D%0A++++timeout%3A+1200%0D%0A++++success%3A+final_success%0D%0A++++failure%3A+final_failure%0D%0A++++failure_timeout%3A+final_failure_timeout%0D%0A++++failure_retries%3A+final_failure_retries%0D%0A++++failure_exception%3A+final_failure_exception%0D%0A++++failure_guard%3A+final_failure_guard"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/policy/suite1/policy_interface.robot b/tests/policy/suite1/policy_interface.robot
new file mode 100644
index 00000000..79178708
--- /dev/null
+++ b/tests/policy/suite1/policy_interface.robot
@@ -0,0 +1,60 @@
+*** Settings ***
+Documentation The main interface for interacting with Policy. It handles low level stuff like managing the http request library and Policy required fields
+Library eteutils/RequestsClientCert.py
+#Library RequestsClientCert
+Library RequestsLibrary
+Library String
+Library eteutils/JSONUtils.py
+#Library JSONUtils
+Library Collections
+Resource global_properties.robot
+
+*** Variables ***
+${POLICY_HEALTH_CHECK_PATH} /healthcheck
+
+*** Keywords ***
+
+Run Policy Health Check
+ [Documentation] Runs Policy Health check
+ ${auth}= Create List ${GLOBAL_POLICY_USERNAME} ${GLOBAL_POLICY_PASSWORD}
+ Log Creating session ${GLOBAL_POLICY_SERVER_URL}
+ ${session}= Create Session policy ${GLOBAL_POLICY_HEALTHCHECK_URL} auth=${auth}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ ${resp}= Get Request policy ${POLICY_HEALTH_CHECK_PATH} headers=${headers}
+ Log Received response from policy ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Be True ${resp.json()['healthy']}
+ @{ITEMS}= Copy List ${resp.json()['details']}
+ :FOR ${ELEMENT} IN @{ITEMS}
+ \ Should Be Equal As Strings ${ELEMENT['code']} 200
+ \ Should Be True ${ELEMENT['healthy']}
+
+Run Policy Put Request
+ [Documentation] Runs Policy Put request
+ [Arguments] ${data_path} ${data}
+ Log Creating session ${GLOBAL_POLICY_SERVER_URL}
+ ${session}= Create Session policy ${GLOBAL_POLICY_SERVER_URL}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json Authorization=Basic ${GLOBAL_POLICY_AUTH} ClientAuth=${GLOBAL_POLICY_CLIENTAUTH} Environment=TEST
+ ${resp}= Put Request policy ${data_path} data=${data} headers=${headers}
+ Log Received response from policy ${resp.text}
+ [Return] ${resp}
+
+Run Policy Delete Request
+ [Documentation] Runs Policy Delete request
+ [Arguments] ${data_path} ${data}
+ Log Creating session ${GLOBAL_POLICY_SERVER_URL}
+ ${session}= Create Session policy ${GLOBAL_POLICY_SERVER_URL}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json Authorization=Basic ${GLOBAL_POLICY_AUTH} ClientAuth=${GLOBAL_POLICY_CLIENTAUTH} Environment=TEST
+ ${resp}= Delete Request policy ${data_path} data=${data} headers=${headers}
+ Log Received response from policy ${resp.text}
+ [Return] ${resp}
+
+Run Policy Get Configs Request
+ [Documentation] Runs Policy Get Configs request
+ [Arguments] ${data_path} ${data}
+ Log Creating session ${GLOBAL_POLICY_SERVER_URL}
+ ${session}= Create Session policy ${GLOBAL_POLICY_SERVER_URL}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json Authorization=Basic ${GLOBAL_POLICY_AUTH} ClientAuth=${GLOBAL_POLICY_CLIENTAUTH}
+ ${resp}= Post Request policy ${data_path} data=${data} headers=${headers}
+ Log Received response from policy ${resp.text}
+ [Return] ${resp} \ No newline at end of file
diff --git a/tests/policy/suite1/pushpolicy.template b/tests/policy/suite1/pushpolicy.template
new file mode 100644
index 00000000..7e236e3d
--- /dev/null
+++ b/tests/policy/suite1/pushpolicy.template
@@ -0,0 +1,5 @@
+{
+ "policyName":"${policy_name}",
+ "policyType":"${policy_type}",
+ "pdpGroup":"default"
+} \ No newline at end of file
diff --git a/tests/policy/suite1/sdncnamingpolicy_vFW.template b/tests/policy/suite1/sdncnamingpolicy_vFW.template
new file mode 100644
index 00000000..d9c773d1
--- /dev/null
+++ b/tests/policy/suite1/sdncnamingpolicy_vFW.template
@@ -0,0 +1,11 @@
+{
+ "configBody": "{\"service\":\"SDNC-GenerateName\",\"version\":\"CSIT\",\"content\":{\"policy-instance-name\":\"ONAP_VFW_NAMING_TIMESTAMP\",\"naming-models\":[{\"naming-properties\":[{\"property-name\":\"AIC_CLOUD_REGION\"},{\"property-name\":\"nfRole\"},{\"property-name\":\"TIMESTAMP\"},{\"property-value\":\"_\",\"property-name\":\"DELIMITER\"}],\"naming-type\":\"VNF\",\"nfRole\":\"vFW\",\"naming-recipe\":\"AIC_CLOUD_REGION|DELIMITER|nfRole|DELIMITER|TIMESTAMP\"},{\"naming-properties\":[{\"property-name\":\"VNF_NAME\"},{\"property-name\":\"SEQUENCE\",\"increment-sequence\":{\"max\":\"zzz\",\"scope\":\"ENTIRETY\",\"start-value\":\"001\",\"length\":\"3\",\"increment\":\"1\",\"sequence-type\":\"alpha-numeric\"}},{\"property-name\":\"NFC_NAMING_CODE\"},{\"property-value\":\"_\",\"property-name\":\"DELIMITER\"}],\"naming-type\":\"VNFC\",\"nfRole\":\"vFW\",\"naming-recipe\":\"VNF_NAME|DELIMITER|NFC_NAMING_CODE|DELIMITER|SEQUENCE\"},{\"naming-properties\":[{\"property-name\":\"VNF_NAME\"},{\"property-value\":\"_\",\"property-name\":\"DELIMITER\"},{\"property-name\":\"VF_MODULE_LABEL\"},{\"property-name\":\"VF_MODULE_TYPE\"},{\"property-name\":\"SEQUENCE\",\"increment-sequence\":{\"max\":\"zzz\",\"scope\":\"PRECEEDING\",\"start-value\":\"01\",\"length\":\"3\",\"increment\":\"1\",\"sequence-type\":\"alpha-numeric\"}}],\"naming-type\":\"VF-MODULE\",\"nfRole\":\"vFW\",\"naming-recipe\":\"VNF_NAME|DELIMITER|VF_MODULE_LABEL|DELIMITER|VF_MODULE_TYPE|DELIMITER|SEQUENCE\"},{\"naming-properties\":[{\"property-name\":\"VNF_NAME\"}],\"naming-type\":\"KEY\",\"nfRole\":\"vFW\",\"naming-recipe\":\"VNF_NAME\"},{\"naming-properties\":[{\"property-name\":\"VNF_NAME\"},{\"property-value\":\"protected\",\"property-name\":\"CONSTANT\"},{\"property-value\":\"_\",\"property-name\":\"DELIMITER\"}],\"naming-type\":\"protected_private_net_id\",\"nfRole\":\"vFW\",\"naming-recipe\":\"VNF_NAME|DELIMITER|CONSTANT\"},{\"naming-properties\":[{\"property-name\":\"VNF_NAME\"},{\"property-value\":\"unprotected\",\"property-name\":\"CONSTANT\"},{\"property-value\":\"_\",\"property-name\":\"DELIMITER\"}],\"naming-type\":\"unprotected_private_net_id\",\"nfRole\":\"vFW\",\"naming-recipe\":\"VNF_NAME|DELIMITER|CONSTANT\"}]}}",
+ "policyName": "${policy_name}",
+ "policyConfigType": "MicroService",
+ "onapName": "SDNC",
+ "riskLevel": "4",
+ "riskType": "test",
+ "guard": "false",
+ "priority": "4",
+ "description": "ONAP_VFW_NAMING_TIMESTAMP"
+} \ No newline at end of file
diff --git a/tests/policy/suite1/sdncnamingpolicy_vPG.template b/tests/policy/suite1/sdncnamingpolicy_vPG.template
new file mode 100644
index 00000000..9bae20a1
--- /dev/null
+++ b/tests/policy/suite1/sdncnamingpolicy_vPG.template
@@ -0,0 +1,11 @@
+{
+ "configBody": "{\"service\":\"SDNC-GenerateName\",\"version\":\"CSIT\",\"content\":{\"policy-instance-name\":\"ONAP_VPG_NAMING_TIMESTAMP\",\"naming-models\":[{\"naming-properties\":[{\"property-name\":\"AIC_CLOUD_REGION\"},{\"property-name\":\"nfRole\"},{\"property-name\":\"TIMESTAMP\"},{\"property-value\":\"_\",\"property-name\":\"DELIMITER\"}],\"naming-type\":\"VNF\",\"nfRole\":\"vPG\",\"naming-recipe\":\"AIC_CLOUD_REGION|DELIMITER|nfRole|DELIMITER|TIMESTAMP\"},{\"naming-properties\":[{\"property-name\":\"VNF_NAME\"},{\"property-name\":\"SEQUENCE\",\"increment-sequence\":{\"max\":\"zzz\",\"scope\":\"ENTIRETY\",\"start-value\":\"001\",\"length\":\"3\",\"increment\":\"1\",\"sequence-type\":\"alpha-numeric\"}},{\"property-name\":\"NFC_NAMING_CODE\"},{\"property-value\":\"_\",\"property-name\":\"DELIMITER\"}],\"naming-type\":\"VNFC\",\"nfRole\":\"vPG\",\"naming-recipe\":\"VNF_NAME|DELIMITER|NFC_NAMING_CODE|DELIMITER|SEQUENCE\"},{\"naming-properties\":[{\"property-name\":\"VNF_NAME\"},{\"property-value\":\"_\",\"property-name\":\"DELIMITER\"},{\"property-name\":\"VF_MODULE_LABEL\"},{\"property-name\":\"VF_MODULE_TYPE\"},{\"property-name\":\"SEQUENCE\",\"increment-sequence\":{\"max\":\"zzz\",\"scope\":\"PRECEEDING\",\"start-value\":\"01\",\"length\":\"3\",\"increment\":\"1\",\"sequence-type\":\"alpha-numeric\"}}],\"naming-type\":\"VF-MODULE\",\"nfRole\":\"vPG\",\"naming-recipe\":\"VNF_NAME|DELIMITER|VF_MODULE_LABEL|DELIMITER|VF_MODULE_TYPE|DELIMITER|SEQUENCE\"},{\"naming-properties\":[{\"property-name\":\"VNF_NAME\"}],\"naming-type\":\"KEY\",\"nfRole\":\"vPG\",\"naming-recipe\":\"VNF_NAME\"},{\"naming-properties\":[{\"property-name\":\"VNF_NAME\"},{\"property-value\":\"protected\",\"property-name\":\"CONSTANT\"},{\"property-value\":\"_\",\"property-name\":\"DELIMITER\"}],\"naming-type\":\"protected_private_net_id\",\"nfRole\":\"vPG\",\"naming-recipe\":\"VNF_NAME|DELIMITER|CONSTANT\"},{\"naming-properties\":[{\"property-name\":\"VNF_NAME\"},{\"property-value\":\"unprotected\",\"property-name\":\"CONSTANT\"},{\"property-value\":\"_\",\"property-name\":\"DELIMITER\"}],\"naming-type\":\"unprotected_private_net_id\",\"nfRole\":\"vPG\",\"naming-recipe\":\"VNF_NAME|DELIMITER|CONSTANT\"}]}}", "policyName": "${policy_name}",
+ "policyName": "${policy_name}",
+ "policyConfigType": "MicroService",
+ "onapName": "SDNC",
+ "riskLevel": "4",
+ "riskType": "test",
+ "guard": "false",
+ "priority": "4",
+ "description": "ONAP_VPG_NAMING_TIMESTAMP"
+} \ No newline at end of file
diff --git a/tests/portal-sdk/testsuites/__init__.robot b/tests/portal-sdk/testsuites/__init__.robot
new file mode 100644
index 00000000..b1df467c
--- /dev/null
+++ b/tests/portal-sdk/testsuites/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Portal-SDK - Testcases
diff --git a/tests/portal-sdk/testsuites/test1.robot b/tests/portal-sdk/testsuites/test1.robot
new file mode 100644
index 00000000..84436e3d
--- /dev/null
+++ b/tests/portal-sdk/testsuites/test1.robot
@@ -0,0 +1,140 @@
+*** Settings ***
+Documentation This is RobotFrame work script
+Library ExtendedSelenium2Library
+Library OperatingSystem
+Library XvfbRobot
+
+
+*** Variables ***
+${PORTAL_URL} http://portal.api.simpledemo.onap.org:8990
+${PORTAL_ENV} /ONAPPORTALSDK
+${PORTAL_LOGIN_URL} ${PORTAL_URL}${PORTAL_ENV}/login.htm
+${PORTAL_HOME_PAGE} ${PORTAL_URL}${PORTAL_ENV}/welcome
+${PORTAL_MICRO_ENDPOINT} ${PORTAL_URL}${PORTAL_ENV}/commonWidgets
+${PORTAL_HOME_URL} ${PORTAL_URL}${PORTAL_ENV}/applicationsHome
+${GLOBAL_APPLICATION_ID} robot-functional
+${GLOBAL_PORTAL_ADMIN_USER} demo
+${GLOBAL_PORTAL_ADMIN_PWD} demo
+${GLOBAL_SELENIUM_BROWSER} chrome
+${GLOBAL_SELENIUM_BROWSER_CAPABILITIES} Create Dictionary
+${GLOBAL_SELENIUM_DELAY} 0
+${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT} 5
+${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT} 15
+${GLOBAL_BUILD_NUMBER} 0
+${GLOBAL_VM_PRIVATE_KEY} ${EXECDIR}/robot/assets/keys/robot_ssh_private_key.pvt
+
+
+*** Test Cases ***
+
+#Portal admin Login To Portal GUI
+# [Documentation] Logs into Portal GUI
+## Setup Browser
+# Start Virtual Display 1920 1080
+# Open Browser ${PORTAL_LOGIN_URL} chrome
+## Go To ${PORTAL_LOGIN_URL}
+# Maximize Browser Window
+# Set Selenium Speed ${GLOBAL_SELENIUM_DELAY}
+# Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+# Log Logging in to ${PORTAL_URL}${PORTAL_ENV}
+# # Handle Proxy Warning
+# Title Should Be Login
+# Input Text xpath=//input[@id='loginId'] ${GLOBAL_PORTAL_ADMIN_USER}
+# Input Password xpath=//input[@id='password'] ${GLOBAL_PORTAL_ADMIN_PWD}
+# Click Element //*[@id="loginBtn"]
+# Wait Until Page Contains Element xpath=//img[@src='app/fusionapp/icons/logo_onap_transbg.png'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+# Log Logged in to ${PORTAL_URL}${PORTAL_ENV}
+
+SDKPortalAdmin Navigation Application Link Tab
+ [Documentation] Logs into Portal GUI as Portal admin
+ Comment Click Element xpath=.//h3[contains(text(),'xDemo App')]/following::div[1]
+ Comment Go To ${PORTAL_HOME_PAGE}
+ Comment Dismiss Alert accept=false
+ #Scroll Element Into View xpath=//span[@id='tab-Home']
+ #Click Element xpath=//span[@id='tab-Home']
+ #Click Element xpath=(//span[@id='tab-xDemo-App']/following::i[@class='ion-close-round'])[1]
+ Comment Click Element xpath=.//h3[contains(text(),'xDemo App')]/following::div[1]
+
+#Validate SDK Sub Menu
+# [Documentation] Logs into SDK GUI as Portal admin
+# Page Should Contain Home
+# Page Should Contain Sample Pages
+# Page Should Contain Reports
+# Page Should Contain Profile
+# Page Should Contain Admin
+
+##Click Sample Pages and validate sub Menu
+# #[Documentation] Click Sample Pages
+# #Comment Select frame xpath=.//*[@id='tabframe-xDemo-App']
+# #Click Link xpath=//a[@id='parent-item-Sample-Pages']
+# #Element Text Should Be xpath=//a[@title='Collaboration'] Collaboration
+# #Element Text Should Be xpath=//a[@title='Notebook'] Notebook
+# #Click Link xpath=//a[contains(@title,'Collaboration')]
+# #Page Should Contain User List
+# #Comment Select frame xpath=.//*[@id='tabframe-xDemo-App']
+# #Click Link xpath=//a[@id='parent-item-Sample-Pages']
+# #Click Link xpath=//a[contains(@title,'Notebook')]
+# #Element Text Should Be xpath=//h1[contains(.,'Notebook')] Notebook
+
+#Click Reports and validate sub Menu
+# [Documentation] Click Reports Tab
+# #Select frame xpath=.//*[@id='tabframe-xDemo-App']
+# Click Link xpath=//a[@id='parent-item-Reports']
+# Element Text Should Be xpath=//a[@title='All Reports'] All Reports
+# Element Text Should Be xpath=//a[@title='Create Reports'] Create Reports
+# Click Link xpath=//a[contains(@title,'All Reports')]
+# Page Should Contain Report search
+# Comment Select frame xpath=.//*[@id='tabframe-xDemo-App']
+# Click Link xpath=//a[@id='parent-item-Reports']
+# Click Link xpath=//a[contains(@title,'Create Reports')]
+# Page Should Contain Report Wizard
+
+#Click Profile and validate sub Menu
+# [Documentation] Click Profile Tab
+# Comment Select frame xpath=.//*[@id='tabframe-xDemo-App']
+# Click Link xpath=//a[@id='parent-item-Profile']
+# Element Text Should Be xpath=//a[@title='Search'] Search
+# Element Text Should Be xpath=//a[@title='Self'] Self
+# Click Link xpath=//a[contains(@title,'Search')]
+# Page Should Contain Profile Search
+# Comment Select frame xpath=.//*[@id='tabframe-xDemo-App']
+# Click Link xpath=//a[@id='parent-item-Profile']
+# Click Link xpath=//a[contains(@title,'Self')]
+# Page Should Contain Self Profile Detail
+
+#Click Admin and validate sub Menu
+# [Documentation] Click Admin Tab
+# Comment Select frame xpath=.//*[@id='tabframe-xDemo-App']
+# Click Link xpath=//a[@id='parent-item-Admin']
+# Element Text Should Be xpath=//a[@title='Roles'] Roles
+# Element Text Should Be xpath=//a[@title='Role Functions'] Role Functions
+# Element Text Should Be xpath=//a[@title='Cache Admin'] Cache Admin
+# Element Text Should Be xpath=//a[@title='Menus'] Menus
+# Element Text Should Be xpath=//a[@title='Usage'] Usage
+# Click Link xpath=//a[contains(@title,'Roles')]
+# Page Should Contain Roles
+# Comment Select frame xpath=.//*[@id='tabframe-xDemo-App']
+# Click Link xpath=//a[@id='parent-item-Admin']
+# Click Link xpath=//a[contains(@title,'Role Function')]
+# Page Should Contain Role Function
+# Comment Select frame xpath=.//*[@id='tabframe-xDemo-App']
+# Click Link xpath=.//a[@id='parent-item-Admin']
+# #Select frame xpath=.//*[@id='tabframe-xDemo-App']
+# Click Link xpath=//a[@id='parent-item-Admin']
+# Click Link xpath=//a[contains(@title,'Cache Admin')]
+# Page Should Contain Cache Regions
+# Comment Select frame xpath=.//*[@id='tabframe-xDemo-App']
+# Click Link xpath=.//a[@id='parent-item-Admin']
+# Click Link xpath=//a[@id='parent-item-Admin']
+# Click Link xpath=//a[contains(@title,'Menus')]
+# Page Should Contain Admin Menu Items
+# Comment Select frame xpath=.//*[@id='tabframe-xDemo-App']
+# Click Link xpath=//a[@id='parent-item-Admin']
+# Click Link xpath=//a[@id='parent-item-Admin']
+# Click Link xpath=//a[contains(@title,'Usage')]
+# Page Should Contain Current Usage
+
+Teardown
+ [Documentation] Close All Open browsers
+ Close All Browsers
+
+*** Keywords ***
diff --git a/tests/portal/testsuites/__init__.robot b/tests/portal/testsuites/__init__.robot
new file mode 100644
index 00000000..885710c9
--- /dev/null
+++ b/tests/portal/testsuites/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Portal - Testcases
diff --git a/tests/portal/testsuites/browser_setup.robot b/tests/portal/testsuites/browser_setup.robot
new file mode 100644
index 00000000..6ef4f726
--- /dev/null
+++ b/tests/portal/testsuites/browser_setup.robot
@@ -0,0 +1,43 @@
+*** Settings ***
+Documentation The main interface for interacting with VID. It handles low level stuff like managing the selenium request library and VID required steps
+Library Collections
+Library OSUtils
+Library OperatingSystem
+Library ExtendedSelenium2Library
+Resource global_properties.robot
+
+*** Variables ***
+
+*** Keywords ***
+Setup Browser
+ [Documentation] Sets up browser based upon the value of ${GLOBAL_SELENIUM_BROWSER}
+ Run Keyword If '${GLOBAL_SELENIUM_BROWSER}' == 'firefox' Setup Browser Firefox
+ Run Keyword If '${GLOBAL_SELENIUM_BROWSER}' == 'chrome' Setup Browser Chrome
+ Log Running with ${GLOBAL_SELENIUM_BROWSER}
+
+Setup Browser Firefox
+ ${dc} Evaluate sys.modules['selenium.webdriver'].DesiredCapabilities.FIREFOX sys, selenium.webdriver
+ Set To Dictionary ${dc} elementScrollBehavior 1
+ Create Webdriver Firefox desired_capabilities=${dc}
+ Set Global Variable ${GLOBAL_SELENIUM_BROWSER_CAPABILITIES} ${dc}
+
+ Setup Browser Chrome
+ ${os}= Get Normalized Os
+ Log Normalized OS=${os}
+ ${chrome options}= Evaluate sys.modules['selenium.webdriver'].ChromeOptions() sys
+ Call Method ${chrome options} add_argument no-sandbox
+ ${dc} Evaluate sys.modules['selenium.webdriver'].DesiredCapabilities.CHROME sys, selenium.webdriver
+ Set To Dictionary ${dc} elementScrollBehavior 1
+ Create Webdriver Chrome chrome_options=${chrome_options} desired_capabilities=${dc}
+ Set Global Variable ${GLOBAL_SELENIUM_BROWSER_CAPABILITIES} ${dc}
+
+Handle Proxy Warning
+ [Documentation] Handle Intermediate Warnings from Proxies
+ ${status} ${data}= Run Keyword And Ignore Error Variable Should Exist \${GLOBAL_PROXY_WARNING_TITLE}
+ Return From Keyword if '${status}' != 'PASS'
+ ${status} ${data}= Run Keyword And Ignore Error Variable Should Exist \${GLOBAL_PROXY_WARNING_CONTINUE_XPATH}
+ Return From Keyword if '${status}' != 'PASS'
+ Return From Keyword if "${GLOBAL_PROXY_WARNING_TITLE}" == ''
+ Return From Keyword if "${GLOBAL_PROXY_WARNING_CONTINUE_XPATH}" == ''
+ ${test} ${value}= Run keyword and ignore error Title Should Be ${GLOBAL_PROXY_WARNING_TITLE}
+ Run keyword If '${test}' == 'PASS' Click Element xpath=${GLOBAL_PROXY_WARNING_CONTINUE_XPATH} \ No newline at end of file
diff --git a/tests/portal/testsuites/integration_robot_properties.py b/tests/portal/testsuites/integration_robot_properties.py
new file mode 100644
index 00000000..cc0558fc
--- /dev/null
+++ b/tests/portal/testsuites/integration_robot_properties.py
@@ -0,0 +1,83 @@
+# aaf info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_AAF_SERVER = "http://10.0.12.1:8101"
+GLOBAL_AAF_USERNAME = "dgl@openecomp.org"
+GLOBAL_AAF_PASSWORD = "ecomp_admin"
+# aai info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_AAI_SERVER_URL = "https://104.239.249.183:8443"
+GLOBAL_AAI_USERNAME = "AAI"
+GLOBAL_AAI_PASSWORD = "AAI"
+# appc info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_APPC_SERVER = "http://172.99.68.171:8282"
+GLOBAL_APPC_USERNAME = "admin"
+GLOBAL_APPC_PASSWORD = "Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U"
+# sdc info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_ASDC_SERVER = "http://104.239.249.58"
+GLOBAL_ASDC_FE_PORT = "8181"
+GLOBAL_ASDC_BE_PORT = "8080"
+GLOBAL_ASDC_BE_USERNAME = "beep"
+GLOBAL_ASDC_BE_PASSWORD = "boop"
+# dcae info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_DCAE_SERVER = "http://146.20.110.86:9998"
+GLOBAL_DCAE_USERNAME = "console"
+GLOBAL_DCAE_PASSWORD = "ZjJkYjllMjljMTI2M2Iz"
+# message router info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_MR_SERVER = "http://162.209.124.141:3904"
+# mso info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_MSO_SERVER = "http://172.99.67.208:8080"
+GLOBAL_MSO_USERNAME = "InfraPortalClient"
+GLOBAL_MSO_PASSWORD = "password1$"
+# openstack info - info to select right info in environment
+GLOBAL_OPENSTACK_KEYSTONE_SERVER = "https://identity.api.rackspacecloud.com"
+# packet generate vnf info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_PACKET_GENERATOR_PORT = "8183"
+GLOBAL_PACKET_GENERATOR_USERNAME = "admin"
+GLOBAL_PACKET_GENERATOR_PASSWORD = "admin"
+GLOBAL_PGN_PORT = "2831"
+# policy info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_POLICY_SERVER_URL = "http://104.239.249.76:8480"
+GLOBAL_POLICY_AUTH = "dGVzdHJlc3Q6M2MwbXBVI2gwMUBOMWMz"
+GLOBAL_POLICY_CLIENTAUTH = "cHl0aG9uOnRlc3Q="
+GLOBAL_POLICY_HEALTHCHECK_URL = "http://104.239.249.76:6969"
+GLOBAL_POLICY_USERNAME = "healthcheck"
+GLOBAL_POLICY_PASSWORD = "zb!XztG34"
+# portal info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_PORTAL_SERVER = "http://104.130.31.32:8989"
+GLOBAL_PORTAL_USERNAME = "demo"
+GLOBAL_PORTAL_PASSWORD = "demo123456!"
+# portal information
+#GLOBAL_PORTAL_URL = "http://vm-ep-dev2.client.research.att.com:8989"
+GLOBAL_PORTAL_URL = "http://vm-ep-dev3.client.research.att.com:8989"
+#GLOBAL_PORTAL_URL = "http://portal.api.simpledemo.openecomp.org:8989"
+GLOBAL_PORTAL_ADMIN_USER = "demo"
+GLOBAL_PORTAL_ADMIN_PWD = "demo123456!"
+GLOBAL_APP_ADMIN_USER = "appdemo"
+GLOBAL_APP_ADMIN_PWD = "appdemo123456!"
+GLOBAL_STA_USER_USER = "stademo"
+GLOBAL_STA_USER_PWD = "stademo123456!"
+#First_Name = "Test20"
+#Last_Name = "Demo20"
+#Email_Address = "Test20@att.com"
+#LoginID = "TestUser20"
+#Loginpwd = "Demo1234!"
+#LoginPwdCheck = "Demo1234!"
+#Existing_User = "Portal"
+# sdngc info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_SDNGC_SERVER = "http://172.99.69.190"
+GLOBAL_SDNGC_REST_PORT = "8282"
+GLOBAL_SDNGC_ADMIN_PORT = "8843"
+GLOBAL_SDNGC_USERNAME = "admin"
+GLOBAL_SDNGC_PASSWORD = "Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U"
+# vid info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_VID_USERNAME = "demo"
+GLOBAL_VID_PASSWORD = "Kp8bJ4SXszM0WX"
+GLOBAL_VID_HEALTH_USERNAME = "Default"
+GLOBAL_VID_HEALTH_PASSWORD = "AppPassword!1"
+GLOBAL_VID_SERVER = "http://104.130.12.222:8080"
+#global selenium info
+GLOBAL_PROXY_WARNING_TITLE="Notice - Uncategorized Site"
+GLOBAL_PROXY_WARNING_CONTINUE_XPATH="//a[contains(@href, 'accepted-Notify-Uncategorized')]"
+# settings for vm to attach vvg too
+GLOBAL_VVGSERVER_IMAGE = "Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)"
+GLOBAL_VVGSERVER_FLAVOR = "4 GB General Purpose v1"
+# dns info
+GLOBAL_DNS_TRAFFIC_DURATION = "600" \ No newline at end of file
diff --git a/tests/portal/testsuites/json_templater.robot b/tests/portal/testsuites/json_templater.robot
new file mode 100644
index 00000000..01eba480
--- /dev/null
+++ b/tests/portal/testsuites/json_templater.robot
@@ -0,0 +1,21 @@
+*** Settings ***
+Documentation This resource is filling out json string templates and returning the json back
+Library RequestsLibrary
+Library eteutils/StringTemplater.py
+Library OperatingSystem
+#Resource global_properties.robot
+
+*** Keywords ***
+Fill JSON Template
+ [Documentation] Runs substitution on template to return a filled in json
+ [Arguments] ${json} ${arguments}
+ ${returned_string}= Template String ${json} ${arguments}
+ ${returned_json}= To Json ${returned_string}
+ [Return] ${returned_json}
+
+Fill JSON Template File
+ [Documentation] Runs substitution on template to return a filled in json
+ [Arguments] ${json_file} ${arguments}
+ ${json}= OperatingSystem.Get File ${json_file}
+ ${returned_json}= Fill JSON Template ${json} ${arguments}
+ [Return] ${returned_json} \ No newline at end of file
diff --git a/tests/portal/testsuites/news_widget.zip b/tests/portal/testsuites/news_widget.zip
new file mode 100644
index 00000000..17d4ce92
--- /dev/null
+++ b/tests/portal/testsuites/news_widget.zip
Binary files differ
diff --git a/tests/portal/testsuites/portal.template b/tests/portal/testsuites/portal.template
new file mode 100644
index 00000000..57a3b798
--- /dev/null
+++ b/tests/portal/testsuites/portal.template
@@ -0,0 +1,34 @@
+{
+"application" : "${jira_id}",
+"event" : {
+"body" : {
+"ticketStatePhrase" : "We recently detected a problem with the equipment at your site. The event is in queue for immediate work.",
+"ivrNotificationFlag" : "1",
+"expectedRestoreDate" : 0,
+"bridgeTransport" : "AOTS",
+"reptRequestType" : 0,
+"ticketNum" : "PORTAL-104",
+"assetID" : "JIRA notification from demo",
+"eventAbstract" : "This is the place to enter notification contents!!! ",
+"severity" : "2 - Major",
+"ticketPriority" : "3",
+"reportedCustomerImpact" : 0,
+"testAutoIndicator" : 0,
+"supportGroupName" : "US-TEST-ORT",
+"messageGroup" : "SNMP",
+"csi" : 0,
+"mfabRestoredTime" : 0
+},
+"header" : {
+"timestamp" : "2017-04-10T14:35:05.219+0000",
+"eventSource" : "JIRA",
+"entityId" : "000002000857405",
+"sequenceNumber" : 2
+},
+"blinkMsgId" : "f38c071e-1a47-4b55-9e72-1db830100a61",
+"sourceIP" : "130.4.165.158"
+},
+"SubscriberInfo" : {
+"UserList" : ["demo"]
+}
+}
diff --git a/tests/portal/testsuites/portal_VID.robot b/tests/portal/testsuites/portal_VID.robot
new file mode 100644
index 00000000..473a0464
--- /dev/null
+++ b/tests/portal/testsuites/portal_VID.robot
@@ -0,0 +1,741 @@
+*** Settings ***
+Documentation The main interface for interacting with Portal. It handles low level stuff like managing the selenium request library and Portal required steps
+Library ExtendedSelenium2Library
+Library RequestsClientCert
+Library RequestsLibrary
+Library UUID
+Library DateTime
+Resource ../global_properties.robot
+Resource ../browser_setup.robot
+
+*** Variables ***
+${PORTAL_ENV} /ECOMPPORTAL
+${PORTAL_LOGIN_URL} ${GLOBAL_PORTAL_URL}${PORTAL_ENV}/login.htm
+${PORTAL_HOME_PAGE} ${GLOBAL_PORTAL_URL}${PORTAL_ENV}/applicationsHome
+${PORTAL_MICRO_ENDPOINT} ${GLOBAL_PORTAL_URL}${PORTAL_ENV}/commonWidgets
+${PORTAL_HOME_URL} ${GLOBAL_PORTAL_URL}${PORTAL_ENV}/applicationsHome
+${App_First_Name} appdemo
+${App_Last_Name} demo
+${App_Email_Address} appdemo@onap.com
+${App_LoginID} appdemo
+${App_Loginpwd} demo123456!
+${App_LoginPwdCheck} demo123456!
+${Sta_First_Name} stademo
+${Sta_Last_Name} demo
+${Sta_Email_Address} stademo@onap.com
+${Sta_LoginID} stademo
+${Sta_Loginpwd} demo123456!
+${Sta_LoginPwdCheck} demo123456!
+${Existing_User} portal
+${PORTAL_HEALTH_CHECK_PATH} /ECOMPPORTAL/portalApi/healthCheck
+#${Application} 'Virtual Infrastructure Deployment'
+#${Application_tab} 'select-app-Virtual-Infrastructure-Deployment'
+#${Application_dropdown} 'div-app-name-dropdown-Virtual-Infrastructure-Deployment'
+#${Application_dropdown_select} 'div-app-name-Virtual-Infrastructure-Deployment'
+${APPC_LOGIN_URL} http://104.130.74.99:8282/apidoc/explorer/index.html
+${PORTAL_ASSETS_DIRECTORY} C:\\Users\\kk707x\\Downloads
+
+
+
+
+
+*** Keywords ***
+
+Run Portal Health Check
+ [Documentation] Runs Portal Health check
+ ${resp}= Run Portal Get Request ${PORTAL_HEALTH_CHECK_PATH}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Be Equal As Strings ${resp.json()['statusCode']} 200
+Run Portal Get Request
+ [Documentation] Runs Portal Get request
+ [Arguments] ${data_path}
+ ${session}= Create Session portal ${GLOBAL_PORTAL_URL}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Get Request portal ${data_path} headers=${headers}
+ Log Received response from portal ${resp.text}
+ [Return] ${resp}
+
+
+Portal admin Login To Portal GUI
+ [Documentation] Logs into Portal GUI
+ # Setup Browser Now being managed by test case
+ ##Setup Browser
+ Go To ${PORTAL_LOGIN_URL}
+ Maximize Browser Window
+ Set Selenium Speed ${GLOBAL_SELENIUM_DELAY}
+ Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+ Log Logging in to ${GLOBAL_PORTAL_SERVER}${PORTAL_ENV}
+ # Handle Proxy Warning
+ Title Should Be Login
+ Input Text xpath=//input[@ng-model='loginId'] ${GLOBAL_PORTAL_ADMIN_USER}
+ Input Password xpath=//input[@ng-model='password'] ${GLOBAL_PORTAL_ADMIN_PWD}
+ Click Link xpath=//a[@id='loginBtn']
+ Wait Until Page Contains Element xpath=//img[@alt='Onap Logo'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Log Logged in to ${GLOBAL_PORTAL_SERVER}${PORTAL_ENV}
+
+Portal admin Go To Portal HOME
+ [Documentation] Naviage to Portal Home
+ Go To ${PORTAL_HOME_URL}
+ Wait Until Page Contains Element xpath=//div[@class='applicationWindow'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+
+Portal admin User Notifications
+ [Documentation] Naviage to User notification tab
+ Click Link xpath=//a[@id='parent-item-User-Notifications']
+ Wait Until Element Is Visible xpath=//h1[@class='heading-page'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Click Button xpath=//button[@id='button-openAddNewApp']
+ Click Button xpath=(//button[@id='undefined'])[1]
+ #Click Button xpath=//input[@id='datepicker-start']
+
+Portal admin Add Application Admin New User
+ [Documentation] Naviage to Admins tab
+ Click Link xpath=//a[@title='Admins']
+ Wait Until Element Is Visible xpath=//h1[contains(.,'Admins')] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Page Should Contain Admins
+ Click Button xpath=//button[@ng-click='admins.openAddNewAdminModal()']
+ Click Button xpath=//button[@id='Create-New-User-button']
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.firstName'] ${First_Name}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.lastName'] ${Last_Name}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.emailAddress'] ${Email_Address}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginId'] ${LoginID}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginPwd'] ${Loginpwd}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginPwdCheck'] ${LoginPwdCheck}
+ Click Button xpath=//button[@ng-click='searchUsers.addNewUserFun()']
+ Click Button xpath=//button[@id='search-users-button-next']
+ Click Button xpath=//input[@value='Select application']
+ Scroll Element Into View xpath=(//input[@value='Select application']/following::*[contains(text(),'Virtual Infrastructure Deployment')])[1]
+ #Scroll Element Into View xpath=(//input[@value='Select application']/following::*[contains(text(),'Virtual Infrastructure Deployment')])[1]
+ Click Element xpath=(//li[contains(.,'Virtual Infrastructure Deployment')])[2]
+ Click Button xpath=//button[@id='div-updateAdminAppsRoles']
+ Click Element xpath=//button[@id='admin-div-ok-button']
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Click Link xpath=//a[@aria-label='Admins']
+ Click Button xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'Virtual Infrastructure Deployment')]
+ Input Text xpath=//input[@id='input-table-search'] ${First_Name}
+ Element Text Should Be xpath=(//span[contains(.,'Test')] )[1] ${First_Name}
+
+
+
+
+Portal admin Add Application Admin Exiting User
+ [Documentation] Naviage to Admins tab
+ Wait Until Element Is Visible xpath=//a[@title='Admins'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Click Link xpath=//a[@title='Admins']
+ Wait Until Element Is Visible xpath=//h1[contains(.,'Admins')] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Page Should Contain Admins
+ Click Button xpath=//button[@ng-click='admins.openAddNewAdminModal()']
+ Input Text xpath=//input[@id='input-user-search'] ${Existing_User}
+ Click Button xpath=//button[@id='button-search-users']
+ Click Element xpath=//span[@id='result-uuid-0']
+ Click Button xpath=//button[@id='search-users-button-next']
+ Click Button xpath=//input[@value='Select application']
+ Scroll Element Into View xpath=(//input[@value='Select application']/following::*[contains(text(),'Virtual Infrastructure Deployment' )])[1]
+
+ Click Element xpath=(//li[contains(.,'Virtual Infrastructure Deployment' )])[2]
+ #Select From List xpath=(//input[@value='Select application']/following::*[contains(text(),'Virtual Infrastructure Deployment')])[1] Virtual Infrastructure Deployment
+ Click Button xpath=//button[@id='div-updateAdminAppsRoles']
+ Click Element xpath=//button[@id='admin-div-ok-button']
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Get Selenium Implicit Wait
+ Click Link xpath=//a[@aria-label='Admins']
+ Click Element xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'Virtual Infrastructure Deployment' )]
+ Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+ Element Text Should Be xpath=(//span[contains(.,'portal')])[1] ${Existing_User}
+
+
+Portal admin Delete Application Admin Existing User
+ [Documentation] Naviage to Admins tab
+ Click Element xpath=(//span[contains(.,'portal')] )[1]
+ Click Element xpath=//*[@id='select-app-Virtual-Infrastructure-Deployment']/following::i[@id='i-delete-application']
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Click Button xpath=//button[@id='div-updateAdminAppsRoles']
+ Click Element xpath=//button[@id='admin-div-ok-button']
+ #Is Element Visible xpath=(//span[contains(.,'Portal')] )[2]
+ #Is Element Visible xpath=(//*[contains(.,'Portal')] )[2]
+ Element Should Not Contain xpath=//*[@table-data='admins.adminsTableData'] portal
+
+
+Portal admin Add Application admin User New user
+ [Documentation] Naviage to Users tab
+ Click Link xpath=//a[@title='Users']
+ Page Should Contain Users
+ Click Button xpath=//button[@ng-click='users.openAddNewUserModal()']
+ Click Button xpath=//button[@id='Create-New-User-button']
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.firstName'] ${App_First_Name}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.lastName'] ${App_Last_Name}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.emailAddress'] ${App_Email_Address}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginId'] ${App_LoginID}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginPwd'] ${App_Loginpwd}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginPwdCheck'] ${App_LoginPwdCheck}
+ Click Button xpath=//button[@ng-click='searchUsers.addNewUserFun()']
+ Click Button xpath=//button[@id='next-button']
+ #Scroll Element Into View xpath=//div[@id='div-app-name-dropdown-Virtual-Infrastructure-Deployment']
+ Click Element xpath=//*[@id='div-app-name-dropdown-Virtual-Infrastructure-Deployment']
+ Click Element xpath=//*[@id='div-app-name-Virtual-Infrastructure-Deployment']/following::input[@id='Standard-User-checkbox']
+ Set Selenium Implicit Wait 3000
+ Click Button xpath=//button[@id='new-user-save-button']
+ Set Selenium Implicit Wait 3000
+ Go To ${PORTAL_HOME_PAGE}
+ Click Link xpath=//a[@title='Users']
+ Click Element xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'Virtual Infrastructure Deployment')]
+ Input Text xpath=//input[@id='input-table-search'] ${App_First_Name}
+ Element Text Should Be xpath=(//span[contains(.,'appdemo')] )[1] ${App_First_Name}
+
+
+Portal admin Add Standard User New user
+ [Documentation] Naviage to Users tab
+ Click Link xpath=//a[@title='Users']
+ Page Should Contain Users
+ Click Button xpath=//button[@ng-click='users.openAddNewUserModal()']
+ Click Button xpath=//button[@id='Create-New-User-button']
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.firstName'] ${Sta_First_Name}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.lastName'] ${Sta_Last_Name}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.emailAddress'] ${Sta_Email_Address}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginId'] ${Sta_LoginID}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginPwd'] ${Sta_Loginpwd}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginPwdCheck'] ${Sta_LoginPwdCheck}
+ Click Button xpath=//button[@ng-click='searchUsers.addNewUserFun()']
+ Click Button xpath=//button[@id='next-button']
+ #Scroll Element Into View xpath=//div[@id='div-app-name-dropdown-Virtual-Infrastructure-Deployment']
+ Click Element xpath=//*[@id='div-app-name-dropdown-Virtual-Infrastructure-Deployment']
+ Click Element xpath=//*[@id='div-app-name-Virtual-Infrastructure-Deployment']/following::input[@id='Standard-User-checkbox']
+ Set Selenium Implicit Wait 3000
+ Click Button xpath=//button[@id='new-user-save-button']
+ Set Selenium Implicit Wait 3000
+ Go To ${PORTAL_HOME_PAGE}
+ Click Link xpath=//a[@title='Users']
+ Click Element xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'Virtual Infrastructure Deployment')]
+ Input Text xpath=//input[@id='input-table-search'] ${Sta_First_Name}
+ Element Text Should Be xpath=(//span[contains(.,'appdemo')] )[1] ${Sta_First_Name}
+
+
+
+Portal admin Add Application Admin Exiting User -APPDEMO
+ [Documentation] Naviage to Admins tab
+ Wait Until Element Is Visible xpath=//a[@title='Admins'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Click Link xpath=//a[@title='Admins']
+ Wait Until Element Is Visible xpath=//h1[contains(.,'Admins')] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Page Should Contain Admins
+ Click Button xpath=//button[@ng-click='admins.openAddNewAdminModal()']
+ Input Text xpath=//input[@id='input-user-search'] ${App_First_Name}
+ Click Button xpath=//button[@id='button-search-users']
+ Click Element xpath=//span[@id='result-uuid-0']
+ Click Button xpath=//button[@id='search-users-button-next']
+ Click Button xpath=//input[@value='Select application']
+ Scroll Element Into View xpath=(//input[@value='Select application']/following::*[contains(text(),'Virtual Infrastructure Deployment' )])[1]
+
+ Click Element xpath=(//li[contains(.,'Virtual Infrastructure Deployment' )])[2]
+ #Select From List xpath=(//input[@value='Select application']/following::*[contains(text(),'Virtual Infrastructure Deployment')])[1] Virtual Infrastructure Deployment
+ Click Button xpath=//button[@id='div-updateAdminAppsRoles']
+ Click Element xpath=//button[@id='admin-div-ok-button']
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Get Selenium Implicit Wait
+ Click Link xpath=//a[@aria-label='Admins']
+ Click Element xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'Virtual Infrastructure Deployment' )]
+ Input Text xpath=//input[@id='input-table-search'] ${App_First_Name}
+ Element Text Should Be xpath=(//span[contains(.,'appdemo')])[1] ${App_First_Name}
+
+
+
+Portal admin Add Standard User Existing user
+ [Documentation] Naviage to Users tab
+ Click Link xpath=//a[@title='Users']
+ Page Should Contain Users
+ Click Button xpath=//button[@ng-click='users.openAddNewUserModal()']
+ Input Text xpath=//input[@id='input-user-search'] ${Existing_User}
+ Click Button xpath=//button[@id='button-search-users']
+ Click Element xpath=//span[@id='result-uuid-0']
+ Click Button xpath=//button[@id='next-button']
+ Click Element xpath=//*[@id='div-app-name-dropdown-Virtual-Infrastructure-Deployment']
+ Click Element xpath=//*[@id='div-app-name-Virtual-Infrastructure-Deployment']/following::input[@id='Standard-User-checkbox']
+ #Click Element xpath=//div[@id='div-app-name-dropdown-xDemo-App']
+ #Click Element xpath=//div[@id='div-app-name-xDemo-App']/following::input[@id='Standard-User-checkbox']
+
+ Set Selenium Implicit Wait 3000
+ Click Button xpath=//button[@id='new-user-save-button']
+ Set Selenium Implicit Wait 3000
+ #Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+ #Select From List xpath=//input[@value='Select application'] Virtual Infrastructure Deployment
+ #Click Link xpath=//a[@title='Users']
+ #Page Should Contain Users
+ #Focus xpath=//input[@name='dropdown1']
+
+ Go To ${PORTAL_HOME_PAGE}
+ Click Link xpath=//a[@title='Users']
+ Click Element xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'Virtual Infrastructure Deployment')]
+ #Click Element xpath=//li[contains(.,'XDemo App')]
+ Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+ Element Text Should Be xpath=(.//*[@id='rowheader_t1_0'])[2] Standard User
+
+
+Portal admin Edit Standard User Existing user
+ [Documentation] Naviage to Users tab
+ Click Element xpath=(.//*[@id='rowheader_t1_0'])[2]
+ Click Element xpath=//*[@id='div-app-name-dropdown-Virtual-Infrastructure-Deployment']
+ Click Element xpath=//*[@id='div-app-name-Virtual-Infrastructure-Deployment']/following::input[@id='Standard-User-checkbox']
+ Click Element xpath=//*[@id='div-app-name-Virtual-Infrastructure-Deployment']/following::input[@id='System-Administrator-checkbox']
+ Set Selenium Implicit Wait 3000
+ Click Button xpath=//button[@id='new-user-save-button']
+ Set Selenium Implicit Wait 3000
+ Page Should Contain Users
+ #Click Button xpath=//input[@id='dropdown1']
+ #Click Element xpath=//li[contains(.,'Virtual Infrastructure Deployment')]
+ Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+ Element Text Should Be xpath=(.//*[@id='rowheader_t1_0'])[2] System Administrator
+
+
+ Portal admin Delete Standard User Existing user
+ [Documentation] Naviage to Users tab
+ Click Element xpath=(.//*[@id='rowheader_t1_0'])[2]
+ Scroll Element Into View xpath=//*[@id='div-app-name-Virtual-Infrastructure-Deployment']/following::*[@id='app-item-delete'][1]
+ Click Element xpath=//*[@id='div-app-name-Virtual-Infrastructure-Deployment']/following::*[@id='app-item-delete'][1]
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Click Button xpath=//button[@id='new-user-save-button']
+ #Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+ #Is Element Visible xpath=(//*[contains(.,'Portal')] )[2]
+ Element Should Not Contain xpath=//*[@table-data='users.accountUsers'] portal
+
+
+
+
+Functional Top Menu Get Access
+ [Documentation] Naviage to Support tab
+ Click Link xpath=//a[contains(.,'Support')]
+ Mouse Over xpath=//*[contains(text(),'Get Access')]
+ Click Link xpath=//a[contains(.,'Get Access')]
+ Element Text Should Be xpath=//h1[contains(.,'Get Access')] Get Access
+
+
+Functional Top Menu Contact Us
+ [Documentation] Naviage to Support tab
+ Click Link xpath=//a[contains(.,'Support')]
+ Mouse Over xpath=//*[contains(text(),'Contact Us')]
+ Click Link xpath=//a[contains(.,'Contact Us')]
+ Element Text Should Be xpath=//h1[contains(.,'Contact Us')] Contact Us
+ Click Image xpath=//img[@alt='Onap Logo']
+
+
+Portal admin Edit Functional menu
+ [Documentation] Naviage to Edit Functional menu tab
+ Click Link xpath=//a[@title='Edit Functional Menu']
+ Click Link xpath=.//*[@id='Manage']/div/a
+ Click Link xpath=.//*[@id='Design']/div/a
+ Click Link xpath=.//*[@id='Product_Design']/div/a
+ Open Context Menu xpath=//*[@id='Product_Design']/div/span
+ Click Link xpath=//a[@href='#add']
+ Input Text xpath=//input[@id='input-title'] ONAP Test
+ #Input Text xpath=//input[@id='input-url'] http://google.com
+ Click Element xpath=//input[@id='select-app']
+ Scroll Element Into View xpath=//li[contains(.,'Virtual Infrastructure Deployment')]
+ Click Element xpath=//li[contains(.,'Virtual Infrastructure Deployment')]
+ Input Text xpath=//input[@id='input-url'] http://google.com
+ Click Button xpath=//button[@id='button-save-continue']
+ #Click Button xpath=//div[@title='Select Roles']
+ Click Element xpath=//*[@id='app-select-Select Roles']
+ Click Element xpath=//input[@id='Standard-User-checkbox']
+ Click Element xpath=//button[@id='button-save-add']
+ Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+ Click Link xpath=//a[contains(.,'Manage')]
+ Mouse Over xpath=//*[contains(text(),'Design')]
+ Set Selenium Implicit Wait 3000
+ Element Text Should Be xpath=//a[contains(.,'ONAP Test')] ONAP Test
+ Set Selenium Implicit Wait 3000
+ Click Link xpath=//a[@title='Edit Functional Menu']
+ Click Link xpath=.//*[@id='Manage']/div/a
+ Click Link xpath=.//*[@id='Design']/div/a
+ Click Link xpath=.//*[@id='Product_Design']/div/a
+ Open Context Menu xpath=//*[@id='ONAP_Test']
+ Click Link xpath=//a[@href='#delete']
+ Set Selenium Implicit Wait 3000
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+ Click Link xpath=//a[contains(.,'Manage')]
+ Mouse Over xpath=//*[contains(text(),'Design')]
+ Set Selenium Implicit Wait 3000
+ Element Should Not Contain xpath=(.//*[contains(.,'Design')]/following::ul[1])[1] ONAP Test
+
+
+
+
+
+
+
+
+Portal admin Microservice Onboarding
+ [Documentation] Naviage to Edit Functional menu tab
+ Click Link xpath=//a[@title='Microservice Onboarding']
+ Click Button xpath=//button[@id='microservice-onboarding-button-add']
+ Input Text xpath=//input[@name='name'] Test Microservice
+ Input Text xpath=//*[@name='desc'] Test
+ Click Element xpath=//input[@id='microservice-details-input-app']
+ Scroll Element Into View xpath=//li[contains(.,'Virtual Infrastructure Deployment')]
+ Click Element xpath=//li[contains(.,'Virtual Infrastructure Deployment')]
+ Click Element xpath=//*[@name='desc']
+ Input Text xpath=//input[@name='url'] ${PORTAL_MICRO_ENDPOINT}
+ Click Element xpath=//input[@id='microservice-details-input-security-type']
+ Scroll Element Into View xpath=//li[contains(.,'Basic Authentication')]
+ Click Element xpath=//li[contains(.,'Basic Authentication')]
+ Input Text xpath=//input[@name='username'] ${GLOBAL_PORTAL_ADMIN_USER}
+ Input Text xpath=//input[@name='password'] ${GLOBAL_PORTAL_ADMIN_PWD}
+ Click Button xpath=//button[@id='microservice-details-save-button']
+ #Table Column Should Contain xpath=//*[@table-data='serviceList'] 0 Test Microservice
+ Element Text Should Be xpath=//*[@table-data='serviceList'] Test Microservice
+
+
+
+Portal Admin Create Widget for All users
+ [Documentation] Naviage to Create Widget menu tab
+ ${WidgetAttachment}= Catenate ${PORTAL_ASSETS_DIRECTORY}\\widget_news.zip
+ Click Link xpath=//a[@title='Widget Onboarding']
+ Click Button xpath=//button[@id='widget-onboarding-button-add']
+ Input Text xpath=//*[@name='name'] ONAP-VID
+ Input Text xpath=//*[@name='desc'] ONAP VID
+ Click Element xpath=//*[@id='widgets-details-input-endpoint-url']
+ Scroll Element Into View xpath=//li[contains(.,'Test Microservice')]
+ Click Element xpath=//li[contains(.,'Test Microservice')]
+ Click Element xpath=//*[contains(text(),'Allow all user access')]/preceding::input[@ng-model='widgetOnboardingDetails.widget.allUser'][1]
+ Choose File xpath=//input[@id='widget-onboarding-details-upload-file'] ${WidgetAttachment}
+ Click Button xpath=//button[@id='widgets-details-save-button']
+ Wait Until Page Contains ONAP-VID ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Page Should Contain ONAP-VID
+ Set Selenium Implicit Wait 3000
+ GO TO ${PORTAL_HOME_PAGE}
+
+
+Portal Admin Delete Widget for All users
+ [Documentation] Naviage to delete Widget menu tab
+ #Wait Until Page Contains ONAP-VID ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ #Page Should Contain ONAP-VID
+ #Click Image xpath=//img[@alt='Onap Logo']
+ Click Link xpath=//a[@title='Widget Onboarding']
+ Click Element xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'Virtual Infrastructure Deployment')]
+ #Wait Until Page Contains xpath=(.//*[contains(text(),'ONAP-VID')]/followi
+ #Wait Until Page Contains xpath=(.//*[contains(text(),'ONAP-VID')]/following::*[@ng-click='widgetOnboarding.deleteWidget(rowData)'])[1] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Click Element xpath=(.//*[contains(text(),'ONAP-VID')]/following::*[@ng-click='widgetOnboarding.deleteWidget(rowData)'])[1]
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Set Selenium Implicit Wait 3000
+ Element Should Not Contain xpath=//*[@table-data='portalAdmin.portalAdminsTableData'] ONAP-VID
+ #Is Element Visible xpath=//*[@table-data='portalAdmin.portalAdminsTableData']
+ #Table Column Should Contain .//*[@table-data='portalAdmin.portalAdminsTableData'] 0 ONAP-VID
+ #Set Selenium Implicit Wait 3000
+
+
+Portal Admin Create Widget for Application Roles
+ [Documentation] Naviage to Create Widget menu tab
+ ${WidgetAttachment}= Catenate ${PORTAL_ASSETS_DIRECTORY}\\widget_news.zip
+ Click Link xpath=//a[@title='Widget Onboarding']
+ Click Button xpath=//button[@id='widget-onboarding-button-add']
+ Input Text xpath=//*[@name='name'] ONAP-VID
+ Input Text xpath=//*[@name='desc'] ONAP VID
+ Click Element xpath=//*[@id='widgets-details-input-endpoint-url']
+ Scroll Element Into View xpath=//li[contains(.,'Test Microservice')]
+ Click Element xpath=//li[contains(.,'Test Microservice')]
+ Click element xpath=//*[@id="app-select-Select Applications"]
+ click element xpath=//*[@id="Virtual-Infrastructure-Deployment-checkbox"]
+ Click element xpath=//*[@name='desc']
+ click element xpath=//*[@id="app-select-Select Roles"]
+ click element xpath=//*[@id="Standard-User-checkbox"]
+ Click element xpath=//*[@name='desc']
+ Scroll Element Into View xpath=//input[@id='widget-onboarding-details-upload-file']
+ Choose File xpath=//input[@id='widget-onboarding-details-upload-file'] ${WidgetAttachment}
+ Click Button xpath=//button[@id='widgets-details-save-button']
+ Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+ #Wait Until Page Contains ONAP-VID ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Click Link xpath=//a[@title='Widget Onboarding']
+ Click Element xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'Virtual Infrastructure Deployment')]
+ Page Should Contain ONAP-VID
+ Set Selenium Implicit Wait 3000
+ GO TO ${PORTAL_HOME_PAGE}
+
+
+
+
+ Portal Admin Delete Widget for Application Roles
+ [Documentation] Naviage to delete Widget menu tab
+ #Wait Until Page Contains ONAP-VID ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ #Page Should Contain ONAP-VID
+ #Click Image xpath=//img[@alt='Onap Logo']
+ Click Link xpath=//a[@title='Widget Onboarding']
+ Click Element xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'Virtual Infrastructure Deployment')]
+ #Wait Until Page Contains xpath=(.//*[contains(text(),'ONAP-VID')]/following::*[@ng-click='widgetOnboarding.deleteWidget(rowData)'])[1] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Click Element xpath=(.//*[contains(text(),'ONAP-VID')]/following::*[@ng-click='widgetOnboarding.deleteWidget(rowData)'])[1]
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Set Selenium Implicit Wait 3000
+ Element Should Not Contain xpath=//*[@table-data='portalAdmin.portalAdminsTableData'] ONAP-VID
+ #Is Element Visible xpath=//*[@table-data='portalAdmin.portalAdminsTableData']
+ #Table Column Should Contain .//*[@table-data='portalAdmin.portalAdminsTableData'] 0 ONAP-VID
+ #Set Selenium Implicit Wait 3000
+
+
+
+Portal Admin Edit Widget
+ [Documentation] Naviage to Home tab
+ #Mouse Over xpath=(//h3[contains(text(),'News')]/following::span[1])[1]
+ Click Element xpath=(//h3[contains(text(),'News')]/following::span[1])[1]
+ Set Browser Implicit Wait 8000
+ #Wait Until Element Is Visible xpath=(//h3[contains(text(),'News')]/following::span[1]/following::a[contains(text(),'Edit')])[1] 60
+ Mouse Over xpath=(//h3[contains(text(),'News')]/following::span[1]/following::a[contains(text(),'Edit')])[1]
+ Click Link xpath=(//h3[contains(text(),'News')]/following::span[1]/following::a[contains(text(),'Edit')])[1]
+ Input Text xpath=//input[@name='title'] ONAP_VID
+ Input Text xpath=//input[@name='url'] http://about.att.com/news/international.html
+ Input Text xpath=//input[@id='widget-input-add-order'] 5
+ Click Link xpath=//a[contains(.,'Add New')]
+ Click Element xpath=//div[@id='close-button']
+ Element Should Contain xpath=//*[@table-data='ignoredTableData'] ONAP_VID
+ Click Element xpath=.//div[contains(text(),'ONAP_VID')]/following::*[contains(text(),'5')][1]/following::div[@ng-click='remove($index);'][1]
+ Click Element xpath=//div[@id='confirmation-button-next']
+ Element Should Not Contain xpath=//*[@table-data='ignoredTableData'] ONAP_VID
+ Click Link xpath=//a[@id='close-button']
+
+
+
+
+Portal Admin Broadcast Notifications
+ [Documentation] Portal Test Admin Broadcast Notifications
+ ${CurrentDay}= Get Current Date result_format=%m/%d/%Y
+ ${NextDay}= Get Current Date increment=24:00:00 result_format=%m/%d/%Y
+ ${CurrentDate}= Get Current Date result_format=%m%d%y%H%M
+ ${AdminBroadCastMsg}= catenate ONAP VID Broadcast Automation${CurrentDate}
+ Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+ Click Link xpath=//*[@id="parent-item-User-Notifications"]
+ Wait until Element is visible xpath=//*[@id="button-openAddNewApp"] timeout=10
+ Click button xpath=//*[@id="button-openAddNewApp"]
+ Input Text xpath=//input[@id='datepicker-start'] ${CurrentDay}
+ Input Text xpath=//input[@id='datepicker-end'] ${NextDay}
+ Input Text xpath=//*[@id="add-notification-input-title"] ONAP VID Broadcast Automation
+ Input Text xpath=//*[@id="user-notif-input-message"] ${AdminBroadCastMsg}
+ click element xpath=//*[@id="button-notification-save"]
+ Wait until Element is visible xpath=//*[@id="button-openAddNewApp"] timeout=10
+ click element xpath=//*[@id="megamenu-notification-button"]
+ click element xpath=//*[@id="notification-history-link"]
+ Wait until Element is visible xpath=//*[@id="notification-history-table"] timeout=10
+ Table Column Should Contain xpath=//*[@id="notification-history-table"] 2 ${AdminBroadCastMsg}
+ log ${AdminBroadCastMsg}
+ [Return] ${AdminBroadCastMsg}
+
+Portal Admin Category Notifications
+ [Documentation] Portal Admin Broadcast Notifications
+ ${CurrentDay}= Get Current Date result_format=%m/%d/%Y
+ ${NextDay}= Get Current Date increment=24:00:00 result_format=%m/%d/%Y
+ ${CurrentDate}= Get Current Date result_format=%m%d%y%H%M
+ ${AdminCategoryMsg}= catenate ONAP VID Category Automation${CurrentDate}
+ Click Link xpath=//a[@id='parent-item-Home']
+ Click Link xpath=//*[@id="parent-item-User-Notifications"]
+ Wait until Element is visible xpath=//*[@id="button-openAddNewApp"] timeout=10
+ Click button xpath=//*[@id="button-openAddNewApp"]
+ #Select Radio Button NO radio-button-no
+ Click Element //*[contains(text(),'Broadcast to All Categories')]/following::*[contains(text(),'No')][1]
+ #Select Radio Button //label[@class='radio'] radio-button-approles
+ Click Element xpath=//*[contains(text(),'Categories')]/following::*[contains(text(),'Application Roles')][1]
+ Click Element xpath=//*[contains(text(),'Virtual Infrastructure Deployment')]/preceding::input[@ng-model='member.isSelected'][1]
+ Input Text xpath=//input[@id='datepicker-start'] ${CurrentDay}
+ Input Text xpath=//input[@id='datepicker-end'] ${NextDay}
+ Input Text xpath=//*[@id="add-notification-input-title"] ONAP VID Category Automation
+ Input Text xpath=//*[@id='user-notif-input-message'] ${AdminCategoryMsg}
+ click element xpath=//*[@id="button-notification-save"]
+ Wait until Element is visible xpath=//*[@id="button-openAddNewApp"] timeout=10
+ click element xpath=//*[@id="megamenu-notification-button"]
+ click element xpath=//*[@id="notification-history-link"]
+ Wait until Element is visible xpath=//*[@id="notification-history-table"] timeout=10
+ Table Column Should Contain xpath=//*[@id="notification-history-table"] 2 ${AdminCategoryMsg}
+ log ${AdminCategoryMsg}
+ [Return] ${AdminCategoryMsg}
+
+
+ Portal admin Logout from Portal GUI
+ [Documentation] Logout from Portal GUI
+ Click Element xpath=//div[@id='header-user-icon']
+ Click Button xpath=//button[contains(.,'Log out')]
+ Title Should Be Login
+
+
+
+Application admin Login To Portal GUI
+ [Documentation] Logs into Portal GUI
+ # Setup Browser Now being managed by test case
+ ##Setup Browser
+ Go To ${PORTAL_LOGIN_URL}
+ Maximize Browser Window
+ Set Selenium Speed ${GLOBAL_SELENIUM_DELAY}
+ Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+ Log Logging in to ${GLOBAL_PORTAL_SERVER}${PORTAL_ENV}
+ # Handle Proxy Warning
+ Title Should Be Login
+ Input Text xpath=//input[@ng-model='loginId'] ${GLOBAL_APP_ADMIN_USER}
+ Input Password xpath=//input[@ng-model='password'] ${GLOBAL_APP_ADMIN_PWD}
+ Click Link xpath=//a[@id='loginBtn']
+ Wait Until Page Contains Element xpath=//img[@alt='Onap Logo'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Log Logged in to ${GLOBAL_PORTAL_SERVER}${PORTAL_ENV}
+
+Application Admin Navigation Application Link Tab
+ [Documentation] Logs into Portal GUI as application admin
+ Click Link xpath=//a[@id='parent-item-Home']
+ Click Element xpath=.//h3[contains(text(),'Virtual Infras...')]/following::div[1]
+ Page Should Contain Welcome to VID
+ Click Element xpath=//i[@class='ion-close-round']
+ Click Element xpath=(.//span[@id='tab-Home'])[1]
+
+
+Application Admin Navigation Functional Menu
+ [Documentation] Logs into Portal GUI as application admin
+ Click Link xpath=//a[contains(.,'Manage')]
+ Mouse Over xpath=//*[contains(text(),'Technology Insertion')]
+ Click Link xpath= //*[contains(text(),'Infrastructure VNF Provisioning')]
+ Page Should Contain Welcome to VID
+ Click Element xpath=//i[@class='ion-close-round']
+ Click Element xpath=(.//span[@id='tab-Home'])[1]
+
+
+Application admin Add Standard User Existing user
+ [Documentation] Naviage to Users tab
+ Click Link xpath=//a[@title='Users']
+ Page Should Contain Users
+ Click Button xpath=//button[@ng-click='users.openAddNewUserModal()']
+ Input Text xpath=//input[@id='input-user-search'] ${Existing_User}
+ Click Button xpath=//button[@id='button-search-users']
+ Click Element xpath=//span[@id='result-uuid-0']
+ Click Button xpath=//button[@id='next-button']
+ Click Element xpath=//*[@id='div-app-name-dropdown-Virtual-Infrastructure-Deployment']
+ Click Element xpath=//*[@id='div-app-name-Virtual-Infrastructure-Deployment']/following::input[@id='Standard-User-checkbox']
+ Set Selenium Implicit Wait 3000
+ Click Button xpath=//button[@id='new-user-save-button']
+ Set Selenium Implicit Wait 3000
+ #Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+ #Select From List xpath=//input[@value='Select application'] Virtual Infrastructure Deployment
+ #Click Link xpath=//a[@title='Users']
+ #Page Should Contain Users
+ Go To ${PORTAL_HOME_PAGE}
+ Set Selenium Implicit Wait 3000
+ Click Link xpath=//a[@title='Users']
+ Click Element xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'Virtual Infrastructure Deployment')]
+ Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+ Element Text Should Be xpath=(.//*[@id='rowheader_t1_0'])[2] Standard User
+
+
+Application admin Edit Standard User Existing user
+ [Documentation] Naviage to Users tab
+ Click Element xpath=(.//*[@id='rowheader_t1_0'])[2]
+ Click Element xpath=//*[@id='div-app-name-dropdown-Virtual-Infrastructure-Deployment']
+ Click Element xpath=//*[@id='div-app-name-Virtual-Infrastructure-Deployment']/following::input[@id='Standard-User-checkbox']
+ Click Element xpath=//*[@id='div-app-name-Virtual-Infrastructure-Deployment']/following::input[@id='System-Administrator-checkbox']
+ Set Selenium Implicit Wait 3000
+ Click Button xpath=//button[@id='new-user-save-button']
+ Set Selenium Implicit Wait 3000
+ Page Should Contain Users
+ #Click Button xpath=//input[@id='dropdown1']
+ #Click Element xpath=//li[contains(.,'Virtual Infrastructure Deployment')]
+ Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+ Element Text Should Be xpath=(.//*[@id='rowheader_t1_0'])[2] System Administrator
+
+
+Application admin Delete Standard User Existing user
+ [Documentation] Naviage to Users tab
+ Click Element xpath=(.//*[@id='rowheader_t1_0'])[2]
+ Scroll Element Into View xpath=//*[@id='div-app-name-Virtual-Infrastructure-Deployment']/following::*[@id='app-item-delete'][1]
+ Click Element xpath=//*[@id='div-app-name-Virtual-Infrastructure-Deployment']/following::*[@id='app-item-delete'][1]
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Click Button xpath=//button[@id='new-user-save-button']
+ #Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+ #Is Element Visible xpath=(//*[contains(.,'Portal')] )[2]
+ Element Should Not Contain xpath=//*[@table-data='users.accountUsers'] Portal
+
+
+
+Application admin Logout from Portal GUI
+ [Documentation] Logout from Portal GUI
+ Click Element xpath=//div[@id='header-user-icon']
+ Click Button xpath=//button[contains(.,'Log out')]
+ #Confirm Action
+ Title Should Be Login
+
+
+Standared user Login To Portal GUI
+ [Documentation] Logs into Portal GUI
+ # Setup Browser Now being managed by test case
+ ##Setup Browser
+ Go To ${PORTAL_LOGIN_URL}
+ Maximize Browser Window
+ Set Selenium Speed ${GLOBAL_SELENIUM_DELAY}
+ Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+ Log Logging in to ${GLOBAL_PORTAL_SERVER}${PORTAL_ENV}
+ # Handle Proxy Warning
+ Title Should Be Login
+ Input Text xpath=//input[@ng-model='loginId'] ${GLOBAL_STA_USER_USER}
+ Input Password xpath=//input[@ng-model='password'] ${GLOBAL_STA_USER_PWD}
+ Click Link xpath=//a[@id='loginBtn']
+ Wait Until Page Contains Element xpath=//img[@alt='Onap Logo'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Log Logged in to ${GLOBAL_PORTAL_SERVER}${PORTAL_ENV}
+
+
+Standared user Navigation Application Link Tab
+ [Documentation] Logs into Portal GUI as application admin
+ #Portal admin Go To Portal HOME
+ Click Element xpath=.//h3[contains(text(),'Virtual Infras...')]/following::div[1]
+ Page Should Contain Welcome to VID
+ Click Element xpath=(.//span[@id='tab-Home'])[1]
+
+
+Standared user Navigation Functional Menu
+ [Documentation] Logs into Portal GUI as application admin
+ Click Link xpath=//a[contains(.,'Manage')]
+ Mouse Over xpath=//*[contains(text(),'Technology Insertion')]
+ Click Link xpath= //*[contains(text(),'Infrastructure VNF Provisioning')]
+ Page Should Contain Welcome to VID
+ Click Element xpath=(.//span[@id='tab-Home'])[1]
+
+
+
+Standared user Broadcast Notifications
+ [Documentation] Logs into Portal GUI as application admin
+ [Arguments] ${AdminBroadCastMsg}
+ Click element xpath=//*[@id='megamenu-notification-button']
+ Click element xpath=//*[@id='notification-history-link']
+ Wait until Element is visible xpath=//*[@id='app-title'] timeout=10
+ Table Column Should Contain xpath=//*[@id='notification-history-table'] 2 ${AdminBroadCastMsg}
+ log ${AdminBroadCastMsg}
+
+
+Standared user Category Notifications
+ [Documentation] Logs into Portal GUI as application admin
+ [Arguments] ${AdminCategoryMsg}
+ #click element xpath=//*[@id='megamenu-notification-button']
+ #click element xpath=//*[@id="notification-history-link"]
+ Wait until Element is visible xpath=//*[@id='app-title'] timeout=10
+ Table Column Should Contain xpath=//*[@id='notification-history-table'] 2 ${AdminCategoryMsg}
+ log ${AdminCategoryMsg}
+
+
+Standared user Logout from Portal GUI
+ [Documentation] Logout from Portal GUI
+ Click Element xpath=//div[@id='header-user-icon']
+ Click Button xpath=//button[contains(.,'Log out')]
+ #Confirm Action
+ Title Should Be Login
+
+
+
+
+Tear Down
+ [Documentation] Close all browsers
+ Close All Browsers
+
+
+
+
+
+
+
diff --git a/tests/portal/testsuites/test1.robot b/tests/portal/testsuites/test1.robot
new file mode 100644
index 00000000..d0fef06a
--- /dev/null
+++ b/tests/portal/testsuites/test1.robot
@@ -0,0 +1,1185 @@
+*** Settings ***
+Documentation This is RobotFrame work script
+Library ExtendedSelenium2Library
+Library OperatingSystem
+Library eteutils/RequestsClientCert.py
+Library RequestsLibrary
+Library eteutils/UUID.py
+Library DateTime
+Library Collections
+Library eteutils/OSUtils.py
+Library eteutils/StringTemplater.py
+Library String
+Library XvfbRobot
+Resource json_templater.robot
+
+*** Variables ***
+${PORTAL_URL} http://portal.api.simpledemo.onap.org:8989
+${PORTAL_ENV} /ONAPPORTAL
+${PORTAL_LOGIN_URL} ${PORTAL_URL}${PORTAL_ENV}/login.htm
+${PORTAL_HOME_PAGE} ${PORTAL_URL}${PORTAL_ENV}/applicationsHome
+${PORTAL_MICRO_ENDPOINT} ${PORTAL_URL}${PORTAL_ENV}/commonWidgets
+${PORTAL_HOME_URL} ${PORTAL_URL}${PORTAL_ENV}/applicationsHome
+${App_First_Name} demoapp
+${App_Last_Name} demo
+${App_Email_Address} demoapp@onap.com
+${App_LoginID} demoapp
+${App_Loginpwd} demo123456!
+${App_LoginPwdCheck} demo123456!
+${Sta_First_Name} demosta
+${Sta_Last_Name} demo
+${Sta_Email_Address} demosta@onap.com
+${Sta_LoginID} demosta
+${Sta_Loginpwd} demo123456!
+${Sta_LoginPwdCheck} demo123456!
+${Test_First_Name} portal
+${Test_Last_Name} demo
+${Test_Email_Address} portal@onap.com
+${Test_LoginID} portal
+${Test_Loginpwd} demo123456!
+${Test_LoginPwdCheck} demo123456!
+${Existing_User} portal
+${PORTAL_HEALTH_CHECK_PATH} /ONAPPORTAL/portalApi/healthCheck
+${PORTAL_XDEMPAPP_REST_URL} http://portal-sdk:8080/ONAPPORTALSDK/api/v2
+${PORTAL_ASSETS_DIRECTORY} ${CURDIR}
+${GLOBAL_APPLICATION_ID} robot-functional
+${GLOBAL_PORTAL_ADMIN_USER} demo
+${GLOBAL_PORTAL_ADMIN_PWD} demo123456!
+${AppAccountName} testApp
+${AppUserName} testApp
+${AppPassword} testApp123!
+${GLOBAL_MSO_STATUS_PATH} /ecomp/mso/infra/orchestrationRequests/v2/
+${GLOBAL_SELENIUM_BROWSER} chrome
+${GLOBAL_SELENIUM_BROWSER_CAPABILITIES} Create Dictionary
+${GLOBAL_SELENIUM_DELAY} 0
+${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT} 5
+${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT} 45
+${GLOBAL_OPENSTACK_HEAT_SERVICE_TYPE} orchestration
+${GLOBAL_OPENSTACK_CINDER_SERVICE_TYPE} volume
+${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} compute
+${GLOBAL_OPENSTACK_NEUTRON_SERVICE_TYPE} network
+${GLOBAL_OPENSTACK_GLANCE_SERVICE_TYPE} image
+${GLOBAL_OPENSTACK_KEYSTONE_SERVICE_TYPE} identity
+${GLOBAL_BUILD_NUMBER} 0
+${GLOBAL_VM_PRIVATE_KEY} ${EXECDIR}/robot/assets/keys/robot_ssh_private_key.pvt
+${jira} jira
+${RESOURCE_PATH} ONAPPORTAL/auxapi/ticketevent
+${portal_Template} ${CURDIR}/portal.template
+
+${Result} FALSE
+${td_id} 0
+${download_link_id} 0
+
+*** Test Cases ***
+
+Portal Health Check
+ Run Portal Health Check
+
+#Login into Portal URL
+# Portal admin Login To Portal GUI
+
+## Portal R1 Release
+# # [Documentation] ONAP Portal R1 functionality test
+# # Notification on ONAP Portal
+# # Portal Application Account Management validation
+
+#Portal Change REST URL Of X-DemoApp
+# [Documentation] Portal Change REST URL Of X-DemoApp
+# Portal Change REST URL
+
+#Portal R1 Release for AAF
+# [Documentation] ONAP Portal R1 functionality for AAF test
+# Portal AAF new fields
+
+#Create Microse service onboarding
+# Portal admin Microservice Onboarding
+
+###Delete Microse service
+# ##Portal admin Microservice Delete
+
+#Create Widget for all users
+# Portal Admin Create Widget for All users
+
+#Delete Widget for all users
+# Portal Admin Delete Widget for All users
+
+#Create Widget for Application Roles
+# Portal Admin Create Widget for Application Roles
+
+##Delete Widget for Application Roles
+# #Portal Admin Delete Widget for Application Roles
+
+##EP Admin widget download
+# #Admin widget download
+
+#EP Admin widget layout reset
+# Reset widget layout option
+
+#Validate Functional Top Menu Get Access
+# Functional Top Menu Get Access
+
+#Validate Functional Top Menu Contact Us
+# Functional Top Menu Contact Us
+
+#Edit Functional Menu
+# Portal admin Edit Functional menu
+
+#Broadbond Notification functionality
+# ${AdminBroadCastMsg}= Portal Admin Broadcast Notifications
+# set global variable ${AdminBroadCastMsg}
+
+#Category Notification functionality
+# ${AdminCategoryMsg}= Portal Admin Category Notifications
+# set global variable ${AdminCategoryMsg}
+
+#Create a Test user for Application Admin -Test
+# Portal admin Add Application admin User New user -Test
+
+#Create a Test User for Apllication Admin
+# Portal admin Add Application admin User New user
+
+#Add Application Admin for Existing User Test user
+# Portal admin Add Application Admin Exiting User -APPDEMO
+
+#Create a Test user for Standared User
+# Portal admin Add Standard User New user
+
+#Add Application Admin for Exisitng User
+# Portal admin Add Application Admin Exiting User
+
+#Delete Application Admin for Exisitng User
+# Portal admin Delete Application Admin Existing User
+
+#Add Standard User Role for Existing user
+# Portal admin Add Standard User Existing user
+
+#Edit Standard User Role for Existing user
+# Portal admin Edit Standard User Existing user
+
+#Delete Standard User Role for Existing user
+# Portal admin Delete Standard User Existing user
+
+##Add Account new account from App Account Management
+# #Portal admin Add New Account
+
+##Delete Account new account from App Account Management
+# #Portal admin Delete Account
+
+##EP Create Portal Admin
+# #Add Portal Admin
+
+##EP Portal Admin delete
+# #Delete Portal Admin
+
+#Logout from Portal GUI as Portal Admin
+# Portal admin Logout from Portal GUI
+
+## Application Admin user Test cases
+
+#Login To Portal GUI as APP Admin
+# Application admin Login To Portal GUI
+
+##Navigate Functional Link as APP Admin
+ ##Application Admin Navigation Functional Menu
+
+#Add Standard User Role for Existing user as APP Admin
+# Application admin Add Standard User Existing user
+
+#Edit Standard User Role for Existing user as APP Admin
+# Application admin Edit Standard User Existing user
+
+#Delete Standard User Role for Existing user as APP Admin
+# Application admin Delete Standard User Existing user
+
+##Navigate Application Link as APP Admin
+# #Application Admin Navigation Application Link Tab
+
+#Logout from Portal GUI as APP Admin
+# Application admin Logout from Portal GUI
+
+##Standard User Test cases
+
+#Login To Portal GUI as Standared User
+# Standared user Login To Portal GUI
+
+##Navigate Application Link as Standared User
+# #Standared user Navigation Application Link Tab
+
+##Navigate Functional Link as Standared User
+# #Standared user Navigation Functional Menu
+
+##Broadcast Notifications Standared user
+# #Standared user Broadcast Notifications ${AdminBroadCastMsg}
+
+##Category Notifications Standared user
+# #Standared user Category Notifications ${AdminCategoryMsg}
+
+#Logout from Portal GUI as Standared User
+# Standared User Logout from Portal GUI
+
+Teardown
+ [Documentation] Close All Open browsers
+ Close All Browsers
+
+*** Keywords ***
+
+Setup Browser
+ [Documentation] Sets up browser based upon the value of ${GLOBAL_SELENIUM_BROWSER}
+# Run Keyword If '${GLOBAL_SELENIUM_BROWSER}' == 'firefox' Setup Browser Firefox
+ Run Keyword If '${GLOBAL_SELENIUM_BROWSER}' == 'chrome' Setup Browser Chrome
+ Log Running with ${GLOBAL_SELENIUM_BROWSER}
+
+
+ Setup Browser Chrome
+ ${os}= Get Normalized Os
+ Log Normalized OS=${os}
+ ${chrome options}= Evaluate sys.modules['selenium.webdriver'].ChromeOptions() sys
+ Call Method ${chrome options} add_argument no-sandbox
+ ${dc} Evaluate sys.modules['selenium.webdriver'].DesiredCapabilities.CHROME sys, selenium.webdriver
+ Set To Dictionary ${dc} elementScrollBehavior 1
+ Create Webdriver Chrome chrome_options=${chrome_options} desired_capabilities=${dc}
+ Set Global Variable ${GLOBAL_SELENIUM_BROWSER_CAPABILITIES} ${dc}
+
+Handle Proxy Warning
+ [Documentation] Handle Intermediate Warnings from Proxies
+ ${status} ${data}= Run Keyword And Ignore Error Variable Should Exist \${GLOBAL_PROXY_WARNING_TITLE}
+ Return From Keyword if '${status}' != 'PASS'
+ ${status} ${data}= Run Keyword And Ignore Error Variable Should Exist \${GLOBAL_PROXY_WARNING_CONTINUE_XPATH}
+ Return From Keyword if '${status}' != 'PASS'
+ Return From Keyword if "${GLOBAL_PROXY_WARNING_TITLE}" == ''
+ Return From Keyword if "${GLOBAL_PROXY_WARNING_CONTINUE_XPATH}" == ''
+ ${test} ${value}= Run keyword and ignore error Title Should Be ${GLOBAL_PROXY_WARNING_TITLE}
+ Run keyword If '${test}' == 'PASS' Click Element xpath=${GLOBAL_PROXY_WARNING_CONTINUE_XPATH}
+
+
+Run Portal Health Check
+ [Documentation] Runs Portal Health check
+ ${resp}= Run Portal Get Request ${PORTAL_HEALTH_CHECK_PATH}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Be Equal As Strings ${resp.json()['statusCode']} 200
+
+Run Portal Get Request
+ [Documentation] Runs Portal Get request
+ [Arguments] ${data_path}
+ ${session}= Create Session portal ${PORTAL_URL}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Get Request portal ${data_path} headers=${headers}
+ Log Received response from portal ${resp.text}
+ [Return] ${resp}
+
+
+Portal admin Login To Portal GUI
+ [Documentation] Logs into Portal GUI
+ ## Setup Browser Now being managed by test case
+# Setup Browser
+ Start Virtual Display 1920 1080
+ Open Browser ${PORTAL_LOGIN_URL} chrome
+# Go To ${PORTAL_LOGIN_URL}
+ Maximize Browser Window
+ Set Selenium Speed ${GLOBAL_SELENIUM_DELAY}
+ Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+ Log Logging in to ${PORTAL_URL}${PORTAL_ENV}
+ # Handle Proxy Warning
+ Title Should Be Login
+ Input Text xpath=//input[@ng-model='loginId'] ${GLOBAL_PORTAL_ADMIN_USER}
+ Input Password xpath=//input[@ng-model='password'] ${GLOBAL_PORTAL_ADMIN_PWD}
+ Click Link xpath=//a[@id='loginBtn']
+ Wait Until Page Contains Element xpath=//img[@alt='Onap Logo'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ #Execute Javascript document.getElementById('w-ecomp-footer').style.display = 'none'
+ Log Logged in to ${PORTAL_URL}${PORTAL_ENV}
+
+Portal admin Go To Portal HOME
+ [Documentation] Naviage to Portal Home
+ Go To ${PORTAL_HOME_URL}
+ Wait Until Page Contains Element xpath=//div[@class='applicationWindow'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+
+Portal admin User Notifications
+ [Documentation] Naviage to User notification tab
+ Click Link xpath=//a[@id='parent-item-User-Notifications']
+ Wait Until Element Is Visible xpath=//h1[@class='heading-page'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Click Button xpath=//button[@id='button-openAddNewApp']
+ Click Button xpath=(//button[@id='undefined'])[1]
+ #Click Button xpath=//input[@id='datepicker-start']
+
+Portal admin Add Application Admin Exiting User
+ [Documentation] Naviage to Admins tab
+ Wait Until Element Is Visible xpath=//a[@title='Admins'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Click Link xpath=//a[@title='Admins']
+ Wait Until Element Is Visible xpath=//h1[contains(.,'Admins')] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Page Should Contain Admins
+ Click Button xpath=//button[@ng-click='toggleSidebar()']
+ Click Button xpath=//button[@ng-click='admins.openAddNewAdminModal()']
+ Input Text xpath=//input[@id='input-user-search'] ${Existing_User}
+ Click Button xpath=//button[@id='button-search-users']
+ Click Element xpath=//span[@id='result-uuid-0']
+ Click Button xpath=//button[@id='search-users-button-next']
+ Click Button xpath=//input[@value='Select application']
+ Scroll Element Into View xpath=(//input[@value='Select application']/following::*[contains(text(),'xDemo App' )])[1]
+ Click Element xpath=(//li[contains(.,'xDemo App' )])[2]
+# Scroll Element Into View xpath=(//input[@value='Select application']/following::*[contains(text(),'Default' )])[1]
+# Click Element xpath=(//li[contains(.,'Default' )])[2]
+ #Select From List xpath=(//input[@value='Select application']/following::*[contains(text(),'xDemo App')])[1] xDemo App
+ Click Button xpath=//button[@id='div-updateAdminAppsRoles']
+ Click Element xpath=//button[@id='admin-div-ok-button']
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Get Selenium Implicit Wait
+ Click Link xpath=//a[@aria-label='Admins']
+ Click Element xpath=//input[@id='dropdown1']
+# Click Element xpath=//li[contains(.,'Default' )]
+ Click Element xpath=//li[contains(.,'xDemo App' )]
+ Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+ Table Column Should Contain xpath=//*[@table-data='admins.adminsTableData'] 1 ${Existing_User}
+ #Element Text Should Be xpath=(//span[contains(.,'portal')])[1] ${Existing_User}
+ #Element Text Should Be xpath=(//span[contains(.,'demo')])[1] ${Existing_User}
+
+
+Portal admin Delete Application Admin Existing User
+ [Documentation] Naviage to Admins tab
+ Wait Until Element Is Visible xpath=//a[@title='Admins'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Click Link xpath=//a[@title='Admins']
+ Wait Until Element Is Visible xpath=//h1[contains(.,'Admins')] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Page Should Contain Admins
+ Click Button xpath=//button[@ng-click='toggleSidebar()']
+ Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+ Click Element xpath=(//span[contains(.,'portal')] )[1]
+ #Click Element xpath=(//span[contains(.,'demo')] )[1]
+ Click Element xpath=//*[@id='select-app-xDemo-App']/following::i[@id='i-delete-application']
+# Click Element xpath=//*[@id='select-app-Default']/following::i[@id='i-delete-application']
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Click Button xpath=//button[@id='div-updateAdminAppsRoles']
+ Click Element xpath=//button[@id='admin-div-ok-button']
+ #Is Element Visible xpath=(//span[contains(.,'Portal')] )[2]
+ #Is Element Visible xpath=(//*[contains(.,'Portal')] )[2]
+ Element Should Not Contain xpath=//*[@table-data='admins.adminsTableData'] portal
+ #Element Should Not Contain xpath=//*[@table-data='admins.adminsTableData'] demo
+ Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+
+
+Portal admin Add Application admin User New user
+ [Documentation] Naviage to Users tab
+ Click Link xpath=//a[@title='Users']
+ Page Should Contain Users
+ Click Button xpath=//button[@ng-click='toggleSidebar()']
+ Click Button xpath=//button[@id='users-button-add']
+ Click Button xpath=//button[@id='Create-New-User-button']
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.firstName'] ${App_First_Name}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.lastName'] ${App_Last_Name}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.emailAddress'] ${App_Email_Address}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginId'] ${App_LoginID}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginPwd'] ${App_Loginpwd}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginPwdCheck'] ${App_LoginPwdCheck}
+ Click Button xpath=//button[@ng-click='searchUsers.addNewUserFun()']
+
+ ${Result}= Get Matching XPath Count xpath=//*[contains(text(),'User with same loginId already exists')]
+
+ #log ${Result}
+ #${type_result}= Evaluate type(${Result})
+ #log ${type_result}
+
+ Run Keyword if '${Result}'== 0 AdminUser does not exist already
+ ... ELSE Goto Home Image
+ Set Selenium Implicit Wait 3000
+
+Goto Home Image
+ Click Image xpath=//img[@alt='Onap Logo']
+
+AdminUser does not exist already
+ Click Button xpath=//button[@id='next-button']
+ #Scroll Element Into View xpath=//div[@id='div-app-name-dropdown-xDemo-App']
+ Click Element xpath=//*[@id='div-app-name-dropdown-xDemo-App']
+ Click Element xpath=//*[@id='div-app-name-xDemo-App']/following::input[@id='Standard-User-checkbox']
+ Set Selenium Implicit Wait 3000
+ Click Button xpath=//button[@id='new-user-save-button']
+ Set Selenium Implicit Wait 3000
+ Go To ${PORTAL_HOME_PAGE}
+ Click Link xpath=//a[@title='Users']
+ Click Element xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'xDemo App')]
+ Table Column Should Contain xpath=//*[@table-data='users.accountUsers'] 1 ${App_First_Name}
+ #Input Text xpath=//input[@id='input-table-search'] ${App_First_Name}
+ #Element Text Should Be xpath=(//span[contains(.,'demoapp')] )[1] ${App_First_Name}
+ Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+
+
+Portal admin Add Standard User New user
+ [Documentation] Naviage to Users tab
+ Click Link xpath=//a[@title='Users']
+ Page Should Contain Users
+ Click Button xpath=//button[@ng-click='toggleSidebar()']
+ Click Button xpath=//button[@id='users-button-add']
+ Click Button xpath=//button[@id='Create-New-User-button']
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.firstName'] ${Sta_First_Name}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.lastName'] ${Sta_Last_Name}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.emailAddress'] ${Sta_Email_Address}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginId'] ${Sta_LoginID}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginPwd'] ${Sta_Loginpwd}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginPwdCheck'] ${Sta_LoginPwdCheck}
+ Click Button xpath=//button[@ng-click='searchUsers.addNewUserFun()']
+
+ ${Result}= Get Matching XPath Count xpath=//*[contains(text(),'User with same loginId already exists')]
+
+ #log ${Result}
+ #${type_result}= Evaluate type(${Result})
+ #log ${type_result}
+
+ Run Keyword if '${Result}'== 0 StaUser does not exist already
+ ... ELSE Goto Home Image
+ Set Selenium Implicit Wait 3000
+
+StaUser does not exist already
+ Click Button xpath=//button[@id='next-button']
+ #Scroll Element Into View xpath=//div[@id='div-app-name-dropdown-xDemo-App']
+ Click Element xpath=//*[@id='div-app-name-dropdown-xDemo-App']
+ Click Element xpath=//*[@id='div-app-name-xDemo-App']/following::input[@id='Standard-User-checkbox']
+ Set Selenium Implicit Wait 3000
+ Click Button xpath=//button[@id='new-user-save-button']
+ Set Selenium Implicit Wait 3000
+ Go To ${PORTAL_HOME_PAGE}
+ Click Link xpath=//a[@title='Users']
+ Click Element xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'xDemo App')]
+ Table Column Should Contain xpath=//*[@table-data='users.accountUsers'] 1 ${Sta_First_Name}
+ #Input Text xpath=//input[@id='input-table-search'] ${Sta_First_Name}
+ #Element Text Should Be xpath=(//span[contains(.,'appdemo')] )[1] ${Sta_First_Name}
+ Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+
+
+
+Portal admin Add Application admin User New user -Test
+ [Documentation] Naviage to Users tab
+ Click Link xpath=//a[@title='Users']
+ Page Should Contain Users
+ Click Button xpath=//button[@ng-click='toggleSidebar()']
+ Click Button xpath=//button[@id='users-button-add']
+ Click Button xpath=//button[@id='Create-New-User-button']
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.firstName'] ${Test_First_Name}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.lastName'] ${Test_Last_Name}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.emailAddress'] ${Test_Email_Address}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginId'] ${Test_LoginID}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginPwd'] ${Test_Loginpwd}
+ Input Text xpath=//input[@ng-model='searchUsers.newUser.loginPwdCheck'] ${Test_LoginPwdCheck}
+ Click Button xpath=//button[@ng-click='searchUsers.addNewUserFun()']
+ Click Button xpath=//button[@id='search-users-button-cancel']
+ Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+
+
+ #Click Button xpath=//button[@id='next-button']
+ #Scroll Element Into View xpath=//div[@id='div-app-name-dropdown-xDemo-App']
+ #Click Element xpath=//*[@id='div-app-name-dropdown-xDemo-App']
+ #Click Element xpath=//*[@id='div-app-name-xDemo-App']/following::input[@id='Standard-User-checkbox']
+ #Set Selenium Implicit Wait 3000
+ #Click Button xpath=//button[@id='new-user-save-button']
+ #Set Selenium Implicit Wait 3000
+ #Go To ${PORTAL_HOME_PAGE}
+ #Click Link xpath=//a[@title='Users']
+ #Click Element xpath=//input[@id='dropdown1']
+ #Click Element xpath=//li[contains(.,'xDemo App')]
+ #Table Column Should Contain xpath=//*[@table-data='users.accountUsers'] 1 ${Test_First_Name}
+ #Input Text xpath=//input[@id='input-table-search'] ${Test_First_Name}
+ #Element Text Should Be xpath=(//span[contains(.,'appdemo')] )[1] ${Test_First_Name}
+
+Portal admin Add Application Admin Exiting User -APPDEMO
+ [Documentation] Naviage to Admins tab
+ Wait Until Element Is Visible xpath=//a[@title='Admins'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Click Link xpath=//a[@title='Admins']
+ Wait Until Element Is Visible xpath=//h1[contains(.,'Admins')] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Page Should Contain Admins
+ Click Button xpath=//button[@ng-click='toggleSidebar()']
+ Click Button xpath=//button[@ng-click='admins.openAddNewAdminModal()']
+ Input Text xpath=//input[@id='input-user-search'] ${App_First_Name}
+ Click Button xpath=//button[@id='button-search-users']
+ Click Element xpath=//span[@id='result-uuid-0']
+ Click Button xpath=//button[@id='search-users-button-next']
+ Click Button xpath=//input[@value='Select application']
+ Scroll Element Into View xpath=(//input[@value='Select application']/following::*[contains(text(),'xDemo App' )])[1]
+ Click Element xpath=(//li[contains(.,'xDemo App' )])[2]
+ #Select From List xpath=(//input[@value='Select application']/following::*[contains(text(),'xDemo App')])[1] xDemo App
+ Click Button xpath=//button[@id='div-updateAdminAppsRoles']
+ Click Element xpath=//button[@id='admin-div-ok-button']
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Get Selenium Implicit Wait
+ Click Link xpath=//a[@aria-label='Admins']
+ Click Element xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'xDemo App' )]
+ Input Text xpath=//input[@id='input-table-search'] ${App_First_Name}
+ #Element Text Should Be xpath=(//span[contains(.,'appdemo')])[1] ${App_First_Name}
+ Table Column Should Contain xpath=//*[@table-data='admins.adminsTableData'] 1 ${App_First_Name}
+ Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+
+Portal admin Add Standard User Existing user
+ [Documentation] Naviage to Users tab
+ Click Link xpath=//a[@title='Users']
+ Page Should Contain Users
+ Click Button xpath=//button[@ng-click='toggleSidebar()']
+ Click Button xpath=//button[@ng-click='users.openAddNewUserModal()']
+ Input Text xpath=//input[@id='input-user-search'] ${Existing_User}
+ Click Button xpath=//button[@id='button-search-users']
+ Click Element xpath=//span[@id='result-uuid-0']
+ Click Button xpath=//button[@id='next-button']
+# Click Element xpath=//*[@id='div-app-name-dropdown-Default']
+# Click Element xpath=//*[@id='div-app-name-Default']/following::input[@id='Standard-User-checkbox']
+ Click Element xpath=//div[@id='app-select-Select roles1']
+ Click Element xpath=//div[@id='app-select-Select roles1']/following::input[@id='Standard-User-checkbox']
+ Set Selenium Implicit Wait 3000
+ Click Button xpath=//button[@id='new-user-save-button']
+ Set Selenium Implicit Wait 3000
+ #Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+ #Select From List xpath=//input[@value='Select application'] xDemo App
+ #Click Link xpath=//a[@title='Users']
+ #Page Should Contain Users
+ #Focus xpath=//input[@name='dropdown1']
+ Go To ${PORTAL_HOME_PAGE}
+ #Click Link xpath=//a[@title='Users']
+ #Click Element xpath=//input[@id='dropdown1']
+# Click Element xpath=//li[contains(.,'Default')]
+ #Click Element xpath=//li[contains(.,'XDemo App')]
+ #Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+ #Element Text Should Be xpath=(.//*[@id='rowheader_t1_0'])[2] Standard User
+ #Set Selenium Implicit Wait 3000
+
+Portal admin Edit Standard User Existing user
+ [Documentation] Naviage to Users tab
+ Click Link xpath=//a[@title='Users']
+ Click Element xpath=//input[@id='dropdown1']
+ # Click Element xpath=//li[contains(.,'Default')]
+# Set Selenium Implicit Wait 3000
+ Click Element xpath=//li[contains(.,'xDemo App')]
+# Set Selenium Implicit Wait 3000
+ Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+ Element Text Should Be xpath=(.//*[@id='rowheader_t1_0'])[2] Standard User
+ Click Element xpath=(.//*[@id='rowheader_t1_0'])[2]
+ # Click Element xpath=//*[@id='div-app-name-dropdown-Default']
+ # Click Element xpath=//*[@id='div-app-name-Default']/following::input[@id='Standard-User-checkbox']
+ # Click Element xpath=//*[@id='div-app-name-Default']/following::input[@id='Portal-Notification-Admin-checkbox']
+ Click Element xpath=//*[@id='app-select-Standard User1']
+ Click Element xpath=//*[@id='app-select-Standard User1']/following::input[@id='Standard-User-checkbox']
+ Set Selenium Implicit Wait 3000
+ Click Button xpath=//button[@id='new-user-save-button']
+ Set Selenium Implicit Wait 3000
+
+ Page Should Contain Users
+ Click Button xpath=//button[@ng-click='toggleSidebar()']
+ Click Button xpath=//button[@ng-click='users.openAddNewUserModal()']
+ Input Text xpath=//input[@id='input-user-search'] ${Existing_User}
+ Click Button xpath=//button[@id='button-search-users']
+ Click Element xpath=//span[@id='result-uuid-0']
+ Click Button xpath=//button[@id='next-button']
+ Click Element xpath=//div[@id='app-select-Select roles1']
+ Click Element xpath=//div[@id='app-select-Select roles1']/following::input[@id='System-Administrator-checkbox']
+ Set Selenium Implicit Wait 3000
+# Click Element xpath=//*[@id='app-select-Standard User1']
+# Click Element xpath=//*[@id='app-select-Standard User1']/following::input[@id='System-Administrator-checkbox']
+ # Click Element xpath=//*[@id='div-app-name-dropdown-SDC']
+ # Click Element xpath=//*[@id='div-app-name-SDC']/following::input[@id='Standard-User-checkbox']
+ # Click Element xpath=//*[@id='div-app-name-SDC']/following::input[@id='Portal-Notification-Admin-checkbox']
+ Set Selenium Implicit Wait 3000
+ Click Button xpath=//button[@id='new-user-save-button']
+ Set Selenium Implicit Wait 3000
+ Page Should Contain Users
+ #Click Button xpath=//input[@id='dropdown1']
+ #Click Element xpath=//li[contains(.,'xDemo App')]
+ Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+ # Element Text Should Be xpath=(.//*[@id='rowheader_t1_0'])[2] Portal Notification Admin
+ Element Text Should Be xpath=(.//*[@id='rowheader_t1_0'])[2] System Administrator
+ Set Selenium Implicit Wait 3000
+
+ Portal admin Delete Standard User Existing user
+ [Documentation] Naviage to Users tab
+ Click Element xpath=(.//*[@id='rowheader_t1_0'])[2]
+# Scroll Element Into View xpath=//*[@id='div-app-name-Default']/following::*[@id='app-item-delete'][1]
+# Click Element xpath=//*[@id='div-app-name-Default']/following::*[@id='app-item-delete'][1]
+ Set Selenium Implicit Wait 9000
+ Scroll Element Into View xpath=//*[@id='div-app-name-xDemo-App']/following::*[@id='app-item-delete'][1]
+ Click Element xpath=//*[@id='div-app-name-xDemo-App']/following::*[@id='app-item-delete'][1]
+# Scroll Element Into View xpath=//*[@id='div-app-name-SDC']/following::*[@id='app-item-delete'][1]
+# Click Element xpath=//*[@id='div-app-name-SDC']/following::*[@id='app-item-delete'][1]
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Click Button xpath=//button[@id='new-user-save-button']
+ #Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+ #Is Element Visible xpath=(//*[contains(.,'Portal')] )[2]
+ Element Should Not Contain xpath=//*[@table-data='users.accountUsers'] Portal
+ #Element Should Not Contain xpath=//*[@table-data='users.accountUsers'] demo
+ Set Selenium Implicit Wait 3000
+
+
+Functional Top Menu Get Access
+ [Documentation] Naviage to Support tab
+ Go To ${PORTAL_HOME_URL}
+ Click Link xpath=//a[contains(.,'Support')]
+ Mouse Over xpath=//*[contains(text(),'Get Access')]
+ Click Link xpath=//a[contains(.,'Get Access')]
+ Element Text Should Be xpath=//h1[contains(.,'Get Access')] Get Access
+ Set Selenium Implicit Wait 3000
+
+Functional Top Menu Contact Us
+ [Documentation] Naviage to Support tab
+ Click Link xpath=//a[contains(.,'Support')]
+ Mouse Over xpath=//*[contains(text(),'Contact Us')]
+ Click Link xpath=//a[contains(.,'Contact Us')]
+ Element Text Should Be xpath=//h1[contains(.,'Contact Us')] Contact Us
+ Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+
+Portal admin Edit Functional menu
+ [Documentation] Naviage to Edit Functional menu tab
+ Click Link xpath=//a[@title='Edit Functional Menu']
+ Click Link xpath=.//*[@id='Manage']/div/a
+ Click Link xpath=.//*[@id='Design']/div/a
+ Click Link xpath=.//*[@id='Product_Design']/div/a
+ Open Context Menu xpath=//*[@id='Product_Design']/div/span
+ Click Link xpath=//a[@href='#add']
+ Input Text xpath=//input[@id='input-title'] ONAP Test
+ #Input Text xpath=//input[@id='input-url'] http://google.com
+ Click Element xpath=//input[@id='select-app']
+ Scroll Element Into View xpath=//li[contains(.,'xDemo App')]
+ Click Element xpath=//li[contains(.,'xDemo App')]
+ Input Text xpath=//input[@id='input-url'] http://google.com
+ Click Button xpath=//button[@id='button-save-continue']
+ #Click Button xpath=//div[@title='Select Roles']
+ Click Element xpath=//*[@id='app-select-Select Roles']
+ Click Element xpath=//input[@id='Standard-User-checkbox']
+ Click Element xpath=//button[@id='button-save-add']
+ Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+ Click Link xpath=//a[contains(.,'Manage')]
+ Mouse Over xpath=//*[contains(text(),'Design')]
+ Set Selenium Implicit Wait 3000
+ Element Text Should Be xpath=//a[contains(.,'ONAP Test')] ONAP Test
+ Set Selenium Implicit Wait 3000
+ Click Image xpath=//img[@alt='Onap Logo']
+ Click Link xpath=//a[@title='Edit Functional Menu']
+ Click Link xpath=.//*[@id='Manage']/div/a
+ Click Link xpath=.//*[@id='Design']/div/a
+ Click Link xpath=.//*[@id='Product_Design']/div/a
+ Open Context Menu xpath=//*[@id='ONAP_Test']
+ Click Link xpath=//a[@href='#delete']
+ Set Selenium Implicit Wait 3000
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+ Click Link xpath=//a[contains(.,'Manage')]
+ Mouse Over xpath=//*[contains(text(),'Design')]
+ Set Selenium Implicit Wait 3000
+ Element Should Not Contain xpath=(.//*[contains(.,'Design')]/following::ul[1])[1] ONAP Test
+ Set Selenium Implicit Wait 3000
+ Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+
+Portal admin Microservice Onboarding
+ [Documentation] Naviage to Edit Functional menu tab
+ Click Link xpath=//a[@title='Microservice Onboarding']
+ Click Button xpath=//button[@id='microservice-onboarding-button-add']
+ Input Text xpath=//input[@name='name'] Test Microservice
+ Input Text xpath=//*[@name='desc'] Test
+ Click Element xpath=//input[@id='microservice-details-input-app']
+ Scroll Element Into View xpath=//li[contains(.,'xDemo App')]
+ Click Element xpath=//li[contains(.,'xDemo App')]
+ Click Element xpath=//*[@name='desc']
+ Input Text xpath=//input[@name='url'] ${PORTAL_MICRO_ENDPOINT}
+ Click Element xpath=//input[@id='microservice-details-input-security-type']
+ Scroll Element Into View xpath=//li[contains(.,'Basic Authentication')]
+ Click Element xpath=//li[contains(.,'Basic Authentication')]
+ Input Text xpath=//input[@name='username'] ${GLOBAL_PORTAL_ADMIN_USER}
+ Input Text xpath=//input[@name='password'] ${GLOBAL_PORTAL_ADMIN_PWD}
+ Click Button xpath=//button[@id='microservice-details-save-button']
+ Table Column Should Contain xpath=//*[@table-data='serviceList'] 1 Test Microservice
+ #Element Text Should Be xpath=//*[@table-data='serviceList'] Test Microservice
+ Set Selenium Implicit Wait 3000
+
+Portal admin Microservice Delete
+ [Documentation] Naviage to Edit Functional menu tab
+ Click Link xpath=//a[@title='Microservice Onboarding']
+ Click Button xpath=//button[@id='microservice-onboarding-button-add']
+ Input Text xpath=//input[@name='name'] TestMS
+ Input Text xpath=//*[@name='desc'] TestMS
+ Click Element xpath=//input[@id='microservice-details-input-app']
+ Scroll Element Into View xpath=//li[contains(.,'xDemo App')]
+ Click Element xpath=//li[contains(.,'xDemo App')]
+ Click Element xpath=//*[@name='desc']
+ Input Text xpath=//input[@name='url'] ${PORTAL_MICRO_ENDPOINT}
+ Click Element xpath=//input[@id='microservice-details-input-security-type']
+ Scroll Element Into View xpath=//li[contains(.,'Basic Authentication')]
+ Click Element xpath=//li[contains(.,'Basic Authentication')]
+ Input Text xpath=//input[@name='username'] ${GLOBAL_PORTAL_ADMIN_USER}
+ Input Text xpath=//input[@name='password'] ${GLOBAL_PORTAL_ADMIN_PWD}
+ Click Button xpath=//button[@id='microservice-details-save-button']
+ Execute Javascript window.scrollTo(0,document.body.scrollHeight);
+ Click Element xpath=(.//*[contains(text(),'TestMS')]/following::*[@ng-click='microserviceOnboarding.deleteService(rowData)'])[1]
+ Click Button xpath=//button[@id="div-confirm-ok-button"]
+ Set Selenium Implicit Wait 3000
+
+Portal Admin Create Widget for All users
+ [Documentation] Navigate to Create Widget menu tab
+ ${WidgetAttachment}= Catenate ${PORTAL_ASSETS_DIRECTORY}//news_widget.zip
+ Wait until page contains Element xpath=//a[@title='Widget Onboarding'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Click Link xpath=//a[@title='Widget Onboarding']
+ Click Button xpath=//button[@ng-click='toggleSidebar()']
+ Click Button xpath=//button[@id='widget-onboarding-button-add']
+ Input Text xpath=//*[@name='name'] ONAP-xDemo
+ Input Text xpath=//*[@name='desc'] ONAP xDemo
+ Click Element xpath=//*[@id='widgets-details-input-endpoint-url']
+ Scroll Element Into View xpath=//li[contains(.,'News Microservice')]
+ Click Element xpath=//li[contains(.,'News Microservice')]
+ Click Element xpath=//*[contains(text(),'Allow all user access')]/preceding::input[@ng-model='widgetOnboardingDetails.widget.allUser'][1]
+ Choose File xpath=//input[@id='widget-onboarding-details-upload-file'] ${WidgetAttachment}
+ Click Button xpath=//button[@id='widgets-details-save-button']
+ Wait Until Page Contains ONAP-xDemo ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Page Should Contain ONAP-xDemo
+ Set Selenium Implicit Wait 3000
+ GO TO ${PORTAL_HOME_PAGE}
+
+
+Portal Admin Delete Widget for All users
+ [Documentation] Naviage to delete Widget menu tab
+ #Wait Until Page Contains ONAP-xDemo ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ #Page Should Contain ONAP-xDemo
+ #Click Image xpath=//img[@alt='Onap Logo']
+ Click Link xpath=//a[@title='Widget Onboarding']
+ Click Element xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'xDemo App')]
+ #Wait Until Page Contains xpath=(.//*[contains(text(),'ONAP-xDemo')]/followi
+ #Wait Until Page Contains xpath=(.//*[contains(text(),'ONAP-xDemo')]/following::*[@ng-click='widgetOnboarding.deleteWidget(rowData)'])[1] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Click Button xpath=//button[@ng-click='toggleSidebar()']
+ Click Element xpath=(.//*[contains(text(),'ONAP-xDemo')]/following::*[@ng-click='widgetOnboarding.deleteWidget(rowData)'])[1]
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Set Selenium Implicit Wait 3000
+ Element Should Not Contain xpath=//*[@table-data='portalAdmin.portalAdminsTableData'] ONAP-xDemo
+ #Is Element Visible xpath=//*[@table-data='portalAdmin.portalAdminsTableData']
+ #Table Column Should Contain .//*[@table-data='portalAdmin.portalAdminsTableData'] 0 ONAP-xDemo
+ #Set Selenium Implicit Wait 3000
+
+Portal Admin Create Widget for Application Roles
+ [Documentation] Naviage to Create Widget menu tab
+ ${WidgetAttachment}= Catenate ${PORTAL_ASSETS_DIRECTORY}//news_widget.zip
+ Click Link xpath=//a[@title='Widget Onboarding']
+ Click Button xpath=//button[@ng-click='toggleSidebar()']
+ Click Button xpath=//button[@id='widget-onboarding-button-add']
+ Input Text xpath=//*[@name='name'] ONAP-xDemo
+ Input Text xpath=//*[@name='desc'] ONAP xDemo
+ Click Element xpath=//*[@id='widgets-details-input-endpoint-url']
+ Scroll Element Into View xpath=//li[contains(.,'News Microservice')]
+ Click Element xpath=//li[contains(.,'News Microservice')]
+ Click element xpath=//*[@id="app-select-Select Applications"]
+ click element xpath=//*[@id="xDemo-App-checkbox"]
+ Click element xpath=//*[@name='desc']
+ click element xpath=//*[@id="app-select-Select Roles0"]
+ click element xpath=//*[@id="Standard-User-checkbox"]
+ Click element xpath=//*[@name='desc']
+ Scroll Element Into View xpath=//input[@id='widget-onboarding-details-upload-file']
+ Choose File xpath=//input[@id='widget-onboarding-details-upload-file'] ${WidgetAttachment}
+ Click Button xpath=//button[@id='widgets-details-save-button']
+ Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+ #Wait Until Page Contains ONAP-xDemo ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Click Link xpath=//a[@title='Widget Onboarding']
+ Click Element xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'xDemo App')]
+ Page Should Contain ONAP-xDemo
+ Set Selenium Implicit Wait 3000
+ GO TO ${PORTAL_HOME_PAGE}
+
+Portal Admin Delete Widget for Application Roles
+ #Wait Until Page Contains ONAP-xDemo ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ #Page Should Contain ONAP-xDemo
+ #Click Image xpath=//img[@alt='Onap Logo']
+ Click Link xpath=//a[@title='Widget Onboarding']
+ Click Element xpath=//input[@id='dropdown1']
+ Click Element xpath=//li[contains(.,'xDemo App')]
+ #Wait Until Page Contains xpath=(.//*[contains(text(),'ONAP-xDemo')]/followi
+ #Wait Until Page Contains xpath=(.//*[contains(text(),'ONAP-xDemo')]/following::*[@ng-click='widgetOnboarding.deleteWidget(rowData)'])[1] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Click Button xpath=//button[@ng-click='toggleSidebar()']
+ Scroll Element Into View xpath=//*[contains(text(),'ONAP-xDemo')]/following::td[3]/div
+ Click Element xpath=//*[contains(text(),'ONAP-xDemo')]/following::td[3]/div
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Set Selenium Implicit Wait 3000
+ Element Should Not Contain xpath=//*[@table-data='portalAdmin.portalAdminsTableData'] ONAP-xDemo
+ #Is Element Visible xpath=//*[@table-data='portalAdmin.portalAdminsTableData']
+ #Table Column Should Contain .//*[@table-data='portalAdmin.portalAdminsTableData'] 0 ONAP-xDemo
+ Set Selenium Implicit Wait 3000
+
+
+
+Portal Admin Edit Widget
+ [Documentation] Naviage to Home tab
+ #Mouse Over xpath=(//h3[contains(text(),'News')]/following::span[1])[1]
+ Click Element xpath=(//h3[contains(text(),'News')]/following::span[1])[1]
+ Set Browser Implicit Wait 8000
+ #Wait Until Element Is Visible xpath=(//h3[contains(text(),'News')]/following::span[1]/following::a[contains(text(),'Edit')])[1] 60
+ Mouse Over xpath=(//h3[contains(text(),'News')]/following::span[1]/following::a[contains(text(),'Edit')])[1]
+ Click Link xpath=(//h3[contains(text(),'News')]/following::span[1]/following::a[contains(text(),'Edit')])[1]
+ Input Text xpath=//input[@name='title'] ONAP_VID
+ Input Text xpath=//input[@name='url'] http://about.att.com/news/international.html
+ Input Text xpath=//input[@id='widget-input-add-order'] 5
+ Click Link xpath=//a[contains(.,'Add New')]
+ Click Element xpath=//div[@id='close-button']
+ Element Should Contain xpath=//*[@table-data='ignoredTableData'] ONAP_VID
+ Click Element xpath=.//div[contains(text(),'ONAP_VID')]/following::*[contains(text(),'5')][1]/following::div[@ng-click='remove($index);'][1]
+ Click Element xpath=//div[@id='confirmation-button-next']
+ Element Should Not Contain xpath=//*[@table-data='ignoredTableData'] ONAP_VID
+ Click Link xpath=//a[@id='close-button']
+ Set Selenium Implicit Wait 3000
+
+Portal Admin Broadcast Notifications
+ [Documentation] Portal Test Admin Broadcast Notifications
+ ${CurrentDay}= Get Current Date increment=24:00:00 result_format=%m/%d/%Y
+ ${NextDay}= Get Current Date increment=48:00:00 result_format=%m/%d/%Y
+ ${CurrentDate}= Get Current Date increment=24:00:00 result_format=%m%d%y%H%M
+ ${AdminBroadCastMsg}= catenate ONAP VID Broadcast Automation${CurrentDate}
+ Go To ${PORTAL_HOME_URL}
+ Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+ Click Link xpath=//*[@id="parent-item-User-Notifications"]
+ Wait until Element is visible xpath=//*[@id="button-openAddNewApp"] timeout=10
+ Click button xpath=//*[@id="button-openAddNewApp"]
+ Input Text xpath=//input[@id='datepicker-start'] ${CurrentDay}
+ Input Text xpath=//input[@id='datepicker-end'] ${NextDay}
+ Input Text xpath=//*[@id="add-notification-input-title"] ONAP VID Broadcast Automation
+ Input Text xpath=//*[@id="user-notif-input-message"] ${AdminBroadCastMsg}
+ click element xpath=//*[@id="button-notification-save"]
+ Wait until Element is visible xpath=//*[@id="button-openAddNewApp"] timeout=10
+ click element xpath=//*[@id="megamenu-notification-button"]
+ click element xpath=//*[@id="notification-history-link"]
+# Notification bug, Uncomment the code when PORTAL-232 is fixed
+ # Wait until Element is visible xpath=//*[@id="notification-history-table"] timeout=10
+ # Table Column Should Contain xpath=//*[@id="notification-history-table"] 2 ${AdminBroadCastMsg}
+ Set Selenium Implicit Wait 3000
+ log ${AdminBroadCastMsg}
+ [Return] ${AdminBroadCastMsg}
+
+Portal Admin Category Notifications
+ [Documentation] Portal Admin Broadcast Notifications
+ ${CurrentDay}= Get Current Date increment=24:00:00 result_format=%m/%d/%Y
+ ${NextDay}= Get Current Date increment=48:00:00 result_format=%m/%d/%Y
+# ${CurrentDay}= Get Current Date result_format=%m/%d/%Y
+ ${CurrentDate}= Get Current Date increment=24:00:00 result_format=%m%d%y%H%M
+ ${AdminCategoryMsg}= catenate ONAP VID Category Automation${CurrentDate}
+ Click Link xpath=//a[@id='parent-item-Home']
+ Click Link xpath=//*[@id="parent-item-User-Notifications"]
+ Wait until Element is visible xpath=//*[@id="button-openAddNewApp"] timeout=10
+ Click button xpath=//*[@id="button-openAddNewApp"]
+ #Select Radio Button NO radio-button-no
+ Click Element //*[contains(text(),'Broadcast to All Categories')]/following::*[contains(text(),'No')][1]
+ #Select Radio Button //label[@class='radio'] radio-button-approles
+ Click Element xpath=//*[contains(text(),'Categories')]/following::*[contains(text(),'Application Roles')][1]
+ Click Element xpath=//*[contains(text(),'xDemo App')]/preceding::input[@ng-model='member.isSelected'][1]
+ Input Text xpath=//input[@id='datepicker-start'] ${CurrentDay}
+ Input Text xpath=//input[@id='datepicker-end'] ${NextDay}
+ Input Text xpath=//*[@id="add-notification-input-title"] ONAP VID Category Automation
+ Input Text xpath=//*[@id='user-notif-input-message'] ${AdminCategoryMsg}
+ click element xpath=//*[@id="button-notification-save"]
+ Wait until Element is visible xpath=//*[@id="button-openAddNewApp"] timeout=10
+ click element xpath=//*[@id="megamenu-notification-button"]
+ click element xpath=//*[@id="notification-history-link"]
+# Notification bug, Uncomment the code when PORTAL-232 is fixed
+ # Wait until Element is visible xpath=//*[@id="notification-history-table"] timeout=10
+ # Table Column Should Contain xpath=//*[@id="notification-history-table"] 2 ${AdminCategoryMsg}
+ Set Selenium Implicit Wait 3000
+ log ${AdminCategoryMsg}
+ [Return] ${AdminCategoryMsg}
+
+Portal admin Logout from Portal GUI
+ [Documentation] Logout from Portal GUI
+ Click Element xpath=//div[@id='header-user-icon']
+ Click Button xpath=//button[contains(.,'Log out')]
+ Title Should Be Login
+
+Application admin Login To Portal GUI
+ [Documentation] Logs into Portal GUI
+ # Setup Browser Now being managed by test case
+ ##Setup Browser
+# Go To ${PORTAL_LOGIN_URL}
+# Maximize Browser Window
+# Set Selenium Speed ${GLOBAL_SELENIUM_DELAY}
+# Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+# Log Logging in to ${PORTAL_URL}${PORTAL_ENV}
+ # Handle Proxy Warning
+ Title Should Be Login
+ Input Text xpath=//input[@ng-model='loginId'] ${App_LoginID}
+ Input Password xpath=//input[@ng-model='password'] ${App_Loginpwd}
+ Click Link xpath=//a[@id='loginBtn']
+ Wait Until Page Contains Element xpath=//img[@alt='Onap Logo'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Log Logged in to ${PORTAL_URL}${PORTAL_ENV}
+
+Application Admin Navigation Application Link Tab
+ [Documentation] Logs into Portal GUI as application admin
+ Click Link xpath=//a[@id='parent-item-Home']
+ Click Element xpath=.//h3[contains(text(),'xDemo App')]/following::div[1]
+ Page Should Contain ONAP Portal
+ Scroll Element Into View xpath=//i[@class='ion-close-round']
+ Click Element xpath=//i[@class='ion-close-round']
+ Set Selenium Implicit Wait 3000
+ #Click Element xpath=(.//span[@id='tab-Home'])[1]
+
+
+Application Admin Navigation Functional Menu
+ [Documentation] Logs into Portal GUI as application admin
+ Click Link xpath=//a[contains(.,'Manage')]
+ Mouse Over xpath=//*[contains(text(),'Technology Insertion')]
+ Click Link xpath= //*[contains(text(),'Infrastructure VNF Provisioning')]
+ Page Should Contain ONAP Portal
+ Click Element xpath=//i[@class='ion-close-round']
+ Click Element xpath=(.//span[@id='tab-Home'])[1]
+
+
+Application admin Add Standard User Existing user
+ [Documentation] Naviage to Users tab
+ Click Link xpath=//a[@title='Users']
+ Page Should Contain Users
+ Click Button xpath=//button[@ng-click='toggleSidebar()']
+ Click Button xpath=//button[@ng-click='users.openAddNewUserModal()']
+ Input Text xpath=//input[@id='input-user-search'] ${Existing_User}
+ Click Button xpath=//button[@id='button-search-users']
+ Click Element xpath=//span[@id='result-uuid-0']
+ Click Button xpath=//button[@id='next-button']
+ Click Element xpath=//*[@id='div-app-name-dropdown-xDemo-App']
+ Click Element xpath=//*[@id='div-app-name-xDemo-App']/following::input[@id='Standard-User-checkbox']
+ # Click Element xpath=//*[@id='div-app-name-dropdown-Default']
+ # Click Element xpath=//*[@id='div-app-name-Default']/following::input[@id='Standard-User-checkbox']
+ # Set Selenium Implicit Wait 3000
+ Click Button xpath=//button[@id='new-user-save-button']
+ Set Selenium Implicit Wait 3000
+ #Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+ #Select From List xpath=//input[@value='Select application'] xDemo App
+ #Click Link xpath=//a[@title='Users']
+ #Page Should Contain Users
+ Go To ${PORTAL_HOME_PAGE}
+ Set Selenium Implicit Wait 3000
+ Click Link xpath=//a[@title='Users']
+ Click Element xpath=//input[@id='dropdown1']
+ #Click Element xpath=//li[contains(.,'Default')]
+ Click Element xpath=//li[contains(.,'xDemo App')]
+ Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+ # Element Text Should Be xpath=(.//*[@id='rowheader_t1_0'])[2] Account Administrator
+ Element Text Should Be xpath=(.//*[@id='rowheader_t1_0'])[2] Standard User
+
+Application admin Edit Standard User Existing user
+ [Documentation] Naviage to Users tab
+ Click Element xpath=(.//*[@id='rowheader_t1_0'])[2]
+ # Click Element xpath=//*[@id='div-app-name-dropdown-Default']
+ # Click Element xpath=//*[@id='div-app-name-Default']/following::input[@id='Standard-User-checkbox']
+ # Click Element xpath=//*[@id='div-app-name-Default']/following::input[@id='Portal-Notification-Admin-checkbox']
+ Click Element xpath=//*[@id='div-app-name-dropdown-xDemo-App']
+ Click Element xpath=//*[@id='div-app-name-xDemo-App']/following::input[@id='Standard-User-checkbox']
+ Click Element xpath=//*[@id='div-app-name-xDemo-App']/following::input[@id='System-Administrator-checkbox']
+ Set Selenium Implicit Wait 3000
+ Click Button xpath=//button[@id='new-user-save-button']
+ Set Selenium Implicit Wait 3000
+ Page Should Contain Users
+ #Click Button xpath=//input[@id='dropdown1']
+ #Click Element xpath=//li[contains(.,'xDemo App')]
+ Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+ # Element Text Should Be xpath=(.//*[@id='rowheader_t1_0'])[2] Account Administrator
+ Element Text Should Be xpath=(.//*[@id='rowheader_t1_0'])[2] System Administrator
+
+Application admin Delete Standard User Existing user
+ [Documentation] Naviage to Users tab
+ Click Element xpath=(.//*[@id='rowheader_t1_0'])[2]
+# Scroll Element Into View xpath=//*[@id='div-app-name-Default']/following::*[@id='app-item-delete'][1]
+# Click Element xpath=//*[@id='div-app-name-Default']/following::*[@id='app-item-delete'][1]
+ Scroll Element Into View xpath=//*[@id='div-app-name-xDemo-App']/following::*[@id='app-item-delete'][1]
+ Click Element xpath=//*[@id='div-app-name-xDemo-App']/following::*[@id='app-item-delete'][1]
+ Click Element xpath=//button[@id='div-confirm-ok-button']
+ Click Button xpath=//button[@id='new-user-save-button']
+# Input Text xpath=//input[@id='input-table-search'] ${Existing_User}
+# Is Element Visible xpath=(//*[contains(.,'Portal')] )[2]
+ Element Should Not Contain xpath=//*[@table-data='users.accountUsers'] Portal
+ #Click Image xpath=//img[@alt='Onap Logo']
+ Set Selenium Implicit Wait 3000
+
+Application admin Logout from Portal GUI
+ [Documentation] Logout from Portal GUI
+ Click Element xpath=//div[@id='header-user-icon']
+ #Set Selenium Implicit Wait 3000
+ Click Button xpath=//button[contains(text(),'Log out')]
+ #Set Selenium Implicit Wait 3000
+ Title Should Be Login
+
+Standared user Login To Portal GUI
+ [Documentation] Logs into Portal GUI
+ # Setup Browser Now being managed by test case
+ ##Setup Browser
+# Go To ${PORTAL_LOGIN_URL}
+# Maximize Browser Window
+# Set Selenium Speed ${GLOBAL_SELENIUM_DELAY}
+# Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+# Log Logging in to ${PORTAL_URL}${PORTAL_ENV}
+ # Handle Proxy Warning
+ Title Should Be Login
+ Input Text xpath=//input[@ng-model='loginId'] ${Sta_LoginID}
+ Input Password xpath=//input[@ng-model='password'] ${Sta_Loginpwd}
+ Click Link xpath=//a[@id='loginBtn']
+ Wait Until Page Contains Element xpath=//img[@alt='Onap Logo'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Log Logged in to ${PORTAL_URL}${PORTAL_ENV}
+
+Standared user Navigation Application Link Tab
+ [Documentation] Logs into Portal GUI as application admin
+ #Portal admin Go To Portal HOME
+ Click Element xpath=.//h3[contains(text(),'xDemo App')]/following::div[1]
+ Page Should Contain ONAP Portal
+ Click Element xpath=(.//span[@id='tab-Home'])[1]
+ Set Selenium Implicit Wait 3000
+
+Standared user Navigation Functional Menu
+ [Documentation] Logs into Portal GUI as application admin
+ Click Link xpath=//a[contains(.,'Manage')]
+ Mouse Over xpath=//*[contains(text(),'Technology Insertion')]
+ Click Link xpath= //*[contains(text(),'Infrastructure VNF Provisioning')]
+ Page Should Contain Welcome to VID
+ Click Element xpath=(.//span[@id='tab-Home'])[1]
+ Set Selenium Implicit Wait 3000
+
+
+Standared user Broadcast Notifications
+ [Documentation] Logs into Portal GUI as application admin
+ [Arguments] ${AdminBroadCastMsg}
+ Click element xpath=//*[@id='megamenu-notification-button']
+ Click element xpath=//*[@id='notification-history-link']
+ Wait until Element is visible xpath=//*[@id='app-title'] timeout=10
+ Table Column Should Contain xpath=//*[@id='notification-history-table'] 2 ${AdminBroadCastMsg}
+ log ${AdminBroadCastMsg}
+
+
+Standared user Category Notifications
+ [Documentation] Logs into Portal GUI as application admin
+ [Arguments] ${AdminCategoryMsg}
+ #click element xpath=//*[@id='megamenu-notification-button']
+ #click element xpath=//*[@id="notification-history-link"]
+ Wait until Element is visible xpath=//*[@id='app-title'] timeout=10
+ Table Column Should Contain xpath=//*[@id='notification-history-table'] 2 ${AdminCategoryMsg}
+ log ${AdminCategoryMsg}
+
+Standared user Logout from Portal GUI
+ [Documentation] Logout from Portal GUI
+ Click Element xpath=//div[@id='header-user-icon']
+ Click Button xpath=//button[contains(.,'Log out')]
+ #Confirm Action
+ Title Should Be Login
+
+Portal admin Add New Account
+ Click Link //*[@id="parent-item-App-Account-Management"]
+ Click Button xpath=//button[@ng-click='toggleSidebar()']
+ Set Selenium Implicit Wait 3000
+ Click Button //*[@id="account-onboarding-button-add"]
+ Set Selenium Implicit Wait 3000
+ Input Text //*[@id="account-details-input-name"] ${AppAccountName}
+ Input Text //*[@id="account-details-input-username"] ${AppUserName}
+ Input Text //*[@id="account-details-input-password"] ${AppPassword}
+ Input Text //*[@id="account-details-input-repassword"] ${AppPassword}
+ # Click Button xpath=//*[@ng-click='accountAddDetails.saveChanges()']
+ # #Click Button xpath=//button[@ng-click='admins.openAddNewAdminModal()']
+ #account-details-next-button
+ Click Button xpath=//button[@ng-click='accountAddDetails.saveChanges()']
+
+Portal admin Delete Account
+ Click Link //*[@id="parent-item-App-Account-Management"]
+ Click Button xpath=//button[@ng-click='toggleSidebar()']
+ Set Selenium Implicit Wait 3000
+ Click Button //*[@id="account-onboarding-button-add"]
+ Set Selenium Implicit Wait 3000
+
+Tear Down
+ [Documentation] Close all browsers
+ Close All Browsers
+
+Enhanced Notification on ONAP Portal
+ [Documentation] Runs portal Post request
+ [Arguments] ${data_path} ${data}
+ # Log Creating session ${GLOBAL_PORTAL_SERVER_URL}
+ ${session}= Create Session portal ${PORTAL_URL}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json Authorization=Basic amlyYTpfcGFzcw== username=jira password=_pass
+ ${resp}= Post Request portal ${data_path} data=${data} headers=${headers}
+ # Log Received response from portal ${resp.text}
+ [Return] ${resp}
+
+Notification on ONAP Portal
+ [Documentation] Create Config portal
+ ${configportal}= Create Dictionary jira_id=${jira}
+ ${output} = Fill JSON Template File ${portal_Template} ${configportal}
+ ${post_resp} = Enhanced Notification on ONAP Portal ${RESOURCE_PATH} ${output}
+ Should Be Equal As Strings ${post_resp.status_code} 200
+
+Portal Application Account Management
+ [Documentation] Naviage to Application Account Management tab
+ Click Link xpath=//a[@title='App Account Management']
+ Click Button xpath=//button[@id='account-onboarding-button-add']
+ Input Text xpath=//input[@name='name'] JIRA
+ Input Text xpath=//input[@name='username'] jira
+ Input Text xpath=//input[@name='password'] _pass
+ Input Text xpath=//input[@name='repassword'] _pass
+ Click Element xpath=//div[@ng-click='accountAddDetails.saveChanges()']
+ Element Text Should Be xpath=//*[@table-data='serviceList'] JIRA
+
+Portal Application Account Management validation
+ [Documentation] Naviage to user notification tab
+ Click Link xpath=//a[@id='parent-item-User-Notifications']
+ click element xpath=//*[@id="megamenu-notification-button"]
+ Click element xpath=//*[@id="notification-history-link"]
+ Wait until Element is visible xpath=//*[@id="notification-history-table"] timeout=10
+ Table Column Should Contain xpath=//*[@id="notification-history-table"] 1 JIRA
+
+
+Portal AAF new fields
+ [Documentation] Naviage to user Application details tab
+ Click Link xpath=//a[@title='Application Onboarding']
+ Click Element xpath=//td[contains(.,'xDemo App')]
+ Page Should Contain Name Space
+ Page Should Contain Centralized
+ Click Element xpath=//button[@id='button-notification-cancel']
+ Set Selenium Implicit Wait 3000
+
+Portal Change REST URL
+ [Documentation] Naviage to user Application details tab
+ Click Link xpath=//a[@title='Application Onboarding']
+ Click Element xpath=//td[contains(.,'xDemo App')]
+ Input Text xpath=//input[@name='restUrl'] ${PORTAL_XDEMPAPP_REST_URL}
+ Click Element xpath=//button[@id='button-save-app']
+ Set Selenium Implicit Wait 6000
+ Go To ${PORTAL_HOME_PAGE}
+ Wait Until Element Is Visible xpath=//a[@title='Application Onboarding'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+
+Admin widget download
+ Go To ${PORTAL_HOME_URL}
+ Wait until page contains Element xpath=//a[@title='Widget Onboarding'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ click Link xpath=//a[@title='Widget Onboarding']
+ Wait until page contains Element xpath=//table[@class='ng-scope']
+ ${td_id}= get element attribute xpath=//*[contains(text(),'Events')]@id
+ log ${td_id}
+ ${test}= Get Substring ${td_id} -1
+ log ${test}
+ ${download_link_id}= Catenate 'widget-onboarding-div-download-widget-${test}'
+ click Element xpath=//*[@id=${download_link_id}]
+
+Reset widget layout option
+ Go To ${PORTAL_HOME_URL}
+ Wait Until Page Contains Element xpath=//div[@id='widget-boarder'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Execute Javascript document.getElementById('widgets').scrollTo(0,1400)
+ Wait Until Page Contains Element xpath=//*[@id='widget-gridster-Events-icon'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Execute Javascript document.getElementById('widgets').scrollTo(0,1800)
+ Drag And Drop By Offset xpath=//*[@id='widget-gridster-Events-icon'] 500 500
+ Execute Javascript document.getElementById('widgets').scrollTo(0,document.getElementById('widgets').scrollHeight);
+ Execute Javascript document.getElementById('dashboardDefaultPreference').click()
+ Execute Javascript document.getElementById('div-confirm-ok-button').click()
+
+Add Portal Admin
+ Click Link xpath=//a[@id='parent-item-Portal-Admins']
+ Scroll Element Into View xpath=//button[@id='portal-admin-button-add']
+ Click Button xpath=//button[@id='portal-admin-button-add']
+ Input Text xpath=//input[@id='input-user-search'] ${Existing_User}
+ Click Button xpath=//button[@id='button-search-users']
+ Wait Until Page Contains Element xpath=//span[@id='result-uuid-0'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Click Element xpath=//span[@id='result-uuid-0']
+ Click Button xpath=//button[@id='pa-search-users-button-save']
+ Click Button xpath=//button[@id='admin-div-ok-button']
+
+
+Delete Portal Admin
+ Wait Until Page Does Not Contain Element xpath=//*[@class='b2b-modal-header']
+ Click Link xpath=//a[@id='parent-item-Portal-Admins']
+ Click Element xpath=//td[contains(.,'portal')]/following::span[@id='1-button-portal-admin-remove']
+ Click Button xpath=//*[@id='div-confirm-ok-button']
diff --git a/tests/portal/testsuites/widget_news.zip b/tests/portal/testsuites/widget_news.zip
new file mode 100644
index 00000000..5c3217be
--- /dev/null
+++ b/tests/portal/testsuites/widget_news.zip
Binary files differ
diff --git a/tests/sdc/nightly/__init__.robot b/tests/sdc/nightly/__init__.robot
new file mode 100644
index 00000000..8ee10d5f
--- /dev/null
+++ b/tests/sdc/nightly/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Sdc - HealthCheck
diff --git a/tests/sdc/nightly/test1.robot b/tests/sdc/nightly/test1.robot
new file mode 100644
index 00000000..3705d8f5
--- /dev/null
+++ b/tests/sdc/nightly/test1.robot
@@ -0,0 +1,16 @@
+*** Settings ***
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Library json
+
+*** Test Cases ***
+Get Requests health check ok
+ [Tags] get
+ CreateSession sdc-be http://localhost:8181
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ ${resp}= Get Request sdc-be /sdc1/rest/healthCheck headers=&{headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ @{ITEMS}= Copy List ${resp.json()['componentsInfo']}
+ : FOR ${ELEMENT} IN @{ITEMS}
+ \ Log ${ELEMENT['healthCheckComponent']} ${ELEMENT['healthCheckStatus']}
diff --git a/tests/sdc/sanity/__init__.robot b/tests/sdc/sanity/__init__.robot
new file mode 100644
index 00000000..8ee10d5f
--- /dev/null
+++ b/tests/sdc/sanity/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Sdc - HealthCheck
diff --git a/tests/sdc/sanity/test1.robot b/tests/sdc/sanity/test1.robot
new file mode 100644
index 00000000..3705d8f5
--- /dev/null
+++ b/tests/sdc/sanity/test1.robot
@@ -0,0 +1,16 @@
+*** Settings ***
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Library json
+
+*** Test Cases ***
+Get Requests health check ok
+ [Tags] get
+ CreateSession sdc-be http://localhost:8181
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ ${resp}= Get Request sdc-be /sdc1/rest/healthCheck headers=&{headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ @{ITEMS}= Copy List ${resp.json()['componentsInfo']}
+ : FOR ${ELEMENT} IN @{ITEMS}
+ \ Log ${ELEMENT['healthCheckComponent']} ${ELEMENT['healthCheckStatus']}
diff --git a/tests/sdc/uiSanity/__init__.robot b/tests/sdc/uiSanity/__init__.robot
new file mode 100644
index 00000000..8ee10d5f
--- /dev/null
+++ b/tests/sdc/uiSanity/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Sdc - HealthCheck
diff --git a/tests/sdc/uiSanity/test1.robot b/tests/sdc/uiSanity/test1.robot
new file mode 100644
index 00000000..3705d8f5
--- /dev/null
+++ b/tests/sdc/uiSanity/test1.robot
@@ -0,0 +1,16 @@
+*** Settings ***
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Library json
+
+*** Test Cases ***
+Get Requests health check ok
+ [Tags] get
+ CreateSession sdc-be http://localhost:8181
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ ${resp}= Get Request sdc-be /sdc1/rest/healthCheck headers=&{headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ @{ITEMS}= Copy List ${resp.json()['componentsInfo']}
+ : FOR ${ELEMENT} IN @{ITEMS}
+ \ Log ${ELEMENT['healthCheckComponent']} ${ELEMENT['healthCheckStatus']}
diff --git a/tests/sdnc/healthcheck/__init__.robot b/tests/sdnc/healthcheck/__init__.robot
new file mode 100644
index 00000000..8dac1b6a
--- /dev/null
+++ b/tests/sdnc/healthcheck/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation SDNC - healthcheck
diff --git a/tests/sdnc/healthcheck/data/data.json b/tests/sdnc/healthcheck/data/data.json
new file mode 100644
index 00000000..583e26fb
--- /dev/null
+++ b/tests/sdnc/healthcheck/data/data.json
@@ -0,0 +1,4 @@
+{
+ "input" : {
+ }
+}
diff --git a/tests/sdnc/healthcheck/data/preload.json b/tests/sdnc/healthcheck/data/preload.json
new file mode 100644
index 00000000..b53afa85
--- /dev/null
+++ b/tests/sdnc/healthcheck/data/preload.json
@@ -0,0 +1,41 @@
+{
+ "input": {
+ "vnf-topology-information": {
+ "vnf-topology-identifier": {
+ "service-type": "robot_demo",
+ "vnf-name": "vf_robot_module",
+ "vnf-type": "vf_robot_type",
+ "generic-vnf-name": "generic_vnf_name",
+ "generic-vnf-type": "generic_vnf_type"
+ },
+ "vnf-assignments": {
+ "availability-zones": [],
+ "vnf-networks": [],
+ "vnf-vms": []
+ },
+ "vnf-parameters": [
+ {
+ "vnf-parameter-name": "ngm1_management_ip_0",
+ "vnf-parameter-value":"127.0.0.1"
+ },
+ {
+ "vnf-parameter-name": "ngm2_management_ip_1",
+ "vnf-parameter-value":"127.0.0.2"
+ }
+ ]
+ },
+ "request-information": {
+ "request-id": "robot12",
+ "order-version": "1",
+ "notification-url": "openecomp.org",
+ "order-number": "1",
+ "request-action": "PreloadVNFRequest"
+ },
+ "sdnc-request-header": {
+ "svc-request-id": "robot12",
+ "svc-notification-url": "http:\/\/openecomp.org:8080\/adapters\/rest\/SDNCNotify",
+ "svc-action": "reserve"
+ }
+ }
+}
+
diff --git a/tests/sdnc/healthcheck/test1.robot b/tests/sdnc/healthcheck/test1.robot
new file mode 100644
index 00000000..c002a189
--- /dev/null
+++ b/tests/sdnc/healthcheck/test1.robot
@@ -0,0 +1,44 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library String
+
+*** Variables ***
+${SDN_APIDOCS_URI} /apidoc/apis
+${SDN_HEALTHCHECK_OPERATION_PATH} /operations/SLI-API:healthcheck
+${PRELOAD_VNF_TOPOLOGY_OPERATION_PATH} /operations/VNF-API:preload-vnf-topology-operation
+
+*** Test Cases ***
+
+Healthcheck API
+ Create Session sdnc http://localhost:8282/restconf
+ ${data}= Get File ${CURDIR}${/}data${/}data.json
+ &{headers}= Create Dictionary Authorization=Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ== Content-Type=application/json Accept=application/json
+ ${resp}= Post Request sdnc ${SDN_HEALTHCHECK_OPERATION_PATH} data=${data} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Be Equal As Strings ${resp.json()['output']['response-code']} 200
+
+Check SLI-API
+ Create Session sdnc http://localhost:8282
+ &{headers}= Create Dictionary Authorization=Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ== Content-Type=application/json Accept=application/json
+ ${resp}= Get Request sdnc ${SDN_APIDOCS_URI} headers=${headers}
+ Log ${resp.text}
+ Should Contain ${resp.text} SLI-API
+
+Check VNF-API
+ Create Session sdnc http://localhost:8282
+ &{headers}= Create Dictionary Authorization=Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ== Content-Type=application/json Accept=application/json
+ ${resp}= Get Request sdnc ${SDN_APIDOCS_URI} headers=${headers}
+ Log ${resp.text}
+ Should Contain ${resp.text} VNF-API
+
+Test Preload
+ Create Session sdnc http://localhost:8282/restconf
+ ${data}= Get File ${CURDIR}${/}data${/}preload.json
+ &{headers}= Create Dictionary Authorization=Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ== Content-Type=application/json Accept=application/json
+ ${resp}= Post Request sdnc ${PRELOAD_VNF_TOPOLOGY_OPERATION_PATH} data=${data} headers=${headers}
+ Log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Be Equal As Strings ${resp.json()['output']['response-code']} 200
diff --git a/tests/so/sanity-check/data/activateService.json b/tests/so/sanity-check/data/activateService.json
new file mode 100644
index 00000000..e2f749f7
--- /dev/null
+++ b/tests/so/sanity-check/data/activateService.json
@@ -0,0 +1,23 @@
+{
+"requestDetails": {
+"modelInfo": {
+"modelType": "service",
+"modelInvariantId": "ff3514e3-5a33-55df-13ab-12abad84e7ff",
+"modelNameVersionId": "fe6985cd-ea33-3346-ac12-ab121484a3fe",
+"modelName": "Test",
+"modelVersion": "1.0"
+},
+"requestInfo": {
+"source": "VID",
+"requestorId": "az2016"
+},
+"requestParameters": {
+"userParams": [
+{
+"name": "aic_zone",
+"value": "someValue"
+}
+]
+}
+}
+}
diff --git a/tests/so/sanity-check/data/createE2eservice.json b/tests/so/sanity-check/data/createE2eservice.json
new file mode 100644
index 00000000..b8bac167
--- /dev/null
+++ b/tests/so/sanity-check/data/createE2eservice.json
@@ -0,0 +1,100 @@
+{
+ "service":{
+"name":"so_test5",
+"description":"so_test2",
+ "serviceDefId":"60c3e96e-0970-4871-b6e0-3b6de7561519",
+"templateId":"592f9437-a9c0-4303-b9f6-c445bb7e9814",
+ "parameters":{
+ "globalSubscriberId":"123457",
+ "subscriberName":"Customer1",
+ "serviceType":"voLTE",
+"templateName":"voLTE Service:1.0",
+ "resources":[
+ {
+"resourceName":"vIMS",
+ "resourceDefId":"60c3e96e-0970-4871-b6e0-3b6de7561516",
+ "resourceId":"60c3e96e-0970-4871-b6e0-3b6de7561512",
+"nsParameters":{
+ "locationConstraints":[
+ {
+"vnfProfileId":"zte-vBAS-1.0",
+ "locationConstraints":{
+ "vimId":"4050083f-465f-4838-af1e-47a545222ad0"
+ }
+},
+ {
+ "vnfProfileId":"zte-vMME-1.0",
+ "locationConstraints":{
+ "vimId":"4050083f-465f-4838-af1e-47a545222ad0"
+ }
+ }
+ ],
+ "additionalParamForNs":{
+
+ }
+}
+ },
+ {
+ "resourceName":"vEPC",
+ "resourceDefId":"61c3e96e-0970-4871-b6e0-3b6de7561516",
+ "resourceId":"62c3e96e-0970-4871-b6e0-3b6de7561512",
+ "nsParameters":{
+"locationConstraints":[
+ {
+"vnfProfileId":"zte-CSCF-1.0",
+"locationConstraints":{
+ "vimId":"4050083f-465f-4838-af1e-47a545222ad1"
+}
+ }
+ ],
+"additionalParamForNs":{
+
+ }
+ }
+ },
+ {
+ "resourceName":"underlayvpn",
+"resourceDefId":"60c3e96e-0970-4871-b6e0-3b6de7561513",
+ "resourceId":"60c3e96e-0970-4871-b6e0-3b6de7561514",
+"nsParameters":{
+"locationConstraints":[
+
+ ],
+"additionalParamForNs":{
+ "externalDataNetworkName":"Flow_out_net",
+"m6000_mng_ip":"181.18.20.2",
+ "externalCompanyFtpDataNetworkName":"Flow_out_net",
+ "externalPluginManageNetworkName":"plugin_net_2014",
+ "externalManageNetworkName":"mng_net_2017",
+ "sfc_data_network":"sfc_data_net_2016",
+"NatIpRange":"210.1.1.10-210.1.1.20",
+"location":"4050083f-465f-4838-af1e-47a545222ad0",
+ "sdncontroller":"9b9f02c0-298b-458a-bc9c-be3692e4f35e"
+ }
+ }
+ },
+ {
+ "resourceName":"overlayvpn",
+ "resourceDefId":"60c3e96e-0970-4871-b6e0-3b6de7561517",
+ "resourceId":"60c3e96e-0970-4871-b6e0-3b6de7561518",
+"nsParameters":{
+ "locationConstraints":[
+
+ ],
+ "additionalParamForNs":{
+"externalDataNetworkName":"Flow_out_net",
+ "m6000_mng_ip":"181.18.20.2",
+ "externalCompanyFtpDataNetworkName":"Flow_out_net",
+ "externalPluginManageNetworkName":"plugin_net_2014",
+ "externalManageNetworkName":"mng_net_2017",
+ "sfc_data_network":"sfc_data_net_2016",
+"NatIpRange":"210.1.1.10-210.1.1.20",
+"location":"4050083f-465f-4838-af1e-47a545222ad0",
+ "sdncontroller":"9b9f02c0-298b-458a-bc9c-be3692e4f35e"
+}
+ }
+}
+ ]
+}
+}
+} \ No newline at end of file
diff --git a/tests/so/sanity-check/data/createE2eserviceInvalid.json b/tests/so/sanity-check/data/createE2eserviceInvalid.json
new file mode 100644
index 00000000..78d303b2
--- /dev/null
+++ b/tests/so/sanity-check/data/createE2eserviceInvalid.json
@@ -0,0 +1,30 @@
+{
+ "service": {
+ "serviceName": "service",
+ "description": "so_test1",
+ "serviceDefId": "182834434345",
+ "templateId": "5994888392",
+ "parameters": {
+ "domainHost": "127.0.0.1",
+ "nodeTemplateName": "model:v3",
+ "nodeType": "service",
+ "globalSubscriberId": "49923893499",
+ "subscriberName": "NEED THIS UUI - AAI",
+ "requestParameters": {
+ "subscriptionServiceType": "MOG",
+ "userParams": [
+ {
+ "name": "someUserParam",
+ "value": "someValue"
+ },
+ {
+ "name": "segments",
+ "value": "[\n{\n\"domainHost\":\"localhost\",\n\"nodeTemplateName\":\"IMS_NS\",\n\"nodeType\":\"tosca.nodes.nfv.NS.IMS\",\n\"segments\":[\n\n],\n\"nsParameters\":{\n\"locationConstraints\":[\n{\n\"vnfProfileId\":\"zte-CSCF-1.0\",\n\"locationConstraints\":{\n\"vimId\":\"4050083f-465f-4838-af1e-47a545222ad0\"\n}\n}\n],\n\"additionalParamForNs\":{\n\"externalDataNetworkName\":\"Flow_out_net\",\n\"m6000_mng_ip\":\"181.18.20.2\",\n\"externalCompanyFtpDataNetworkName\":\"Flow_out_net\",\n\"externalPluginManageNetworkName\":\"plugin_net_2014\",\n\"externalManageNetworkName\":\"mng_net_2017\",\n\"sfc_data_network\":\"sfc_data_net_2016\",\n\"NatIpRange\":\"210.1.1.10-210.1.1.20\",\n\"location\":\"4050083f-465f-4838-af1e-47a545222ad0\",\n\"sdncontroller\":\"9b9f02c0-298b-458a-bc9c-be3692e4f35e\"\n}\n}\n},\n{\n\"domainHost\":\"localhost\",\n\"nodeTemplateName\":\"EPC_NS\",\n\"nodeType\":\"tosca.nodes.nfv.NS.IMS\",\n\"segments\":[\n\n],\n\"nsParameters\":{\n\"locationConstraints\":[\n{\n\"vnfProfileId\":\"zte-CSCF-1.0\",\n\"locationConstraints\":{\n\"vimId\":\"4050083f-465f-4838-af1e-47a545222ad0\"\n}\n}\n],\n\"additionalParamForNs\":{\n\"externalDataNetworkName\":\"Flow_out_net\",\n\"m6000_mng_ip\":\"181.18.20.2\",\n\"externalCompanyFtpDataNetworkName\":\"Flow_out_net\",\n\"externalPluginManageNetworkName\":\"plugin_net_2014\",\n\"externalManageNetworkName\":\"mng_net_2017\",\n\"sfc_data_network\":\"sfc_data_net_2016\",\n\"NatIpRange\":\"210.1.1.10-210.1.1.20\",\n\"location\":\"4050083f-465f-4838-af1e-47a545222ad0\",\n\"sdncontroller\":\"9b9f02c0-298b-458a-bc9c-be3692e4f35e\"\n}\n}\n}\n]"
+ },
+ {
+ "name": "nsParameters",
+ "value": "{\n \"locationConstraints\": {},\n \"additionalParamForNs\": {\n \"E2EServcie.param1\": \"value1\",\n \"E2EServcie.param2\": \"value2\"\n }\n }"
+ }
+ ]
+ }}}
+} \ No newline at end of file
diff --git a/tests/so/sanity-check/data/createNetwork.json b/tests/so/sanity-check/data/createNetwork.json
new file mode 100644
index 00000000..901e5174
--- /dev/null
+++ b/tests/so/sanity-check/data/createNetwork.json
@@ -0,0 +1,35 @@
+{
+ "requestDetails": {
+ "modelInfo": {
+ "modelType": "network",
+ "modelName": "CONTRAIL30_BASIC"
+ },
+ "cloudConfiguration": {
+ "lcpCloudRegionId": "mdt1",
+ "tenantId": "8b1df54faa3b49078e3416e21370a3ba"
+ },
+ "requestInfo": {
+ "instanceName": "GN_EVPN_direct_net_0_ST_Subnets_Ipv4",
+ "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "source": "VID",
+ "suppressRollback": true
+ },
+ "relatedInstanceList": [
+ {
+ "relatedInstance": {
+ "instanceId": " {serviceInstanceId} ",
+ "modelInfo": {
+ "modelType": "service",
+ "modelInvariantId": "ff3514e3-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6985cd-ea33-3346-ac12-ab121484a3fe",
+ "modelName": "{parent\tservice\tmodel\tname}",
+ "modelVersion": "1.0"
+ }
+ }
+ }
+ ],
+ "requestParameters": {
+ "userParams": []
+ }
+ }
+}
diff --git a/tests/so/sanity-check/data/createService.json b/tests/so/sanity-check/data/createService.json
new file mode 100644
index 00000000..3ff629ab
--- /dev/null
+++ b/tests/so/sanity-check/data/createService.json
@@ -0,0 +1,29 @@
+{
+"requestDetails": {
+"modelInfo": {
+"modelType": "",
+"modelInvariantId": "ff3514e3-5a33-55df-13ab-12abad84e7ff",
+"modelNameVersionId": "fe6985cd-ea33-3346-ac12-ab121484a3fe",
+"modelName": "Test",
+"modelVersion": "1.0"
+},
+"subscriberInfo": {
+"globalSubscriberId": "{some subscriber id}",
+"subscriberName": "{some subscriber name}"
+},
+"requestInfo": {
+"instanceName": "MSO_TEST",
+"source": "VID",
+"suppressRollback": true
+},
+"requestParameters": {
+"subscriptionServiceType": "MOG",
+"userParams": [
+{
+"name": "someUserParam",
+"value": "someValue"
+}
+]
+}
+}
+} \ No newline at end of file
diff --git a/tests/so/sanity-check/data/createService_null_input.json b/tests/so/sanity-check/data/createService_null_input.json
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/so/sanity-check/data/createService_null_input.json
diff --git a/tests/so/sanity-check/data/createVF.json b/tests/so/sanity-check/data/createVF.json
new file mode 100644
index 00000000..4969d542
--- /dev/null
+++ b/tests/so/sanity-check/data/createVF.json
@@ -0,0 +1,59 @@
+{
+ "requestDetails": {
+ "modelInfo": {
+ "modelType": "vfModule",
+ "modelInvariantId": "ff5256d2-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6478e5-ea33-3346-ac12-ab121484a3fe",
+ "modelName": "vSAMP12..base..module-0",
+ "modelVersion": "1"
+ },
+ "cloudConfiguration": {
+ "lcpCloudRegionId": "mdt1",
+ "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+ },
+ "requestInfo": {
+ "instanceName": "MSOTEST103a-vSAMP12_base_module-0",
+ "source": "VID",
+ "suppressRollback": true
+ },
+ "relatedInstanceList": [
+ {
+ "relatedInstance": {
+ "instanceId": "17ef4658-bd1f-4ef0-9ca0-ea76e2bf122c",
+ "instanceName": "MSOTESTVOL103a-vSAMP12_base_module-0_vol",
+ "modelInfo": {
+ "modelType": "volumeGroup"
+ }
+ }
+ },
+ {
+ "relatedInstance": {
+ "instanceId": " {serviceInstanceId} ",
+ "modelInfo": {
+ "modelType": "service",
+ "modelInvariantId": "ff3514e3-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6985cd-ea33-3346-ac12-ab121484a3fe",
+ "modelName": "{parent\tservice\tmodel\tname}",
+ "modelVersion": "1.0"
+ }
+ }
+ },
+ {
+ "relatedInstance": {
+ "instanceId": " {vnfInstanceId} ",
+ "modelInfo": {
+ "modelType": "vnf",
+ "modelInvariantId": "ff5256d1-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6478e4-ea33-3346-ac12-ab121484a3fe",
+ "modelName": " vSAMP12 ",
+ "modelVersion": "1.0",
+ "modelCustomizationName": "vSAMP12 1"
+ }
+ }
+ }
+ ],
+ "requestParameters": {
+ "userParams": []
+ }
+ }
+}
diff --git a/tests/so/sanity-check/data/createVG.json b/tests/so/sanity-check/data/createVG.json
new file mode 100644
index 00000000..13bf3e99
--- /dev/null
+++ b/tests/so/sanity-check/data/createVG.json
@@ -0,0 +1,47 @@
+{
+ "requestDetails": {
+ "modelInfo": {
+ "modelType": "volumeGroup",
+ "modelInvariantId": "ff5256d2-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6478e5-ea33-3346-ac12-ab121484a3fe",
+ "modelName": "vSAMP12..base..module-0",
+ "modelVersion": "1"
+ },
+ "cloudConfiguration": {
+ "lcpCloudRegionId": "mdt1",
+ "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+ },
+ "requestInfo": {
+ "instanceName": "MSOTESTVOL103a-vSAMP12_base_module-0_vol",
+ "source": "VID",
+ "suppressRollback": true
+ },
+ "relatedInstanceList": [
+ {
+ "relatedInstance": {
+ "instanceId": " {serviceInstanceId} ",
+ "modelInfo": {
+ "modelType": "service",
+ "modelInvariantId": "ff3514e3-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6985cd-ea33-3346-ac12-ab121484a3fe",
+ "modelName": "{parent\tservice\tmodel\tname}",
+ "modelVersion": "1.0"
+ }
+ }
+ },
+ {
+ "relatedInstance": {
+ "instanceId": " {vnfInstanceId} ",
+ "modelInfo": {
+ "modelType": "vnf",
+ "modelInvariantId": "ff5256d1-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6478e4-ea33-3346-ac12-ab121484a3fe",
+ "modelName": "vSAMP12",
+ "modelVersion": "1.0",
+ "modelCustomizationName": "vSAMP12 1"
+ }
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/so/sanity-check/data/createVnf.json b/tests/so/sanity-check/data/createVnf.json
new file mode 100644
index 00000000..7ea3d247
--- /dev/null
+++ b/tests/so/sanity-check/data/createVnf.json
@@ -0,0 +1,35 @@
+{
+ "requestDetails": {
+ "modelInfo": {
+ "modelType": "",
+ "modelInvariantId": "ff5256d1-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6478e4-ea33-3346-ac12-ab121484a3fe",
+ "modelName": "vSAMP12",
+ "modelVersion": "1.0",
+ "modelCustomizationName": "vSAMP12 1"
+ },
+ "cloudConfiguration": {
+ "lcpCloudRegionId": "mdt1",
+ "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+ },
+ "requestInfo": {
+ "instanceName": "MSOTEST103a",
+ "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "source": "VID",
+ "suppressRollback": false
+ },
+ "relatedInstanceList": [{
+ "relatedInstance": {
+ "instanceId": " {serviceInstanceId} ",
+ "modelInfo": {
+ "modelType": "service",
+ "modelInvariantId": "ff3514e3-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6985cd-ea33-3346-ac12-ab121484a3fe",
+ "modelName": " {parent service model name} ",
+ "modelVersion": "1.0"
+ }
+ }
+ }],
+ "requestParameters": {}
+ }
+}
diff --git a/tests/so/sanity-check/data/deactivateService.json b/tests/so/sanity-check/data/deactivateService.json
new file mode 100644
index 00000000..e2f749f7
--- /dev/null
+++ b/tests/so/sanity-check/data/deactivateService.json
@@ -0,0 +1,23 @@
+{
+"requestDetails": {
+"modelInfo": {
+"modelType": "service",
+"modelInvariantId": "ff3514e3-5a33-55df-13ab-12abad84e7ff",
+"modelNameVersionId": "fe6985cd-ea33-3346-ac12-ab121484a3fe",
+"modelName": "Test",
+"modelVersion": "1.0"
+},
+"requestInfo": {
+"source": "VID",
+"requestorId": "az2016"
+},
+"requestParameters": {
+"userParams": [
+{
+"name": "aic_zone",
+"value": "someValue"
+}
+]
+}
+}
+}
diff --git a/tests/so/sanity-check/data/deleteE2eservice.json b/tests/so/sanity-check/data/deleteE2eservice.json
new file mode 100644
index 00000000..d423dc34
--- /dev/null
+++ b/tests/so/sanity-check/data/deleteE2eservice.json
@@ -0,0 +1,4 @@
+{
+ "globalSubscriberId":"388499302",
+ "serviceType" : "VoLTE"
+} \ No newline at end of file
diff --git a/tests/so/sanity-check/data/deleteE2eserviceInvalid.json b/tests/so/sanity-check/data/deleteE2eserviceInvalid.json
new file mode 100644
index 00000000..62b9726b
--- /dev/null
+++ b/tests/so/sanity-check/data/deleteE2eserviceInvalid.json
@@ -0,0 +1,30 @@
+{
+ "service": {
+ "serviceName": "instanceName",
+ "description": "so_test1",
+ "serviceDefId": "modelInvariantId value from SDC?",
+ "templateId": "modelVersionId value from SDC??",
+ "parameters": {
+ "domainHost": "localhost",
+ "nodeTemplateName": "modelName+:+modelVersion",
+ "nodeType": "modelType?? == service",
+ "globalSubscriberId": "NEED THIS UUI - AAI",
+ "subscriberName": "NEED THIS UUI - AAI",
+ "requestParameters": {
+ "subscriptionServiceType": "MOG",
+ "userParams": [
+ {
+ "name": "someUserParam",
+ "value": "someValue"
+ },
+ {
+ "name": "segments",
+ "value": "[\n{\n\"domainHost\":\"localhost\",\n\"nodeTemplateName\":\"IMS_NS\",\n\"nodeType\":\"tosca.nodes.nfv.NS.IMS\",\n\"segments\":[\n\n],\n\"nsParameters\":{\n\"locationConstraints\":[\n{\n\"vnfProfileId\":\"zte-CSCF-1.0\",\n\"locationConstraints\":{\n\"vimId\":\"4050083f-465f-4838-af1e-47a545222ad0\"\n}\n}\n],\n\"additionalParamForNs\":{\n\"externalDataNetworkName\":\"Flow_out_net\",\n\"m6000_mng_ip\":\"181.18.20.2\",\n\"externalCompanyFtpDataNetworkName\":\"Flow_out_net\",\n\"externalPluginManageNetworkName\":\"plugin_net_2014\",\n\"externalManageNetworkName\":\"mng_net_2017\",\n\"sfc_data_network\":\"sfc_data_net_2016\",\n\"NatIpRange\":\"210.1.1.10-210.1.1.20\",\n\"location\":\"4050083f-465f-4838-af1e-47a545222ad0\",\n\"sdncontroller\":\"9b9f02c0-298b-458a-bc9c-be3692e4f35e\"\n}\n}\n},\n{\n\"domainHost\":\"localhost\",\n\"nodeTemplateName\":\"EPC_NS\",\n\"nodeType\":\"tosca.nodes.nfv.NS.IMS\",\n\"segments\":[\n\n],\n\"nsParameters\":{\n\"locationConstraints\":[\n{\n\"vnfProfileId\":\"zte-CSCF-1.0\",\n\"locationConstraints\":{\n\"vimId\":\"4050083f-465f-4838-af1e-47a545222ad0\"\n}\n}\n],\n\"additionalParamForNs\":{\n\"externalDataNetworkName\":\"Flow_out_net\",\n\"m6000_mng_ip\":\"181.18.20.2\",\n\"externalCompanyFtpDataNetworkName\":\"Flow_out_net\",\n\"externalPluginManageNetworkName\":\"plugin_net_2014\",\n\"externalManageNetworkName\":\"mng_net_2017\",\n\"sfc_data_network\":\"sfc_data_net_2016\",\n\"NatIpRange\":\"210.1.1.10-210.1.1.20\",\n\"location\":\"4050083f-465f-4838-af1e-47a545222ad0\",\n\"sdncontroller\":\"9b9f02c0-298b-458a-bc9c-be3692e4f35e\"\n}\n}\n}\n]"
+ },
+ {
+ "name": "nsParameters",
+ "value": "{\n \"locationConstraints\": {},\n \"additionalParamForNs\": {\n \"E2EServcie.param1\": \"value1\",\n \"E2EServcie.param2\": \"value2\"\n }\n }"
+ }
+ ]
+ }}}
+} \ No newline at end of file
diff --git a/tests/so/sanity-check/data/deleteNetwork.json b/tests/so/sanity-check/data/deleteNetwork.json
new file mode 100644
index 00000000..4bee0780
--- /dev/null
+++ b/tests/so/sanity-check/data/deleteNetwork.json
@@ -0,0 +1,15 @@
+{
+ "requestDetails": {
+ "modelInfo": {
+ "modelType": "network",
+ "modelName": "CONTRAIL30_BASIC"
+ },
+ "cloudConfiguration": {
+ "lcpCloudRegionId": "mdt1",
+ "tenantId": "8b1df54faa3b49078e3416e21370a3ba"
+ },
+ "requestInfo": {
+ "source": "VID"
+ }
+ }
+}
diff --git a/tests/so/sanity-check/data/deleteService.json b/tests/so/sanity-check/data/deleteService.json
new file mode 100644
index 00000000..593fdd30
--- /dev/null
+++ b/tests/so/sanity-check/data/deleteService.json
@@ -0,0 +1,13 @@
+{
+"requestDetails": {
+"modelInfo": {
+"modelType": "",
+"modelInvariantId": "ff3514e3-5a33-55df-13ab-12abad84e7ff",
+"modelName": " Test ",
+"modelVersion": "1.0"
+},
+"requestInfo": {
+"source": "VID"
+}
+}
+}
diff --git a/tests/so/sanity-check/data/deleteVF.json b/tests/so/sanity-check/data/deleteVF.json
new file mode 100644
index 00000000..ac6023e8
--- /dev/null
+++ b/tests/so/sanity-check/data/deleteVF.json
@@ -0,0 +1,17 @@
+{
+ "requestDetails": {
+ "modelInfo": {
+ "modelType": "vfModule",
+ "modelInvariantId": "ff5256d2-5a33-55df-13ab-12abad84e7ff",
+ "modelName": "vSAMP12..base..module-0",
+ "modelVersion": "1"
+ },
+ "cloudConfiguration": {
+ "lcpCloudRegionId": "mdt1",
+ "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+ },
+ "requestInfo": {
+ "source": "VID"
+ }
+ }
+}
diff --git a/tests/so/sanity-check/data/deleteVG.json b/tests/so/sanity-check/data/deleteVG.json
new file mode 100644
index 00000000..cb238659
--- /dev/null
+++ b/tests/so/sanity-check/data/deleteVG.json
@@ -0,0 +1,15 @@
+{
+ "requestDetails": {
+ "modelInfo": {
+ "modelType": "volumeGroup",
+ "modelName": "vSAMP12..base..module-0"
+ },
+ "cloudConfiguration": {
+ "lcpCloudRegionId": "mdt1",
+ "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+ },
+ "requestInfo": {
+ "source": "VID"
+ }
+ }
+}
diff --git a/tests/so/sanity-check/data/deleteVnf.json b/tests/so/sanity-check/data/deleteVnf.json
new file mode 100644
index 00000000..f326a12d
--- /dev/null
+++ b/tests/so/sanity-check/data/deleteVnf.json
@@ -0,0 +1,20 @@
+{
+"requestDetails": {
+"modelInfo": {
+"modelType": "",
+"modelInvariantId": "ff5256d1-5a33-55df-13ab-12abad84e7ff",
+"modelName": "vSAMP12",
+"modelVersion": "1"
+},
+"cloudConfiguration": {
+"lcpCloudRegionId": "mdt1",
+"tenantId": "88a6ca3ee0394ade9403f075db23167e"
+},
+"requestInfo": {
+"source": "VID"
+},
+"requestParameters": {
+"userParams": []
+}
+}
+}
diff --git a/tests/so/sanity-check/data/replaceVF.json b/tests/so/sanity-check/data/replaceVF.json
new file mode 100644
index 00000000..23116996
--- /dev/null
+++ b/tests/so/sanity-check/data/replaceVF.json
@@ -0,0 +1,60 @@
+{
+ "requestDetails": {
+ "modelInfo": {
+ "modelType": "vfModule",
+ "modelInvariantId": "ff5256d2-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6478e5-ea33-3346-ac12-ab121484a3fe",
+ "modelName": "vSAMP12..base..module-0",
+ "modelVersion": "2"
+ },
+ "cloudConfiguration": {
+ "lcpCloudRegionId": "mdt1",
+ "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+ },
+ "requestInfo": {
+ "source": "VID",
+ "suppressRollback": true,
+ "requestorId": "az2016"
+ },
+ "relatedInstanceList": [
+ {
+ "relatedInstance": {
+ "instanceId": "17ef4658-bd1f-4ef0-9ca0-ea76e2bf122c",
+ "instanceName": "MSOTESTVOL103a-vSAMP12_base_module-0_vol",
+ "modelInfo": {
+ "modelType": "volumeGroup"
+ }
+ }
+ },
+ {
+ "relatedInstance": {
+ "instanceId": " {serviceInstanceId} ",
+ "modelInfo": {
+ "modelType": "service",
+ "modelInvariantId": "ff3514e3-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6985cd-ea33-3346-ac12-ab121484a3fe",
+ "modelName": "{parent\tservice\tmodel\tname}",
+ "modelVersion": "2.0"
+ }
+ }
+ },
+ {
+ "relatedInstance": {
+ "instanceId": " {vnfInstanceId} ",
+ "modelInfo": {
+ "modelType": "vnf",
+ "modelInvariantId": "ff5256d1-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6478e4-ea33-3346-ac12-ab121484a3fe",
+ "modelName": " vSAMP12 ",
+ "modelVersion": "2.0",
+ "modelCustomizationName": "vSAMP12 1",
+ "modelCustomizationId": "c539433a-84a6-4082-a12e-5c9b00c3b960"
+ }
+ }
+ }
+ ],
+ "requestParameters": {
+ "userParams": []
+ }
+ }
+}
diff --git a/tests/so/sanity-check/data/replaceVnf.json b/tests/so/sanity-check/data/replaceVnf.json
new file mode 100644
index 00000000..18063750
--- /dev/null
+++ b/tests/so/sanity-check/data/replaceVnf.json
@@ -0,0 +1,36 @@
+{
+ "requestDetails": {
+ "modelInfo": {
+ "modelType": "",
+ "modelInvariantId": "ff5256d1-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6478e4-ea33-3346-ac12-ab121484a3fe",
+ "modelName": "vSAMP12",
+ "modelVersion": "1.0",
+ "modelCustomizationName": "vSAMP12 1"
+ },
+ "cloudConfiguration": {
+ "lcpCloudRegionId": "mdt1",
+ "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+ },
+ "requestInfo": {
+ "source": "VID",
+ "suppressRollback": false,
+ "requestorId": "az2016"
+ },
+ "relatedInstanceList": [{
+ "relatedInstance": {
+ "instanceId": " {serviceInstanceId} ",
+ "modelInfo": {
+ "modelType": "service",
+ "modelInvariantId": "ff3514e3-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6985cd-ea33-3346-ac12-ab121484a3fe",
+ "modelName": " {parent service model name} ",
+ "modelVersion": "2.0"
+ }
+ }
+ }],
+ "requestParameters": {
+ "rebuildVolumeGroups": false
+ }
+ }
+}
diff --git a/tests/so/sanity-check/data/updateNetwork.json b/tests/so/sanity-check/data/updateNetwork.json
new file mode 100644
index 00000000..4d763909
--- /dev/null
+++ b/tests/so/sanity-check/data/updateNetwork.json
@@ -0,0 +1,34 @@
+{
+ "requestDetails": {
+ "modelInfo": {
+ "modelType": "network",
+ "modelName": "CONTRAIL30_BASIC"
+ },
+ "cloudConfiguration": {
+ "lcpCloudRegionId": "mdt1",
+ "tenantId": "8b1df54faa3b49078e3416e21370a3ba"
+ },
+ "requestInfo": {
+ "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "source": "VID",
+ "suppressRollback": true
+ },
+ "relatedInstanceList": [
+ {
+ "relatedInstance": {
+ "instanceId": " {serviceInstanceId} ",
+ "modelInfo": {
+ "modelType": "service",
+ "modelInvariantId": "ff3514e3-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6985cd-ea33-3346-ac12-ab121484a3fe",
+ "modelName": "{parent\tservice\tmodel\tname}",
+ "modelVersion": "1.0"
+ }
+ }
+ }
+ ],
+ "requestParameters": {
+ "userParams": []
+ }
+ }
+}
diff --git a/tests/so/sanity-check/data/updateVF.json b/tests/so/sanity-check/data/updateVF.json
new file mode 100644
index 00000000..671cc791
--- /dev/null
+++ b/tests/so/sanity-check/data/updateVF.json
@@ -0,0 +1,61 @@
+{
+ "requestDetails": {
+ "modelInfo": {
+ "modelType": "vfModule",
+ "modelInvariantId": "ff5256d2-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6478e5-ea33-3346-ac12-ab121484a3fe",
+ "modelName": "vSAMP12..base..module-0",
+ "modelVersion": "1"
+ },
+ "cloudConfiguration": {
+ "lcpCloudRegionId": "mdt1",
+ "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+ },
+ "requestInfo": {
+ "source": "VID",
+ "suppressRollback": true,
+ "requestorId": "az2016"
+ },
+ "relatedInstanceList": [
+ {
+ "relatedInstance": {
+ "instanceId": "17ef4658-bd1f-4ef0-9ca0-ea76e2bf122c",
+ "instanceName": "MSOTESTVOL103a-vSAMP12_base_module-0_vol",
+ "modelInfo": {
+ "modelType": "volumeGroup"
+ }
+ }
+ },
+ {
+ "relatedInstance": {
+ "instanceId": " {serviceInstanceId} ",
+ "modelInfo": {
+ "modelType": "service",
+ "modelInvariantId": "ff3514e3-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6985cd-ea33-3346-ac12-ab121484a3fe",
+ "modelName": "{parent\tservice\tmodel\tname}",
+ "modelVersion": "2.0"
+ }
+ }
+ },
+ {
+ "relatedInstance": {
+ "instanceId": " {vnfInstanceId} ",
+ "modelInfo": {
+ "modelType": "vnf",
+ "modelInvariantId": "ff5256d1-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6478e4-ea33-3346-ac12-ab121484a3fe",
+ "modelName": " vSAMP12 ",
+ "modelVersion": "2.0",
+ "modelCustomizationName": "vSAMP12 1",
+ "modelCustomizationId": "c539433a-84a6-4082-a12e-5c9b00c3b960"
+ }
+ }
+ }
+ ],
+ "requestParameters": {
+ "usePreload": true,
+ "userParams": []
+ }
+ }
+}
diff --git a/tests/so/sanity-check/data/updateVnf.json b/tests/so/sanity-check/data/updateVnf.json
new file mode 100644
index 00000000..d6c39de9
--- /dev/null
+++ b/tests/so/sanity-check/data/updateVnf.json
@@ -0,0 +1,39 @@
+{
+ "requestDetails": {
+ "modelInfo": {
+ "modelType": "vnf",
+ "modelInvariantId": "ff5256d1-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6478e4-ea33-3346-ac12-ab121484a3fe",
+ "modelName": "vSAMP12",
+ "modelVersion": "2.0",
+ "modelCustomizationName": "vSAMP12 1",
+ "modelCustomizationId": "c539433a-84a6-4082-a12e-5c9b00c3b960"
+ },
+ "cloudConfiguration": {
+ "lcpCloudRegionId": "mdt1",
+ "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+ },
+ "requestInfo": {
+ "source": "VID",
+ "suppressRollback": false,
+ "requestorId": "az2016"
+ },
+ "relatedInstanceList": [
+ {
+ "relatedInstance": {
+ "instanceId": " {serviceInstanceId} ",
+ "modelInfo": {
+ "modelType": "service",
+ "modelInvariantId": "ff3514e3-5a33-55df-13ab-12abad84e7ff",
+ "modelNameVersionId": "fe6985cd-ea33-3346-ac12-ab121484a3fe",
+ "modelName": " {parent service model name} ",
+ "modelVersion": "1.0"
+ }
+ }
+ }
+ ],
+ "requestParameters": {
+ "usePreload": true
+ }
+ }
+}
diff --git a/tests/so/sanity-check/sanity_test_so.robot b/tests/so/sanity-check/sanity_test_so.robot
new file mode 100644
index 00000000..7d6ddf31
--- /dev/null
+++ b/tests/so/sanity-check/sanity_test_so.robot
@@ -0,0 +1,210 @@
+*** Settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+${MESSAGE} Hello, world!
+
+*** Test Cases ***
+
+Create ServiceInstance for invalid input
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createService.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Post Request refrepo /ecomp/mso/infra/serviceInstances/v3 data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Create ServiceInstance for invalid user
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createService.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQxOnBhc3N3b3JkMTI= Content-Type=application/json Accept=application/json
+ ${resp}= Post Request refrepo /ecomp/mso/infra/serviceInstances/v3 data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Delete ServiceInstance for invalid input
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}deleteService.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request refrepo /ecomp/mso/infra/serviceInstances/v3/ff305d54-75b4-431b-adb2-eb6b9e5ff000 data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Delete ServiceInstance for invalid user
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}deleteService.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQxOnBhc3N3b3JkMTI== Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request refrepo /ecomp/mso/infra/serviceInstances/v3/ff305d54-75b4-431b-adb2-eb6b9e5ff000 data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Activate ServiceInstance
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}activateService.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Post Request refrepo /ecomp/mso/infra/serviceInstances/v5/ff305d54-75b4-431b-adb2-eb6b9e5ff000/activate data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Deactivate ServiceInstance
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}deactivateService.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Post Request refrepo /ecomp/mso/infra/serviceInstances/v5/ff305d54-75b4-431b-adb2-eb6b9e5ff000/deactivate data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Create Volume Group instance
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createVG.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Post Request refrepo /ecomp/mso/infra/serviceInstances/v3/ff305d54-75b4-431b-adb2-eb6b9e5ff000/vnfs/aca51b0a-710d-4155-bc7c-7cef19d9a94e/volumeGroups data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Delete Volume Group instance
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}deleteVG.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request refrepo /ecomp/mso/infra/serviceInstances/v3/ff305d54-75b4-431b-adb2-eb6b9e5ff000/vnfs/aca51b0a-710d-4155-bc7c-7cef19d9a94e/volumeGroups/ff305d54-75b4-ff1b-cdb2-eb6b9e5460ff data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Create VF Module instance
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createVF.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Post Request refrepo /ecomp/mso/infra/serviceInstances/v3/ff305d54-75b4-431b-adb2-eb6b9e5ff000/vnfs/aca51b0a-710d-4155-bc7c-7cef19d9a94e/vfModules data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Update VF Module instance
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}updateVF.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Post Request refrepo /ecomp/mso/infra/serviceInstances/v5/ff305d54-75b4-431b-adb2-eb6b9e5ff000/vnfs/aca51b0a-710d-4155-bc7c-7cef19d9a94e/vfModules/ff305d54-75b4-ff1b-bdb2-eb6b9e5460ff data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Delete VF Module instance
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}deleteVF.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request refrepo /ecomp/mso/infra/serviceInstances/v3/ff305d54-75b4-431b-adb2-eb6b9e5ff000/vnfs/aca51b0a-710d-4155-bc7c-7cef19d9a94e/vfModules/ff305d54-75b4-ff1b-bdb2-eb6b9e5460ff data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Replace VF Module instance
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}replaceVF.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Post Request refrepo /ecomp/mso/infra/serviceInstances/v5/ff305d54-75b4-431b-adb2-eb6b9e5ff000/vnfs/aca51b0a-710d-4155-bc7c-7cef19d9a94e/vfModules/ff305d54-75b4-ff1b-bdb2-eb6b9e5460ff/replace data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Create Network instance
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createNetwork.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Post Request refrepo /ecomp/mso/infra/serviceInstances/v3/ff305d54-75b4-431b-adb2-eb6b9e5ff000/networks data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Update Network instance
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}updateNetwork.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Put Request refrepo /ecomp/mso/infra/serviceInstances/v3/ff305d54-75b4-431b-adb2-eb6b9e5ff000/networks/2b125640-bd1a-4ef0-9ca0-ea76e2a22801 data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Delete Network instance
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}deleteNetwork.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Post Request refrepo /ecomp/mso/infra/serviceInstances/v3/ff305d54-75b4-431b-adb2-eb6b9e5ff000/networks/2b125640-bd1a-4ef0-9ca0-ea76e2a22801 data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+SO ServiceInstance health check
+ Create Session refrepo http://${REPO_IP}:8080
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Get Request refrepo /ecomp/mso/infra/orchestrationRequests/v3/rq1234d1-5a33-55df-13ab-12abad84e333 headers=${headers}
+ Should Not Contain ${resp.content} null
+
+Create VnfInstance for invalid input
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createVnf.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request refrepo /ecomp/mso/infra/serviceInstances/v3/ff305d54-75b4-431b-adb2-eb6b9e5ff000/vnfs data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Update VnfInstance for invalid input
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}updateVnf.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request refrepo /ecomp/mso/infra/serviceInstances/v5/ff305d54-75b4-431b-adb2-eb6b9e5ff000/vnfs/aca51b0a-710d-4155-bc7c-7cef19d9a94e data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Create VnfInstance for invalid credential
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createVnf.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQxOnBhc3N3b3JkMTI= Content-Type=application/json Accept=application/json
+ ${resp}= Post Request refrepo /ecomp/mso/infra/serviceInstances/v3/ff305d54-75b4-431b-adb2-eb6b9e5ff000/vnfs data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Delete VnfInstance for invalid input
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}deleteVnf.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request refrepo /ecomp/mso/infra/serviceInstances/v3/ff305d54-75b4-431b-adb2-eb6b9e5ff000/vnfs/aca51b0a-710d-4155-bc7c-7cef19d9a94e data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Replace VnfInstance
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}replaceVnf.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQxOnBhc3N3b3JkMTI= Content-Type=application/json Accept=application/json
+ ${resp}= Post Request refrepo /ecomp/mso/infra/serviceInstances/v5/ff305d54-75b4-431b-adb2-eb6b9e5ff000/vnfs/aca51b0a-710d-4155-bc7c-c7cef19d94e/replace data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Get Orchestration Requests
+ Create Session refrepo http://${REPO_IP}:8080
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Get Request refrepo /ecomp/mso/infra/orchestrationRequests/v3 headers=${headers}
+ Should Not Contain ${resp.content} null
+
+Get Orchestration Requests Filter criteria
+ Create Session refrepo http://${REPO_IP}:8080
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Get Request refrepo /ecomp/mso/infra/orchestrationRequests/v3?filter=serviceInstanceId:EQUALS:bc305d54-75b4-431b-adb2-eb6b9e546014 headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Create E2EService
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createE2eservice.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Post Request refrepo /ecomp/mso/infra/e2eServiceInstances/v3 data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Create E2EService with invalid credential
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createE2eservice.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQxOnBhc3N3b3JkMTI= Content-Type=application/json Accept=application/json
+ ${resp}= Post Request refrepo /ecomp/mso/infra/e2eServiceInstances/v3 data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Create E2EService with invalid Input data
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}createE2eserviceInvalid.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQxOnBhc3N3b3JkMTI= Content-Type=application/json Accept=application/json
+ ${resp}= Post Request refrepo /ecomp/mso/infra/e2eServiceInstances/v3 data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Delete E2EService
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}deleteE2eservice.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request refrepo /ecomp/mso/infra/e2eServiceInstances/v3/ff305d54-75b4-431b-adb2-eb6b9e5ff000 data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Delete E2EService with invalid credential
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}deleteE2eservice.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQxOnBhc3N3b3JkMTI= Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request refrepo /ecomp/mso/infra/e2eServiceInstances/v3/ff305d54-75b4-431b-adb2-eb6b9e5ff000 data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result
+
+Delete E2EService with invalid input data
+ Create Session refrepo http://${REPO_IP}:8080
+ ${data}= Get Binary File ${CURDIR}${/}data${/}deleteE2eserviceInvalid.json
+ &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json
+ ${resp}= Delete Request refrepo /ecomp/mso/infra/e2eServiceInstances/v3/ff305d54-75b4-431b-adb2-eb6b9e5ff000 data=${data} headers=${headers}
+ Run Keyword If '${resp.status_code}' == '400' or '${resp.status_code}' == '404' or '${resp.status_code}' == '405' log to console \nexecuted with expected result \ No newline at end of file
diff --git a/tests/usecase-ui/server/test.robot b/tests/usecase-ui/server/test.robot
new file mode 100644
index 00000000..cae75c4f
--- /dev/null
+++ b/tests/usecase-ui/server/test.robot
@@ -0,0 +1,14 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+*** Variables ***
+@{return_ok_list}= 200 201 202 204
+
+*** Test Cases ***
+MonitorSwaggerTest
+ [Documentation] query Monitor swagger info rest test
+ Should Be Equal 2.0 2.0
diff --git a/tests/usecases/5G-bulkpm/BulkpmE2E.robot b/tests/usecases/5G-bulkpm/BulkpmE2E.robot
new file mode 100644
index 00000000..9098b1ab
--- /dev/null
+++ b/tests/usecases/5G-bulkpm/BulkpmE2E.robot
@@ -0,0 +1,69 @@
+*** Settings ***
+Documentation Testing E2E VES,Dmaap,DFC,DR with File Ready event feed from xNF
+Library RequestsLibrary
+Library OperatingSystem
+Library Collections
+Library Process
+Resource resources/bulkpm_keywords.robot
+
+
+*** Variables ***
+${VESC_URL} http://%{VESC_IP}:8080
+${GLOBAL_APPLICATION_ID} robot-ves
+${VES_ANY_EVENT_PATH} /eventListener/v7
+${HEADER_STRING} content-type=application/json
+${EVENT_DATA_FILE} %{WORKSPACE}/test/csit/tests/usecases/5G-bulkpm/assets/json_events/FileExistNotificationUpdated.json
+
+${TARGETURL_TOPICS} http://${DMAAP_MR_IP}:3904/topics
+${TARGETURL_SUBSCR} http://${DMAAP_MR_IP}:3904/events/unauthenticated.VES_NOTIFICATION_OUTPUT/OpenDcae-c12/C12?timeout=1000
+${CLI_EXEC_CLI} curl -k https://${DR_PROV_IP}:8443/internal/prov
+${CLI_EXEC_CLI_DFC} docker exec dfc /bin/sh -c "ls /target | grep .gz"
+
+*** Test Cases ***
+
+Send VES File Ready Event to VES Collector
+ [Tags] Bulk_PM_E2E_01
+ [Documentation] Send VES File Ready Event
+ ${evtdata}= Get Event Data From File ${EVENT_DATA_FILE}
+ ${headers}= Create Header From String ${HEADER_STRING}
+ ${resp}= Publish Event To VES Collector ${VESC_URL} ${VES_ANY_EVENT_PATH} ${headers} ${evtdata}
+ Sleep 2s
+ ${resp}= Publish Event To VES Collector ${VESC_URL} ${VES_ANY_EVENT_PATH} ${headers} ${evtdata}
+ Sleep 2s
+ ${resp}= Publish Event To VES Collector ${VESC_URL} ${VES_ANY_EVENT_PATH} ${headers} ${evtdata}
+ Sleep 2s
+ ${resp}= Publish Event To VES Collector ${VESC_URL} ${VES_ANY_EVENT_PATH} ${headers} ${evtdata}
+ Log Receive HTTP Status code ${resp.status_code}
+ Should Be Equal As Strings ${resp.status_code} 202
+
+Check VES Notification Topic is existing in Message Router
+ [Tags] Bulk_PM_E2E_02
+ [Documentation] Get the VES Notification topic on message router
+ [Timeout] 1 minute
+ Sleep 10s
+ ${resp}= GetCall ${TARGETURL_TOPICS}
+ log ${TARGETURL_TOPICS}
+ log 'JSON Response Code :'${resp}
+ ${topics}= Evaluate $resp.json().get('topics')
+ log ${topics}
+ ${ListLength}= Get Length ${topics}
+ log ${ListLength}
+ List Should Contain Value ${topics} unauthenticated.VES_NOTIFICATION_OUTPUT
+
+Verify Downloaded PM file from xNF exist on Data File Collector
+ [Tags] Bulk_PM_E2E_03
+ [Documentation] Check the PM XML file exists on the File Consumer Simulator
+ ${cli_cmd_output}= Run Process ${CLI_EXEC_CLI_DFC} shell=yes
+ Log ${cli_cmd_output.stdout}
+ Should Be Equal As Strings ${cli_cmd_output.rc} 0
+ Should Contain ${cli_cmd_output.stdout} xNF.pm.xml.gz
+
+
+Verify Default Feed And File Consumer Subscription On Datarouter
+ [Tags] Bulk_PM_E2E_04
+ [Documentation] Verify Default Feed And File Consumer Subscription On Datarouter
+ ${cli_cmd_output}= Run Process ${CLI_EXEC_CLI} shell=yes
+ Log ${cli_cmd_output.stdout}
+ Should Be Equal As Strings ${cli_cmd_output.rc} 0
+ Should Contain ${cli_cmd_output.stdout} https://dmaap-dr-prov/publish/1
+ Should Contain ${cli_cmd_output.stdout} http://${DR_SUBSCIBER_IP}:7070 \ No newline at end of file
diff --git a/tests/usecases/5G-bulkpm/__init__.robot b/tests/usecases/5G-bulkpm/__init__.robot
new file mode 100644
index 00000000..7114fd44
--- /dev/null
+++ b/tests/usecases/5G-bulkpm/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation 5G Bulk PM E2E Testcases
diff --git a/tests/usecases/5G-bulkpm/assets/json_events/FileExistNotification.json b/tests/usecases/5G-bulkpm/assets/json_events/FileExistNotification.json
new file mode 100644
index 00000000..4064ea31
--- /dev/null
+++ b/tests/usecases/5G-bulkpm/assets/json_events/FileExistNotification.json
@@ -0,0 +1,33 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "version": "4.0.1",
+ "vesEventListenerVersion": "7.0.1",
+ "domain": "notification",
+ "eventName": "Noti_RnNode-Ericsson_FileReady",
+ "eventId": "FileReady_1797490e-10ae-4d48-9ea7-3d7d790b25e1",
+ "lastEpochMicrosec": 8745745764578,
+ "priority": "Normal",
+ "reportingEntityName": "otenb5309",
+ "sequence": 0,
+ "sourceName": "oteNB5309",
+ "startEpochMicrosec": 8745745764578,
+ "timeZoneOffset": "UTC+05.30"
+ },
+ "notificationFields": {
+ "changeIdentifier": "PM_MEAS_FILES",
+ "changeType": "FileReady",
+ "notificationFieldsVersion": "2.0",
+ "arrayOfNamedHashMap": [
+ { "name": "xNF.pm.xml.gz",
+ "hashMap":{
+ "location": "sftp://admin:admin@sftpserver:22/xNF.pm.xml.gz",
+ "compression": "gzip",
+ "fileFormatType": "org.3GPP.32.435#measCollec",
+ "fileFormatVersion": "V10"
+ }
+ }
+ ]
+ }
+}
+} \ No newline at end of file
diff --git a/tests/usecases/5G-bulkpm/resources/bulkpm_keywords.robot b/tests/usecases/5G-bulkpm/resources/bulkpm_keywords.robot
new file mode 100644
index 00000000..6859ea0d
--- /dev/null
+++ b/tests/usecases/5G-bulkpm/resources/bulkpm_keywords.robot
@@ -0,0 +1,38 @@
+ *** Settings ***
+Documentation The main interface for interacting with VES. It handles low level stuff like managing the http request library and VES required fields
+Library RequestsLibrary
+Library ../resources/xNFLibrary.py
+Library OperatingSystem
+Library Collections
+Library requests
+Library Collections
+Library String
+
+*** Variables ***
+
+*** Keywords ***
+
+Get Event Data From File
+ [Arguments] ${jsonfile}
+ ${data}= OperatingSystem.Get File ${jsonfile}
+ #Should Not Be_Equal ${data} None
+ [return] ${data}
+
+Publish Event To VES Collector
+ [Documentation] Send an event to VES Collector
+ [Arguments] ${url} ${evtpath} ${httpheaders} ${evtdata}
+ Log Creating session ${url}
+ ${session}= Create Session dcaegen2-d1 ${url}
+ ${resp}= Post Request dcaegen2-d1 ${evtpath} data=${evtdata} headers=${httpheaders}
+ #Log Received response from dcae ${resp.json()}
+ [return] ${resp}
+PostCall
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ ${resp}= Evaluate requests.post('${url}',data='${data}', headers=${headers},verify=False) requests
+ [Return] ${resp}
+
+GetCall
+ [Arguments] ${url}
+ ${resp}= Evaluate requests.get('${url}') requests
+ [Return] ${resp}
diff --git a/tests/usecases/5G-bulkpm/resources/xNFLibrary.py b/tests/usecases/5G-bulkpm/resources/xNFLibrary.py
new file mode 100644
index 00000000..01574f77
--- /dev/null
+++ b/tests/usecases/5G-bulkpm/resources/xNFLibrary.py
@@ -0,0 +1,25 @@
+'''
+Created on Aug 18, 2017
+
+@author: sw6830
+'''
+from robot.api import logger
+from Queue import Queue
+import uuid, time, json, threading,os, platform, subprocess,paramiko
+
+class xNFLibrary(object):
+
+ def __init__(self):
+ pass
+
+ def create_header_from_string(self, dictStr):
+ logger.info("Enter create_header_from_string: dictStr")
+ return dict(u.split("=") for u in dictStr.split(","))
+
+ def Generate_UUID(self):
+ """generate a uuid"""
+ return uuid.uuid4()
+
+if __name__ == '__main__':
+ lib = xNFLibrary()
+ time.sleep(100000) \ No newline at end of file
diff --git a/tests/vfc/gvnfm-vnflcm/jsoninput/create_vnf.json b/tests/vfc/gvnfm-vnflcm/jsoninput/create_vnf.json
new file mode 100644
index 00000000..554c4173
--- /dev/null
+++ b/tests/vfc/gvnfm-vnflcm/jsoninput/create_vnf.json
@@ -0,0 +1,5 @@
+{
+ "vnfdId": "111",
+ "vnfInstanceName": "vFW_01",
+ "vnfInstanceDescription": "vFW in Nanjing TIC Edge"
+} \ No newline at end of file
diff --git a/tests/vfc/gvnfm-vnflcm/test.robot b/tests/vfc/gvnfm-vnflcm/test.robot
new file mode 100644
index 00000000..cf3d12bc
--- /dev/null
+++ b/tests/vfc/gvnfm-vnflcm/test.robot
@@ -0,0 +1,31 @@
+*** settings ***
+Resource ../../common.robot
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+*** Variables ***
+@{return_ok_list}= 200 201 202 204
+${queryswagger_url} /api/vnflcm/v1/swagger.json
+${create_vnf_url} /api/vnflcm/v1/vnf_instances
+${delete_vnf_url} /api/vnflcm/v1/vnf_instances
+
+#json files
+${create_vnf_json} ${SCRIPTS}/../tests/vfc/gvnfm-vnflcm/jsoninput/create_vnf.json
+
+#global variables
+${vnfInstId}
+
+*** Test Cases ***
+VnflcmSwaggerTest
+ [Documentation] query swagger info vnflcm by MSB
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${VNFLCM_IP}:8801 headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0
diff --git a/tests/vfc/gvnfm-vnfmgr/test.robot b/tests/vfc/gvnfm-vnfmgr/test.robot
new file mode 100644
index 00000000..90392c98
--- /dev/null
+++ b/tests/vfc/gvnfm-vnfmgr/test.robot
@@ -0,0 +1,14 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryswagger_url} /api/vnfmgr/v1/swagger.json
+
+*** Test Cases ***
+NslcmSwaggerTest
+ [Documentation] query vnfmgr swagger info rest test
+ Should Be Equal 2.0 2.0
diff --git a/tests/vfc/gvnfm-vnfres/test.robot b/tests/vfc/gvnfm-vnfres/test.robot
new file mode 100644
index 00000000..fb87435b
--- /dev/null
+++ b/tests/vfc/gvnfm-vnfres/test.robot
@@ -0,0 +1,21 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryswagger_url} /api/vnfres/v1/swagger.json
+
+*** Test Cases ***
+VnfresSwaggerTest
+ [Documentation] query vnfres swagger info rest test
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${VNFRES_IP}:8802 headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0
diff --git a/tests/vfc/nfvo-catalog/test.robot b/tests/vfc/nfvo-catalog/test.robot
new file mode 100644
index 00000000..99dff9bd
--- /dev/null
+++ b/tests/vfc/nfvo-catalog/test.robot
@@ -0,0 +1,19 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryswagger_url} /api/catalog/v1/swagger.json
+${queryVNFPackage_url} /api/catalog/v1/vnfpackages
+${queryNSPackages_url} /api/catalog/v1/nspackages
+
+*** Test Cases ***
+GetVNFPackages
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${CATALOG_IP}:8806 headers=${headers}
+ ${resp}= Get Request web_session ${queryVNFPackage_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
diff --git a/tests/vfc/nfvo-driver-ems/test.robot b/tests/vfc/nfvo-driver-ems/test.robot
new file mode 100755
index 00000000..e1a57760
--- /dev/null
+++ b/tests/vfc/nfvo-driver-ems/test.robot
@@ -0,0 +1,31 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryswagger_url} /api/emsdriver/v1/swagger.json
+
+*** Test Cases ***
+EMSDriverSwaggerTest
+ [Documentation] query swagger info of emsdriver
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${EMS_DRV_IP}:8206 headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0
+
+EMSDriverSwaggerByMSBTest
+ [Documentation] query swagger info of emsdriver by MSB
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${MSB_IAG_IP}:80 headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ Should Be Equal 2.0 2.0
+
+ \ No newline at end of file
diff --git a/tests/vfc/nfvo-driver-gvnfm/gvnfmdriver.robot b/tests/vfc/nfvo-driver-gvnfm/gvnfmdriver.robot
new file mode 100644
index 00000000..e7dd612a
--- /dev/null
+++ b/tests/vfc/nfvo-driver-gvnfm/gvnfmdriver.robot
@@ -0,0 +1,21 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryswagger_url} /api/gvnfmdriver/v1/swagger.json
+
+*** Test Cases ***
+VnfresSwaggerTest
+ [Documentation] query gvnfmdriver swagger info rest test
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${GVNFMDRIVER_IP}:8484 headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0
diff --git a/tests/vfc/nfvo-driver-gvnfm/jujudriver.robot b/tests/vfc/nfvo-driver-gvnfm/jujudriver.robot
new file mode 100644
index 00000000..d571ee91
--- /dev/null
+++ b/tests/vfc/nfvo-driver-gvnfm/jujudriver.robot
@@ -0,0 +1,16 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+Library simplejson
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryswagger_url} /openoapi/jujuvnfm/v1/swagger.json
+
+*** Test Cases ***
+SwaggerFuncTest
+ [Documentation] query swagger info rest test
+ Should Be Equal 2.0 2.0
diff --git a/tests/vfc/nfvo-driver-sfc/test.robot b/tests/vfc/nfvo-driver-sfc/test.robot
new file mode 100644
index 00000000..13115943
--- /dev/null
+++ b/tests/vfc/nfvo-driver-sfc/test.robot
@@ -0,0 +1,21 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryswagger_url} /api/ztesdncdriver/v1/swagger
+
+*** Test Cases ***
+ZteSdncDriverSwaggerTest
+ [Documentation] query swagger info of ztesdncdriver
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${SFC_DRV_IP}:8411 headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0
diff --git a/tests/vfc/nfvo-driver-svnfm/huawei.robot b/tests/vfc/nfvo-driver-svnfm/huawei.robot
new file mode 100644
index 00000000..a2aa6394
--- /dev/null
+++ b/tests/vfc/nfvo-driver-svnfm/huawei.robot
@@ -0,0 +1,39 @@
+*** settings ***
+Resource ../../common.robot
+Library Collections
+Library RequestsLibrary
+Library simplejson
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+*** Variables ***
+@{return_ok_list}= 200 201 202 204
+${queryswagger_url} /api/huaweivnfmdriver/v1/swagger.json
+${createauthtoken_url} /rest/plat/smapp/v1/oauth/token
+
+#json files
+${hwvnfm_createtoken_json} ${SCRIPTS}/../tests/vfc/nfvo-driver-svnfm/jsoninput/hwvnfm_createtoken.json
+
+*** Test Cases ***
+SwaggerFuncTest
+ [Documentation] query swagger info rest test
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${SERVICE_IP}:8482 headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0
+
+AuthTokenFuncTest
+ [Documentation] create auth token rest test
+ ${json_value}= json_from_file ${hwvnfm_createtoken_json}
+ ${json_string}= string_from_json ${json_value}
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${SERVICE_IP}:8482 headers=${headers}
+ Set Request Body ${json_string}
+ ${resp}= Put Request web_session ${createauthtoken_url} ${json_string}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code} \ No newline at end of file
diff --git a/tests/vfc/nfvo-driver-svnfm/jsoninput/hwvnfm_createtoken.json b/tests/vfc/nfvo-driver-svnfm/jsoninput/hwvnfm_createtoken.json
new file mode 100644
index 00000000..d21664b0
--- /dev/null
+++ b/tests/vfc/nfvo-driver-svnfm/jsoninput/hwvnfm_createtoken.json
@@ -0,0 +1,13 @@
+{
+ "auth": {
+ "identity": {
+ "methods": ["password"],
+ "password": {
+ "user": {
+ "name": "admin",
+ "password": "User@12345"
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/vfc/nfvo-driver-svnfm/ztevmanager.robot b/tests/vfc/nfvo-driver-svnfm/ztevmanager.robot
new file mode 100644
index 00000000..44a4f9d9
--- /dev/null
+++ b/tests/vfc/nfvo-driver-svnfm/ztevmanager.robot
@@ -0,0 +1,21 @@
+*** settings ***
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryswagger_url} /api/ztevnfmdriver/v1/swagger.json
+
+*** Test Cases ***
+VnfresSwaggerTest
+ [Documentation] query ztevnfmdriver swagger info rest test
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${ZTEVNFMDRIVER_IP}:8410 headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0
diff --git a/tests/vfc/nfvo-lcm/jsoninput/create_ns.json b/tests/vfc/nfvo-lcm/jsoninput/create_ns.json
new file mode 100644
index 00000000..bb39364b
--- /dev/null
+++ b/tests/vfc/nfvo-lcm/jsoninput/create_ns.json
@@ -0,0 +1,6 @@
+{
+ "nsName": "ns1",
+ "csarId": "123",
+ "description": "ns1 desc",
+ "test": "test"
+} \ No newline at end of file
diff --git a/tests/vfc/nfvo-lcm/test.robot b/tests/vfc/nfvo-lcm/test.robot
new file mode 100644
index 00000000..44d23292
--- /dev/null
+++ b/tests/vfc/nfvo-lcm/test.robot
@@ -0,0 +1,64 @@
+*** settings ***
+Resource ../../common.robot
+Library Collections
+Library RequestsLibrary
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+*** Variables ***
+@{return_ok_list}= 200 201 202 204
+${queryswagger_url} /api/nslcm/v1/swagger.json
+${create_ns_url} /api/nslcm/v1/ns
+${delete_ns_url} /api/nslcm/v1/ns
+
+#json files
+${create_ns_json} ${SCRIPTS}/../tests/vfc/nfvo-lcm/jsoninput/create_ns.json
+
+#global variables
+${nsInstId}
+
+*** Test Cases ***
+NslcmSwaggerTest
+ [Documentation] query swagger info of nslcm
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${NSLCM_IP}:8403 headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0
+
+NslcmSwaggerByMSBTest
+ [Documentation] query swagger info of nslcm by MSB
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${MSB_IAG_IP}:80 headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0
+
+CreateNSTest
+ [Documentation] Create NS function test
+ ${json_value}= json_from_file ${create_ns_json}
+ ${json_string}= string_from_json ${json_value}
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${MSB_IAG_IP}:80 headers=${headers}
+ Set Request Body ${json_string}
+ ${resp}= Post Request web_session ${create_ns_url} ${json_string}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${nsInstId}= Convert To String ${response_json['nsInstanceId']}
+ Set Global Variable ${nsInstId}
+
+DeleteNS Test
+ [Documentation] Delete NS function test
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${MSB_IAG_IP}:80 headers=${headers}
+ ${resp}= Delete Request web_session ${delete_ns_url}/${nsInstId}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
diff --git a/tests/vfc/nfvo-multivimproxy/test.robot b/tests/vfc/nfvo-multivimproxy/test.robot
new file mode 100644
index 00000000..fab3694e
--- /dev/null
+++ b/tests/vfc/nfvo-multivimproxy/test.robot
@@ -0,0 +1,24 @@
+*** settings ***
+Resource ../../common.robot
+Library Collections
+Library RequestsLibrary
+Library simplejson
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryswagger_url} /api/multivimproxy/v1/swagger.json
+
+*** Test Cases ***
+SwaggerFuncTest
+ [Documentation] query swagger info rest test
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${RESMGR_IP}:8481 headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0 \ No newline at end of file
diff --git a/tests/vfc/nfvo-resmanagement/test.robot b/tests/vfc/nfvo-resmanagement/test.robot
new file mode 100644
index 00000000..2f247553
--- /dev/null
+++ b/tests/vfc/nfvo-resmanagement/test.robot
@@ -0,0 +1,24 @@
+*** settings ***
+Resource ../../common.robot
+Library Collections
+Library RequestsLibrary
+Library simplejson
+Library OperatingSystem
+Library json
+Library HttpLibrary.HTTP
+
+*** Variables ***
+@{return_ok_list}= 200 201 202
+${queryswagger_url} /api/resmgr/v1/swagger.json
+
+*** Test Cases ***
+SwaggerFuncTest
+ [Documentation] query swagger info rest test
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${RESMGR_IP}:8480 headers=${headers}
+ ${resp}= Get Request web_session ${queryswagger_url}
+ ${responese_code}= Convert To String ${resp.status_code}
+ List Should Contain Value ${return_ok_list} ${responese_code}
+ ${response_json} json.loads ${resp.content}
+ ${swagger_version}= Convert To String ${response_json['swagger']}
+ Should Be Equal ${swagger_version} 2.0 \ No newline at end of file
diff --git a/tests/vfc/nfvo-wfengine/workflow.robot b/tests/vfc/nfvo-wfengine/workflow.robot
new file mode 100644
index 00000000..8039ae17
--- /dev/null
+++ b/tests/vfc/nfvo-wfengine/workflow.robot
@@ -0,0 +1,113 @@
+*** Settings ***
+Resource ../../common.robot
+Library Collections
+Library json
+Library OperatingSystem
+Library RequestsLibrary
+Library HttpLibrary.HTTP
+
+*** Variables ***
+${MSB_IP} 127.0.0.1
+${MSB_PORT} 10550
+${ACTIVITI_IP} 127.0.0.1
+${ACTIVITI_PORT} 8804
+${MGRSERVICE_IP} 127.0.0.1
+${MGRSERVICE_PORT} 8805
+${processId} demo
+${deployid} 0
+${bmpfilepath} ${SCRIPTS}/nfvo-wfengine/demo.bpmn20.xml
+
+*** Test Cases ***
+Deploy BPMN File Test On Activiti
+ [Documentation] Check if the test bpmn file can be deployed in activiti engine
+ ${auth}= Create List kermit kermit
+ ${headers}= Create Dictionary Accept=application/json
+ Create Session web_session http://${ACTIVITI_IP}:${ACTIVITI_PORT} headers=${headers} auth=${auth}
+ ${files}= evaluate {"file":open('${bmpfilepath}','rb')}
+ ${resp}= Post Request web_session /activiti-rest/service/repository/deployments files=${files}
+ Should Be Equal ${resp.status_code} ${201}
+ Log ${resp.json()}
+ ${deployedId}= Set Variable ${resp.json()["id"]}
+ Set Global Variable ${deployedId}
+
+Exectue BPMN File Testt On Activiti
+ [Documentation] Check if the test bpmn file can be exectued in activiti engine
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json Authorization=Basic a2VybWl0Omtlcm1pdA==
+ Create Session web_session http://${ACTIVITI_IP}:${ACTIVITI_PORT} headers=${headers}
+ ${body} Create Dictionary processDefinitionKey=${processId}
+ ${body} dumps ${body}
+ ${resp}= Post Request web_session /activiti-rest/service/runtime/process-instances ${body}
+ Should Be Equal ${resp.status_code} ${201}
+
+UnDeploy BPMN File Testt On Activiti
+ [Documentation] Check if the test bpmn file can be undeployed in activiti engine
+ log ${deployedId}
+ ${auth}= Create List kermit kermit
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${ACTIVITI_IP}:${ACTIVITI_PORT} headers=${headers} auth=${auth}
+ ${resp}= Delete Request web_session /activiti-rest/service/repository/deployments/${deployedId}?cascade=true
+ Should Be Equal ${resp.status_code} ${204}
+
+Deploy BPMN File Test On MgrService
+ [Documentation] Check if the test bpmn file can be deployed in Management Service
+ ${auth}= Create List kermit kermit
+ ${headers}= Create Dictionary Accept=application/json
+ Create Session web_session http://${MGRSERVICE_IP}:${MGRSERVICE_PORT} headers=${headers} auth=${auth}
+ ${files}= evaluate {"file":open('${bmpfilepath}','rb')}
+ ${resp}= Post Request web_session api/workflow/v1/package files=${files}
+ Should Be Equal ${resp.status_code} ${200}
+ Log ${resp.json()}
+ ${deployedId}= Set Variable ${resp.json()["deployedId"]}
+ Set Global Variable ${deployedId}
+
+Exectue BPMN File Testt On MgrService
+ [Documentation] Check if the test bpmn file can be exectued in Management Service
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json Authorization=Basic a2VybWl0Omtlcm1pdA==
+ Create Session web_session http://${MGRSERVICE_IP}:${MGRSERVICE_PORT} headers=${headers}
+ ${body} Create Dictionary processDefinitionKey=${processId}
+ ${body} dumps ${body}
+ ${resp}= Post Request web_session api/workflow/v1/process/instance ${body}
+ Should Be Equal ${resp.status_code} ${200}
+ Log ${resp.json()}
+ Should Be Equal ${resp.json()["processDefinitionKey"]} ${processId}
+
+UnDeploy BPMN File Testt On MgrService
+ [Documentation] Check if the test bpmn file can be undeployed in Management Service
+ log ${deployedId}
+ ${auth}= Create List kermit kermit
+ ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+ Create Session web_session http://${MGRSERVICE_IP}:${MGRSERVICE_PORT} headers=${headers} auth=${auth}
+ ${resp}= Delete Request web_session /api/workflow/v1/package/${deployedId}
+ Should Be Equal ${resp.status_code} ${200}
+
+# Deploy BPMN File Test On MSB
+# [Documentation] Check if the test bpmn file can be deployed in activiti engine
+# ${auth}= Create List kermit kermit
+# ${headers}= Create Dictionary Accept=application/json
+# Create Session web_session http://${MSB_IP}:${MSB_PORT} headers=${headers} auth=${auth}
+# ${files}= evaluate {"file":open('${bmpfilepath}','rb')}
+# ${resp}= Post Request web_session api/workflow/v1/package files=${files}
+# Should Be Equal ${resp.status_code} ${200}
+# Log ${resp.json()}
+# ${deployedId}= Set Variable ${resp.json()["deployedId"]}
+# Set Global Variable ${deployedId}
+
+# Exectue BPMN File Testt On MSB
+# [Documentation] Check if the test bpmn file can be exectued in MSB
+# ${headers} Create Dictionary Content-Type=application/json Accept=application/json Authorization=Basic a2VybWl0Omtlcm1pdA==
+# Create Session web_session http://${MSB_IP}:${MSB_PORT} headers=${headers}
+# ${body} Create Dictionary processDefinitionKey=${processId}
+# ${body} dumps ${body}
+# ${resp}= Post Request web_session api/workflow/v1/process/instance ${body}
+# Should Be Equal ${resp.status_code} ${200}
+# Log ${resp.json()}
+# Should Be Equal ${resp.json()["processDefinitionKey"]} ${processId}
+
+# UnDeploy BPMN File Testt On MSB
+# [Documentation] Check if the test bpmn file can be undeployed in MSB
+# log ${deployedId}
+# ${auth}= Create List kermit kermit
+# ${headers} Create Dictionary Content-Type=application/json Accept=application/json
+# Create Session web_session http://${MSB_IP}:${MSB_PORT} headers=${headers} auth=${auth}
+# ${resp}= Delete Request web_session /api/workflow/v1/package/${deployedId}
+# Should Be Equal ${resp.status_code} ${200}
diff --git a/tests/vid/healthCheck/__init__.robot b/tests/vid/healthCheck/__init__.robot
new file mode 100644
index 00000000..b71d350b
--- /dev/null
+++ b/tests/vid/healthCheck/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation VID - HealthCheck
diff --git a/tests/vid/healthCheck/test1.robot b/tests/vid/healthCheck/test1.robot
new file mode 100644
index 00000000..8f9448d8
--- /dev/null
+++ b/tests/vid/healthCheck/test1.robot
@@ -0,0 +1,15 @@
+*** Settings ***
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Library json
+
+*** Test Cases ***
+Get Requests health check ok
+ [Tags] get
+ CreateSession vid http://localhost:8080
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ ${resp}= Get Request vid /vid/healthCheck headers=&{headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Log to console statusCode: ${resp.json()['statusCode']}
+ Should Be Equal As Strings ${resp.json()['statusCode']} 200
diff --git a/tests/vid/login/__init__.robot b/tests/vid/login/__init__.robot
new file mode 100644
index 00000000..10faf380
--- /dev/null
+++ b/tests/vid/login/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation VID - Login
diff --git a/tests/vid/login/test1.robot b/tests/vid/login/test1.robot
new file mode 100644
index 00000000..acb6aae8
--- /dev/null
+++ b/tests/vid/login/test1.robot
@@ -0,0 +1,78 @@
+*** Settings ***
+Documentation Logins to VID
+Library Selenium2Library
+Library Collections
+Library String
+Library RequestsLibrary
+#Library OSUtils
+Library OperatingSystem
+
+*** Variables ***
+${GLOBAL_APPLICATION_ID} robot-ete
+${GLOBAL_SELENIUM_BROWSER} chrome
+${GLOBAL_SELENIUM_BROWSER_CAPABILITIES} Create Dictionary
+${GLOBAL_SELENIUM_DELAY} 0
+${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT} 5
+${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT} 15
+${VID_ENV} /vid
+${VID_ENDPOINT} http://localhost:8080
+${VID_LOGIN_URL} ${VID_ENDPOINT}${VID_ENV}/login.htm
+${VID_HEALTHCHECK_PATH} ${VID_ENV}/api/v2/users
+${VID_HOME_URL} ${VID_ENDPOINT}${VID_ENV}/welcome.htm
+${GLOBAL_VID_USERNAME} demo
+${GLOBAL_VID_PASSWORD} Kp8bJ4SXszM0WX
+
+
+*** Test Cases ***
+Login To VID GUI
+ [Documentation] Logs in to VID GUI
+ # Setup Browser Now being managed by test case
+ Setup Browser
+ Go To ${VID_LOGIN_URL}
+ #Maximize Browser Window
+ Set Selenium Speed ${GLOBAL_SELENIUM_DELAY}
+ Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+ Log Logging in to ${VID_ENDPOINT}${VID_ENV}
+ #Handle Proxy Warning
+ Title Should Be Login
+ Input Text xpath=//input[@id='loginId'] ${GLOBAL_VID_USERNAME}
+ Input Password xpath=//input[@id='password'] ${GLOBAL_VID_PASSWORD}
+ Click Button xpath=//input[@id='loginBtn']
+ Wait Until Page Contains Welcome to VID ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Log Logged in to ${VID_ENDPOINT}${VID_ENV}
+
+
+*** Keywords ***
+Setup Browser
+ [Documentation] Sets up browser based upon the value of ${GLOBAL_SELENIUM_BROWSER}
+ Run Keyword If '${GLOBAL_SELENIUM_BROWSER}' == 'firefox' Setup Browser Firefox
+ Run Keyword If '${GLOBAL_SELENIUM_BROWSER}' == 'chrome' Setup Browser Chrome
+ Log Running with ${GLOBAL_SELENIUM_BROWSER}
+
+Setup Browser Firefox
+ ${dc} Evaluate sys.modules['selenium.webdriver'].DesiredCapabilities.FIREFOX sys, selenium.webdriver
+ Set To Dictionary ${dc} elementScrollBehavior 1
+ Create Webdriver Firefox desired_capabilities=${dc}
+ Set Global Variable ${GLOBAL_SELENIUM_BROWSER_CAPABILITIES} ${dc}
+
+Setup Browser Chrome
+ #${os}= Get Normalized Os
+ #Log Normalized OS=${os}
+ ${chrome options}= Evaluate sys.modules['selenium.webdriver'].ChromeOptions() sys
+ Call Method ${chrome options} add_argument no-sandbox
+ ${dc} Evaluate sys.modules['selenium.webdriver'].DesiredCapabilities.CHROME sys, selenium.webdriver
+ Set To Dictionary ${dc} elementScrollBehavior 1
+ Create Webdriver Chrome chrome_options=${chrome_options} desired_capabilities=${dc}
+ Set Global Variable ${GLOBAL_SELENIUM_BROWSER_CAPABILITIES} ${dc}
+
+Handle Proxy Warning
+ [Documentation] Handle Intermediate Warnings from Proxies
+ ${status} ${data}= Run Keyword And Ignore Error Variable Should Exist \${GLOBAL_PROXY_WARNING_TITLE}
+ Return From Keyword if '${status}' != 'PASS'
+ ${status} ${data}= Run Keyword And Ignore Error Variable Should Exist \${GLOBAL_PROXY_WARNING_CONTINUE_XPATH}
+ Return From Keyword if '${status}' != 'PASS'
+ Return From Keyword if "${GLOBAL_PROXY_WARNING_TITLE}" == ''
+ Return From Keyword if "${GLOBAL_PROXY_WARNING_CONTINUE_XPATH}" == ''
+ ${test} ${value}= Run keyword and ignore error Title Should Be ${GLOBAL_PROXY_WARNING_TITLE}
+ Run keyword If '${test}' == 'PASS' Click Element xpath=${GLOBAL_PROXY_WARNING_CONTINUE_XPATH}
+ \ No newline at end of file
diff --git a/tests/vid/resources/docker-compose.yml b/tests/vid/resources/docker-compose.yml
new file mode 100644
index 00000000..879c23d4
--- /dev/null
+++ b/tests/vid/resources/docker-compose.yml
@@ -0,0 +1,34 @@
+version: '3'
+services:
+ vid-server:
+ image: nexus3.onap.org:10001/onap/vid:3.0-STAGING-latest
+ environment:
+ - VID_MYSQL_DBNAME=vid_openecomp_epsdk
+ - VID_MYSQL_PASS=Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U
+ - ASDC_CLIENT_REST_HOST=localhost
+ - ASDC_CLIENT_REST_PORT=8443
+ ports:
+ - "8080:8080"
+ container_name: vid-server
+ links:
+ - vid-mariadb:vid-mariadb-docker-instance
+
+ vid-mariadb:
+ image: mariadb:10
+ environment:
+ - MYSQL_DATABASE=vid_openecomp_epsdk
+ - MYSQL_USER=vidadmin
+ - MYSQL_PASSWORD=Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U
+ - MYSQL_ROOT_PASSWORD=LF+tp_1WqgSY
+ container_name: vid-mariadb
+ volumes:
+ - ${WORKSPACE}/data/clone/vid/lf_config/vid-my.cnf:/etc/mysql/my.cnf
+ - /var/lib/mysql
+
+ sdc_simulator:
+ build:
+ context: simulators
+ dockerfile: SDC_simulator
+ ports:
+ - "8443:8443"
+ container_name: sdc_simulator \ No newline at end of file
diff --git a/tests/vid/resources/simulators/SDC.py b/tests/vid/resources/simulators/SDC.py
new file mode 100644
index 00000000..e99a0bdc
--- /dev/null
+++ b/tests/vid/resources/simulators/SDC.py
@@ -0,0 +1,37 @@
+import ssl
+from http.server import BaseHTTPRequestHandler, HTTPServer
+
+from sys import argv
+
+DEFAULT_PORT = 8443
+
+
+class SDCHandler(BaseHTTPRequestHandler):
+
+ def __init__(self, request, client_address, server):
+ self.response_on_get = self._read_on_get_response()
+ super().__init__(request, client_address, server)
+
+ def do_GET(self):
+ self.send_response(200)
+ self._set_headers()
+
+ self.wfile.write(self.response_on_get.encode("utf-8"))
+ return
+
+ def _set_headers(self):
+ self.send_header('Content-Type', 'application/json')
+ self.end_headers()
+
+ @staticmethod
+ def _read_on_get_response():
+ with open('sdc_get_response.json', 'r') as file:
+ return file.read()
+
+
+if __name__ == '__main__':
+ SDCHandler.protocol_version = "HTTP/1.1"
+
+ httpd = HTTPServer(('', DEFAULT_PORT), SDCHandler)
+ httpd.socket = ssl.wrap_socket(httpd.socket, server_side=True, certfile='cert.pem', keyfile='key.pem')
+ httpd.serve_forever()
diff --git a/tests/vid/resources/simulators/SDC_simulator b/tests/vid/resources/simulators/SDC_simulator
new file mode 100644
index 00000000..c099787d
--- /dev/null
+++ b/tests/vid/resources/simulators/SDC_simulator
@@ -0,0 +1,15 @@
+FROM alpine:latest
+
+RUN apk add --no-cache python3 && \
+ python3 -m ensurepip && \
+ rm -r /usr/lib/python*/ensurepip && \
+ pip3 install --upgrade pip setuptools && \
+ if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi && \
+ if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 /usr/bin/python; fi && \
+ rm -r /root/.cache
+
+ADD SDC.py /
+
+EXPOSE 8443
+
+CMD [ "python", "./SDC.py" ]
diff --git a/tests/vid/resources/simulators/cert.pem b/tests/vid/resources/simulators/cert.pem
new file mode 100644
index 00000000..cea1e37a
--- /dev/null
+++ b/tests/vid/resources/simulators/cert.pem
@@ -0,0 +1,74 @@
+Bag Attributes
+ friendlyName: 1
+ localKeyID: 54 69 6D 65 20 31 35 33 35 36 31 39 34 30 35 39 30 38
+subject=/C=US/ST=Michigan/L=Southfield/O=ATT Services, Inc./OU=ASDC/CN=mtanjv9sdcf51.aic.cip.att.com
+issuer=/C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 Secure Server CA - G4
+-----BEGIN CERTIFICATE-----
+MIIGDzCCBPegAwIBAgIQfZLBdhhGhkOBcXuI5oF0gTANBgkqhkiG9w0BAQsFADB+
+MQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAd
+BgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxLzAtBgNVBAMTJlN5bWFudGVj
+IENsYXNzIDMgU2VjdXJlIFNlcnZlciBDQSAtIEc0MB4XDTE1MTIwOTAwMDAwMFoX
+DTE2MTIwODIzNTk1OVowgYkxCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhNaWNoaWdh
+bjETMBEGA1UEBwwKU291dGhmaWVsZDEbMBkGA1UECgwSQVRUIFNlcnZpY2VzLCBJ
+bmMuMQ0wCwYDVQQLDARBU0RDMSYwJAYDVQQDDB1tdGFuanY5c2RjZjUxLmFpYy5j
+aXAuYXR0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOup99Ff
+gk02lwXv535Y1FCCE8vL47BKj96h6to8rXwwN+9W+xiVEIgDXKOWBC7W8iEP2tOd
+Smzi3wsZIivaFh2yPGtj1z0a7WuA7wNw1fJF4WGr4VFaxHbMBaPOZHa3D+iIduWP
+H/t6ECEzfGRRtTt+mVCpV8Rx+v/q8d0yO114u/WBtbGGlIPDJcrHLRODnjM+mkjq
+EwfoR9qqqjbJhjUkUujGM/qVKm3YAjMIZ1ldteRXUew4xI/Foo6u3hqJwbYIJf3r
+fzWCt+fIyktDsm/c1w9HcX+8R0alK90bjC2D5auukIfbmhxd4MR9NBAH0SFleQtw
+SQLN6GYMVexhUEECAwEAAaOCAnswggJ3MCgGA1UdEQQhMB+CHW10YW5qdjlzZGNm
+NTEuYWljLmNpcC5hdHQuY29tMAkGA1UdEwQCMAAwDgYDVR0PAQH/BAQDAgWgMB0G
+A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBhBgNVHSAEWjBYMFYGBmeBDAEC
+AjBMMCMGCCsGAQUFBwIBFhdodHRwczovL2Quc3ltY2IuY29tL2NwczAlBggrBgEF
+BQcCAjAZGhdodHRwczovL2Quc3ltY2IuY29tL3JwYTAfBgNVHSMEGDAWgBRfYM9h
+kFXfhEMUimAqsvV69EMY7zArBgNVHR8EJDAiMCCgHqAchhpodHRwOi8vc3Muc3lt
+Y2IuY29tL3NzLmNybDBXBggrBgEFBQcBAQRLMEkwHwYIKwYBBQUHMAGGE2h0dHA6
+Ly9zcy5zeW1jZC5jb20wJgYIKwYBBQUHMAKGGmh0dHA6Ly9zcy5zeW1jYi5jb20v
+c3MuY3J0MIIBBQYKKwYBBAHWeQIEAgSB9gSB8wDxAHYA3esdK3oNT6Ygi4GtgWhw
+fi6OnQHVXIiNPRHEzbbsvswAAAFRh4XRnAAABAMARzBFAiBXZqph5qeHUUnY8OkH
+jJLo454/8c9IBB7asjEYWYoBPQIhAKAwvP8KfqilgawBkuRV7r41P8Xd3Yi72RQO
+1Dvpi8rkAHcApLkJkLQYWBSHuxOizGdwCjw1mAT5G9+443fNDsgN3BAAAAFRh4XR
+3AAABAMASDBGAiEAon+cZcRpSsuo1aiCtaN3aAG0EqJb/1jJ4m4Q/qo1nEoCIQCr
+KrBNyywa4OTmSVSAsyazbnMr5ldimxNORhhtyGeFLDANBgkqhkiG9w0BAQsFAAOC
+AQEAG3/Mq8F0wbCpOOMCq4dZwgLENBjor9b9UljQZ+sgt7Nn00bfGdxY4MKtOTiK
+9ks/nV9sW0KyvhsZvLPPgdSCnu0MZogWQsKqQDkIkJoHtFRSaYTT1vLAIoKz/dN+
+SBS71EzFH92lMfiFtAjfTrFady0/6z7lp4VZwbXLWjHw6LQESENc29Xw1jpCVkg8
+iB2n/qCFfyw3HuvP+eW2TLmnHOl0tda1vrYKCXT2n7HepiJM3g9yLjb/w3MuxEmw
+dj1DqRemXtOUJW0mQXn1mRBjXEunzHoCr3GaeSU6G3RbIzXr34Hsv4IbggkhRula
+gQIYidtDmw0PS1kyaFvlhZkd1g==
+-----END CERTIFICATE-----
+Bag Attributes
+ friendlyName: CN=Symantec Class 3 Secure Server CA - G4,OU=Symantec Trust Network,O=Symantec Corporation,C=US
+subject=/C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 Secure Server CA - G4
+issuer=/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5
+-----BEGIN CERTIFICATE-----
+MIIFODCCBCCgAwIBAgIQUT+5dDhwtzRAQY0wkwaZ/zANBgkqhkiG9w0BAQsFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMTMxMDMxMDAwMDAwWhcNMjMxMDMwMjM1OTU5WjB+MQsw
+CQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNV
+BAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxLzAtBgNVBAMTJlN5bWFudGVjIENs
+YXNzIDMgU2VjdXJlIFNlcnZlciBDQSAtIEc0MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAstgFyhx0LbUXVjnFSlIJluhL2AzxaJ+aQihiw6UwU35VEYJb
+A3oNL+F5BMm0lncZgQGUWfm893qZJ4Itt4PdWid/sgN6nFMl6UgfRk/InSn4vnlW
+9vf92Tpo2otLgjNBEsPIPMzWlnqEIRoiBAMnF4scaGGTDw5RgDMdtLXO637QYqzu
+s3sBdO9pNevK1T2p7peYyo2qRA4lmUoVlqTObQJUHypqJuIGOmNIrLRM0XWTUP8T
+L9ba4cYY9Z/JJV3zADreJk20KQnNDz0jbxZKgRb78oMQw7jW2FUyPfG9D72MUpVK
+Fpd6UiFjdS8W+cRmvvW1Cdj/JwDNRHxvSz+w9wIDAQABo4IBYzCCAV8wEgYDVR0T
+AQH/BAgwBgEB/wIBADAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vczEuc3ltY2Iu
+Y29tL3BjYTMtZzUuY3JsMA4GA1UdDwEB/wQEAwIBBjAvBggrBgEFBQcBAQQjMCEw
+HwYIKwYBBQUHMAGGE2h0dHA6Ly9zMi5zeW1jYi5jb20wawYDVR0gBGQwYjBgBgpg
+hkgBhvhFAQc2MFIwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuc3ltYXV0aC5jb20v
+Y3BzMCgGCCsGAQUFBwICMBwaGmh0dHA6Ly93d3cuc3ltYXV0aC5jb20vcnBhMCkG
+A1UdEQQiMCCkHjAcMRowGAYDVQQDExFTeW1hbnRlY1BLSS0xLTUzNDAdBgNVHQ4E
+FgQUX2DPYZBV34RDFIpgKrL1evRDGO8wHwYDVR0jBBgwFoAUf9Nlp8Ld7LvwMAnz
+Qzn6Aq8zMTMwDQYJKoZIhvcNAQELBQADggEBAF6UVkndji1l9cE2UbYD49qecxny
+H1mrWH5sJgUs+oHXXCMXIiw3k/eG7IXmsKP9H+IyqEVv4dn7ua/ScKAyQmW/hP4W
+Ko8/xabWo5N9Q+l0IZE1KPRj6S7t9/Vcf0uatSDpCr3gRRAMFJSaXaXjS5HoJJtG
+QGX0InLNmfiIEfXzf+YzguaoxX7+0AjiJVgIcWjmzaLmFN5OUiQt/eV5E1PnXi8t
+TRttQBVSK/eHiXgSgW7ZTaoteNTCLD0IX4eRnh8OsN4wUmSGiaqdZpwOdgyA8nTY
+Kvi4Os7X1g8RvmurFPW9QaAiY4nxug9vKWNmLT+sjHLF+8fk1A/yO0+MKcc=
+-----END CERTIFICATE----- \ No newline at end of file
diff --git a/tests/vid/resources/simulators/key.pem b/tests/vid/resources/simulators/key.pem
new file mode 100644
index 00000000..641d13fa
--- /dev/null
+++ b/tests/vid/resources/simulators/key.pem
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDrqffRX4JNNpcF
+7+d+WNRQghPLy+OwSo/eoeraPK18MDfvVvsYlRCIA1yjlgQu1vIhD9rTnUps4t8L
+GSIr2hYdsjxrY9c9Gu1rgO8DcNXyReFhq+FRWsR2zAWjzmR2tw/oiHbljx/7ehAh
+M3xkUbU7fplQqVfEcfr/6vHdMjtdeLv1gbWxhpSDwyXKxy0Tg54zPppI6hMH6Efa
+qqo2yYY1JFLoxjP6lSpt2AIzCGdZXbXkV1HsOMSPxaKOrt4aicG2CCX96381grfn
+yMpLQ7Jv3NcPR3F/vEdGpSvdG4wtg+WrrpCH25ocXeDEfTQQB9EhZXkLcEkCzehm
+DFXsYVBBAgMBAAECggEBAOkwoYCzIktnFh+Q2R9DpKsZW59QXDfoP95LmAlk+0Gk
+sOSKzCHx9o6vzO4uFmuG08Z1WtIElU2TXKMttotv3Gx8Hp8hBy12xLGYvmlIMNvv
+2+n62xTWXQs0LOx+4Rg7Yml1Bzl1227KxMUlnhPiahO53NldB/Th2D197OA0wVtl
+o3d753CNs+vVk1Z8RTUWrW1ZNHdfQNa1zrNo3Q5/evnlt+mAhFbUIKB3FgMk4N4/
+EjnTH6d+MEUD1sVCNruxqv8PZzRzzJEU/8gzy0WAPFAGOOC7hgU3n7dIEEkjvoIw
+HlZD5c6I+3AzYq08CtUwWI09pNVlznqoOY6d548YusUCgYEA9cHOUXiafXFupqpT
+HwE18Yk5sqISpPwS8yip4NPPUv+W9qvCpdkFvV3HRMlICWJGoerRsALEQYY5fsvY
+7lk1avunprbIa9XLUrvb4ydJYynFhKjXkfTAmyCmbvH8t10BfDNuXT098+4M4HpG
+YW2Arl9Db7RoOBwQtPFX2RmYOM8CgYEA9Xx4TbsbT1C6c49aDZmuFeBXDEaMTDYS
+CC50MqMQpfoqS5QVyjl7JzP/dIz9CcUExFz7MOmYCp8yocXnLwxGDrZjZMkwEz15
+8WUGj4WMpSpUSRmGEVnoVE5bRazq37vhbOwh8gcKhF1ifVgwm+Rjs+4g6DwmSR8l
+4CVK6lWrCe8CgYEA5QR7kR6z0Wywse4N0dnd/D1mIFq6xzcFLcZaMOMR1IXMmAjO
+NqF8oNDQjwCH+f60VdWvHLgnTeyYjdnHSa6mghEMVecF9L/iXzIjopaM5DUcFRkG
+8sRD7QxLLR6i4/lvFeAT3B3jKvtO0q4AAnD6NwUdoe5cJNW6l/REalNYsK8CgYBw
+n7lF2CiwW9YevE7RXIc8rB7jl943/LqLHFzc+mjh7QLIh9jzXSm+E6IIY8KXX9dP
+C2WGzDSf8ue0xmnI8PWXPGAfVhoDSboPYI0A/YFIKUJgAyC6ByiKvSQstCdRnA3Q
+/giY1Fgj4AAWh4ZNjxua6g4Y3bem5m5nBlT3a3Q76wKBgQDSMFNfVNWautPQvcYB
+iu9oQhbXVkjh+ToFWq6pW4VaWhEf/6hqvihc6PcB7FXJ1v1/ybko6cIgVmFUt43s
+it1q5aLy3v6GTS/UnDZI3r5oECEuLeUqnHm3qilbatUtwvxghgdwGK+YG0yTfS3y
+GqdNDH5YdJJMyiLdQlLIzJb/XQ==
+-----END PRIVATE KEY-----
diff --git a/tests/vid/resources/simulators/sdc_get_response.json b/tests/vid/resources/simulators/sdc_get_response.json
new file mode 100644
index 00000000..9f7e118c
--- /dev/null
+++ b/tests/vid/resources/simulators/sdc_get_response.json
@@ -0,0 +1,301 @@
+{
+ "service": {
+ "uuid": "2763bc78-8523-482f-895b-0c0db7364224",
+ "invariantUuid": "abb2dc66-b211-49d2-ab2f-8774694136fa",
+ "name": "Bare2",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "Network L1-3",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "Bare2",
+ "serviceEcompNaming": "true",
+ "instantiationType": "ClientConfig",
+ "inputs": {}
+ },
+ "vnfs": {
+ "95e654c0-676b-4386-8a69 0": {
+ "uuid": "d6395498-7ecb-4eba-bf84-4380f6e9cdcf",
+ "invariantUuid": "16262b97-bcb1-4033-8f9f-a3016eaf1ec3",
+ "description": "vendor software product",
+ "name": "95e654c0-676b-4386-8a69",
+ "version": "1.0",
+ "customizationUuid": "34a3b91d-8d73-4412-bf4e-c6456741007f",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "vf_module_id": "vTrafficPNG",
+ "repo_url_blob": "https://nexus.onap.org/content/sites/raw",
+ "unprotected_private_subnet_id": "zdfw1fwl01_unprotected_sub",
+ "public_net_id": "PUT THE PUBLIC NETWORK ID HERE",
+ "vfw_private_ip_0": "192.168.10.100",
+ "onap_private_subnet_id": "PUT THE ONAP PRIVATE NETWORK NAME HERE",
+ "onap_private_net_cidr": "10.0.0.0/16",
+ "image_name": "PUT THE VM IMAGE NAME HERE (UBUNTU 1404)",
+ "flavor_name": "PUT THE VM FLAVOR NAME HERE (m1.medium suggested)",
+ "vnf_id": "vPNG_Firewall_demo_app",
+ "vpg_name_0": "zdfw1fwl01pgn01",
+ "vpg_private_ip_1": "10.0.100.2",
+ "vsn_private_ip_0": "192.168.20.250",
+ "vpg_private_ip_0": "192.168.10.200",
+ "protected_private_net_cidr": "192.168.20.0/24",
+ "unprotected_private_net_cidr": "192.168.10.0/24",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "multi_stage_design": "false",
+ "onap_private_net_id": "PUT THE ONAP PRIVATE NETWORK NAME HERE",
+ "unprotected_private_net_id": "zdfw1fwl01_unprotected",
+ "availability_zone_max_count": "1",
+ "demo_artifacts_version": "1.2.1",
+ "pub_key": "PUT YOUR PUBLIC KEY HERE",
+ "key_name": "vfw_key",
+ "repo_url_artifacts": "https://nexus.onap.org/content/repositories/releases",
+ "install_script_version": "1.2.1",
+ "cloud_env": "PUT openstack OR rackspace HERE"
+ },
+ "type": "VF",
+ "modelCustomizationName": "95e654c0-676b-4386-8a69 0",
+ "vfModules": {
+ "95e654c0676b43868a690..95e654c0676b43868a69..base_vpkg..module-0": {
+ "uuid": "12082e9d-a854-48cc-8243-e24b26199856",
+ "invariantUuid": "239419df-3375-49fe-9dd4-73b3393858ba",
+ "customizationUuid": "32c824f7-5910-4d7a-88ad-188d4905675d",
+ "description": null,
+ "name": "95e654c0676b43868a69..base_vpkg..module-0",
+ "version": "1",
+ "volumeGroupAllowed": false,
+ "commands": {},
+ "modelCustomizationName": "95e654c0676b43868a69..base_vpkg..module-0",
+ "properties": {
+ "min_vf_module_instances": {
+ "name": "min_vf_module_instances",
+ "value": 1,
+ "entrySchema": null,
+ "required": true,
+ "constraints": [],
+ "description": "The minimum instances of this VF-Module",
+ "default": null,
+ "type": "integer"
+ },
+ "vf_module_label": {
+ "name": "vf_module_label",
+ "value": "base_vpkg",
+ "entrySchema": null,
+ "required": true,
+ "constraints": [],
+ "description": "Alternate textual key used to reference this VF-Module model. Must be unique within the VNF model\n",
+ "default": null,
+ "type": "string"
+ },
+ "max_vf_module_instances": {
+ "name": "max_vf_module_instances",
+ "value": 1,
+ "entrySchema": null,
+ "required": false,
+ "constraints": [],
+ "description": "The maximum instances of this VF-Module",
+ "default": null,
+ "type": "integer"
+ },
+ "vfc_list": {
+ "name": "vfc_list",
+ "value": null,
+ "entrySchema": {
+ "description": "<vfc_id>:<count>",
+ "type": "string"
+ },
+ "required": false,
+ "constraints": [],
+ "description": "Identifies the set of VM types and their count included in the VF-Module\n",
+ "default": null,
+ "type": "map"
+ },
+ "vf_module_type": {
+ "name": "vf_module_type",
+ "value": "Base",
+ "entrySchema": null,
+ "required": true,
+ "constraints": [],
+ "description": "",
+ "default": null,
+ "type": "string"
+ },
+ "vf_module_description": {
+ "name": "vf_module_description",
+ "value": null,
+ "entrySchema": null,
+ "required": true,
+ "constraints": [],
+ "description": "Description of the VF-modules contents and purpose (e.g. \"Front-End\" or \"Database Cluster\")\n",
+ "default": null,
+ "type": "string"
+ },
+ "initial_count": {
+ "name": "initial_count",
+ "value": 1,
+ "entrySchema": null,
+ "required": false,
+ "constraints": [],
+ "description": "The initial count of instances of the VF-Module. The value must be in the range between min_vfmodule_instances and max_vfmodule_instances. If no value provided the initial count is the min_vfmodule_instances.\n",
+ "default": null,
+ "type": "integer"
+ },
+ "volume_group": {
+ "name": "volume_group",
+ "value": false,
+ "entrySchema": null,
+ "required": true,
+ "constraints": [],
+ "description": "\"true\" indicates that this VF Module model requires attachment to a Volume Group. VID operator must select the Volume Group instance to attach to a VF-Module at deployment time.\n",
+ "default": false,
+ "type": "boolean"
+ },
+ "availability_zone_count": {
+ "name": "availability_zone_count",
+ "value": null,
+ "entrySchema": null,
+ "required": false,
+ "constraints": [],
+ "description": "Quantity of Availability Zones needed for this VF-Module (source: Extracted from VF-Module HEAT template)\n",
+ "default": null,
+ "type": "integer"
+ },
+ "isBase": {
+ "name": "isBase",
+ "value": false,
+ "entrySchema": null,
+ "required": true,
+ "constraints": [],
+ "description": "Whether this module should be deployed before other modules",
+ "default": false,
+ "type": "boolean"
+ }
+ }
+ }
+ },
+ "volumeGroups": {}
+ }
+ },
+ "networks": {},
+ "configurations": {},
+ "serviceProxies": {},
+ "vfModules": {
+ "95e654c0676b43868a690..95e654c0676b43868a69..base_vpkg..module-0": {
+ "uuid": "12082e9d-a854-48cc-8243-e24b26199856",
+ "invariantUuid": "239419df-3375-49fe-9dd4-73b3393858ba",
+ "customizationUuid": "32c824f7-5910-4d7a-88ad-188d4905675d",
+ "description": null,
+ "name": "95e654c0676b43868a69..base_vpkg..module-0",
+ "version": "1",
+ "volumeGroupAllowed": false,
+ "commands": {},
+ "modelCustomizationName": "95e654c0676b43868a69..base_vpkg..module-0",
+ "properties": {
+ "min_vf_module_instances": {
+ "name": "min_vf_module_instances",
+ "value": 1,
+ "entrySchema": null,
+ "required": true,
+ "constraints": [],
+ "description": "The minimum instances of this VF-Module",
+ "default": null,
+ "type": "integer"
+ },
+ "vf_module_label": {
+ "name": "vf_module_label",
+ "value": "base_vpkg",
+ "entrySchema": null,
+ "required": true,
+ "constraints": [],
+ "description": "Alternate textual key used to reference this VF-Module model. Must be unique within the VNF model\n",
+ "default": null,
+ "type": "string"
+ },
+ "max_vf_module_instances": {
+ "name": "max_vf_module_instances",
+ "value": 1,
+ "entrySchema": null,
+ "required": false,
+ "constraints": [],
+ "description": "The maximum instances of this VF-Module",
+ "default": null,
+ "type": "integer"
+ },
+ "vfc_list": {
+ "name": "vfc_list",
+ "value": null,
+ "entrySchema": {
+ "description": "<vfc_id>:<count>",
+ "type": "string"
+ },
+ "required": false,
+ "constraints": [],
+ "description": "Identifies the set of VM types and their count included in the VF-Module\n",
+ "default": null,
+ "type": "map"
+ },
+ "vf_module_type": {
+ "name": "vf_module_type",
+ "value": "Base",
+ "entrySchema": null,
+ "required": true,
+ "constraints": [],
+ "description": "",
+ "default": null,
+ "type": "string"
+ },
+ "vf_module_description": {
+ "name": "vf_module_description",
+ "value": null,
+ "entrySchema": null,
+ "required": true,
+ "constraints": [],
+ "description": "Description of the VF-modules contents and purpose (e.g. \"Front-End\" or \"Database Cluster\")\n",
+ "default": null,
+ "type": "string"
+ },
+ "initial_count": {
+ "name": "initial_count",
+ "value": 1,
+ "entrySchema": null,
+ "required": false,
+ "constraints": [],
+ "description": "The initial count of instances of the VF-Module. The value must be in the range between min_vfmodule_instances and max_vfmodule_instances. If no value provided the initial count is the min_vfmodule_instances.\n",
+ "default": null,
+ "type": "integer"
+ },
+ "volume_group": {
+ "name": "volume_group",
+ "value": false,
+ "entrySchema": null,
+ "required": true,
+ "constraints": [],
+ "description": "\"true\" indicates that this VF Module model requires attachment to a Volume Group. VID operator must select the Volume Group instance to attach to a VF-Module at deployment time.\n",
+ "default": false,
+ "type": "boolean"
+ },
+ "availability_zone_count": {
+ "name": "availability_zone_count",
+ "value": null,
+ "entrySchema": null,
+ "required": false,
+ "constraints": [],
+ "description": "Quantity of Availability Zones needed for this VF-Module (source: Extracted from VF-Module HEAT template)\n",
+ "default": null,
+ "type": "integer"
+ },
+ "isBase": {
+ "name": "isBase",
+ "value": false,
+ "entrySchema": null,
+ "required": true,
+ "constraints": [],
+ "description": "Whether this module should be deployed before other modules",
+ "default": false,
+ "type": "boolean"
+ }
+ }
+ }
+ },
+ "volumeGroups": {},
+ "pnfs": {}
+} \ No newline at end of file
diff --git a/tests/vnfsdk-ice/ice-server/heat_template_empty.zip b/tests/vnfsdk-ice/ice-server/heat_template_empty.zip
new file mode 100644
index 00000000..d1e6d997
--- /dev/null
+++ b/tests/vnfsdk-ice/ice-server/heat_template_empty.zip
Binary files differ
diff --git a/tests/vnfsdk-ice/ice-server/heat_template_ok.zip b/tests/vnfsdk-ice/ice-server/heat_template_ok.zip
new file mode 100644
index 00000000..4e89aba3
--- /dev/null
+++ b/tests/vnfsdk-ice/ice-server/heat_template_ok.zip
Binary files differ
diff --git a/tests/vnfsdk-ice/ice-server/validation_test.robot b/tests/vnfsdk-ice/ice-server/validation_test.robot
new file mode 100644
index 00000000..1a134b01
--- /dev/null
+++ b/tests/vnfsdk-ice/ice-server/validation_test.robot
@@ -0,0 +1,69 @@
+*** settings ***
+Library OperatingSystem
+Library Process
+Library String
+Library Collections
+Library RequestsLibrary
+Library json
+
+
+*** Variables ***
+${valid_heat_zip} ${SCRIPTS}/../tests/vnfsdk-ice/ice-server/heat_template_ok.zip
+${empty_heat_zip} ${SCRIPTS}/../tests/vnfsdk-ice/ice-server/heat_template_empty.zip
+${ice_uri} /onapapi/ice/v1/
+
+*** Test Cases ***
+
+ICE health Check
+ [Documentation] Validate that ICE is up
+ Create Session ice_session http://${ICE_IP}:5000
+ &{headers}= Create Dictionary Content-Type=application/json
+
+ ${resp}= Get Request ice_session ${ice_uri} headers=${headers}
+
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Check status code for valid HEAT based VNF package
+ [Documentation] Post a valid VNF package and expect 200 Response
+ ${fileData}= Get Binary File ${valid_heat_zip}
+ ${fileDir} ${fileName}= Split Path ${valid_heat_zip}
+ ${partData}= Create List ${fileName} ${fileData} application/octet-stream
+ &{fileParts}= Create Dictionary
+ Set To Dictionary ${fileParts} file=${partData}
+
+ ${resp}= Post Request ice_session ${ice_uri} files=${fileParts}
+
+ Log Receive HTTP Status code ${resp.status_code}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${json} = Set Variable ${resp.json()}
+ ${message} = Get From Dictionary ${json} message
+ Should Be Equal ${message} OK
+
+Check status code for empty VNF package
+ [Documentation] Post an empty VNF package and expect 422 Response
+ ${fileData}= Get Binary File ${empty_heat_zip}
+ ${fileDir} ${fileName}= Split Path ${empty_heat_zip}
+ ${partData}= Create List ${fileName} ${fileData} application/octet-stream
+ &{fileParts}= Create Dictionary
+ Set To Dictionary ${fileParts} file=${partData}
+
+ ${resp}= Post Request ice_session ${ice_uri} files=${fileParts}
+
+ Log Receive HTTP Status code ${resp.status_code}
+ Should Be Equal As Strings ${resp.status_code} 422
+ ${json} = Set Variable ${resp.json()}
+ ${message} = Get From Dictionary ${json} message
+ Should Be Equal ${message} Tests failed
+
+Check status code for invalid request
+ [Documentation] Post an invalid request and expect 400 Response
+ ${fileData}= Get Binary File ${empty_heat_zip}
+ ${fileDir} ${fileName}= Split Path ${empty_heat_zip}
+ ${partData}= Create List ${fileName} ${fileData} application/octet-stream
+ &{fileParts}= Create Dictionary
+ Set To Dictionary ${fileParts} foo=${partData}
+
+ ${resp}= Post Request ice_session ${ice_uri} files=${fileParts}
+
+ Log Receive HTTP Status code ${resp.status_code}
+ Should Be Equal As Strings ${resp.status_code} 400
diff --git a/tests/vnfsdk-marketplace/provision/enterprise2DC.csar b/tests/vnfsdk-marketplace/provision/enterprise2DC.csar
new file mode 100644
index 00000000..0960b20a
--- /dev/null
+++ b/tests/vnfsdk-marketplace/provision/enterprise2DC.csar
Binary files differ
diff --git a/tests/vnfsdk-marketplace/provision/sanity_test_vnfsdktestfunction.robot b/tests/vnfsdk-marketplace/provision/sanity_test_vnfsdktestfunction.robot
new file mode 100644
index 00000000..01ece239
--- /dev/null
+++ b/tests/vnfsdk-marketplace/provision/sanity_test_vnfsdktestfunction.robot
@@ -0,0 +1,55 @@
+*** settings ***
+Library OperatingSystem
+Library Process
+Library String
+Library Collections
+Library RequestsLibrary
+Library json
+
+
+*** Variables ***
+${csarpath} ${SCRIPTS}/../tests/vnfsdk-marketplace/provision/enterprise2DC.csar
+${csarId} 0
+
+*** Test Cases ***
+
+Upload VNF Package to VNF Repository
+ [Documentation] Upload the VNF Package
+ ${resp}= Run curl -s -X POST -H "Content-Type: multipart/form-data" -F "file=@${csarpath}" http://${REPO_IP}:8702/onapapi/vnfsdk-marketplace/v1/PackageResource/csars
+ Should Contain ${resp} csarId
+ ${csarjson}= Evaluate ${resp}
+ ${csarId}= Set Variable ${csarjson["csarId"]}
+ Set Global Variable ${csarId}
+
+Get VNF Package Information from Repository
+ Create Session refrepo http://${REPO_IP}:8702
+ &{headers}= Create Dictionary Content-Type=application/json
+ ${resp}= Get Request refrepo /onapapi/vnfsdk-marketplace/v1/PackageResource/csars/${csarId} headers=${headers}
+ ${response_json} json.loads ${resp.content}
+ ${downloadUri}= Convert To String ${response_json['downloadUri']}
+ Should Contain ${downloadUri} ${csarId}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Get List Of Requests
+ Create Session refrepo http://${REPO_IP}:8702
+ &{headers}= Create Dictionary Content-Type=application/json
+ ${resp}= Get Request refrepo /onapapi/vnfsdk-marketplace/v1/PackageResource/csars?name=enterprise2DC&version=1.0&type=SSAR&provider=huawei headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Download VNF Package from Repository
+ Create Session refrepo http://${REPO_IP}:8702
+ &{headers}= Create Dictionary Content-Type=application/json
+ ${resp}= Get Request refrepo /onapapi/vnfsdk-marketplace/v1/PackageResource/csars/${csarId}/files headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${downloadUri}= Convert To String ${resp.content}
+ ${downloadUri1}= Run curl http://${REPO_IP}:8702/onapapi/vnfsdk-marketplace/v1/PackageResource/csars/${csarId}/files
+ ${string}= Convert To String ${downloadUri1}
+ Should Contain ${downloadUri1} ' % Total % Received % Xferd Average
+ Should Contain ${string} ' % Total % Received % Xferd Average
+
+Delete VNF Package from Repository
+ Create Session refrepo http://${REPO_IP}:8702
+ &{headers}= Create Dictionary Content-Type=application/json
+ ${resp}= Delete Request refrepo /onapapi/vnfsdk-marketplace/v1/PackageResource/csars/${csarId} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+
diff --git a/tests/vnfsdk-marketplace/provision/uploadCSAR.sh b/tests/vnfsdk-marketplace/provision/uploadCSAR.sh
new file mode 100644
index 00000000..800f833d
--- /dev/null
+++ b/tests/vnfsdk-marketplace/provision/uploadCSAR.sh
@@ -0,0 +1,132 @@
+#!/usr/bin/env bash
+###############################################################################
+# Copyright 2017 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+###############################################################################
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+echo $SCRIPT_DIR
+
+#CHECK IF MSB_ADDR IS GIVEN IN COMMAND
+if [ -z "$1" ]
+then
+ echo "There is no MSB_ADDR"
+ exit 1
+fi
+MSB_ADDR=$1
+CSAR_NAME=$2
+echo $MSB_ADDR
+echo $CSAR_NAME
+
+
+###########################################
+###########################################
+###########################################
+###########################################
+###########################################
+###########################################
+############UOLOAD PACKAGE to MARKET PLACE######################
+echo
+echo "############## UOLOAD PACKAGE to MARKET PLACE STARTED ##############";
+UploadPackageResponse=$(curl -sS -X POST -H "Content-Type: multipart/form-data;" -F "file=@$CSAR_NAME" http://$MSB_ADDR/openoapi/vnfsdk-marketplace/v1/PackageResource/csars)
+if echo "$UploadPackageResponse" | grep -q "\"csarId\""; then
+ echo "UOLOAD PACKAGE TO MARKET PLACE SUCSSS !!!";
+else
+ echo "UploadPackageResponse :$UploadPackageResponse"
+ echo "UOLOAD PACKAGE TO MARKET PLACE FAILED !!!";
+ exit 1;
+fi
+UploadCsarId=$(echo ${UploadPackageResponse:11:36})
+echo "PACKAGE ID:$UploadCsarId"
+echo "############## UOLOAD PACKAGE to MARKET PLACE END ##################";
+#######UOLOAD PACKAGE to MARKET PLACE END#############
+###########################################
+###########################################
+###########################################
+###########################################
+###########################################
+###########################################
+###########################################
+################GET ON BOARD STATUS########
+echo
+echo "####################### GETTING ON-BOARDING STATUS ##################";
+#sleeping for 10 sec so thate ON Boarding operation should be happened at backend
+for pc in $(seq 1 10); do
+ status=$((${pc}*10));
+ echo -ne "ON_BOARDING Status (%): $status\033[0K\r"
+ sleep 1
+done
+echo
+
+#Three Retries for getting On Boarding Result
+#count=0
+#while [ $count -lt 3 ]
+#do
+# OnBoardStatusResponse=$(curl -sS -X GET "http://$MSB_ADDR/openoapi/vnfsdk-marketplace/v1/PackageResource/csars/$UploadCsarId/onboardstatus?operTypeId=functiontest&operId=functestexec" -H "Accept: application/json" -H "Content-Type: application/json")
+# echo $OnBoardStatusResponse
+# if echo "$OnBoardStatusResponse" | grep -q "\"status\":0"; then
+# break;
+# else
+# if [ $count -eq 3 ]
+# then
+# echo "ON-BOARDING OPERATION FAILED !!!";
+# fi
+# count=`expr $count + 1`;
+# sleep 3;
+# fi
+#done
+echo "GET ON-BOARDING RESULT OPERATION SUCESS ";
+echo "##################### GETTING ON-BOARDING STATUS END #################";
+####################GET ON BOARD STATUS END############
+##########################################
+##########################################
+##########################################
+##########################################
+##########################################
+#################DOWNLOAD PACKAGE#########
+echo
+echo "############## DOWNLOADED PACKAGE FROM MARKET STARTED #################";
+PACKAGE_NAME=market_temp.csar
+curl -sS -X GET "http://$MSB_ADDR/openoapi/vnfsdk-marketplace/v1/PackageResource/csars/$UploadCsarId/files" > $PACKAGE_NAME
+fileSize=$(du -b $PACKAGE_NAME | cut -f 1)
+if [ $fileSize -eq 0 ]
+then
+ echo "DOWNLOADED PACKAGE FROM MARKET NOT PROPER, ON-BOARDING OPERATION FAILED !!!";
+ exit 1;
+fi
+echo "DOWNLOADED PACKAGE FROM MARKET OPERATION SUCESS !!!";
+echo "MARKET PACKAGE NAME:$PACKAGE_NAME"
+echo "##################### DOWNLOADED PACKAGE FROM MARKET ##################";
+###################DOWNLOAD PACKAGE END#####################
+##########################################
+##########################################
+##########################################
+##########################################
+##########CATALOUGE START#################
+echo
+PACKAGE_NAME=$CSAR_NAME
+#Check if common-tosca-catalog is registered with MSB or not
+#curl -sS -X GET http://$MSB_ADDR/api/microservices/v1/services/catalog/version/v1 -H "Accept: application/json" -H "Content-Type: application/json"
+#check if common-tosca-aria is registered with MSB or not
+#curl -sS -X GET http://$MSB_ADDR/api/microservices/v1/services/tosca/version/v1 -H "Accept: application/json" -H "Content-Type: application/json"
+#echo Sending POST request to Catalog
+CsarIdString=$(curl -sS -X POST -H "Content-Type: multipart/form-data; boundary=-WebKitFormBoundary7MA4YWxkTrZu0gW" -H "Cache-Control: no-cache" -H "Postman-Token: abcb6497-b225-c592-01be-e9ff460ca188" -F "file=@$PACKAGE_NAME" http://$MSB_ADDR/openoapi/catalog/v1/csars)
+#getting csarId from the output of curl request
+CsarId=$(echo ${CsarIdString:11:36})
+echo $CsarId
+echo $CsarIdString
+#csarid is sucessfully stored in CsarId variable
+echo "====finished======"
+##########CATALOUGE END############
+echo "DELETING PACAKE LOCAL COPY:$PACKAGE_NAME";
+#rm $PACKAGE_NAME;
diff --git a/tests/vnfsdk-pkgtools/tosca-metadata/create_open.robot b/tests/vnfsdk-pkgtools/tosca-metadata/create_open.robot
new file mode 100644
index 00000000..c23fd431
--- /dev/null
+++ b/tests/vnfsdk-pkgtools/tosca-metadata/create_open.robot
@@ -0,0 +1,24 @@
+*** settings ***
+Library OperatingSystem
+
+
+*** Variables ***
+${csarpath} ${SCRIPTS}/../tests/vnfsdk-pkgtools/tosca-metadata/csar
+${create_output} ${OUTPUT DIR}/test.csar
+${open_dir} ${OUTPUT DIR}/extracted
+
+*** Test Cases ***
+Create CSAR package
+ [Documentation] Create CSAR package
+ ${output}= Run vnfsdk csar-create -d ${create_output} --manifest test_entry.mf --history ChangeLog.txt --tests Tests --licenses Licenses ${csarpath} test_entry.yaml
+ Log ${output}
+ File Should Exist ${create_output}
+
+Open CSAR package
+ [Documentation] Open CSAR package
+ ${output}= Run vnfsdk csar-open -d ${open_dir} ${create_output}
+ Log ${output}
+ Directory Should Not Be Empty ${open_dir}
+ ${rc} ${output}= Run and Return RC And Output diff -r -x TOSCA-Metadata ${open_dir} ${csarpath}
+ Should Be Equal As Integers ${rc} 0
+ Log ${output}
diff --git a/tests/vnfsdk-pkgtools/tosca-metadata/create_validate_digest_signing.robot b/tests/vnfsdk-pkgtools/tosca-metadata/create_validate_digest_signing.robot
new file mode 100644
index 00000000..470b7c31
--- /dev/null
+++ b/tests/vnfsdk-pkgtools/tosca-metadata/create_validate_digest_signing.robot
@@ -0,0 +1,21 @@
+*** settings ***
+Library OperatingSystem
+
+
+*** Variables ***
+${csarpath} ${SCRIPTS}/../tests/vnfsdk-pkgtools/tosca-metadata/csar
+${keyfile} ${SCRIPTS}/../tests/vnfsdk-pkgtools/tosca-metadata/test.key
+${create_output} ${OUTPUT DIR}/test_signing.csar
+
+*** Test Cases ***
+Create CSAR package
+ [Documentation] Create CSAR package
+ ${output}= Run vnfsdk csar-create -d ${create_output} --manifest test_entry.mf --history ChangeLog.txt --tests Tests --licenses Licenses --certificate test.crt --privkey ${keyfile} ${csarpath} test_entry.yaml
+ Log ${output}
+ File Should Exist ${create_output}
+
+Validate CSAR package
+ [Documentation] Validate CSAR package
+ ${rc} ${output}= Run and Return RC And Output vnfsdk csar-validate ${create_output}
+ Should Be Equal As Integers ${rc} 0
+ Log ${output}
diff --git a/tests/vnfsdk-pkgtools/tosca-metadata/csar/ChangeLog.txt b/tests/vnfsdk-pkgtools/tosca-metadata/csar/ChangeLog.txt
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/vnfsdk-pkgtools/tosca-metadata/csar/ChangeLog.txt
diff --git a/tests/vnfsdk-pkgtools/tosca-metadata/csar/Licenses/LICENSE.txt b/tests/vnfsdk-pkgtools/tosca-metadata/csar/Licenses/LICENSE.txt
new file mode 100644
index 00000000..d6456956
--- /dev/null
+++ b/tests/vnfsdk-pkgtools/tosca-metadata/csar/Licenses/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/tests/vnfsdk-pkgtools/tosca-metadata/csar/Tests/test b/tests/vnfsdk-pkgtools/tosca-metadata/csar/Tests/test
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/vnfsdk-pkgtools/tosca-metadata/csar/Tests/test
diff --git a/tests/vnfsdk-pkgtools/tosca-metadata/csar/test.crt b/tests/vnfsdk-pkgtools/tosca-metadata/csar/test.crt
new file mode 100644
index 00000000..63c85d4b
--- /dev/null
+++ b/tests/vnfsdk-pkgtools/tosca-metadata/csar/test.crt
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAggCCQDrDujRIFtRTDANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJQ
+VDEPMA0GA1UECAwGTGlzYm9hMQ8wDQYDVQQHDAZMaXNib2ExFDASBgNVBAoMC0V4
+YW1wbGUgT3JnMCAXDTE4MDgyNDA2MjY1OVoYDzIxMTYwMjEyMDYyNjU5WjBdMQsw
+CQYDVQQGEwJQVDEPMA0GA1UECAwGTGlzYm9hMQ8wDQYDVQQHDAZMaXNib2ExFDAS
+BgNVBAoMC0V4YW1wbGUgT3JnMRYwFAYDVQQDDA0qLmV4YW1wbGUub3JnMIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwVDDqoO+C5dxgi1nnky+D4qqVdFG
+mX3H4q6zFPUAkve3gElfttuDfbmN+OYCWhvKcjUN1Y2xjt+0aeRJVuQ+eumEX/1F
+76i2t9c66fWPtdZ0V8IuDc2ajNxbKiAwYrwVl3AS2tJ32psHRLvpmLoOVz9UXY0J
+rDwr274Z38wIqEGrUQ9hdOebEggeVu6Mv3pZUBYGGo9VX1/PTZguOaP85nC193Ux
+SJe2+KV6aoc0odiokFmWK2JJrNb8bMjrQcQqp86JMW1DHyon5sF6edTIilxgC+SH
+gapT5hZeoNnh3rAgHiWXF8ZOvho341s+7I78pbEtqCXNbF3VqikFlWmStQIDAQAB
+MA0GCSqGSIb3DQEBCwUAA4IBAQCh8CffE1amceKSb7USEfkpsDbNYo+IWMDyVo9g
+WQOYVIqIFGS8RMzs43Y6nIYJ/9pJUG10Qc4Yq1ZEqsV771Fz6WHx3zlJakVww/Ph
+CxbakjO3EzIHVjEWIu3sUfMdyOeF0ZDHDnfQZYWC17d2jE+s8rH2epl2h1jhi8fS
+i+eT2QDv8lHAM2mdM4jSwoCSsN7FImRxcYPoCxYwVkjVkmHhEMaUdqa1LKY/0YBf
+PFm0pVDCBJZZvKGql44eKiaY/GNW9IyzQFprT8V1rhD1fbTBFXghVGVaUi2Am3JD
++eZYMzd4rzFLZm8bjNm0Oler1UJSR1K91lOEig3M8FTN6JRE
+-----END CERTIFICATE-----
diff --git a/tests/vnfsdk-pkgtools/tosca-metadata/csar/test_entry.mf b/tests/vnfsdk-pkgtools/tosca-metadata/csar/test_entry.mf
new file mode 100644
index 00000000..4441457e
--- /dev/null
+++ b/tests/vnfsdk-pkgtools/tosca-metadata/csar/test_entry.mf
@@ -0,0 +1,5 @@
+metadata:
+vnf_product_name: test
+vnf_provider_id: test
+vnf_package_version: 1.0
+vnf_release_data_time: 2017-09-15T15:00:03+08:00
diff --git a/tests/vnfsdk-pkgtools/tosca-metadata/csar/test_entry.yaml b/tests/vnfsdk-pkgtools/tosca-metadata/csar/test_entry.yaml
new file mode 100644
index 00000000..5c2f8909
--- /dev/null
+++ b/tests/vnfsdk-pkgtools/tosca-metadata/csar/test_entry.yaml
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2017 GigaSpaces Technologies Ltd. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+topology_template:
+ node_templates:
+ test_node:
+ type: tosca.nodes.Compute
+
diff --git a/tests/vnfsdk-pkgtools/tosca-metadata/test.key b/tests/vnfsdk-pkgtools/tosca-metadata/test.key
new file mode 100644
index 00000000..06781d17
--- /dev/null
+++ b/tests/vnfsdk-pkgtools/tosca-metadata/test.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAwVDDqoO+C5dxgi1nnky+D4qqVdFGmX3H4q6zFPUAkve3gElf
+ttuDfbmN+OYCWhvKcjUN1Y2xjt+0aeRJVuQ+eumEX/1F76i2t9c66fWPtdZ0V8Iu
+Dc2ajNxbKiAwYrwVl3AS2tJ32psHRLvpmLoOVz9UXY0JrDwr274Z38wIqEGrUQ9h
+dOebEggeVu6Mv3pZUBYGGo9VX1/PTZguOaP85nC193UxSJe2+KV6aoc0odiokFmW
+K2JJrNb8bMjrQcQqp86JMW1DHyon5sF6edTIilxgC+SHgapT5hZeoNnh3rAgHiWX
+F8ZOvho341s+7I78pbEtqCXNbF3VqikFlWmStQIDAQABAoIBAEWZ+pjuDgLGaAvi
+pSgNoXCfEG0NiEnDS7CGDdxByg8gOWVrBZckudcOc9tllPs0flNYXr7A4Wj7ik2F
+8BHk48oFQa/91KxRJlhSmdeanj9uEz11oHc/y6FjxT8Jj+I8rdl0dJVsqdJ/dsJ8
+lcJzWq53Er0MBquIjpHzhAVbxNIvEjQvuIyKPEomrvNN49fR5J7ExH8n1OnkuFRJ
+L4L98inXPtcQF2Xgorh2YwhV0DiY5X88TZMCZ8m7CB0DhwZSMueFWa6Aj4m5G0HQ
+kalXU3bCeBu66s3sXZHuGg1oF3MwwO7BX3/1fg8LoaLEvYHAOXH5PNRUzAgh7/mA
+dneVYoECgYEA69oHQ9VvXGpqHnE5spAtmyJn7v32zXEPUibdqPCNrGXznvzXM+Do
+xHB4K51H8wE/WGT/LGgVcubqr62f/SvmyO6RVOS+DRY4aYKyFif0+7mVHgWhoYOg
+oEaODZrKdxC4SrSYaogsDCH7bdkh1VdJhCDx6ppUGXs9/ZfKJn9kG+0CgYEA0dR9
+BQ6qnrBDrZg7vW/xV/iL/PGsJVBUt7oAkN7g4Ub42eTjAhIPdMxipgAkj6EbhoBO
+KpWELvRqC3oTUVutdTvRhdgummNKToZNaYG7CK5X6bsQh7l6tqLVkE1WqoT4yXvA
+1ez7iOhOsTvugYLlRJd3MTNiKw6c9Pr5ihIHyOkCgYEAsMRtk4LBfzNmq8BS7Skw
+dUhZO39u3dVyFTF6CqeYl3CmIjAAnypfavOcrZupFFGIB5lSwxaTlNXLabYo5hhk
+VY6wsD7szmQsDbBeB0sVSyFxyNmRpbtAxT98MmgkfQ60AZHPdnDvCnzhtBf8Sqis
+OfJzPlFC3QJImOuOIEJ0ZpUCgYAtwj0RYUVsHdxkexJsGYF0Qculeb6k1IPlHTcK
+YNCB0ExsmDG5Pd8JBZltwhI3EFdEWa6yMrEE3GBT6GdWErwdGNJ0cdSX7pdB0KAJ
+JjV3iy241waf0p8kPRZ9xZ/kx+LJbad7/5ZLIP4oQH2e2MDO2IkxvZbm9OTdt+27
+Yns4IQKBgEuQv0JTt+o6/1cwZkMvXDKf0vW2nbPG9gbP3gy9Js0mOG0eWYCsNehO
+DGLViyV2XURCskM4ZSA7Xc71lbCFhOV+jDXEipAjw8S8WJWdTraoF1QV12YEdlL/
+KdcxuJKVX8vdE9UCOxH/wcDG/JXAHX3qrMudJgAp598nyk6g2cNt
+-----END RSA PRIVATE KEY-----
diff --git a/tests/vvp/sanity/__init__.robot b/tests/vvp/sanity/__init__.robot
new file mode 100644
index 00000000..6bc0362e
--- /dev/null
+++ b/tests/vvp/sanity/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation VVP - HealthCheck
diff --git a/tests/vvp/sanity/test1.robot b/tests/vvp/sanity/test1.robot
new file mode 100644
index 00000000..27612fdb
--- /dev/null
+++ b/tests/vvp/sanity/test1.robot
@@ -0,0 +1,19 @@
+*** Settings ***
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Library json
+
+# http://localhost:9090/vvp/v1/engmgr/vendors
+# vvp-engagementmgr
+
+*** Test Cases ***
+Get Requests health check ok
+ [Tags] get
+ CreateSession vvp-engagementmgr http://localhost:9090
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ ${resp}= Get Request vvp-engagementmgr /vvp/v1/engmgr/vendors headers=&{headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ @{ITEMS}= Copy List ${resp.json()}
+ : FOR ${ELEMENT} IN @{ITEMS}
+ \ Log ${ELEMENT['uuid']} ${ELEMENT['name']}