From 3982f4f67314ec37fd9b22ae54049958af777c1b Mon Sep 17 00:00:00 2001 From: jimmydot Date: Sun, 7 May 2017 14:58:24 -0400 Subject: [VID-6] Initial rebase push Change-Id: I9077be9663754d9b22f77c6a7b3109b361b39346 Signed-off-by: jimmydot --- .../java/org/openecomp/aai/util/AAIProperties.java | 68 + .../org/openecomp/aai/util/AAIRestInterface.java | 303 ++++ .../aai/util/CustomJacksonJaxBJsonProvider.java | 73 + .../org/openecomp/aai/util/HttpsAuthClient.java | 140 ++ .../openecomp/aai/util/HttpsComponentsClient.java | 99 ++ .../JettyObfuscationConversionCommandLineUtil.java | 78 + .../openecomp/vid/asdc/AsdcCatalogException.java | 58 + .../java/org/openecomp/vid/asdc/AsdcClient.java | 128 ++ .../org/openecomp/vid/asdc/beans/Artifact.java | 314 ++++ .../org/openecomp/vid/asdc/beans/Resource.java | 429 +++++ .../java/org/openecomp/vid/asdc/beans/Service.java | 351 +++++ .../org/openecomp/vid/asdc/beans/SubResource.java | 175 +++ .../openecomp/vid/asdc/beans/tosca/Capability.java | 140 ++ .../openecomp/vid/asdc/beans/tosca/Constraint.java | 199 +++ .../org/openecomp/vid/asdc/beans/tosca/Group.java | 135 ++ .../org/openecomp/vid/asdc/beans/tosca/Import.java | 48 + .../org/openecomp/vid/asdc/beans/tosca/Input.java | 166 ++ .../vid/asdc/beans/tosca/NodeTemplate.java | 117 ++ .../openecomp/vid/asdc/beans/tosca/Property.java | 157 ++ .../vid/asdc/beans/tosca/Requirement.java | 120 ++ .../org/openecomp/vid/asdc/beans/tosca/Schema.java | 53 + .../vid/asdc/beans/tosca/SubstitutionMappings.java | 101 ++ .../vid/asdc/beans/tosca/TopologyTemplate.java | 124 ++ .../openecomp/vid/asdc/beans/tosca/ToscaCsar.java | 101 ++ .../openecomp/vid/asdc/beans/tosca/ToscaMeta.java | 122 ++ .../vid/asdc/beans/tosca/ToscaMetadata.java | 461 ++++++ .../openecomp/vid/asdc/beans/tosca/ToscaModel.java | 166 ++ .../vid/asdc/memory/InMemoryAsdcClient.java | 372 +++++ .../openecomp/vid/asdc/rest/RestfulAsdcClient.java | 462 ++++++ .../org/openecomp/vid/client/HttpBasicClient.java | 67 + .../org/openecomp/vid/client/HttpsBasicClient.java | 143 ++ .../openecomp/vid/controller/AaiController.java | 864 ++++++++++ .../controller/BrowseServiceTypesController.java | 87 + .../vid/controller/HealthCheckController.java | 196 +++ .../openecomp/vid/controller/MsoController.java | 761 +++++++++ .../vid/controller/PropertyController.java | 122 ++ .../openecomp/vid/controller/VidController.java | 351 +++++ .../vid/controller/VidHomeController.java | 79 + .../vid/controller/ViewEditSubController.java | 107 ++ .../vid/controller/ViewLogController.java | 84 + .../vid/controller/test/TestAaiController.java | 93 ++ .../vid/controller/test/TestAsdcController.java | 112 ++ .../vid/controller/test/TestMsoController.java | 729 +++++++++ .../vid/controller/test/TestPageController.java | 57 + .../java/org/openecomp/vid/dao/FnAppDoaImpl.java | 112 ++ .../java/org/openecomp/vid/dao/ProfileDao.java | 45 + .../exceptions/VidServiceUnavailableException.java | 69 + .../org/openecomp/vid/model/CommandProperty.java | 93 ++ .../org/openecomp/vid/model/ExceptionResponse.java | 70 + .../org/openecomp/vid/model/ModelConstants.java | 42 + .../main/java/org/openecomp/vid/model/Network.java | 62 + .../main/java/org/openecomp/vid/model/Node.java | 301 ++++ .../java/org/openecomp/vid/model/Resource.java | 28 + .../main/java/org/openecomp/vid/model/Result.java | 58 + .../main/java/org/openecomp/vid/model/Service.java | 253 +++ .../java/org/openecomp/vid/model/ServiceModel.java | 261 +++ .../src/main/java/org/openecomp/vid/model/VNF.java | 165 ++ .../java/org/openecomp/vid/model/VfModule.java | 308 ++++ .../java/org/openecomp/vid/model/VolumeGroup.java | 196 +++ .../java/org/openecomp/vid/mso/MsoProperties.java | 100 ++ .../org/openecomp/vid/mso/MsoResponseWrapper.java | 107 ++ .../java/org/openecomp/vid/mso/MsoRestInt.java | 71 + .../org/openecomp/vid/mso/MsoRestInterface.java | 290 ++++ .../openecomp/vid/mso/MsoRestInterfaceFactory.java | 48 + .../org/openecomp/vid/mso/MsoRestInterfaceIfc.java | 79 + .../main/java/org/openecomp/vid/mso/MsoUtil.java | 125 ++ .../java/org/openecomp/vid/mso/RestObject.java | 68 + .../openecomp/vid/mso/rest/AsyncRequestStatus.java | 123 ++ .../openecomp/vid/mso/rest/RelatedInstance.java | 125 ++ .../org/openecomp/vid/mso/rest/RelatedModel.java | 121 ++ .../java/org/openecomp/vid/mso/rest/Request.java | 140 ++ .../org/openecomp/vid/mso/rest/RequestDetails.java | 233 +++ .../org/openecomp/vid/mso/rest/RequestList.java | 137 ++ .../vid/properties/AsdcClientConfiguration.java | 116 ++ .../openecomp/vid/properties/VidProperties.java | 93 ++ .../src/main/resources/json/mso/asyncRequestStatus | 54 + .../src/main/resources/json/mso/cloudConfiguration | 19 + .../src/main/resources/json/mso/instanceIds | 29 + .../src/main/resources/json/mso/modelInfo | 41 + .../src/main/resources/json/mso/relatedInstance | 16 + .../src/main/resources/json/mso/relatedModel | 15 + vid-app-common/src/main/resources/json/mso/request | 45 + .../src/main/resources/json/mso/requestDetails | 13 + .../src/main/resources/json/mso/requestError | 27 + .../src/main/resources/json/mso/requestInfo | 44 + .../src/main/resources/json/mso/requestParameters | 23 + .../src/main/resources/json/mso/requestReferences | 18 + .../src/main/resources/json/mso/requestStatus | 37 + .../src/main/resources/json/mso/response | 13 + .../src/main/resources/json/mso/subscriberInfo | 19 + .../src/main/webapp/META-INF/MANIFEST.MF | 3 + .../src/main/webapp/WEB-INF/defs/definitions.xml | 53 + .../webapp/WEB-INF/fusion/defs/definitions.xml | 279 ++++ vid-app-common/src/main/webapp/WEB-INF/web.xml | 17 + .../src/main/webapp/app/vid/icons/7450-icon.png | Bin 0 -> 465 bytes .../src/main/webapp/app/vid/icons/7450-text.png | Bin 0 -> 295 bytes .../src/main/webapp/app/vid/icons/7750-icon.png | Bin 0 -> 565 bytes .../src/main/webapp/app/vid/icons/7750-text.png | Bin 0 -> 632 bytes .../src/main/webapp/app/vid/icons/apn-dns-icon.png | Bin 0 -> 1065 bytes .../src/main/webapp/app/vid/icons/apn-dns-text.png | Bin 0 -> 901 bytes .../src/main/webapp/app/vid/icons/atcf-icon.png | Bin 0 -> 388 bytes .../src/main/webapp/app/vid/icons/atcf-text.png | Bin 0 -> 650 bytes .../src/main/webapp/app/vid/icons/atgw-icon.png | Bin 0 -> 388 bytes .../src/main/webapp/app/vid/icons/atgw-text.png | Bin 0 -> 780 bytes .../src/main/webapp/app/vid/icons/bgcf-icon.png | Bin 0 -> 388 bytes .../src/main/webapp/app/vid/icons/bgcf-text.png | Bin 0 -> 645 bytes .../src/main/webapp/app/vid/icons/com-icon.png | Bin 0 -> 437 bytes .../src/main/webapp/app/vid/icons/cpm-icon.png | Bin 0 -> 201 bytes .../src/main/webapp/app/vid/icons/cpm-text.png | Bin 0 -> 572 bytes .../src/main/webapp/app/vid/icons/default-icon.png | Bin 0 -> 329 bytes .../src/main/webapp/app/vid/icons/dra-epc-icon.png | Bin 0 -> 700 bytes .../src/main/webapp/app/vid/icons/dra-epc-text.png | Bin 0 -> 820 bytes .../src/main/webapp/app/vid/icons/dra-ims-icon.png | Bin 0 -> 700 bytes .../src/main/webapp/app/vid/icons/dra-ims-text.png | Bin 0 -> 851 bytes .../src/main/webapp/app/vid/icons/dslam-icon.png | Bin 0 -> 774 bytes .../src/main/webapp/app/vid/icons/dslam-text.png | Bin 0 -> 739 bytes .../src/main/webapp/app/vid/icons/eatf-icon.png | Bin 0 -> 437 bytes .../src/main/webapp/app/vid/icons/eatf-text.png | Bin 0 -> 439 bytes .../src/main/webapp/app/vid/icons/ecscf-icon.png | Bin 0 -> 855 bytes .../src/main/webapp/app/vid/icons/ecscf-text.png | Bin 0 -> 604 bytes .../src/main/webapp/app/vid/icons/emsc-icon.png | Bin 0 -> 388 bytes .../src/main/webapp/app/vid/icons/enb-icon.png | Bin 0 -> 1127 bytes .../src/main/webapp/app/vid/icons/enb-text.png | Bin 0 -> 627 bytes .../src/main/webapp/app/vid/icons/enum-icon.png | Bin 0 -> 646 bytes .../src/main/webapp/app/vid/icons/enum-text.png | Bin 0 -> 551 bytes .../src/main/webapp/app/vid/icons/esmlc-icon.png | Bin 0 -> 388 bytes .../src/main/webapp/app/vid/icons/esmlc-text.png | Bin 0 -> 701 bytes .../src/main/webapp/app/vid/icons/ettcs-icon.png | Bin 0 -> 95 bytes .../src/main/webapp/app/vid/icons/ettcs-text.png | Bin 0 -> 95 bytes .../src/main/webapp/app/vid/icons/gmlc-icon.png | Bin 0 -> 388 bytes .../src/main/webapp/app/vid/icons/gmlc-text.png | Bin 0 -> 755 bytes .../src/main/webapp/app/vid/icons/hlr-icon.png | Bin 0 -> 646 bytes .../src/main/webapp/app/vid/icons/hlr-text.png | Bin 0 -> 376 bytes .../src/main/webapp/app/vid/icons/hss-epc-icon.png | Bin 0 -> 646 bytes .../src/main/webapp/app/vid/icons/hss-epc-text.png | Bin 0 -> 726 bytes .../src/main/webapp/app/vid/icons/hss-ims-icon.png | Bin 0 -> 646 bytes .../src/main/webapp/app/vid/icons/hss-ims-text.png | Bin 0 -> 757 bytes .../src/main/webapp/app/vid/icons/icscf-icon.png | Bin 0 -> 855 bytes .../src/main/webapp/app/vid/icons/icscf-text.png | Bin 0 -> 657 bytes .../src/main/webapp/app/vid/icons/ipag-icon.png | Bin 0 -> 95 bytes .../src/main/webapp/app/vid/icons/ipag-text.png | Bin 0 -> 95 bytes .../src/main/webapp/app/vid/icons/isbc-icon.png | Bin 0 -> 855 bytes .../src/main/webapp/app/vid/icons/isbc-text.png | Bin 0 -> 649 bytes .../src/main/webapp/app/vid/icons/iwf-icon.png | Bin 0 -> 696 bytes .../src/main/webapp/app/vid/icons/iwf-text.png | Bin 0 -> 595 bytes .../src/main/webapp/app/vid/icons/lrf-rdf-icon.png | Bin 0 -> 953 bytes .../src/main/webapp/app/vid/icons/lrf-rdf-text.png | Bin 0 -> 638 bytes .../src/main/webapp/app/vid/icons/lrg-rdf-text.png | Bin 0 -> 769 bytes .../src/main/webapp/app/vid/icons/mgc8-icon.png | Bin 0 -> 388 bytes .../src/main/webapp/app/vid/icons/mgc8-text.png | Bin 0 -> 771 bytes .../main/webapp/app/vid/icons/mgcf-emsc-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/vid/icons/mgcf-emsc-text.png | Bin 0 -> 1140 bytes .../src/main/webapp/app/vid/icons/mgw-icon.png | Bin 0 -> 388 bytes .../src/main/webapp/app/vid/icons/mgw-text.png | Bin 0 -> 823 bytes .../src/main/webapp/app/vid/icons/mind-icon.png | Bin 0 -> 646 bytes .../src/main/webapp/app/vid/icons/mind-text.png | Bin 0 -> 550 bytes .../src/main/webapp/app/vid/icons/mme-icon.png | Bin 0 -> 232 bytes .../src/main/webapp/app/vid/icons/mme-text.png | Bin 0 -> 252 bytes .../src/main/webapp/app/vid/icons/mrf-icon.png | Bin 0 -> 437 bytes .../src/main/webapp/app/vid/icons/mrf-text.png | Bin 0 -> 504 bytes .../src/main/webapp/app/vid/icons/msc-icon.png | Bin 0 -> 388 bytes .../src/main/webapp/app/vid/icons/msn-icon.png | Bin 0 -> 465 bytes .../src/main/webapp/app/vid/icons/msn-text.png | Bin 0 -> 318 bytes .../src/main/webapp/app/vid/icons/multi-icon.png | Bin 0 -> 329 bytes .../src/main/webapp/app/vid/icons/n7450-icon.png | Bin 0 -> 464 bytes .../src/main/webapp/app/vid/icons/n7450-text.png | Bin 0 -> 295 bytes .../src/main/webapp/app/vid/icons/n7750a-icon.png | Bin 0 -> 393 bytes .../src/main/webapp/app/vid/icons/n7750a-text.png | Bin 0 -> 258 bytes .../src/main/webapp/app/vid/icons/n7750b-icon.png | Bin 0 -> 393 bytes .../src/main/webapp/app/vid/icons/n7750b-text.png | Bin 0 -> 258 bytes .../src/main/webapp/app/vid/icons/n7750c-icon.png | Bin 0 -> 391 bytes .../src/main/webapp/app/vid/icons/n7750c-text.png | Bin 0 -> 258 bytes .../src/main/webapp/app/vid/icons/n7750d-icon.png | Bin 0 -> 391 bytes .../src/main/webapp/app/vid/icons/n7750d-text.png | Bin 0 -> 258 bytes .../src/main/webapp/app/vid/icons/nb-icon.png | Bin 0 -> 1127 bytes .../src/main/webapp/app/vid/icons/nb-text.png | Bin 0 -> 499 bytes .../src/main/webapp/app/vid/icons/pas-icon.png | Bin 0 -> 700 bytes .../src/main/webapp/app/vid/icons/pas-text.png | Bin 0 -> 596 bytes .../src/main/webapp/app/vid/icons/pcef-icon.png | Bin 0 -> 785 bytes .../src/main/webapp/app/vid/icons/pcef-text.png | Bin 0 -> 539 bytes .../src/main/webapp/app/vid/icons/pcrf-icon.png | Bin 0 -> 785 bytes .../src/main/webapp/app/vid/icons/pcrf-text.png | Bin 0 -> 594 bytes .../src/main/webapp/app/vid/icons/pcscf-icon.png | Bin 0 -> 855 bytes .../src/main/webapp/app/vid/icons/pcscf-text.png | Bin 0 -> 744 bytes .../src/main/webapp/app/vid/icons/pgw-icon.png | Bin 0 -> 388 bytes .../src/main/webapp/app/vid/icons/pgw-text.png | Bin 0 -> 807 bytes .../src/main/webapp/app/vid/icons/plrf-icon.png | Bin 0 -> 953 bytes .../src/main/webapp/app/vid/icons/plrf-text.png | Bin 0 -> 735 bytes .../src/main/webapp/app/vid/icons/psap-icon.png | Bin 0 -> 322 bytes .../main/webapp/app/vid/icons/pstn-tdm-icon.png | Bin 0 -> 95 bytes .../main/webapp/app/vid/icons/pstn-tdm-text.png | Bin 0 -> 95 bytes .../src/main/webapp/app/vid/icons/rg-icon.png | Bin 0 -> 388 bytes .../src/main/webapp/app/vid/icons/rg-text.png | Bin 0 -> 540 bytes .../src/main/webapp/app/vid/icons/rnc-icon.png | Bin 0 -> 591 bytes .../src/main/webapp/app/vid/icons/rnc-text.png | Bin 0 -> 646 bytes .../src/main/webapp/app/vid/icons/sbc-icon.png | Bin 0 -> 855 bytes .../src/main/webapp/app/vid/icons/sbc-text.png | Bin 0 -> 632 bytes .../src/main/webapp/app/vid/icons/sccas-icon.png | Bin 0 -> 437 bytes .../src/main/webapp/app/vid/icons/sccas-text.png | Bin 0 -> 861 bytes .../src/main/webapp/app/vid/icons/scscf-icon.png | Bin 0 -> 855 bytes .../src/main/webapp/app/vid/icons/scscf-text.png | Bin 0 -> 704 bytes .../src/main/webapp/app/vid/icons/sdg-icon.png | Bin 0 -> 491 bytes .../src/main/webapp/app/vid/icons/sdg-text.png | Bin 0 -> 696 bytes .../src/main/webapp/app/vid/icons/sgsns4-icon.png | Bin 0 -> 230 bytes .../src/main/webapp/app/vid/icons/sgsns4-text.png | Bin 0 -> 469 bytes .../src/main/webapp/app/vid/icons/sgw-icon.png | Bin 0 -> 388 bytes .../src/main/webapp/app/vid/icons/sgw-text.png | Bin 0 -> 884 bytes .../src/main/webapp/app/vid/icons/siad-icon.png | Bin 0 -> 774 bytes .../src/main/webapp/app/vid/icons/siad-text.png | Bin 0 -> 753 bytes .../main/webapp/app/vid/icons/ss7-gport-icon.png | Bin 0 -> 286 bytes .../main/webapp/app/vid/icons/ss7-gport-text.png | Bin 0 -> 418 bytes .../main/webapp/app/vid/icons/ss7gport-icon.png | Bin 0 -> 646 bytes .../main/webapp/app/vid/icons/ss7gport-text.png | Bin 0 -> 1011 bytes .../src/main/webapp/app/vid/icons/switch-icon.png | Bin 0 -> 877 bytes .../src/main/webapp/app/vid/icons/tas-icon.png | Bin 0 -> 437 bytes .../src/main/webapp/app/vid/icons/tas-text.png | Bin 0 -> 858 bytes .../main/webapp/app/vid/icons/transcoder-icon.png | Bin 0 -> 774 bytes .../main/webapp/app/vid/icons/transcoder-text.png | Bin 0 -> 1242 bytes .../src/main/webapp/app/vid/icons/ue-icon.png | Bin 0 -> 577 bytes .../src/main/webapp/app/vid/icons/uephone-icon.png | Bin 0 -> 1190 bytes .../src/main/webapp/app/vid/icons/usp-dns-icon.png | Bin 0 -> 1065 bytes .../src/main/webapp/app/vid/icons/usp-dns-text.png | Bin 0 -> 826 bytes .../src/main/webapp/app/vid/images/asterisk.png | Bin 0 -> 2289 bytes .../src/main/webapp/app/vid/images/dummy.txt | 0 .../src/main/webapp/app/vid/images/error.png | Bin 0 -> 2297 bytes .../src/main/webapp/app/vid/images/spinner.gif | Bin 0 -> 7358 bytes .../main/webapp/app/vid/scripts/angular-ui-tree.js | 1656 ++++++++++++++++++++ .../vid/scripts/constants/componentConstants.js | 148 ++ .../app/vid/scripts/constants/fieldConstants.js | 378 +++++ .../vid/scripts/constants/parameterConstants.js | 52 + .../app/vid/scripts/constants/vidConfiguration.js | 99 ++ .../scripts/controller/InstantiationController.js | 1217 ++++++++++++++ .../scripts/controller/ServiceModelController.js | 227 +++ .../webapp/app/vid/scripts/controller/VidApp.js | 79 + .../scripts/controller/aaiSubscriberController.js | 821 ++++++++++ .../scripts/controller/creationDialogController.js | 163 ++ .../scripts/controller/deletionDialogController.js | 119 ++ .../scripts/controller/detailsDialogController.js | 84 + .../vid/scripts/controller/msoCommitController.js | 300 ++++ .../scripts/controller/statusDialogController.js | 233 +++ .../app/vid/scripts/controller/subscriberSearch.js | 246 +++ .../vid/scripts/directives/extensionsDirective.js | 79 + .../scripts/directives/parameterBlockDirective.js | 420 +++++ .../vid/scripts/directives/popupWindowDirective.js | 88 ++ .../vid/scripts/directives/progressBarDirective.js | 173 ++ .../webapp/app/vid/scripts/services/aaiService.js | 339 ++++ .../webapp/app/vid/scripts/services/asdcService.js | 40 + .../app/vid/scripts/services/componentService.js | 178 +++ .../app/vid/scripts/services/creationService.js | 924 +++++++++++ .../webapp/app/vid/scripts/services/dataService.js | 243 +++ .../app/vid/scripts/services/deletionService.js | 502 ++++++ .../app/vid/scripts/services/detailsService.js | 98 ++ .../webapp/app/vid/scripts/services/msoService.js | 175 +++ .../app/vid/scripts/services/propertyService.js | 89 ++ .../app/vid/scripts/services/statusService.js | 185 +++ .../app/vid/scripts/services/utilityService.js | 640 ++++++++ .../webapp/app/vid/scripts/services/vnfService.js | 82 + .../app/vid/scripts/view-models/aaiGetSubs.htm | 83 + .../scripts/view-models/aaiGetSubscriberList.htm | 67 + .../vid/scripts/view-models/aaiServiceTypes.htm | 80 + .../app/vid/scripts/view-models/aaiSubDetails.htm | 95 ++ .../app/vid/scripts/view-models/aaiSubViewEdit.htm | 147 ++ .../view-models/createInstanceServiceModels.htm | 125 ++ .../app/vid/scripts/view-models/creationDialog.htm | 64 + .../app/vid/scripts/view-models/deletionDialog.htm | 70 + .../app/vid/scripts/view-models/detailsDialog.htm | 48 + .../app/vid/scripts/view-models/instantiate.htm | 248 +++ .../app/vid/scripts/view-models/msoCommit.htm | 47 + .../app/vid/scripts/view-models/popupWindow.htm | 30 + .../app/vid/scripts/view-models/serviceModels.htm | 91 ++ .../app/vid/scripts/view-models/statusDialog.htm | 66 + .../src/main/webapp/app/vid/styles/aaiGetSubs.css | 62 + .../main/webapp/app/vid/styles/aaiSubDetails.css | 62 + .../main/webapp/app/vid/styles/aaiSubViewEdit.css | 62 + .../main/webapp/app/vid/styles/angular-ui-tree.css | 61 + .../src/main/webapp/app/vid/styles/dialogs.css | 133 ++ .../src/main/webapp/app/vid/styles/dummy.txt | 0 .../src/main/webapp/app/vid/styles/instantiate.css | 62 + .../main/webapp/app/vid/styles/serviceModels.css | 70 + .../webapp/app/vid/styles/subscriberSearch.css | 8 + .../src/main/webapp/app/vid/styles/vidTree.css | 67 + .../src/main/webapp/app/vid/test/testAaiData.js | 254 +++ .../src/main/webapp/app/vid/test/testMso.css | 22 + .../src/main/webapp/app/vid/test/testMso.js | 486 ++++++ .../src/main/webapp/app/vid/test/testViewEdit.css | 30 + .../src/main/webapp/app/vid/test/testViewEdit.js | 376 +++++ vid-app-common/src/main/webapp/index.jsp | 5 + vid-app-common/src/main/webapp/test.jsp | 29 + .../openecomp/ecomp/vid/selenium/FirstClass.java | 606 +++++++ .../ecomp/vid/selenium/LogOutLeftPane.java | 242 +++ .../core/MockApplicationContextTestSuite.java | 176 +++ .../openecomp/fusionapp/controller/NetMapTest.java | 48 + .../fusionapp/service/ProfileServiceTest.java | 69 + .../main/java/org/vid/dao/FnAppDoaImplTest.java | 45 + .../src/test/resources/objectconfig.properties | 16 + 295 files changed, 28245 insertions(+) create mode 100755 vid-app-common/src/main/java/org/openecomp/aai/util/AAIProperties.java create mode 100755 vid-app-common/src/main/java/org/openecomp/aai/util/AAIRestInterface.java create mode 100755 vid-app-common/src/main/java/org/openecomp/aai/util/CustomJacksonJaxBJsonProvider.java create mode 100755 vid-app-common/src/main/java/org/openecomp/aai/util/HttpsAuthClient.java create mode 100755 vid-app-common/src/main/java/org/openecomp/aai/util/HttpsComponentsClient.java create mode 100755 vid-app-common/src/main/java/org/openecomp/aai/util/JettyObfuscationConversionCommandLineUtil.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/AsdcCatalogException.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/AsdcClient.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/Artifact.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/Resource.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/Service.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/SubResource.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Capability.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Constraint.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Group.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Import.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Input.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/NodeTemplate.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Property.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Requirement.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Schema.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/SubstitutionMappings.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/TopologyTemplate.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaCsar.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaMeta.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaMetadata.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaModel.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/memory/InMemoryAsdcClient.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/asdc/rest/RestfulAsdcClient.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/client/HttpBasicClient.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/client/HttpsBasicClient.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/controller/AaiController.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/controller/BrowseServiceTypesController.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/controller/HealthCheckController.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/controller/MsoController.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/controller/PropertyController.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/controller/VidController.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/controller/VidHomeController.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/controller/ViewEditSubController.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/controller/ViewLogController.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestAaiController.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestAsdcController.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestMsoController.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestPageController.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/dao/FnAppDoaImpl.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/dao/ProfileDao.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/exceptions/VidServiceUnavailableException.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/model/CommandProperty.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/model/ExceptionResponse.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/model/ModelConstants.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/model/Network.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/model/Node.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/model/Resource.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/model/Result.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/model/Service.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/model/ServiceModel.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/model/VNF.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/model/VfModule.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/model/VolumeGroup.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/mso/MsoProperties.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/mso/MsoResponseWrapper.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInt.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInterface.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInterfaceFactory.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInterfaceIfc.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/mso/MsoUtil.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/mso/RestObject.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/mso/rest/AsyncRequestStatus.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RelatedInstance.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RelatedModel.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/mso/rest/Request.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RequestDetails.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RequestList.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/properties/AsdcClientConfiguration.java create mode 100755 vid-app-common/src/main/java/org/openecomp/vid/properties/VidProperties.java create mode 100755 vid-app-common/src/main/resources/json/mso/asyncRequestStatus create mode 100755 vid-app-common/src/main/resources/json/mso/cloudConfiguration create mode 100755 vid-app-common/src/main/resources/json/mso/instanceIds create mode 100755 vid-app-common/src/main/resources/json/mso/modelInfo create mode 100755 vid-app-common/src/main/resources/json/mso/relatedInstance create mode 100755 vid-app-common/src/main/resources/json/mso/relatedModel create mode 100755 vid-app-common/src/main/resources/json/mso/request create mode 100755 vid-app-common/src/main/resources/json/mso/requestDetails create mode 100755 vid-app-common/src/main/resources/json/mso/requestError create mode 100755 vid-app-common/src/main/resources/json/mso/requestInfo create mode 100755 vid-app-common/src/main/resources/json/mso/requestParameters create mode 100755 vid-app-common/src/main/resources/json/mso/requestReferences create mode 100755 vid-app-common/src/main/resources/json/mso/requestStatus create mode 100755 vid-app-common/src/main/resources/json/mso/response create mode 100755 vid-app-common/src/main/resources/json/mso/subscriberInfo create mode 100755 vid-app-common/src/main/webapp/META-INF/MANIFEST.MF create mode 100755 vid-app-common/src/main/webapp/WEB-INF/defs/definitions.xml create mode 100755 vid-app-common/src/main/webapp/WEB-INF/fusion/defs/definitions.xml create mode 100755 vid-app-common/src/main/webapp/WEB-INF/web.xml create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/7450-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/7450-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/7750-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/7750-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/apn-dns-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/apn-dns-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/atcf-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/atcf-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/atgw-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/atgw-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/bgcf-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/bgcf-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/com-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/cpm-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/cpm-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/default-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/dra-epc-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/dra-epc-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/dra-ims-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/dra-ims-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/dslam-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/dslam-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/eatf-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/eatf-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/ecscf-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/ecscf-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/emsc-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/enb-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/enb-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/enum-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/enum-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/esmlc-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/esmlc-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/ettcs-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/ettcs-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/gmlc-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/gmlc-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/hlr-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/hlr-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/hss-epc-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/hss-epc-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/hss-ims-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/hss-ims-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/icscf-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/icscf-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/ipag-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/ipag-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/isbc-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/isbc-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/iwf-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/iwf-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/lrf-rdf-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/lrf-rdf-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/lrg-rdf-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/mgc8-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/mgc8-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/mgcf-emsc-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/mgcf-emsc-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/mgw-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/mgw-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/mind-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/mind-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/mme-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/mme-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/mrf-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/mrf-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/msc-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/msn-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/msn-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/multi-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/n7450-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/n7450-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/n7750a-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/n7750a-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/n7750b-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/n7750b-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/n7750c-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/n7750c-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/n7750d-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/n7750d-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/nb-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/nb-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/pas-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/pas-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/pcef-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/pcef-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/pcrf-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/pcrf-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/pcscf-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/pcscf-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/pgw-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/pgw-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/plrf-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/plrf-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/psap-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/pstn-tdm-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/pstn-tdm-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/rg-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/rg-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/rnc-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/rnc-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/sbc-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/sbc-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/sccas-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/sccas-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/scscf-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/scscf-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/sdg-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/sdg-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/sgsns4-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/sgsns4-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/sgw-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/sgw-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/siad-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/siad-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/ss7-gport-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/ss7-gport-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/ss7gport-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/ss7gport-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/switch-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/tas-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/tas-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/transcoder-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/transcoder-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/ue-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/uephone-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/usp-dns-icon.png create mode 100755 vid-app-common/src/main/webapp/app/vid/icons/usp-dns-text.png create mode 100755 vid-app-common/src/main/webapp/app/vid/images/asterisk.png create mode 100755 vid-app-common/src/main/webapp/app/vid/images/dummy.txt create mode 100755 vid-app-common/src/main/webapp/app/vid/images/error.png create mode 100755 vid-app-common/src/main/webapp/app/vid/images/spinner.gif create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/angular-ui-tree.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/constants/componentConstants.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/constants/fieldConstants.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/constants/parameterConstants.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/constants/vidConfiguration.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/controller/InstantiationController.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/controller/VidApp.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/controller/aaiSubscriberController.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/controller/creationDialogController.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/controller/deletionDialogController.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/controller/detailsDialogController.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/controller/msoCommitController.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/controller/statusDialogController.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/controller/subscriberSearch.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/directives/extensionsDirective.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/directives/parameterBlockDirective.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/directives/popupWindowDirective.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/directives/progressBarDirective.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/services/aaiService.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/services/asdcService.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/services/componentService.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/services/creationService.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/services/dataService.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/services/deletionService.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/services/detailsService.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/services/msoService.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/services/propertyService.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/services/statusService.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/services/utilityService.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/services/vnfService.js create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiGetSubs.htm create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiGetSubscriberList.htm create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiServiceTypes.htm create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubDetails.htm create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubViewEdit.htm create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/view-models/createInstanceServiceModels.htm create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/view-models/creationDialog.htm create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/view-models/deletionDialog.htm create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/view-models/detailsDialog.htm create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/view-models/instantiate.htm create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/view-models/msoCommit.htm create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/view-models/popupWindow.htm create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/view-models/serviceModels.htm create mode 100755 vid-app-common/src/main/webapp/app/vid/scripts/view-models/statusDialog.htm create mode 100755 vid-app-common/src/main/webapp/app/vid/styles/aaiGetSubs.css create mode 100755 vid-app-common/src/main/webapp/app/vid/styles/aaiSubDetails.css create mode 100755 vid-app-common/src/main/webapp/app/vid/styles/aaiSubViewEdit.css create mode 100755 vid-app-common/src/main/webapp/app/vid/styles/angular-ui-tree.css create mode 100755 vid-app-common/src/main/webapp/app/vid/styles/dialogs.css create mode 100755 vid-app-common/src/main/webapp/app/vid/styles/dummy.txt create mode 100755 vid-app-common/src/main/webapp/app/vid/styles/instantiate.css create mode 100755 vid-app-common/src/main/webapp/app/vid/styles/serviceModels.css create mode 100755 vid-app-common/src/main/webapp/app/vid/styles/subscriberSearch.css create mode 100755 vid-app-common/src/main/webapp/app/vid/styles/vidTree.css create mode 100755 vid-app-common/src/main/webapp/app/vid/test/testAaiData.js create mode 100755 vid-app-common/src/main/webapp/app/vid/test/testMso.css create mode 100755 vid-app-common/src/main/webapp/app/vid/test/testMso.js create mode 100755 vid-app-common/src/main/webapp/app/vid/test/testViewEdit.css create mode 100755 vid-app-common/src/main/webapp/app/vid/test/testViewEdit.js create mode 100755 vid-app-common/src/main/webapp/index.jsp create mode 100755 vid-app-common/src/main/webapp/test.jsp create mode 100755 vid-app-common/src/test/java/org/openecomp/ecomp/vid/selenium/FirstClass.java create mode 100755 vid-app-common/src/test/java/org/openecomp/ecomp/vid/selenium/LogOutLeftPane.java create mode 100755 vid-app-common/src/test/java/org/openecomp/fusion/core/MockApplicationContextTestSuite.java create mode 100755 vid-app-common/src/test/java/org/openecomp/fusionapp/controller/NetMapTest.java create mode 100755 vid-app-common/src/test/java/org/openecomp/fusionapp/service/ProfileServiceTest.java create mode 100755 vid-app-common/src/test/java/org/openecomp/src/main/java/org/vid/dao/FnAppDoaImplTest.java create mode 100755 vid-app-common/src/test/resources/objectconfig.properties (limited to 'vid-app-common/src') diff --git a/vid-app-common/src/main/java/org/openecomp/aai/util/AAIProperties.java b/vid-app-common/src/main/java/org/openecomp/aai/util/AAIProperties.java new file mode 100755 index 00000000..ca710f6f --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/aai/util/AAIProperties.java @@ -0,0 +1,68 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.aai.util; + + +import org.openecomp.portalsdk.core.util.SystemProperties; + +/** + * The Class AAIProperties. + */ +public class AAIProperties extends SystemProperties { + + /** The Constant AAI_SERVER_URL_BASE. */ + //VID Specific + public static final String AAI_SERVER_URL_BASE = "aai.server.url.base"; + + /** The Constant AAI_SERVER_URL. */ + public static final String AAI_SERVER_URL = "aai.server.url"; + + /** The Constant AAI_OLDSERVER_URL_BASE. */ + public static final String AAI_OLDSERVER_URL_BASE = "aai.oldserver.url.base"; + + /** The Constant AAI_OLDSERVER_URL. */ + public static final String AAI_OLDSERVER_URL = "aai.oldserver.url"; + + /** The Constant AAI_TRUSTSTORE_FILENAME. */ + public static final String AAI_TRUSTSTORE_FILENAME = "aai.truststore.filename"; + + /** The Constant AAI_TRUSTSTORE_PASSWD_X. */ + public static final String AAI_TRUSTSTORE_PASSWD_X = "aai.truststore.passwd.x"; + + /** The Constant AAI_KEYSTORE_FILENAME. */ + public static final String AAI_KEYSTORE_FILENAME = "aai.keystore.filename"; + + /** The Constant AAI_KEYSTORE_PASSWD_X. */ + public static final String AAI_KEYSTORE_PASSWD_X = "aai.keystore.passwd.x"; + + /** The Constant AAI_VID_USERNAME. */ + public static final String AAI_VID_USERNAME = "aai.vid.username"; + + /** The Constant AAI_VID_PASSWD_X. */ + public static final String AAI_VID_PASSWD_X = "aai.vid.passwd.x"; + + /** The Constant FILESEPARTOR. */ + public static final String FILESEPARTOR = (System.getProperty("file.separator") == null) ? "/" : System.getProperty("file.separator"); + + /** The Constant AAI_USE_CLIENT_CERT */ + public static final String AAI_USE_CLIENT_CERT = "aai.use.client.cert"; + +} diff --git a/vid-app-common/src/main/java/org/openecomp/aai/util/AAIRestInterface.java b/vid-app-common/src/main/java/org/openecomp/aai/util/AAIRestInterface.java new file mode 100755 index 00000000..fa4eefc6 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/aai/util/AAIRestInterface.java @@ -0,0 +1,303 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ +package org.openecomp.aai.util; + + +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLEncoder; +import java.security.KeyManagementException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Base64; +import java.util.Date; +import java.util.UUID; + +import javax.ws.rs.client.Client; +import javax.ws.rs.client.Entity; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; +import org.eclipse.jetty.util.security.Password; +import org.openecomp.aai.util.AAIProperties; +import org.openecomp.aai.util.HttpsAuthClient; +/** + * The Class AAIRestInterface. + */ +public class AAIRestInterface { + + /** The logger. */ + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(AAIRestInterface.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + /** The client. */ + private static Client client = null; + + /** The rest srvr base URL. */ + private String restSrvrBaseURL; + + /** The certificate path. */ + public String certificatePath = ""; + + /** + * Instantiates a new AAI rest interface. + * + * @param certPath the cert path + */ + public AAIRestInterface(String certPath) + { + certificatePath = certPath; + } + + /** + * Encode URL. + * + * @param nodeKey the node key + * @return the string + * @throws UnsupportedEncodingException the unsupported encoding exception + */ + public String encodeURL (String nodeKey) throws UnsupportedEncodingException { + return URLEncoder.encode(nodeKey, "UTF-8").replaceAll("\\+", "%20"); + } + + /** + * Inits the rest client. + */ + private void initRestClient() + { + String methodName = "initRestClient"; + + if (client == null) { + try { + client = HttpsAuthClient.getClient(certificatePath); + } + catch (KeyManagementException e){ + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== KeyManagementException in " + methodName + e.toString()); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== KeyManagementException in " + methodName + e.toString()); + } catch (Exception e) { + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== Exception in REST call to DB in initRestClient" + e.toString()); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== Exception in REST call to DB : " + e.toString()); + } + } + } + + /** + * Sets the rest srvr base URL. + * + * @param baseURL the base URL + */ + public void SetRestSrvrBaseURL(String baseURL) + { + if (baseURL == null) + { + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== REST Server base URL cannot be null."); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== REST Server base URL cannot be null."); + } + + restSrvrBaseURL = baseURL; + } + + /** + * Gets the rest srvr base URL. + * + * @return the rest srvr base URL + */ + public String getRestSrvrBaseURL() + { + return restSrvrBaseURL; + } + + + /** + * Rest get. + * + * @param fromAppId the from app id + * @param transId the trans id + * @param requestUri the request uri + * @param xml the xml + * @return the string + * @throws UnsupportedEncodingException + */ + public Response RestGet(String fromAppId, String transId, String requestUri, boolean xml) throws UnsupportedEncodingException { + String methodName = "RestGet"; + + String responseType = "application/json"; + if (xml) + responseType = "application/xml"; + + initRestClient(); + + String clientCert = SystemProperties.getProperty(AAIProperties.AAI_USE_CLIENT_CERT); + + boolean useClientCert = false; + if (clientCert != null && + SystemProperties.getProperty(AAIProperties.AAI_USE_CLIENT_CERT).equalsIgnoreCase("true")) { + useClientCert = true; + } + String url = ""; + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + + url = SystemProperties.getProperty(AAIProperties.AAI_SERVER_URL) + requestUri; + + try { + // what is the point of this, just to check syntax?? + URL urlObj= new URL(url); + URI uri = new URI(urlObj.getProtocol(), urlObj.getUserInfo(), urlObj.getHost(), urlObj.getPort(), urlObj.getPath(), urlObj.getQuery(), urlObj.getRef()); + url = uri.toASCIIString(); + } catch (URISyntaxException | MalformedURLException e) { + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " bad URL"); + return null; + } + logger.debug(dateFormat.format(new Date()) + "<== " + url + " for the get REST API"); + + final Response cres; + if (useClientCert == true) { + cres = client.target(url) + .request() + .accept(responseType) + .header("X-TransactionId", transId) + .header("X-FromAppId", fromAppId) + .header("Content-Type", "application/json") + .get(); + } else { + + String vidUsername = SystemProperties.getProperty(AAIProperties.AAI_VID_USERNAME); + String vidPassword = Password.deobfuscate(SystemProperties.getProperty(AAIProperties.AAI_VID_PASSWD_X)); + String encodeThis = vidUsername + ":" + vidPassword; + + cres = client.target(url) + .request() + .accept(responseType) + .header("X-TransactionId", transId) + .header("X-FromAppId", fromAppId) + .header("Content-Type", "application/json") + .header("Authorization", "Basic " + Base64.getEncoder().encodeToString(encodeThis.getBytes("utf-8"))) + .get(); + } +// String r = cres.readEntity(String.class); + if (cres.getStatus() == 200) { + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " REST api GET was successful!"); + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + methodName + " REST api GET was successful!"); + } else { + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName +" with status="+cres.getStatus()+", url="+url); + } + return cres; +// logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName +" resp=" + r ); +// return r; + } + + + /** + * Delete. + * + * @param sourceID the source ID + * @param transId the trans id + * @param path the path + * @return true, if successful + */ + public boolean Delete(String sourceID, String transId, String path) { + String methodName = "Delete"; + String url=""; + transId += ":" + UUID.randomUUID().toString(); + logger.debug(dateFormat.format(new Date()) + "<== " + methodName + " start"); + + initRestClient(); + String request = "{}"; + url = SystemProperties.getProperty(AAIProperties.AAI_SERVER_URL) + path; + final Response cres = client.target(url) + .request() + .accept("application/json") + .header("X-TransactionId", transId) + .header("X-FromAppId", sourceID) + //.entity(request) + .delete(); + + if (cres.getStatus() == 404) { // resource not found + String msg = "Resource does not exist...: " + cres.getStatus() + + ":" + cres.readEntity(String.class); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + msg); + return false; + } else if (cres.getStatus() == 200 || cres.getStatus() == 204){ + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "Resource " + url + " deleted"); + return true; + } else { + String msg = "Deleting Resource failed: " + cres.getStatus() + + ":" + cres.readEntity(String.class); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + msg); + } + + return false; + } + + + /** + * Rest post. + * + * @param fromAppId the from app id + * @param transId the trans id + * @param path the path + * @param payload the payload + * @param xml the xml + * @return the string + */ + public Response RestPost(String fromAppId, String transId, String path, String payload, boolean xml) { + String methodName = "RestPost"; + String url=""; + transId = UUID.randomUUID().toString(); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + + try { + + String responseType = "application/json"; + if (xml) + responseType = "application/xml"; + + initRestClient(); + + url = SystemProperties.getProperty(AAIProperties.AAI_SERVER_URL_BASE) + path; + + final Response cres = client.target(url) + .request() + .accept(responseType) + .header("X-TransactionId", transId) + .header("X-FromAppId", fromAppId) + .post(Entity.entity(payload, MediaType.APPLICATION_JSON)); + + if (cres.getStatus() == 200 && cres.getStatus() <= 299) { + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + methodName + " REST api POST was successful!"); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " REST api POST was successful!"); + } else { + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName +" with status="+cres.getStatus()+", url="+url); + } + return cres; + } catch (Exception e) { + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " with url="+url+ ", Exception: " + e.toString()); + } + return null; + } + +} diff --git a/vid-app-common/src/main/java/org/openecomp/aai/util/CustomJacksonJaxBJsonProvider.java b/vid-app-common/src/main/java/org/openecomp/aai/util/CustomJacksonJaxBJsonProvider.java new file mode 100755 index 00000000..2623d6b6 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/aai/util/CustomJacksonJaxBJsonProvider.java @@ -0,0 +1,73 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.aai.util; + + +import javax.ws.rs.ext.Provider; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; +import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; + +/** + * The Class CustomJacksonJaxBJsonProvider. + */ +@Provider +public class CustomJacksonJaxBJsonProvider extends JacksonJaxbJsonProvider { + + /** The common mapper. */ + private static ObjectMapper commonMapper = null; + + /** + * Instantiates a new custom jackson jax B json provider. + */ + public CustomJacksonJaxBJsonProvider() { + if (commonMapper == null) { + ObjectMapper mapper = new ObjectMapper(); + + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + + mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + mapper.configure(SerializationFeature.INDENT_OUTPUT, false); + mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false); + + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, false); + + mapper.registerModule(new JaxbAnnotationModule()); + + commonMapper = mapper; + } + super.setMapper(commonMapper); + } + + /** + * Gets the mapper. + * + * @return the mapper + */ + public ObjectMapper getMapper() { + return commonMapper; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/aai/util/HttpsAuthClient.java b/vid-app-common/src/main/java/org/openecomp/aai/util/HttpsAuthClient.java new file mode 100755 index 00000000..8335d15b --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/aai/util/HttpsAuthClient.java @@ -0,0 +1,140 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.aai.util; + + +import java.io.FileInputStream; +import java.security.KeyManagementException; +import java.security.KeyStore; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; + +import org.eclipse.jetty.util.security.Password; +import org.glassfish.jersey.client.ClientConfig; +import org.glassfish.jersey.client.HttpUrlConnectorProvider; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; +/** + * The Class HttpsAuthClient. + */ +public class HttpsAuthClient{ + /** The logger. */ + static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(HttpsAuthClient.class); + + /** + * Gets the client. + * + * @param certFilePath the cert file path + * @return the client + * @throws KeyManagementException the key management exception + */ + public static Client getClient(String certFilePath) throws KeyManagementException { + + ClientConfig config = new ClientConfig(); + //config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); + //config.getClasses().add(org.openecomp.aai.util.CustomJacksonJaxBJsonProvider.class); + + try { + + config.property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, Boolean.TRUE ); + + config.connectorProvider(new HttpUrlConnectorProvider().useSetMethodWorkaround()); + String truststore_path = certFilePath + AAIProperties.FILESEPARTOR + SystemProperties.getProperty(AAIProperties.AAI_TRUSTSTORE_FILENAME); + String truststore_password = SystemProperties.getProperty(AAIProperties.AAI_TRUSTSTORE_PASSWD_X); + String decrypted_truststore_password = Password.deobfuscate(truststore_password); + + boolean useClientCert = false; + + String keystore_path = certFilePath + AAIProperties.FILESEPARTOR + SystemProperties.getProperty(AAIProperties.AAI_KEYSTORE_FILENAME); + String keystore_password = SystemProperties.getProperty(AAIProperties.AAI_KEYSTORE_PASSWD_X); + String decrypted_keystore_password = Password.deobfuscate(keystore_password); + + String clientCert = SystemProperties.getProperty(AAIProperties.AAI_USE_CLIENT_CERT); + + if (clientCert != null && + SystemProperties.getProperty(AAIProperties.AAI_USE_CLIENT_CERT).equalsIgnoreCase("true")) { + useClientCert = true; + } + + System.setProperty("javax.net.ssl.trustStore", truststore_path); + System.setProperty("javax.net.ssl.trustStorePassword", decrypted_truststore_password); + HttpsURLConnection.setDefaultHostnameVerifier( new HostnameVerifier(){ + public boolean verify(String string,SSLSession ssls) { + return true; + } + }); + + final SSLContext ctx = SSLContext.getInstance("TLS"); + + KeyManagerFactory kmf = null; + if (useClientCert) { + + try { + kmf = KeyManagerFactory.getInstance("SunX509"); + FileInputStream fin = new FileInputStream(keystore_path); + KeyStore ks = KeyStore.getInstance("PKCS12"); + char[] pwd = decrypted_keystore_password.toCharArray(); + ks.load(fin, pwd); + kmf.init(ks, pwd); + } catch (Exception e) { + //System.out.println("Error setting up kmf: exiting"); + logger.debug(EELFLoggerDelegate.debugLogger, "Error setting up kmf: exiting"); + e.printStackTrace(); + return null; + } + ctx.init(kmf.getKeyManagers(), null, null); + + return ClientBuilder.newBuilder() + .sslContext(ctx) + .hostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify( String s, SSLSession sslSession ) { + return true; + } + }).withConfig(config) + .build() + .register(org.openecomp.aai.util.CustomJacksonJaxBJsonProvider.class); + } else { + return ClientBuilder.newBuilder() + .hostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify( String s, SSLSession sslSession ) { + return true; + } + }).withConfig(config) + .build() + .register(org.openecomp.aai.util.CustomJacksonJaxBJsonProvider.class); + } + } catch (Exception e) { + logger.debug(EELFLoggerDelegate.debugLogger, "Error setting up config: exiting"); + //System.out.println("Error setting up config: exiting"); + e.printStackTrace(); + System.exit(1); + return null; + } + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/aai/util/HttpsComponentsClient.java b/vid-app-common/src/main/java/org/openecomp/aai/util/HttpsComponentsClient.java new file mode 100755 index 00000000..a041c652 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/aai/util/HttpsComponentsClient.java @@ -0,0 +1,99 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.aai.util; + +import java.io.FileInputStream; +import java.security.KeyManagementException; +import java.security.KeyStore; + +import javax.net.ssl.SSLContext; + +import org.apache.http.conn.ssl.SSLContextBuilder; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.HttpClients; +import org.eclipse.jetty.util.security.Password; +import org.openecomp.portalsdk.core.util.SystemProperties; + + +/** + * The Class HttpsComponentsClient. + */ +public class HttpsComponentsClient{ + + /** + * Gets the client. + * + * @param certFilePath the cert file path + * @return the client + * @throws KeyManagementException the key management exception + */ + public static CloseableHttpClient getClient(String certFilePath) throws Exception { + CloseableHttpClient httpclient = null; + try { + + String truststore_path = certFilePath + AAIProperties.FILESEPARTOR + SystemProperties.getProperty(AAIProperties.AAI_TRUSTSTORE_FILENAME); + String truststore_password = SystemProperties.getProperty(AAIProperties.AAI_TRUSTSTORE_PASSWD_X); + String decrypted_truststore_password = Password.deobfuscate(truststore_password); + String keystore_path = certFilePath + AAIProperties.FILESEPARTOR + SystemProperties.getProperty(AAIProperties.AAI_KEYSTORE_FILENAME); + String keystore_password = SystemProperties.getProperty(AAIProperties.AAI_KEYSTORE_PASSWD_X); + String decrypted_keystore_password = Password.deobfuscate(keystore_password); + + SSLContextBuilder sslContextB = new SSLContextBuilder(); + + KeyStore ks = KeyStore.getInstance("PKCS12"); + FileInputStream fin = new FileInputStream(keystore_path); + char[] pwd = decrypted_keystore_password.toCharArray(); + ks.load(fin, pwd); + + sslContextB.loadKeyMaterial(ks, pwd); + + KeyStore ts = KeyStore.getInstance("JKS"); + FileInputStream fin1 = new FileInputStream(truststore_path); + char[] pwd1 = decrypted_truststore_password.toCharArray(); + ts.load(fin1, pwd1); + + sslContextB.loadTrustMaterial(ts); + sslContextB.loadKeyMaterial(ks, pwd); + sslContextB.useTLS(); + + SSLContext sslcontext = sslContextB.build(); + + SSLConnectionSocketFactory sslFactory = new SSLConnectionSocketFactory( + sslcontext, + new String[] { "TLSv1.1", "TLSv1.2" }, + null, + SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER ); + + httpclient = HttpClients.custom() + .setSSLSocketFactory(sslFactory) + .build(); + + + } catch (Exception e) { + throw e; + } + return httpclient; + } + + + +} diff --git a/vid-app-common/src/main/java/org/openecomp/aai/util/JettyObfuscationConversionCommandLineUtil.java b/vid-app-common/src/main/java/org/openecomp/aai/util/JettyObfuscationConversionCommandLineUtil.java new file mode 100755 index 00000000..e4c4bcef --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/aai/util/JettyObfuscationConversionCommandLineUtil.java @@ -0,0 +1,78 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.aai.util; + + +import org.apache.commons.cli.BasicParser; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.eclipse.jetty.util.security.Password; + + +public class JettyObfuscationConversionCommandLineUtil { + /** + * The main method. + * + * @param args the arguments + */ + public static void main(String[] args){ + Options options = new Options(); + options.addOption("e", true, "obfuscate the given string"); + options.addOption("d", true, "deobfuscate the given string"); + + CommandLineParser parser = new BasicParser(); + + try { + CommandLine cmd = parser.parse(options, args); + String toProcess = null; + + if (cmd.hasOption("e")){ + toProcess = cmd.getOptionValue("e"); + String encoded = Password.obfuscate(toProcess); + System.out.println(encoded); + } else if (cmd.hasOption("d")) { + toProcess = cmd.getOptionValue("d"); + String decoded_str = Password.deobfuscate(toProcess); + System.out.println(decoded_str); + } else { + usage(); + } + } catch (ParseException e) { + System.out.println("failed to parse input"); + System.out.println(e.toString()); + usage(); + } catch (Exception e) { + System.out.println("exception:" + e.toString()); + } + } + + /** + * Usage. + */ + private static void usage(){ + System.out.println("usage:");; + System.out.println("-e [string] to obfuscate"); + System.out.println("-d [string] to deobfuscate"); + System.out.println("-h help"); + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/AsdcCatalogException.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/AsdcCatalogException.java new file mode 100755 index 00000000..aafb11ca --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/AsdcCatalogException.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc; + +/** + * The Class AsdcCatalogException. + */ +public class AsdcCatalogException extends Exception { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; + + /** + * Instantiates a new sdc catalog exception. + * + * @param msg the msg + */ + public AsdcCatalogException(String msg) { + super(msg); + } + + /** + * Instantiates a new sdc catalog exception. + * + * @param cause the cause + */ + public AsdcCatalogException(Throwable cause) { + super(cause); + } + + /** + * Instantiates a new sdc catalog exception. + * + * @param msg the msg + * @param t the t + */ + public AsdcCatalogException(String msg, Throwable t) { + super(msg, t); + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/AsdcClient.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/AsdcClient.java new file mode 100755 index 00000000..c4a8b1c0 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/AsdcClient.java @@ -0,0 +1,128 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc; + +import java.util.Collection; +import java.util.Map; +import java.util.UUID; + +import org.openecomp.vid.asdc.beans.Artifact; +import org.openecomp.vid.asdc.beans.Resource; +import org.openecomp.vid.asdc.beans.Service; +import org.openecomp.vid.asdc.beans.tosca.ToscaCsar; + +/** + * The Interface AsdcClient. + */ +public interface AsdcClient { + + /** + * Gets the resource. + * + * @param uuid the uuid + * @return the resource + * @throws AsdcCatalogException the sdc catalog exception + */ + public Resource getResource(UUID uuid) throws AsdcCatalogException; + + /** + * Gets the resources. + * + * @return the resources + * @throws AsdcCatalogException the sdc catalog exception + */ + public Collection getResources() throws AsdcCatalogException; + + /** + * Gets the resources. + * + * @param filter the filter + * @return the resources + * @throws AsdcCatalogException the sdc catalog exception + */ + public Collection getResources(Map filter) throws AsdcCatalogException; + + /** + * Gets the resource artifact. + * + * @param resourceUuid the resource uuid + * @param artifactUuid the artifact uuid + * @return the resource artifact + * @throws AsdcCatalogException the sdc catalog exception + */ + public Artifact getResourceArtifact(UUID resourceUuid, UUID artifactUuid) throws AsdcCatalogException; + + /** + * Gets the resource tosca model. + * + * @param uuid the uuid + * @return the resource tosca model + * @throws AsdcCatalogException the sdc catalog exception + */ + public ToscaCsar getResourceToscaModel(UUID uuid) throws AsdcCatalogException; + + /** + * Gets the service. + * + * @param uuid the uuid + * @return the service + * @throws AsdcCatalogException the sdc catalog exception + */ + public Service getService(UUID uuid) throws AsdcCatalogException; + + /** + * Gets the services. + * + * @return the services + * @throws AsdcCatalogException the sdc catalog exception + */ + public Collection getServices() throws AsdcCatalogException; + + /** + * Gets the services. + * + * @param filter the filter + * @return the services + * @throws AsdcCatalogException the asdc catalog exception + */ + public Collection getServices(Map filter) throws AsdcCatalogException; + + /** + * Gets the service artifact. + * + * @param serviceUuid the service uuid + * @param artifactUuid the artifact uuid + * @return the service artifact + * @throws AsdcCatalogException the asdc catalog exception + */ + public Artifact getServiceArtifact(UUID serviceUuid, UUID artifactUuid) throws AsdcCatalogException; + + /** + * Gets the service tosca model. + * + * @param uuid the uuid + * @return the service tosca model + * @throws AsdcCatalogException the asdc catalog exception + */ + public ToscaCsar getServiceToscaModel(UUID uuid) throws AsdcCatalogException; + + //TODO: Collect TOSCA information from CSAR +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/Artifact.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/Artifact.java new file mode 100755 index 00000000..d24d1232 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/Artifact.java @@ -0,0 +1,314 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans; + +import java.util.UUID; + +/** + * The Class Artifact. + */ +public class Artifact { + +/* + * SDC has widened this to a String type for 1610. + public enum Type { + HEAT, + HEAT_ENV, + HEAT_VOL, + HEAT_NET, + HEAT_NESTED, + HEAT_ARTIFACT, + YANG_XML, + VNF_CATALOG, + VF_LICENSE, + VENDOR_LICENSE, + ASSET_INVENTORY_PROFILE, + ASSET_QUERY_SPEC, + APPC_CONFIG, + VF_MODULES_METADATA, + DCAE_TOSCA, + DCAE_JSON, + DCAE_EMF, + DCAE_DOC, + DCAE_BLUEPRINT, + DCAE_EVENT, + DCAE_INVENTORY_TOSCA, + DCAE_INVENTORY_JSON, + DCAE_INVENTORY_EMF, + DCAE_INVENTORY_DOC, + DCAE_INVENTORY_BLUEPRINT, + DCAE_INVENTORY_EVENT, + OTHER, + AAI_SERVICE_MODEL //HEY! READ ME! YES, YOU! I AM A TEMPORARY FIX, PLEASE REMOVE ME BECAUSE I AM A FRAUD. I DON'T BELONG HERE. + //Warm Regards, + // *The* Artifact.Type.AAI_SERVICE_MODEL Constant + } + */ + + /** The artifact name. */ + private String artifactName; + + /** The artifact label. */ + private String artifactLabel; + + /** The artifact group type. */ + private String artifactGroupType; + + /** The artifact type. */ + private String artifactType; + + /** The artifact URL. */ + private String artifactURL; + + /** The artifact description. */ + private String artifactDescription; + + /** The artifact timeout. */ + private int artifactTimeout; + + /** The artifact checksum. */ + private String artifactChecksum; + + /** The artifact UUID. */ + private String artifactUUID; + + /** The artifact version. */ + private String artifactVersion; + + /** The generated from UUID. */ + private String generatedFromUUID; + + /** + * Gets the artifact name. + * + * @return the artifact name + */ + public String getArtifactName() { + return artifactName; + } + + /** + * Gets the artifact type. + * + * @return the artifact type + */ + public String getArtifactType() { + return artifactType; + } + /** + * Gets the artifact group type. + * + * @return the artifact group type + */ + public String getArtifactGroupType() { + return artifactGroupType; + } + + /** + * Gets the artifact label. + * + * @return the artifact label + */ + public String getArtifactLabel() { + return artifactLabel; + } + /** + * Gets the artifact URL. + * + * @return the artifact URL + */ + public String getArtifactURL() { + return artifactURL; + } + + /** + * Gets the artifact description. + * + * @return the artifact description + */ + public String getArtifactDescription() { + return artifactDescription; + } + + /** + * Gets the artifact timeout. + * + * @return the artifact timeout + */ + public int getArtifactTimeout() { + return artifactTimeout; + } + + /** + * Gets the artifact checksum. + * + * @return the artifact checksum + */ + public String getArtifactChecksum() { + return artifactChecksum; + } + + /** + * Gets the artifact UUID. + * + * @return the artifact UUID + */ + public String getArtifactUUID() { + return artifactUUID; + } + + /** + * Gets the artifact version. + * + * @return the artifact version + */ + public String getArtifactVersion() { + return artifactVersion; + } + + /** + * Gets the generated from UUID. + * + * @return the generated from UUID + */ + public String getGeneratedFromUUID() { + return generatedFromUUID; + } + + /** + * Sets the artifact name. + * + * @param artifactName the new artifact name + */ + public void setArtifactName(String artifactName) { + this.artifactName = artifactName; + } + + /** + * Sets the artifact type. + * + * @param artifactType the new artifact type + */ + public void setArtifactType(String artifactType) { + this.artifactType = artifactType; + } + /** + * Sets the artifact group type. + * + * @param artifactGroupType the new artifact group type + */ + public void setArtifactGroupType(String artifactGroupType) { + this.artifactGroupType = artifactGroupType; + } + /** + * Sets the artifact label. + * + * @param artifactGroupType the new artifact label + */ + public void setArtifactLabel(String artifactLabel) { + this.artifactLabel = artifactLabel; + } + /** + * Sets the artifact URL. + * + * @param artifactURL the new artifact URL + */ + public void setArtifactURL(String artifactURL) { + this.artifactURL = artifactURL; + } + + /** + * Sets the artifact description. + * + * @param artifactDescription the new artifact description + */ + public void setArtifactDescription(String artifactDescription) { + this.artifactDescription = artifactDescription; + } + + /** + * Sets the artifact timeout. + * + * @param artifactTimeout the new artifact timeout + */ + public void setArtifactTimeout(int artifactTimeout) { + this.artifactTimeout = artifactTimeout; + } + + /** + * Sets the artifact checksum. + * + * @param artifactChecksum the new artifact checksum + */ + public void setArtifactChecksum(String artifactChecksum) { + this.artifactChecksum = artifactChecksum; + } + + /** + * Sets the artifact UUID. + * + * @param artifactUUID the new artifact UUID + */ + public void setArtifactUUID(String artifactUUID) { + this.artifactUUID = artifactUUID; + } + + /** + * Sets the artifact version. + * + * @param artifactVersion the new artifact version + */ + public void setArtifactVersion(String artifactVersion) { + this.artifactVersion = artifactVersion; + } + + /** + * Sets the generated from UUID. + * + * @param generatedFromUUID the new generated from UUID + */ + public void setGeneratedFromUUID(String generatedFromUUID) { + this.generatedFromUUID = generatedFromUUID; + } + + /* (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final UUID uuid = UUID.fromString(getArtifactUUID()); + + return uuid.hashCode(); + } + + /* (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object o) { + if (o == this) return true; + if (!(o instanceof Artifact)) return false; + + final Artifact artifact = (Artifact) o; + + return (artifact.getArtifactUUID().equals(getArtifactUUID())); + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/Resource.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/Resource.java new file mode 100755 index 00000000..3911c699 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/Resource.java @@ -0,0 +1,429 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans; + +import java.util.Collection; +import java.util.UUID; + +/** + * The Class Resource. + */ +public class Resource { + + /** + * The Enum Type. + */ + public enum Type { + + /** The vf. */ + VF, + + /** The vfc. */ + VFC, + + /** The cp. */ + CP, + + /** The vl. */ + VL, + + /** The vfcmt. */ + VFCMT + } + + /** + * The Enum LifecycleState. + */ + public enum LifecycleState { + + /** The not certified checkout. */ + NOT_CERTIFIED_CHECKOUT, + + /** The not certified checkin. */ + NOT_CERTIFIED_CHECKIN, + + /** The ready for certification. */ + READY_FOR_CERTIFICATION, + + /** The certification in progress. */ + CERTIFICATION_IN_PROGRESS, + + /** The certified. */ + CERTIFIED + } + + /** The uuid. */ + private String uuid; + + /** The invariant UUID. */ + private String invariantUUID; + + /** The name. */ + private String name; + + /** The description. */ + private String description; + + /** The version. */ + private String version; + + /** The tosca model URL. */ + private String toscaModelURL; + + /** The category. */ + private String category; + + /** The sub category. */ + private String subCategory; + + /** The resource type. */ + private Resource.Type resourceType; + + /** The lifecycle state. */ + private Resource.LifecycleState lifecycleState; + + /** The last updater user ID. */ + private String lastUpdaterUserId; + + /** The last updater full name. */ + private String lastUpdaterFullName; + + /** The tosca model. */ + private String toscaModel; + + /** The tosca resource name. */ + private String toscaResourceName; + + /** The artifacts. */ + private Collection artifacts; + + /** The resources. */ + private Collection resources; + + /** + * Gets the uuid. + * + * @return the uuid + */ + public String getUuid() { + return uuid; + } + + /** + * Gets the invariant UUID. + * + * @return the invariant UUID + */ + public String getInvariantUUID() { + return invariantUUID; + } + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Gets the version. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * Gets the tosca model URL. + * + * @return the tosca model URL + */ + public String getToscaModelURL() { + return toscaModelURL; + } + + /** + * Gets the category. + * + * @return the category + */ + public String getCategory() { + return category; + } + + /** + * Gets the sub category. + * + * @return the sub category + */ + public String getSubCategory() { + return subCategory; + } + + /** + * Gets the resource type. + * + * @return the resource type + */ + public Resource.Type getResourceType() { + return resourceType; + } + + /** + * Gets the lifecycle state. + * + * @return the lifecycle state + */ + public Resource.LifecycleState getLifecycleState() { + return lifecycleState; + } + + /** + * Gets the last updater user ID. + * + * @return the last updater user ID + */ + public String getLastUpdaterUserId() { + return lastUpdaterUserId; + } + + /** + * Gets the last updater full name. + * + * @return the last updater full name + */ + public String getLastUpdaterFullName() { + return lastUpdaterFullName; + } + + /** + * Gets the tosca model. + * + * @return the tosca model + */ + public String getToscaModel() { + return toscaModel; + } + + /** + * Gets the tosca resource name. + * + * @return the tosca resource name + */ + public String getToscaResourceName() { + return toscaResourceName; + } + + /** + * Gets the artifacts. + * + * @return the artifacts + */ + public Collection getArtifacts() { + return artifacts; + } + + /** + * Gets the resources. + * + * @return the resources + */ + public Collection getResources() { + return resources; + } + + /** + * Sets the uuid. + * + * @param uuid the new uuid + */ + public void setUuid(String uuid) { + this.uuid = uuid; + } + + /** + * Sets the invariant UUID. + * + * @param invariantUUID the new invariant UUID + */ + public void setInvariantUUID(String invariantUUID) { + this.invariantUUID = invariantUUID; + } + + /** + * Sets the name. + * + * @param name the new name + */ + public void setName(String name) { + this.name = name; + } + /** + * Sets the description. + * + * @param name the new description + */ + public void setDescription(String description) { + this.description = description; + } + /** + * Sets the version. + * + * @param version the new version + */ + public void setVersion(String version) { + this.version = version; + } + + /** + * Sets the tosca model URL. + * + * @param toscaModelURL the new tosca model URL + */ + public void setToscaModelURL(String toscaModelURL) { + this.toscaModelURL = toscaModelURL; + } + + /** + * Sets the category. + * + * @param category the new category + */ + public void setCategory(String category) { + this.category = category; + } + + /** + * Sets the sub category. + * + * @param subCategory the new sub category + */ + public void setSubCategory(String subCategory) { + this.subCategory = subCategory; + } + + /** + * Sets the resource type. + * + * @param resourceType the new resource type + */ + public void setResourceType(Resource.Type resourceType) { + this.resourceType = resourceType; + } + + /** + * Sets the lifecycle state. + * + * @param lifecycleState the new lifecycle state + */ + public void setLifecycleState(Resource.LifecycleState lifecycleState) { + this.lifecycleState = lifecycleState; + } + + /** + * Sets the last updater user ID. + * + * @param lastUpdaterUserId the new last updater user ID + */ + public void setLastUpdaterUserId(String lastUpdaterUserId) { + this.lastUpdaterUserId = lastUpdaterUserId; + } + + /** + * Sets the last updater full name. + * + * @param lastUpdaterFullName the new last updater full name + */ + public void setLastUpdaterFullName(String lastUpdaterFullName) { + this.lastUpdaterFullName = lastUpdaterFullName; + } + + /** + * Sets the tosca model. + * + * @param toscaModel the new tosca model + */ + public void setToscaModel(String toscaModel) { + this.toscaModel = toscaModel; + } + + /** + * Sets the tosca resource name. + * + * @param toscaResourceName the new tosca resource name + */ + public void setToscaResourceName(String toscaResourceName) { + this.toscaResourceName = toscaResourceName; + } + + /** + * Sets the artifacts. + * + * @param artifacts the new artifacts + */ + public void setArtifacts(Collection artifacts) { + this.artifacts = artifacts; + } + + /** + * Sets the resources. + * + * @param resources the new resources + */ + public void setResources(Collection resources) { + this.resources = resources; + } + + /* (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final UUID uuid = UUID.fromString(getUuid()); + + return uuid.hashCode(); + } + + /* (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object o) { + if (o == this) return true; + if (!(o instanceof Resource)) return false; + + final Resource resource = (Resource) o; + + return (resource.getUuid().equals(getUuid())); + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/Service.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/Service.java new file mode 100755 index 00000000..fa898e56 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/Service.java @@ -0,0 +1,351 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans; + +import java.util.Collection; +import java.util.UUID; +/** + * The Class Service. + */ +public class Service { + + /** + * The Enum DistributionStatus. + */ + public enum DistributionStatus { + + /** The distribution not approved. */ + DISTRIBUTION_NOT_APPROVED, + + /** The distribution approved. */ + DISTRIBUTION_APPROVED, + + /** The distributed. */ + DISTRIBUTED, + + /** The distribution rejected. */ + DISTRIBUTION_REJECTED + } + + /** + * The Enum LifecycleState. + */ + public enum LifecycleState { + + /** The not certified checkout. */ + NOT_CERTIFIED_CHECKOUT, + + /** The not certified checkin. */ + NOT_CERTIFIED_CHECKIN, + + /** The ready for certification. */ + READY_FOR_CERTIFICATION, + + /** The certification in progress. */ + CERTIFICATION_IN_PROGRESS, + + /** The certified. */ + CERTIFIED + } + + /** The uuid. */ + private String uuid; + + /** The invariant UUID. */ + private String invariantUUID; + + /** The name. */ + private String name; + + /** The version. */ + private String version; + + /** The tosca model URL. */ + private String toscaModelURL; + + /** The category. */ + private String category; + + /** The lifecycle state. */ + private Service.LifecycleState lifecycleState; + + /** The last updater user uid. */ + private String lastUpdaterUserId; + + /** The last updater full name. */ + private String lastUpdaterFullName; + + /** The distribution status. */ + private Service.DistributionStatus distributionStatus; + + /** The artifacts. */ + private Collection artifacts; + + /** The resources. */ + private Collection resources; + + /** + * Gets the uuid. + * + * @return the uuid + */ + public String getUuid() { + return uuid; + } + + /** + * Gets the invariant UUID. + * + * @return the invariant UUID + */ + public String getInvariantUUID() { + return invariantUUID; + } + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the version. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * Gets the tosca model URL. + * + * @return the tosca model URL + */ + public String getToscaModelURL() { + return toscaModelURL; + } + + /** + * Gets the category. + * + * @return the category + */ + public String getCategory() { + return category; + } + + /** + * Gets the lifecycle state. + * + * @return the lifecycle state + */ + public Service.LifecycleState getLifecycleState() { + return lifecycleState; + } + + /** + * Gets the last updater user uid. + * + * @return the last updater user uid + */ + public String getLastUpdaterUserId() { + return lastUpdaterUserId; + } + + /** + * Gets the last updater full name. + * + * @return the last updater full name + */ + public String getLastUpdaterFullName() { + return lastUpdaterFullName; + } + + /** + * Gets the distribution status. + * + * @return the distribution status + */ + public Service.DistributionStatus getDistributionStatus() { + return distributionStatus; + } + + /** + * Gets the artifacts. + * + * @return the artifacts + */ + public Collection getArtifacts() { + return artifacts; + } + + /** + * Gets the resources. + * + * @return the resources + */ + public Collection getResources() { + return resources; + } + + /** + * Sets the uuid. + * + * @param uuid the new uuid + */ + public void setUuid(String uuid) { + this.uuid = uuid; + } + + /** + * Sets the invariant UUID. + * + * @param invariantUUID the new invariant UUID + */ + public void setInvariantUUID(String invariantUUID) { + this.invariantUUID = invariantUUID; + } + + /** + * Sets the name. + * + * @param name the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Sets the version. + * + * @param version the new version + */ + public void setVersion(String version) { + this.version = version; + } + + /** + * Sets the tosca model URL. + * + * @param toscaModelURL the new tosca model URL + */ + public void setToscaModelURL(String toscaModelURL) { + this.toscaModelURL = toscaModelURL; + } + + /** + * Sets the category. + * + * @param category the new category + */ + public void setCategory(String category) { + this.category = category; + } + + /** + * Sets the lifecycle state. + * + * @param lifecycleState the new lifecycle state + */ + public void setLifecycleState(Service.LifecycleState lifecycleState) { + this.lifecycleState = lifecycleState; + } + + /** + * Sets the last updater user uid. + * + * @param lastUpdaterUserId the new last updater user uid + */ + public void set(String lastUpdaterUserId) { + this.lastUpdaterUserId = lastUpdaterUserId; + } + + /** + * Sets the last updater full name. + * + * @param lastUpdaterFullName the new last updater full name + */ + public void setLastUpdaterFullName(String lastUpdaterFullName) { + this.lastUpdaterFullName = lastUpdaterFullName; + } + + /** + * Sets the distribution status. + * + * @param distributionStatus the new distribution status + */ + public void setDistributionStatus(Service.DistributionStatus distributionStatus) { + this.distributionStatus = distributionStatus; + } + + /** + * Sets the artifacts. + * + * @param artifacts the new artifacts + */ + public void setArtifacts(Collection artifacts) { + this.artifacts = artifacts; + } + + /** + * Sets the resources. + * + * @param resources the new resources + */ + public void setResources(Collection resources) { + this.resources = resources; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return uuid; + } + + /* (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final UUID uuid = UUID.fromString(getUuid()); + + return uuid.hashCode(); + } + + /* (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object o) { + if (o == this) return true; + if (!(o instanceof Service)) return false; + + final Service service = (Service) o; + + return (service.getUuid().equals(getUuid())); + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/SubResource.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/SubResource.java new file mode 100755 index 00000000..6d7fb41b --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/SubResource.java @@ -0,0 +1,175 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans; + +import java.util.Collection; +/** + * The Class SubResource. + */ +public class SubResource { + + /** The resource instance name. */ + private String resourceInstanceName; + + /** The resource name. */ + private String resourceName; + + /** The resource invariant UUID. */ + private String resourceInvariantUUID; + + /** The resource version. */ + private String resourceVersion; + + /** The resource type. */ + private String resourceType; + + /** The resource UUID. */ + private String resourceUUID; + + /** The artifacts. */ + private Collection artifacts; + + /** + * Gets the resource instance name. + * + * @return the resource instance name + */ + public String getResourceInstanceName() { + return resourceInstanceName; + } + + /** + * Gets the resource name. + * + * @return the resource name + */ + public String getResourceName() { + return resourceName; + } + + /** + * Gets the resource invariant UUID. + * + * @return the resource invariant UUID + */ + public String getResourceInvariantUUID() { + return resourceInvariantUUID; + } + + /** + * Gets the resource version. + * + * @return the resource version + */ + public String getResourceVersion() { + return resourceVersion; + } + + /** + * Gets the resoucre type. + * + * @return the resoucre type + */ + public String getResoucreType() { + return resourceType; + } + + /** + * Gets the resource UUID. + * + * @return the resource UUID + */ + public String getResourceUUID() { + return resourceUUID; + } + + /** + * Gets the artifacts. + * + * @return the artifacts + */ + public Collection getArtifacts() { + return artifacts; + } + + /** + * Sets the resource instance name. + * + * @param resourceInstanceName the new resource instance name + */ + public void setResourceInstanceName(String resourceInstanceName) { + this.resourceInstanceName = resourceInstanceName; + } + + /** + * Sets the resource name. + * + * @param resourceName the new resource name + */ + public void setResourceName(String resourceName) { + this.resourceName = resourceName; + } + + /** + * Sets the resource invariant UUID. + * + * @param resourceInvariantUUID the new resource invariant UUID + */ + public void setResourceInvariantUUID(String resourceInvariantUUID) { + this.resourceInvariantUUID = resourceInvariantUUID; + } + + /** + * Sets the resource version. + * + * @param resourceVersion the new resource version + */ + public void setResourceVersion(String resourceVersion) { + this.resourceVersion = resourceVersion; + } + + /** + * Sets the resoucre type. + * + * @param resourceType the new resoucre type + */ + public void setResoucreType(String resourceType) { + this.resourceType = resourceType; + } + + /** + * Sets the resource UUID. + * + * @param resourceUUID the new resource UUID + */ + public void setResourceUUID(String resourceUUID) { + this.resourceUUID = resourceUUID; + } + + /** + * Sets the artifacts. + * + * @param artifacts the new artifacts + */ + public void setArtifacts(Collection artifacts) { + this.artifacts = artifacts; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Capability.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Capability.java new file mode 100755 index 00000000..21a50d3b --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Capability.java @@ -0,0 +1,140 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans.tosca; + +import java.util.Collection; +import java.util.Map; + +/** + * The Class Capability. + */ +public class Capability { + + /** The type. */ + private String type; //FIXME: Make an enumeration? + + /** The description. */ + private String description; + + /** The occurrences. */ + private Collection occurrences; //FIXME: Make an enumeration? + + /** The properties. */ + private Map properties; + + /** The valid source types. */ + private Collection valid_source_types; //FIXME: Make an enumeration? + + /** + * Instantiates a new capability. + */ + public Capability() {} + + /** + * Gets the type. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Gets the occurrences. + * + * @return the occurrences + */ + public Collection getOccurrences() { + return occurrences; + } + + /** + * Gets the properties. + * + * @return the properties + */ + public Map getProperties() { + return properties; + } + + /** + * Gets the valid source types. + * + * @return the valid source types + */ + public Collection getValid_source_types() { + return valid_source_types; + } + + /** + * Sets the type. + * + * @param type the new type + */ + public void setType(String type) { + this.type = type; + } + + /** + * Sets the description. + * + * @param description the new description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Sets the occurrences. + * + * @param occurrences the new occurrences + */ + public void setOccurrences(Collection occurrences) { + this.occurrences = occurrences; + } + + /** + * Sets the properties. + * + * @param properties the properties + */ + public void setProperties(Map properties) { + this.properties = properties; + } + + /** + * Sets the valid source types. + * + * @param valid_source_types the new valid source types + */ + public void setValid_source_types(Collection valid_source_types) { + this.valid_source_types = valid_source_types; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Constraint.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Constraint.java new file mode 100755 index 00000000..b68b51a0 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Constraint.java @@ -0,0 +1,199 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ +package org.openecomp.vid.asdc.beans.tosca; +import java.util.List; +import java.util.ArrayList; + +/** + * The Class Constraint. + */ + +public class Constraint { + private List valid_values; + private Object equal; + private Object greater_than; + private Object greater_or_equal; + private Object less_than; + private Object less_or_equal; + private List in_range; + private Object length; + private Object min_length; + private Object max_length; + + /** + * Instantiates a new Constraint. + */ + public Constraint() { + valid_values = new ArrayList(); + in_range = new ArrayList(); + } + + /** + * Gets the valid_values. + * + * @return the valid_values + */ + public List getvalid_values() { + return valid_values; + } + /** + * Gets equal. + * + * @return equal + */ + public Object getEqual() { + return equal; + } + /** + * Gets greater_than. + * + * @return greater_than + */ + public Object getGreater_than() { + return greater_than; + } + /** + * Gets greater_or_equal. + * + * @return greater_or_equal + */ + public Object getGreater_or_equal() { + return greater_or_equal; + } + /** + * Gets less_than. + * + * @return less_than + */ + public Object getLess_than() { + return less_than; + } + /** + * Gets less_or_equal. + * + * @return less_or_equal + */ + public Object getLess_or_equal() { + return less_or_equal; + } + /** + * Gets in_range. + * + * @return in_range + */ + public List getIn_range() { + return in_range; + } + /** + * Gets length. + * + * @return length + */ + public Object getLength() { + return length; + } + /** + * Gets min_length. + * + * @return min_length + */ + public Object getMin_length() { + return min_length; + } + /** + * Gets max_length. + * + * @return max_length + */ + public Object getMax_length() { + return max_length; + } + /** + * Sets the valid_values. + * + * @param op the new valid_values + */ + public void setvalid_values(List vlist) { + this.valid_values = vlist; + } + /** + * Sets equal. + * + * @param e the new equal + */ + public void setEqual(Object e) { + this.equal = e; + } + /** + * Sets greater_than. + * + * @param e the new greater_than + */ + public void setGreater_than(Object e) { + this.greater_than = e; + } + /** + * Sets less_than. + * + * @param e the new less_than + */ + public void setLess_than(Object e) { + this.less_than = e; + } + /** + * Sets in_range. + * + * @param e the new in_range + */ + public void setIn_range(List e) { + this.in_range = e; + } + /** + * Sets length. + * + * @param e the length + */ + public void setLength(Object e) { + this.length = e; + } + /** + * Sets min_length. + * + * @param e the min_length + */ + public void setMin_length(Object e) { + this.min_length = e; + } + /** + * Sets max_length. + * + * @param e the max_length + */ + public void setMax_length(Object e) { + this.max_length = e; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "valid_values=" + valid_values; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Group.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Group.java new file mode 100755 index 00000000..275db3c0 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Group.java @@ -0,0 +1,135 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans.tosca; + +import java.util.Collection; +import java.util.Map; + +/** + * The Class Group. + */ +public class Group { + + /** The type. */ + private String type; + + /** The members. */ + private Collection members; + + /** The metadata. */ + private ToscaMetadata metadata; + + /** The vf module type. */ + private String vf_module_type; + + /** The properties. */ + private Map properties; + + /** + * Gets the metadata. + * + * @return the metadata + */ + public ToscaMetadata getMetadata() { + return metadata; + } + + /** + * Sets the metadata. + * + * @param metadata the new metadata + */ + public void setMetadata(ToscaMetadata metadata) { + this.metadata = metadata; + } + + /** + * Gets the members. + * + * @return the members + */ + public Collection getMembers() { + return members; + } + + /** + * Sets the members. + * + * @param members the new members + */ + public void setMembers(Collection members) { + this.members = members; + } + + /** + * Gets the type. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * Sets the type. + * + * @param type the new type + */ + public void setType(String type) { + this.type = type; + } + + /** + * Gets the vf module type. + * + * @return the vf module type + */ + public String getvf_module_type() { + return vf_module_type; + } + + /** + * Sets the vf module type. + * + * @param vf_module_type the new vf module type + */ + public void setvf_module_type(String vf_module_type) { + this.vf_module_type = vf_module_type; + } + + /** + * Gets the properties. + * + * @return the properties + */ + public Map getProperties() { + return properties; + } + + /** + * Sets the properties. + * + * @param properties the properties + */ + public void setProperties(Map properties) { + this.properties = properties; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Import.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Import.java new file mode 100755 index 00000000..33f31757 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Import.java @@ -0,0 +1,48 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans.tosca; + +/** + * The Class Import. + */ +public class Import { + + /** The file. */ + private String file; + + /** + * Gets the file. + * + * @return the file + */ + public String getFile() { + return file; + } + + /** + * Sets the file. + * + * @param file the new file + */ + public void setFile(String file) { + this.file = file; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Input.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Input.java new file mode 100755 index 00000000..f9882071 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Input.java @@ -0,0 +1,166 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans.tosca; + +import java.util.List; +import java.util.ArrayList; + +// TODO: Auto-generated Javadoc +/** + * The Class Input. + */ +public class Input { + + /** The type. */ + private String type; + + /** The description. */ + private String description; + + /** The default. */ + private Object _default; + + /** The entry schema. */ + private Input entry_schema; + + /** The constraints */ + private List constraints; + + /** The required field. If not set, the default is true */ + private boolean required = true; + + /** + * Instantiates a new input. + */ + public Input() { + constraints = new ArrayList(); + } + + /** + * Gets the type. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * Sets the type. + * + * @param type the new type + */ + public void setType(String type) { + this.type = type; + } + /** + * Gets the required field. + * + * @return the required field + */ + public boolean getRequired() { + return required; + } + /** + * Sets the required value. + * + * @param required the new required value + */ + public void setRequired(boolean required) { + this.required = required; + } + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Sets the description. + * + * @param description the new description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Gets the default. + * + * @return the default + */ + public Object getDefault() { + return _default; + } + + /** + * Sets the default. + * + * @param _default the new default + */ + public void setDefault(Object _default) { + this._default = _default; + } + + /** + * Gets the entry schema. + * + * @return the entry schema + */ + public Input getentry_schema() { + return entry_schema; + } + /** + * Sets the entry schema. + * + * @param the entry schema + */ + public void setentry_schema(Input s) { + this.entry_schema = s; + } + /** + * Sets the constraints. + * + * @param c the new constraints + */ + public void setConstraints(List c) { + this.constraints = c; + } + /** + * Gets the constraints + * + * @return the constraints + */ + public List getConstraints() { + return constraints; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "type=" + type + ",description=" + description + ",default=" + _default; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/NodeTemplate.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/NodeTemplate.java new file mode 100755 index 00000000..73eead93 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/NodeTemplate.java @@ -0,0 +1,117 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans.tosca; + +import java.util.Map; +import java.util.HashMap; + +/** + * The Class NodeTemplate. + */ +public class NodeTemplate { + + /** The type. */ + private String type; + + /** The metadata. */ + private ToscaMetadata metadata; + + /** The properties. */ + private Map properties; //HEAT? + + /** The requirements. */ + private Object requirements; + + public NodeTemplate () { + properties = new HashMap(); + } + /** + * Gets the type. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * Sets the type. + * + * @param type the new type + */ + public void setType(String type) { + this.type = type; + } + + /** + * Gets the metadata. + * + * @return the metadata + */ + public ToscaMetadata getMetadata() { + return metadata; + } + + /** + * Sets the metadata. + * + * @param metadata the new metadata + */ + public void setMetadata(ToscaMetadata metadata) { + this.metadata = metadata; + } + + /** + * Gets the properties. + * + * @return the properties + */ + public Map getProperties() { + return properties; + } + + /** + * Sets the properties. + * + * @param properties the properties + */ + public void setProperties(Map properties) { + this.properties = properties; + } + + /** + * Gets the requirements. + * + * @return the requirements + */ + public Object getRequirements() { + return requirements; + } + + /** + * Sets the requirements. + * + * @param requirements the new requirements + */ + public void setRequirements(Object requirements) { + this.requirements = requirements; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Property.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Property.java new file mode 100755 index 00000000..c8f048ce --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Property.java @@ -0,0 +1,157 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans.tosca; + +/** + * The Class Property. + */ +public class Property { + + /** The type. */ + private String type; + + /** The description. */ + private String description; + + /** The entry schema. */ + private Schema entry_schema; + + /** The default. */ + private String _default; + + /** The required. */ + private boolean required; + + /** + * Instantiates a new property. + */ + private Property() {} + + /** + * Gets the type. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Gets the entry schema. + * + * @return the entry schema + */ + public Schema getEntry_schema() { + return entry_schema; + } + + /** + * Gets the default. + * + * @return the default + */ + public String get_default() { + return _default; + } + + /** + * Sets the type. + * + * @param type the new type + */ + public void setType(String type) { + this.type = type; + } + + /** + * Sets the description. + * + * @param description the new description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Sets the entry schema. + * + * @param entry_schema the new entry schema + */ + public void setEntry_schema(Schema entry_schema) { + this.entry_schema = entry_schema; + } + + /** + * Sets the default. + * + * @param _default the new default + */ + public void set_default(String _default) { + this._default = _default; + } + + /** + * Gets the default. + * + * @return the default + */ + public String getDefault() { + return _default; + } + + /** + * Checks if is required. + * + * @return true, if is required + */ + public boolean isRequired() { + return required; + } + + /** + * Sets the default. + * + * @param _default the new default + */ + public void setDefault(String _default) { + this._default = _default; + } + + /** + * Sets the required. + * + * @param required the new required + */ + public void setRequired(boolean required) { + this.required = required; + } + + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Requirement.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Requirement.java new file mode 100755 index 00000000..fce41ec6 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Requirement.java @@ -0,0 +1,120 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans.tosca; + +import java.util.Collection; + +/** + * The Class Requirement. + */ +public class Requirement { + + /** The occurrences. */ + private Collection occurrences; + + /** The capability. */ + private String capability; + + /** The node. */ + private String node; + + /** The relationship. */ + private String relationship; + + /** + * Instantiates a new requirement. + */ + private Requirement() {} + + /** + * Gets the occurrences. + * + * @return the occurrences + */ + public Collection getOccurrences() { + return occurrences; + } + + /** + * Gets the capability. + * + * @return the capability + */ + public String getCapability() { + return capability; + } + + /** + * Gets the node. + * + * @return the node + */ + public String getNode() { + return node; + } + + /** + * Gets the relationship. + * + * @return the relationship + */ + public String getRelationship() { + return relationship; + } + + /** + * Sets the occurrences. + * + * @param occurrences the new occurrences + */ + public void setOccurrences(Collection occurrences) { + this.occurrences = occurrences; + } + + /** + * Sets the capability. + * + * @param capability the new capability + */ + public void setCapability(String capability) { + this.capability = capability; + } + + /** + * Sets the node. + * + * @param node the new node + */ + public void setNode(String node) { + this.node = node; + } + + /** + * Sets the relationship. + * + * @param relationship the new relationship + */ + public void setRelationship(String relationship) { + this.relationship = relationship; + } + + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Schema.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Schema.java new file mode 100755 index 00000000..bd3a2f0a --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/Schema.java @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans.tosca; + +/** + * The Class Schema. + */ +public class Schema { + + /** The type. */ + public String type; + + /** + * Instantiates a new schema. + */ + public Schema() {} + + /** + * Gets the type. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * Sets the type. + * + * @param type the new type + */ + public void setType(String type) { + this.type = type; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/SubstitutionMappings.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/SubstitutionMappings.java new file mode 100755 index 00000000..026f29bb --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/SubstitutionMappings.java @@ -0,0 +1,101 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans.tosca; + +import java.util.HashMap; +import java.util.Map; + +/** + * The Class SubstitutionMappings. + */ +public class SubstitutionMappings { + + /** The node type. */ + private String node_type; + + /** The capabilities. */ + private Map capabilities; + + /** The requirements. */ + private Map requirements; + + /** + * Instantiates a new substitution mappings. + */ + public SubstitutionMappings() { + capabilities = new HashMap (); + requirements = new HashMap (); + } + + /** + * Gets the node type. + * + * @return the node type + */ + public String getnode_type() { + return node_type; + } + + /** + * Sets the node type. + * + * @param node_type the new node type + */ + public void setnode_type(String node_type) { + this.node_type = node_type; + } + + /** + * Gets the capabilities. + * + * @return the capabilities + */ + public Map getCapabilities() { + return capabilities; + } + + /** + * Sets the capabilities. + * + * @param capabilities the capabilities + */ + public void setCapabilities(Map capabilities) { + this.capabilities = capabilities; + } + + /** + * Gets the requirements. + * + * @return the requirements + */ + public Map getRequirements() { + return requirements; + } + + /** + * Sets the requirements. + * + * @param requirements the requirements + */ + public void setRequirements(Map requirements) { + this.requirements = requirements; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/TopologyTemplate.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/TopologyTemplate.java new file mode 100755 index 00000000..ce7ce575 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/TopologyTemplate.java @@ -0,0 +1,124 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans.tosca; + +import java.util.HashMap; +import java.util.Map; + +/** + * The Class TopologyTemplate. + */ +public class TopologyTemplate { + + /** The substitution mappings. */ + private SubstitutionMappings substitution_mappings; + + /** The inputs. */ + private Map inputs; + + /** The node templates. */ + private Map node_templates; + + /** The groups. */ + private Map groups; + + /** + * Instantiates a new topology template. + */ + public TopologyTemplate() { + substitution_mappings = new SubstitutionMappings(); + inputs = new HashMap (); + node_templates = new HashMap (); + groups = new HashMap (); + } + + /** + * Gets the substitution mappings. + * + * @return the substitution mappings + */ + public SubstitutionMappings getsubstitution_mappings() { + return this.substitution_mappings; + } + + /** + * Sets the substitution mappings. + * + * @param substitution_mappings the new substitution mappings + */ + public void setsubstitution_mappings(SubstitutionMappings substitution_mappings) { + this.substitution_mappings = substitution_mappings; + } + + /** + * Gets the inputs. + * + * @return the inputs + */ + public Map getInputs() { + return inputs; + } + + /** + * Sets the inputs. + * + * @param inputs the inputs + */ + public void setInputs(Map inputs) { + this.inputs = inputs; + } + + /** + * Gets the node templates. + * + * @return the node templates + */ + public Map getnode_templates() { + return node_templates; + } + + /** + * Setnode templates. + * + * @param node_templates the node templates + */ + public void setnode_templates(Map node_templates) { + this.node_templates = node_templates; + } + + /** + * Gets the groups. + * + * @return the groups + */ + public Map getGroups() { + return groups; + } + + /** + * Sets the groups. + * + * @param groups the groups + */ + public void setGroups(Map groups) { + this.groups = groups; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaCsar.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaCsar.java new file mode 100755 index 00000000..cca4ae7c --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaCsar.java @@ -0,0 +1,101 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans.tosca; + +import java.util.Collection; +import java.util.LinkedList; + +/** + * The Class ToscaCsar. + */ +public class ToscaCsar { + + /** The parent. */ + private final ToscaModel parent; + + /** The children. */ + private final Collection children; + + /** + * The Class Builder. + */ + public static class Builder { + + /** The parent. */ + private final ToscaModel parent; + + /** The children. */ + private Collection children = new LinkedList (); + + /** + * Instantiates a new builder. + * + * @param parent the parent + */ + public Builder(ToscaModel parent) { + this.parent = parent; + } + + /** + * Adds the vnf. + * + * @param child the child + * @return the builder + */ + public Builder addVnf(ToscaModel child) { + children.add(child); + return this; + } + + /** + * Builds the. + * + * @return the tosca csar + */ + public ToscaCsar build() { + return new ToscaCsar(this); + } + } + + /** + * Instantiates a new tosca csar. + * + * @param builder the builder + */ + public ToscaCsar(Builder builder) { + this.parent = builder.parent; + this.children = builder.children; + } + + /** + * Gets the parent. + * + * @return the parent + */ + public ToscaModel getParent() { return parent; } + + /** + * Gets the children. + * + * @return the children + */ + public Collection getChildren() { return children; } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaMeta.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaMeta.java new file mode 100755 index 00000000..66938372 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaMeta.java @@ -0,0 +1,122 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans.tosca; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; + +import org.openecomp.vid.asdc.AsdcCatalogException; + +/** + * The Class ToscaMeta. + */ +public class ToscaMeta { + + /** The metadata. */ + private final Map metadata; + + /** + * Instantiates a new tosca meta. + * + * @param builder the builder + * @throws IOException Signals that an I/O exception has occurred. + * @throws AsdcCatalogException the asdc catalog exception + */ + private ToscaMeta(Builder builder) throws IOException, AsdcCatalogException { + metadata = new HashMap (); + + read(builder.inputStream); + } + + /** + * The Class Builder. + */ + public static class Builder { + + /** The input stream. */ + private final InputStream inputStream; + + /** + * Instantiates a new builder. + * + * @param inputStream the input stream + */ + public Builder(InputStream inputStream) { + this.inputStream = inputStream; + } + + /** + * Builds the. + * + * @return the tosca meta + * @throws IOException Signals that an I/O exception has occurred. + * @throws AsdcCatalogException the asdc catalog exception + */ + public ToscaMeta build() throws IOException, AsdcCatalogException { + return new ToscaMeta(this); + } + } + + /** + * Gets the. + * + * @param property the property + * @return the string + */ + public String get(String property) { + return metadata.get(property); + } + + /** + * Read. + * + * @param inputStream the input stream + * @throws IOException Signals that an I/O exception has occurred. + * @throws AsdcCatalogException the asdc catalog exception + */ + private void read(InputStream inputStream) throws IOException, AsdcCatalogException { + + final BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); + + String line; + + try { + while ((line = br.readLine()) != null) { + final String[] entry = line.split(":"); + + if (entry.length != 2) throw new AsdcCatalogException("TOSCA.meta file cannot be parsed (more than 1 colon found on a single line"); + if (!entry[1].startsWith(" ")) throw new AsdcCatalogException("TOSCA.meta file cannot be parsed (: not immediately followed by ' ')"); + + metadata.put(entry[0], entry[1].substring(1)); + } + } catch (IOException e) { + metadata.clear(); + throw e; + } catch (AsdcCatalogException e) { + metadata.clear(); + throw e; + } + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaMetadata.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaMetadata.java new file mode 100755 index 00000000..d42c1f15 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaMetadata.java @@ -0,0 +1,461 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans.tosca; + +/** + * The Class ToscaMetadata. + */ +public class ToscaMetadata { + + /** The template name. */ + private String template_name; + + /** The invariant UUID. */ + private String invariantUUID; + + /** The customization UUID. */ + private String customizationUUID; + + /** The uuid. */ + private String uuid; + + /** The version. */ + private String version; + + /** The name. */ + private String name; + + /** The description. */ + private String description; + + /** The category. */ + private String category; + + /** The subcategory. */ + private String subcategory; + + /** The type. */ + private String type; + + /** The resource vendor. */ + private String resourceVendor; + + /** The resource vendor release. */ + private String resourceVendorRelease; + + /** The service ecomp naming. */ + private String serviceEcompNaming; + + /** The ecomp generated naming - duplicate for serviceEcompNaming */ + private boolean ecompGeneratedNaming; + + /** The naming policy */ + private String namingPolicy; + + /** The service homing. */ + private boolean serviceHoming; + + /** The vf module model name. */ + //ToscaMetadata for VF Modules + private String vfModuleModelName; + + /** The vf module model invariant UUID. */ + private String vfModuleModelInvariantUUID; + + /** The vf module model customization UUID. */ + private String vfModuleModelCustomizationUUID; + + /** The vf module model UUID. */ + private String vfModuleModelUUID; + + /** The vf module model version. */ + private String vfModuleModelVersion; + + /** + * Instantiates a new tosca metadata. + */ + public ToscaMetadata() {} + + /** + * Gets the type. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * Gets the invariant UUID. + * + * @return the invariant UUID + */ + public String getInvariantUUID() { + return invariantUUID; + } + /** + * Gets the customization UUID. + * + * @return the customization UUID + */ + public String getCustomizationUUID() { + return customizationUUID; + } + /** + * Gets the uuid. + * + * @return the uuid + */ + public String getUUID() { + return uuid; + } + + /** + * Gets the version. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Gets the category. + * + * @return the category + */ + public String getCategory() { + return category; + } + + /** + * Gets the subcategory. + * + * @return the subcategory + */ + public String getSubcategory() { + return subcategory; + } + + /** + * Gets the resource vendor. + * + * @return the resource vendor + */ + public String getResourceVendor() { + return resourceVendor; + } + + /** + * Gets the resource vendor release. + * + * @return the resource vendor release + */ + public String getResourceVendorRelease() { + return resourceVendorRelease; + } + + /** + * Returns the value of service ecomp naming. + * + * @return serviceEcompNaming + */ + public String getServiceEcompNaming() { + return serviceEcompNaming; + } + /** + * Returns the value of the naming policy. + * + * @return namingPolicy + */ + public String getNamingPolicy() { + return namingPolicy; + } + /** + * Checks if is service homing. + * + * @return true, if is service homing + */ + public boolean isServiceHoming() { + return serviceHoming; + } + /** + * Checks if is ecomp generated naming. + * + * @return true, if ecomp generated naming is true + */ + public boolean isEcompGeneratedNaming() { + return ecompGeneratedNaming; + } + /** + * Sets the type. + * + * @param type the new type + */ + public void setType(String type) { + this.type = type; + } + + /** + * Sets the invariant UUID. + * + * @param invariantUUID the new invariant UUID + */ + public void setInvariantUUID(String invariantUUID) { + this.invariantUUID = invariantUUID; + } + /** + * Sets the naming policy. + * + * @param namingPolicy the new naming policy + */ + public void setNamingPolicy(String namingPolicy) { + this.namingPolicy = namingPolicy; + } + /** + * Sets the uuid. + * + * @param uuid the new uuid + */ + public void setUUID(String uuid) { + this.uuid = uuid; + } + /** + * Sets the customization uuid. + * + * @param u the new customization uuid + */ + public void setCustomizationUUID(String u) { + this.customizationUUID = u; + } + /** + * Sets the version. + * + * @param version the new version + */ + public void setVersion(String version) { + this.version = version; + } + + /** + * Sets the name. + * + * @param name the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Sets the description. + * + * @param description the new description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Sets the category. + * + * @param category the new category + */ + public void setCategory(String category) { + this.category = category; + } + + /** + * Sets the service ecomp naming. + * + * @param serviceEcompNaming the new service ecomp naming + */ + public void setServiceEcompNaming(String serviceEcompNaming) { + this.serviceEcompNaming = serviceEcompNaming; + } + + /** + * Sets the service homing. + * + * @param serviceHoming the new service homing + */ + public void setServiceHoming(boolean serviceHoming) { + this.serviceHoming = serviceHoming; + } + /** + * Sets the ecomp generated naming. + * + * @param ecompGeneratedNaming the new ecomp generated naming + */ + public void setEcompGeneratedNaming(boolean ecompGeneratedNaming) { + this.ecompGeneratedNaming = ecompGeneratedNaming; + } + /** + * Gets the template name. + * + * @return the template name + */ + public String gettemplate_name() { + return template_name; + } + + /** + * Sets the template name. + * + * @param template_name the new template name + */ + public void settemplate_name(String template_name) { + this.template_name = template_name; + } + + /** + * Sets the subcategory. + * + * @param subcategory the new subcategory + */ + public void setSubcategory(String subcategory) { + this.subcategory = subcategory; + } + + /** + * Sets the resource vendor. + * + * @param resourceVendor the new resource vendor + */ + public void setResourceVendor(String resourceVendor) { + this.resourceVendor = resourceVendor; + } + + /** + * Sets the resource vendor release. + * + * @param resourceVendorRelease the new resource vendor release + */ + public void setResourceVendorRelease(String resourceVendorRelease) { + this.resourceVendorRelease = resourceVendorRelease; + } + + /** + * Gets the vf module model name. + * + * @return the vf module model name + */ + public String getVfModuleModelName() { + return vfModuleModelName; + } + + /** + * Sets the vf module model name. + * + * @param vfModuleModelName the new vf module model name + */ + public void setVfModuleModelName(String vfModuleModelName) { + this.vfModuleModelName = vfModuleModelName; + } + + /** + * Gets the vf module model invariant UUID. + * + * @return the vf module model invariant UUID + */ + public String getVfModuleModelInvariantUUID() { + return vfModuleModelInvariantUUID; + } + + /** + * Sets the vf module model invariant UUID. + * + * @param vfModuleModelInvariantUUID the new vf module model invariant UUID + */ + public void setVfModuleModelInvariantUUID(String vfModuleModelInvariantUUID) { + this.vfModuleModelInvariantUUID = vfModuleModelInvariantUUID; + } + + /** + * Gets the vf module model UUID. + * + * @return the vf module model UUID + */ + public String getVfModuleModelUUID() { + return vfModuleModelUUID; + } + + /** + * Sets the vf module model UUID. + * + * @param vfModuleModelUUID the new vf module model UUID + */ + public void setVfModuleModelUUID(String vfModuleModelUUID) { + this.vfModuleModelUUID = vfModuleModelUUID; + } + + /** + * Gets the vf module model version. + * + * @return the vf module model version + */ + public String getVfModuleModelVersion() { + return vfModuleModelVersion; + } + + /** + * Sets the vf module model version. + * + * @param vfModuleModelVersion the new vf module model version + */ + public void setVfModuleModelVersion(String vfModuleModelVersion) { + this.vfModuleModelVersion = vfModuleModelVersion; + } + /** + * Sets the vf module customization uuid. + * + * @param u the new vf module model customization uuid + */ + public void setVfModuleModelCustomizationUUID(String u) { + this.vfModuleModelCustomizationUUID = u; + } + /** + * Gets the vf module model customization uuid. + * + * @return the vf module model customization uuid + */ + public String getVfModuleModelCustomizationUUID() { + + return vfModuleModelCustomizationUUID; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaModel.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaModel.java new file mode 100755 index 00000000..c9e42f29 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaModel.java @@ -0,0 +1,166 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.beans.tosca; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.Map; + +/** + * The Class ToscaModel. + */ +public class ToscaModel { + + /** The tosca definitions version. */ + private String tosca_definitions_version; + + /** The description. */ + private String description; + + /** The metadata. */ + private ToscaMetadata metadata; + + /** The topology template. */ + private TopologyTemplate topology_template; + + /** The imports. */ + private Collection>> imports; + + /** The node types. */ + private Map node_types; + + /** + * Instantiates a new tosca model. + */ + public ToscaModel() { + metadata = new ToscaMetadata(); + topology_template = new TopologyTemplate(); + imports = new LinkedList>> (); + } + + /** + * Gets the metadata. + * + * @return the metadata + */ + public ToscaMetadata getMetadata() { + return metadata; + } + + /** + * Sets the metadata. + * + * @param metadata the new metadata + */ + public void setMetadata(ToscaMetadata metadata) { + this.metadata = metadata; + } + + /** + * Gets the tosca definitions version. + * + * @return the tosca definitions version + */ + public String gettosca_definitions_version() { + return tosca_definitions_version; + } + + /** + * Sets the tosca definitions version. + * + * @param tosca_definitions_version the new tosca definitions version + */ + public void settosca_definitions_version(String tosca_definitions_version) { + this.tosca_definitions_version = tosca_definitions_version; + } + + /** + * Gets the topology template. + * + * @return the topology template + */ + public TopologyTemplate gettopology_template() { + return topology_template; + } + + /** + * Sets the topology template. + * + * @param topology_template the new topology template + */ + public void settopology_template(TopologyTemplate topology_template) { + this.topology_template = topology_template; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Sets the description. + * + * @param description the new description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Gets the imports. + * + * @return the imports + */ + public Collection>> getImports() { + return imports; + } + + /** + * Sets the imports. + * + * @param imports the imports + */ + public void setImports(Collection>> imports) { + this.imports = imports; + } + + /** + * Gets the node types. + * + * @return the node types + */ + public Map getnode_types() { + return node_types; + } + + /** + * Setnode types. + * + * @param node_types the node types + */ + public void setnode_types(Map node_types) { + this.node_types = node_types; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/memory/InMemoryAsdcClient.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/memory/InMemoryAsdcClient.java new file mode 100755 index 00000000..c5134bfc --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/memory/InMemoryAsdcClient.java @@ -0,0 +1,372 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.memory; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.Collection; +import java.util.LinkedList; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; +import java.util.zip.ZipFile; + +import org.codehaus.jackson.JsonParseException; +import org.codehaus.jackson.map.JsonMappingException; +import org.codehaus.jackson.map.ObjectMapper; +import org.json.JSONArray; +import org.json.JSONObject; +import org.yaml.snakeyaml.Yaml; + +import org.openecomp.vid.asdc.AsdcCatalogException; +import org.openecomp.vid.asdc.AsdcClient; +import org.openecomp.vid.asdc.beans.Artifact; +import org.openecomp.vid.asdc.beans.Resource; +import org.openecomp.vid.asdc.beans.Service; +import org.openecomp.vid.asdc.beans.tosca.ToscaCsar; +import org.openecomp.vid.asdc.beans.tosca.ToscaMeta; +import org.openecomp.vid.asdc.beans.tosca.ToscaModel; + +/** + * The Class InMemoryAsdcClient. + */ +public class InMemoryAsdcClient implements AsdcClient { + + /** The catalog. */ + private final JSONObject catalog; + + /** The mapper. */ + private final ObjectMapper mapper; + + /** + * The Class Builder. + */ + public static class Builder { + + /** The catalog. */ + private JSONObject catalog = new JSONObject() + .put("resources", new JSONObject()) + .put("services", new JSONObject()); + + /** The mapper. */ + private ObjectMapper mapper = new ObjectMapper(); + + /** + * Instantiates a new builder. + */ + public Builder() {} + + /** + * Catalog. + * + * @param catalog the catalog + * @return the builder + */ + public Builder catalog(JSONObject catalog) { + this.catalog = catalog; + return this; + } + + /** + * Mapper. + * + * @param mapper the mapper + * @return the builder + */ + public Builder mapper(ObjectMapper mapper) { + this.mapper = mapper; + return this; + } + + /** + * Builds the. + * + * @return the in memory sdc client + */ + public InMemoryAsdcClient build() { + return new InMemoryAsdcClient(this); + } + } + + /** + * Instantiates a new in memory sdc client. + * + * @param builder the builder + */ + private InMemoryAsdcClient(Builder builder) { + catalog = builder.catalog; + mapper = builder.mapper; + } + + /** + * Gets the catalog. + * + * @return the catalog + */ + private JSONObject getCatalog() { + return catalog; + } + + /** + * Gets the mapper. + * + * @return the mapper + */ + private ObjectMapper getMapper() { + return mapper; + } + + /** + * Convert. + * + * @param the generic type + * @param json the json + * @param clazz the clazz + * @return the t + * @throws AsdcCatalogException the sdc catalog exception + */ + private T convert(JSONObject json, Class clazz) throws AsdcCatalogException { + try { + return getMapper().readValue(json.toString(), clazz); + } catch (JsonParseException e) { + throw new AsdcCatalogException("Failed to parse SDC response (bad data)", e); + } catch (JsonMappingException e) { + throw new AsdcCatalogException("Failed to map SDC response to internal VID data structure(s)", e); + } catch (IOException e) { + throw new AsdcCatalogException("Failed to get a response from SDC", e); + } + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getResource(java.util.UUID) + */ + public Resource getResource(UUID uuid) throws AsdcCatalogException { + final JSONObject resource = getCatalog().getJSONObject("resources") + .getJSONObject(uuid.toString()); + return convert(resource, Resource.class); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getResources() + */ + public Collection getResources() throws AsdcCatalogException { + final Collection resources = new LinkedList (); + + for (String key : getCatalog().getJSONObject("resources").keySet()) { + final JSONObject json = getCatalog().getJSONObject("resources").getJSONObject(key); + final Resource resource = convert(json, Resource.class); + resources.add(resource); + } + + return resources; + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getResources(java.util.Map) + */ + public Collection getResources(Map filter) throws AsdcCatalogException { + final Collection resources = new LinkedList (); + + for (String key : getCatalog().getJSONObject("resources").keySet()) { + final JSONObject json = getCatalog().getJSONObject("resources").getJSONObject(key); + + boolean filterMatch = true; + + for (Entry entry : filter.entrySet()) { + for (int i = 0; i < entry.getValue().length; i++) { + if (!json.getString(entry.getKey()).equals(entry.getValue()[i])) { + filterMatch = false; + break; + } + } + } + + if (filterMatch) resources.add(convert(json, Resource.class)); + } + + return resources; + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getService(java.util.UUID) + */ + public Service getService(UUID uuid) throws AsdcCatalogException { + final JSONObject service = getCatalog().getJSONObject("services") + .getJSONObject(uuid.toString()); + return convert(service, Service.class); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getServices() + */ + public Collection getServices() throws AsdcCatalogException { + final Collection services = new LinkedList (); + + for (String key : getCatalog().getJSONObject("services").keySet()) { + final JSONObject json = getCatalog().getJSONObject("services").getJSONObject(key); + final Service service = convert(json, Service.class); + services.add(service); + } + + return services; + } + + /* (non-Javadoc) + * @see org.openecompt.vid.asdc.AsdcClient#getServices(java.util.Map) + */ + public Collection getServices(Map filter) throws AsdcCatalogException { + final Collection services = new LinkedList (); + + for (String key : getCatalog().getJSONObject("services").keySet()) { + final JSONObject json = getCatalog().getJSONObject("services").getJSONObject(key); + + boolean filterMatch = true; + + for (Entry entry : filter.entrySet()) { + for (int i = 0; i < entry.getValue().length; i++) { + if (!json.getString(entry.getKey()).equals(entry.getValue()[i])) { + filterMatch = false; + break; + } + } + } + + if (filterMatch) services.add(convert(json, Service.class)); + } + + return services; + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getResourceArtifact(java.util.UUID, java.util.UUID) + */ + public Artifact getResourceArtifact(UUID resourceUuid, UUID artifactUuid) throws AsdcCatalogException { + final JSONArray artifacts = getCatalog().getJSONObject("resources") + .getJSONObject(resourceUuid.toString()) + .getJSONArray("artifacts"); + + for (int i = 0; i < artifacts.length(); i++) { + final JSONObject artifact = artifacts.getJSONObject(i); + + if (artifact.getString("artifactUUID").equals(artifactUuid.toString())) { + return convert(artifact, Artifact.class); + } + } + + return null; + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getServiceArtifact(java.util.UUID, java.util.UUID) + */ + public Artifact getServiceArtifact(UUID serviceUuid, UUID artifactUuid) throws AsdcCatalogException { + final JSONArray artifacts = getCatalog().getJSONObject("services") + .getJSONObject(serviceUuid.toString()) + .getJSONArray("artifacts"); + + for (int i = 0; i < artifacts.length(); i++) { + final JSONObject artifact = artifacts.getJSONObject(i); + + if (artifact.getString("artifactUUID").equals(artifactUuid.toString())) { + return convert(artifact, Artifact.class); + } + } + + return null; + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getResourceToscaModel(java.util.UUID) + */ + public ToscaCsar getResourceToscaModel(UUID resourceUuid) throws AsdcCatalogException { + final String toscaModelURL = getCatalog().getJSONObject("resources") + .getJSONObject(resourceUuid.toString()) + .getString("toscaModelURL"); + + + final InputStream toscaModelStream = getClass().getClassLoader().getResourceAsStream(toscaModelURL); + + if (toscaModelStream == null) return null; + + return getToscaModel(toscaModelStream); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getServiceToscaModel(java.util.UUID) + */ + public ToscaCsar getServiceToscaModel(UUID serviceUuid) throws AsdcCatalogException { + final String toscaModelURL = getCatalog().getJSONObject("services") + .getJSONObject(serviceUuid.toString()) + .getString("toscaModelURL"); + + final InputStream toscaModelStream = getClass().getClassLoader().getResourceAsStream(toscaModelURL); + + if (toscaModelStream == null) return null; + + return getToscaModel(toscaModelStream); + } + + /** + * Gets the tosca model. + * + * @param csarInputStream the csar input stream + * @return the tosca model + * @throws AsdcCatalogException the asdc catalog exception + */ + private ToscaCsar getToscaModel(InputStream csarInputStream) throws AsdcCatalogException { + final Path csarFile; + + try { + csarFile = Files.createTempFile("csar", ".zip"); + Files.copy(csarInputStream, csarFile, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + throw new AsdcCatalogException("Caught IOException while creating CSAR", e); + } + + try (final ZipFile csar = new ZipFile(csarFile.toFile())) { + + final InputStream toscaMetaStream = csar.getInputStream(csar.getEntry("TOSCA-Metadata/TOSCA.meta")); + final ToscaMeta toscaMeta = new ToscaMeta.Builder(toscaMetaStream).build(); + final String entryDefinitions = toscaMeta.get("Entry-Definitions"); + final InputStream toscaParentEntryYamlStream = csar.getInputStream(csar.getEntry(entryDefinitions)); + + final Yaml yaml = new Yaml(); + final ToscaModel parentModel = yaml.loadAs(toscaParentEntryYamlStream, ToscaModel.class); + + final ToscaCsar.Builder csarBuilder = new ToscaCsar.Builder(parentModel); + + for (Map> imports : parentModel.getImports()) { + for (Entry> entry : imports.entrySet()) { + final InputStream toscaChildEntryYamlStream = csar.getInputStream(csar.getEntry("Definitions/" + entry.getValue().get("file"))); + final ToscaModel childModel = yaml.loadAs(toscaChildEntryYamlStream, ToscaModel.class); + csarBuilder.addVnf(childModel); + } + } + + return csarBuilder.build(); + } catch (IOException e) { + throw new AsdcCatalogException("Caught IOException while processing CSAR", e); + } + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/rest/RestfulAsdcClient.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/rest/RestfulAsdcClient.java new file mode 100755 index 00000000..26d45cc7 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/rest/RestfulAsdcClient.java @@ -0,0 +1,462 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.asdc.rest; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; +import java.util.logging.Logger; +import java.util.zip.ZipFile; + +import javax.ws.rs.NotFoundException; +import javax.ws.rs.ProcessingException; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ResponseProcessingException; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedHashMap; + +import org.openecomp.vid.asdc.AsdcCatalogException; +import org.openecomp.vid.asdc.AsdcClient; +import org.openecomp.vid.asdc.beans.Artifact; +import org.openecomp.vid.asdc.beans.Resource; +import org.openecomp.vid.asdc.beans.Service; +import org.openecomp.vid.asdc.beans.tosca.ToscaCsar; +import org.openecomp.vid.asdc.beans.tosca.ToscaMeta; +import org.openecomp.vid.asdc.beans.tosca.ToscaModel; +import org.openecomp.vid.model.ModelConstants; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.error.YAMLException; + +import org.openecomp.vid.properties.VidProperties; +import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; + +/** + * The Class RestfulAsdcClient. + */ +public class RestfulAsdcClient implements AsdcClient { + + /** The Constant LOGGER. */ + private static final Logger LOGGER = Logger.getLogger(RestfulAsdcClient.class.getName()); + + /** The client. */ + private final Client client; + + /** The uri. */ + private final URI uri; + + /** The common headers. */ + private final MultivaluedHashMap commonHeaders; + + /** The auth. */ + private final String auth; + + /** + * The Class Builder. + */ + public static class Builder { + + /** The client. */ + private final Client client; + + /** The uri. */ + private final URI uri; + + /** The auth. */ + private String auth = null; + + /** + * Instantiates a new builder. + * + * @param client the client + * @param uri the uri + */ + public Builder(Client client, URI uri) { + this.client = client; + this.client.register(JacksonJsonProvider.class); + this.uri = uri; + } + + /** + * Auth. + * + * @param auth the auth + * @return the builder + */ + public Builder auth(String auth) { + this.auth = auth; + return this; + } + + /** + * Builds the. + * + * @return the restful asdc client + */ + public RestfulAsdcClient build() { + return new RestfulAsdcClient(this); + } + } + + /** + * Instantiates a new restful asdc client. + * + * @param builder the builder + */ + private RestfulAsdcClient(Builder builder) { + client = builder.client; + uri = builder.uri; + auth = builder.auth; + + commonHeaders = new MultivaluedHashMap (); + commonHeaders.put("X-ECOMP-InstanceID", Collections.singletonList((Object) "VID")); + commonHeaders.put("Authorization", Collections.singletonList((Object) (auth))); + } + + /** + * Gets the client. + * + * @return the client + */ + private Client getClient() { return client; } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getResource(java.util.UUID) + */ + public Resource getResource(UUID uuid) throws AsdcCatalogException { + String path = VidProperties.getPropertyWithDefault(ModelConstants.ASDC_RESOURCE_API_PATH, ModelConstants.DEFAULT_ASDC_RESOURCE_API_PATH); + try { + return getClient() + .target(uri) + .path(path + "/" + uuid.toString() + "/metadata") + .request(MediaType.APPLICATION_JSON_TYPE) + .headers(commonHeaders) + .header("Content-Type", MediaType.APPLICATION_JSON) + .get(Resource.class); + } catch (ResponseProcessingException e) { + //Couldn't convert response to Java type + throw new AsdcCatalogException("ASDC response could not be processed", e); + } catch (ProcessingException e) { + //IO problems during request + throw new AsdcCatalogException("Failed to get a response from ASDC service", e); + } catch (WebApplicationException e) { + //Web service returned data, but the response status wasn't a good one (i.e. non 2xx) + throw new AsdcCatalogException(e); + } + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getResources() + */ + public Collection getResources() throws AsdcCatalogException { + String path = VidProperties.getPropertyWithDefault(ModelConstants.ASDC_RESOURCE_API_PATH, ModelConstants.DEFAULT_ASDC_RESOURCE_API_PATH); + try { + return getClient() + .target(uri) + .path(path) + .request(MediaType.APPLICATION_JSON_TYPE) + .headers(commonHeaders) + .header("Content-Type", MediaType.APPLICATION_JSON) + .get(new GenericType> () {}); + } catch (ResponseProcessingException e) { + //Couldn't convert response to Java type + throw new AsdcCatalogException("ASDC response could not be processed", e); + } catch (ProcessingException e) { + //IO problems during request + throw new AsdcCatalogException("Failed to get a response from ASDC service", e); + } catch (WebApplicationException e) { + //Web service returned data, but the response status wasn't a good one (i.e. non 2xx) + throw new AsdcCatalogException(e); + } + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getResources(java.util.Map) + */ + public Collection getResources(Map filter) throws AsdcCatalogException { + String path = VidProperties.getPropertyWithDefault(ModelConstants.ASDC_RESOURCE_API_PATH, ModelConstants.DEFAULT_ASDC_RESOURCE_API_PATH); + WebTarget target = getClient() + .target(uri) + .path(path); + + for (Entry filterEntry : filter.entrySet()) { + target = target.queryParam(filterEntry.getKey(), (Object []) filterEntry.getValue()); + } + + try { + return target.request() + .accept(MediaType.APPLICATION_JSON_TYPE) + .headers(commonHeaders) + .header("Content-Type", MediaType.APPLICATION_JSON) + .get(new GenericType> () {}); + } catch (ResponseProcessingException e) { + //Couldn't convert response to Java type + throw new AsdcCatalogException("ASDC response could not be processed", e); + } catch (ProcessingException e) { + //IO problems during request + throw new AsdcCatalogException("Failed to get a response from ASDC service", e); + } catch (NotFoundException e) { + throw e; + } catch (WebApplicationException e) { + //Web service returned data, but the response status wasn't a good one (i.e. non 2xx) + throw new AsdcCatalogException(e); + } + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getResourceArtifact(java.util.UUID, java.util.UUID) + */ + public Artifact getResourceArtifact(UUID resourceUuid, UUID artifactUuid) throws AsdcCatalogException { + String path = VidProperties.getPropertyWithDefault(ModelConstants.ASDC_RESOURCE_API_PATH, ModelConstants.DEFAULT_ASDC_RESOURCE_API_PATH); + try { + return getClient() + .target(uri) + .path(path + "/" + resourceUuid + "/artifacts/" + artifactUuid) + .request(MediaType.APPLICATION_JSON_TYPE) + .headers(commonHeaders) + .header("Content-Type", MediaType.APPLICATION_JSON) + .get(Artifact.class); + } catch (ResponseProcessingException e) { + //Couldn't convert response to Java type + throw new AsdcCatalogException("ASDC response could not be processed", e); + } catch (ProcessingException e) { + //IO problems during request + throw new AsdcCatalogException("Failed to get a response from ASDC service", e); + } catch (WebApplicationException e) { + //Web service returned data, but the response status wasn't a good one (i.e. non 2xx) + throw new AsdcCatalogException(e); + } + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getService(java.util.UUID) + */ + public Service getService(UUID uuid) throws AsdcCatalogException { + + String path = VidProperties.getPropertyWithDefault(ModelConstants.ASDC_SVC_API_PATH, ModelConstants.DEFAULT_ASDC_SVC_API_PATH); + try { + return getClient() + .target(uri) + .path( path + "/" + uuid.toString() + "/metadata") + .request(MediaType.APPLICATION_JSON) + .headers(commonHeaders) + .get(Service.class); + } catch (ResponseProcessingException e) { + //Couldn't convert response to Java type + throw new AsdcCatalogException("ASDC response could not be processed", e); + } catch (ProcessingException e) { + //IO problems during request + throw new AsdcCatalogException("Failed to get a response from ASDC service", e); + } catch (WebApplicationException e) { + //Web service returned data, but the response status wasn't a good one (i.e. non 2xx) + throw new AsdcCatalogException(e); + } + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getServices() + */ + public Collection getServices() throws AsdcCatalogException { + String path = VidProperties.getPropertyWithDefault(ModelConstants.ASDC_SVC_API_PATH, ModelConstants.DEFAULT_ASDC_SVC_API_PATH); + try { + return getClient() + .target(uri) + .path(path) + .request() + .accept(MediaType.APPLICATION_JSON_TYPE) + .headers(commonHeaders) + .header("Content-Type", MediaType.APPLICATION_JSON) + .get(new GenericType> () {}); + } catch (ResponseProcessingException e) { + //Couldn't convert response to Java type + throw new AsdcCatalogException("ASDC response could not be processed", e); + } catch (ProcessingException e) { + //IO problems during request + throw new AsdcCatalogException("Failed to get a response from ASDC service", e); + } catch (WebApplicationException e) { + //Web service returned data, but the response status wasn't a good one (i.e. non 2xx) + throw new AsdcCatalogException(e); + } + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getServices(java.util.Map) + */ + public Collection getServices(Map filter) throws AsdcCatalogException { + + String path = VidProperties.getPropertyWithDefault(ModelConstants.ASDC_SVC_API_PATH, ModelConstants.DEFAULT_ASDC_SVC_API_PATH); + WebTarget target = getClient() + .target(uri) + .path(path); + + + for (Entry filterEntry : filter.entrySet()) { + target = target.queryParam(filterEntry.getKey(), (Object []) filterEntry.getValue()); + } + + try { + return target.request() + .accept(MediaType.APPLICATION_JSON_TYPE) + .headers(commonHeaders) + .header("Content-Type", MediaType.APPLICATION_JSON) + .get(new GenericType> () {}); + } catch (ResponseProcessingException e) { + //Couldn't convert response to Java type + throw new AsdcCatalogException("ASDC response could not be processed", e); + } catch (ProcessingException e) { + //IO problems during request + throw new AsdcCatalogException("Failed to get a response from ASDC service", e); + } catch (NotFoundException e) { + throw e; + } catch (WebApplicationException e) { + //Web service returned data, but the response status wasn't a good one (i.e. non 2xx) + throw new AsdcCatalogException(e); + } + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getServiceArtifact(java.util.UUID, java.util.UUID) + */ + public Artifact getServiceArtifact(UUID serviceUuid, UUID artifactUuid) throws AsdcCatalogException { + String path = VidProperties.getPropertyWithDefault(ModelConstants.ASDC_SVC_API_PATH, ModelConstants.DEFAULT_ASDC_SVC_API_PATH); + try { + return getClient() + .target(uri) + .path(path + "/" + serviceUuid + "/artifacts/" + artifactUuid) + .request(MediaType.APPLICATION_JSON_TYPE) + .headers(commonHeaders) + .header("Content-Type", MediaType.APPLICATION_JSON) + .get(Artifact.class); + } catch (ResponseProcessingException e) { + //Couldn't convert response to Java type + throw new AsdcCatalogException("ASDC response could not be processed", e); + } catch (ProcessingException e) { + //IO problems during request + throw new AsdcCatalogException("Failed to get a response from ASDC service", e); + } catch (WebApplicationException e) { + //Web service returned data, but the response status wasn't a good one (i.e. non 2xx) + throw new AsdcCatalogException(e); + } + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getResourceToscaModel(java.util.UUID) + */ + public ToscaCsar getResourceToscaModel(UUID resourceUuid) throws AsdcCatalogException { + String path = VidProperties.getPropertyWithDefault(ModelConstants.ASDC_RESOURCE_API_PATH, ModelConstants.DEFAULT_ASDC_RESOURCE_API_PATH); + try (final InputStream csarInputStream = (InputStream) getClient() + .target(uri) + .path(path + "/" + resourceUuid + "/toscaModel") + .request(MediaType.APPLICATION_OCTET_STREAM_TYPE) + .headers(commonHeaders) + .header("Content-Type", MediaType.APPLICATION_OCTET_STREAM) + .get(InputStream.class)) { + + return getToscaModel(csarInputStream); + } catch (IOException e) { + throw new AsdcCatalogException("Failed to retrieve resource TOSCA model from ASDC", e); + } + } + + /* (non-Javadoc) + * @see org.openecomp.vid.asdc.AsdcClient#getServiceToscaModel(java.util.UUID) + */ + public ToscaCsar getServiceToscaModel(UUID serviceUuid) throws AsdcCatalogException { + String path = VidProperties.getPropertyWithDefault(ModelConstants.ASDC_SVC_API_PATH, ModelConstants.DEFAULT_ASDC_SVC_API_PATH); + try { + final InputStream csarInputStream = (InputStream) getClient() + .target(uri) + .path(path + "/" + serviceUuid + "/toscaModel") + .request(MediaType.APPLICATION_OCTET_STREAM_TYPE) + .headers(commonHeaders) + .header("Content-Type", MediaType.APPLICATION_OCTET_STREAM) + .get(InputStream.class); + + return getToscaModel(csarInputStream); + } catch (ResponseProcessingException e) { + //Couldn't convert response to Java type + throw new AsdcCatalogException("ASDC response could not be processed", e); + } catch (ProcessingException e) { + //IO problems during request + throw new AsdcCatalogException("Failed to get a response from ASDC service", e); + } catch (WebApplicationException e) { + //Web service returned data, but the response status wasn't a good one (i.e. non 2xx) + throw new AsdcCatalogException(e); + } + } + + /** + * Gets the tosca model. + * + * @param csarInputStream the csar input stream + * @return the tosca model + * @throws AsdcCatalogException the asdc catalog exception + */ + private ToscaCsar getToscaModel(InputStream csarInputStream) throws AsdcCatalogException { + final Path csarFile; + + try { + csarFile = Files.createTempFile("csar", ".zip"); + Files.copy(csarInputStream, csarFile, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + throw new AsdcCatalogException("Caught IOException while creating CSAR", e); + } + + try (final ZipFile csar = new ZipFile(csarFile.toFile())) { + + final InputStream toscaMetaStream = csar.getInputStream(csar.getEntry("TOSCA-Metadata/TOSCA.meta")); + final ToscaMeta toscaMeta = new ToscaMeta.Builder(toscaMetaStream).build(); + final String entryDefinitions = toscaMeta.get("Entry-Definitions"); + final InputStream toscaParentEntryYamlStream = csar.getInputStream(csar.getEntry(entryDefinitions)); + + try { + final Yaml yaml = new Yaml(); + final ToscaModel parentModel = yaml.loadAs(toscaParentEntryYamlStream, ToscaModel.class); + + final ToscaCsar.Builder csarBuilder = new ToscaCsar.Builder(parentModel); + + for (Map> imports : parentModel.getImports()) { + for (Entry> entry : imports.entrySet()) { + final InputStream toscaChildEntryYamlStream = csar.getInputStream(csar.getEntry("Definitions/" + entry.getValue().get("file"))); + final ToscaModel childModel = yaml.loadAs(toscaChildEntryYamlStream, ToscaModel.class); + csarBuilder.addVnf(childModel); + } + } + + return csarBuilder.build(); + } catch (YAMLException e) { + throw new AsdcCatalogException("Caught exception while processing TOSCA YAML", e); + } + } catch (IOException e) { + throw new AsdcCatalogException("Caught IOException while processing CSAR", e); + } + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/client/HttpBasicClient.java b/vid-app-common/src/main/java/org/openecomp/vid/client/HttpBasicClient.java new file mode 100755 index 00000000..ef2ade91 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/client/HttpBasicClient.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.client; + + +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +import javax.servlet.ServletContext; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; + +import org.glassfish.jersey.client.ClientConfig; +import org.glassfish.jersey.client.ClientProperties; +import org.springframework.beans.factory.annotation.Autowired; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; + +/** + * General HTTP client. + */ + +public class HttpBasicClient{ + + /** The servlet context. */ + @Autowired + private ServletContext servletContext; + + /** The logger. */ + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(HttpBasicClient.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + /** + * Obtain a basic HTTP client . + * + * @return Client client object + * @throws Exception the exception + */ + public static Client getClient() throws Exception { + + ClientConfig config = new ClientConfig(); + config.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true); + + return ClientBuilder.newClient(config) + .register(org.openecomp.aai.util.CustomJacksonJaxBJsonProvider.class); + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/client/HttpsBasicClient.java b/vid-app-common/src/main/java/org/openecomp/vid/client/HttpsBasicClient.java new file mode 100755 index 00000000..dc0e3559 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/client/HttpsBasicClient.java @@ -0,0 +1,143 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.client; + +import java.io.File; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; + +import org.eclipse.jetty.util.security.Password; +import org.glassfish.jersey.client.ClientConfig; +import org.glassfish.jersey.client.ClientProperties; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; +import org.openecomp.vid.properties.VidProperties; + + /** + * General SSL client using the VID tomcat keystore. It doesn't use client certificates. + */ + +public class HttpsBasicClient{ + + /** The logger. */ + static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(HttpsBasicClient.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + /** + * Retrieve an SSL client. + * + * @return Client The SSL client + * @throws Exception the exception + */ + public static Client getClient() throws Exception { + String methodName = "getClient"; + ClientConfig config = new ClientConfig(); + //config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); + //config.getClasses().add(org.openecomp.aai.util.CustomJacksonJaxBJsonProvider.class); + + SSLContext ctx = null; + + try { + + config.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true); + + String truststore_path = SystemProperties.getProperty(VidProperties.VID_TRUSTSTORE_FILENAME); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + " " + methodName + " truststore_path=" + truststore_path); + String truststore_password = SystemProperties.getProperty(VidProperties.VID_TRUSTSTORE_PASSWD_X); + + + String decrypted_truststore_password = Password.deobfuscate(truststore_password); + //logger.debug(dateFormat.format(new Date()) + " " + methodName + " decrypted_truststore_password=" + decrypted_truststore_password); + + File tr = new File (truststore_path); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + " " + methodName + " absolute truststore path=" + tr.getAbsolutePath()); + + //String keystore_path = certFilePath + AAIProperties.FILESEPARTOR + SystemProperties.getProperty(AAIProperties.AAI_KEYSTORE_FILENAME); + //String keystore_password = SystemProperties.getProperty(AAIProperties.AAI_KEYSTORE_PASSWD_X); + //String decrypted_keystore_password = EncryptedPropValue.decryptTriple(keystore_password); + + System.setProperty("javax.net.ssl.trustStore", truststore_path); + System.setProperty("javax.net.ssl.trustStorePassword", decrypted_truststore_password); + HttpsURLConnection.setDefaultHostnameVerifier( new HostnameVerifier(){ + public boolean verify(String string,SSLSession ssls) { + return true; + } + }); + + //May need to make the algorithm a parameter. MSO requires TLSv1.1 or TLSv1.2 + ctx = SSLContext.getInstance("TLSv1.2"); + + /* + KeyManagerFactory kmf = null; + try { + kmf = KeyManagerFactory.getInstance("SunX509"); + FileInputStream fin = new FileInputStream(keystore_path); + KeyStore ks = KeyStore.getInstance("PKCS12"); + char[] pwd = decrypted_keystore_password.toCharArray(); + ks.load(fin, pwd); + kmf.init(ks, pwd); + } catch (Exception e) { + System.out.println("Error setting up kmf: exiting"); + e.printStackTrace(); + System.exit(1); + } + + ctx.init(kmf.getKeyManagers(), null, null); + */ + ctx.init(null, null, null); + //config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, + // new HTTPSProperties( , ctx)); + + return ClientBuilder.newBuilder() + .sslContext(ctx) + .hostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify( String s, SSLSession sslSession ) { + return true; + } + }).withConfig(config) + .build() + .register(org.openecomp.aai.util.CustomJacksonJaxBJsonProvider.class); + + } catch (Exception e) { + logger.debug(EELFLoggerDelegate.debugLogger, "Error setting up config: exiting"); + //System.out.println("Error setting up config: exiting"); + e.printStackTrace(); + return null; + } + + //Client client = ClientBuilder.newClient(config); + // uncomment this line to get more logging for the request/response + // client.addFilter(new LoggingFilter(System.out)); + + //return client; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/AaiController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/AaiController.java new file mode 100755 index 00000000..7cb25c26 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/AaiController.java @@ -0,0 +1,864 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.controller; + +import java.io.File; +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.UUID; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import javax.ws.rs.BadRequestException; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.openecomp.aai.util.AAIRestInterface; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.openecomp.portalsdk.core.domain.User; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; + +/** + * Controller to handle a&ai requests. + */ + +@RestController +public class AaiController extends RestrictedBaseController{ + + /** The view name. */ + String viewName; + + /** The logger. */ + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(AaiController.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + /** The from app id. */ + protected String fromAppId = "VidAaiController"; + + /** The model. */ + private Map model = new HashMap(); + + /** The servlet context. */ + private @Autowired ServletContext servletContext; + + /** + * Welcome method. + * + * @param request the request + * @return ModelAndView The view + */ + @RequestMapping(value = {"/subscriberSearch" }, method = RequestMethod.GET) + public ModelAndView welcome(HttpServletRequest request) { + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== AaiController welcome start"); + return new ModelAndView(getViewName()); + } + + /* (non-Javadoc) + * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#getViewName() + */ + public String getViewName() { + return viewName; + } + + /* (non-Javadoc) + * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#setViewName(java.lang.String) + */ + public void setViewName(String viewName) { + this.viewName = viewName; + } + + /** + * Get services from a&ai. + * + * @return ResponseEntity The response entity with the logged in user uuid. + * @throws IOException Signals that an I/O exception has occurred. + * @throws InterruptedException the interrupted exception + */ + @RequestMapping(value = {"/getuserID" }, method = RequestMethod.GET) + public ResponseEntity getUserID(HttpServletRequest request) throws IOException, InterruptedException { + + String userId = ""; + HttpSession session = request.getSession(); + if (session != null) + { + User user = (User) session.getAttribute(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME)); + if (user != null) + { + userId = user.getHrid(); + } + } + + return new ResponseEntity( userId, HttpStatus.OK); + } + + + /** + * Get services from a&ai. + * + * @return ResponseEntity The response entity + * @throws IOException Signals that an I/O exception has occurred. + * @throws InterruptedException the interrupted exception + */ + @RequestMapping(value="/aai_get_services",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity doGetServices() throws IOException, InterruptedException { + File certiPath = GetCertificatesPath(); + Response resp = doAaiGet(certiPath.getAbsolutePath(), "service-design-and-creation/services", false); + + return convertResponseToResponseEntity(resp); + } + + /** + * Lookup single service instance in a&ai. Get the service-subscription and customer, too, i guess? + * + * @param serviceInstanceId the service instance Id + * @return ResponseEntity The response entity + * @throws IOException Signals that an I/O exception has occurred. + * @throws InterruptedException the interrupted exception + */ + @RequestMapping(value="/aai_get_service_instance/{service-instance-id}/{service-instance-type}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity doGetServiceInstance(@PathVariable("service-instance-id") String serviceInstanceId,@PathVariable("service-instance-type") String serviceInstanceType) throws IOException, InterruptedException { + File certiPath = GetCertificatesPath(); + Response resp=null; + + if(serviceInstanceType.equalsIgnoreCase("Service Instance Id")){ + resp = doAaiGet( certiPath.getAbsolutePath(), + "search/nodes-query?search-node-type=service-instance&filter=service-instance-id:EQUALS:" + + serviceInstanceId, false); + } else { + resp = doAaiGet( certiPath.getAbsolutePath(), + "search/nodes-query?search-node-type=service-instance&filter=service-instance-name:EQUALS:" + + serviceInstanceId, false); + } + return convertResponseToResponseEntity(resp); + } + + + /** + * Get services from a&ai. + * + * @param globalCustomerId the global customer id + * @param serviceSubscriptionId the service subscription id + * @return ResponseEntity The response entity + * @throws IOException Signals that an I/O exception has occurred. + * @throws InterruptedException the interrupted exception + */ + @RequestMapping(value="/aai_get_service_subscription/{global-customer-id}/{service-subscription-id}",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity doGetServices(@PathVariable("global-customer-id") String globalCustomerId, + @PathVariable("service-subscription-id") String serviceSubscriptionId) throws IOException, InterruptedException { + File certiPath = GetCertificatesPath(); + Response resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers/customer/" + globalCustomerId + + "/service-subscriptions/service-subscription/" + serviceSubscriptionId + "?depth=0", false); + return convertResponseToResponseEntity(resp); + } + + /** + * Obtain the subscriber list from a&ai. + * + * @param fullSet the full set + * @return ResponseEntity The response entity + * @throws IOException Signals that an I/O exception has occurred. + * @throws InterruptedException the interrupted exception + */ + @RequestMapping(value="/aai_get_subscribers",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity doGetSubscriberList(@DefaultValue("n") @QueryParam("fullSet") String fullSet) throws IOException, InterruptedException { + Response resp = getSubscribers(false); + return convertResponseToResponseEntity(resp); + } + + /** + * Obtain the Target Prov Status from the System.Properties file. + * + * @return ResponseEntity The response entity + * @throws IOException Signals that an I/O exception has occurred. + * @throws InterruptedException the interrupted exception + */ + @RequestMapping(value="/get_system_prop_vnf_prov_status",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getTargetProvStatus() throws IOException, InterruptedException { + String p = SystemProperties.getProperty("aai.vnf.provstatus"); + return new ResponseEntity(p, HttpStatus.OK); + } + + /** + * Obtain the full subscriber list from a&ai. + * + * @return ResponseEntity The response entity + * @throws IOException Signals that an I/O exception has occurred. + * @throws InterruptedException the interrupted exception + */ + @RequestMapping(value="/aai_get_full_subscribers",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getFullSubscriberList() throws IOException, InterruptedException { + Response resp = getSubscribers(true); + return convertResponseToResponseEntity(resp); + } + + + /** + * Refresh the subscriber list from a&ai. + * + * @return ResponseEntity The response entity + * @throws IOException Signals that an I/O exception has occurred. + */ + @RequestMapping(value="/aai_refresh_subscribers",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity doRefreshSubscriberList() throws IOException { + Response resp = getSubscribers(false); + return convertResponseToResponseEntity(resp); + } + + /** + * Refresh the full subscriber list from a&ai. + * + * @return ResponseEntity The response entity + * @throws IOException Signals that an I/O exception has occurred. + */ + @RequestMapping(value="/aai_refresh_full_subscribers",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity doRefreshFullSubscriberList() throws IOException { + Response resp = getSubscribers(false); + return convertResponseToResponseEntity(resp); + } + + /** + * Get subscriber details from a&ai. + * + * @param subscriberId the subscriber id + * @return ResponseEntity The response entity + */ + @RequestMapping(value="/aai_sub_details/{subscriberId}", method = RequestMethod.GET) + public ResponseEntity GetSubscriber(@PathVariable("subscriberId") String subscriberId) { + Response resp = getSubscriberDetails(subscriberId); + return convertResponseToResponseEntity(resp); + } + + /** + * Issue a named query to a&ai. + * + * @param namedQueryId the named query id + * @param globalCustomerId the global customer id + * @param serviceType the service type + * @param serviceInstance the service instance + * @return ResponseEntity The response entity + */ + @RequestMapping(value="/aai_sub_viewedit/{namedQueryId}/{globalCustomerId}/{serviceType}/{serviceInstance}", method = RequestMethod.GET) + public ResponseEntity viewEditGetComponentList( + @PathVariable("namedQueryId") String namedQueryId, + @PathVariable("globalCustomerId") String globalCustomerId, + @PathVariable("serviceType") String serviceType, + @PathVariable("serviceInstance") String serviceInstance) { + + String componentListPayload = getComponentListPutPayload(namedQueryId, globalCustomerId, serviceType, serviceInstance); + File certiPath = GetCertificatesPath(); + + Response resp = doAaiPost(certiPath.getAbsolutePath(), "search/named-query", componentListPayload, false); + return convertResponseToResponseEntity(resp); + } + + /** + * Issue a named query to a&ai. + * + * @param namedQueryId the named query id + * @param globalCustomerId the global customer id + * @param serviceType the service type + * @param serviceInstance the service instance + * @return ResponseEntity The response entity + */ + @RequestMapping(value="/aai_get_models_by_service_type/{namedQueryId}/{globalCustomerId}/{serviceType}", method = RequestMethod.GET) + public ResponseEntity viewEditGetComponentList( + @PathVariable("namedQueryId") String namedQueryId, + @PathVariable("globalCustomerId") String globalCustomerId, + @PathVariable("serviceType") String serviceType) { + + String componentListPayload = getModelsByServiceTypePayload(namedQueryId, globalCustomerId, serviceType); + File certiPath = GetCertificatesPath(); + + Response resp = doAaiPost(certiPath.getAbsolutePath(), "search/named-query", componentListPayload, false); + return convertResponseToResponseEntity(resp); + } + + /** + * Parses the for tenants. + * + * @param resp the resp + * @return the string + */ + private String parseForTenants(String resp) + { + String tenantList = ""; + + try + { + JSONParser jsonParser = new JSONParser(); + + JSONObject jsonObject = (JSONObject) jsonParser.parse(resp); + + return parseCustomerObjectForTenants(jsonObject); + } + catch (Exception ex) { + + } + + return tenantList; + } + + /** + * Parses the for tenants by service subscription. + * + * @param resp the resp + * @return the string + */ + private String parseForTenantsByServiceSubscription(String resp) + { + String tenantList = ""; + + try + { + JSONParser jsonParser = new JSONParser(); + + JSONObject jsonObject = (JSONObject) jsonParser.parse(resp); + + return parseServiceSubscriptionObjectForTenants(jsonObject); + } + catch (Exception ex) { + + } + + return tenantList; + } + + + // @RequestMapping(value="/aai_get_tenants/{global-customer-id}", method = RequestMethod.GET) + // public ResponseEntity viewEditGetComponentList( + // @PathVariable("global-customer-id") String globalCustomerId) { + // return new ResponseEntity(getTenants(globalCustomerId), HttpStatus.OK); + // } + + /** + * Obtain tenants for a given service type. + * + * @param globalCustomerId the global customer id + * @param serviceType the service type + * @return ResponseEntity The response entity + */ + @RequestMapping(value="/aai_get_tenants/{global-customer-id}/{service-type}", method = RequestMethod.GET) + public ResponseEntity viewEditGetTenantsFromServiceType( + @PathVariable("global-customer-id") String globalCustomerId, @PathVariable("service-type") String serviceType) { + return getTenantsFromServiceType(globalCustomerId, serviceType); + } + + private ResponseEntity convertResponseToResponseEntity(Response resp) { + ResponseEntity respEnt; + if (resp == null) { + respEnt = new ResponseEntity("Failed to fetch data from A&AI, check server logs for details.", HttpStatus.INTERNAL_SERVER_ERROR); + } else { + respEnt = new ResponseEntity((String)resp.readEntity(String.class), HttpStatus.valueOf(resp.getStatus())); + } + return respEnt; + } + + /** + * Gets the tenants. + * + * @param globalCustomerId the global customer id + * @return the tenants + */ + private ResponseEntity getTenants(String globalCustomerId) + { + File certiPath = GetCertificatesPath(); + Response resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers/customer/" + globalCustomerId, false); + + ResponseEntity respEnt; + if (resp.getStatus() >= 200 && resp.getStatus() <= 299) { + respEnt = new ResponseEntity(parseForTenants((String)resp.readEntity(String.class)), HttpStatus.OK); + } else { + respEnt = new ResponseEntity((String)resp.readEntity(String.class), HttpStatus.valueOf(resp.getStatus())); + } + return respEnt; + + } + + /** + * Gets the tenants from service type. + * + * @param globalCustomerId the global customer id + * @param serviceType the service type + * @return the tenants from service type + */ + private ResponseEntity getTenantsFromServiceType(String globalCustomerId, String serviceType) + { + File certiPath = GetCertificatesPath(); + String url = "business/customers/customer/" + globalCustomerId + "/service-subscriptions/service-subscription/" + serviceType; + + Response resp = doAaiGet(certiPath.getAbsolutePath(), url, false); + + ResponseEntity respEnt; + if (resp.getStatus() >= 200 && resp.getStatus() <= 299) { + respEnt = new ResponseEntity(parseForTenantsByServiceSubscription((String)resp.readEntity(String.class)), HttpStatus.OK); + } else { + respEnt = new ResponseEntity((String)resp.readEntity(String.class), HttpStatus.valueOf(resp.getStatus())); + } + return respEnt; + + } + + /** + * Gets the services. + * + * @return the services + */ + private Response getServices() + { + File certiPath = GetCertificatesPath(); + Response resp = doAaiGet(certiPath.getAbsolutePath(), "service-design-and-creation/services", false); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "getServices() resp=" + resp.getStatusInfo()); + + //model.put("aai_get_services", resp); + return resp; + } + + + /** + * Gets the subscribers. + * + * @param isFullSet the is full set + * @return the subscribers + */ + private Response getSubscribers(boolean isFullSet) + { + File certiPath = GetCertificatesPath(); + String depth = "0"; + + Response resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers?subscriber-type=INFRA&depth=" + depth, false); + if (resp != null) { + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "getSubscribers() resp=" + resp.getStatusInfo().toString()); + } + return resp; + } + + + + /** + * Gets the subscriber details. + * + * @param subscriberId the subscriber id + * @return the subscriber details + */ + private Response getSubscriberDetails(String subscriberId) + { + File certiPath = GetCertificatesPath(); + Response resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers/customer/" + subscriberId + "?depth=2", false); + //String resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers/customer/" + subscriberId, false); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "getSubscriberDetails() resp=" + resp.getStatusInfo().toString()); + return resp; + } + + /** + * Gets the certificates path. + * + * @return the file + */ + private File GetCertificatesPath() + { + if (servletContext != null) + return new File( servletContext.getRealPath("/WEB-INF/cert/") ); + return null; + } + + /** + * Send a GET request to a&ai. + * + * @param certiPath the certi path + * @param uri the uri + * @param xml the xml + * @return String The response + */ + protected Response doAaiGet(String certiPath, String uri, boolean xml) { + String methodName = "getSubscriberList"; + String transId = UUID.randomUUID().toString(); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + + Response resp = null; + try { + + AAIRestInterface restContrller = new AAIRestInterface(certiPath); + resp = restContrller.RestGet(fromAppId, transId, uri, xml); + + } catch (WebApplicationException e) { + final String message = ((BadRequestException) e).getResponse().readEntity(String.class); + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + message); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + message); + } catch (Exception e) { + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + } + + return resp; + } + + /** + * Send a POST request to a&ai. + * + * @param certiPath the certi path + * @param uri the uri + * @param payload the payload + * @param xml the xml + * @return String The response + */ + protected Response doAaiPost(String certiPath, String uri, String payload, boolean xml) { + String methodName = "getSubscriberList"; + String transId = UUID.randomUUID().toString(); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + + Response resp = null; + try { + + AAIRestInterface restContrller = new AAIRestInterface(certiPath); + resp = restContrller.RestPost(fromAppId, transId, uri, payload, xml); + + } catch (Exception e) { + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + } + + return resp; + } + + /** + * Gets the component list put payload. + * + * @param namedQueryId the named query id + * @param globalCustomerId the global customer id + * @param serviceType the service type + * @param serviceInstance the service instance + * @return the component list put payload + */ + private String getComponentListPutPayload(String namedQueryId, String globalCustomerId, String serviceType, String serviceInstance) { + return + " {" + + " \"instance-filters\": {" + + " \"instance-filter\": [" + + " {" + + " \"customer\": {" + + " \"global-customer-id\": \"" + globalCustomerId + "\"" + + " }," + + " \"service-instance\": {" + + " \"service-instance-id\": \"" + serviceInstance + "\"" + + " }," + + " \"service-subscription\": {" + + " \"service-type\": \"" + serviceType + "\"" + + " }" + + " }" + + " ]" + + " }," + + " \"query-parameters\": {" + + " \"named-query\": {" + + " \"named-query-uuid\": \"" + namedQueryId + "\"" + + " }" + + " }" + + "}"; + + } + private String getModelsByServiceTypePayload(String namedQueryId, String globalCustomerId, String serviceType) { + // TODO Auto-generated method stub + return " {" + + " \"instance-filters\": {" + + " \"instance-filter\": [" + + " {" + + " \"customer\": {" + + " \"global-customer-id\": \"" + globalCustomerId + "\"" + + " }," + + " \"service-subscription\": {" + + " \"service-type\": \"" + serviceType + "\"" + + " }" + + " }" + + " ]" + + " }," + + " \"query-parameters\": {" + + " \"named-query\": {" + + " \"named-query-uuid\": \"" + namedQueryId + "\"" + + " }" + + " }" + + "}"; + + } + + /** + * Return tenant details. + * + * @param jsonObject the json object + * @return String The parsing results + */ + public static String parseCustomerObjectForTenants(JSONObject jsonObject) { + + JSONArray tenantArray = new JSONArray(); + boolean bconvert = false; + + try { + + JSONObject serviceSubsObj = (JSONObject) jsonObject.get("service-subscriptions"); + + if (serviceSubsObj != null) + { + JSONArray srvcSubArray = (JSONArray) serviceSubsObj.get("service-subscription"); + + if (srvcSubArray != null) + { + Iterator i = srvcSubArray.iterator(); + + while (i.hasNext()) { + + JSONObject innerObj = (JSONObject) i.next(); + + if (innerObj == null) + continue; + + JSONObject relationShipListsObj = (JSONObject) innerObj.get("relationship-list"); + if (relationShipListsObj != null) + { + JSONArray rShipArray = (JSONArray) relationShipListsObj.get("relationship"); + if (rShipArray != null) + { + Iterator i1 = rShipArray.iterator(); + + while (i1.hasNext()) { + + JSONObject inner1Obj = (JSONObject) i1.next(); + + if (inner1Obj == null) + continue; + + String relatedTo = checkForNull((String)inner1Obj.get("related-to")); + if (relatedTo.equalsIgnoreCase("tenant")) + { + JSONObject tenantNewObj = new JSONObject(); + + String relatedLink = checkForNull((String) inner1Obj.get("related-link")); + tenantNewObj.put("link", relatedLink); + + JSONArray rDataArray = (JSONArray) inner1Obj.get("relationship-data"); + if (rDataArray != null) + { + Iterator i2 = rDataArray.iterator(); + + while (i2.hasNext()) { + JSONObject inner2Obj = (JSONObject) i2.next(); + + if (inner2Obj == null) + continue; + + String rShipKey = checkForNull((String)inner2Obj.get("relationship-key")); + String rShipVal = checkForNull((String)inner2Obj.get("relationship-value")); + if (rShipKey.equalsIgnoreCase("cloud-region.cloud-owner")) + { + tenantNewObj.put("cloudOwner", rShipVal); + } + else if (rShipKey.equalsIgnoreCase("cloud-region.cloud-region-id")) + { + tenantNewObj.put("cloudRegionID", rShipVal); + } + + if (rShipKey.equalsIgnoreCase("tenant.tenant-id")) + { + tenantNewObj.put("tenantID", rShipVal); + } + } + } + + JSONArray relatedTPropArray = (JSONArray) inner1Obj.get("related-to-property"); + if (relatedTPropArray != null) + { + Iterator i3 = relatedTPropArray.iterator(); + + while (i3.hasNext()) { + JSONObject inner3Obj = (JSONObject) i3.next(); + + if (inner3Obj == null) + continue; + + String propKey = checkForNull((String)inner3Obj.get("property-key")); + String propVal = checkForNull((String)inner3Obj.get("property-value")); + if (propKey.equalsIgnoreCase("tenant.tenant-name")) + { + tenantNewObj.put("tenantName", propVal); + } + } + } + bconvert = true; + tenantArray.add(tenantNewObj); + } + } + } + } + } + } + } + } catch (NullPointerException ex) { + + + } + + if (bconvert) + return tenantArray.toJSONString(); + else + return ""; + + } + + + /** + * Retrieve the service subscription from the jsonObject. + * + * @param jsonObject the json object + * @return String + */ + public static String parseServiceSubscriptionObjectForTenants(JSONObject jsonObject) { + + JSONArray tenantArray = new JSONArray(); + boolean bconvert = false; + + try { + JSONObject relationShipListsObj = (JSONObject) jsonObject.get("relationship-list"); + if (relationShipListsObj != null) + { + JSONArray rShipArray = (JSONArray) relationShipListsObj.get("relationship"); + if (rShipArray != null) + { + Iterator i1 = rShipArray.iterator(); + + while (i1.hasNext()) { + + JSONObject inner1Obj = (JSONObject) i1.next(); + + if (inner1Obj == null) + continue; + + String relatedTo = checkForNull((String)inner1Obj.get("related-to")); + if (relatedTo.equalsIgnoreCase("tenant")) + { + JSONObject tenantNewObj = new JSONObject(); + + String relatedLink = checkForNull((String) inner1Obj.get("related-link")); + tenantNewObj.put("link", relatedLink); + + JSONArray rDataArray = (JSONArray) inner1Obj.get("relationship-data"); + if (rDataArray != null) + { + Iterator i2 = rDataArray.iterator(); + + while (i2.hasNext()) { + JSONObject inner2Obj = (JSONObject) i2.next(); + + if (inner2Obj == null) + continue; + + String rShipKey = checkForNull((String)inner2Obj.get("relationship-key")); + String rShipVal = checkForNull((String)inner2Obj.get("relationship-value")); + if (rShipKey.equalsIgnoreCase("cloud-region.cloud-owner")) + { + tenantNewObj.put("cloudOwner", rShipVal); + } + else if (rShipKey.equalsIgnoreCase("cloud-region.cloud-region-id")) + { + tenantNewObj.put("cloudRegionID", rShipVal); + } + + if (rShipKey.equalsIgnoreCase("tenant.tenant-id")) + { + tenantNewObj.put("tenantID", rShipVal); + } + } + } + + JSONArray relatedTPropArray = (JSONArray) inner1Obj.get("related-to-property"); + if (relatedTPropArray != null) + { + Iterator i3 = relatedTPropArray.iterator(); + + while (i3.hasNext()) { + JSONObject inner3Obj = (JSONObject) i3.next(); + + if (inner3Obj == null) + continue; + + String propKey = checkForNull((String)inner3Obj.get("property-key")); + String propVal = checkForNull((String)inner3Obj.get("property-value")); + if (propKey.equalsIgnoreCase("tenant.tenant-name")) + { + tenantNewObj.put("tenantName", propVal); + } + } + } + bconvert = true; + tenantArray.add(tenantNewObj); + } + } + + } + } + } catch (NullPointerException ex) { + + + } + + if (bconvert) + return tenantArray.toJSONString(); + else + return ""; + + } + + /** + * Check for null. + * + * @param local the local + * @return the string + */ + private static String checkForNull(String local) + { + if (local != null) + return local; + else + return ""; + + } +} + diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/BrowseServiceTypesController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/BrowseServiceTypesController.java new file mode 100755 index 00000000..0698cfd9 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/BrowseServiceTypesController.java @@ -0,0 +1,87 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.controller; + + + +import java.text.DateFormat; +import java.text.SimpleDateFormat; + + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; + + +/** + * The Class BrowseServiceTypesController. + */ +@RestController +public class BrowseServiceTypesController extends RestrictedBaseController{ + + /** The view name. */ + String viewName; + + /** The logger. */ + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(BrowseServiceTypesController.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + /** The servlet context. */ + private @Autowired ServletContext servletContext; + + /** + * Welcome. + * + * @param request the request + * @return the model and view + */ + @RequestMapping(value = {"/browseservicetypes" }, method = RequestMethod.GET) + public ModelAndView welcome(HttpServletRequest request) { + + return new ModelAndView(getViewName()); + } + + /* (non-Javadoc) + * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#getViewName() + */ + public String getViewName() { + return viewName; + } + + /* (non-Javadoc) + * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#setViewName(java.lang.String) + */ + public void setViewName(String viewName) { + this.viewName = viewName; + } + + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/HealthCheckController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/HealthCheckController.java new file mode 100755 index 00000000..abef8d62 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/HealthCheckController.java @@ -0,0 +1,196 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.controller; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import org.openecomp.portalsdk.core.controller.UnRestrictedBaseController; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; +import org.openecomp.vid.dao.FnAppDoaImpl; + +/** + * Controller for user profile view. The view is restricted to authenticated + * users. The view name resolves to page user_profile.jsp which uses Angular. + */ + +@RestController +@RequestMapping("/") +public class HealthCheckController extends UnRestrictedBaseController { + + + /** The logger. */ + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(HealthCheckController.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + private static final String HEALTH_CHECK_PATH = "/healthCheck"; + + /** + * Model for JSON response with health-check results. + */ + public class HealthStatus { + // Either 200 or 500 + public int statusCode; + + // Additional detail in case of error, empty in case of success. + public String message; + + public String date; + + public HealthStatus(int code, String msg) { + this.statusCode = code; + this.message = msg; + } + + public HealthStatus(int code,String date, String msg) { + this.statusCode = code; + this.message = msg; + this.date=date; + } + + public int getStatusCode() { + return statusCode; + } + + public void setStatusCode(int code) { + this.statusCode = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String msg) { + this.message = msg; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + } + + @SuppressWarnings("unchecked") + public int getProfileCount(String driver, String URL, String username, String password) { + FnAppDoaImpl doa= new FnAppDoaImpl(); + int count= doa.getProfileCount(driver,URL,username,password); + return count; + } + + + + /** + * Obtain the HealthCheck Status from the System.Properties file. + * Used by IDNS for redundancy + * @return ResponseEntity The response entity + * @throws IOException Signals that an I/O exception has occurred. + * @throws InterruptedException the interrupted exception + */ + @RequestMapping(value="/healthCheck",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public HealthStatus gethealthCheckStatusforIDNS() throws IOException, InterruptedException { + + String driver = SystemProperties.getProperty("db.driver"); + String URL = SystemProperties.getProperty("db.connectionURL"); + String username = SystemProperties.getProperty("db.userName"); + String password = SystemProperties.getProperty("db.password"); + + logger.debug(EELFLoggerDelegate.debugLogger, "driver ::" + driver); + logger.debug(EELFLoggerDelegate.debugLogger, "URL::" + URL); + logger.debug(EELFLoggerDelegate.debugLogger, "username::" + username); + logger.debug(EELFLoggerDelegate.debugLogger,"password::" + password); + + + HealthStatus healthStatus = null; + try { + logger.debug(EELFLoggerDelegate.debugLogger, "Performing health check"); + int count=getProfileCount(driver,URL,username,password); + logger.debug(EELFLoggerDelegate.debugLogger,"count:::"+count); + healthStatus = new HealthStatus(200, "health check succeeded"); + } catch (Exception ex) { + + logger.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex); + healthStatus = new HealthStatus(500, "health check failed: " + ex.toString()); + } + return healthStatus; + } + + /** + * Obtain the HealthCheck Status from the System.Properties file. + * + * @return ResponseEntity The response entity + * @throws IOException Signals that an I/O exception has occurred. + * @throws InterruptedException the interrupted exception + * Project : + */ + @RequestMapping(value="rest/healthCheck/{User-Agent}/{X-ECOMP-RequestID}",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public HealthStatus getHealthCheck( + @PathVariable("User-Agent") String UserAgent, + @PathVariable("X-ECOMP-RequestID") String ECOMPRequestID) throws IOException, InterruptedException { + + String driver = SystemProperties.getProperty("db.driver"); + String URL = SystemProperties.getProperty("db.connectionURL"); + String username = SystemProperties.getProperty("db.userName"); + String password = SystemProperties.getProperty("db.password"); + + logger.debug(EELFLoggerDelegate.debugLogger, "driver ::" + driver); + logger.debug(EELFLoggerDelegate.debugLogger, "URL::" + URL); + logger.debug(EELFLoggerDelegate.debugLogger, "username::" + username); + logger.debug(EELFLoggerDelegate.debugLogger,"password::" + password); + + + HealthStatus healthStatus = null; + try { + logger.debug(EELFLoggerDelegate.debugLogger, "Performing health check"); + logger.debug(EELFLoggerDelegate.debugLogger, "User-Agent" + UserAgent); + logger.debug(EELFLoggerDelegate.debugLogger, "X-ECOMP-RequestID" + ECOMPRequestID); + + + int count=getProfileCount(driver,URL,username,password); + + logger.debug(EELFLoggerDelegate.debugLogger,"count:::"+count); + healthStatus = new HealthStatus(200,dateFormat.format(new Date()) ,"health check succeeded"); + } catch (Exception ex) { + + logger.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex); + healthStatus = new HealthStatus(500,dateFormat.format(new Date()),"health check failed: " + ex.toString()); + } + return healthStatus; + } +} + diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/MsoController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/MsoController.java new file mode 100755 index 00000000..f051ed38 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/MsoController.java @@ -0,0 +1,761 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.controller; + + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +//import java.util.UUID; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Scanner; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.codehaus.jackson.JsonEncoding; +import org.codehaus.jackson.JsonFactory; +import org.codehaus.jackson.JsonGenerator; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonToken; +import org.glassfish.jersey.client.ClientResponse; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.openecomp.vid.domain.mso.CloudConfiguration; +import org.openecomp.vid.domain.mso.ModelInfo; +import org.openecomp.vid.domain.mso.ModelInfo.ModelType; +import org.openecomp.vid.domain.mso.RequestInfo; +import org.openecomp.vid.domain.mso.RequestParameters; +import org.openecomp.vid.model.ExceptionResponse; +import org.openecomp.vid.mso.MsoProperties; +import org.openecomp.vid.mso.MsoResponseWrapper; +import org.openecomp.vid.mso.MsoRestInterfaceFactory; +import org.openecomp.vid.mso.MsoRestInterfaceIfc; +import org.openecomp.vid.mso.MsoUtil; +import org.openecomp.vid.mso.RestObject; +import org.openecomp.vid.mso.rest.RelatedModel; +import org.openecomp.vid.mso.rest.RequestDetails; +import org.springframework.http.HttpStatus; +//import org.springframework.http.ResponseEntity; +//import org.springframework.http.RequestEntity; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; +import com.fasterxml.jackson.databind.DeserializationFeature; + +/** + * The Class MsoController. + */ +@RestController +@RequestMapping("mso") +public class MsoController extends RestrictedBaseController{ + + /** The view name. */ + String viewName; + + /** The logger. */ + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MsoController.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + /** The Constant SVC_INSTANCE_ID. */ + public final static String SVC_INSTANCE_ID = ""; + + /** The Constant VNF_INSTANCE_ID. */ + public final static String VNF_INSTANCE_ID = ""; + + /** + * Welcome. + * + * @param request the request + * @return the model and view + + public ModelAndView welcome(HttpServletRequest request) { + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== MsoController welcome start"); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + " MSO_SERVER_URL=" + + SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) ); + return new ModelAndView(getViewName()); + } + */ + + /* (non-Javadoc) + * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#getViewName() + + public String getViewName() { + return viewName; + } + */ + + /* (non-Javadoc) + * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#setViewName(java.lang.String) + + public void setViewName(String viewName) { + this.viewName = viewName; + } + */ + + /** + * Creates the svc instance. + * + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_create_svc_instance", method = RequestMethod.POST) + public ResponseEntity createSvcInstance(HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception { + String methodName = "createSvcInstance"; + + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start" ); + +// mso_request = retrieveRequestObject (request, mso_request); + + String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE); + + MsoResponseWrapper w = createInstance(mso_request, p); + // always return OK, the MSO status code is embedded in the body + + return ( new ResponseEntity(w.getResponse(), HttpStatus.OK) ); + + } + + /** + * Creates the vnf. + * + * @param serviceInstanceId the service instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + @RequestMapping(value="/mso_create_vnf_instance/{serviceInstanceId}", method = RequestMethod.POST) + public ResponseEntity createVnf(@PathVariable("serviceInstanceId") String serviceInstanceId, HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception { + + String methodName = "createVnf"; + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + + //RequestDetails mso_request = retrieveRequestObject (request); + String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VNF_INSTANCE); + + if ( p == null || p.isEmpty()) { + throw new Exception ( "Vnf instance path is not defined"); + } + // /serviceInstances/v2//vnfs + String vnf_path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId ); + MsoResponseWrapper w = createInstance(mso_request, vnf_path); + + // always return OK, the MSO status code is embedded in the body + + return ( new ResponseEntity(w.getResponse(), HttpStatus.OK) ); + + } + + /** + * Creates the nw instance. + * + * @param serviceInstanceId the service instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_create_nw_instance/{serviceInstanceId}", method = RequestMethod.POST) + public ResponseEntity createNwInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception { + + String methodName = "createNwInstance"; + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start, serviceInstanceId = " + serviceInstanceId ); + + //RequestDetails mso_request = retrieveRequestObject (request); + + String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_NETWORK_INSTANCE); + + if ( p == null || p.isEmpty()) { + throw new Exception ( "Network instance path is not defined"); + } + // /serviceInstances/v2//networks/ + + String nw_path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId ); + MsoResponseWrapper w = createInstance(mso_request, nw_path); + + // always return OK, the MSO status code is embedded in the body + + return ( new ResponseEntity(w.getResponse(), HttpStatus.OK) ); + + } + + /** + * Creates the volume group instance. + * + * @param serviceInstanceId the service instance id + * @param vnfInstanceId the vnf instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_create_volumegroup_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}", method = RequestMethod.POST) + public ResponseEntity createVolumeGroupInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, @PathVariable("vnfInstanceId") String vnfInstanceId, + HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception { + String methodName = "createVolumeGroupInstance"; + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + + //RequestDetails mso_request = retrieveRequestObject (request); + String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE); + + if ( p == null || p.isEmpty()) { + throw new Exception ( "Volume group instance path is not defined"); + } + String path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId); + path = path.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId); + + MsoResponseWrapper w = createInstance(mso_request, path); + + // always return OK, the MSO status code is embedded in the body + return ( new ResponseEntity(w.getResponse(), HttpStatus.OK) ); + } + + /** + * Creates the vf module instance. + * + * @param serviceInstanceId the service instance id + * @param vnfInstanceId the vnf instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_create_vfmodule_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}", method = RequestMethod.POST) + public ResponseEntity createVfModuleInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, + @PathVariable("vnfInstanceId") String vnfInstanceId, HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception { + String methodName = "createVfModuleInstance"; + + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + //RequestDetails mso_request = retrieveRequestObject (request); + String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE); + + if ( p == null || p.isEmpty()) { + throw new Exception ( "VF module instance path is not defined"); + } + // /serviceInstances/v2//vnfs//vfmodules + String path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId); + path = path.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId); + + MsoResponseWrapper w = createInstance(mso_request, path); + + // always return OK, the MSO status code is embedded in the body + + return ( new ResponseEntity(w.getResponse(), HttpStatus.OK) ); + } + + /** + * Creates the instance. + * + * @param request the request + * @param path the path + * @return the mso response wrapper + * @throws ClientHandlerException the client handler exception + * @throws Exception the exception + */ + protected MsoResponseWrapper createInstance(RequestDetails request, String path) throws Exception { + String methodName = "createInstance"; + logger.debug(dateFormat.format(new Date()) + "<== " + methodName + " start"); + + try { + MsoRestInterfaceIfc restController = MsoRestInterfaceFactory.getInstance(); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " calling Post, request = (" + request + ")"); + + RestObject restObjStr = new RestObject(); + String str = new String(); + restObjStr.set(str); + restController.Post(str, request, "", path, restObjStr ); + MsoResponseWrapper w = MsoUtil.wrapResponse (restObjStr); + + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse()); + return w; + } catch (Exception e) { + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + throw e; + } + } + + /** + * Delete svc instance. + * + * @param serviceInstanceId the service instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_delete_svc_instance/{serviceInstanceId}", method = RequestMethod.POST) + public ResponseEntity deleteSvcInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, + HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception { + + String methodName = "deleteSvcInstance"; + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + + //RequestDetails mso_request = retrieveRequestObject (request); + String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE); + String path = p + "/" + serviceInstanceId; + MsoResponseWrapper w = deleteInstance ( mso_request, path ); + + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse()); + // always return OK, the MSO status code is embedded in the body + + return ( new ResponseEntity(w.getResponse(), HttpStatus.OK) ); + + } + + /** + * Delete vnf. + * + * @param serviceInstanceId the service instance id + * @param vnfInstanceId the vnf instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_delete_vnf_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}", method = RequestMethod.POST) + + public ResponseEntity deleteVnf(@PathVariable("serviceInstanceId") String serviceInstanceId, @PathVariable("vnfInstanceId") String vnfInstanceId, + HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception { + String methodName = "deleteVnf"; + + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + + //RequestDetails mso_request = retrieveRequestObject (request); + String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VNF_INSTANCE); + if ( p == null || p.isEmpty()) { + throw new Exception ( "Vnf instance path is not defined"); + } + // /serviceInstances/v2//vnfs/ + String vnf_path = p.replaceFirst(SVC_INSTANCE_ID, vnfInstanceId ); + MsoResponseWrapper w = deleteInstance ( mso_request, vnf_path + "/" + vnfInstanceId ); + + // always return OK, the MSO status code is embedded in the body + return ( new ResponseEntity(w.getResponse(), HttpStatus.OK) ); + + } + + /** + * Delete vf module. + * + * @param serviceInstanceId the service instance id + * @param vnfInstanceId the vnf instance id + * @param vfModuleId the vf module id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + //mso_delete_vf_module/bc305d54-75b4-431b-adb2-eb6b9e546014/vnfs/fe9000-0009-9999/vfmodules/abeeee-abeeee-abeeee + @RequestMapping(value = "/mso_delete_vfmodule_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfModuleId}", method = RequestMethod.POST) + public ResponseEntity deleteVfModule ( + @PathVariable("serviceInstanceId") String serviceInstanceId, @PathVariable("vnfInstanceId") String vnfInstanceId, + @PathVariable("vfModuleId") String vfModuleId, HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception { + + String methodName = "deleteVfModule"; + + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + + //RequestDetails mso_request = new RequestDetails(); + //mso_request = retrieveRequestObject (request); + String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE); + if ( p == null || p.isEmpty()) { + throw new Exception ( "VF Module instance path is not defined"); + } + // /serviceInstances/v2//vnfs//vfmodules + String path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId ); + path = path.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId ); + MsoResponseWrapper w = deleteInstance ( mso_request, path + "/" + vfModuleId); + + // always return OK, the MSO status code is embedded in the body + return ( new ResponseEntity(w.getResponse(), HttpStatus.OK) ); + + } + + /** + * Delete volume group instance. + * + * @param serviceInstanceId the service instance id + * @param vnfInstanceId the vnf instance id + * @param volumeGroupId the volume group id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_delete_volumegroup_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupId}", method = RequestMethod.POST) + public ResponseEntity deleteVolumeGroupInstance ( + @PathVariable("serviceInstanceId") String serviceInstanceId, @PathVariable("vnfInstanceId") String vnfInstanceId, @PathVariable("volumeGroupId") String volumeGroupId, + HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception { + + String methodName = "deleteVolumeGroupInstance"; + + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + //RequestDetails mso_request = retrieveRequestObject (request); + + String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE); + if ( p == null || p.isEmpty()) { + throw new Exception ( "Volume group instance path is not defined"); + } + // /serviceInstances/v2/{serviceInstanceId}/volumeGroups + String path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId ); + path = path.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId ); + MsoResponseWrapper w = deleteInstance ( mso_request, path + "/" + volumeGroupId); + + // always return OK, the MSO status code is embedded in the body + return ( new ResponseEntity(w.getResponse(), HttpStatus.OK) ); + } + + /** + * Delete nw instance. + * + * @param serviceInstanceId the service instance id + * @param networkInstanceId the network instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_delete_nw_instance/{serviceInstanceId}/networks/{networkInstanceId}", method = RequestMethod.POST) + public ResponseEntity deleteNwInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, + @PathVariable("networkInstanceId") String networkInstanceId, HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception { + + String methodName = "deleteNwInstance"; + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + + //RequestDetails mso_request = retrieveRequestObject (request); + + String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_NETWORK_INSTANCE); + if ( p == null || p.isEmpty()) { + throw new Exception ( "Network instance path is not defined"); + } + // /serviceInstances/v2//networks + String path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId ); + MsoResponseWrapper w = deleteInstance ( mso_request, path + "/" + networkInstanceId); + + // always return OK, the MSO status code is embedded in the body + return ( new ResponseEntity(w.getResponse(), HttpStatus.OK) ); + + } + + /** + * Delete instance. + * + * @param request the request + * @param path the path + * @return the mso response wrapper + * @throws Exception the exception + */ + protected MsoResponseWrapper deleteInstance(RequestDetails request, String path) throws Exception { + String methodName = "deleteInstance"; + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + + try { + MsoRestInterfaceIfc restController = MsoRestInterfaceFactory.getInstance(); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " calling Delete, path =[" + path + "]"); + + RestObject restObjStr = new RestObject(); + String str = new String(); + restObjStr.set(str); + restController.Delete(str, request, "", path, restObjStr ); + MsoResponseWrapper w = MsoUtil.wrapResponse (restObjStr); + + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse()); + return w; + + } catch (Exception e) { + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + throw e; + } + + } + + /** + * Gets the orchestration request. + * + * @param requestId the request id + * @param request the request + * @return the orchestration request + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_get_orch_req/{requestId}", method = RequestMethod.GET) + public ResponseEntity getOrchestrationRequest(@PathVariable("requestId") String requestId, + HttpServletRequest request) throws Exception { + + String methodName = "getOrchestrationRequest"; + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + MsoResponseWrapper w = null; + try { + MsoRestInterfaceIfc restController = MsoRestInterfaceFactory.getInstance(); + String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQ); + String path = p + "/" + requestId; + + RestObject restObjStr = new RestObject(); + String str = new String(); + restObjStr.set(str); + + restController.Get(str, "", path, restObjStr); + + w = MsoUtil.wrapResponse (restObjStr); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse()); + // always return OK, the MSO status code is embedded in the body + + } catch (Exception e) { + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + throw e; + } + // always return OK, the MSO status code is embedded in the body + return ( new ResponseEntity(w.getResponse(), HttpStatus.OK) ); + } + + + /** + * Gets the orchestration requests. + * + * @param filterString the filter string + * @param request the request + * @return the orchestration requests + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_get_orch_reqs/{filterString}", method = RequestMethod.GET) + public ResponseEntity getOrchestrationRequests(@PathVariable("filterString") String filterString, + HttpServletRequest request) throws Exception { + + String methodName = "getOrchestrationRequests"; + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + MsoResponseWrapper w = null; + try { + MsoRestInterfaceIfc restController = MsoRestInterfaceFactory.getInstance(); + String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS); + String path = p + filterString; + + RestObject restObjStr = new RestObject(); + String str = new String(); + restObjStr.set(str); + + restController.Get(str, "", path, restObjStr); + + w = MsoUtil.wrapResponse (restObjStr); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse()); + } catch (Exception e) { + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + throw e; + } + // always return OK, the MSO status code is embedded in the body + return ( new ResponseEntity(w.getResponse(), HttpStatus.OK) ); + } + + /** + * Gets the orchestration requests for svc instance. + * + * @param svc_instance_id the svc instance id + * @return the orchestration requests for svc instance + * @throws Exception the exception + */ + public MsoResponseWrapper getOrchestrationRequestsForSvcInstance (String svc_instance_id) throws Exception { + + String methodName = "getOrchestrationRequestsForSvcInstance"; + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + MsoResponseWrapper w = null; + + try { + MsoRestInterfaceIfc restController = MsoRestInterfaceFactory.getInstance(); + String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS); + String path = p + svc_instance_id; + + RestObject restObjStr = new RestObject(); + String str = new String(); + restObjStr.set(str); + + restController.Get(str, "", path, restObjStr); + w = MsoUtil.wrapResponse (restObjStr); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse()); + + } catch (Exception e) { + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + throw e; + } + return w; + } + + /** + * Exception handler. + * + * @param e the e + * @param response the response + * @throws IOException Signals that an I/O exception has occurred. + */ + @ExceptionHandler(Exception.class) + private void exceptionHandler(Exception e, HttpServletResponse response) throws IOException { + + /* + * The following "logger.error" lines "should" be sufficient for logging the exception. + * However, the console output in my Eclipse environment is NOT showing ANY of the + * logger statements in this class. Thus the temporary "e.printStackTrace" statement + * is also included. + */ + + String methodName = "exceptionHandler"; + logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw)); + logger.error(EELFLoggerDelegate.errorLogger, sw.toString()); + + /* + * Temporary - IF the above mentioned "logger.error" glitch is resolved ... + * this statement could be removed since it would then likely result in duplicate + * trace output. + */ + e.printStackTrace(System.err); + + response.setContentType("application/json; charset=UTF-8"); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + + ExceptionResponse exceptionResponse = new ExceptionResponse(); + exceptionResponse.setException(e.getClass().toString().replaceFirst("^.*\\.", "")); + exceptionResponse.setMessage(e.getMessage()); + + response.getWriter().write(new ObjectMapper().writeValueAsString(exceptionResponse)); + + response.flushBuffer(); + + } + + /** + * Parses the orchestration requests for svc instance. + * + * @param resp the resp + * @return the list + * @throws ParseException the parse exception + * @throws Exception the exception + */ + @SuppressWarnings("unchecked") + public List parseOrchestrationRequestsForSvcInstance ( ClientResponse resp ) throws org.json.simple.parser.ParseException, Exception { + + String methodName = "parseOrchestrationRequestsForSvcInstance"; + + ArrayList json_list = new ArrayList(); + + String rlist_str = resp.readEntity (String.class); + logger.debug (EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + " Response string: " + rlist_str); + + JSONParser parser = new JSONParser(); + try { + Object obj = parser.parse(rlist_str); + + JSONObject jsonObject = (JSONObject) obj; + + JSONArray requestList = (JSONArray) jsonObject.get("requestList"); + + if ( requestList != null && ! (requestList.isEmpty()) ) + for ( Object container : requestList) { + + JSONObject containerJsonObj = (JSONObject) container; + //logger.debug(dateFormat.format(new Date()) + "<== " + "." + methodName + " reqJsonObj: " + containerJsonObj.toJSONString()); + JSONObject reqJsonObj = (JSONObject) containerJsonObj.get("request"); + + //logger.debug(dateFormat.format(new Date()) + "<== " + "." + methodName + " reqJsonObj.requestId: " + + // reqJsonObj.get("requestId") ); + JSONObject result = new JSONObject(); + + result.put("requestId", reqJsonObj.get ("requestId")); + if ( reqJsonObj.get("requestType") != null ) { + result.put("requestType", (reqJsonObj.get("requestType").toString())); + } + JSONObject req_status = (JSONObject)reqJsonObj.get("requestStatus"); + if ( req_status != null ) { + result.put("timestamp", (req_status.get("timestamp"))); + result.put("requestState", (req_status.get("requestState"))); + result.put("statusMessage", (req_status.get("statusMessage"))); + result.put("percentProgress", (req_status.get("percentProgress"))); + } + json_list.add (result); + } + } catch (org.json.simple.parser.ParseException pe) { + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + " Parse exception: " + pe.toString()); + throw pe; + } catch (Exception e) { + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + " Exception: " + e.toString()); + throw e; + } + return ( json_list ); + } + + /** + * Retrieve request object. + * + * @param request the request + * @return the request details + * @throws Exception the exception + */ + public RequestDetails retrieveRequestObject ( HttpServletRequest request, @RequestBody RequestDetails mso_request ) throws Exception { + + String methodName = "retrieveRequestObject"; + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start" ); + + ObjectMapper mapper = new ObjectMapper(); + //JSON from String to Object + //RequestDetails mso_request; + + try { + //mso_request = new RequestDetails(); + //mso_request = mapper.readValue(request.getInputStream(), RequestDetails.class); + } + catch ( Exception e ) { + logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + methodName + " Unable to read json object RequestDetails e=" + e.getMessage()); + throw e; + } + if ( mso_request == null) { + logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + methodName + " mso_request is null"); + throw new Exception ("RequestDetails is missing"); + } + try { + String json_req = mapper.writeValueAsString(mso_request); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " request=[" + json_req + "]"); + } + catch ( Exception e ) { + logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + methodName + " Unable to convert RequestDetails to json string e=" + e.getMessage()); + throw e; + } + return (mso_request); + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/PropertyController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/PropertyController.java new file mode 100755 index 00000000..90080769 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/PropertyController.java @@ -0,0 +1,122 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.controller; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; + +/** + * The Class PropertyController. + */ +@RestController +public class PropertyController extends RestrictedBaseController{ + + /** The view name. */ + String viewName; + + /** The logger. */ + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(PropertyController.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + /** + * Welcome. + * + * @param request the request + * @return the model and view + */ + @RequestMapping(value = {"/propertyhome" }, method = RequestMethod.GET) + public ModelAndView welcome(HttpServletRequest request) { + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== PropertyController welcome start"); + return new ModelAndView(getViewName()); + } + + /* (non-Javadoc) + * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#getViewName() + */ + public String getViewName() { + return viewName; + } + + /* (non-Javadoc) + * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#setViewName(java.lang.String) + */ + public void setViewName(String _viewName) { + this.viewName = _viewName; + } + + /** + * Gets the property. + * + * @param name the name + * @param defaultvalue the defaultvalue + * @param request the request + * @return the property + * @throws Exception the exception + */ + @RequestMapping(value = "/get_property/{name}/{defaultvalue}", method = RequestMethod.GET) + public ResponseEntity getProperty (@PathVariable("name") String name, @PathVariable("defaultvalue") String defaultvalue, + HttpServletRequest request) throws Exception { + + String methodName = "getProperty"; + ResponseEntity resp = null; + String pvalue = null; + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + + try { + // convert "_" to "." in the property name + if (name == null || name.length() == 0 ) { + return ( new ResponseEntity (defaultvalue, HttpStatus.OK)); + } + // convert "_" to "." in the property name + String propertyName = name.replace('_', '.'); + pvalue = SystemProperties.getProperty(propertyName); + if ( ( pvalue == null ) || ( pvalue.length() == 0 ) ) { + pvalue = defaultvalue; + } + resp = new ResponseEntity(pvalue, HttpStatus.OK); + } + catch (Exception e) { + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + throw e; + } + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " returning " + pvalue); + return ( resp ); + } + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/VidController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/VidController.java new file mode 100755 index 00000000..e22448ae --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/VidController.java @@ -0,0 +1,351 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.controller; + +import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; + +import javax.net.ssl.SSLContext; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.Client; + +import org.json.JSONObject; +import org.json.JSONTokener; +import org.openecomp.vid.exceptions.VidServiceUnavailableException; +import org.openecomp.vid.model.ModelConstants; +import org.openecomp.vid.model.Network; +import org.openecomp.vid.model.ServiceModel; +import org.openecomp.vid.model.VNF; +import org.openecomp.vid.model.VfModule; +import org.openecomp.vid.model.VolumeGroup; +//import org.openecomp.vid.model.Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.vid.asdc.AsdcCatalogException; +import org.openecomp.vid.asdc.AsdcClient; +import org.openecomp.vid.asdc.beans.Resource; +import org.openecomp.vid.asdc.beans.Service; +import org.openecomp.vid.asdc.beans.tosca.Group; +import org.openecomp.vid.asdc.beans.tosca.NodeTemplate; +import org.openecomp.vid.asdc.beans.tosca.ToscaCsar; +import org.openecomp.vid.asdc.beans.tosca.ToscaModel; +import org.openecomp.vid.asdc.memory.InMemoryAsdcClient; +import org.openecomp.vid.asdc.rest.RestfulAsdcClient; +import org.openecomp.vid.properties.AsdcClientConfiguration; +import org.openecomp.vid.properties.AsdcClientConfiguration.AsdcClientType; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.openecomp.vid.properties.VidProperties; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; + +/** + * The Class VidController. + */ +@RestController +public class VidController extends RestrictedBaseController { + + /** The Constant LOG. */ + private static final EELFLoggerDelegate LOG = EELFLoggerDelegate.getLogger(VidController.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + /** The app context. */ + @Autowired + private ApplicationContext appContext; + + /** + * Gets the object mapper. + * + * @return the object mapper + */ + @Bean + public ObjectMapper getObjectMapper() { + return new ObjectMapper(); + } + + /** + * Gets the asdc client. + * + * @return the asdc client + */ + @Bean + public AsdcClient getAsdcClient() { + + final AsdcClientConfiguration asdcClientConfig = appContext.getBean(AsdcClientConfiguration.class); + + switch (asdcClientConfig.getAsdcClientType()) { + case IN_MEMORY: + final InputStream asdcCatalogFile = VidController.class.getClassLoader().getResourceAsStream("catalog.json"); + final JSONTokener tokener = new JSONTokener(asdcCatalogFile); + final JSONObject catalog = new JSONObject(tokener); + + return new InMemoryAsdcClient.Builder().catalog(catalog).build(); + case REST: + + final String protocol = asdcClientConfig.getAsdcClientProtocol(); + final String host = asdcClientConfig.getAsdcClientHost(); + final int port = asdcClientConfig.getAsdcClientPort(); + final String auth = asdcClientConfig.getAsdcClientAuth(); + Client cl = null; + if ( protocol.equalsIgnoreCase("https") ) { + try { + SSLContext ctx = SSLContext.getInstance("TLSv1.2"); + ctx.init(null, null, null); + cl = ClientBuilder.newBuilder().sslContext(ctx).build(); + } + catch ( NoSuchAlgorithmException n ) { + throw new RuntimeException("SDC Client could not be instantiated due to unsupported protocol TLSv1.2", n); + } + catch ( KeyManagementException k ) { + throw new RuntimeException("SDC Client could not be instantiated due to a key management exception", k); + } + } + else { + cl = ClientBuilder.newBuilder().build(); + } + + try { + final URI uri = new URI(protocol + "://" + host + ":" + port + "/"); + return new RestfulAsdcClient.Builder(cl, uri) + .auth(auth) + .build(); + } catch (URISyntaxException e) { + throw new RuntimeException("SDC Client could not be instantiated due to a syntax error in the URI", e); + } + + default: + throw new RuntimeException(asdcClientConfig.getAsdcClientType() + " is invalid; must be one of " + Arrays.toString(AsdcClientType.values())); + } + } + + /** + * Gets the services. + * + * @param request the request + * @return the services + * @throws VidServiceUnavailableException the vid service unavailable exception + */ + @RequestMapping(value={"/rest/models/services"}, method = RequestMethod.GET) + public Collection getServices(HttpServletRequest request) throws VidServiceUnavailableException { + try { + return getAsdcClient().getServices(request.getParameterMap()); + } catch (AsdcCatalogException e) { + LOG.error("Failed to retrieve service definitions from SDC", e); + throw new VidServiceUnavailableException("Failed to retrieve service definitions from SDC", e); + } catch (Throwable t) { + LOG.debug("Unexpected error while retrieving service definitions from SDC: " + t.getMessage() + ":", t); + t.printStackTrace(); + throw new VidServiceUnavailableException("Unexpected error while retrieving service definitions from SDC: " + t.getMessage(), t); + } + } + + /** + * Gets the services. + * + * @param uuid the uuid + * @return the services + * @throws VidServiceUnavailableException the vid service unavailable exception + */ + @RequestMapping(value={"/rest/models/services/{uuid}"}, method = RequestMethod.GET) + public ServiceModel getServices(@PathVariable("uuid") String uuid) throws VidServiceUnavailableException { + String methodName = "getServices"; + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " start"); + boolean isNewFlow = false; + + String asdcModelNamespace = VidProperties.getAsdcModelNamespace(); + + String vnfTag = asdcModelNamespace + ModelConstants.VNF; + String networkTag = asdcModelNamespace + ModelConstants.NETWORK; + String vfModuleTag = asdcModelNamespace + ModelConstants.VF_MODULE; + + try { + final ServiceModel serviceModel = new ServiceModel(); + final Map vnfs = new HashMap (); + final Map networks = new HashMap (); + + final ToscaCsar serviceCsar = getAsdcClient().getServiceToscaModel(UUID.fromString(uuid)); + final Service asdcServiceMetadata = getAsdcClient().getService(UUID.fromString(uuid)); + final ToscaModel asdcServiceToscaModel = serviceCsar.getParent(); + + serviceModel.setService(ServiceModel.extractService(asdcServiceToscaModel, asdcServiceMetadata)); + + for (Entry component: asdcServiceToscaModel.gettopology_template().getnode_templates().entrySet()) { + final String modelCustomizationName = component.getKey(); + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " model customization name: " + modelCustomizationName); + final NodeTemplate nodeTemplate = component.getValue(); + final String type = nodeTemplate.getType(); + + if (type.startsWith(vnfTag)) { + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " found node template type: " + type); + + final UUID vnfUuid = UUID.fromString(nodeTemplate.getMetadata().getUUID()); + final VNF vnf = new VNF(); + vnf.extractVnf(modelCustomizationName, nodeTemplate); + + if (vnf.getVersion() == null) { + // vnf version should always be populated. The call below may not return the correct metadata since + // uuid is not unique + final Resource vnfMetadata = getAsdcClient().getResource(UUID.fromString(nodeTemplate.getMetadata().getUUID())); + vnf.setVersion(vnfMetadata.getVersion()); + } + + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " VNF commands: " + vnf.getCommands()); + vnfs.put(modelCustomizationName, vnf); + if ( (vnf.getCustomizationUuid() != null) && (vnf.getCustomizationUuid().length() > 0 ) ) { + isNewFlow = true; + } + } + // Networks + if (type.startsWith(networkTag)) { + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " found node template type: " + type); + final UUID networkUuid = UUID.fromString(nodeTemplate.getMetadata().getUUID()); + final Network network = new Network(); + network.extractNetwork(modelCustomizationName, nodeTemplate); + + if (network.getVersion() == null) { + // network version should always be populated. The call below may not return the correct metadata since + // uuid is not unique + final Resource networkMetadata = getAsdcClient().getResource(UUID.fromString(nodeTemplate.getMetadata().getUUID())); + network.setVersion(networkMetadata.getVersion()); + } + if ( (network.getCustomizationUuid() != null) && (network.getCustomizationUuid().length() > 0 ) ) { + isNewFlow = true; + } + networks.put(modelCustomizationName, network); + + } + } + serviceModel.setVnfs(vnfs); + serviceModel.setNetworks(networks); + // If we see customization uuid under vnf or network, follow 1702 flow + if ( isNewFlow ) { + return ( getCustomizedServices(asdcServiceToscaModel, serviceModel) ); + } + VNF vnf = null; + for (ToscaModel vnfModel : serviceCsar.getChildren()) { + + // using uuid to match should only be valid for 1610 models + + final String vnfUuid = (vnfModel.getMetadata().getUUID()); + // find the VNF with that uuid, uuid is not the key anymore + for ( Entry vnfComp : vnfs.entrySet() ) { + if ( ( ( vnfComp.getValue().getUuid() ).equalsIgnoreCase(vnfUuid) ) ) { + // found the vnf + vnf = vnfComp.getValue(); + } + } + final Map vfModules = new HashMap (); + final Map volumeGroups = new HashMap (); + + if (vnf == null) { + LOG.warn("Couldn't find VNF object " + vnfUuid + ". Problem with Tosca model?"); + continue; + } + + vnf.setInputs(vnfModel.gettopology_template().getInputs()); + + for (Entry component1 : vnfModel.gettopology_template().getGroups().entrySet()) { + final Group group = component1.getValue(); + final String type = group.getType(); + final String modelCustomizationName = component1.getKey(); + + // VF Module Customization UUID: We may have the complete set of all VF Modules for all VNFs under service and VF Modules under each VNF. + // Keep using the VF Modules under VNFs but we need to get the customization uuid from the service level and put them + // under each VF module at the VNF level + + if (type.startsWith(vfModuleTag)) { + + VfModule vfMod = VfModule.extractVfModule(modelCustomizationName, group); + + // Add the vf module customization uuid from the service model + // The key of the VF Module in the service level will be the VF instance name appended to the VF Module name: + // .. + /* String normalizedVnfCustomizationName = VNF.normalizeName (vnf.getModelCustomizationName()); + org.openecomp.vid.model.Service.extractVfModuleCustomizationUUID (serviceModel.getService(), normalizedVnfCustomizationName, vfMod);*/ + + vfModules.put(modelCustomizationName, vfMod); + + if ( vfMod.isVolumeGroupAllowed() ) { + volumeGroups.put(modelCustomizationName, VolumeGroup.extractVolumeGroup(modelCustomizationName, group)); + } + + } + } + + vnf.setVfModules(vfModules); + vnf.setVolumeGroups(volumeGroups); + } + + serviceModel.setVnfs(vnfs); + serviceModel.setNetworks(networks); + + return serviceModel; + } catch (AsdcCatalogException e) { + LOG.error("Failed to retrieve service definitions from SDC", e); + throw new VidServiceUnavailableException("Failed to retrieve service definitions from SDC", e); + } + } + + public ServiceModel getCustomizedServices(ToscaModel asdcServiceToscaModel, ServiceModel serviceModel) { + String methodName = "asdcServiceToscaModel"; + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " start"); + + // asdcServiceToscaModel should have vf modules and vol groups populated at this point but + // they are not associated with the VNFs + serviceModel.extractGroups(asdcServiceToscaModel); + // Now put the vf modules and volume groups under the VNF they belong too + serviceModel.associateGroups(); + return (serviceModel); + } + + /** + * Gets the services view. + * + * @param request the request + * @return the services view + * @throws VidServiceUnavailableException the vid service unavailable exception + */ + @RequestMapping(value={"/serviceModels"}, method=RequestMethod.GET) + public ModelAndView getServicesView(HttpServletRequest request) throws VidServiceUnavailableException { + return new ModelAndView("serviceModels"); + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/VidHomeController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/VidHomeController.java new file mode 100755 index 00000000..cfb915b0 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/VidHomeController.java @@ -0,0 +1,79 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.controller; + + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; + + +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; + + +/** + * The Class VidHomeController. + */ +@RestController +public class VidHomeController extends RestrictedBaseController{ + + /** The view name. */ + String viewName; + + + /** The servlet context. */ + private @Autowired ServletContext servletContext; + + /** + * Welcome. + * + * @param request the request + * @return the model and view + */ + @RequestMapping(value = {"/vidhome" }, method = RequestMethod.GET) + public ModelAndView welcome(HttpServletRequest request) { + + return new ModelAndView(getViewName()); + } + + /* (non-Javadoc) + * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#getViewName() + */ + public String getViewName() { + return viewName; + } + + /* (non-Javadoc) + * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#setViewName(java.lang.String) + */ + public void setViewName(String viewName) { + this.viewName = viewName; + } + + + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/ViewEditSubController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/ViewEditSubController.java new file mode 100755 index 00000000..e23b99ba --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/ViewEditSubController.java @@ -0,0 +1,107 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.controller; + + +import java.io.File; +import java.text.DateFormat; +import java.util.HashMap; +import java.util.Map; + + + + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; + + +/** + * The Class ViewEditSubController. + */ +@RestController +public class ViewEditSubController extends RestrictedBaseController{ + + /** The view name. */ + String viewName; + + /** The logger. */ + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ViewEditSubController.class); + + /** The model. */ + private Map model = new HashMap(); + + /** The servlet context. */ + private @Autowired ServletContext servletContext; + + /** + * Welcome. + * + * @param request the request + * @return the model and view + */ + @RequestMapping(value = {"/vieweditsub" }, method = RequestMethod.GET) + public ModelAndView welcome(HttpServletRequest request) { + return new ModelAndView("vieweditsub","model", model); + // return new ModelAndView(getViewName()); + } + + /** + * Post subscriber. + * + * @param request the request + */ + @RequestMapping(value="/vieweditsub/subedit", method = RequestMethod.POST) + public void PostSubscriber(HttpServletRequest request) { + + String subID = request.getParameter("subscriberID"); + model.put("subInfo", subID); + + } + + /* (non-Javadoc) + * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#getViewName() + */ + public String getViewName() { + return viewName; + } + + /* (non-Javadoc) + * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#setViewName(java.lang.String) + */ + public void setViewName(String viewName) { + this.viewName = viewName; + } + + + + +} + diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/ViewLogController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/ViewLogController.java new file mode 100755 index 00000000..31e64983 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/ViewLogController.java @@ -0,0 +1,84 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.controller; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; + + +/** + * The Class ViewLogController. + */ +@RestController +public class ViewLogController extends RestrictedBaseController{ + + /** The view name. */ + String viewName; + + /** The logger. */ + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ViewLogController.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + /** The servlet context. */ + private @Autowired ServletContext servletContext; + + /** + * Welcome. + * + * @param request the request + * @return the model and view + */ + @RequestMapping(value = {"/viewlog" }, method = RequestMethod.GET) + public ModelAndView welcome(HttpServletRequest request) { + + return new ModelAndView(getViewName()); + } + + /* (non-Javadoc) + * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#getViewName() + */ + public String getViewName() { + return viewName; + } + + /* (non-Javadoc) + * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#setViewName(java.lang.String) + */ + public void setViewName(String viewName) { + this.viewName = viewName; + } + + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestAaiController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestAaiController.java new file mode 100755 index 00000000..79017410 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestAaiController.java @@ -0,0 +1,93 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.controller.test; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.codehaus.jackson.map.ObjectMapper; +import org.openecomp.vid.model.ExceptionResponse; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; + +/** + * The Class TestAaiController. + */ +@RestController +@RequestMapping("testaai") +public class TestAaiController extends RestrictedBaseController { + + /** + * Gets the subscription service type list. + * + * @param globalCustomerId the global customer id + * @param request the request + * @return the subscription service type list + * @throws Exception the exception + */ + @RequestMapping(value = "/getSubscriptionServiceTypeList/{globalCustomerId}", method = RequestMethod.GET) + public String getSubscriptionServiceTypeList(@PathVariable("globalCustomerId") String globalCustomerId, HttpServletRequest request) + throws Exception { + + System.err.println("GET SUBSCRIPTION SERVICE TYPE LIST: globalCustomerId: " + globalCustomerId); + + return "[\"vMOG\", \"sevice type 2\", \"sevice type 3\", \"sevice type 4\"]"; + } + + /** + * Exception. + * + * @param e the e + * @param response the response + * @throws IOException Signals that an I/O exception has occurred. + */ + @ExceptionHandler(Exception.class) + private void exception(Exception e, HttpServletResponse response) throws IOException { + + /* + * This logging step should preferably be replaced with an appropriate + * logging method consistent whatever logging mechanism the rest of the + * application code uses. + */ + + e.printStackTrace(System.err); + + response.setContentType("application/json; charset=UTF-8"); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + + ExceptionResponse exceptionResponse = new ExceptionResponse(); + exceptionResponse.setException(e.getClass().toString().replaceFirst("^.*\\.", "")); + exceptionResponse.setMessage(e.getMessage()); + + response.getWriter().write(new ObjectMapper().writeValueAsString(exceptionResponse)); + + response.flushBuffer(); + + } + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestAsdcController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestAsdcController.java new file mode 100755 index 00000000..84a56b3b --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestAsdcController.java @@ -0,0 +1,112 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.controller.test; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.codehaus.jackson.map.ObjectMapper; +import org.openecomp.vid.model.ExceptionResponse; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; + +/** + * The Class TestAsdcController. + */ +@RestController +@RequestMapping("testasdc") +public class TestAsdcController extends RestrictedBaseController { + + /** + * Gets the model. + * + * @param modelId the model id + * @param request the request + * @return the model + * @throws Exception the exception + */ + @RequestMapping(value = "/getModel/{modelId}", method = RequestMethod.GET) + public String getModel(@PathVariable("modelId") String modelId, HttpServletRequest request) throws Exception { + + System.err.println("SDC: GET MODEL: modelId: " + modelId); + + // @formatter:off + return + "{" + + "\"uuid\": \"5be686dc-fdca-4d54-8548-5d0ed23e962b\"," + + "\"invariantUUID\": \"e5962da9-fe4f-433a-bc99-b43e0d88a9a1\"," + + "\"name\": \"DE220127\"," + + "\"version\": \"0.1\"," + + "\"inputs\": {" + + "\"defaultGateway\": {" + + "\"type\": \"String\"," + + "\"default\": \"192.168.1.1\"," + + "\"description\": \"Router default gateway - use any valid IPv4 address\"" + + "}," + + "\"subnetMask\": {" + + "\"type\": \"String\"," + + "\"default\": \"255.255.255.0\"," + + "\"description\": \"Router subnet mask - example (255.255.255.0)\"" + + "}" + + "}" + + "}"; + // @formatter:on + } + + /** + * Exception. + * + * @param e the e + * @param response the response + * @throws IOException Signals that an I/O exception has occurred. + */ + @ExceptionHandler(Exception.class) + private void exception(Exception e, HttpServletResponse response) throws IOException { + + /* + * This logging step should preferably be replaced with an appropriate + * logging method consistent whatever logging mechanism the rest of the + * application code uses. + */ + + e.printStackTrace(System.err); + + response.setContentType("application/json; charset=UTF-8"); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + + ExceptionResponse exceptionResponse = new ExceptionResponse(); + exceptionResponse.setException(e.getClass().toString().replaceFirst("^.*\\.", "")); + exceptionResponse.setMessage(e.getMessage()); + + response.getWriter().write(new ObjectMapper().writeValueAsString(exceptionResponse)); + + response.flushBuffer(); + + } + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestMsoController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestMsoController.java new file mode 100755 index 00000000..02c29f67 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestMsoController.java @@ -0,0 +1,729 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.controller.test; + +import java.io.IOException; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.codehaus.jackson.map.ObjectMapper; +import org.openecomp.vid.model.ExceptionResponse; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; + +/* + * The "TestMsoController" class is primarily designed to help test "msoCommitController.js" + * + * This class expects and receives JSON data in the same format as expected + * in the "real" application version of this code. However, string versions of JSON are + * maintained internally here instead of marshalled / unmarshalled JSON objects. + * The primary reasons for this were to encapsulate all the test code in this single file and + * minimize the time required to support initial test cases. + * + * The non-test equivalent of this controller could alternatively incorporate POJO objects + * instead of strings. However, the same data format sent to / received from the browser + * JavaScript code would still be expected. + * + * Two specific mechanisms used in this test class may be useful to the application version: + * + * 1) The use of "{variable}" elements in @RequestMappings along with the corresponding + * @PathVariable declarations. + * + * 2) The use of @ExceptionHandler for general purpose exception handler. + * (See @ExceptionHandler comments) + * + * This class is intended to be used in either: + * + * A) Eclipse environments + * OR + * B) Linux environments with ONLY a single user running tests. + * The "quick and dirty" error simulation approach used here makes use of static states for some + * scenarios. Thus multiple users simultaneously testing in Linux environments + * may have contention issues. + */ + +/** + * The Class TestMsoController. + */ +@RestController +@RequestMapping("testmso") +public class TestMsoController extends RestrictedBaseController { + + /* + * Artificial delay (in milliseconds) added before responding to create / + * delete requests + */ + + /** The Constant TEST_DELAY_SHORT_MSEC. */ + private final static int TEST_DELAY_SHORT_MSEC = 1000; + + /* + * Long delay to simulate non-responsive server test + */ + + /** The Constant TEST_DELAY_LONG_MSEC. */ + private final static int TEST_DELAY_LONG_MSEC = 15000; + + /* + * Default number of polls expected before transaction complete. + */ + + /** The Constant MAXIMUM_POLLS_DEFAULT. */ + private final static int MAXIMUM_POLLS_DEFAULT = 4; + + /* + * Number of polls to simulate "maximum polls exceeded" test. + */ + + /** The Constant MAXIMUM_POLLS_LARGE. */ + private final static int MAXIMUM_POLLS_LARGE = 10; + + /* + * Simulated error types. The GUI front end is expected to set these values + * in the "modelName" field of the "mso_create_svc_instance" request. + */ + + /** The Constant ERROR_POLICY_EXCEPTION. */ + private final static String ERROR_POLICY_EXCEPTION = "ERROR_POLICY_EXCEPTION"; + + /** The Constant ERROR_SERVICE_EXCEPTION. */ + private final static String ERROR_SERVICE_EXCEPTION = "ERROR_SERVICE_EXCEPTION"; + + /** The Constant ERROR_POLL_FAILURE. */ + private final static String ERROR_POLL_FAILURE = "ERROR_POLL_FAILURE"; + + /** The Constant ERROR_INVALID_FIELD_INITIAL. */ + private final static String ERROR_INVALID_FIELD_INITIAL = "ERROR_INVALID_FIELD_INITIAL"; + + /** The Constant ERROR_INVALID_FIELD_POLL. */ + private final static String ERROR_INVALID_FIELD_POLL = "ERROR_INVALID_FIELD_POLL"; + + /** The Constant ERROR_GENERAL_SERVER_EXCEPTION. */ + private final static String ERROR_GENERAL_SERVER_EXCEPTION = "ERROR_GENERAL_SERVER_EXCEPTION"; + + /** The Constant ERROR_MAX_POLLS. */ + private final static String ERROR_MAX_POLLS = "ERROR_MAX_POLLS"; + + /** The Constant ERROR_SERVER_TIMEOUT_INITIAL. */ + private final static String ERROR_SERVER_TIMEOUT_INITIAL = "ERROR_SERVER_TIMEOUT_INITIAL"; + + /** The Constant ERROR_SERVER_TIMEOUT_POLL. */ + private final static String ERROR_SERVER_TIMEOUT_POLL = "ERROR_SERVER_TIMEOUT_POLL"; + + /** The simulated error. */ + private String simulatedError = ""; + + /** The maximum polls. */ + private int maximumPolls = 0; + + /** The attempt count. */ + private int attemptCount = 0; + + /** + * Creates the svc instance. + * + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_create_svc_instance", method = RequestMethod.POST) + public ResponseEntity createSvcInstance(HttpServletRequest request) throws Exception { + readAndLogRequest("CREATE SERVICE INSTANCE", request); + Thread.sleep(TEST_DELAY_SHORT_MSEC); + maximumPolls = MAXIMUM_POLLS_DEFAULT; // Simulates MSO polling behavior + attemptCount = 0; + + /* + * This block of code simulates various errors and would NOT be expected + * in a non-test method + */ + System.err.println("simulatedError: " + simulatedError); + + if (simulatedError.equals(ERROR_POLICY_EXCEPTION)) { + return new ResponseEntity(policyExceptionResponse, HttpStatus.OK); + } + if (simulatedError.equals(ERROR_SERVICE_EXCEPTION)) { + return new ResponseEntity(serviceExceptionResponse, HttpStatus.OK); + } + if (simulatedError.equals(ERROR_INVALID_FIELD_INITIAL)) { + /* + * Force invalid response field name. Return + * "XXXXXrequestReferences" instead of "requestReferences" + */ + return new ResponseEntity(acceptResponse.replace("requestReferences", "XXXXXrequestReferences"), + HttpStatus.OK); + } + + if (simulatedError.equals(ERROR_GENERAL_SERVER_EXCEPTION)) { + throw new IOException("an example of an IO exception"); + } + + if (simulatedError.equals(ERROR_SERVER_TIMEOUT_INITIAL)) { + Thread.sleep(TEST_DELAY_LONG_MSEC); + } + + if (simulatedError.equals(ERROR_MAX_POLLS)) { + maximumPolls = MAXIMUM_POLLS_LARGE; + } + + /* + * End of block of simulated error code. + */ + + return new ResponseEntity(acceptResponse, HttpStatus.OK); + } + + /** + * Delete svc instance. + * + * @param serviceInstanceId the service instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_delete_svc_instance/{serviceInstanceId}", method = RequestMethod.POST) + public ResponseEntity deleteSvcInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, + HttpServletRequest request) throws Exception { + readAndLogRequest("DELETE SERVICE INSTANCE: serviceInstanceId: " + serviceInstanceId, request); + Thread.sleep(TEST_DELAY_SHORT_MSEC); + maximumPolls = MAXIMUM_POLLS_DEFAULT; // Simulates MSO polling behavior + attemptCount = 0; + return new ResponseEntity(acceptResponse, HttpStatus.OK); + } + + /** + * Creates the vnf instance. + * + * @param serviceInstanceId the service instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_create_vnf_instance/{serviceInstanceId}", method = RequestMethod.POST) + public ResponseEntity createVnfInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, + HttpServletRequest request) throws Exception { + readAndLogRequest("CREATE VNF INSTANCE: serviceInstanceId: " + serviceInstanceId, request); + Thread.sleep(TEST_DELAY_SHORT_MSEC); + maximumPolls = MAXIMUM_POLLS_DEFAULT; // Simulates MSO polling behavior + attemptCount = 0; + return new ResponseEntity(acceptResponse, HttpStatus.OK); + } + + /** + * Delete vnf instance. + * + * @param serviceInstanceId the service instance id + * @param vnfInstanceId the vnf instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_delete_vnf_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}", method = RequestMethod.POST) + public ResponseEntity deleteVnfInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, + @PathVariable("vnfInstanceId") String vnfInstanceId, HttpServletRequest request) throws Exception { + readAndLogRequest( + "DELETE VNF INSTANCE: serviceInstanceId: " + serviceInstanceId + " vnfInstanceId: " + vnfInstanceId, + request); + Thread.sleep(TEST_DELAY_SHORT_MSEC); + maximumPolls = MAXIMUM_POLLS_DEFAULT; // Simulates MSO polling behavior + attemptCount = 0; + return new ResponseEntity(acceptResponse, HttpStatus.OK); + } + + /** + * Creates the vf module instance. + * + * @param serviceInstanceId the service instance id + * @param vnfInstanceId the vnf instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + // /serviceInstances/v2/ff305d54-75b4-431b-adb2-eb6b9e5ff000/vnfs/ff305d54-75b4-ff1b-adb2-eb6b9e5460ff/vfModules + @RequestMapping(value = "/mso_create_vfmodule_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}", method = RequestMethod.POST) + public ResponseEntity createVfModuleInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, + @PathVariable("vnfInstanceId") String vnfInstanceId, HttpServletRequest request) throws Exception { + readAndLogRequest("CREATE VF MODULE INSTANCE: serviceInstanceId: " + serviceInstanceId + " vnfInstanceId: " + + vnfInstanceId, request); + Thread.sleep(TEST_DELAY_SHORT_MSEC); + maximumPolls = MAXIMUM_POLLS_DEFAULT; // Simulates MSO polling behavior + attemptCount = 0; + return new ResponseEntity(acceptResponse, HttpStatus.OK); + } + + /** + * Delete vf module instance. + * + * @param serviceInstanceId the service instance id + * @param vnfInstanceId the vnf instance id + * @param vfModuleInstanceId the vf module instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + // /serviceInstances/v2/ff305d54-75b4-431b-adb2-eb6b9e5ff000/vnfs/ff305d54-75b4-ff1b-adb2-eb6b9e5460ff/vfModules/ff305d54-75b4-ff1b-bdb2-eb6b9e5460ff + @RequestMapping(value = "/mso_delete_vfmodule_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfModuleInstanceId}", method = RequestMethod.POST) + public ResponseEntity deleteVfModuleInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, + @PathVariable("vnfInstanceId") String vnfInstanceId, + @PathVariable("vfModuleInstanceId") String vfModuleInstanceId, HttpServletRequest request) + throws Exception { + readAndLogRequest("DELETE VF MODULE INSTANCE: serviceInstanceId: " + serviceInstanceId + " vnfInstanceId: " + + vnfInstanceId + " vfModuleInstanceId: " + vfModuleInstanceId, request); + Thread.sleep(TEST_DELAY_SHORT_MSEC); + maximumPolls = MAXIMUM_POLLS_DEFAULT; // Simulates MSO polling behavior + attemptCount = 0; + return new ResponseEntity(acceptResponse, HttpStatus.OK); + } + + // POST + /** + * Creates the volume group instance. + * + * @param serviceInstanceId the service instance id + * @param vnfInstanceId the vnf instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + // /serviceInstances/v2/ff305d54-75b4-431b-adb2-eb6b9e5ff000/volumeGroups + @RequestMapping(value = "/mso_create_volumegroup_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}", method = RequestMethod.POST) + public ResponseEntity createVolumeGroupInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, + @PathVariable("vnfInstanceId") String vnfInstanceId, HttpServletRequest request) throws Exception { + readAndLogRequest("CREATE VOLUME GROUP INSTANCE: seviceInstanceId: " + serviceInstanceId + " vnfInstanceId: " + + vnfInstanceId, request); + Thread.sleep(TEST_DELAY_SHORT_MSEC); + maximumPolls = MAXIMUM_POLLS_DEFAULT; // Simulates MSO polling behavior + attemptCount = 0; + return new ResponseEntity(acceptResponse, HttpStatus.OK); + } + + /** + * Delete volume group instance. + * + * @param serviceInstanceId the service instance id + * @param vnfInstanceId the vnf instance id + * @param volumeGroupInstanceId the volume group instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + // /serviceInstances/v2/ff305d54-75b4-431b-adb2-eb6b9e5ff000/volumeGroups/ff305d54-75b4-ff1b-cdb2-eb6b9e5460ff + @RequestMapping(value = "/mso_delete_volumegroup_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}", method = RequestMethod.POST) + public ResponseEntity deleteVolumeGroupInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, + @PathVariable("vnfInstanceId") String vnfInstanceId, + @PathVariable("volumeGroupInstanceId") String volumeGroupInstanceId, HttpServletRequest request) + throws Exception { + readAndLogRequest("DELETE NW INSTANCE: serviceInstanceId: " + serviceInstanceId + " vnfInstanceId: " + + vnfInstanceId + " volumeGroupInstanceId: " + volumeGroupInstanceId, request); + Thread.sleep(TEST_DELAY_SHORT_MSEC); + maximumPolls = MAXIMUM_POLLS_DEFAULT; // Simulates MSO polling behavior + attemptCount = 0; + return new ResponseEntity(acceptResponse, HttpStatus.OK); + } + + /** + * Creates the nw instance. + * + * @param serviceInstanceId the service instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_create_nw_instance/{serviceInstanceId}", method = RequestMethod.POST) + public ResponseEntity createNwInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, + HttpServletRequest request) throws Exception { + readAndLogRequest("CREATE NW INSTANCE: serviceInstanceId: " + serviceInstanceId, request); + Thread.sleep(TEST_DELAY_SHORT_MSEC); + maximumPolls = MAXIMUM_POLLS_DEFAULT; // Simulates MSO polling behavior + attemptCount = 0; + return new ResponseEntity(acceptResponse, HttpStatus.OK); + } + + /** + * Delete nw instance. + * + * @param serviceInstanceId the service instance id + * @param networkInstanceId the network instance id + * @param request the request + * @return the response entity + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_delete_nw_instance/{serviceInstanceId}/networks/{networkInstanceId}", method = RequestMethod.POST) + public ResponseEntity deleteNwInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, + @PathVariable("networkInstanceId") String networkInstanceId, HttpServletRequest request) throws Exception { + readAndLogRequest("DELETE NW INSTANCE: serviceInstanceId: " + serviceInstanceId + " networkInstanceId: " + + networkInstanceId, request); + Thread.sleep(TEST_DELAY_SHORT_MSEC); + maximumPolls = MAXIMUM_POLLS_DEFAULT; // Simulates MSO polling behavior + attemptCount = 0; + return new ResponseEntity(acceptResponse, HttpStatus.OK); + } + + /** + * Gets the orchestration request. + * + * @param requestId the request id + * @param request the request + * @return the orchestration request + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_get_orch_req/{requestId}", method = RequestMethod.GET) + public ResponseEntity getOrchestrationRequest(@PathVariable("requestId") String requestId, + HttpServletRequest request) throws Exception { + + System.err.println("GET ORCHESTRATION REQUEST: requestId: " + requestId); + + /* + * This block of code simulates various errors and would NOT be expected + * in a non-test method + */ + + if (simulatedError.equals(ERROR_INVALID_FIELD_POLL)) { + /* + * Force invalid response field name. Return "XXXXXrequestStatus" + * instead of "requestStatus" + */ + return new ResponseEntity(inProgressResponse.replace("requestStatus", "XXXXXrequestStatus"), + HttpStatus.OK); + } + + if (simulatedError.equals(ERROR_POLL_FAILURE)) { + /* + * Force status field with "Failure" + */ + return new ResponseEntity(inProgressResponse.replace("InProgress", "Failure"), HttpStatus.OK); + } + + if (simulatedError.equals(ERROR_SERVER_TIMEOUT_POLL)) { + Thread.sleep(TEST_DELAY_LONG_MSEC); + } + + /* + * End of block of simulated error code. + */ + + /* + * This logic simulates how MSO might behave ... i.e. return different + * results depending on the value of 'maximumPolls'. + * + */ + int percentProgress = (++attemptCount * 100) / maximumPolls; + + System.err.println("attempts: " + attemptCount + " max: " + maximumPolls + " percent: " + percentProgress); + + String response = inProgressResponse.replace("\"50\"", "\"" + Integer.toString(percentProgress) + "\""); + + if (attemptCount < maximumPolls) { + if (attemptCount > 1) { + response = response.replace("vLan setup", "setup step " + Integer.toString(attemptCount)); + } + return new ResponseEntity(response, HttpStatus.OK); + } else { + return new ResponseEntity( + response.replace("InProgress", "Complete").replace("vLan setup complete", ""), HttpStatus.OK); + } + } + + /** + * Gets the orchestration requests. + * + * @param filterString the filter string + * @param request the request + * @return the orchestration requests + * @throws Exception the exception + */ + @RequestMapping(value = "/mso_get_orch_reqs/{filterString}", method = RequestMethod.GET) + public ResponseEntity getOrchestrationRequests(@PathVariable("filterString") String filterString, + HttpServletRequest request) throws Exception { + + System.err.println("GET ORCHESTRATION REQUESTS: filterString: " + filterString); + + return new ResponseEntity(getOrchestrationRequestsResponse, HttpStatus.OK); + + } + + /* + * General purpose exception handler that could be used in application code. + * + * The method returns exceptions as error code 500. Both the exception type + * and message are written as a JSON object. + * + * See the following references: + * + * 1) The ExceptionResponse POJO. + * + * 2) The "getHttpErrorMessage" function in "utilityService.js" - an example + * of how the browser JavaScript code can interpret this response. + */ + + /** + * Exception. + * + * @param e the e + * @param response the response + * @throws IOException Signals that an I/O exception has occurred. + */ + @ExceptionHandler(Exception.class) + private void exception(Exception e, HttpServletResponse response) throws IOException { + + /* + * This logging step should preferably be replaced with an appropriate + * logging method consistent whatever logging mechanism the rest of the + * application code uses. + */ + + e.printStackTrace(System.err); + + response.setContentType("application/json; charset=UTF-8"); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + + ExceptionResponse exceptionResponse = new ExceptionResponse(); + exceptionResponse.setException(e.getClass().toString().replaceFirst("^.*\\.", "")); + exceptionResponse.setMessage(e.getMessage()); + + response.getWriter().write(new ObjectMapper().writeValueAsString(exceptionResponse)); + + response.flushBuffer(); + + } + + /* + * 'readAndLogRequest' only intended to be used for testing. + * + * The method reads JSON from the input stream and thus prevents other + * mechanisms from reading the input. + */ + + /** + * Read and log request. + * + * @param label the label + * @param request the request + * @throws Exception the exception + */ + private void readAndLogRequest(String label, HttpServletRequest request) throws Exception { + String input = request.getReader().lines().collect(Collectors.joining(System.lineSeparator())); + + ObjectMapper mapper = new ObjectMapper(); + Object json = mapper.readValue(input, Object.class); + + System.err.println(label + "\n" + mapper.writerWithDefaultPrettyPrinter().writeValueAsString(json)); + + /* + * Only needed for error simulation ... + */ + if (input.matches("^.*modelName.*$")) { + simulatedError = input.replaceAll("^.*\"modelName\":\"", "").replaceAll("\".*$", ""); + } + } + + /* + * Various test responses: + */ + + // @formatter:off + + /** The accept response. */ + /* + * Sample responses to initial create / delete transaction + */ + private String acceptResponse = + "{" + + " \"status\": 202," + + " \"entity\": {" + + " \"requestReferences\": {" + + " \"instanceId\": \"bc305d54-75b4-431b-adb2-eb6b9e546014\"," + + " \"requestId\": \"rq1234d1-5a33-55df-13ab-12abad84e331\"" + + " }" + + " }" + + "}"; + + /** The policy exception response. */ + private String policyExceptionResponse = + "{" + + " \"status\": 400," + + " \"entity\": { " + + " \"requestError\": {" + + " \"policyException\": {" + + " \"messageId\": \"POL9003\"," + + " \"text\": \"Message content size exceeds the allowable limit\"" + + " }" + + " }" + + " }" + + "}"; + + /** The service exception response. */ + private String serviceExceptionResponse = + "{" + + " \"status\": 400," + + " \"entity\": { " + + " \"requestError\": {" + + " \"serviceException\": {" + + " \"messageId\": \"SVC2000\"," + + " \"text\": \"Missing Parameter: %1. Error code is %2\"," + + " \"variables\": [" + + " \"severity\"," + + " \"400\"" + + " ]" + + " }" + + " }" + + " }" + + "}" + + ""; + + /** The in progress response. */ + /* + * Sample response to subsequent getOrchestrationRequest + */ + private String inProgressResponse = + "{" + + " \"status\": 200," + + " \"entity\": {" + + " \"request\": {" + + " \"requestId\": \"rq1234d1-5a33-55df-13ab-12abad84e333\"," + + " \"startTime\": \"Thu, 04 Jun 2009 02:51:59 GMT\"," + + " \"instanceIds\": {" + + " \"serviceInstanceId\": \"bc305d54-75b4-431b-adb2-eb6b9e546014\"" + + " }," + + " \"requestScope\": \"service\"," + + " \"requestType\": \"createInstance\"," + + " \"requestDetails\": {" + + " \"modelInfo\": {" + + " \"modelType\": \"service\"," + + " \"modelId\": \"sn5256d1-5a33-55df-13ab-12abad84e764\"," + + " \"modelNameVersionId\": \"ab6478e4-ea33-3346-ac12-ab121484a333\"," + + " \"modelName\": \"WanBonding\"," + + " \"modelVersion\": \"1\"" + + " }," + + " \"subscriberInfo\": {" + + " \"globalSubscriberId\": \"C12345\"," + + " \"subscriberName\": \"General Electric Division 12\"" + + " }," + + " \"requestParameters\": {" + + " \"vpnId\": \"1a2b3c4d5e6f\"," + + " \"productName\": \"Trinity\"," + + " \"customerId\": \"icore9883749\"" + + " }" + + " }," + + " \"requestStatus\": {" + + " \"timestamp\": \"Thu, 04 Jun 2009 02:53:39 GMT\"," + + " \"requestState\": \"InProgress\"," + + " \"statusMessage\": \"vLan setup complete\"," + + " \"percentProgress\": \"50\"" + + " }" + + " }" + + " }" + + "}"; + + /* + * Sample response to subsequent getOrchestrationRequests + */ + + /** The get orchestration requests response. */ + private String getOrchestrationRequestsResponse = + "{" + + " \"status\": 200," + + " \"entity\": {" + + " \"requestList\": [" + + " {" + + " \"request\": {" + + " \"requestId\": \"rq1234d1-5a33-55df-13ab-12abad84e333\"," + + " \"startTime\": \"Thu, 04 Jun 2009 02:51:59 GMT\"," + + " \"finishTime\": \"Thu, 04 Jun 2009 02:55:59 GMT\"," + + " \"instanceReferences\": {" + + " \"serviceInstanceId\": \"bc305d54-75b4-431b-adb2-eb6b9e546014\"" + + " }," + + " \"requestScope\": \"service\"," + + " \"requestType\": \"createInstance\"," + + " \"requestDetails\": {" + + " \"modelInfo\": {" + + " \"modelType\": \"service\"," + + " \"modelId\": \"sn5256d1-5a33-55df-13ab-12abad84e764\"," + + " \"modelNameVersionId\": \"ab6478e4-ea33-3346-ac12-ab121484a333\"," + + " \"modelName\": \"WanBonding\"," + + " \"modelVersion\": \"1\"" + + " }," + + " \"subscriberInfo\": {" + + " \"globalSubscriberId\": \"C12345\"," + + " \"subscriberName\": \"General Electric Division 12\"" + + " }," + + " \"requestParameters\": {" + + " \"vpnId\": \"1a2b3c4d5e6f\"," + + " \"productName\": \"Trinity\"," + + " \"customerId\": \"icore9883749\"" + + " }" + + " }," + + " \"requestStatus\": {" + + " \"timestamp\": \"Thu, 04 Jun 2009 02:54:49 GMT\"," + + " \"requestState\": \"complete\"," + + " \"statusMessage\": \"Resource Created\"," + + " \"percentProgress\": \"100\"" + + " }" + + " }" + + " }," + + " {" + + " \"request\": {" + + " \"requestId\": \"rq1234d1-5a33-55df-13ab-12abad84e334\"," + + " \"startTime\": \"Thu, 04 Jun 2009 03:52:59 GMT\"," + + " \"instanceReferences\": {" + + " \"serviceInstanceId\": \"bc305d54-75b4-431b-adb2-eb6b9e546014\"" + + " }," + + " \"requestScope\": \"service\"," + + " \"requestType\": \"updateInstance\"," + + " \"requestDetails\": {" + + " \"modelInfo\": {" + + " \"modelType\": \"service\"," + + " \"modelId\": \"sn5256d1-5a33-55df-13ab-12abad84e764\"," + + " \"modelNameVersionId\": \"ab6478e4-ea33-3346-ac12-ab121484a333\"," + + " \"modelName\": \"WanBonding\"," + + " \"modelVersion\": \"1\"" + + " }," + + " \"subscriberInfo\": {" + + " \"globalSubscriberId\": \"C12345\"," + + " \"subscriberName\": \"General Electric Division 12\"" + + " }," + + " \"requestParameters\": {" + + " \"vpnId\": \"1a2b3c4d5e70\"," + + " \"productName\": \"Trinity\"," + + " \"customerId\": \"icore9883749\"" + + " }" + + " }," + + " \"requestStatus\": {" + + " \"timestamp\": \"Thu, 04 Jun 2009 03:53:39 GMT\"," + + " \"requestState\": \"InProgress\"," + + " \"statusMessage\": \"vLan setup complete\"," + + " \"percentProgress\": \"50\"" + + " }" + + " }" + + " }" + + " ]" + + " }" + + "}"; +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestPageController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestPageController.java new file mode 100755 index 00000000..92f86f0b --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/test/TestPageController.java @@ -0,0 +1,57 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.controller.test; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; + +/** + * The Class TestPageController. + */ +@Controller +public class TestPageController extends RestrictedBaseController { + + /** + * Test mso page. + * + * @return the model and view + */ + @RequestMapping(value = { "testMso.htm" }, method = RequestMethod.GET) + public ModelAndView testMsoPage() { + return new ModelAndView(getViewName()); + } + + /** + * Test view edit page. + * + * @return the model and view + */ + @RequestMapping(value = { "testViewEdit" }, method = RequestMethod.GET) + public ModelAndView testViewEditPage() { + return new ModelAndView(getViewName()); + } + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/dao/FnAppDoaImpl.java b/vid-app-common/src/main/java/org/openecomp/vid/dao/FnAppDoaImpl.java new file mode 100755 index 00000000..6d2810aa --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/dao/FnAppDoaImpl.java @@ -0,0 +1,112 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.dao; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Properties; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; + + +public class FnAppDoaImpl { + + /** The logger. */ + static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(FnAppDoaImpl.class); + + public int getProfileCount(String driver, String URL, String username, String password) { + Connection dbc = null; + PreparedStatement pst = null; + ResultSet rs = null; + String q = null; + int count = 0; + try { + dbc = getConnection(driver,URL,username,password); + logger.debug(EELFLoggerDelegate.debugLogger, "getConnection:::"+ dbc); + q = "select count(*) from fn_app"; + pst = dbc.prepareStatement(q); + rs = pst.executeQuery(); + + if (rs.next()) + count = rs.getInt(1); + } catch(Exception ex) { + logger.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex); + } finally { + cleanup(rs,pst,dbc); + } + logger.debug(EELFLoggerDelegate.debugLogger, "count:::"+ count); + return count; + } + + public static Connection getConnection(String driver2, String url, String username, String password) throws IOException, SQLException, ClassNotFoundException{ + java.sql.Connection con=null; + + if( url!=null && username!=null && password!=null ){ + con = DriverManager.getConnection(url, username, password); + } + + System.out.println("Connection Successful"); + return con; + + } + + public static void cleanup(ResultSet rs, PreparedStatement st, Connection c) { + if (rs != null) { + try { + rs.close(); + } catch (Exception e) { + if (logger != null) + logger.error("Error when trying to close result set", e); + } + } + if (st != null) { + try { + st.close(); + } catch (Exception e) { + if (logger != null) + logger.error("Error when trying to close statement", e); + } + } + if (c != null) { + try { + c.rollback(); + } catch (Exception e) { + if (logger != null) + logger.error("Error when trying to rollback connection", e); + } + try { + c.close(); + } catch (Exception e) { + if (logger != null) + logger.error("Error when trying to close connection", e); + } + } + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/dao/ProfileDao.java b/vid-app-common/src/main/java/org/openecomp/vid/dao/ProfileDao.java new file mode 100755 index 00000000..256a4bd8 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/dao/ProfileDao.java @@ -0,0 +1,45 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.dao; + +import java.util.List; +import org.openecomp.portalsdk.core.domain.Profile; + +/** + * The Interface ProfileDao. + */ +public interface ProfileDao { + + /** + * Find all. + * + * @return the list + */ + List findAll(); + + /** + * Gets the profile. + * + * @param id the id + * @return the profile + */ + Profile getProfile(int id); +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/exceptions/VidServiceUnavailableException.java b/vid-app-common/src/main/java/org/openecomp/vid/exceptions/VidServiceUnavailableException.java new file mode 100755 index 00000000..fcd897f7 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/exceptions/VidServiceUnavailableException.java @@ -0,0 +1,69 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.exceptions; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +/** + * The Class VidServiceUnavailableException. + */ +@ResponseStatus(value=HttpStatus.SERVICE_UNAVAILABLE) +public class VidServiceUnavailableException extends Exception { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; + + /** + * Instantiates a new vid service unavailable exception. + */ + public VidServiceUnavailableException() { + super(); + } + + /** + * Instantiates a new vid service unavailable exception. + * + * @param msg the msg + */ + public VidServiceUnavailableException(String msg) { + super(msg); + } + + /** + * Instantiates a new vid service unavailable exception. + * + * @param t the t + */ + public VidServiceUnavailableException(Throwable t) { + super(t); + } + + /** + * Instantiates a new vid service unavailable exception. + * + * @param msg the msg + * @param t the t + */ + public VidServiceUnavailableException(String msg, Throwable t) { + super(msg, t); + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/CommandProperty.java b/vid-app-common/src/main/java/org/openecomp/vid/model/CommandProperty.java new file mode 100755 index 00000000..fe114c38 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/model/CommandProperty.java @@ -0,0 +1,93 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.model; + +import java.util.Map; + +/** + * The Class Command Property. + */ +public class CommandProperty { + + /** The display name for this input */ + private String displayName; + + /** The command, "get_input" */ + private String command; + + /** The input name we refer to back under the inputs section */ + private String inputName; + + /** + * Gets the display name. + * + * @return the displayName + */ + public String getDisplayName() { + return displayName; + } + /** + * Gets the command. + * + * @return the command + */ + public String getCommand() { + return command; + } + /** + * Gets the inputName. + * + * @return the inputName + */ + public String getInputName() { + return inputName; + } + /** + * Sets the display name value. + * + * @param i the new get_input value + */ + public void setDisplayName(String i) { + this.displayName = i; + } + /** + * Sets the command value. + * + * @param i the new command value + */ + public void setCommand(String i) { + this.command = i; + } + + /** + * Sets the input name value. + * + * @param i the new input name value + */ + public void setInputName(String i) { + this.inputName=i; + } + + public String toString () { + String result = "displayName=" + displayName + " command=" + command + " inputName" + inputName; + return result; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/ExceptionResponse.java b/vid-app-common/src/main/java/org/openecomp/vid/model/ExceptionResponse.java new file mode 100755 index 00000000..686971d7 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/model/ExceptionResponse.java @@ -0,0 +1,70 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.model; + +/** + * The Class ExceptionResponse. + */ +public class ExceptionResponse { + + /** The exception. */ + private String exception; + + /** The message. */ + private String message; + + /** + * Gets the exception. + * + * @return the exception + */ + public String getException() { + return exception; + } + + /** + * Sets the exception. + * + * @param exception the new exception + */ + public void setException(String exception) { + this.exception = exception; + } + + /** + * Gets the message. + * + * @return the message + */ + public String getMessage() { + return message; + } + + /** + * Sets the message. + * + * @param message the new message + */ + public void setMessage(String message) { + this.message = message; + } + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/ModelConstants.java b/vid-app-common/src/main/java/org/openecomp/vid/model/ModelConstants.java new file mode 100755 index 00000000..f4e42707 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/model/ModelConstants.java @@ -0,0 +1,42 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.model; +/** + * The Class ModelConstants + */ +public class ModelConstants { + + /** The Constant GET_INPUT_TAG. */ + public final static String GET_INPUT_TAG = "get_input"; + + public static final String ASDC_MODEL_NAMESPACE = "asdc.model.namespace"; + public static final String ASDC_SVC_API_PATH = "sdc.svc.api.path"; + public static final String ASDC_RESOURCE_API_PATH = "sdc.resource.api.path"; + + public static final String DEFAULT_ASDC_MODEL_NAMESPACE = "org.onap."; + public static final String DEFAULT_ASDC_SVC_API_PATH = "sdc/v1/catalog/services"; + public static final String DEFAULT_ASDC_RESOURCE_API_PATH = "sdc/v1/catalog/resources"; + + public final static String VF_MODULE = "groups.VfModule"; + public final static String VNF = "resource.vf"; + public final static String NETWORK = "resource.vl"; + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/Network.java b/vid-app-common/src/main/java/org/openecomp/vid/model/Network.java new file mode 100755 index 00000000..5ab55881 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/model/Network.java @@ -0,0 +1,62 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.model; + +import org.openecomp.vid.asdc.beans.tosca.NodeTemplate; + +/** + * The Class Network. + */ +public class Network extends Node { + + /** The model customization name. */ + private String modelCustomizationName; + + /** + * Instantiates a new network. + */ + public Network() { + super(); + } + /** + * Gets the model customization name. + * + * @return the model customization name + */ + public String getModelCustomizationName() { + return modelCustomizationName; + } + /** + * Sets the model customization name. + * + * @param modelCustomizationName the new model customization name + */ + private void setModelCustomizationName(String modelCustomizationName) { + this.modelCustomizationName = modelCustomizationName; + } + + public void extractNetwork(String modelCustomizationName, NodeTemplate nodeTemplate) { + + super.extractNode(nodeTemplate); + setModelCustomizationName(modelCustomizationName); + + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/Node.java b/vid-app-common/src/main/java/org/openecomp/vid/model/Node.java new file mode 100755 index 00000000..1352653e --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/model/Node.java @@ -0,0 +1,301 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.model; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.openecomp.vid.asdc.beans.tosca.Input; +import org.openecomp.vid.asdc.beans.tosca.NodeTemplate; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +/** + * The Class Node. + */ +public class Node { + /** The Constant LOG. */ + private static final EELFLoggerDelegate LOG = EELFLoggerDelegate.getLogger(Node.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + /** The uuid. */ + private String uuid; + + /** The invariant uuid. */ + private String invariantUuid; + + /** The description. */ + private String description; + + /** The name. */ + private String name; + + /** The version. */ + private String version; + + /** The model customization uuid. */ + private String customizationUuid; + + /** The inputs. */ + private Map inputs; + + /** The get_input or other constructs from node template properties. */ + private Map commands; + + /** The get_input or other constructs from node template properties. */ + private Map properties; + /** + * Instantiates a new node. + */ + public Node() { + this.commands = new HashMap(); + this.properties = new HashMap(); + } + + /** + * Gets the uuid. + * + * @return the uuid + */ + public String getUuid() { + return uuid; + } + + /** + * Gets the invariant uuid. + * + * @return the invariant uuid + */ + public String getInvariantUuid() { + return invariantUuid; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the version. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * Gets the customization uuid. + * + * @return the model customization uuid + */ + public String getCustomizationUuid() { + return customizationUuid; + } + /** + * Gets the inputs. + * + * @return the inputs + */ + public Map getInputs() { + return inputs; + } + /** + * Gets the commands. + * + * @return the commands + */ + public Map getCommands() { + return commands; + } + /** + * Gets the properties. + * + * @return the properties + */ + public Map getProperties() { + return properties; + } + /** + * Sets the uuid. + * + * @param uuid the new uuid + */ + public void setUuid(String uuid) { + this.uuid = uuid; + } + + /** + * Sets the invariant uuid. + * + * @param invariantUuid the new invariant uuid + */ + public void setInvariantUuid(String invariantUuid) { + this.invariantUuid = invariantUuid; + } + + /** + * Sets the description. + * + * @param description the new description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Sets the name. + * + * @param name the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Sets the version. + * + * @param version the new version + */ + public void setVersion(String version) { + this.version = version; + } + /** + * Sets the customization uuid. + * + * @param u the new customization uuid + */ + public void setCustomizationUuid(String u) { + this.customizationUuid = u; + } + + /** + * Sets the inputs. + * + * @param inputs the inputs + */ + public void setInputs(Map inputs) { + this.inputs = inputs; + } + /** + * Sets the commands. + * + * @param m the commands + */ + public void setCommands( Mapm ) { + commands = m; + } + /** + * Sets the properties. + * + * @param p the properties + */ + public void setProperties( Mapp) { + properties = p; + } + /** + * Extract node. + * + * @param modelCustomizationName the model customization name + * @param nodeTemplate the node template + * @return the node + */ + public void extractNode (NodeTemplate nodeTemplate) { + + String methodName = "extractNode"; + + setUuid(nodeTemplate.getMetadata().getUUID()); + setInvariantUuid(nodeTemplate.getMetadata().getInvariantUUID()); + setDescription(nodeTemplate.getMetadata().getDescription()); + setName(nodeTemplate.getMetadata().getName()); + setVersion(nodeTemplate.getMetadata().getVersion()); + // add customizationUUID + setCustomizationUuid(nodeTemplate.getMetadata().getCustomizationUUID()); + + try { + // nodeTemplate.getProperties() map of String->Object + for (Entry e : nodeTemplate.getProperties().entrySet()) { + + String k = e.getKey(); + + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " node template property: " + k ); + + if ( e.getValue() != null ) { + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " property: " + + k + "=" + e.getValue()); + //LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " V class name: " + + // e.getValue().getClass().getName()); + Class c = e.getValue().getClass(); + if ( c.getName().equalsIgnoreCase(java.lang.String.class.getName())) { + getProperties().put (k, (String)e.getValue()); + } + else { + Class[] interfaces = e.getValue().getClass().getInterfaces(); + + for(Class ifc: interfaces ) { + //LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " ifc name: " + + // ifc.getName()); + if ( ifc.getName().equalsIgnoreCase(java.util.Map.class.getName()) ) { + // only extract get_input for now + @SuppressWarnings("unchecked") + HashMap v = (HashMap)e.getValue(); + for (Entry entry : v.entrySet()) { + // only include get_input for now + if ( ModelConstants.GET_INPUT_TAG.equalsIgnoreCase ( entry.getKey() ) ) { + CommandProperty cp = new CommandProperty(); + cp.setCommand(entry.getKey()); + cp.setInputName(entry.getValue()); + cp.setDisplayName(k); + getCommands().put(k,cp); + } + } + } + } + + } + } + } + } + catch ( Exception e ) { + LOG.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + methodName + " Unable to parse node properties: e=" + + e.toString()); + } + } + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/Resource.java b/vid-app-common/src/main/java/org/openecomp/vid/model/Resource.java new file mode 100755 index 00000000..4dcc975b --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/model/Resource.java @@ -0,0 +1,28 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.model; + +/** + * The Class Resource. + */ +public class Resource { + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/Result.java b/vid-app-common/src/main/java/org/openecomp/vid/model/Result.java new file mode 100755 index 00000000..d8bf6eb6 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/model/Result.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.model; + +/** + * The Class Result. + */ +public class Result { + + /** The result. */ + private String result; + + /** + * Instantiates a new result. + * + * @param result the result + */ + public Result(String result) { + this.result = result; + } + + /** + * Gets the result. + * + * @return the result + */ + public String getResult() { + return result; + } + + /** + * Sets the result. + * + * @param result the new result + */ + public void setResult(String result) { + this.result = result; + } + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/Service.java b/vid-app-common/src/main/java/org/openecomp/vid/model/Service.java new file mode 100755 index 00000000..f3c6e4da --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/model/Service.java @@ -0,0 +1,253 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.model; + +import java.util.Map; +import java.util.UUID; +import java.util.Map.Entry; + +import org.openecomp.vid.asdc.beans.tosca.Input; + +/** + * The Class Service. + */ +public class Service { + + /** The uuid. */ + private String uuid; + + /** The invariant uuid. */ + private String invariantUuid; + + /** The name. */ + private String name; + + /** The version. */ + private String version; + + /** The tosca model URL. */ + private String toscaModelURL; + + /** The category. */ + private String category; + + /** The description. */ + private String description; + + /** The service ecomp naming flag */ + private String serviceEcompNaming; + + /** The inputs. */ + private Map inputs; + + /** + * Gets the uuid. + * + * @return the uuid + */ + public String getUuid() { + return uuid; + } + + /** + * Gets the invariant uuid. + * + * @return the invariant uuid + */ + public String getInvariantUuid() { + return invariantUuid; + } + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the version. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * Gets the tosca model URL. + * + * @return the tosca model URL + */ + public String getToscaModelURL() { + return toscaModelURL; + } + + /** + * Gets the category. + * + * @return the category + */ + public String getCategory() { + return category; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Gets the inputs. + * + * @return the inputs + */ + public Map getInputs() { + return inputs; + } + /** + * Get the serviceEcompNaming value + * + * @return serviceEcompNaming + */ + public String getServiceEcompNaming() { + return serviceEcompNaming; + } + /** + * Sets the uuid. + * + * @param uuid the new uuid + */ + public void setUuid(String uuid) { + this.uuid = uuid; + } + + /** + * Sets the invariant uuid. + * + * @param invariantUuid the new invariant uuid + */ + public void setInvariantUuid(String invariantUuid) { + this.invariantUuid = invariantUuid; + } + + /** + * Sets the name. + * + * @param name the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Sets the version. + * + * @param version the new version + */ + public void setVersion(String version) { + this.version = version; + } + + /** + * Sets the tosca model URL. + * + * @param toscaModelURL the new tosca model URL + */ + public void setToscaModelURL(String toscaModelURL) { + this.toscaModelURL = toscaModelURL; + } + + /** + * Sets the category. + * + * @param category the new category + */ + public void setCategory(String category) { + this.category = category; + } + + /** + * Sets the description. + * + * @param description the new description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Sets the inputs. + * + * @param inputs the inputs + */ + public void setInputs(Map inputs) { + this.inputs = inputs; + } + /** + * Sets the service ecomp naming. + * + * @param serviceEcompNaming the new service ecomp naming + */ + public void setServiceEcompNaming(String serviceEcompNaming) { + this.serviceEcompNaming = serviceEcompNaming; + } + /* (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final UUID uuid = UUID.fromString(getUuid()); + + return uuid.hashCode(); + } + + /* (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object o) { + if (o == this) return true; + if (!(o instanceof Service)) return false; + + final Service service = (Service) o; + + return (service.getUuid().equals(getUuid())); + } + /*public static void extractVfModuleCustomizationUUID (Service s, String vnfCustomizationName, VfModule vfMod ) { + + //Look for vnfCustomizationName..vfModuleCustomizationName + String nameToFind = vnfCustomizationName + ".." + vfMod.getModelCustomizationName(); + for (Entry vfModuleComponent : s.getVfModules().entrySet()) { + VfModule xMod = vfModuleComponent.getValue(); + if ( (xMod.getModelCustomizationName() != null) && (xMod.getModelCustomizationName().equalsIgnoreCase(nameToFind)) ) { + vfMod.setCustomizationUuid( xMod.getCustomizationUuid()); + return; + } + } + }*/ +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/ServiceModel.java b/vid-app-common/src/main/java/org/openecomp/vid/model/ServiceModel.java new file mode 100755 index 00000000..140e9edf --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/model/ServiceModel.java @@ -0,0 +1,261 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.model; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.openecomp.vid.asdc.beans.tosca.Group; +import org.openecomp.vid.asdc.beans.tosca.ToscaModel; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.vid.controller.VidController; +import org.openecomp.vid.properties.VidProperties; +/** + * The Class ServiceModel. + */ +public class ServiceModel { + + /** The Constant LOG. */ + private static final EELFLoggerDelegate LOG = EELFLoggerDelegate.getLogger(ServiceModel.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + /** The service. */ + private Service service; + + /** The vnfs. */ + private Map vnfs; + + /** The networks. */ + private Map networks; + + /** + * The vf modules. The VNF also has vfmodules but the vfmodules at the service level may have additional info + * that is not present in the VNF, like the vf module customization String + */ + private Map vfModules; + /** + * The volume groups. The VNF also has volume groups but the volume groups will be populated at the service level + * for newer models + */ + private Map volumeGroups; + /** + * Instantiates a new service model. + */ + public ServiceModel() {} + + /** + * Gets the service. + * + * @return the service + */ + public Service getService() { + return service; + } + + /** + * Gets the vnfs. + * + * @return the vnfs + */ + public Map getVnfs() { + return vnfs; + } + + /** + * Gets the networks. + * + * @return the networks + */ + public Map getNetworks() { + return networks; + } + + /** + * Sets the service. + * + * @param service the new service + */ + public void setService(Service service) { + this.service = service; + } + + /** + * Sets the vnfs. + * + * @param vnfs the vnfs + */ + public void setVnfs(Map vnfs) { + this.vnfs = vnfs; + } + + /** + * Sets the networks. + * + * @param networks the networks + */ + public void setNetworks(Map networks) { + this.networks = networks; + } + /** + * Gets the vf modules. + * + * @return the vf modules + */ + public Map getVfModules() { + return vfModules; + } + /** + * Gets the volume groups. + * + * @return the volume groups + */ + public Map getVolumeGroups() { + return volumeGroups; + } + /** + * Sets the vf modules. + * + * @param vfModules the vf modules + */ + public void setVfModules(Map vfModules) { + this.vfModules = vfModules; + } + /** + * Sets the volume groups. + * + * @param volumeGroups the volume groups + */ + public void setVolumeGroups(Map volumeGroups) { + this.volumeGroups = volumeGroups; + } + /** + * Extract service. + * + * @param serviceToscaModel the service tosca model + * @param asdcServiceMetadata the asdc service metadata + * @return the service + */ + public static Service extractService(ToscaModel serviceToscaModel, org.openecomp.vid.asdc.beans.Service asdcServiceMetadata) { + + final Service service = new Service(); + + service.setCategory(serviceToscaModel.getMetadata().getCategory()); + service.setInvariantUuid(serviceToscaModel.getMetadata().getInvariantUUID()); + service.setName(serviceToscaModel.getMetadata().getName()); + service.setUuid(serviceToscaModel.getMetadata().getUUID()); + service.setDescription(serviceToscaModel.getMetadata().getDescription()); + service.setServiceEcompNaming(serviceToscaModel.getMetadata().getServiceEcompNaming()); + service.setInputs(serviceToscaModel.gettopology_template().getInputs()); + //FIXME: SDC is not sending the Version with the Tosca Model for 1610 - they should send it in 1702 + //THIS IS A TEMPORARY FIX, AT SOME POINT UNCOMMENT ME + //service.setVersion(serviceToscaModel.getMetadata().getVersion()); + service.setVersion(asdcServiceMetadata.getVersion()); + + return service; + } + public void extractGroups (ToscaModel serviceToscaModel) { + // Get the groups. The groups may duplicate the groups that are in the VNF model and have + // additional data like the VF module customization String> + + final Map vfModules = new HashMap (); + final Map volumeGroups = new HashMap (); + + String asdcModelNamespace = VidProperties.getAsdcModelNamespace(); + String vfModuleTag = asdcModelNamespace + ModelConstants.VF_MODULE; + + for (Entry component : serviceToscaModel.gettopology_template().getGroups().entrySet()) { + final Group group = component.getValue(); + final String type = group.getType(); + final String customizationName = component.getKey(); + + if (type.startsWith(vfModuleTag)) { + VfModule vfMod = VfModule.extractVfModule(customizationName, group); + vfModules.put(customizationName, vfMod); + if ( vfMod.isVolumeGroupAllowed() ) { + //volume groups have the same customization name as the vf module + volumeGroups.put(customizationName, VolumeGroup.extractVolumeGroup(customizationName,group)); + } + } + } + // add this point vfModules and volume groups are disconnected from VNF + this.setVfModules (vfModules); + this.setVolumeGroups (volumeGroups); + + } + /** + * Populate the vf modules and volume groups that we may have under the service level under each VNF. + */ + public void associateGroups() { + String methodName = "associateGroups()"; + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " start"); + // go through the vnfs, get the vnf normalized name and look for a vf module with a customization name that starts + // with vnf + ".." + String vnfCustomizationName = null; + String normalizedVnfCustomizationName = null; + String vfModuleCustomizationName = null; + VNF tmpVnf = null; + + if ( ( getVnfs() != null ) && (!(getVnfs().isEmpty())) ) { + for (Entry vnfComponent : getVnfs().entrySet()) { + vnfCustomizationName = vnfComponent.getValue().getModelCustomizationName(); + normalizedVnfCustomizationName = VNF.normalizeName(vnfCustomizationName); + + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + + " VNF customizationName=" + vnfCustomizationName + "normalized customization name=" + normalizedVnfCustomizationName); + + // now check to see if there is a vf module with customization name that starts with normalizedVnfCustomizationName + + if (( getVfModules() != null ) && (!(getVfModules().isEmpty()))) { + for (Entry vfModuleComponent : getVfModules().entrySet()) { + vfModuleCustomizationName = vfModuleComponent.getValue().getModelCustomizationName(); + + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + + " VF Module customizationName=" + vfModuleCustomizationName ); + if ( vfModuleCustomizationName.startsWith(normalizedVnfCustomizationName + ".." )) { + + // this vf module belongs to the VNF + tmpVnf = vnfComponent.getValue(); + (tmpVnf.getVfModules()).put(vfModuleComponent.getKey(), vfModuleComponent.getValue()); + + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + + " Associated VF Module customizationName=" + vfModuleComponent.getKey() + " with VNF customization name=" + vnfCustomizationName); + + // now find if this vf module has volume groups, if so, find the volume group with the same customization name and put it under the VNF + if ( vfModuleComponent.getValue().isVolumeGroupAllowed() ) { + if (( getVolumeGroups() != null ) && (!(getVolumeGroups().isEmpty()))) { + if (getVolumeGroups().containsKey((vfModuleCustomizationName))) { + (vnfComponent.getValue().getVolumeGroups()).put(vfModuleCustomizationName, (getVolumeGroups()).get(vfModuleCustomizationName)); + } + } + } + } + } + } + } + } + + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/VNF.java b/vid-app-common/src/main/java/org/openecomp/vid/model/VNF.java new file mode 100755 index 00000000..be37c947 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/model/VNF.java @@ -0,0 +1,165 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.model; + +import java.util.Map; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map.Entry; +import java.util.regex.Pattern; + +import org.openecomp.vid.asdc.beans.tosca.NodeTemplate; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.vid.controller.VidController; + +import org.openecomp.vid.asdc.beans.tosca.Group; +import org.openecomp.vid.asdc.beans.tosca.Input; + +/** + * The Class VNF. + */ +public class VNF extends Node { + + /** The Constant LOG. */ + private static final EELFLoggerDelegate LOG = EELFLoggerDelegate.getLogger(VNF.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + /** The pattern used to normalize VNF names */ + final static Pattern COMPONENT_INSTANCE_NAME_DELIMETER_PATTERN = Pattern.compile("[\\.\\-]+"); + + /** The model customization name. */ + private String modelCustomizationName; + + /** The vf modules. */ + private Map vfModules = new HashMap(); + + /** The volume groups. */ + private Map volumeGroups = new HashMap(); + + /** + * Instantiates a new vnf. + */ + public VNF() { + super(); + } + + /** + * Gets the model customization name. + * + * @return the model customization name + */ + public String getModelCustomizationName() { + return modelCustomizationName; + } + + /** + * Gets the vf modules. + * + * @return the vf modules + */ + public Map getVfModules() { + return vfModules; + } + + /** + * Sets the vf modules. + * + * @param vfModules the vf modules + */ + public void setVfModules(Map vfModules) { + this.vfModules = vfModules; + } + + /** + * Gets the volume groups. + * + * @return the volume groups + */ + public Map getVolumeGroups() { + return volumeGroups; + } + + /** + * Sets the volume groups. + * + * @param volumeGroups the volume groups + */ + public void setVolumeGroups(Map volumeGroups) { + this.volumeGroups = volumeGroups; + } + + /** + * Extract vnf. + * + * @param modelCustomizationName the model customization name + * @param nodeTemplate the node template + * @return the vnf + */ + public void extractVnf(String modelCustomizationName, NodeTemplate nodeTemplate) { + + super.extractNode(nodeTemplate); + setModelCustomizationName(modelCustomizationName); + + } + + /** + * Sets the model customization name. + * + * @param modelCustomizationName the new model customization name + */ + private void setModelCustomizationName(String modelCustomizationName) { + this.modelCustomizationName = modelCustomizationName; + } + /** + * Normalize the VNF name + * @param originalName + * @return the normalized name + */ + public static String normalizeName (String originalName) { + + String normalizedName = originalName.toLowerCase(); + normalizedName = COMPONENT_INSTANCE_NAME_DELIMETER_PATTERN.matcher(normalizedName).replaceAll(" "); + String[] splitArr = null; + + try { + splitArr = normalizedName.split(" "); + } + catch (Exception ex ) { + return (normalizedName); + } + StringBuffer sb = new StringBuffer(); + if ( splitArr != null ) { + for (String splitElement : splitArr) { + sb.append(splitElement); + } + return (sb.toString()); + } + else { + return (normalizedName); + } + + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/VfModule.java b/vid-app-common/src/main/java/org/openecomp/vid/model/VfModule.java new file mode 100755 index 00000000..4a031a6c --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/model/VfModule.java @@ -0,0 +1,308 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.model; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import org.openecomp.vid.asdc.beans.tosca.Group; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; + +/** + * The Class VfModule. + */ +public class VfModule { + + /** The Constant LOG. */ + private static final EELFLoggerDelegate LOG = EELFLoggerDelegate.getLogger(VfModule.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + /** The uuid. */ + private String uuid; + + /** The invariant uuid. */ + private String invariantUuid; + + /** The customization uuid. */ + private String customizationUuid; + + /** The description. */ + private String description; + + /** The name. */ + private String name; + + /** The version. */ + private String version; + + /** The volume group allowed. */ + private boolean volumeGroupAllowed; + + /** The get_input or other constructs for VF Module. */ + private Map commands; + + /** The model customization name. */ + private String modelCustomizationName; + + /** + * Instantiates a new vf module. + */ + public VfModule() { + commands = new HashMap(); + } + /** + * Gets the model customization name. + * + * @return the model customization name + */ + public String getModelCustomizationName() { + return modelCustomizationName; + } + /** + * Gets the uuid. + * + * @return the uuid + */ + public String getUuid() { + return uuid; + } + + /** + * Gets the invariant uuid. + * + * @return the invariant uuid + */ + public String getInvariantUuid() { + return invariantUuid; + } + /** + * Gets the customization uuid. + * + * @return the invariant uuid + */ + public String getCustomizationUuid() { + return customizationUuid; + } + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + /** + * Gets the commands. + * + * @return the commands + */ + public Map getCommands() { + return commands; + } + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the version. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * Checks if is volume group allowed. + * + * @return true, if is volume group allowed + */ + public boolean isVolumeGroupAllowed() { + return volumeGroupAllowed; + } + + /** + * Sets the uuid. + * + * @param uuid the new uuid + */ + public void setUuid(String uuid) { + this.uuid = uuid; + } + + /** + * Sets the invariant uuid. + * + * @param invariantUuid the new invariant uuid + */ + public void setInvariantUuid(String invariantUuid) { + this.invariantUuid = invariantUuid; + } + /** + * Sets the customization uuid. + * + * @param customizationUuid the new customization uuid + */ + public void setCustomizationUuid(String customizationUuid) { + this.customizationUuid = customizationUuid; + } + /** + * Sets the description. + * + * @param description the new description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Sets the name. + * + * @param name the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Sets the version. + * + * @param version the new version + */ + public void setVersion(String version) { + this.version = version; + } + + /** + * Sets the volume group allowed. + * + * @param volumeGroupAllowed the new volume group allowed + */ + private void setVolumeGroupAllowed(boolean volumeGroupAllowed) { + this.volumeGroupAllowed = volumeGroupAllowed; + } + /** + * Sets the commands. + * + * @param m the commands + */ + public void setCommands( Mapm ) { + commands = m; + } + /** + * Sets the model customization name. + * + * @param modelCustomizationName the new model customization name + */ + private void setModelCustomizationName(String modelCustomizationName) { + this.modelCustomizationName = modelCustomizationName; + } + /** + * Extract vf module. + * + * @param group the group + * @return the vf module + */ + public static VfModule extractVfModule(String modelCustomizationName, Group group) { + + String methodName = "extractVfModule"; + + final VfModule vfModule = new VfModule(); + + try { + vfModule.setUuid(group.getMetadata().getVfModuleModelUUID()); + vfModule.setInvariantUuid(group.getMetadata().getVfModuleModelInvariantUUID()); + vfModule.setDescription(group.getMetadata().getDescription()); + vfModule.setName(group.getMetadata().getVfModuleModelName()); + vfModule.setVersion(group.getMetadata().getVfModuleModelVersion()); + vfModule.setCustomizationUuid(group.getMetadata().getVfModuleModelCustomizationUUID()); + vfModule.setModelCustomizationName (modelCustomizationName); + + if (group.getProperties().containsKey("volume_group")) { + if (group.getProperties().get("volume_group") != null) { + + Class c = group.getProperties().get("volume_group").getClass(); + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " class name=" + + c.getName()); + + if ( c.getName().equalsIgnoreCase(Boolean.class.getName()) ) { + Boolean b = (Boolean)group.getProperties().get("volume_group"); + vfModule.setVolumeGroupAllowed( b.booleanValue() ); + } + } + } else { + vfModule.setVolumeGroupAllowed(false); + } + } + catch ( Exception e ) { + LOG.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + methodName + " Unable to parse VF Module from group: e=" + + e.toString()); + } + /* Not extracting other types of properties for 1702 + try { + + for (Entry e : group.getProperties().entrySet()) { + + String k = e.getKey(); + if ( e.getValue() != null ) { + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " property: " + + k + "=" + e.getValue()); + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " V class name: " + + e.getValue().getClass().getName()); + Class[] interfaces = e.getValue().getClass().getInterfaces(); + + for(Class ifc: interfaces ){ + LOG.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " ifc name: " + + ifc.getName()); + } + + // only extract get_input for now + for (Entry entry : v.entrySet()) { + // only include get_input for now + if ( ModelConstants.GET_INPUT_TAG.equalsIgnoreCase ( entry.getKey() ) ) { + CommandProperty cp = new CommandProperty(); + cp.setDisplayName(entry.getValue()); + cp.setCommand(entry.getKey()); + cp.setInputName(k); + (vfModule.getCommands()).put(k,cp); + } + } + } + } + } + catch ( Exception e ) { + LOG.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + methodName + " Unable to parse VF Module properties: e=" + + e.toString()); + }*/ + return vfModule; + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/VolumeGroup.java b/vid-app-common/src/main/java/org/openecomp/vid/model/VolumeGroup.java new file mode 100755 index 00000000..ea8e151d --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/model/VolumeGroup.java @@ -0,0 +1,196 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.model; + +import org.openecomp.vid.asdc.beans.tosca.Group; + +/** + * The Class VolumeGroup. + */ +public class VolumeGroup { + + /** The uuid. */ + private String uuid; + + /** The invariant uuid. */ + private String invariantUuid; + + /** The description. */ + private String description; + + /** The name. */ + private String name; + + /** The version. */ + private String version; + + /** The customization uuid. */ + private String customizationUuid; + + /** The customization uuid. */ + private String modelCustomizationName; + /** + * Instantiates a new volume group. + */ + public VolumeGroup() {} + + /** + * Gets the uuid. + * + * @return the uuid + */ + public String getUuid() { + return uuid; + } + /** + * Gets the customization uuid. + * + * @return the customization uuid + */ + public String getCustomizationUuid() { + return customizationUuid; + } + /** + * Gets the customization name. + * + * @return the customization name + */ + public String getModelCustomizationName() { + return modelCustomizationName; + } + /** + * Gets the invariant uuid. + * + * @return the invariant uuid + */ + public String getInvariantUuid() { + return invariantUuid; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the version. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * Sets the uuid. + * + * @param uuid the new uuid + */ + public void setUuid(String uuid) { + this.uuid = uuid; + } + + /** + * Sets the invariant uuid. + * + * @param invariantUuid the new invariant uuid + */ + public void setInvariantUuid(String invariantUuid) { + this.invariantUuid = invariantUuid; + } + + /** + * Sets the description. + * + * @param description the new description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Sets the name. + * + * @param name the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Sets the version. + * + * @param version the new version + */ + public void setVersion(String version) { + this.version = version; + } + /** + * Sets the customization uuid. + * + * @param u the new customization uuid + */ + private void setCustomizationUuid(String u) { + this.customizationUuid = u; + + } + /** + * Sets the customization name. + * + * @param u the new customization name + */ + private void setModelCustomizationName(String u) { + this.modelCustomizationName = u; + + } + /** + * Extract volume group. + * + * @param group the group + * @return the volume group + */ + public static VolumeGroup extractVolumeGroup(String modelCustomizationName, Group group) { + final VolumeGroup volumeGroup = new VolumeGroup(); + + volumeGroup.setUuid(group.getMetadata().getVfModuleModelUUID()); + volumeGroup.setInvariantUuid(group.getMetadata().getVfModuleModelInvariantUUID()); + volumeGroup.setDescription(group.getMetadata().getDescription()); + volumeGroup.setName(group.getMetadata().getVfModuleModelName()); + volumeGroup.setVersion(group.getMetadata().getVfModuleModelVersion()); + volumeGroup.setCustomizationUuid(group.getMetadata().getVfModuleModelCustomizationUUID()); + volumeGroup.setModelCustomizationName(modelCustomizationName); + return volumeGroup; + } + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoProperties.java b/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoProperties.java new file mode 100755 index 00000000..272a2a2b --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoProperties.java @@ -0,0 +1,100 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.mso; + +import org.openecomp.portalsdk.core.util.SystemProperties; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; + +/** + * The Class MsoProperties. + */ +public class MsoProperties extends SystemProperties { + + /** The Constant MSO_SERVER_URL. */ + //VID Properties related to MSO + public static final String MSO_SERVER_URL = "mso.server.url"; + + /** The Constant MSO_DME2_SERVER_URL. */ + public static final String MSO_DME2_SERVER_URL = "mso.dme2.server.url"; + + /** The Constant MSO_DME2_CLIENT_TIMEOUT. */ + public static final String MSO_DME2_CLIENT_TIMEOUT = "mso.dme2.client.timeout"; + + /** The Constant MSO_DME2_CLIENT_READ_TIMEOUT. */ + public static final String MSO_DME2_CLIENT_READ_TIMEOUT = "mso.dme2.client.read.timeout"; + + /** The Constant MSO_SERVER_URL_DEFAULT. */ + public static final String MSO_SERVER_URL_DEFAULT= ""; + + /** The Constant MSO_POLLING_INTERVAL_MSECS. */ + // number of msecs to wait between polling requests + public static final String MSO_POLLING_INTERVAL_MSECS = "mso.polling.interval.msecs"; + + /** The Constant MSO_POLLING_INTERVAL_MSECS_DEFAULT. */ + public static final String MSO_POLLING_INTERVAL_MSECS_DEFAULT = "60000"; + + /** The Constant MSO_DME2_ENABLED. */ + public static final String MSO_DME2_ENABLED = "mso.dme2.enabled"; + + /** The Constant MSO_MAX_POLLS. */ + public static final String MSO_MAX_POLLS = "mso.max.polls"; + + /** The Constant MSO_MAX_POLLS_DEFAULT. */ + public static final String MSO_MAX_POLLS_DEFAULT = "10"; //10 + + /** The Constant MSO_USER_NAME. */ + public static final String MSO_USER_NAME = "mso.user.name"; //m03346 + + /** The Constant MSO_PASSWORD. */ + public static final String MSO_PASSWORD = "mso.password.x"; + + /** The Constant MSO_REST_API_SVC_INSTANCE. */ + public static final String MSO_REST_API_SVC_INSTANCE = "mso.restapi.svc.instance"; // /serviceInstances/v2 + + /** The Constant MSO_REST_API_VNF_INSTANCE. */ + public static final String MSO_REST_API_VNF_INSTANCE = "mso.restapi.vnf.instance"; // /serviceInstances/v2/{service_instance_id}/vnfs + + /** The Constant MSO_REST_API_NETWORK_INSTANCE. */ + public static final String MSO_REST_API_NETWORK_INSTANCE = "mso.restapi.network.instance"; // /serviceInstances/v2/{serviceInstanceId}/networks + + /** The Constant MSO_REST_API_GET_ORC_REQ. */ + public static final String MSO_REST_API_GET_ORC_REQ = "mso.restapi.get.orc.req"; + + /** The Constant MSO_REST_API_GET_ORC_REQS. */ + public static final String MSO_REST_API_GET_ORC_REQS = "mso.restapi.get.orc.reqs"; + + /** The Constant MSO_REST_API_VF_MODULE_INSTANCE. */ + public static final String MSO_REST_API_VF_MODULE_INSTANCE = "mso.restapi.vf.module.instance"; + + /** The Constant MSO_REST_API_VOLUME_GROUP_INSTANCE. */ + public static final String MSO_REST_API_VOLUME_GROUP_INSTANCE = "mso.restapi.volume.group.instance"; //serviceInstances/v2/{serviceInstanceId}/volumeGroups + + /** The logger. */ + public EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MsoProperties.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoResponseWrapper.java b/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoResponseWrapper.java new file mode 100755 index 00000000..d5a4a87e --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoResponseWrapper.java @@ -0,0 +1,107 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.mso; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang.builder.ToStringBuilder; + +/** + * This wrapper encapsulates the MSO response in the format expected by the pages. + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "status", + "entity" +}) + +public class MsoResponseWrapper { + + /** The status. */ + @JsonProperty("status") + private int status; + + /** The entity. */ + @JsonProperty("entity") + private String entity; + + /** + * Gets the entity. + * + * @return the entity + */ + @JsonProperty("entity") + public String getEntity() { + return entity; + } + + /** + * Gets the status. + * + * @return the status + */ + @JsonProperty("status") + public int getStatus() { + return status; + } + + /** + * Sets the status. + * + * @param v the new status + */ + @JsonProperty("status") + public void setStatus(int v) { + this.status = v; + } + + /** + * Sets the entity. + * + * @param v the new entity + */ + @JsonProperty("entity") + public void setEntity(String v) { + this.entity = v; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + /** + * Gets the response. + * + * @return the response + */ + public String getResponse () { + + StringBuilder b = new StringBuilder ("{ \"status\": "); + b.append(getStatus()).append(", \"entity\": " ).append(this.getEntity()).append("}"); + return (b.toString()); + } + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInt.java b/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInt.java new file mode 100755 index 00000000..b9f2dbcc --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInt.java @@ -0,0 +1,71 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.mso; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * The Class MsoRestInt. + */ +public class MsoRestInt { + + /** The logger. */ + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MsoRestInterface.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + /** The request date format. */ + public DateFormat requestDateFormat = new SimpleDateFormat("EEE, dd MMM YYYY HH:mm:ss z"); + + /** + * Instantiates a new mso rest int. + */ + public MsoRestInt() { + requestDateFormat.setTimeZone(java.util.TimeZone.getTimeZone("GMT")); + } + + /** + * Log request. + * + * @param r the r + */ + public void logRequest ( org.openecomp.vid.mso.rest.RequestDetails r ) { + String methodName = "logRequest"; + ObjectMapper mapper = new ObjectMapper(); + String r_json_str = ""; + if ( r != null ) { + r_json_str = r.toString(); + try { + r_json_str = mapper.writeValueAsString(r); + } + catch ( com.fasterxml.jackson.core.JsonProcessingException j ) { + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " Unable to parse request as json"); + } + } + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " Request=(" + r_json_str + ")"); + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInterface.java b/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInterface.java new file mode 100755 index 00000000..31a762ef --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInterface.java @@ -0,0 +1,290 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.mso; + + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.Date; + +import javax.ws.rs.client.Client; +import javax.ws.rs.client.Entity; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedHashMap; +import javax.ws.rs.core.Response; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; + +import org.apache.commons.codec.binary.Base64; +import org.eclipse.jetty.util.security.Password; +import org.openecomp.vid.client.HttpBasicClient; +import org.openecomp.vid.client.HttpsBasicClient; +import org.openecomp.vid.mso.rest.RequestDetails; + +/** + * The Class MsoRestInterface. + */ +public class MsoRestInterface extends MsoRestInt implements MsoRestInterfaceIfc { + + /** The logger. */ + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MsoRestInterface.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + /** The client. */ + private static Client client = null; + + /** The common headers. */ + private MultivaluedHashMap commonHeaders; + + /** + * Instantiates a new mso rest interface. + */ + public MsoRestInterface() { + super(); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.mso.MsoRestInterfaceIfc#initRestClient() + */ + public void initRestClient() + { + final String methodname = "initRestClient()"; + + final String username = SystemProperties.getProperty(MsoProperties.MSO_USER_NAME); + final String password = SystemProperties.getProperty(MsoProperties.MSO_PASSWORD); + final String mso_url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL); + final String decrypted_password = Password.deobfuscate(password); + + String authString = username + ":" + decrypted_password; + + byte[] authEncBytes = Base64.encodeBase64(authString.getBytes()); + String authStringEnc = new String(authEncBytes); + + commonHeaders = new MultivaluedHashMap (); + commonHeaders.put("Authorization", Collections.singletonList((Object) ("Basic " + authStringEnc))); + + boolean use_ssl = true; + if ( (mso_url != null) && ( !(mso_url.isEmpty()) ) ) { + if ( mso_url.startsWith("https")) { + use_ssl = true; + } + else { + use_ssl = false; + } + } + if (client == null) { + + try { + if ( use_ssl ) { + //logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + methodname + " getting HttpsBasicClient with username=" + username + // + " password=" + password); + client = HttpsBasicClient.getClient(); + } + else { + //logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + methodname + " getting HttpsBasicClient with username=" + username + // + " password=" + password); + client = HttpBasicClient.getClient(); + } + } catch (Exception e) { + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + methodname + " Unable to get the SSL client"); + } + } + } + + /* (non-Javadoc) + * @see org.openecomp.vid.mso.MsoRestInterfaceIfc#Get(java.lang.Object, java.lang.String, java.lang.String, org.openecomp.vid.mso.RestObject) + */ + @SuppressWarnings("unchecked") + public void Get (T t, String sourceId, String path, RestObject restObject ) throws Exception { + String methodName = "Get"; + + logger.debug(EELFLoggerDelegate.debugLogger, methodName + " start"); + + String url=""; + restObject.set(t); + + url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) + path; + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " sending request to url= " + url); + + initRestClient(); + + final Response cres = client.target(url) + .request() + .accept("application/json") + .headers(commonHeaders) + .get(); + + int status = cres.getStatus(); + restObject.setStatusCode (status); + + if (status == 200) { + t = (T) cres.readEntity(t.getClass()); + restObject.set(t); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " REST api was successfull!"); + + } else { + throw new Exception(methodName + " with status="+ status + ", url= " + url ); + } + + logger.debug(EELFLoggerDelegate.debugLogger,methodName + " received status=" + status ); + + return; + } + + /* (non-Javadoc) + * @see org.openecomp.vid.mso.MsoRestInterfaceIfc#Delete(java.lang.Object, org.openecomp.vid.mso.rest.RequestDetails, java.lang.String, java.lang.String, org.openecomp.vid.mso.RestObject) + */ + @SuppressWarnings("unchecked") + public void Delete(T t, RequestDetails r, String sourceID, String path, RestObject restObject) { + + String methodName = "Delete"; + String url=""; + Response cres = null; + + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " start"); + logRequest (r); + + try { + initRestClient(); + + url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) + path; + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + " methodName sending request to: " + url); + + cres = client.target(url) + .request() + .accept("application/json") + .headers(commonHeaders) + //.entity(r) + .build("DELETE", Entity.entity(r, MediaType.APPLICATION_JSON)).invoke(); + // .method("DELETE", Entity.entity(r, MediaType.APPLICATION_JSON)); + //.delete(Entity.entity(r, MediaType.APPLICATION_JSON)); + + int status = cres.getStatus(); + restObject.setStatusCode (status); + + if (status == 404) { // resource not found + String msg = "Resource does not exist...: " + cres.getStatus(); + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + msg); + } else if (status == 200 || status == 204){ + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + "Resource " + url + " deleted"); + } else if (status == 202) { + String msg = "Delete in progress: " + status; + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + msg); + } + else { + String msg = "Deleting Resource failed: " + status; + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + msg); + } + + try { + t = (T) cres.readEntity(t.getClass()); + restObject.set(t); + } + catch ( Exception e ) { + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " No response entity, this is probably ok, e=" + + e.getMessage()); + } + + } + catch (Exception e) + { + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " with url="+url+ ", Exception: " + e.toString()); + throw e; + + } + } + + /* (non-Javadoc) + * @see org.openecomp.vid.mso.MsoRestInterfaceIfc#Post(java.lang.Object, org.openecomp.vid.mso.rest.RequestDetails, java.lang.String, java.lang.String, org.openecomp.vid.mso.RestObject) + */ + @SuppressWarnings("unchecked") + public void Post(T t, RequestDetails r, String sourceID, String path, RestObject restObject) throws Exception { + + String methodName = "Post"; + String url=""; + + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " start"); + + logRequest (r); + try { + + initRestClient(); + + url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) + path; + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " sending request to url= " + url); + // Change the content length + final Response cres = client.target(url) + .request() + .accept("application/json") + .headers(commonHeaders) + //.header("content-length", 201) + //.header("X-FromAppId", sourceID) + .post(Entity.entity(r, MediaType.APPLICATION_JSON)); + + try { + t = (T) cres.readEntity(t.getClass()); + restObject.set(t); + } + catch ( Exception e ) { + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " No response entity, this is probably ok, e=" + + e.getMessage()); + } + + int status = cres.getStatus(); + restObject.setStatusCode (status); + + if ( status >= 200 && status <= 299 ) { + logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + methodName + " REST api POST was successful!"); + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " REST api POST was successful!"); + + } else { + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " with status="+status+", url="+url); + } + + } catch (Exception e) + { + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " with url="+url+ ", Exception: " + e.toString()); + throw e; + + } + } + + + /** + * Gets the single instance of MsoRestInterface. + * + * @param the generic type + * @param clazz the clazz + * @return single instance of MsoRestInterface + * @throws IllegalAccessException the illegal access exception + * @throws InstantiationException the instantiation exception + */ + public T getInstance(Class clazz) throws IllegalAccessException, InstantiationException + { + return clazz.newInstance(); + } + + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInterfaceFactory.java b/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInterfaceFactory.java new file mode 100755 index 00000000..8bb3093c --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInterfaceFactory.java @@ -0,0 +1,48 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.mso; + +import org.openecomp.portalsdk.core.util.SystemProperties; + +/** + * A factory for creating MsoRestInterface objects. + */ +public class MsoRestInterfaceFactory { + + /** + * Gets the single instance of MsoRestInterfaceFactory. + * + * @return single instance of MsoRestInterfaceFactory + */ + public static MsoRestInterfaceIfc getInstance () { + MsoRestInterfaceIfc obj = null; + +// String mso_dme2_enabled = SystemProperties.getProperty(MsoProperties.MSO_DME2_ENABLED); +// if ( (mso_dme2_enabled != null) && (mso_dme2_enabled.equalsIgnoreCase("true") ) ) { +// obj = new MsoDme2RestInterface(); +// } +// else { + obj = new MsoRestInterface(); +// } + return ( obj ); + } + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInterfaceIfc.java b/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInterfaceIfc.java new file mode 100755 index 00000000..b0dc906b --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoRestInterfaceIfc.java @@ -0,0 +1,79 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.mso; + +import org.openecomp.vid.mso.rest.RequestDetails; + +/** + * The Interface MsoRestInterfaceIfc. + */ +public interface MsoRestInterfaceIfc { + + /** + * Inits the rest client. + */ + public void initRestClient(); + + /** + * Gets the. + * + * @param the generic type + * @param t the t + * @param sourceId the source id + * @param path the path + * @param restObject the rest object + * @throws Exception the exception + */ + public void Get (T t, String sourceId, String path, RestObject restObject ) throws Exception; + + /** + * Delete. + * + * @param the generic type + * @param t the t + * @param r the r + * @param sourceID the source ID + * @param path the path + * @param restObject the rest object + * @throws Exception the exception + */ + public void Delete(T t, RequestDetails r, String sourceID, String path, RestObject restObject) throws Exception; + + /** + * Post. + * + * @param the generic type + * @param t the t + * @param r the r + * @param sourceID the source ID + * @param path the path + * @param restObject the rest object + * @throws Exception the exception + */ + public void Post(T t, RequestDetails r, String sourceID, String path, RestObject restObject) throws Exception; + + /** + * Log request. + * + * @param r the r + */ + public void logRequest ( RequestDetails r ); +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoUtil.java b/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoUtil.java new file mode 100755 index 00000000..2c0148bb --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/mso/MsoUtil.java @@ -0,0 +1,125 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.mso; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.glassfish.jersey.client.ClientResponse; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.vid.controller.MsoController; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * The Class MsoUtil. + */ +public class MsoUtil { + + /** The logger. */ + private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MsoController.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + + /** + * Wrap response. + * + * @param body the body + * @param statusCode the status code + * @return the mso response wrapper + */ + public static MsoResponseWrapper wrapResponse ( String body, int statusCode ) { + + MsoResponseWrapper w = new MsoResponseWrapper(); + w.setStatus (statusCode); + w.setEntity(body); + + return w; + } + + /** + * Wrap response. + * + * @param cres the cres + * @return the mso response wrapper + */ + public static MsoResponseWrapper wrapResponse (ClientResponse cres) { + String resp_str = ""; + if ( cres != null ) { + resp_str = cres.readEntity(String.class); + } + int statuscode = cres.getStatus(); + MsoResponseWrapper w = MsoUtil.wrapResponse ( resp_str, statuscode ); + return (w); + } + + /** + * Wrap response. + * + * @param rs the rs + * @return the mso response wrapper + */ + public static MsoResponseWrapper wrapResponse (RestObject rs) { + String resp_str = ""; + int status = 0; + if ( rs != null ) { + resp_str = rs.get(); + status = rs.getStatusCode(); + } + MsoResponseWrapper w = MsoUtil.wrapResponse ( resp_str, status ); + return (w); + } + + /** + * Convert pojo to string. + * + * @param the generic type + * @param t the t + * @return the string + * @throws JsonProcessingException the json processing exception + */ + public static String convertPojoToString ( T t ) throws com.fasterxml.jackson.core.JsonProcessingException { + + String methodName = "convertPojoToString"; + ObjectMapper mapper = new ObjectMapper(); + String r_json_str = ""; + if ( t != null ) { + try { + r_json_str = mapper.writeValueAsString(t); + } + catch ( com.fasterxml.jackson.core.JsonProcessingException j ) { + logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " Unable to parse object as json"); + } + } + return (r_json_str); + } + + /** + * The main method. + * + * @param args the arguments + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/mso/RestObject.java b/vid-app-common/src/main/java/org/openecomp/vid/mso/RestObject.java new file mode 100755 index 00000000..881409e1 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/mso/RestObject.java @@ -0,0 +1,68 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.mso; + +/** + * The Class RestObject. + * + * @param the generic type + */ +public class RestObject { + + /** + * Generic version of the RestObject class. + * + */ + // T stands for "Type" + private T t; + + /** The status code. */ + private int statusCode= 0; + + /** + * Sets the. + * + * @param t the t + */ + public void set(T t) { this.t = t; } + + /** + * Gets the. + * + * @return the t + */ + public T get() { return t; } + + /** + * Sets the status code. + * + * @param v the new status code + */ + public void setStatusCode(int v) { this.statusCode = v; } + + /** + * Gets the status code. + * + * @return the status code + */ + public int getStatusCode() { return this.statusCode; } +} + diff --git a/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/AsyncRequestStatus.java b/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/AsyncRequestStatus.java new file mode 100755 index 00000000..1395f9ae --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/AsyncRequestStatus.java @@ -0,0 +1,123 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.mso.rest; + +//import java.util.HashMap; +//import java.util.Map; +//import javax.annotation.Generated; + +import org.openecomp.vid.domain.mso.InstanceIds; +import org.openecomp.vid.domain.mso.RequestStatus; +//import com.fasterxml.jackson.annotation.JsonAnyGetter; +//import com.fasterxml.jackson.annotation.JsonAnySetter; +//import com.fasterxml.jackson.annotation.JsonCreator; +//import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +//import com.fasterxml.jackson.annotation.JsonPropertyOrder; +//import com.fasterxml.jackson.annotation.JsonValue; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; + + +/** + * request structure. + */ +@JsonInclude(JsonInclude.Include.NON_NULL) + +public class AsyncRequestStatus extends org.openecomp.vid.domain.mso.AsyncRequestStatus { + + + /** The instance ids. */ + private InstanceIds instanceIds; + + /** The request status. */ + private RequestStatus requestStatus; + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.AsyncRequestStatus#getInstanceIds() + */ + public InstanceIds getInstanceIds() { + return instanceIds; + } + + /** + * Sets the instance ids. + * + * @param instanceIds the new instance ids + */ + public void setInstanceIds(InstanceIds instanceIds) { + this.instanceIds = instanceIds; + } + + + /** + * (Required). + * + * @return The requestStatus + */ + @JsonProperty("requestStatus") + public RequestStatus getRequestStatus() { + return requestStatus; + } + + /** + * (Required). + * + * @param requestStatus The requestStatus + */ + @JsonProperty("requestStatus") + public void setRequestStatus(RequestStatus requestStatus) { + this.requestStatus = requestStatus; + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.AsyncRequestStatus#toString() + */ + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.AsyncRequestStatus#hashCode() + */ + @Override + public int hashCode() { + return new HashCodeBuilder().append(getCorrelator()).append(getFinishTime()).append(instanceIds).append(getRequestId()).append(getRequestScope()).append(getRequestStatus()).append(getRequestType()).append(getStartTime()).append(getAdditionalProperties()).toHashCode(); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.AsyncRequestStatus#equals(java.lang.Object) + */ + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof AsyncRequestStatus) == false) { + return false; + } + AsyncRequestStatus rhs = ((AsyncRequestStatus) other); + return new EqualsBuilder().append(getCorrelator(), rhs.getCorrelator()).append(getFinishTime(), rhs.getFinishTime()).append(instanceIds, rhs.instanceIds).append(getRequestId(), rhs.getRequestId()).append(getRequestScope(), rhs.getRequestScope()).append(getRequestStatus(), rhs.getRequestStatus()).append(getRequestType(), rhs.getRequestType()).append(getStartTime(), rhs.getStartTime()).append(getAdditionalProperties(), rhs.getAdditionalProperties()).isEquals(); + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RelatedInstance.java b/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RelatedInstance.java new file mode 100755 index 00000000..b68f7c13 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RelatedInstance.java @@ -0,0 +1,125 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.mso.rest; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; + + +/** + * modelInfo and optional instanceId and instanceName for a model related to the modelInfo being operated on. + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "instanceName", + "instanceId", + "modelInfo" +}) +public class RelatedInstance extends org.openecomp.vid.domain.mso.RelatedInstance{ + + + /** The model info. */ + @JsonProperty("modelInfo") + private org.openecomp.vid.domain.mso.ModelInfo modelInfo; + + /** The additional properties. */ + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * (Required). + * + * @return The modelInfo + */ + @JsonProperty("modelInfo") + public org.openecomp.vid.domain.mso.ModelInfo getModelInfo() { + return modelInfo; + } + + /** + * (Required). + * + * @param modelInfo The modelInfo + */ + @JsonProperty("modelInfo") + public void setModelInfo(org.openecomp.vid.domain.mso.ModelInfo modelInfo) { + this.modelInfo = modelInfo; + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.RelatedInstance#toString() + */ + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.RelatedInstance#getAdditionalProperties() + */ + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.RelatedInstance#setAdditionalProperty(java.lang.String, java.lang.Object) + */ + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.RelatedInstance#hashCode() + */ + @Override + public int hashCode() { + return new HashCodeBuilder().append(getInstanceName()).append(getInstanceId()).append(modelInfo).append(additionalProperties).toHashCode(); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.RelatedInstance#equals(java.lang.Object) + */ + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof RelatedInstance) == false) { + return false; + } + RelatedInstance rhs = ((RelatedInstance) other); + return new EqualsBuilder().append(getInstanceName(), rhs.getInstanceName()).append(getInstanceId(), rhs.getInstanceId()).append(modelInfo, rhs.getModelInfo()).append(additionalProperties, rhs.additionalProperties).isEquals(); + } + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RelatedModel.java b/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RelatedModel.java new file mode 100755 index 00000000..dc67a945 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RelatedModel.java @@ -0,0 +1,121 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.mso.rest; + +import java.util.HashMap; +import java.util.Map; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; + + +/** + * modelInfo and optional instance id for a model related to the modelInfo being operated on. + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "instanceId", + "modelInfo" +}) +public class RelatedModel extends org.openecomp.vid.domain.mso.RelatedModel { + + /** (Required). */ + @JsonProperty("modelInfo") + private org.openecomp.vid.domain.mso.ModelInfo modelInfo; + + /** The additional properties. */ + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * (Required). + * + * @return The modelInfo + */ + @JsonProperty("modelInfo") + public org.openecomp.vid.domain.mso.ModelInfo getModelInfo() { + return modelInfo; + } + + /** + * (Required). + * + * @param modelInfo The modelInfo + */ + @JsonProperty("modelInfo") + public void setModelInfo(org.openecomp.vid.domain.mso.ModelInfo modelInfo) { + this.modelInfo = modelInfo; + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.RelatedModel#toString() + */ + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.RelatedModel#getAdditionalProperties() + */ + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.RelatedModel#setAdditionalProperty(java.lang.String, java.lang.Object) + */ + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.RelatedModel#hashCode() + */ + @Override + public int hashCode() { + return new HashCodeBuilder().append(getInstanceId()).append(modelInfo).append(additionalProperties).toHashCode(); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.RelatedModel#equals(java.lang.Object) + */ + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof RelatedModel) == false) { + return false; + } + RelatedModel rhs = ((RelatedModel) other); + return new EqualsBuilder().append(getInstanceId(), rhs.getInstanceId()).append(modelInfo, rhs.modelInfo).append(additionalProperties, rhs.additionalProperties).isEquals(); + } + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/Request.java b/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/Request.java new file mode 100755 index 00000000..c8f7b8ba --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/Request.java @@ -0,0 +1,140 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.mso.rest; + +//import java.util.HashMap; +//import java.util.Map; +//import javax.annotation.Generated; + +import org.openecomp.vid.domain.mso.InstanceIds; +import org.openecomp.vid.domain.mso.RequestStatus; +//import com.fasterxml.jackson.annotation.JsonAnyGetter; +//import com.fasterxml.jackson.annotation.JsonAnySetter; +//import com.fasterxml.jackson.annotation.JsonCreator; +//import com.fasterxml.jackson.annotation.JsonIgnore; +//import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +//import com.fasterxml.jackson.annotation.JsonPropertyOrder; +//import com.fasterxml.jackson.annotation.JsonValue; +import org.apache.commons.lang.builder.EqualsBuilder; +//import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; + + +/** + * request structure. + */ +public class Request extends org.openecomp.vid.domain.mso.Request { + + + /** The instance ids. */ + private InstanceIds instanceIds; + + /** The request details. */ + private RequestDetails requestDetails; + + /** The request status. */ + private RequestStatus requestStatus; + + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.Request#getInstanceIds() + */ + @JsonProperty("instanceIds") + public InstanceIds getInstanceIds() { + return instanceIds; + } + + /** + * Sets the instance ids. + * + * @param instanceIds The instanceIds + */ + @JsonProperty("instanceIds") + public void setInstanceIds(InstanceIds instanceIds) { + this.instanceIds = instanceIds; + } + + /** + * (Required). + * + * @return The requestDetails + */ + @JsonProperty("requestDetails") + public RequestDetails getRequestDetails() { + return requestDetails; + } + + /** + * (Required). + * + * @param requestDetails The requestDetails + */ + @JsonProperty("requestDetails") + public void setRequestDetails(RequestDetails requestDetails) { + this.requestDetails = requestDetails; + } + + + /** + * Gets the request status. + * + * @return The requestStatus + */ + @JsonProperty("requestStatus") + public RequestStatus getRequestStatus() { + return requestStatus; + } + + /** + * Sets the request status. + * + * @param requestStatus The requestStatus + */ + @JsonProperty("requestStatus") + public void setRequestStatus(RequestStatus requestStatus) { + this.requestStatus = requestStatus; + } + + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.Request#toString() + */ + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.Request#equals(java.lang.Object) + */ + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof Request) == false) { + return false; + } + Request rhs = ((Request) other); + return new EqualsBuilder().append(getFinishTime(), rhs.getFinishTime()).append(getInstanceIds(), rhs.getInstanceIds()).append(getRequestDetails(), rhs.getRequestDetails()).append(getRequestId(), rhs.getRequestId()).append(getRequestScope(), rhs.getRequestScope()).append(getRequestStatus(), rhs.getRequestStatus()).append(getRequestType(), rhs.getRequestType()).append(getStartTime(), rhs.getStartTime()).append(getAdditionalProperties(), rhs.getAdditionalProperties()).isEquals(); + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RequestDetails.java b/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RequestDetails.java new file mode 100755 index 00000000..6e7c5af3 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RequestDetails.java @@ -0,0 +1,233 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.mso.rest; + +import java.util.HashMap; +import java.util.Map; +import java.util.List; +//import javax.annotation.Generated; + +import org.openecomp.vid.domain.mso.CloudConfiguration; +import org.openecomp.vid.domain.mso.ModelInfo; +import org.openecomp.vid.domain.mso.RequestInfo; +import org.openecomp.vid.domain.mso.RequestParameters; +import org.openecomp.vid.domain.mso.SubscriberInfo; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; + + +/** + * aggregates the context, configuraiton and detailed parameters associated with the request into a single structure. + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "cloudConfiguration", + "modelInfo", + "relatedModelList", + "requestInfo", + "subscriberInfo", + "requestParameters" +}) +public class RequestDetails extends org.openecomp.vid.domain.mso.RequestDetails { + + /** The cloud configuration. */ + @JsonProperty("cloudConfiguration") + private CloudConfiguration cloudConfiguration; + + /** The model info. */ + @JsonProperty("modelInfo") + private ModelInfo modelInfo; + + /** The related model list. */ + @JsonProperty("relatedModelList") + private List relatedModelList; + + /** The request info. */ + @JsonProperty("requestInfo") + private RequestInfo requestInfo; + + /** The subscriber info. */ + @JsonProperty("subscriberInfo") + private SubscriberInfo subscriberInfo; + + /** The request parameters. */ + @JsonProperty("requestParameters") + private RequestParameters requestParameters; + + /** The additional properties. */ + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * Gets the cloud configuration. + * + * @return The cloudConfiguration + */ + @JsonProperty("cloudConfiguration") + public CloudConfiguration getCloudConfiguration() { + return cloudConfiguration; + } + + /** + * Sets the cloud configuration. + * + * @param cloudConfiguration The cloudConfiguration + */ + @JsonProperty("cloudConfiguration") + public void setCloudConfiguration(CloudConfiguration cloudConfiguration) { + this.cloudConfiguration = cloudConfiguration; + } + + /** + * Gets the model info. + * + * @return The modelInfo + */ + @JsonProperty("modelInfo") + public ModelInfo getModelInfo() { + return modelInfo; + } + + /** + * Sets the model info. + * + * @param modelInfo The modelInfo + */ + @JsonProperty("modelInfo") + public void setModelInfo(ModelInfo modelInfo) { + this.modelInfo = modelInfo; + } + + /** + * Gets the related model list. + * + * @return The relatedModelList + */ + @JsonProperty("relatedModelList") + public List getRelatedModelList() { + return relatedModelList; + } + + /** + * Sets the related model list. + * + * @param relatedModelList The relatedModelList + */ + @JsonProperty("relatedModelList") + public void setRelatedModelList( List relatedModelList) { + this.relatedModelList = relatedModelList; + } + + /** + * Gets the request info. + * + * @return The requestInfo + */ + @JsonProperty("requestInfo") + public RequestInfo getRequestInfo() { + return requestInfo; + } + + /** + * Sets the request info. + * + * @param requestInfo The requestInfo + */ + @JsonProperty("requestInfo") + public void setRequestInfo(RequestInfo requestInfo) { + this.requestInfo = requestInfo; + } + + /** + * Gets the subscriber info. + * + * @return The subscriberInfo + */ + @JsonProperty("subscriberInfo") + public SubscriberInfo getSubscriberInfo() { + return subscriberInfo; + } + + /** + * Sets the subscriber info. + * + * @param subscriberInfo The subscriberInfo + */ + @JsonProperty("subscriberInfo") + public void setSubscriberInfo(SubscriberInfo subscriberInfo) { + this.subscriberInfo = subscriberInfo; + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.RequestDetails#toString() + */ + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.RequestDetails#getAdditionalProperties() + */ + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.RequestDetails#setAdditionalProperty(java.lang.String, java.lang.Object) + */ + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.RequestDetails#hashCode() + */ + @Override + public int hashCode() { + return new HashCodeBuilder().append(cloudConfiguration).append(modelInfo).append(relatedModelList).append(requestInfo).append(getRequestParameters()).append(subscriberInfo).append(additionalProperties).toHashCode(); + } + + /* (non-Javadoc) + * @see org.openecomp.vid.domain.mso.RequestDetails#equals(java.lang.Object) + */ + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof RequestDetails) == false) { + return false; + } + RequestDetails rhs = ((RequestDetails) other); + return new EqualsBuilder().append(cloudConfiguration, rhs.cloudConfiguration).append(modelInfo, rhs.modelInfo).append(relatedModelList, rhs.relatedModelList).append(requestInfo, rhs.requestInfo).append(getRequestParameters(), rhs.getRequestParameters()).append(subscriberInfo, rhs.subscriberInfo).append(additionalProperties, rhs.additionalProperties).isEquals(); + } + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RequestList.java b/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RequestList.java new file mode 100755 index 00000000..7c366ac8 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/mso/rest/RequestList.java @@ -0,0 +1,137 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.mso.rest; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Generated; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +//import com.fasterxml.jackson.annotation.JsonInclude; +//import com.fasterxml.jackson.annotation.JsonProperty; +//import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; +import java.util.List; + +/** + * List of relatedModel structures that are related to a modelInfo being operated on. + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "finishTime", + "instanceIds", + "requestDetails", + "requestId", + "requestScope", + "requestStatus", + "requestType", + "startTime" +}) + +public class RequestList { + + /** The request list. */ + private List requestList; + + /** The additional properties. */ + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * (Required). + * + * @return The RelatedModel List + */ + public List getRequestList() { + return requestList; + } + + /** + * Sets the request list. + * + * @param l the new request list + */ + public void setRequestList(List l) { + this.requestList = l; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + /** + * Gets the additional properties. + * + * @return the additional properties + */ + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + /** + * Sets the additional property. + * + * @param name the name + * @param value the value + */ + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + /* (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + return new HashCodeBuilder().append(getRequestList()).append(additionalProperties).toHashCode(); + } + + /* (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof RequestList) == false) { + return false; + } + RequestList rhs = ((RequestList) other); + return new EqualsBuilder().append(getRequestList(), rhs.getRequestList()).append(additionalProperties, rhs.additionalProperties).isEquals(); + } + +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/properties/AsdcClientConfiguration.java b/vid-app-common/src/main/java/org/openecomp/vid/properties/AsdcClientConfiguration.java new file mode 100755 index 00000000..6d5f9522 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/properties/AsdcClientConfiguration.java @@ -0,0 +1,116 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.properties; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; + +/** + * The Class AsdcClientConfiguration. + */ +@Configuration +@PropertySource(value="${container.classpath:}/WEB-INF/conf/asdc.properties") +public class AsdcClientConfiguration { + + @Bean + public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { + return new PropertySourcesPlaceholderConfigurer(); + } + + @Value("${asdc.client.type}") + private AsdcClientType asdcClientType; + + /** The asdc client host. */ + @Value("${asdc.client.rest.host}") + private String asdcClientHost; + + /** The asdc client port. */ + @Value("${asdc.client.rest.port}") + private int asdcClientPort; + + /** The asdc client auth. */ + @Value("${asdc.client.rest.auth}") + public String asdcClientAuth; + + /** The asdc client protocol. */ + @Value("${asdc.client.rest.protocol}") + public String asdcClientProtocol; + + /** + * Gets the asdc client type. + * + * @return the asdc client type + */ + public AsdcClientType getAsdcClientType() { + return asdcClientType; + } + + /** + * Gets the asdc client host. + * + * @return the asdc client host + */ + public String getAsdcClientHost() { + return asdcClientHost; + } + + /** + * Gets the asdc client port. + * + * @return the asdc client port + */ + public int getAsdcClientPort() { + return asdcClientPort; + } + + /** + * Gets the asdc client auth. + * + * @return the asdc client auth + */ + public String getAsdcClientAuth() { + return asdcClientAuth; + } + + /** + * Gets the asdc client protocol. + * + * @return the asdc client protocol + */ + public String getAsdcClientProtocol() { + return asdcClientProtocol; + } + + /** + * The Enum AsdcClientType. + */ + public enum AsdcClientType { + + /** The in memory. */ + IN_MEMORY, + + /** The rest. */ + REST + } +} diff --git a/vid-app-common/src/main/java/org/openecomp/vid/properties/VidProperties.java b/vid-app-common/src/main/java/org/openecomp/vid/properties/VidProperties.java new file mode 100755 index 00000000..141b9b27 --- /dev/null +++ b/vid-app-common/src/main/java/org/openecomp/vid/properties/VidProperties.java @@ -0,0 +1,93 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.vid.properties; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import org.openecomp.vid.model.ModelConstants; +import org.openecomp.portalsdk.core.util.SystemProperties; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; + +import org.openecomp.vid.controller.VidController; +/** + * The Class VidProperties. + */ +public class VidProperties extends SystemProperties { + + //VID General Properties + + /** The Constant VID_TRUSTSTORE_FILENAME. */ + public static final String VID_TRUSTSTORE_FILENAME = "vid.truststore.filename"; + + /** The Constant VID_TRUSTSTORE_PASSWD_X. */ + public static final String VID_TRUSTSTORE_PASSWD_X = "vid.truststore.passwd.x"; + + /** The Constant FILESEPARATOR. */ + public static final String FILESEPARATOR = (System.getProperty("file.separator") == null) ? "/" : System.getProperty("file.separator"); + + /** The Constant LOG. */ + private static final EELFLoggerDelegate LOG = EELFLoggerDelegate.getLogger(VidController.class); + + /** The Constant dateFormat. */ + final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + /** + * Gets the asdc model namespace prefix property + * + * @return the property value or a default value + */ + public static String getAsdcModelNamespace() { + String methodName = "getAsdcModelNamespace "; + String asdcModelNamespace = ModelConstants.DEFAULT_ASDC_MODEL_NAMESPACE; + try { + asdcModelNamespace = SystemProperties.getProperty(ModelConstants.ASDC_MODEL_NAMESPACE); + if ( asdcModelNamespace == null || asdcModelNamespace.isEmpty()) { + asdcModelNamespace = ModelConstants.DEFAULT_ASDC_MODEL_NAMESPACE; + } + } + catch ( Exception e ) { + LOG.error (EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + methodName + "unable to find the value, using the default " + + ModelConstants.DEFAULT_ASDC_MODEL_NAMESPACE); + asdcModelNamespace = ModelConstants.DEFAULT_ASDC_MODEL_NAMESPACE; + } + return (asdcModelNamespace); + } + /** + * Gets the specified property value. If the property is not defined, returns a default value. + * + * @return the property value or a default value + */ + public static String getPropertyWithDefault ( String propName, String defaultValue ) { + String methodName = "getPropertyWithDefault "; + String propValue = defaultValue; + try { + propValue = SystemProperties.getProperty(propName); + if ( propValue == null || propValue.isEmpty()) { + propValue = defaultValue; + } + } + catch ( Exception e ) { + LOG.error (EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + methodName + "unable to find the value, using the default " + + defaultValue); + propValue = defaultValue; + } + return (propValue); + } +} diff --git a/vid-app-common/src/main/resources/json/mso/asyncRequestStatus b/vid-app-common/src/main/resources/json/mso/asyncRequestStatus new file mode 100755 index 00000000..23d2c288 --- /dev/null +++ b/vid-app-common/src/main/resources/json/mso/asyncRequestStatus @@ -0,0 +1,54 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "request structure", + "properties": { + "correlator": { + "description": "Optional correlation Id originally provided with the request in requestInfo", + "type": "string" + }, + "finishTime": { + "description": "Date and time the request was finished in GMT with the following sample format: Wed, 15 Oct 2014 13:01:52 GMT", + "type": "string" + }, + "instanceIds": {}, + "requestId": { + "description": "UUID for the request generated by the instantiation service", + "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$", + "type": "string" + }, + "requestScope": { + "description": "short description of the entity being operated on", + "enum": [ + "network", + "service", + "vfModule", + "vnf", + "volumeGroup" + ], + "type": "string" + }, + "requestStatus": {}, + "requestType": { + "description": "short description of the action being performed on the requestScope", + "enum": [ + "createInstance", + "deleteInstance", + "replaceInstance", + "updateInstance" + ], + "type": "string" + }, + "startTime": { + "description": "Date and time the request was created in GMT with the following sample format: Wed, 15 Oct 2014 13:01:52 GMT", + "type": "string" + } + }, + "required": [ + "requestId", + "requestScope", + "requestStatus", + "requestType", + "startTime" + ], + "type": "object" +} diff --git a/vid-app-common/src/main/resources/json/mso/cloudConfiguration b/vid-app-common/src/main/resources/json/mso/cloudConfiguration new file mode 100755 index 00000000..eb627798 --- /dev/null +++ b/vid-app-common/src/main/resources/json/mso/cloudConfiguration @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "fields communicating the cloud configuration in a standard way", + "type": "object", + "properties": { + "nodeLocation": { + "description": "Location identifier for the node", + "type": "string" + }, + "lcpCloudRegionId": { + "description": "LCP Node Location identifier", + "type": "string" + }, + "tenantId": { + "description": "Openstack tenant id", + "type": "string" + } + } +} \ No newline at end of file diff --git a/vid-app-common/src/main/resources/json/mso/instanceIds b/vid-app-common/src/main/resources/json/mso/instanceIds new file mode 100755 index 00000000..c20ea9ad --- /dev/null +++ b/vid-app-common/src/main/resources/json/mso/instanceIds @@ -0,0 +1,29 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "instanceIds that may be associated with a particular request", + "type": "object", + "properties": { + "networkInstanceId": { + "description": "UUID for the network instance (if any)", + "type": "string" + }, + "serviceInstanceId": { + "description": "UUID for the service instance", + "type": "string" + }, + "vfModuleInstanceId": { + "description": "UUID for the vfModule instance (if any)", + "type": "string" + }, + "vnfInstanceId": { + "description": "UUID for the vnf instance (if any)", + "type": "string" + }, + "volumeGroupInstanceId": { + "description": "UUID for the volume group instance (if any)", + "type": "string" + } + } +} + + \ No newline at end of file diff --git a/vid-app-common/src/main/resources/json/mso/modelInfo b/vid-app-common/src/main/resources/json/mso/modelInfo new file mode 100755 index 00000000..2504d517 --- /dev/null +++ b/vid-app-common/src/main/resources/json/mso/modelInfo @@ -0,0 +1,41 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "fields describing the SDC entity being operated on by the request", + "type": "object", + "properties": { + "modelCustomizationName": { + "description": "reference to the customized set of parameters associated with a model in a given service context", + "type": "string" + }, + "modelInvariantId": { + "description": "Invariant UUID for the model name, irrespective of the version, as defined in SDC--authoritative", + "type": "string", + "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" + }, + "modelName": { + "description": "name of the model as defined in SDC--not authoritative", + "type": "string" + }, + "modelNameVersionId": { + "description": "UUID for the model name and version combination as defined in SDC--authoritative", + "type": "string", + "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" + }, + "modelType": { + "description": "short description of the entity being operated on", + "type": "string", + "enum": [ + "network", + "service", + "vfModule", + "vnf", + "volumeGroup" + ] + }, + "modelVersion": { + "description": "the version of the model as defined in SDC--not authoritative", + "type": "number" + } + }, + "required": ["modelType"] +} \ No newline at end of file diff --git a/vid-app-common/src/main/resources/json/mso/relatedInstance b/vid-app-common/src/main/resources/json/mso/relatedInstance new file mode 100755 index 00000000..89554a54 --- /dev/null +++ b/vid-app-common/src/main/resources/json/mso/relatedInstance @@ -0,0 +1,16 @@ +{ + "description": "modelInfo and optional instanceId and instanceName for a model related to the modelInfo being operated on", + "type": "object", + "properties": { + "instanceName": { + "description": "optional name for the instance Id of the related model", + "type": "string" + }, + "instanceId": { + "description": "instance Id for the related model", + "type": "string" + }, + "modelInfo": {} + }, + "required": ["modelInfo"] +} \ No newline at end of file diff --git a/vid-app-common/src/main/resources/json/mso/relatedModel b/vid-app-common/src/main/resources/json/mso/relatedModel new file mode 100755 index 00000000..a70a1718 --- /dev/null +++ b/vid-app-common/src/main/resources/json/mso/relatedModel @@ -0,0 +1,15 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "modelInfo and optional instance id for a model related to the modelInfo being operated on", + "type": "object", + "properties": { + "instanceId": { + "description": "instance Id for the related model", + "type": "string" + }, + "modelInfo": {} + }, + "required": [ "modelInfo" ] +} + + diff --git a/vid-app-common/src/main/resources/json/mso/request b/vid-app-common/src/main/resources/json/mso/request new file mode 100755 index 00000000..3aaadbfb --- /dev/null +++ b/vid-app-common/src/main/resources/json/mso/request @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "request structure", + "type": "object", + "properties": { + "finishTime": { + "description": "Date and time the request was finished in GMT with the following sample format: Wed, 15 Oct 2014 13:01:52 GMT", + "type": "string" + }, + "instanceIds": {}, + "requestDetails": {}, + "requestId": { + "description": "UUID for the request generated by the instantiation service", + "type": "string", + "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" + }, + "requestScope": { + "description": "short description of the entity being operated on", + "type": "string", + "enum": [ + "network", + "service", + "vfModule", + "vnf", + "volumeGroup" + ] + }, + "requestStatus": {}, + "requestType": { + "description": "short description of the action being performed on the requestScope", + "type": "string", + "enum": [ + "createInstance", + "deleteInstance", + "replaceInstance", + "updateInstance" + ] + }, + "startTime": { + "description": "Date and time the request was created in GMT with the following sample format: Wed, 15 Oct 2014 13:01:52 GMT", + "type": "string" + } + }, + "required": ["requestDetails", "requestId", "requestScope", "requestType", "startTime"] +} \ No newline at end of file diff --git a/vid-app-common/src/main/resources/json/mso/requestDetails b/vid-app-common/src/main/resources/json/mso/requestDetails new file mode 100755 index 00000000..c0ef5304 --- /dev/null +++ b/vid-app-common/src/main/resources/json/mso/requestDetails @@ -0,0 +1,13 @@ +{ + "description": "aggregates the context, configuraiton and detailed parameters associated with the request into a single structure", + "properties": { + "cloudConfiguration": {}, + "modelInfo": {}, + "relatedModelList": {}, + "requestInfo": {}, + "requestParameters": {}, + "subscriberInfo": {} + }, + "type": "object" +} + diff --git a/vid-app-common/src/main/resources/json/mso/requestError b/vid-app-common/src/main/resources/json/mso/requestError new file mode 100755 index 00000000..497f6719 --- /dev/null +++ b/vid-app-common/src/main/resources/json/mso/requestError @@ -0,0 +1,27 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "standard request error data structure", + "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 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" + ], + "type": "object" +} diff --git a/vid-app-common/src/main/resources/json/mso/requestInfo b/vid-app-common/src/main/resources/json/mso/requestInfo new file mode 100755 index 00000000..56db42fc --- /dev/null +++ b/vid-app-common/src/main/resources/json/mso/requestInfo @@ -0,0 +1,44 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "fields providing general context information for the request", + "properties": { + "billingAccountNumber": { + "description": "billing account associated with the model being operated on", + "type": "string" + }, + "callbackUrl": { + "description": "client URL to use for asynchronous responses", + "type": "string" + }, + "correlator": { + "description": "Optional correlationId for async callback requests", + "type": "string" + }, + "instanceName": { + "description": "Client provided name for the instance being operated on by the operation (note: not guaranteed to be unique)", + "type": "string" + }, + "orderNumber": { + "description": "reference to an order", + "type": "string" + }, + "orderVersion": { + "description": "order version number", + "type": "number" + }, + "productFamilyId": { + "description": "UUID for the product family associated with the model being operated on", + "type": "string" + }, + "source": { + "description": "source of the request--not authoritative--actual source revealed via authentication", + "type": "string" + }, + "suppressRollback": { + "description": "true or false boolean indicating whether rollbacks should be suppressed on failures", + "type": "boolean" + } + }, + + "type": "object" +} \ No newline at end of file diff --git a/vid-app-common/src/main/resources/json/mso/requestParameters b/vid-app-common/src/main/resources/json/mso/requestParameters new file mode 100755 index 00000000..010d7871 --- /dev/null +++ b/vid-app-common/src/main/resources/json/mso/requestParameters @@ -0,0 +1,23 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "subscriptionServiceType": { + "type": "string" + }, + "userParams": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + } + } + } + } + } \ No newline at end of file diff --git a/vid-app-common/src/main/resources/json/mso/requestReferences b/vid-app-common/src/main/resources/json/mso/requestReferences new file mode 100755 index 00000000..30f64119 --- /dev/null +++ b/vid-app-common/src/main/resources/json/mso/requestReferences @@ -0,0 +1,18 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "provides the instanceId and requestId associated with the request", + "type": "object", + "properties": { + "instanceId": { + "description": "UUID for the service instance", + "type": "string", + "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" + }, + "requestId": { + "description": "UUID for the request", + "type": "string", + "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" + } + }, + "required": [ "instanceId", "requestId" ] +} diff --git a/vid-app-common/src/main/resources/json/mso/requestStatus b/vid-app-common/src/main/resources/json/mso/requestStatus new file mode 100755 index 00000000..9eacb6bb --- /dev/null +++ b/vid-app-common/src/main/resources/json/mso/requestStatus @@ -0,0 +1,37 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "fields describing the status of a request", + "properties": { + "percentProgress": { + "description": "percentage complete estimate from 0 to 100", + "type": "number" + }, + "requestState": { + "description": "short description of the instantiation state", + "enum": [ + "complete", + "failed", + "inProgress" + ], + "type": "string" + }, + "statusMessage": { + "description": "additional descriptive information about the status", + "type": "string" + }, + "timestamp": { + "description": "GMT Datetime the requestStatus was created e.g.: Wed, 15 Oct 2014 13:01:52 GMT", + "type": "string" + }, + "wasRolledBack": { + "description": "true or false boolean indicating whether the request was rolled back", + "type": "boolean" + } + + }, + "required": [ + "requestState", + "timestamp" + ], + "type": "object" +} diff --git a/vid-app-common/src/main/resources/json/mso/response b/vid-app-common/src/main/resources/json/mso/response new file mode 100755 index 00000000..fa37d2db --- /dev/null +++ b/vid-app-common/src/main/resources/json/mso/response @@ -0,0 +1,13 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "response structure", + "type": "object", + "code": { + "description": "Return code", + "type": "string" + }, + "message": { + "description": "Result message", + "type": "string" + } +} \ No newline at end of file diff --git a/vid-app-common/src/main/resources/json/mso/subscriberInfo b/vid-app-common/src/main/resources/json/mso/subscriberInfo new file mode 100755 index 00000000..df787378 --- /dev/null +++ b/vid-app-common/src/main/resources/json/mso/subscriberInfo @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "fields providing information about the subscriber associated with the request", + "type": "object", + "properties": { + "globalSubscriberId": { + "description": "global Customer Id understood by A&AI", + "type": "string" + }, + "subscriberCommonSiteId": { + "description": "id representing the location of the subscriber", + "type": "string" + }, + "subscriberName": { + "description": "name of the customer or subscriber", + "type": "string" + } + } +} \ No newline at end of file diff --git a/vid-app-common/src/main/webapp/META-INF/MANIFEST.MF b/vid-app-common/src/main/webapp/META-INF/MANIFEST.MF new file mode 100755 index 00000000..5e949512 --- /dev/null +++ b/vid-app-common/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/vid-app-common/src/main/webapp/WEB-INF/defs/definitions.xml b/vid-app-common/src/main/webapp/WEB-INF/defs/definitions.xml new file mode 100755 index 00000000..0355f66c --- /dev/null +++ b/vid-app-common/src/main/webapp/WEB-INF/defs/definitions.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vid-app-common/src/main/webapp/WEB-INF/fusion/defs/definitions.xml b/vid-app-common/src/main/webapp/WEB-INF/fusion/defs/definitions.xml new file mode 100755 index 00000000..3d4c701a --- /dev/null +++ b/vid-app-common/src/main/webapp/WEB-INF/fusion/defs/definitions.xml @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vid-app-common/src/main/webapp/WEB-INF/web.xml b/vid-app-common/src/main/webapp/WEB-INF/web.xml new file mode 100755 index 00000000..7f0a40ef --- /dev/null +++ b/vid-app-common/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,17 @@ + + + + vid-common + + + + + + 7 + COOKIE + + + diff --git a/vid-app-common/src/main/webapp/app/vid/icons/7450-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/7450-icon.png new file mode 100755 index 00000000..52ab2b54 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/7450-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/7450-text.png b/vid-app-common/src/main/webapp/app/vid/icons/7450-text.png new file mode 100755 index 00000000..9b3c3325 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/7450-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/7750-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/7750-icon.png new file mode 100755 index 00000000..9ee5499a Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/7750-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/7750-text.png b/vid-app-common/src/main/webapp/app/vid/icons/7750-text.png new file mode 100755 index 00000000..aeb2dd00 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/7750-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/apn-dns-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/apn-dns-icon.png new file mode 100755 index 00000000..0ba5c523 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/apn-dns-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/apn-dns-text.png b/vid-app-common/src/main/webapp/app/vid/icons/apn-dns-text.png new file mode 100755 index 00000000..46631163 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/apn-dns-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/atcf-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/atcf-icon.png new file mode 100755 index 00000000..2904d277 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/atcf-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/atcf-text.png b/vid-app-common/src/main/webapp/app/vid/icons/atcf-text.png new file mode 100755 index 00000000..1566d5be Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/atcf-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/atgw-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/atgw-icon.png new file mode 100755 index 00000000..2904d277 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/atgw-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/atgw-text.png b/vid-app-common/src/main/webapp/app/vid/icons/atgw-text.png new file mode 100755 index 00000000..f7c50c60 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/atgw-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/bgcf-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/bgcf-icon.png new file mode 100755 index 00000000..2904d277 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/bgcf-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/bgcf-text.png b/vid-app-common/src/main/webapp/app/vid/icons/bgcf-text.png new file mode 100755 index 00000000..b1e0869e Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/bgcf-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/com-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/com-icon.png new file mode 100755 index 00000000..59463a91 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/com-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/cpm-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/cpm-icon.png new file mode 100755 index 00000000..9176a0d2 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/cpm-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/cpm-text.png b/vid-app-common/src/main/webapp/app/vid/icons/cpm-text.png new file mode 100755 index 00000000..5b35e77d Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/cpm-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/default-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/default-icon.png new file mode 100755 index 00000000..296a6f5c Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/default-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/dra-epc-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/dra-epc-icon.png new file mode 100755 index 00000000..74bfcfce Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/dra-epc-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/dra-epc-text.png b/vid-app-common/src/main/webapp/app/vid/icons/dra-epc-text.png new file mode 100755 index 00000000..00f2a2e4 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/dra-epc-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/dra-ims-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/dra-ims-icon.png new file mode 100755 index 00000000..74bfcfce Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/dra-ims-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/dra-ims-text.png b/vid-app-common/src/main/webapp/app/vid/icons/dra-ims-text.png new file mode 100755 index 00000000..1d54d9aa Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/dra-ims-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/dslam-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/dslam-icon.png new file mode 100755 index 00000000..b2a0585a Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/dslam-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/dslam-text.png b/vid-app-common/src/main/webapp/app/vid/icons/dslam-text.png new file mode 100755 index 00000000..1452d2e6 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/dslam-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/eatf-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/eatf-icon.png new file mode 100755 index 00000000..59463a91 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/eatf-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/eatf-text.png b/vid-app-common/src/main/webapp/app/vid/icons/eatf-text.png new file mode 100755 index 00000000..ba9b216d Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/eatf-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/ecscf-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/ecscf-icon.png new file mode 100755 index 00000000..dafbe9e0 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/ecscf-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/ecscf-text.png b/vid-app-common/src/main/webapp/app/vid/icons/ecscf-text.png new file mode 100755 index 00000000..ca98a51d Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/ecscf-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/emsc-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/emsc-icon.png new file mode 100755 index 00000000..2904d277 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/emsc-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/enb-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/enb-icon.png new file mode 100755 index 00000000..e03be510 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/enb-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/enb-text.png b/vid-app-common/src/main/webapp/app/vid/icons/enb-text.png new file mode 100755 index 00000000..9fbf8c29 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/enb-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/enum-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/enum-icon.png new file mode 100755 index 00000000..daee75ac Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/enum-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/enum-text.png b/vid-app-common/src/main/webapp/app/vid/icons/enum-text.png new file mode 100755 index 00000000..f04e3d5c Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/enum-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/esmlc-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/esmlc-icon.png new file mode 100755 index 00000000..2904d277 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/esmlc-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/esmlc-text.png b/vid-app-common/src/main/webapp/app/vid/icons/esmlc-text.png new file mode 100755 index 00000000..0a29e736 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/esmlc-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/ettcs-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/ettcs-icon.png new file mode 100755 index 00000000..6f15bdbf Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/ettcs-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/ettcs-text.png b/vid-app-common/src/main/webapp/app/vid/icons/ettcs-text.png new file mode 100755 index 00000000..6f15bdbf Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/ettcs-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/gmlc-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/gmlc-icon.png new file mode 100755 index 00000000..2904d277 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/gmlc-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/gmlc-text.png b/vid-app-common/src/main/webapp/app/vid/icons/gmlc-text.png new file mode 100755 index 00000000..43cf74d9 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/gmlc-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/hlr-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/hlr-icon.png new file mode 100755 index 00000000..daee75ac Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/hlr-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/hlr-text.png b/vid-app-common/src/main/webapp/app/vid/icons/hlr-text.png new file mode 100755 index 00000000..b2762502 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/hlr-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/hss-epc-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/hss-epc-icon.png new file mode 100755 index 00000000..daee75ac Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/hss-epc-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/hss-epc-text.png b/vid-app-common/src/main/webapp/app/vid/icons/hss-epc-text.png new file mode 100755 index 00000000..9739214f Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/hss-epc-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/hss-ims-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/hss-ims-icon.png new file mode 100755 index 00000000..daee75ac Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/hss-ims-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/hss-ims-text.png b/vid-app-common/src/main/webapp/app/vid/icons/hss-ims-text.png new file mode 100755 index 00000000..ec69f259 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/hss-ims-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/icscf-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/icscf-icon.png new file mode 100755 index 00000000..dafbe9e0 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/icscf-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/icscf-text.png b/vid-app-common/src/main/webapp/app/vid/icons/icscf-text.png new file mode 100755 index 00000000..6dbfc819 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/icscf-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/ipag-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/ipag-icon.png new file mode 100755 index 00000000..6f15bdbf Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/ipag-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/ipag-text.png b/vid-app-common/src/main/webapp/app/vid/icons/ipag-text.png new file mode 100755 index 00000000..6f15bdbf Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/ipag-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/isbc-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/isbc-icon.png new file mode 100755 index 00000000..dafbe9e0 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/isbc-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/isbc-text.png b/vid-app-common/src/main/webapp/app/vid/icons/isbc-text.png new file mode 100755 index 00000000..a842e9ff Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/isbc-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/iwf-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/iwf-icon.png new file mode 100755 index 00000000..a82e73c1 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/iwf-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/iwf-text.png b/vid-app-common/src/main/webapp/app/vid/icons/iwf-text.png new file mode 100755 index 00000000..4d0092eb Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/iwf-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/lrf-rdf-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/lrf-rdf-icon.png new file mode 100755 index 00000000..82b5c473 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/lrf-rdf-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/lrf-rdf-text.png b/vid-app-common/src/main/webapp/app/vid/icons/lrf-rdf-text.png new file mode 100755 index 00000000..14daba85 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/lrf-rdf-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/lrg-rdf-text.png b/vid-app-common/src/main/webapp/app/vid/icons/lrg-rdf-text.png new file mode 100755 index 00000000..3f7e2245 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/lrg-rdf-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/mgc8-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/mgc8-icon.png new file mode 100755 index 00000000..2904d277 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/mgc8-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/mgc8-text.png b/vid-app-common/src/main/webapp/app/vid/icons/mgc8-text.png new file mode 100755 index 00000000..2ba933a7 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/mgc8-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/mgcf-emsc-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/mgcf-emsc-icon.png new file mode 100755 index 00000000..2904d277 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/mgcf-emsc-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/mgcf-emsc-text.png b/vid-app-common/src/main/webapp/app/vid/icons/mgcf-emsc-text.png new file mode 100755 index 00000000..74bf8f2c Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/mgcf-emsc-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/mgw-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/mgw-icon.png new file mode 100755 index 00000000..2904d277 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/mgw-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/mgw-text.png b/vid-app-common/src/main/webapp/app/vid/icons/mgw-text.png new file mode 100755 index 00000000..a2470f5d Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/mgw-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/mind-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/mind-icon.png new file mode 100755 index 00000000..daee75ac Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/mind-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/mind-text.png b/vid-app-common/src/main/webapp/app/vid/icons/mind-text.png new file mode 100755 index 00000000..84f9d86d Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/mind-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/mme-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/mme-icon.png new file mode 100755 index 00000000..58ab86c5 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/mme-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/mme-text.png b/vid-app-common/src/main/webapp/app/vid/icons/mme-text.png new file mode 100755 index 00000000..e524f192 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/mme-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/mrf-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/mrf-icon.png new file mode 100755 index 00000000..59463a91 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/mrf-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/mrf-text.png b/vid-app-common/src/main/webapp/app/vid/icons/mrf-text.png new file mode 100755 index 00000000..fa9a61cc Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/mrf-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/msc-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/msc-icon.png new file mode 100755 index 00000000..2904d277 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/msc-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/msn-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/msn-icon.png new file mode 100755 index 00000000..8386fcb4 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/msn-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/msn-text.png b/vid-app-common/src/main/webapp/app/vid/icons/msn-text.png new file mode 100755 index 00000000..954982f1 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/msn-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/multi-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/multi-icon.png new file mode 100755 index 00000000..296a6f5c Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/multi-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/n7450-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/n7450-icon.png new file mode 100755 index 00000000..1ed07db4 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/n7450-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/n7450-text.png b/vid-app-common/src/main/webapp/app/vid/icons/n7450-text.png new file mode 100755 index 00000000..9b3c3325 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/n7450-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/n7750a-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/n7750a-icon.png new file mode 100755 index 00000000..79ba2fc2 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/n7750a-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/n7750a-text.png b/vid-app-common/src/main/webapp/app/vid/icons/n7750a-text.png new file mode 100755 index 00000000..afad34de Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/n7750a-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/n7750b-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/n7750b-icon.png new file mode 100755 index 00000000..bfce0b12 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/n7750b-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/n7750b-text.png b/vid-app-common/src/main/webapp/app/vid/icons/n7750b-text.png new file mode 100755 index 00000000..afad34de Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/n7750b-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/n7750c-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/n7750c-icon.png new file mode 100755 index 00000000..47870bc5 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/n7750c-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/n7750c-text.png b/vid-app-common/src/main/webapp/app/vid/icons/n7750c-text.png new file mode 100755 index 00000000..afad34de Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/n7750c-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/n7750d-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/n7750d-icon.png new file mode 100755 index 00000000..f407a0f6 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/n7750d-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/n7750d-text.png b/vid-app-common/src/main/webapp/app/vid/icons/n7750d-text.png new file mode 100755 index 00000000..6e25a269 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/n7750d-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/nb-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/nb-icon.png new file mode 100755 index 00000000..e03be510 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/nb-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/nb-text.png b/vid-app-common/src/main/webapp/app/vid/icons/nb-text.png new file mode 100755 index 00000000..bbc1357b Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/nb-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/pas-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/pas-icon.png new file mode 100755 index 00000000..74bfcfce Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/pas-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/pas-text.png b/vid-app-common/src/main/webapp/app/vid/icons/pas-text.png new file mode 100755 index 00000000..48b1e273 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/pas-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/pcef-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/pcef-icon.png new file mode 100755 index 00000000..17ed4a4a Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/pcef-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/pcef-text.png b/vid-app-common/src/main/webapp/app/vid/icons/pcef-text.png new file mode 100755 index 00000000..23faa7d7 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/pcef-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/pcrf-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/pcrf-icon.png new file mode 100755 index 00000000..17ed4a4a Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/pcrf-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/pcrf-text.png b/vid-app-common/src/main/webapp/app/vid/icons/pcrf-text.png new file mode 100755 index 00000000..e48c305e Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/pcrf-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/pcscf-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/pcscf-icon.png new file mode 100755 index 00000000..dafbe9e0 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/pcscf-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/pcscf-text.png b/vid-app-common/src/main/webapp/app/vid/icons/pcscf-text.png new file mode 100755 index 00000000..b8d2c3dc Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/pcscf-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/pgw-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/pgw-icon.png new file mode 100755 index 00000000..2904d277 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/pgw-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/pgw-text.png b/vid-app-common/src/main/webapp/app/vid/icons/pgw-text.png new file mode 100755 index 00000000..d5f86b59 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/pgw-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/plrf-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/plrf-icon.png new file mode 100755 index 00000000..82b5c473 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/plrf-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/plrf-text.png b/vid-app-common/src/main/webapp/app/vid/icons/plrf-text.png new file mode 100755 index 00000000..72662ef4 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/plrf-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/psap-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/psap-icon.png new file mode 100755 index 00000000..2145c5f6 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/psap-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/pstn-tdm-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/pstn-tdm-icon.png new file mode 100755 index 00000000..6f15bdbf Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/pstn-tdm-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/pstn-tdm-text.png b/vid-app-common/src/main/webapp/app/vid/icons/pstn-tdm-text.png new file mode 100755 index 00000000..6f15bdbf Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/pstn-tdm-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/rg-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/rg-icon.png new file mode 100755 index 00000000..2904d277 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/rg-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/rg-text.png b/vid-app-common/src/main/webapp/app/vid/icons/rg-text.png new file mode 100755 index 00000000..ab93224c Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/rg-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/rnc-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/rnc-icon.png new file mode 100755 index 00000000..733d3da5 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/rnc-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/rnc-text.png b/vid-app-common/src/main/webapp/app/vid/icons/rnc-text.png new file mode 100755 index 00000000..24cab754 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/rnc-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/sbc-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/sbc-icon.png new file mode 100755 index 00000000..dafbe9e0 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/sbc-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/sbc-text.png b/vid-app-common/src/main/webapp/app/vid/icons/sbc-text.png new file mode 100755 index 00000000..f71bfba5 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/sbc-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/sccas-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/sccas-icon.png new file mode 100755 index 00000000..59463a91 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/sccas-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/sccas-text.png b/vid-app-common/src/main/webapp/app/vid/icons/sccas-text.png new file mode 100755 index 00000000..1ca4e1dc Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/sccas-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/scscf-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/scscf-icon.png new file mode 100755 index 00000000..dafbe9e0 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/scscf-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/scscf-text.png b/vid-app-common/src/main/webapp/app/vid/icons/scscf-text.png new file mode 100755 index 00000000..fd3cab53 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/scscf-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/sdg-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/sdg-icon.png new file mode 100755 index 00000000..b4c0288b Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/sdg-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/sdg-text.png b/vid-app-common/src/main/webapp/app/vid/icons/sdg-text.png new file mode 100755 index 00000000..3881e662 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/sdg-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/sgsns4-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/sgsns4-icon.png new file mode 100755 index 00000000..8df1aac1 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/sgsns4-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/sgsns4-text.png b/vid-app-common/src/main/webapp/app/vid/icons/sgsns4-text.png new file mode 100755 index 00000000..92cbd290 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/sgsns4-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/sgw-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/sgw-icon.png new file mode 100755 index 00000000..2904d277 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/sgw-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/sgw-text.png b/vid-app-common/src/main/webapp/app/vid/icons/sgw-text.png new file mode 100755 index 00000000..0801d797 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/sgw-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/siad-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/siad-icon.png new file mode 100755 index 00000000..b2a0585a Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/siad-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/siad-text.png b/vid-app-common/src/main/webapp/app/vid/icons/siad-text.png new file mode 100755 index 00000000..323c125e Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/siad-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/ss7-gport-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/ss7-gport-icon.png new file mode 100755 index 00000000..319bb37c Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/ss7-gport-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/ss7-gport-text.png b/vid-app-common/src/main/webapp/app/vid/icons/ss7-gport-text.png new file mode 100755 index 00000000..1ba8a76d Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/ss7-gport-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/ss7gport-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/ss7gport-icon.png new file mode 100755 index 00000000..daee75ac Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/ss7gport-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/ss7gport-text.png b/vid-app-common/src/main/webapp/app/vid/icons/ss7gport-text.png new file mode 100755 index 00000000..8656f9f8 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/ss7gport-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/switch-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/switch-icon.png new file mode 100755 index 00000000..6e512719 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/switch-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/tas-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/tas-icon.png new file mode 100755 index 00000000..59463a91 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/tas-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/tas-text.png b/vid-app-common/src/main/webapp/app/vid/icons/tas-text.png new file mode 100755 index 00000000..7a843e8b Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/tas-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/transcoder-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/transcoder-icon.png new file mode 100755 index 00000000..b2a0585a Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/transcoder-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/transcoder-text.png b/vid-app-common/src/main/webapp/app/vid/icons/transcoder-text.png new file mode 100755 index 00000000..975dd30b Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/transcoder-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/ue-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/ue-icon.png new file mode 100755 index 00000000..e23dfd36 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/ue-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/uephone-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/uephone-icon.png new file mode 100755 index 00000000..50182db9 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/uephone-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/usp-dns-icon.png b/vid-app-common/src/main/webapp/app/vid/icons/usp-dns-icon.png new file mode 100755 index 00000000..0ba5c523 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/usp-dns-icon.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/icons/usp-dns-text.png b/vid-app-common/src/main/webapp/app/vid/icons/usp-dns-text.png new file mode 100755 index 00000000..46de0c26 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/icons/usp-dns-text.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/images/asterisk.png b/vid-app-common/src/main/webapp/app/vid/images/asterisk.png new file mode 100755 index 00000000..2e02da86 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/images/asterisk.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/images/dummy.txt b/vid-app-common/src/main/webapp/app/vid/images/dummy.txt new file mode 100755 index 00000000..e69de29b diff --git a/vid-app-common/src/main/webapp/app/vid/images/error.png b/vid-app-common/src/main/webapp/app/vid/images/error.png new file mode 100755 index 00000000..4fad9853 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/images/error.png differ diff --git a/vid-app-common/src/main/webapp/app/vid/images/spinner.gif b/vid-app-common/src/main/webapp/app/vid/images/spinner.gif new file mode 100755 index 00000000..8ed30cb6 Binary files /dev/null and b/vid-app-common/src/main/webapp/app/vid/images/spinner.gif differ diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/angular-ui-tree.js b/vid-app-common/src/main/webapp/app/vid/scripts/angular-ui-tree.js new file mode 100755 index 00000000..6ec90799 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/angular-ui-tree.js @@ -0,0 +1,1656 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +/** + * @license Angular UI Tree v2.17.0 + * (c) 2010-2016. https://github.com/angular-ui-tree/angular-ui-tree + * License: MIT + */ +(function () { + 'use strict'; + + angular.module('ui.tree', []) + .constant('treeConfig', { + treeClass: 'angular-ui-tree', + emptyTreeClass: 'angular-ui-tree-empty', + hiddenClass: 'angular-ui-tree-hidden', + nodesClass: 'angular-ui-tree-nodes', + nodeClass: 'angular-ui-tree-node', + handleClass: 'angular-ui-tree-handle', + placeholderClass: 'angular-ui-tree-placeholder', + dragClass: 'angular-ui-tree-drag', + dragThreshold: 3, + levelThreshold: 30, + defaultCollapsed: false + }); + +})(); + +(function () { + 'use strict'; + + angular.module('ui.tree') + + .controller('TreeHandleController', ['$scope', '$element', + function ($scope, $element) { + this.scope = $scope; + + $scope.$element = $element; + $scope.$nodeScope = null; + $scope.$type = 'uiTreeHandle'; + + } + ]); +})(); + +(function () { + 'use strict'; + + angular.module('ui.tree') + .controller('TreeNodeController', ['$scope', '$element', + function ($scope, $element) { + this.scope = $scope; + + $scope.$element = $element; + $scope.$modelValue = null; // Model value for node; + $scope.$parentNodeScope = null; // uiTreeNode Scope of parent node; + $scope.$childNodesScope = null; // uiTreeNodes Scope of child nodes. + $scope.$parentNodesScope = null; // uiTreeNodes Scope of parent nodes. + $scope.$treeScope = null; // uiTree scope + $scope.$handleScope = null; // it's handle scope + $scope.$type = 'uiTreeNode'; + $scope.$$allowNodeDrop = false; + $scope.collapsed = false; + $scope.expandOnHover = false; + + $scope.init = function (controllersArr) { + var treeNodesCtrl = controllersArr[0]; + $scope.$treeScope = controllersArr[1] ? controllersArr[1].scope : null; + + // find the scope of it's parent node + $scope.$parentNodeScope = treeNodesCtrl.scope.$nodeScope; + // modelValue for current node + $scope.$modelValue = treeNodesCtrl.scope.$modelValue[$scope.$index]; + $scope.$parentNodesScope = treeNodesCtrl.scope; + treeNodesCtrl.scope.initSubNode($scope); // init sub nodes + + $element.on('$destroy', function () { + treeNodesCtrl.scope.destroySubNode($scope); // destroy sub nodes + }); + }; + + $scope.index = function () { + return $scope.$parentNodesScope.$modelValue.indexOf($scope.$modelValue); + }; + + $scope.dragEnabled = function () { + return !($scope.$treeScope && !$scope.$treeScope.dragEnabled); + }; + + $scope.isSibling = function (targetNode) { + return $scope.$parentNodesScope == targetNode.$parentNodesScope; + }; + + $scope.isChild = function (targetNode) { + var nodes = $scope.childNodes(); + return nodes && nodes.indexOf(targetNode) > -1; + }; + + $scope.prev = function () { + var index = $scope.index(); + if (index > 0) { + return $scope.siblings()[index - 1]; + } + return null; + }; + + $scope.siblings = function () { + return $scope.$parentNodesScope.childNodes(); + }; + + $scope.childNodesCount = function () { + return $scope.childNodes() ? $scope.childNodes().length : 0; + }; + + $scope.hasChild = function () { + return $scope.childNodesCount() > 0; + }; + + $scope.childNodes = function () { + return $scope.$childNodesScope && $scope.$childNodesScope.$modelValue ? + $scope.$childNodesScope.childNodes() : + null; + }; + + $scope.accept = function (sourceNode, destIndex) { + return $scope.$childNodesScope && + $scope.$childNodesScope.$modelValue && + $scope.$childNodesScope.accept(sourceNode, destIndex); + }; + + $scope.remove = function () { + return $scope.$parentNodesScope.removeNode($scope); + }; + + $scope.toggle = function () { + $scope.collapsed = !$scope.collapsed; + $scope.$treeScope.$callbacks.toggle($scope.collapsed, $scope); + }; + + $scope.collapse = function () { + $scope.collapsed = true; + }; + + $scope.expand = function () { + $scope.collapsed = false; + }; + + $scope.depth = function () { + var parentNode = $scope.$parentNodeScope; + if (parentNode) { + return parentNode.depth() + 1; + } + return 1; + }; + + /** + * Returns the depth of the deepest subtree under this node + * @param scope a TreeNodesController scope object + * @returns Depth of all nodes *beneath* this node. If scope belongs to a leaf node, the + * result is 0 (it has no subtree). + */ + function countSubTreeDepth(scope) { + var thisLevelDepth = 0, + childNodes = scope.childNodes(), + childNode, + childDepth, + i; + if (!childNodes || childNodes.length === 0) { + return 0; + } + for (i = childNodes.length - 1; i >= 0 ; i--) { + childNode = childNodes[i], + childDepth = 1 + countSubTreeDepth(childNode); + thisLevelDepth = Math.max(thisLevelDepth, childDepth); + } + return thisLevelDepth; + } + + $scope.maxSubDepth = function () { + return $scope.$childNodesScope ? countSubTreeDepth($scope.$childNodesScope) : 0; + }; + } + ]); +})(); + +(function () { + 'use strict'; + + angular.module('ui.tree') + + .controller('TreeNodesController', ['$scope', '$element', + function ($scope, $element) { + this.scope = $scope; + + $scope.$element = $element; + $scope.$modelValue = null; + $scope.$nodeScope = null; // the scope of node which the nodes belongs to + $scope.$treeScope = null; + $scope.$type = 'uiTreeNodes'; + $scope.$nodesMap = {}; + + $scope.nodropEnabled = false; + $scope.maxDepth = 0; + $scope.cloneEnabled = false; + + $scope.initSubNode = function (subNode) { + if (!subNode.$modelValue) { + return null; + } + $scope.$nodesMap[subNode.$modelValue.$$hashKey] = subNode; + }; + + $scope.destroySubNode = function (subNode) { + if (!subNode.$modelValue) { + return null; + } + $scope.$nodesMap[subNode.$modelValue.$$hashKey] = null; + }; + + $scope.accept = function (sourceNode, destIndex) { + return $scope.$treeScope.$callbacks.accept(sourceNode, $scope, destIndex); + }; + + $scope.beforeDrag = function (sourceNode) { + return $scope.$treeScope.$callbacks.beforeDrag(sourceNode); + }; + + $scope.isParent = function (node) { + return node.$parentNodesScope == $scope; + }; + + $scope.hasChild = function () { + return $scope.$modelValue.length > 0; + }; + + $scope.safeApply = function (fn) { + var phase = this.$root.$$phase; + if (phase == '$apply' || phase == '$digest') { + if (fn && (typeof (fn) === 'function')) { + fn(); + } + } else { + this.$apply(fn); + } + }; + + $scope.removeNode = function (node) { + var index = $scope.$modelValue.indexOf(node.$modelValue); + if (index > -1) { + $scope.safeApply(function () { + $scope.$modelValue.splice(index, 1)[0]; + }); + return $scope.$treeScope.$callbacks.removed(node); + } + return null; + }; + + $scope.insertNode = function (index, nodeData) { + $scope.safeApply(function () { + $scope.$modelValue.splice(index, 0, nodeData); + }); + }; + + $scope.childNodes = function () { + var i, nodes = []; + if ($scope.$modelValue) { + for (i = 0; i < $scope.$modelValue.length; i++) { + nodes.push($scope.$nodesMap[$scope.$modelValue[i].$$hashKey]); + } + } + return nodes; + }; + + $scope.depth = function () { + if ($scope.$nodeScope) { + return $scope.$nodeScope.depth(); + } + return 0; // if it has no $nodeScope, it's root + }; + + // check if depth limit has reached + $scope.outOfDepth = function (sourceNode) { + var maxDepth = $scope.maxDepth || $scope.$treeScope.maxDepth; + if (maxDepth > 0) { + return $scope.depth() + sourceNode.maxSubDepth() + 1 > maxDepth; + } + return false; + }; + + } + ]); +})(); + +(function () { + 'use strict'; + + angular.module('ui.tree') + + .controller('TreeController', ['$scope', '$element', + function ($scope, $element) { + this.scope = $scope; + + $scope.$element = $element; + $scope.$nodesScope = null; // root nodes + $scope.$type = 'uiTree'; + $scope.$emptyElm = null; + $scope.$callbacks = null; + + $scope.dragEnabled = true; + $scope.emptyPlaceholderEnabled = true; + $scope.maxDepth = 0; + $scope.dragDelay = 0; + $scope.cloneEnabled = false; + $scope.nodropEnabled = false; + + // Check if it's a empty tree + $scope.isEmpty = function () { + return ($scope.$nodesScope && $scope.$nodesScope.$modelValue + && $scope.$nodesScope.$modelValue.length === 0); + }; + + // add placeholder to empty tree + $scope.place = function (placeElm) { + $scope.$nodesScope.$element.append(placeElm); + $scope.$emptyElm.remove(); + }; + + this.resetEmptyElement = function () { + if ((!$scope.$nodesScope.$modelValue || $scope.$nodesScope.$modelValue.length === 0) && + $scope.emptyPlaceholderEnabled) { + $element.append($scope.$emptyElm); + } else { + $scope.$emptyElm.remove(); + } + }; + + $scope.resetEmptyElement = this.resetEmptyElement; + } + ]); +})(); + +(function () { + 'use strict'; + + angular.module('ui.tree') + .directive('uiTree', ['treeConfig', '$window', + function (treeConfig, $window) { + return { + restrict: 'A', + scope: true, + controller: 'TreeController', + link: function (scope, element, attrs, ctrl) { + var callbacks = { + accept: null, + beforeDrag: null + }, + config = {}, + tdElm, + $trElm, + emptyElmColspan; + + angular.extend(config, treeConfig); + if (config.treeClass) { + element.addClass(config.treeClass); + } + + if (element.prop('tagName').toLowerCase() === 'table') { + scope.$emptyElm = angular.element($window.document.createElement('tr')); + $trElm = element.find('tr'); + // If we can find a tr, then we can use its td children as the empty element colspan. + if ($trElm.length > 0) { + emptyElmColspan = angular.element($trElm).children().length; + } else { + // If not, by setting a huge colspan we make sure it takes full width. + emptyElmColspan = 1000000; + } + tdElm = angular.element($window.document.createElement('td')) + .attr('colspan', emptyElmColspan); + scope.$emptyElm.append(tdElm); + } else { + scope.$emptyElm = angular.element($window.document.createElement('div')); + } + + if (config.emptyTreeClass) { + scope.$emptyElm.addClass(config.emptyTreeClass); + } + + scope.$watch('$nodesScope.$modelValue.length', function (val) { + if (!angular.isNumber(val)) { + return; + } + + ctrl.resetEmptyElement(); + }, true); + + scope.$watch(attrs.dragEnabled, function (val) { + if ((typeof val) == 'boolean') { + scope.dragEnabled = val; + } + }); + + scope.$watch(attrs.emptyPlaceholderEnabled, function (val) { + if ((typeof val) == 'boolean') { + scope.emptyPlaceholderEnabled = val; + ctrl.resetEmptyElement(); + } + }); + + scope.$watch(attrs.nodropEnabled, function (val) { + if ((typeof val) == 'boolean') { + scope.nodropEnabled = val; + } + }); + + scope.$watch(attrs.cloneEnabled, function (val) { + if ((typeof val) == 'boolean') { + scope.cloneEnabled = val; + } + }); + + scope.$watch(attrs.maxDepth, function (val) { + if ((typeof val) == 'number') { + scope.maxDepth = val; + } + }); + + scope.$watch(attrs.dragDelay, function (val) { + if ((typeof val) == 'number') { + scope.dragDelay = val; + } + }); + + /** + * Callback checks if the destination node can accept the dragged node. + * By default, ui-tree will check that 'data-nodrop-enabled' is not set for the + * destination ui-tree-nodes, and that the 'max-depth' attribute will not be exceeded + * if it is set on the ui-tree or ui-tree-nodes. + * This callback can be overridden, but callers must manually enforce nodrop and max-depth + * themselves if they need those to be enforced. + * @param sourceNodeScope Scope of the ui-tree-node being dragged + * @param destNodesScope Scope of the ui-tree-nodes where the node is hovering + * @param destIndex Index in the destination nodes array where the source node will drop + * @returns {boolean} True if the node is permitted to be dropped here + */ + callbacks.accept = function (sourceNodeScope, destNodesScope, destIndex) { + return !(destNodesScope.nodropEnabled || destNodesScope.$treeScope.nodropEnabled || destNodesScope.outOfDepth(sourceNodeScope)); + }; + + callbacks.beforeDrag = function (sourceNodeScope) { + return true; + }; + + callbacks.expandTimeoutStart = function() + { + + }; + + callbacks.expandTimeoutCancel = function() + { + + }; + + callbacks.expandTimeoutEnd = function() + { + + }; + + callbacks.removed = function (node) { + + }; + + /** + * Callback is fired when a node is successfully dropped in a new location + * @param event + */ + callbacks.dropped = function (event) { + + }; + + /** + * Callback is fired each time the user starts dragging a node + * @param event + */ + callbacks.dragStart = function (event) { + + }; + + /** + * Callback is fired each time a dragged node is moved with the mouse/touch. + * @param event + */ + callbacks.dragMove = function (event) { + + }; + + /** + * Callback is fired when the tree exits drag mode. If the user dropped a node, the drop may have been + * accepted or reverted. + * @param event + */ + callbacks.dragStop = function (event) { + + }; + + /** + * Callback is fired when a user drops a node (but prior to processing the drop action) + * beforeDrop can return a Promise, truthy, or falsy (returning nothing is falsy). + * If it returns falsy, or a resolve Promise, the node move is accepted + * If it returns truthy, or a rejected Promise, the node move is reverted + * @param event + * @returns {Boolean|Promise} Truthy (or rejected Promise) to cancel node move; falsy (or resolved promise) + */ + callbacks.beforeDrop = function (event) { + + }; + + /** + * Callback is fired when a user toggles node (but after processing the toggle action) + * @param sourceNodeScope + * @param collapsed + */ + callbacks.toggle = function (collapsed, sourceNodeScope) { + + }; + + scope.$watch(attrs.uiTree, function (newVal, oldVal) { + angular.forEach(newVal, function (value, key) { + if (callbacks[key]) { + if (typeof value === 'function') { + callbacks[key] = value; + } + } + }); + + scope.$callbacks = callbacks; + }, true); + + + } + }; + } + ]); +})(); + +(function () { + 'use strict'; + + angular.module('ui.tree') + .directive('uiTreeHandle', ['treeConfig', + function (treeConfig) { + return { + require: '^uiTreeNode', + restrict: 'A', + scope: true, + controller: 'TreeHandleController', + link: function (scope, element, attrs, treeNodeCtrl) { + var config = {}; + angular.extend(config, treeConfig); + if (config.handleClass) { + element.addClass(config.handleClass); + } + // connect with the tree node. + if (scope != treeNodeCtrl.scope) { + scope.$nodeScope = treeNodeCtrl.scope; + treeNodeCtrl.scope.$handleScope = scope; + } + } + }; + } + ]); +})(); + +(function () { + 'use strict'; + + angular.module('ui.tree') + + .directive('uiTreeNode', ['treeConfig', 'UiTreeHelper', '$window', '$document', '$timeout', '$q', + function (treeConfig, UiTreeHelper, $window, $document, $timeout, $q) { + return { + require: ['^uiTreeNodes', '^uiTree'], + restrict: 'A', + controller: 'TreeNodeController', + link: function (scope, element, attrs, controllersArr) { + // todo startPos is unused + var config = {}, + hasTouch = 'ontouchstart' in window, + startPos, firstMoving, dragInfo, pos, + placeElm, hiddenPlaceElm, dragElm, + treeScope = null, + elements, // As a parameter for callbacks + dragDelaying = true, + dragStarted = false, + dragTimer = null, + body = document.body, + html = document.documentElement, + document_height, + document_width, + dragStart, + tagName, + dragMove, + dragEnd, + dragStartEvent, + dragMoveEvent, + dragEndEvent, + dragCancelEvent, + dragDelay, + bindDragStartEvents, + bindDragMoveEvents, + unbindDragMoveEvents, + keydownHandler, + outOfBounds, + isHandleChild, + el; + + angular.extend(config, treeConfig); + if (config.nodeClass) { + element.addClass(config.nodeClass); + } + scope.init(controllersArr); + + scope.collapsed = !!UiTreeHelper.getNodeAttribute(scope, 'collapsed') || treeConfig.defaultCollapsed; + scope.expandOnHover = !!UiTreeHelper.getNodeAttribute(scope, 'expandOnHover'); + scope.sourceOnly = scope.nodropEnabled || scope.$treeScope.nodropEnabled; + + scope.$watch(attrs.collapsed, function (val) { + if ((typeof val) == 'boolean') { + scope.collapsed = val; + } + }); + + scope.$watch('collapsed', function (val) { + UiTreeHelper.setNodeAttribute(scope, 'collapsed', val); + attrs.$set('collapsed', val); + }); + + scope.$watch(attrs.expandOnHover, function(val) { + if ((typeof val) == 'boolean') { + scope.expandOnHover = val; + } + }); + + scope.$watch('expandOnHover', function (val) { + UiTreeHelper.setNodeAttribute(scope, 'expandOnHover', val); + attrs.$set('expandOnHover', val); + }); + + scope.$on('angular-ui-tree:collapse-all', function () { + scope.collapsed = true; + }); + + scope.$on('angular-ui-tree:expand-all', function () { + scope.collapsed = false; + }); + + /** + * Called when the user has grabbed a node and started dragging it + * @param e + */ + dragStart = function (e) { + // disable right click + if (!hasTouch && (e.button === 2 || e.which === 3)) { + return; + } + + // event has already fired in other scope + if (e.uiTreeDragging || (e.originalEvent && e.originalEvent.uiTreeDragging)) { + return; + } + + // the node being dragged + var eventElm = angular.element(e.target), + isHandleChild, cloneElm, eventElmTagName, tagName, + eventObj, tdElm, hStyle, + isTreeNode, + isTreeNodeHandle; + + // if the target element is a child element of a ui-tree-handle, + // use the containing handle element as target element + isHandleChild = UiTreeHelper.treeNodeHandlerContainerOfElement(eventElm); + if (isHandleChild) { + eventElm = angular.element(isHandleChild); + } + + cloneElm = element.clone(); + isTreeNode = UiTreeHelper.elementIsTreeNode(eventElm); + isTreeNodeHandle = UiTreeHelper.elementIsTreeNodeHandle(eventElm); + + if (!isTreeNode && !isTreeNodeHandle) { + return; + } + + if (isTreeNode && UiTreeHelper.elementContainsTreeNodeHandler(eventElm)) { + return; + } + + eventElmTagName = eventElm.prop('tagName').toLowerCase(); + if (eventElmTagName == 'input' || + eventElmTagName == 'textarea' || + eventElmTagName == 'button' || + eventElmTagName == 'select') { // if it's a input or button, ignore it + return; + } + + // check if it or it's parents has a 'data-nodrag' attribute + el = angular.element(e.target); + while (el && el[0] && el[0] !== element) { + if (UiTreeHelper.nodrag(el)) { // if the node mark as `nodrag`, DONOT drag it. + return; + } + el = el.parent(); + } + + if (!scope.beforeDrag(scope)) { + return; + } + + e.uiTreeDragging = true; // stop event bubbling + if (e.originalEvent) { + e.originalEvent.uiTreeDragging = true; + } + e.preventDefault(); + eventObj = UiTreeHelper.eventObj(e); + + firstMoving = true; + dragInfo = UiTreeHelper.dragInfo(scope); + + tagName = element.prop('tagName'); + + if (tagName.toLowerCase() === 'tr') { + placeElm = angular.element($window.document.createElement(tagName)); + tdElm = angular.element($window.document.createElement('td')) + .addClass(config.placeholderClass) + .attr('colspan', element[0].children.length); + placeElm.append(tdElm); + } else { + placeElm = angular.element($window.document.createElement(tagName)) + .addClass(config.placeholderClass); + } + hiddenPlaceElm = angular.element($window.document.createElement(tagName)); + if (config.hiddenClass) { + hiddenPlaceElm.addClass(config.hiddenClass); + } + + pos = UiTreeHelper.positionStarted(eventObj, element); + placeElm.css('height', UiTreeHelper.height(element) + 'px'); + + dragElm = angular.element($window.document.createElement(scope.$parentNodesScope.$element.prop('tagName'))) + .addClass(scope.$parentNodesScope.$element.attr('class')).addClass(config.dragClass); + dragElm.css('width', UiTreeHelper.width(element) + 'px'); + dragElm.css('z-index', 9999); + + // Prevents cursor to change rapidly in Opera 12.16 and IE when dragging an element + hStyle = (element[0].querySelector('.angular-ui-tree-handle') || element[0]).currentStyle; + if (hStyle) { + document.body.setAttribute('ui-tree-cursor', $document.find('body').css('cursor') || ''); + $document.find('body').css({'cursor': hStyle.cursor + '!important'}); + } + + if (scope.sourceOnly) { + placeElm.css('display', 'none'); + } + element.after(placeElm); + element.after(hiddenPlaceElm); + if (dragInfo.isClone() && scope.sourceOnly) { + dragElm.append(cloneElm); + } else { + dragElm.append(element); + } + + $document.find('body').append(dragElm); + + dragElm.css({ + 'left': eventObj.pageX - pos.offsetX + 'px', + 'top': eventObj.pageY - pos.offsetY + 'px' + }); + elements = { + placeholder: placeElm, + dragging: dragElm + }; + + bindDragMoveEvents(); + // Fire dragStart callback + scope.$apply(function () { + scope.$treeScope.$callbacks.dragStart(dragInfo.eventArgs(elements, pos)); + }); + + document_height = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight); + document_width = Math.max(body.scrollWidth, body.offsetWidth, html.clientWidth, html.scrollWidth, html.offsetWidth); + }; + + dragMove = function (e) { + var eventObj = UiTreeHelper.eventObj(e), + prev, + next, + leftElmPos, + topElmPos, + top_scroll, + bottom_scroll, + target, + decrease, + targetX, + targetY, + displayElm, + targetNode, + targetElm, + isEmpty, + scrollDownBy, + targetOffset, + targetBefore; + + if (dragElm) { + e.preventDefault(); + + if ($window.getSelection) { + $window.getSelection().removeAllRanges(); + } else if ($window.document.selection) { + $window.document.selection.empty(); + } + + leftElmPos = eventObj.pageX - pos.offsetX; + topElmPos = eventObj.pageY - pos.offsetY; + + //dragElm can't leave the screen on the left + if (leftElmPos < 0) { + leftElmPos = 0; + } + + //dragElm can't leave the screen on the top + if (topElmPos < 0) { + topElmPos = 0; + } + + //dragElm can't leave the screen on the bottom + if ((topElmPos + 10) > document_height) { + topElmPos = document_height - 10; + } + + //dragElm can't leave the screen on the right + if ((leftElmPos + 10) > document_width) { + leftElmPos = document_width - 10; + } + + dragElm.css({ + 'left': leftElmPos + 'px', + 'top': topElmPos + 'px' + }); + + top_scroll = window.pageYOffset || $window.document.documentElement.scrollTop; + bottom_scroll = top_scroll + (window.innerHeight || $window.document.clientHeight || $window.document.clientHeight); + + // to scroll down if cursor y-position is greater than the bottom position the vertical scroll + if (bottom_scroll < eventObj.pageY && bottom_scroll < document_height) { + scrollDownBy = Math.min(document_height - bottom_scroll, 10); + window.scrollBy(0, scrollDownBy); + } + + // to scroll top if cursor y-position is less than the top position the vertical scroll + if (top_scroll > eventObj.pageY) { + window.scrollBy(0, -10); + } + + UiTreeHelper.positionMoved(e, pos, firstMoving); + if (firstMoving) { + firstMoving = false; + return; + } + + // check if add it as a child node first + // todo decrease is unused + decrease = (UiTreeHelper.offset(dragElm).left - UiTreeHelper.offset(placeElm).left) >= config.threshold; + + targetX = eventObj.pageX - ($window.pageXOffset || + $window.document.body.scrollLeft || + $window.document.documentElement.scrollLeft) - + ($window.document.documentElement.clientLeft || 0); + + targetY = eventObj.pageY - ($window.pageYOffset || + $window.document.body.scrollTop || + $window.document.documentElement.scrollTop) - + ($window.document.documentElement.clientTop || 0); + + // Select the drag target. Because IE does not support CSS 'pointer-events: none', it will always + // pick the drag element itself as the target. To prevent this, we hide the drag element while + // selecting the target. + if (angular.isFunction(dragElm.hide)) { + dragElm.hide(); + } else { + displayElm = dragElm[0].style.display; + dragElm[0].style.display = 'none'; + } + + // when using elementFromPoint() inside an iframe, you have to call + // elementFromPoint() twice to make sure IE8 returns the correct value + $window.document.elementFromPoint(targetX, targetY); + + targetElm = angular.element($window.document.elementFromPoint(targetX, targetY)); + + // if the target element is a child element of a ui-tree-handle, + // use the containing handle element as target element + isHandleChild = UiTreeHelper.treeNodeHandlerContainerOfElement(targetElm); + if (isHandleChild) { + targetElm = angular.element(isHandleChild); + } + + if (angular.isFunction(dragElm.show)) { + dragElm.show(); + } else { + dragElm[0].style.display = displayElm; + } + + outOfBounds = !UiTreeHelper.elementIsTreeNodeHandle(targetElm) && + !UiTreeHelper.elementIsTreeNode(targetElm) && + !UiTreeHelper.elementIsTreeNodes(targetElm) && + !UiTreeHelper.elementIsTree(targetElm) && + !UiTreeHelper.elementIsPlaceholder(targetElm); + + // Detect out of bounds condition, update drop target display, and prevent drop + if (outOfBounds) { + + // Remove the placeholder + placeElm.remove(); + + // If the target was an empty tree, replace the empty element placeholder + if (treeScope) { + treeScope.resetEmptyElement(); + treeScope = null; + } + } + + // move horizontal + if (pos.dirAx && pos.distAxX >= config.levelThreshold) { + pos.distAxX = 0; + + // increase horizontal level if previous sibling exists and is not collapsed + if (pos.distX > 0) { + prev = dragInfo.prev(); + if (prev && !prev.collapsed + && prev.accept(scope, prev.childNodesCount())) { + prev.$childNodesScope.$element.append(placeElm); + dragInfo.moveTo(prev.$childNodesScope, prev.childNodes(), prev.childNodesCount()); + } + } + + // decrease horizontal level + if (pos.distX < 0) { + // we can't decrease a level if an item preceeds the current one + next = dragInfo.next(); + if (!next) { + target = dragInfo.parentNode(); // As a sibling of it's parent node + if (target + && target.$parentNodesScope.accept(scope, target.index() + 1)) { + target.$element.after(placeElm); + dragInfo.moveTo(target.$parentNodesScope, target.siblings(), target.index() + 1); + } + } + } + } + + // move vertical + if (!pos.dirAx) { + if (UiTreeHelper.elementIsTree(targetElm)) { + targetNode = targetElm.controller('uiTree').scope; + } else if (UiTreeHelper.elementIsTreeNodeHandle(targetElm)) { + targetNode = targetElm.controller('uiTreeHandle').scope; + } else if (UiTreeHelper.elementIsTreeNode(targetElm)) { + targetNode = targetElm.controller('uiTreeNode').scope; + } else if (UiTreeHelper.elementIsTreeNodes(targetElm)) { + targetNode = targetElm.controller('uiTreeNodes').scope; + } else if (UiTreeHelper.elementIsPlaceholder(targetElm)) { + targetNode = targetElm.controller('uiTreeNodes').scope; + } else if (targetElm.controller('uiTreeNode')) { + // is a child element of a node + targetNode = targetElm.controller('uiTreeNode').scope; + } + + // check it's new position + isEmpty = false; + if (!targetNode) { + return; + } + + // Show the placeholder if it was hidden for nodrop-enabled and this is a new tree + if (targetNode.$treeScope && !targetNode.$parent.nodropEnabled && !targetNode.$treeScope.nodropEnabled) { + placeElm.css('display', ''); + } + + if (targetNode.$type == 'uiTree' && targetNode.dragEnabled) { + isEmpty = targetNode.isEmpty(); // Check if it's empty tree + } + + if (targetNode.$type == 'uiTreeHandle') { + targetNode = targetNode.$nodeScope; + } + + if (targetNode.$type != 'uiTreeNode' + && !isEmpty) { // Check if it is a uiTreeNode or it's an empty tree + return; + } + + // if placeholder move from empty tree, reset it. + if (treeScope && placeElm.parent()[0] != treeScope.$element[0]) { + treeScope.resetEmptyElement(); + treeScope = null; + } + + if (isEmpty) { // it's an empty tree + treeScope = targetNode; + if (targetNode.$nodesScope.accept(scope, 0)) { + targetNode.place(placeElm); + dragInfo.moveTo(targetNode.$nodesScope, targetNode.$nodesScope.childNodes(), 0); + } + } else if (targetNode.dragEnabled()) { // drag enabled + if (angular.isDefined(scope.expandTimeoutOn) && scope.expandTimeoutOn !== targetNode.id) { + $timeout.cancel(scope.expandTimeout); + delete scope.expandTimeout; + delete scope.expandTimeoutOn; + + scope.$callbacks.expandTimeoutCancel(); + } + + if (targetNode.collapsed) { + if (scope.expandOnHover === true || (angular.isNumber(scope.expandOnHover) && scope.expandOnHover === 0)) { + targetNode.collapsed = false; + } else if (scope.expandOnHover !== false && angular.isNumber(scope.expandOnHover) && scope.expandOnHover > 0) { + if (angular.isUndefined(scope.expandTimeoutOn)) { + scope.expandTimeoutOn = targetNode.$id; + + scope.$callbacks.expandTimeoutStart(); + scope.expandTimeout = $timeout(function() + { + scope.$callbacks.expandTimeoutEnd(); + targetNode.collapsed = false; + }, scope.expandOnHover); + } + } + } + + targetElm = targetNode.$element; // Get the element of ui-tree-node + targetOffset = UiTreeHelper.offset(targetElm); + targetBefore = targetNode.horizontal ? eventObj.pageX < (targetOffset.left + UiTreeHelper.width(targetElm) / 2) + : eventObj.pageY < (targetOffset.top + UiTreeHelper.height(targetElm) / 2); + + if (targetNode.$parentNodesScope.accept(scope, targetNode.index())) { + if (targetBefore) { + targetElm[0].parentNode.insertBefore(placeElm[0], targetElm[0]); + dragInfo.moveTo(targetNode.$parentNodesScope, targetNode.siblings(), targetNode.index()); + } else { + targetElm.after(placeElm); + dragInfo.moveTo(targetNode.$parentNodesScope, targetNode.siblings(), targetNode.index() + 1); + } + } else if (!targetBefore && targetNode.accept(scope, targetNode.childNodesCount())) { // we have to check if it can add the dragging node as a child + targetNode.$childNodesScope.$element.append(placeElm); + dragInfo.moveTo(targetNode.$childNodesScope, targetNode.childNodes(), targetNode.childNodesCount()); + } else { + outOfBounds = true; + } + } + } + + scope.$apply(function () { + scope.$treeScope.$callbacks.dragMove(dragInfo.eventArgs(elements, pos)); + }); + } + }; + + dragEnd = function (e) { + var dragEventArgs = dragInfo.eventArgs(elements, pos); + e.preventDefault(); + unbindDragMoveEvents(); + + $timeout.cancel(scope.expandTimeout); + + scope.$treeScope.$apply(function () { + $q.when(scope.$treeScope.$callbacks.beforeDrop(dragEventArgs)) + // promise resolved (or callback didn't return false) + .then(function (allowDrop) { + if (allowDrop !== false && scope.$$allowNodeDrop && !outOfBounds) { // node drop accepted) + dragInfo.apply(); + // fire the dropped callback only if the move was successful + scope.$treeScope.$callbacks.dropped(dragEventArgs); + } else { // drop canceled - revert the node to its original position + bindDragStartEvents(); + } + }) + // promise rejected - revert the node to its original position + .catch(function () { + bindDragStartEvents(); + }) + .finally(function () { + hiddenPlaceElm.replaceWith(scope.$element); + placeElm.remove(); + + if (dragElm) { // drag element is attached to the mouse pointer + dragElm.remove(); + dragElm = null; + } + scope.$treeScope.$callbacks.dragStop(dragEventArgs); + scope.$$allowNodeDrop = false; + dragInfo = null; + + // Restore cursor in Opera 12.16 and IE + var oldCur = document.body.getAttribute('ui-tree-cursor'); + if (oldCur !== null) { + $document.find('body').css({'cursor': oldCur}); + document.body.removeAttribute('ui-tree-cursor'); + } + }); + }); + }; + + dragStartEvent = function (e) { + if (scope.dragEnabled()) { + dragStart(e); + } + }; + + dragMoveEvent = function (e) { + dragMove(e); + }; + + dragEndEvent = function (e) { + scope.$$allowNodeDrop = true; + dragEnd(e); + }; + + dragCancelEvent = function (e) { + dragEnd(e); + }; + + dragDelay = (function () { + var to; + + return { + exec: function (fn, ms) { + if (!ms) { + ms = 0; + } + this.cancel(); + to = $timeout(fn, ms); + }, + cancel: function () { + $timeout.cancel(to); + } + }; + })(); + + /** + * Binds the mouse/touch events to enable drag start for this node + */ + bindDragStartEvents = function () { + element.bind('touchstart mousedown', function (e) { + dragDelay.exec(function () { + dragStartEvent(e); + }, scope.dragDelay || 0); + }); + element.bind('touchend touchcancel mouseup', function () { + dragDelay.cancel(); + }); + }; + bindDragStartEvents(); + + /** + * Binds mouse/touch events that handle moving/dropping this dragged node + */ + bindDragMoveEvents = function () { + angular.element($document).bind('touchend', dragEndEvent); + angular.element($document).bind('touchcancel', dragEndEvent); + angular.element($document).bind('touchmove', dragMoveEvent); + angular.element($document).bind('mouseup', dragEndEvent); + angular.element($document).bind('mousemove', dragMoveEvent); + angular.element($document).bind('mouseleave', dragCancelEvent); + }; + + /** + * Unbinds mouse/touch events that handle moving/dropping this dragged node + */ + unbindDragMoveEvents = function () { + angular.element($document).unbind('touchend', dragEndEvent); + angular.element($document).unbind('touchcancel', dragEndEvent); + angular.element($document).unbind('touchmove', dragMoveEvent); + angular.element($document).unbind('mouseup', dragEndEvent); + angular.element($document).unbind('mousemove', dragMoveEvent); + angular.element($document).unbind('mouseleave', dragCancelEvent); + }; + + keydownHandler = function (e) { + if (e.keyCode == 27) { + scope.$$allowNodeDrop = false; + dragEnd(e); + } + }; + + angular.element($window.document).bind('keydown', keydownHandler); + + //unbind handler that retains scope + scope.$on('$destroy', function () { + angular.element($window.document).unbind('keydown', keydownHandler); + }); + } + }; + } + ]); + +})(); + +(function () { + 'use strict'; + + angular.module('ui.tree') + .directive('uiTreeNodes', ['treeConfig', '$window', + function (treeConfig) { + return { + require: ['ngModel', '?^uiTreeNode', '^uiTree'], + restrict: 'A', + scope: true, + controller: 'TreeNodesController', + link: function (scope, element, attrs, controllersArr) { + + var config = {}, + ngModel = controllersArr[0], + treeNodeCtrl = controllersArr[1], + treeCtrl = controllersArr[2]; + + angular.extend(config, treeConfig); + if (config.nodesClass) { + element.addClass(config.nodesClass); + } + + if (treeNodeCtrl) { + treeNodeCtrl.scope.$childNodesScope = scope; + scope.$nodeScope = treeNodeCtrl.scope; + } else { + // find the root nodes if there is no parent node and have a parent ui-tree + treeCtrl.scope.$nodesScope = scope; + } + scope.$treeScope = treeCtrl.scope; + + if (ngModel) { + ngModel.$render = function () { + scope.$modelValue = ngModel.$modelValue; + }; + } + + scope.$watch(function () { + return attrs.maxDepth; + }, function (val) { + if ((typeof val) == 'number') { + scope.maxDepth = val; + } + }); + + scope.$watch(function () { + return attrs.nodropEnabled; + }, function (newVal) { + if ((typeof newVal) != 'undefined') { + scope.nodropEnabled = true; + } + }, true); + + attrs.$observe('horizontal', function (val) { + scope.horizontal = ((typeof val) != 'undefined'); + }); + + } + }; + } + ]); +})(); + +(function () { + 'use strict'; + + angular.module('ui.tree') + + /** + * @ngdoc service + * @name ui.tree.service:UiTreeHelper + * @requires ng.$document + * @requires ng.$window + * + * @description + * angular-ui-tree. + */ + .factory('UiTreeHelper', ['$document', '$window', 'treeConfig', + function ($document, $window, treeConfig) { + return { + + /** + * A hashtable used to storage data of nodes + * @type {Object} + */ + nodesData: {}, + + setNodeAttribute: function (scope, attrName, val) { + if (!scope.$modelValue) { + return null; + } + var data = this.nodesData[scope.$modelValue.$$hashKey]; + if (!data) { + data = {}; + this.nodesData[scope.$modelValue.$$hashKey] = data; + } + data[attrName] = val; + }, + + getNodeAttribute: function (scope, attrName) { + if (!scope.$modelValue) { + return null; + } + var data = this.nodesData[scope.$modelValue.$$hashKey]; + if (data) { + return data[attrName]; + } + return null; + }, + + /** + * @ngdoc method + * @methodOf ui.tree.service:$nodrag + * @param {Object} targetElm angular element + * @return {Bool} check if the node can be dragged. + */ + nodrag: function (targetElm) { + if (typeof targetElm.attr('data-nodrag') != 'undefined') { + return targetElm.attr('data-nodrag') !== 'false'; + } + return false; + }, + + /** + * get the event object for touches + * @param {[type]} e [description] + * @return {[type]} [description] + */ + eventObj: function (e) { + var obj = e; + if (e.targetTouches !== undefined) { + obj = e.targetTouches.item(0); + } else if (e.originalEvent !== undefined && e.originalEvent.targetTouches !== undefined) { + obj = e.originalEvent.targetTouches.item(0); + } + return obj; + }, + + dragInfo: function (node) { + return { + source: node, + sourceInfo: { + cloneModel: node.$treeScope.cloneEnabled === true ? angular.copy(node.$modelValue) : undefined, + nodeScope: node, + index: node.index(), + nodesScope: node.$parentNodesScope + }, + index: node.index(), + siblings: node.siblings().slice(0), + parent: node.$parentNodesScope, + + // Move the node to a new position + moveTo: function (parent, siblings, index) { + this.parent = parent; + this.siblings = siblings.slice(0); + + // If source node is in the target nodes + var i = this.siblings.indexOf(this.source); + if (i > -1) { + this.siblings.splice(i, 1); + if (this.source.index() < index) { + index--; + } + } + + this.siblings.splice(index, 0, this.source); + this.index = index; + }, + + parentNode: function () { + return this.parent.$nodeScope; + }, + + prev: function () { + if (this.index > 0) { + return this.siblings[this.index - 1]; + } + + return null; + }, + + next: function () { + if (this.index < this.siblings.length - 1) { + return this.siblings[this.index + 1]; + } + + return null; + }, + + isClone: function () { + return this.source.$treeScope.cloneEnabled === true; + }, + + clonedNode: function (node) { + return angular.copy(node); + }, + + isDirty: function () { + return this.source.$parentNodesScope != this.parent || + this.source.index() != this.index; + }, + + isForeign: function () { + return this.source.$treeScope !== this.parent.$treeScope; + }, + + eventArgs: function (elements, pos) { + return { + source: this.sourceInfo, + dest: { + index: this.index, + nodesScope: this.parent + }, + elements: elements, + pos: pos + }; + }, + + apply: function () { + + var nodeData = this.source.$modelValue; + + // nodrop enabled on tree or parent + if (this.parent.nodropEnabled || this.parent.$treeScope.nodropEnabled) { + return; + } + + // node was dropped in the same place - do nothing + if (!this.isDirty()) { + return; + } + + // cloneEnabled and cross-tree so copy and do not remove from source + if (this.isClone() && this.isForeign()) { + this.parent.insertNode(this.index, this.sourceInfo.cloneModel); + } else { // Any other case, remove and reinsert + this.source.remove(); + this.parent.insertNode(this.index, nodeData); + } + } + }; + }, + + /** + * @ngdoc method + * @name ui.tree#height + * @methodOf ui.tree.service:UiTreeHelper + * + * @description + * Get the height of an element. + * + * @param {Object} element Angular element. + * @returns {String} Height + */ + height: function (element) { + return element.prop('scrollHeight'); + }, + + /** + * @ngdoc method + * @name ui.tree#width + * @methodOf ui.tree.service:UiTreeHelper + * + * @description + * Get the width of an element. + * + * @param {Object} element Angular element. + * @returns {String} Width + */ + width: function (element) { + return element.prop('scrollWidth'); + }, + + /** + * @ngdoc method + * @name ui.tree#offset + * @methodOf ui.nestedSortable.service:UiTreeHelper + * + * @description + * Get the offset values of an element. + * + * @param {Object} element Angular element. + * @returns {Object} Object with properties width, height, top and left + */ + offset: function (element) { + var boundingClientRect = element[0].getBoundingClientRect(); + + return { + width: element.prop('offsetWidth'), + height: element.prop('offsetHeight'), + top: boundingClientRect.top + ($window.pageYOffset || $document[0].body.scrollTop || $document[0].documentElement.scrollTop), + left: boundingClientRect.left + ($window.pageXOffset || $document[0].body.scrollLeft || $document[0].documentElement.scrollLeft) + }; + }, + + /** + * @ngdoc method + * @name ui.tree#positionStarted + * @methodOf ui.tree.service:UiTreeHelper + * + * @description + * Get the start position of the target element according to the provided event properties. + * + * @param {Object} e Event + * @param {Object} target Target element + * @returns {Object} Object with properties offsetX, offsetY, startX, startY, nowX and dirX. + */ + positionStarted: function (e, target) { + var pos = {}, + pageX = e.pageX, + pageY = e.pageY; + + if (e.originalEvent && e.originalEvent.touches && (e.originalEvent.touches.length > 0)) { + pageX = e.originalEvent.touches[0].pageX; + pageY = e.originalEvent.touches[0].pageY; + } + pos.offsetX = pageX - this.offset(target).left; + pos.offsetY = pageY - this.offset(target).top; + pos.startX = pos.lastX = pageX; + pos.startY = pos.lastY = pageY; + pos.nowX = pos.nowY = pos.distX = pos.distY = pos.dirAx = 0; + pos.dirX = pos.dirY = pos.lastDirX = pos.lastDirY = pos.distAxX = pos.distAxY = 0; + return pos; + }, + + positionMoved: function (e, pos, firstMoving) { + var pageX = e.pageX, + pageY = e.pageY, + newAx; + if (e.originalEvent && e.originalEvent.touches && (e.originalEvent.touches.length > 0)) { + pageX = e.originalEvent.touches[0].pageX; + pageY = e.originalEvent.touches[0].pageY; + } + // mouse position last events + pos.lastX = pos.nowX; + pos.lastY = pos.nowY; + + // mouse position this events + pos.nowX = pageX; + pos.nowY = pageY; + + // distance mouse moved between events + pos.distX = pos.nowX - pos.lastX; + pos.distY = pos.nowY - pos.lastY; + + // direction mouse was moving + pos.lastDirX = pos.dirX; + pos.lastDirY = pos.dirY; + + // direction mouse is now moving (on both axis) + pos.dirX = pos.distX === 0 ? 0 : pos.distX > 0 ? 1 : -1; + pos.dirY = pos.distY === 0 ? 0 : pos.distY > 0 ? 1 : -1; + + // axis mouse is now moving on + newAx = Math.abs(pos.distX) > Math.abs(pos.distY) ? 1 : 0; + + // do nothing on first move + if (firstMoving) { + pos.dirAx = newAx; + pos.moving = true; + return; + } + + // calc distance moved on this axis (and direction) + if (pos.dirAx !== newAx) { + pos.distAxX = 0; + pos.distAxY = 0; + } else { + pos.distAxX += Math.abs(pos.distX); + if (pos.dirX !== 0 && pos.dirX !== pos.lastDirX) { + pos.distAxX = 0; + } + + pos.distAxY += Math.abs(pos.distY); + if (pos.dirY !== 0 && pos.dirY !== pos.lastDirY) { + pos.distAxY = 0; + } + } + + pos.dirAx = newAx; + }, + + elementIsTreeNode: function (element) { + return typeof element.attr('ui-tree-node') !== 'undefined'; + }, + + elementIsTreeNodeHandle: function (element) { + return typeof element.attr('ui-tree-handle') !== 'undefined'; + }, + elementIsTree: function (element) { + return typeof element.attr('ui-tree') !== 'undefined'; + }, + elementIsTreeNodes: function (element) { + return typeof element.attr('ui-tree-nodes') !== 'undefined'; + }, + elementIsPlaceholder: function (element) { + return element.hasClass(treeConfig.placeholderClass); + }, + elementContainsTreeNodeHandler: function (element) { + return element[0].querySelectorAll('[ui-tree-handle]').length >= 1; + }, + treeNodeHandlerContainerOfElement: function (element) { + return findFirstParentElementWithAttribute('ui-tree-handle', element[0]); + } + }; + } + ]); + + // TODO: optimize this loop + function findFirstParentElementWithAttribute(attributeName, childObj) { + // undefined if the mouse leaves the browser window + if (childObj === undefined) { + return null; + } + var testObj = childObj.parentNode, + count = 1, + // check for setAttribute due to exception thrown by Firefox when a node is dragged outside the browser window + res = (typeof testObj.setAttribute === 'function' && testObj.hasAttribute(attributeName)) ? testObj : null; + while (testObj && typeof testObj.setAttribute === 'function' && !testObj.hasAttribute(attributeName)) { + testObj = testObj.parentNode; + res = testObj; + if (testObj === document.documentElement) { + res = null; + break; + } + count++; + } + + return res; + } + +})(); diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/constants/componentConstants.js b/vid-app-common/src/main/webapp/app/vid/scripts/constants/componentConstants.js new file mode 100755 index 00000000..855f9908 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/constants/componentConstants.js @@ -0,0 +1,148 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +"use strict"; + +appDS2.constant("COMPONENT", (function() { + return { + A_LA_CARTE : "a la carte", + CLOUD_REGION_ID : "cloudRegionID", + COMPONENT_STATUS : "ComponentStatus", + CREATE_COMPONENT : "createComponent", + DELETE_COMPONENT : "deleteComponent", + ENTITY : "entity", + GET_COMPONENT_LIST : "getComponentList", + GET_SUBS : "getSubs", + GET_SUB_DETAILS : "getSubDetails", + GLOBAL_CUSTOMER_ID : "globalCustomerId", + MACRO : "Macro", + MODEL_VERSION_1 : "1", + MSO_CREATE_REQ : "createInstance", + MSO_DELETE_REQ : "deleteInstance", + NAME : "name", + NETWORK : "network", + NETWORKS : "networks", + + QUERY_SERVICE_INSTANCE : "queryServiceInstance", + REFRESH_PROPERTIES : "refreshProperties", + SERVICE : "service", + SERVICE_TYPE : "serviceType", + SHOW_COMPONENT_DETAILS : "showComponentDetails", + STATUS : "status", + SUBSCRIBER_NAME : "subscriberName", + TENANT_ID : "tenantID", + TENANT_NAME : "tenantName", + TRUE : "true", + + VF_MODULE : "vfModule", + VNF : "vnf", + VNF_CODE : "vnfCode", + VNF_FUNCTION : "vnfFunction", + VNF_ROLE : "vnfRole", + VNF_TYPE : "vnfType", + VOLUME_GROUP : "volumeGroup", + + + // IDs + CIDR_MASK_1 : "255.255.255.000", + //COMPONENT_LIST_NAMED_QUERY_ID : "ed0a0f5b-cf79-4784-88b2-911cd726cd3d", + CUSTOMER_ID_1 : "icore9883749", + DELETE_INSTANCE_ID_1 : "ff305d54-75b4-ff1b-fff1-eb6b9e5460ff", + GATEWAY_ADDRESS_1 : "10.10.125.1", + GLOBAL_SUBSCRIBER_ID_1 : "C12345", + INSTANCE_ID_1 : "ff305d54-75b4-431b-adb2-eb6b9e5ff000", + INSTANCE_ID_2 : "ff305d54-75b4-ff1b-adb2-eb6b9e5460ff", + INSTANCE_ID_3 : "ff305d54-75b4-ff1b-bdb2-eb6b9e5460ff", + MODEL_ID_1 : "sn5256d1-5a33-55df-13ab-12abad84e764", + MODEL_ID_2 : "ff5256d1-5a33-55df-aaaa-12abad84e7ff", + MODEL_ID_3 : "ff3514e3-5a33-55df-13ab-12abad84e7ff", + MODEL_ID_4 : "ff5256d1-5a33-55df-13ab-12abad84e7ff", + MODEL_ID_5 : "ff5256d1-5a33-55df-13ab-22abad84e7ff", + MODEL_NAME_VERSION_ID_1 : "ab6478e4-ea33-3346-ac12-ab121484a333", + MODEL_NAME_VERSION_ID_2 : "fe6478e4-ea33-3346-aaaa-ab121484a3fe", + MODEL_NAME_VERSION_ID_3 : "fe6985cd-ea33-3346-ac12-ab121484a3fe", + MODEL_NAME_VERSION_ID_4 : "fe6478e4-ea33-3346-ac12-ab121484a3fe", + MODEL_NAME_VERSION_ID_5 : "fe6478e4-ea33-3346-bc12-ab121484a3fe", + SERVICE_INSTANCE_ID_1 : "bc305d54-75b4-431b-adb2-eb6b9e546014", + SUBSCRIBER_NAME_GED12 : "General Electric Division 12", + VNF_INSTANCE_ID : "VNF_INSTANCE_ID_12345", + VPN_ID_1 : "1a2b3c4d5e6f", + + // PATHS + ASSIGN : "?r=", + AAI_GET_SERVICE_INSTANCE_PATH : "aai_get_service_instance/", + AAI_GET_SERVICES : "aai_get_services", + AAI_GET_TENANTS : "aai_get_tenants/", + AAI_SUB_DETAILS_PATH : "aai_sub_details/", + AAI_SUB_VIEWEDIT_PATH : "aai_sub_viewedit", + ASDC_GETMODEL_PATH : "asdc/getModel/", + CREATE_INSTANCE_PATH : "/models/services/createInstance", + FORWARD_SLASH : "/", + GET_SYSTEM_PROP_VNF_PROV_STATUS_PATH : "get_system_prop_vnf_prov_status", + GET_USER_ID : "getuserID", + INSTANTIATE_ROOT_PATH : "#/instantiate?subscriberId=", + INSTANTIATE_PATH : "/instantiate", + INVALID_STRING : "/INVALID_STRING/", + INVALID_STRING_MSO_CREATE_SVC_INSTANCE : "INVALID_STRING_mso_create_svc_instance", + MSO_CREATE_NW_INSTANCE : "mso_create_nw_instance", + MSO_CREATE_NW_INSTANCE_PATH : "mso_create_nw_instance/", + MSO_CREATE_SVC_INSTANCE : "mso_create_svc_instance", + MSO_DELETE_SVC_INSTANCE_PATH : "mso_delete_svc_instance/", + SELECTED_SERVICE_SUB_PATH : "#/instances/subdetails?selectedServiceSubscription=", + SELECTED_SUB_PATH : "#/instances/subdetails?selectedSubscriber=", + SELECTEDSERVICEINSTANCE_SUB_PATH : "&selectedServiceInstance=", + SELECTEDSUBSCRIBER_SUB_PATH : "&selectedSubscriber=", + SERVICE_TYPE_LIST_PATH : "#/instances/serviceTypes?serviceTypeList=", + SERVICE_MODLES_INSTANCES_SUBSCRIBERS_PATH : 'serviceModels.htm#/instances/subscribers', + SERVICES_DIST_STATUS_PATH : "rest/models/services?distributionStatus=", + SERVICES_PATH : "rest/models/services/", + SERVICETYPE_SUB_PATH : "&serviceType=", + SERVICEINSTANCEID_SUB_PATH : "&serviceInstanceId=", + SERVICEMODELS_INSTANCES_SERVICES_PATH : "serviceModels.htm#/instances/services", + SERVICEMODELS_MODELS_SERVICES_PATH : "serviceModels.htm#/models/services", + SUBDETAILS_SELECTEDSUBSCRIBER : "#subdetails?selectedSubscriber=", + SUBSCRIBERNAME_SUB_PATH : "&subscriberName=", + WELCOME_PATH : "welcome.htm", + + //Template Urls + AAI_GET_SUBS_URL : "app/vid/scripts/view-models/aaiGetSubs.htm", + AAI_GET_SUBSCRIBER_URL : "app/vid/scripts/view-models/aaiGetSubscriberList.htm", + AAI_SERVICE_TYPES_URL : "app/vid/scripts/view-models/aaiServiceTypes.htm", + AAI_SUB_DETAILS_URL : "app/vid/scripts/view-models/aaiSubDetails.htm", + CREATE_INSTANCE_SERVICE_MODELS_URL : "app/vid/scripts/view-models/createInstanceServiceModels.htm", + INSTANTIATE_URL : "app/vid/scripts/view-models/instantiate.htm", + SERVICE_MODELS : "app/vid/scripts/view-models/serviceModels.htm", + + + + FULL_NAME_MAP : { + "model-invariant-id" : "Model ID", + "model-version-id" : "Model Version ID" + }, + PARTIAL_NAME_MAP : { + "id" : "ID", + "uuid" : "UUID", + "vfmodule" : "VF Module", + "vnf" : "VNF", + "volumegroup" : "Volume Group" + } + + }; +})()) diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/constants/fieldConstants.js b/vid-app-common/src/main/webapp/app/vid/scripts/constants/fieldConstants.js new file mode 100755 index 00000000..6dbcbc2f --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/constants/fieldConstants.js @@ -0,0 +1,378 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +"use strict"; + +appDS2.factory("FIELD", [ "PARAMETER", function(PARAMETER) { + + /* + * ID values are typically used internally. + */ + var ID = { + AVAILABLE_VOLUME_GROUP : "availableVolumeGroup", + INSTANCE_NAME : "instanceName", + LCP_REGION : "lcpRegion", + LCP_REGION_TEXT : "lcpRegionText", + PRODUCT_FAMILY : "productFamily", + SERVICE_TYPE : "serviceType", + SUBSCRIBER_NAME : "subscriberName", + SUPPRESS_ROLLBACK : "suppressRollback", + TENANT : "tenant", + VNF_TARGETPROVSTATUS : "target", + + AAI_GET_FULL_SUBSCRIBERS : "aai_get_full_subscribers", + AAI_REFRESH_FULL_SUBSCRIBERS : "aai_refresh_full_subscribers", + AAI_GET_SERVICES : "aai_get_services", + AAI_GET_SUBSCRIBERS : "aai_get_subscribers", + AAI_GET_TENTANTS : "aai_get_tenants", + AAI_REFRESH_SUBSCRIBERS : "aai_refresh_subscribers", + AAI_SUB_DETAILS : "aai_sub_details", + AAI_SUB_VIEWEDIT : "aai_sub_viewedit", + ANGULAR_UI_TREE_COLLAPSEALL : "angular-ui-tree:collapse-all", + ANGULAR_UI_TREE_EXPANDALL : "angular-ui-tree:expand-all", + CATEGORY : "category", + COLOR_8F8 : "#8F8", + COLOR_F88 : "#F88", + COLOR_NONE : "none", + CUSTOMER : "customer", + CUSTOMIZATION_UUID : "customizationUuid", + DESCRIPTION : "description", + GENERIC_VNF : "generic-vnf", + GLOBAL_CUSTOMER_ID : "global-customer-id", + GLOBAL_CUST_ID : "globalCustomerId", + IN_MAINT : "in-maint", + INVENTORY_RESPONSE_ITEMS : "inventory-response-items", + INVENTORY_RESPONSE_ITEM : "inventory-response-item", + L3_NETWORK : "l3-network", + SUB_NET : "subnet", + SUBNET_NAME : "subnet-name", + SUBNET_ID : "subnet-id", + GATEWAY_ADDRESS : "gateway-address", + NETWORK_START_ADDRESS : "network-start-address", + CIDR_MASK : "cidr-mask", + MODEL_CUSTOMIZATION_ID : "model-customization-id", + MODEL_CUSTOMIZATION_NAME : "modelCustomizationName", + MODEL_INVARIANT_ID : "modelInvariantId", + MODEL_INVAR_ID : "model-invariant-id", + MODEL_NAME : "modelName", + MODEL_NAME_VERSION_ID : "modelNameVersionId", + MODEL_VERSION : "modelVersion", + MODEL_VERSION_ID : "model-version-id", + NETWORK_NAME : "network-name", + NETWORK_ID : "network-id", + NETWORK_TYPE : "network-type", + NETWORKS : "networks", + OPERATIONAL_STATUS : "operational-status", + ORCHESTRATION_STATUS : "orchestration-status", + PERCENT_PROGRESS : "precentProgress", + PERSONA_MODEL_ID : "persona-model-id", + PERSONA_MODEL_VERSION : "persona-model-version", + PERSONA_MODEL_CUSTOMIZATION_ID : "persona-model-customization-id", + PROV_STATUS : "prov-status", + REQUEST : "request", + REQUEST_ID : "requestId", + REQUEST_LIST : "requestList", + REQUEST_TYPE : "requestType", + REQUEST_REFERENCES : "requestReferences", + REQUEST_STATE : "requestState", + REQUEST_STATUS : "requestStatus", + RESOURCE_LINK : "resource-link", + RESULT_DATA : "result-data", + SERVICE_DESCRIPTION : "service-description", + SERVICE_ID : "service-id", + SERVICE_INSTANCE : "service-instance", + SERVICE_INSTANCES : "service-instances", + SERVICE_INSTANCE_ID : "service-instance-id", + SERVICE_INSTANCE_NAME : "service-instance-name", + SERVICE_SUBSCRIPTION : "service-subscription", + SERVICE_SUBSCRIPTIONS : "service-subscriptions", + SERVICE_TYPE : "service-type", + STATUS_MESSAGE : "statusMessage", + SUBNAME : "subscriber-name", + TIMESTAMP : "timestamp", + VF_MODULE : "vf-module", + VF_MODULES : "vfModules", + VF_MODULE_ID : "vf-module-id", + VF_MODULE_NAME : "vf-module-name", + VID : "VID", + VNF_ID : "vnf-id", + VNF_NAME : "vnf-name", + VNF_TYPE : "vnf-type", + VNFS : "vnfs", + AVAILABLEVOLUMEGROUPS : "availableVolumeGroups", + VOLUMEGROUPS : "volumeGroups", + VOLUME_GROUP : "volume-group", + VOLUME_GROUP_ID : "volume-group-id", + VOLUME_GROUP_NAME : "volume-group-name", + }; + + var KEY = { + LCP_REGION_TEXT : "LEGACYREGION" + }; + + /* + * NAME values are displayed on GUI pages. + */ + var NAME = { + AVAILABLE_VOLUME_GROUP : "Available Volume Group", + INSTANCE_NAME : "Instance Name", + CUSTOMER_ID : "Customer ID", + LCP_REGION : "LCP Region", + LCP_REGION_TEXT : "Legacy Region", + MODEL_INVARIANT_UUID: "Model Invariant UUID", + MODEL_NAME: "Model Name", + MODEL_VERSION: "Model Version", + MODEL_UUID: "Model UUID", + MODEL_CUSTOMIZATION_UUID: "Model Customization UUID", + MODEL_VNF_TYPE: "NF Type", + MODEL_VNF_ROLE: "NF Role", + MODEL_VNF_FUNCTION: "NF Function", + MODEL_VNF_CODE: "NF Code", + MODEL_CUSTOMIZATION_NAME: "Resource Name", + PRODUCT_FAMILY : "Product Family", + RESOURCE_DESCRIPTION : "Resource Description", + RESOURCE_NAME : "Resource Name", + SERVICE_CATEGORY : "Service Category", + SERVICE_DESCRIPTION : "Service Description", + SERVICE_INSTANCE_ID : "Service Instance ID", + SERVICE_INSTANCE_Id : "Service Instance Id", + SERVICE_INSTANCE_NAME : "Service Instance Name", + SERVICE_INVARIANT_UUID : "Service Invariant UUID", + SERVICE_NAME : "Service Name", + SERVICE_TYPE : "Service Type", + SERVICE_UUID : "Service UUID", + SERVICE_VERSION : "Service Version", + SUBSCRIBER_NAME : "Subscriber Name", + SUPPRESS_ROLLBACK : "Suppress Rollback on Failure", + TENANT : "Tenant", + USER_SERVICE_INSTANCE_NAME : "User Service Instance Name", + VF_MODULE_DESCRIPTION : "VF Module Description", + VF_MODULE_LABEL : "VF Module Label", + VF_MODULE_TYPE : "VF Module Type", + VNF_ORCHESTRATION_STATUS : "Orchestration Status", + VNF_Operational_Status: "Operational Status", + VNF_Current_Prov_Status: "Current Prov_Status", + VNF_Target_Prov_Status: "Target Prov Status", + VNF_VNF_ID : "VNF ID", + VNF_VNF_Name: "VNF Name", + VNF_VNF_Type: "VNF Type", + VNF_Service_ID: "Service ID", + VNF_In_Maint: "In Maint", + VFMDULE_CUSTOMIZATIONUUID: "VF Module Model Customization UUID", + RESOURCE_CUSTOMIZATION_UUID: "Resource Model Customization UUID" + }; + + /* + * PROMPT values are initial values displayed in select lists. + */ + var PROMPT = { + AVAILABLE_VOLUME_GROUP : "Select Volume Group", + DEFAULT_A : "A default", + DEFAULT_B : "B default", + LCP_REGION : "Select LCP Region", + NO_SERVICE_INSTANCE : "No Service Instance Found", + NO_SERVICE_SUB : "No Service Subscription Found", + PRODUCT_FAMILY : "Select Product Family", + REGION : "Please choose a region", + SERVICE_TYPE : "Select Service Type", + SUBSCRIBER_NAME : "Select Subscriber Name", + TARGETPROVSTATUS : "Select Target Prov Status", + TENANT : "Select Tenant Name", + TEXT_INPUT : "Enter data", + SELECT_SERVICE : "Select a service type", + SELECT_SUB : "Select a subscriber name", + FETCHING_SUBS : " Fetching subscriber list from A&AI", + REFRESH_SUB_LIST : "Refreshing subscriber list from A&AI...", + VAR_DESCRIPTION_A : "This variable is 'a'", + VAR_DESCRIPTION_B : "This variable is 'b'", + + }; + + var STATUS = { + // Status + ALL : "ALL", + COMPLETE : "Complete", + DONE : "Done", + ERROR : "Error", + FAILED : "Failed", + FAILED_SERVICE_MODELS_ASDC : "Failed to get service models from SDC.", + FETCHING_SERVICE_TYPES : "Fetching service types list from A&AI", + FETCHING_SERVICE_CATALOG : "Fetching service catalog from AAI. Please wait.", + FETCHING_SERVICE_CATALOG_ASDC : "Fetching service catalog from SDC. Please wait.", + FETCHING_SUB_DETAILS : "Fetching subscriber details from A&AI for ", + FETCHING_SERVICE_INST_DATA : "Fetching service instance data from A&AI for service-instance-id=", + FETCHING_SUBSCRIBER_LIST_AAI : "Fetching subscriber list from A&AI...", + IN_PROGRESS : "In Progress", + IS_SUCCESSFUL : " isSuccessful: ", + MSO_FAILURE : "msoFailure", + NONE : "None", + NOT_FOUND : "Not Found", + NO_SERVICE_SUBSCRIPTION_FOUND : "No Service Subscription Found", + SUBMITTING_REQUEST : "Submitting Request", + SUCCESS_VNF_PROV_STATUS : "Successfully set the VNF's Prov_Status to ", + UNLOCKED : "Unlocked", + + }; + + var STYLE = { + TABLE : "width: auto; margin: 0 auto; border-collapse: collapse; border: none;", + NAME : "width: 220px; text-align: left; vertical-align: middle; font-weight: bold; padding: 3px 5px; border: none;", + VALUE : "width: 400px; text-align: left; vertical-align: middle; padding: 3px 5px; border: none;", + CHECKBOX_VALUE : "width: 400px; text-align: center; vertical-align: middle; padding: 3px 5px; border: none;", + TEXT_INPUT : "height: 25px; padding: 2px 5px;", + CHECKBOX_INPUT : "height: 18px; width: 18px; padding: 2px 5px;", + SELECT : "height: 25px; padding: 2px; text-align: center;", + REQUIRED_LABEL : "width: 25px; padding: 5px 10px 10px 5px;", + + DISABLED : "disabled", + BTN_INACTIVE : "button--inactive", + BTN_PRIMARY : "button--primary", + BTN_TYPE : "btn-type", + MSO_CTRL_BTN : "div[ng-controller=msoCommitController] button", + PRIMARY : "primary", + PROGRESS_BAR_INFO : "progress-bar progress-bar-info", + PROGRESS_BAR_SUCCESS : "progress-bar progress-bar-success", + } + + var ERROR = { + AAI : "A&AI failure - see log below for details", + AAI_ERROR : "A&AI Error", + AAI_FETCHING_CUST_DATA : "Failed to fetch customer data from A&AI: Response Code: ", + FETCHING_SERVICE_TYPES : "Failed to fetch service types from A&AI: Response Code: ", + FETCHING_SERVICES : "Failed to fetch services from A&AI: Response Code: ", + FETCHING_SERVICE_INSTANCE_DATA : "Failed to fetch service instance data from A&AI: Response Code: ", + INVALID_INSTANCE_NAME : "Invalid instance name: ", + INSTANCE_NAME_VALIDATE : "The instance name must contain only alphanumeric or \"_-.\" characters, and must start with an alphabetic character", + MAX_POLLS_EXCEEDED : "Maximum number of poll attempts exceeded", + MISSING_DATA : "Missing data", + MODEL_VERSION_ID_MISSING : "Error: model-version-id is not populated in A&AI", + MSO : "MSO failure - see log below for details", + NO_MATCHING_MODEL : "No matching model found matching the persona Model Id = ", + NO_MATCHING_MODEL_AAI : "No matching model found matching the A&AI model version ID = ", + SELECT : "Please select a subscriber or enter a service instance", + SERVICE_INST_DNE : "That service instance does not exist. Please try again.", + SYSTEM_FAILURE : "System failure", + + } + + /* + * PARAMETER values indicate field configurations that are provided to + * parameter block directives. + */ + + var PARAMETER = { + AVAILABLE_VOLUME_GROUP : { + name : NAME.AVAILABLE_VOLUME_GROUP, + id : ID.AVAILABLE_VOLUME_GROUP, + type : PARAMETER.SELECT, + prompt : PROMPT.AVAILABLE_VOLUME_GROUP, + isRequired : true + }, + INSTANCE_NAME : { + name : NAME.INSTANCE_NAME, + id : ID.INSTANCE_NAME, + isRequired : true + }, + LCP_REGION : { + name : NAME.LCP_REGION, + id : ID.LCP_REGION, + type : PARAMETER.SELECT, + prompt : PROMPT.LCP_REGION, + isRequired : true + }, + VNF_TARGET_PROVSTATUS : { + name : NAME.VNF_Target_Prov_Status, + id : ID.VNF_TARGETPROVSTATUS, + type : PARAMETER.SELECT, + prompt : PROMPT.TARGETPROVSTATUS, + isRequired : true + }, + LCP_REGION_TEXT_HIDDEN : { + id : ID.LCP_REGION_TEXT, + isVisible : false + }, + LCP_REGION_TEXT_VISIBLE : { + name : NAME.LCP_REGION_TEXT, + id : ID.LCP_REGION_TEXT, + isRequired : true, + isVisible : true + }, + PRODUCT_FAMILY : { + name : NAME.PRODUCT_FAMILY, + id : ID.PRODUCT_FAMILY, + type : PARAMETER.SELECT, + prompt : PROMPT.PRODUCT_FAMILY, + isRequired : true + }, + SERVICE_TYPE : { + name : NAME.SERVICE_TYPE, + id : ID.SERVICE_TYPE, + type : PARAMETER.SELECT, + prompt : PROMPT.SERVICE_TYPE, + isRequired : true + }, + SERVICE_TYPE_DISABLED : { + name : NAME.SERVICE_TYPE, + id : ID.SERVICE_TYPE, + type : PARAMETER.SELECT, + isEnabled : false, + isRequired : true + }, + SUPPRESS_ROLLBACK : { + name : NAME.SUPPRESS_ROLLBACK, + id : ID.SUPPRESS_ROLLBACK, + type : PARAMETER.BOOLEAN, + value : false + }, + SUBSCRIBER_NAME : { + name : NAME.SUBSCRIBER_NAME, + id : ID.SUBSCRIBER_NAME, + type : PARAMETER.SELECT, + prompt : PROMPT.SUBSCRIBER_NAME, + isRequired : true + }, + TENANT_DISABLED : { + name : NAME.TENANT, + id : ID.TENANT, + type : PARAMETER.SELECT, + isEnabled : false, + isRequired : true + }, + TENANT_ENABLED : { + name : NAME.TENANT, + id : ID.TENANT, + type : PARAMETER.SELECT, + isEnabled : true, + prompt : PROMPT.TENANT, + isRequired : true + } + }; + + return { + ID : ID, + KEY : KEY, + NAME : NAME, + PARAMETER : PARAMETER, + PROMPT : PROMPT, + STATUS : STATUS, + STYLE : STYLE, + ERROR : ERROR, + } +} ]); diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/constants/parameterConstants.js b/vid-app-common/src/main/webapp/app/vid/scripts/constants/parameterConstants.js new file mode 100755 index 00000000..4e3ad29d --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/constants/parameterConstants.js @@ -0,0 +1,52 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +"use strict"; + +appDS2.constant("PARAMETER", (function() { + return { + BOOLEAN : "boolean", + SELECT : "select", + STRING : "string", + NUMBER : "number", + VALID_VALUES : "valid_values", + EQUAL : "equal", + LENGTH : "length", + MAX_LENGTH : "max_length", + MIN_LENGTH : "min_length", + IN_RANGE : "in_range", + CONSTRAINTS : "constraints", + OPERATOR : "operator", + CONSTRAINT_VALUES : "constraintValues", + DEFAULT : "default", + DESCRIPTION : "description", + TYPE: "type", + INTEGER: "integer", + RANGE: "range", + LIST: "list", + MAP: "map", + REQUIRED: "required", + GREATER_THAN: "greater_than", + LESS_THAN: "less_than", + GREATER_OR_EQUAL: "greater_or_equal", + LESS_OR_EQUAL: "less_or_equal" + + }; +})()) diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/constants/vidConfiguration.js b/vid-app-common/src/main/webapp/app/vid/scripts/constants/vidConfiguration.js new file mode 100755 index 00000000..8fdfd3fc --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/constants/vidConfiguration.js @@ -0,0 +1,99 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +"use strict"; + +appDS2.constant("VIDCONFIGURATION", (function() { + /* + * VNF_STATUS_CHECK_ENABLED: Determines whether VID will check the VNF valid status combination list, before allowing VNF updates. + * Set to false, to disable the check. + */ + var VNF_STATUS_CHECK_ENABLED = false; + /* + * List of valid VNF status combinations + */ + var vnfValidStatusList = [ + { + "provStatus": "preprov", + "orchestrationStatus": "pending-create", + "inMaint": false, + "operationalStatus": null + }, + { + "provStatus": "preprov", + "orchestrationStatus": "created", + "inMaint": false, + "operationalStatus": null + }, + { + "provStatus": "preprov", + "orchestrationStatus": "active", + "inMaint": false, + "operationalStatus": null + }, + { + "provStatus": "nvtprov", + "orchestrationStatus": "active", + "inMaint": false, + "operationalStatus": null + }, + { + "provStatus": "prov", + "orchestrationStatus": "active", + "inMaint": false, + "operationalStatus": "out-of-service-path" + } + ]; + /* + * The model status VID uses to query SDC for a list of models. The possible values are: + * DISTRIBUTION_NOT_APPROVED, + * DISTRIBUTION_APPROVED, + * DISTRIBUTED, + * DISTRIBUTION_REJECTED, + * ALL, + * In the production env, this should always be set to DISTRIBUTED + */ + var ASDC_MODEL_STATUS = "DISTRIBUTED"; + /* + * Max number of times that VID will poll MSO for a given request status + */ + var MSO_MAX_POLLS = 10; + /* + * Number of msecs that VID will wait between MSO polls. + */ + var MSO_POLLING_INTERVAL_MSECS = 10000; + /* + * List of all service model invariant UUIDs that need macro instantiation. + * Example: + * MACRO_SERVICES : ["3cf30cbb-5fe7-4fb3-b049-559a4997b221", "b135a703-bab5-4295-a37f-580a4f2d0961"] + * + */ + var COMPONENT_LIST_NAMED_QUERY_ID = "0367193e-c785-4d5f-9cb8-7bc89dc9ddb7"; + var MACRO_SERVICES = []; + return { + ASDC_MODEL_STATUS : ASDC_MODEL_STATUS, + MSO_MAX_POLLS : MSO_MAX_POLLS, + MSO_POLLING_INTERVAL_MSECS : MSO_POLLING_INTERVAL_MSECS, + VNF_STATUS_CHECK_ENABLED : VNF_STATUS_CHECK_ENABLED, + VNF_VALID_STATUS_LIST : vnfValidStatusList, + MACRO_SERVICES : MACRO_SERVICES, + COMPONENT_LIST_NAMED_QUERY_ID : COMPONENT_LIST_NAMED_QUERY_ID + }; +})()) diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/InstantiationController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/InstantiationController.js new file mode 100755 index 00000000..f928f4ec --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/InstantiationController.js @@ -0,0 +1,1217 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +/** + * The Instantiation (or View/Edit) Controller controls the instantiation/removal of + * deployable objects (Services, VNFs, VF-Modules, Networks, and Volume-Groups) + */ +(function () { + "use strict"; + + appDS2.requires.push('ui.tree'); + + appDS2.controller("InstantiationController", function ($scope, $route, $location, $timeout, COMPONENT, VIDCONFIGURATION, FIELD, DataService, PropertyService, UtilityService, VnfService, $http, vidService) { + + $scope.popup = new Object(); + $scope.defaultBaseUrl = ""; + $scope.responseTimeoutMsec = 60000; + $scope.properties = UtilityService.getProperties(); + $scope.init = function() { + + /* + * These 2 statements should be included in non-test code. + */ + // takes a default value, retrieves the prop value from the file system and sets it + var msecs = PropertyService.retrieveMsoMaxPollingIntervalMsec(); + PropertyService.setMsoMaxPollingIntervalMsec(msecs); + + // takes a default value, retrieves the prop value from the file system and sets it + var polls = PropertyService.retrieveMsoMaxPolls(); + PropertyService.setMsoMaxPolls(polls); + + PropertyService.setServerResponseTimeoutMsec(10000); + + /* + * Common parameters that shows an example of how the view edit screen + * is expected to pass some common service instance values to the + * popups. + */ + +// DataService.setSubscriberName("Mobility"); +// DataService.setGlobalCustomerId("CUSTID12345") +// DataService.setServiceType("Mobility Type 1"); +// DataService.setServiceInstanceName("Example Service Instance Name"); +// DataService.setServiceName("Mobility Service 1"); +// DataService.setServiceInstanceId("mmsc-test-service-instance"); +// DataService.setServiceUuid("XXXX-YYYY-ZZZZ"); +// DataService.setUserServiceInstanceName("USER_SERVICE_INSTANCE_NAME"); + } + + //PropertyService.setMsoBaseUrl("testmso"); + + $scope.convertModel = function(asdcModel) { + if (!asdcModel) return undefined; + var convertedAsdcModel = UtilityService.convertModel(asdcModel); + return convertedAsdcModel; + }; + + $scope.service = { + "model": vidService.getModel(), + "convertedModel": $scope.convertModel(vidService.getModel()), + "instance": vidService.getInstance() + }; + + $scope.returnVfModules = function (vnfInstance) { + + var svcModel = $scope.service.convertedModel; + //var vnfModelInvariantUuid = vnfInstance[FIELD.ID.MODEL_INVAR_ID]; + var vnfModelVersionId = vnfInstance[FIELD.ID.MODEL_VERSION_ID]; // model uuid + var vnfModelCustomizationUuid = vnfInstance[FIELD.ID.MODEL_CUSTOMIZATION_ID]; + + var vnfModel = null; + + if ( (!($scope.isObjectEmpty(svcModel))) && ( !($scope.isObjectEmpty(svcModel.vnfs) ) ) ) { + if ( (svcModel.isNewFlow) && (vnfModelCustomizationUuid != null ) ) { + vnfModel = svcModel.vnfs[vnfModelCustomizationUuid]; + if ( !($scope.isObjectEmpty(vnfModel.vfModules) ) ) { + //console.log ("vnfModel.vfModules: "); console.log (JSON.stringify(vnfModel.vfModules, null, 4)); + return (vnfModel.vfModules); + } + } + else { + // old flow + if ( vnfModelVersionId != null ) { + vnfModel = svcModel.vnfs[vnfModelVersionId]; + if ( !($scope.isObjectEmpty(vnfModel.vfModules) ) ) { + //console.log ("vnfModel.vfModules: "); console.log (JSON.stringify(vnfModel.vfModules, null, 4)); + return (vnfModel.vfModules); + } + } + } + + } + return null; + } + $scope.hasVfModules = function (vnfInstance) { + if ($scope.returnVfModules(vnfInstance) != null ){ + return true; + } + return false; + } + $scope.returnVolumeGroups = function (vnfInstance) { + + var svcModel = $scope.service.convertedModel; + + //var vnfModelInvariantUuid = vnfInstance[FIELD.ID.MODEL_INVAR_ID]; + var vnfModelVersionId = vnfInstance[FIELD.ID.MODEL_VERSION_ID]; + var vnfModelCustomizationUuid = vnfInstance[FIELD.ID.MODEL_CUSTOMIZATION_ID]; + + var vnfModel = null; + + if ( (!($scope.isObjectEmpty(svcModel))) && ( !($scope.isObjectEmpty(svcModel.vnfs) ) ) ) { + if ( (svcModel.isNewFlow) && (vnfModelCustomizationUuid != null ) ) { + vnfModel = svcModel.vnfs[vnfModelCustomizationUuid]; + if ( !($scope.isObjectEmpty(vnfModel.volumeGroups) ) ) { + //console.log ("vnfModel.volumeGroups: "); console.log (JSON.stringify(vnfModel.volumeGroups, null, 4)); + return (vnfModel.volumeGroups); + } + } + else { + // old flow + if ( vnfModelVersionId != null ) { + vnfModel = svcModel.vnfs[vnfModelVersionId]; + if ( !($scope.isObjectEmpty(vnfModel.volumeGroups) ) ) { + //console.log ("vnfModel.vfModules: "); console.log (JSON.stringify(vnfModel.volumeGroups, null, 4)); + return (vnfModel.volumeGroups); + } + } + } + + } + return null; + } + $scope.hasVolumeGroups = function (vnfInstance) { + if ($scope.returnVolumeGroups(vnfInstance) != null ){ + return true; + } + return false; + } + $scope.deleteNetwork = function(serviceObject, network) { + + console.log("Removing Network " + network.name); + + //Send delete network request to MSO + + //var networks = this.service.instance.networks; + + //networks.splice(networks.indexOf(network), 1); + + //Retrieve updated data from A&AI + var serviceInstance = serviceObject.object; + var svcModel = $scope.service.convertedModel; + var netModel; + DataService.setInventoryItem(network.object); + // set model default and override later if found + DataService.setModelInfo(COMPONENT.NETWORK, {}); + + if ( network.object != null ) { + + //var netModelInvariantUuid = network.object[FIELD.ID.MODEL_INVAR_ID]; + var netModelVersionId = network.object[FIELD.ID.MODEL_VERSION_ID]; // model uuid + var netModelCustomizationUuid = network.object[FIELD.ID.MODEL_CUSTOMIZATION_ID]; + + if ( (!($scope.isObjectEmpty(svcModel))) && ( !($scope.isObjectEmpty(svcModel.networks) ) ) ) { + if ( (svcModel.isNewFlow) && (UtilityService.hasContents(netModelCustomizationUuid) ) ) { + netModel = svcModel.networks[netModelCustomizationUuid]; + } + else { + + if ( UtilityService.hasContents(netModelVersionId) ) { + netModel = svcModel.networks[netModelVersionId]; + } + + } + } + } + if (!($scope.isObjectEmpty(netModel) ) ) { + DataService.setModelInfo(COMPONENT.NETWORK, { + "modelInvariantId": netModel.invariantUuid, + "modelVersion": netModel.version, + "modelNameVersionId": netModel.uuid, + "modelCustomizationName": netModel.modelCustomizationName, + "customizationUuid": netModel.customizationUuid, + "modelName": netModel.name, + "inputs": "" + }); + } + + DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]); + DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]); + DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]); + + DataService.setGlobalCustomerId(serviceObject[FIELD.ID.GLOBAL_CUST_ID]); + DataService.setServiceInstanceName($scope.service.instance.name); + DataService.setServiceName($scope.service.model.service.name); + DataService.setServiceUuid($scope.service.model.service.uuid); + DataService.setNetworkInstanceId(network.object[FIELD.ID.NETWORK_ID]); + + $scope.$broadcast(COMPONENT.DELETE_COMPONENT, { + componentId : COMPONENT.NETWORK, + callbackFunction : deleteCallbackFunction + }); + }; + + $scope.deleteService = function(serviceObject) { + + var serviceInstance = serviceObject.object; + + console.log("Removing Service " + $scope.service.instance.name); + + DataService.setALaCarte (true); + DataService.setInventoryItem(serviceInstance); + + DataService.setModelInfo(COMPONENT.SERVICE, { + "modelInvariantId": serviceInstance[FIELD.ID.MODEL_INVAR_ID], + "modelVersion": $scope.service.model.service.version, + "modelNameVersionId": $scope.service.model.service.uuid, + "modelName": $scope.service.model.service.name, + "inputs": "" + }); + + DataService.setSubscriberName(serviceObject[FIELD.ID.SUBSCRIBER_NAME]); + DataService.setServiceType(serviceObject[FIELD.ID.SERVICE_TYPE]); + DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]); + + DataService.setGlobalCustomerId(serviceObject[COMPONENT.GLOBAL_CUSTOMER_ID]); + DataService.setServiceInstanceName($scope.service.instance.name); + + DataService.setServiceName($scope.service.model.service.name); + + DataService.setServiceUuid($scope.service.model.service.uuid); + + $scope.$broadcast(COMPONENT.DELETE_COMPONENT, { + componentId : COMPONENT.SERVICE, + callbackFunction : deleteServiceInstanceCallbackFunction + }); + + }; + + $scope.deleteVfModule = function(serviceObject, vfModule, vnf) { + + console.log("Removing VF-Module " + vfModule.name); + + var serviceInstance = serviceObject.object; + + DataService.setInventoryItem(vfModule.object); + + var svcModel = $scope.service.convertedModel; + + //var vnfModelInvariantUuid = vnf.object[FIELD.ID.MODEL_INVAR_ID]; + var vnfModelVersionId = vnf.object[FIELD.ID.MODEL_VERSION_ID]; + var vnfModelCustomizationUuid = vnf.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];; + var vfModuleInstanceID = vfModule.object[FIELD.ID.VF_MODULE_ID]; + if (vfModuleInstanceID == null) { + vfModuleInstanceID = ""; + } + + var vnfModel = null; + var vfModuleModel = null; + + DataService.setModelInfo(COMPONENT.VF_MODULE, { + "modelInvariantId": "", + "modelVersion": "", + "modelNameVersionId": "", + "modelCustomizationName": "", + "customizationUuid": "", + "modelName": "", + "inputs": "" + }); + + if ( (!($scope.isObjectEmpty(svcModel))) && ( !($scope.isObjectEmpty(svcModel.vnfs) ) ) ) { + if ( (svcModel.isNewFlow) && (vnfModelCustomizationUuid != null ) ) { + vnfModel = svcModel.vnfs[vnfModelCustomizationUuid]; + + var vfModuleCustomizationUuid = vfModule.object[FIELD.ID.MODEL_CUSTOMIZATION_ID]; + if ( !($scope.isObjectEmpty(vnfModel.vfModules) ) && UtilityService.hasContents(vfModuleCustomizationUuid) ) { + + vfModuleModel = vnfModel.vfModules[vfModuleCustomizationUuid]; + + } + } + else { + // old flow + if (vnfModelVersionId != null ) { + vnfModel = svcModel.vnfs[vnfModelVersionId]; + } + //var vfModuleInvariantUuid = vfModule.object[FIELD.ID.MODEL_INVAR_ID]; + var vfModuleModelVersionId = vfModule.object[FIELD.ID.MODEL_VERSION_ID]; + if ( (!($scope.isObjectEmpty(vnfModel))) && (!($scope.isObjectEmpty(vnfModel.vfModules))) && + UtilityService.hasContents(vfModuleModelVersionId) ) { + vfModuleModel = vnfModel.vfModules[vfModuleModelVersionId]; + } + } + if ( !($scope.isObjectEmpty(vfModuleModel)) ) { + DataService.setModelInfo(COMPONENT.VF_MODULE, { + "modelInvariantId": vfModuleModel.invariantUuid, + "modelVersion": vfModuleModel.version, + "modelNameVersionId": vfModuleModel.uuid, + "modelCustomizationName": vfModuleModel.modelCustomizationName, + "customizationUuid": vfModuleModel.customizationUuid, + "modelName": vfModuleModel.name, + "inputs": "" + }); + } + } + + DataService.setVnfInstanceId(vnf.object[FIELD.ID.VNF_ID]); + DataService.setVfModuleInstanceId(vfModuleInstanceID); + + DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]); + DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]); + DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]); + + DataService.setGlobalCustomerId(serviceObject[FIELD.ID.GLOBAL_CUST_ID]); + DataService.setServiceInstanceName($scope.service.instance.name); + + DataService.setServiceName($scope.service.model.service.name); + + DataService.setServiceUuid($scope.service.model.service.uuid); + + $scope.$broadcast(COMPONENT.DELETE_COMPONENT, { + componentId : COMPONENT.VF_MODULE, + callbackFunction : deleteCallbackFunction + }); + + return; + + }; + + $scope.deleteVnf = function(serviceObject, vnf) { + + console.log("Removing VNF " + vnf.name); + + var serviceInstance = serviceObject.object; + var svcModel = $scope.service.convertedModel; + DataService.setInventoryItem(vnf.object); + + /*var vnftype = vnf.object['vnf-type']; + if (vnftype == null) + vnftype = ""; + else + { + var n = vnftype.search("/"); + if (n >= 0) + vnftype = vnftype.substring(n+1); + }*/ + + var svcModel = $scope.service.convertedModel; + var vnfModelInvariantUuid = null; + var vnfModelVersion = null; + var vnfModelCustomizationUuid = null; + var vnfModel = null; + + vnfModelInvariantUuid = vnf.object[FIELD.ID.MODEL_INVAR_ID]; + vnfModelVersionId = vnf.object[FIELD.ID.MODEL_VERSION_ID]; + vnfModelCustomizationUuid = vnf.object[FIELD.ID.MODEL_CUSTOMIZATION_ID]; + + DataService.setModelInfo(COMPONENT.VNF, { + "modelInvariantId": vnfModelInvariantUuid, + "modelVersion": "", + "modelNameVersionId": vnfModelVersionId, + "modelCustomizationName": "", + "customizationUuid": vnfModelCustomizationUuid, + "modelName": "", + "inputs": "" + }); + + if ( (!($scope.isObjectEmpty(svcModel))) && ( !($scope.isObjectEmpty(svcModel.vnfs) ) ) ) { + if ( (svcModel.isNewFlow) && (vnfModelCustomizationUuid != null ) ) { + vnfModel = svcModel.vnfs[vnfModelCustomizationUuid]; + } + else { + vnfModel = svcModel.vnfs[vnfModelVersionId]; + } + //console.log ( "vnf models: "); console.log ( JSON.stringify ($scope.service.convertedModel.vnfs, null, 4) ); + if ( !($scope.isObjectEmpty(vnfModel) ) ) { + + DataService.setModelInfo(COMPONENT.VNF, { + "modelInvariantId": vnfModel.invariantUuid, + "modelVersion": vnfModel.version, + "modelNameVersionId": vnfModel.uuid, + "modelCustomizationName": vnfModel.modelCustomizationName, + "customizationUuid": vnfModel.customizationUuid, + "modelName": vnfModel.name, + "inputs": "" + }); + } + } + + DataService.setVnfInstanceId(vnf.object[FIELD.ID.VNF_ID]); + + DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]); + DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]); + DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]); + + DataService.setGlobalCustomerId(serviceObject[FIELD.ID.GLOBAL_CUST_ID]); + DataService.setServiceInstanceName($scope.service.instance.name); + + DataService.setServiceName($scope.service.model.service.name); + + DataService.setServiceUuid($scope.service.model.service.uuid); + + $scope.$broadcast(COMPONENT.DELETE_COMPONENT, { + componentId : COMPONENT.VNF, + callbackFunction : deleteCallbackFunction + }); + + }; + + + + $scope.deleteVolumeGroup = function(serviceObject, vnf, vfModule, volumeGroup) { + + console.log("Removing Volume Group " + volumeGroup.name); + var haveModel = false; + var svcModel = $scope.service.convertedModel; + + var vnfModelInvariantUuid = null; + var vnfModelVersion = null; + var vnfModelCustomizationUuid = null; + var vnfModel = null; + + vnfModelInvariantUuid = vnf.object[FIELD.ID.MODEL_INVAR_ID]; + vnfModelVersionId = vnf.object[FIELD.ID.MODEL_VERSION_ID]; + vnfModelCustomizationUuid = vnf.object[FIELD.ID.MODEL_CUSTOMIZATION_ID]; + + DataService.setModelInfo(COMPONENT.VOLUME_GROUP, { + "modelInvariantId": "", + "modelVersion": "", + "modelNameVersionId": "", + "modelCustomizationName": "", + "customizationUuid": "", + "modelName": "", + "inputs": "" + }); + + if ( (!($scope.isObjectEmpty(svcModel))) && ( !($scope.isObjectEmpty(svcModel.vnfs) ) ) ) { + if ( (svcModel.isNewFlow) && (vnfModelCustomizationUuid != null ) ) { + vnfModel = svcModel.vnfs[vnfModelCustomizationUuid]; + } + else { + vnfModel = svcModel.vnfs[vnfModelVersionId]; + } + } + + + // volume groups don't have model-invariant-id/version in a&ai. + // Their model-invariant-id/version is the one for the associated vfModule + + var vfModuleInvariantUuid = vfModule.object[FIELD.ID.MODEL_INVAR_ID]; + var vfModuleModelVersionId = vfModule.object[FIELD.ID.MODEL_VERSION_ID]; + var vfModuleCustomizationUuid = vfModule.object[FIELD.ID.MODEL_CUSTOMIZATION_ID]; + var volGroupModel = null; + + if ( !($scope.isObjectEmpty(vnfModel.volumeGroups) ) ) { + if ( ( !($scope.isObjectEmpty(vnfModel) ) ) && ( !($scope.isObjectEmpty(vnfModel.volumeGroups) ) ) ) { + if ( (svcModel.isNewFlow) && (UtilityService.hasContents(vfModuleCustomizationUuid) ) ){ + volGroupModel = vnfModel.volumeGroups[vfModuleCustomizationUuid]; + } + else { + volGroupModel = vnfModel.volumeGroups[vfModuleModelVersionId]; + } + if ( !($scope.isObjectEmpty(volGroupModel) ) ) { + DataService.setModelInfo(COMPONENT.VOLUME_GROUP, { + "modelInvariantId": volGroupModel.invariantUuid, + "modelVersion": volGroupModel.version, + "modelNameVersionId": volGroupModel.uuid, + "modelCustomizationName": volGroupModel.modelCustomizationName, + "customizationUuid": volGroupModel.customizationUuid, + "modelName": volGroupModel.name, + "inputs": "" + }); + + } + } + } + + var serviceInstance = serviceObject.object; + + DataService.setInventoryItem(volumeGroup.object); + + DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]); + DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]); + DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]); + + DataService.setGlobalCustomerId(serviceObject[FIELD.ID.GLOBAL_CUST_ID]); + DataService.setServiceInstanceName($scope.service.instance.name); + + DataService.setServiceName($scope.service.model.service.name); + + DataService.setServiceUuid($scope.service.model.service.uuid); + DataService.setVnfInstanceId(vnf.nodeId); + DataService.setVolumeGroupInstanceId(volumeGroup.nodeId); + + $scope.$broadcast(COMPONENT.DELETE_COMPONENT, { + componentId : COMPONENT.VOLUME_GROUP, + }); + }; + + $scope.deleteVnfVolumeGroup = function(serviceObject, vnf, volumeGroup) { + + console.log("Removing Volume Group " + volumeGroup.name); + var serviceInstance = serviceObject.object; + + DataService.setInventoryItem(volumeGroup.object); + + var svcModel = $scope.service.convertedModel; + + var vnfModelInvariantUuid = vnf.object[FIELD.ID.MODEL_INVAR_ID]; + var vnfModelVersionId = vnf.object[FIELD.ID.MODEL_VERSION_ID]; + var vnfModelCustomizationUuid = vnf.object[FIELD.ID.MODEL_CUSTOMIZATION_ID]; + + var volGroupModelInvariantUuid = volumeGroup.object[FIELD.ID.MODEL_INVAR_ID]; + var volGroupModelVersionId = volumeGroup.object[FIELD.ID.MODEL_VERSION_ID]; + var volGroupModelCustomizationUuid = volumeGroup.object[FIELD.ID.MODEL_CUSTOMIZATION_ID]; + + var vnfModel = null; + var volGroupModel = null; + + // send an empty model by default since model is not required for deletes + DataService.setModelInfo(COMPONENT.VOLUME_GROUP, {}); + + if ( svcModel.isNewFlow ) { + vnfModel = svcModel.vnfs[vnfModelCustomizationUuid]; + if ( UtilityService.hasContents (volGroupModelCustomizationUuid) ) { + volGroupModel = vnfModel.volumeGroups[volGroupModelCustomizationUuid]; + } + } + else { + + vnfModel = svcModel.vnfs[vnfModelVersionId]; + if ( UtilityService.hasContents (volGroupModelVersionId) ) { + volGroupModel = vnfModel.volumeGroups[volGroupModelVersionId]; + } + } + if ( !($scope.isObjectEmpty(volGroupModel) ) ) { + DataService.setModelInfo(COMPONENT.VOLUME_GROUP, { + "modelInvariantId": volGroupModel.invariantUuid, + "modelVersion": volGroupModel.version, + "modelNameVersionId": volGroupModel.uuid, + "modelName": volGroupModel.name, + "modelCustomizationName": volGroupModel.modelCustomizationName, + "customizationUuid": volGroupModel.customizationUuid, + "inputs": "" + }); + } + + DataService.setVnfInstanceId(vnf.object[FIELD.ID.VNF_ID]); + + DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]); + DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]); + DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]); + + DataService.setGlobalCustomerId(serviceObject[FIELD.ID.GLOBAL_CUST_ID]); + DataService.setServiceInstanceName($scope.service.instance.name); + + DataService.setServiceName($scope.service.model.service.name); + + DataService.setServiceUuid($scope.service.model.service.uuid); + DataService.setVnfInstanceId(vnf.nodeId); + DataService.setVolumeGroupInstanceId(volumeGroup.nodeId); + + $scope.$broadcast(COMPONENT.DELETE_COMPONENT, { + componentId : COMPONENT.VOLUME_GROUP, + callbackFunction : deleteCallbackFunction + }); + }; + + $scope.describeNetwork = function(serviceObject, networkObject) { + var serviceInstance = serviceObject.object; + var network = networkObject.object; + //console.log ("networkObject="); console.log (JSON.stringify(networkObject, null, 4)); + + DataService.setResCustomizationUuid(" "); + + var svcModel = $scope.service.convertedModel; + var netModel = null; + + if ( !($scope.isObjectEmpty(network) ) ) { + + var netModelInvariantUuid = network[FIELD.ID.MODEL_INVAR_ID]; + var netModelVersionId = network[FIELD.ID.MODEL_VERSION_ID]; + var netModelCustomizationUuid = network[FIELD.ID.MODEL_CUSTOMIZATION_ID]; + + if ( UtilityService.hasContents (netModelCustomizationUuid) ) { + // set it to what came from a&ai + DataService.setResCustomizationUuid(netModelCustomizationUuid); + } + + if ( (!($scope.isObjectEmpty(svcModel))) && (!($scope.isObjectEmpty(svcModel.networks))) ) { + if ( svcModel.isNewFlow ) { + netModel = svcModel.networks[netModelCustomizationUuid]; + } + else { + netModel = svcModel.networks[netModelVersionId]; + } + /* + * The details pop-up should use a&ai info + * if ( !($scope.isObjectEmpty(netModel) ) ) { + if (UtilityService.hasContents(netModel.customizationUuid)) { + DataService.setResCustomizationUuid(netModel.customizationUuid); + } + }*/ + } + } + + DataService.setNetworkInstanceId(network[FIELD.ID.NETWORK_ID]); + DataService.setInventoryItem(networkObject); + DataService.setSubscriberName(serviceObject.subscriberName); + DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]); + DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]); + + $scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, { + componentId : COMPONENT.NETWORK + }); + }; + + // for service instance id - no need for this! + $scope.describeService = function(serviceObject) { + var serviceInstance = serviceObject.object; + + DataService.setInventoryItem(serviceInstance); + //DataService.setModelInfo(serviceInstance['service-instance-id'], serviceInstance); + + DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]); + DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]); + DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]); + + //Display popup with additional service information + $scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, { + componentId : COMPONENT.SERVICE + }); + + }; + + $scope.describeVfModule = function(serviceObject, vfModuleObject, vnf) { + var serviceInstance = serviceObject.object; + var vfModule = vfModuleObject.object; + + /*var vfModuleInvariantUuid = vfModule[FIELD.ID.MODEL_INVAR_ID]; + var vfModuleModelVersionId = vfModule[FIELD.ID.MODEL_VERSION_ID];*/ + var vfModuleCustomizationUuid = vfModule[FIELD.ID.MODEL_CUSTOMIZATION_ID]; + + DataService.setCustomizationUuid(" "); + if ( UtilityService.hasContents (vfModuleCustomizationUuid) ) { + DataService.setCustomizationUuid(vfModuleCustomizationUuid); + } + + //Display popup with additional VF-Module information + DataService.setVfModuleInstanceId(vfModule[FIELD.ID.VF_MODULE_ID]); + DataService.setInventoryItem(vfModule) + + DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]); + DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]); + DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]); + + $scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, { + componentId : COMPONENT.VF_MODULE + }); + }; + + $scope.getStatusOfVnf = function(serviceObject, vnfObject) { + var serviceInstance = serviceObject.object; + var vnf = vnfObject.object; + + DataService.setVnfInstanceId(vnf[FIELD.ID.VNF_ID]); + DataService.setInventoryItem(vnf); + + DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]); + DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]); + DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]); + DataService.setServiceInstanceName(serviceInstance[FIELD.ID.SERVICE_INSTANCE_NAME]); + + $scope.$broadcast(COMPONENT.COMPONENT_STATUS, { + componentId : COMPONENT.VNF, + callbackFunction : updateProvStatusVnfCallbackFunction + }); + }; + + $scope.describeVnf = function(serviceObject, vnfObject) { + var serviceInstance = serviceObject.object; + var vnf = vnfObject.object; + DataService.setResCustomizationUuid(" "); + + //var vnfInvariantUuid = vnf[FIELD.ID.MODEL_INVAR_ID]; + //var vnfVersionId = vnf[FIELD.ID.MODEL_VERSION_ID]; + var vnfCustomizationUuid = vnf[FIELD.ID.MODEL_CUSTOMIZATION_ID]; + + if ( UtilityService.hasContents (vnfCustomizationUuid) ) { + DataService.setResCustomizationUuid(vnfCustomizationUuid); + } + //Display popup with additional VNF information + DataService.setVnfInstanceId(vnf[FIELD.ID.VNF_ID]); + DataService.setInventoryItem(vnf); + + DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]); + DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]); + DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]); + + $scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, { + componentId : COMPONENT.VNF + }); + }; + + $scope.describeVolumeGroup = function(serviceObject, vnf, volumeGroupObject) { + + var serviceInstance = serviceObject.object; + var volumeGroup = volumeGroupObject.object; + + //var volGroupInvariantUuid = volumeGroup[FIELD.ID.MODEL_INVAR_ID]; + //var volGroupVersionId = volumeGroup[FIELD.ID.MODEL_VERSION_ID]; + var volGroupCustomizationUuid = volumeGroup[FIELD.ID.MODEL_CUSTOMIZATION_ID]; + + DataService.setCustomizationUuid(" "); + if ( UtilityService.hasContents(volGroupCustomizationUuid) ) { + DataService.setCustomizationUuid(volGroupCustomizationUuid); + } + DataService.setVolumeGroupInstanceId(volumeGroup[FIELD.ID.VOLUME_GROUP_ID]); + DataService.setInventoryItem(volumeGroup); + + DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]); + DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]); + DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]); + + + $scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, { + componentId : COMPONENT.VOLUME_GROUP + }); + }; + + $scope.addNetworkInstance = function(netModel, existingVnfs) { + + // For networks we assume that we always follow the new flow + console.log("Adding network to service instance" + this.service.instance.name); + if ( VIDCONFIGURATION.VNF_STATUS_CHECK_ENABLED && (UtilityService.hasContents(existingVnfs)) && (existingVnfs.length > 0) ) { + var msg = VnfService.isVnfListStatusValid (existingVnfs); + if ( msg != "" ) { + alert ( msg ); + return; + } + } + + DataService.setSubscriberName($scope.service.instance.subscriberName); + DataService.setGlobalCustomerId($scope.service.instance.globalCustomerId); + DataService.setServiceType($scope.service.instance.serviceType); + DataService.setServiceInstanceName($scope.service.instance.name); + DataService.setServiceInstanceId($scope.service.instance.id); + DataService.setServiceName($scope.service.model.service.name); + + DataService.setModelInfo(COMPONENT.NETWORK, { + "modelType": "network", + "modelInvariantId": netModel.invariantUuid, + "modelVersion": netModel.version, + "modelNameVersionId": netModel.uuid, + "modelName": netModel.name, + "modelCustomizationName": netModel.modelCustomizationName, + "customizationUuid": netModel.customizationUuid, + "inputs": "", + "displayInputs": netModel.displayInputs + }); + + DataService.setModelInfo(COMPONENT.SERVICE, { + "modelInvariantId": $scope.service.model.service.invariantUuid, + "modelVersion": $scope.service.model.service.version, + "modelNameVersionId": $scope.service.model.service.uuid, + "modelName": $scope.service.model.service.name, + "inputs": "" + }); + + $scope.$broadcast(COMPONENT.CREATE_COMPONENT, { + componentId : COMPONENT.NETWORK, + callbackFunction : createVnfCallbackFunction + }); + }; + + $scope.addVnfInstance = function(vnf, existingVnfs) { + + if ( VIDCONFIGURATION.VNF_STATUS_CHECK_ENABLED && (UtilityService.hasContents(existingVnfs)) && (existingVnfs.length > 0) ) { + var msg = VnfService.isVnfListStatusValid (existingVnfs); + if ( msg != "" ) { + alert ( msg ); + return; + } + } + DataService.setSubscriberName($scope.service.instance.subscriberName); + DataService.setGlobalCustomerId($scope.service.instance.globalCustomerId); + DataService.setServiceType($scope.service.instance.serviceType); + DataService.setServiceInstanceName($scope.service.instance.name); + DataService.setServiceInstanceId($scope.service.instance.id); + DataService.setServiceName($scope.service.model.service.name); + + console.log ( "existingVnfs: " ); console.log (JSON.stringify ( existingVnfs, null, 4)); + var vnf_type = ""; + var vnf_role = ""; + var vnf_function = ""; + var vnf_code = ""; + + if (UtilityService.hasContents (vnf.nfType) ) { + vnf_type = vnf.nfType; + } + if (UtilityService.hasContents (vnf.nfRole) ) { + vnf_role = vnf.nfRole; + } + if (UtilityService.hasContents (vnf.nfFunction) ) { + vnf_function = vnf.nfFunction; + } + if (UtilityService.hasContents (vnf.nfCode) ) { + vnf_code = vnf.nfCode; + } + DataService.setModelInfo(COMPONENT.VNF, { + "modelType": "vnf", + "modelInvariantId": vnf.invariantUuid, + "modelVersion": vnf.version, + "modelNameVersionId": vnf.uuid, + "modelName": vnf.name, + "modelCustomizationName": vnf.modelCustomizationName, + "customizationUuid": vnf.customizationUuid, + "inputs": "", + "displayInputs": vnf.displayInputs, + "vnfType": vnf_type, + "vnfRole": vnf_role, + "vnfFunction": vnf_function, + "vnfCode": vnf_code + }); + + DataService.setModelInstanceName($scope.service.model.service.name); + + DataService.setModelInfo(COMPONENT.SERVICE, { + "modelInvariantId": $scope.service.model.service.invariantUuid, + "modelVersion": $scope.service.model.service.version, + "modelNameVersionId": $scope.service.model.service.uuid, + "modelName": $scope.service.model.service.name, + "inputs": "" + }); + + $scope.$broadcast(COMPONENT.CREATE_COMPONENT, { + componentId : COMPONENT.VNF, + callbackFunction : createVnfCallbackFunction + }); + }; + + $scope.addVfModuleInstance = function(vnfInstance, vfModuleModel) { + + if ( VIDCONFIGURATION.VNF_STATUS_CHECK_ENABLED ) { + var msg = VnfService.isVnfStatusValid (vnfInstance); + if ( msg != "" ) { + alert ( msg ); + return; + } + + } + var svcModel = $scope.service.convertedModel; + DataService.setSubscriberName($scope.service.instance.subscriberName); + DataService.setGlobalCustomerId($scope.service.instance.globalCustomerId); + DataService.setServiceType($scope.service.instance.serviceType); + DataService.setServiceInstanceName($scope.service.instance.name); + DataService.setServiceInstanceId($scope.service.instance.id); + DataService.setServiceName($scope.service.model.service.name); + + var vnfModelInvariantUuid = vnfInstance.object[FIELD.ID.MODEL_INVAR_ID]; + var vnfModelVersionId = vnfInstance.object[FIELD.ID.MODEL_VERSION_ID]; + var vnfModelCustomizationUuid = vnfInstance.object[FIELD.ID.MODEL_CUSTOMIZATION_ID]; + var vnfModel = null; + if ( svcModel.isNewFlow ) { + vnfModel = svcModel.vnfs[vnfModelCustomizationUuid]; + } + else { + vnfModel = svcModel.vnfs[vnfModelVersionId]; + } + + var availableVolumeGroupList = []; + angular.forEach(vnfInstance[FIELD.ID.AVAILABLEVOLUMEGROUPS], function(volumeGroupInstance, key) { + availableVolumeGroupList.push({"instance": volumeGroupInstance}); + }); + + if (vfModuleModel.volumeGroupAllowed) { + DataService.setAvailableVolumeGroupList(availableVolumeGroupList); + } + + DataService.setModelInfo(COMPONENT.SERVICE, { + "modelInvariantId": $scope.service.model.service.invariantUuid, + "modelVersion": $scope.service.model.service.version, + "modelNameVersionId": $scope.service.model.service.uuid, + "modelName": $scope.service.model.service.name, + "inputs": "" + }); + + DataService.setVnfInstanceId(vnfInstance.object[FIELD.ID.VNF_ID]); + + DataService.setModelInfo(COMPONENT.VNF, { + "modelInvariantId": vnfModel.invariantUuid, + "modelVersion": vnfModel.version, + "modelNameVersionId": vnfModel.uuid, + "modelName": vnfModel.name, + "modelCustomizationName": vnfModel.modelCustomizationName, + "customizationUuid": vnfModel.customizationUuid, + "inputs": "" + }); + + DataService.setModelInfo(COMPONENT.VF_MODULE, { + "modelInvariantId": vfModuleModel.invariantUuid, + "modelVersion": vfModuleModel.version, + "modelNameVersionId": vfModuleModel.uuid, + "customizationUuid": vfModuleModel.customizationUuid, + "modelCustomizationName": vfModuleModel.modelCustomizationName, + "modelName": vfModuleModel.name, + "inputs": "" + }); + + $scope.$broadcast(COMPONENT.CREATE_COMPONENT, { + componentId : COMPONENT.VF_MODULE, + callbackFunction : createVfModuleCallbackFunction + }); + + }; + + $scope.addVolumeGroupInstance = function(vnfInstance, volumeGroupModel) { + if ( VIDCONFIGURATION.VNF_STATUS_CHECK_ENABLED ) { + var msg = VnfService.isVnfStatusValid (vnfInstance); + if ( msg != "" ) { + alert ( msg ); + return; + } + } + var svcModel = $scope.service.convertedModel; + DataService.setSubscriberName($scope.service.instance.subscriberName); + DataService.setGlobalCustomerId($scope.service.instance.globalCustomerId); + DataService.setServiceType($scope.service.instance.serviceType); + DataService.setServiceInstanceName($scope.service.instance.name); + DataService.setServiceInstanceId($scope.service.instance.id); + DataService.setServiceName($scope.service.model.service.name); + + DataService.setModelInfo(COMPONENT.SERVICE, { + "modelInvariantId": $scope.service.model.service.invariantUuid, + "modelVersion": $scope.service.model.service.version, + "modelNameVersionId": $scope.service.model.service.uuid, + "modelName": $scope.service.model.service.name, + "inputs": "" + }); + + DataService.setVnfInstanceId(vnfInstance.object[FIELD.ID.VNF_ID]); + + var vnfModelInvariantUuid = vnfInstance.object[FIELD.ID.MODEL_INVAR_ID]; + var vnfModelVersionId = vnfInstance.object[FIELD.ID.MODEL_VERSION_ID]; + var vnfCustomizationUuid = vnfInstance.object[FIELD.ID.MODEL_CUSTOMIZATION_ID]; + var vnfModel = null; + + if ( svcModel.isNewFlow ) { + vnfModel = svcModel.vnfs[vnfCustomizationUuid]; + } + else { + vnfModel = svcModel.vnfs[vnfModelVersionId]; + } + + DataService.setModelInfo(COMPONENT.VNF, { + "modelInvariantId": vnfModel.invariantUuid, + "modelVersion": vnfModel.version, + "modelNameVersionId": vnfModel.uuid, + "modelName": vnfModel.name, + "modelCustomizationName": vnfModel.modelCustomizationName, + "customizationUuid": vnfModel.customizationUuid, + "inputs": "" + }); + + DataService.setModelInfo(COMPONENT.VOLUME_GROUP, { + "modelInvariantId": volumeGroupModel.invariantUuid, + "modelVersion": volumeGroupModel.version, + "modelNameVersionId": volumeGroupModel.uuid, + "modelName": volumeGroupModel.name, + "modelCustomizationName": volumeGroupModel.modelCustomizationName, + "customizationUuid": volumeGroupModel.customizationUuid, + "inputs": "" + }); + + $scope.$broadcast(COMPONENT.CREATE_COMPONENT, { + componentId : COMPONENT.VOLUME_GROUP, + callbackFunction : createVolumeGroupCallbackFunction + }); + }; + + $scope.resetProgress = function() { + $scope.percentProgress = 0; + $scope.progressClass = FIELD.STYLE.PROGRESS_BAR_INFO; + }; + + $scope.setProgress = function(percentProgress) { + percentProgress = parseInt(percentProgress); + if (percentProgress >= 100) { + $scope.progressClass = FIELD.STYLE.PROGRESS_BAR_SUCCESS; + } + + if (percentProgress < $scope.percentProgress) { + return; + } + + $scope.percentProgress = percentProgress; + $scope.progressWidth = {width: percentProgress + "%"}; + if (percentProgress >= 5) { + $scope.progressText = percentProgress + " %"; + } else { + // Hidden since color combination is barely visible when progress portion is narrow. + $scope.progressText = ""; + } + }; + $scope.isObjectEmpty = function(o) { + var len = 0; + if (UtilityService.hasContents(o)){ + var keys = Object.keys(o); + len = keys.length; + if ( len == 0 ) { + return true; + } + else { + return false; + } + } + else { + return true; + } + } + $scope.isMacro = function() { + if (UtilityService.arrayContains (VIDCONFIGURATION.MACRO_SERVICES, $scope.service.model.service.invariantUuid )) { + return(true); + + } + else { + return (false); + } + } + $scope.reloadRoute = function() { + $route.reload(); + } + + var updateProvStatusVnfCallbackFunction = function(response) { + $scope.callbackResults = ""; + var color = FIELD.ID.COLOR_NONE; + $scope.callbackStyle = { + "background-color" : color + }; + $scope.reloadRoute(); + /* + * This 1/2 delay was only added to visually highlight the status + * change. Probably not needed in the real application code. + */ + $timeout(function() { + $scope.callbackResults = UtilityService.getCurrentTime() + + FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful; + if (response.isSuccessful) { + color = FIELD.ID.COLOR_8F8; + + } else { + color = FIELD.ID.COLOR_F88; + } + $scope.callbackStyle = { + "background-color" : color + }; + }, 500); + + }; + + var createVnfCallbackFunction = function(response) { + $scope.callbackResults = ""; + var color = FIELD.ID.COLOR_NONE; + $scope.callbackStyle = { + "background-color" : color + }; + + /* + * This 1/2 delay was only added to visually highlight the status + * change. Probably not needed in the real application code. + */ + $timeout(function() { + $scope.callbackResults = UtilityService.getCurrentTime() + + FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful; + if (response.isSuccessful) { + color = FIELD.ID.COLOR_8F8; + $scope.reloadRoute(); + } else { + color = FIELD.ID.COLOR_F88; + } + $scope.callbackStyle = { + "background-color" : color + }; + }, 500); + + + + }; + + var deleteCallbackFunction = function(response) { + $scope.callbackResults = ""; + var color = FIELD.ID.COLOR_NONE; + $scope.callbackStyle = { + "background-color" : color + }; + + /* + * This 1/2 delay was only added to visually highlight the status + * change. Probably not needed in the real application code. + */ + $timeout(function() { + $scope.callbackResults = UtilityService.getCurrentTime() + + FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful; + if (response.isSuccessful) { + color = FIELD.ID.COLOR_8F8; + $scope.reloadRoute(); + } else { + color = FIELD.ID.COLOR_F88; + } + $scope.callbackStyle = { + "background-color" : color + }; + }, 500); + + }; + + var createVfModuleCallbackFunction = function(response) { + $scope.callbackResults = ""; + var color = FIELD.ID.COLOR_NONE; + $scope.callbackStyle = { + "background-color" : color + }; + + /* + * This 1/2 delay was only added to visually highlight the status + * change. Probably not needed in the real application code. + */ + $timeout(function() { + $scope.callbackResults = UtilityService.getCurrentTime() + + FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful; + if (response.isSuccessful) { + color = FIELD.ID.COLOR_8F8; + $scope.reloadRoute(); + } else { + color = FIELD.ID.COLOR_F88; + } + $scope.callbackStyle = { + "background-color" : color + }; + }, 500); + + }; + + var deleteServiceInstanceCallbackFunction = function(response) { + $scope.callbackResults = ""; + var color = FIELD.ID.COLOR_NONE; + $scope.callbackStyle = { + "background-color" : color + }; + + /* + * This 1/2 delay was only added to visually highlight the status + * change. Probably not needed in the real application code. + */ + $timeout(function() { + $scope.callbackResults = UtilityService.getCurrentTime() + + FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful; + if (response.isSuccessful) { + color = FIELD.ID.COLOR_8F8; + $location.path(COMPONENT.SERVICEMODELS_MODELS_SERVICES_PATH) + } else { + color = FIELD.ID.COLOR_F88; + } + $scope.callbackStyle = { + "background-color" : color + }; + }, 500); + + }; + + var createVolumeGroupCallbackFunction = function(response) { + $scope.callbackResults = ""; + var color = FIELD.ID.COLOR_NONE; + $scope.callbackStyle = { + "background-color" : color + }; + + /* + * This 1/2 delay was only added to visually highlight the status + * change. Probably not needed in the real application code. + */ + $timeout(function() { + $scope.callbackResults = UtilityService.getCurrentTime() + + FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful; + if (response.isSuccessful) { + color = FIELD.ID.COLOR_8F8; + $scope.reloadRoute(); + } else { + color = FIELD.ID.COLOR_F88; + } + $scope.callbackStyle = { + "background-color" : color + }; + }, 500); + + + + }; + + }); +})(); diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js new file mode 100755 index 00000000..5d382e9e --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js @@ -0,0 +1,227 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +(function () { + 'use strict'; + + appDS2.controller("ServiceModelController", function ($scope, $http, $location, COMPONENT, VIDCONFIGURATION, FIELD, DataService, vidService, + PropertyService, UtilityService) { + + $scope.popup = {}; + + // var baseEndpoint = "vid"; + var pathQuery = COMPONENT.SERVICES_DIST_STATUS_PATH + VIDCONFIGURATION.ASDC_MODEL_STATUS; + + if ( VIDCONFIGURATION.ASDC_MODEL_STATUS === FIELD.STATUS.ALL) { + pathQuery = COMPONENT.SERVICES_PATH; + } + + $scope.getServiceModels = function() { + $scope.status = FIELD.STATUS.FETCHING_SERVICE_CATALOG_ASDC; + + $http.get(pathQuery) + .then(function successCallback(response) { + $scope.services = []; + if (angular.isArray(response.data)) { + $scope.services = response.data; + $scope.viewPerPage=10; + $scope.totalPage=$scope.services.length/$scope.viewPerPage; + $scope.sortBy=COMPONENT.NAME; + $scope.scrollViewPerPage=2; + $scope.currentPage=1; + $scope.searchCategory; + $scope.searchString=""; + $scope.currentPageNum=1; + $scope.isSpinnerVisible = false; + $scope.isProgressVisible = false; + } else { + $scope.status = FIELD.STATUS.FAILED_SERVICE_MODELS_ASDC; + $scope.error = true; + $scope.isSpinnerVisible = false; + } + }, function errorCallback(response) { + console.log("Error: " + response); + }); + } + + $scope.init = function() { + var msecs = PropertyService.retrieveMsoMaxPollingIntervalMsec(); + PropertyService.setMsoMaxPollingIntervalMsec(msecs); + + var polls = PropertyService.retrieveMsoMaxPolls(); + PropertyService.setMsoMaxPolls(polls); + + //PropertyService.setMsoBaseUrl("testmso"); + PropertyService.setServerResponseTimeoutMsec(10000); + } + + $scope.prevPage = function() { + $scope.currentPage--; + } + + $scope.nextPage = function() { + $scope.currentPage++; + } + + $scope.createType = COMPONENT.A_LA_CARTE; + $scope.deployService = function(service) { + + + console.log("Instantiating SDC service " + service.uuid); + + $http.get(COMPONENT.SERVICES_PATH + service.uuid) + .then(function successCallback(getServiceResponse) { + + var serviceModel = getServiceResponse.data; + DataService.setServiceName(serviceModel.service.name); + + DataService.setModelInfo(COMPONENT.SERVICE, { + "modelInvariantId": serviceModel.service.invariantUuid, + "modelVersion": serviceModel.service.version, + "modelNameVersionId": serviceModel.service.uuid, + "modelName": serviceModel.service.name, + "description": serviceModel.service.description, + "category":serviceModel.service.category + }); + DataService.setALaCarte (true); + $scope.createType = COMPONENT.A_LA_CARTE; + var broadcastType = COMPONENT.CREATE_COMPONENT; + + if (UtilityService.arrayContains (VIDCONFIGURATION.MACRO_SERVICES, serviceModel.service.invariantUuid )) { + DataService.setALaCarte (false); + $scope.createType = COMPONENT.MACRO; + var convertedAsdcModel = UtilityService.convertModel(serviceModel); + + //console.log ("display inputs "); + //console.log (JSON.stringify ( convertedAsdcModel.completeDisplayInputs)); + + DataService.setModelInfo(COMPONENT.SERVICE, { + "modelInvariantId": serviceModel.service.invariantUuid, + "modelVersion": serviceModel.service.version, + "modelNameVersionId": serviceModel.service.uuid, + "modelName": serviceModel.service.name, + "description": serviceModel.service.description, + "category":serviceModel.service.category, + "serviceEcompNaming": serviceModel.service.serviceEcompNaming, + "inputs": serviceModel.service.inputs, + "displayInputs": convertedAsdcModel.completeDisplayInputs + }); + }; + + $scope.$broadcast(broadcastType, { + componentId : COMPONENT.SERVICE, + callbackFunction : function(response) { + if (response.isSuccessful) { + vidService.setModel(serviceModel); + + var subscriberId = FIELD.STATUS.NOT_FOUND; + var serviceType = FIELD.STATUS.NOT_FOUND; + + var serviceInstanceId = response.instanceId; + + for (var i = 0; i < response.control.length; i++) { + if (response.control[i].id == COMPONENT.SUBSCRIBER_NAME) { + subscriberId = response.control[i].value; + } else if (response.control[i].id == "service-type") { + serviceType = response.control[i].value; + } + } + + + $scope.refreshSubs(subscriberId,serviceType,serviceInstanceId); + + } + } + }); + + }, function errorCallback(response) { + console.log("Error: " + response); + }); + }; + + $scope.refreshSubs = function(subscriberId, serviceType, serviceInstanceId) { + $scope.status = FIELD.STATUS.FETCHING_SUBSCRIBER_LIST_AAI; + $scope.init(); + $http.get( FIELD.ID.AAI_REFRESH_FULL_SUBSCRIBERS, { + + },{ + timeout: $scope.responseTimeoutMsec + }).then(function(response){ + + if (response.data.status < 200 || response.data.status > 202) { + $scope.showError(FIELD.ERROR.MSO) + return; + } + + $scope.customer = response.data.customer; // get data from json + + $scope.customerList = []; + + $scope.serviceInstanceToCustomer = []; + + angular.forEach($scope.customer, function(subVal, subKey) { + var cust = { "globalCustomerId": subVal[FIELD.ID.GLOBAL_CUSTOMER_ID], "subscriberName": subVal[FIELD.ID.SUBNAME] }; + $scope.customerList.push(cust); + if (subVal[FIELD.ID.SERVICE_SUBSCRIPTIONS] != null) { + angular.forEach(subVal[FIELD.ID.SERVICE_SUBSCRIPTIONS][FIELD.ID.SERVICE_SUBSCRIPTION], function(serviceSubscription, key) { + $scope.serviceInstanceId = []; + if (serviceSubscription[FIELD.ID.SERVICE_TYPE] != null) { + $scope.serviceType = serviceSubscription[FIELD.ID.SERVICE_TYPE]; + } else { + $scope.serviceType = FIELD.STATUS.NO_SERVICE_SUBSCRIPTION_FOUND; + } + if (serviceSubscription[FIELD.ID.SERVICE_INSTANCES] != null) { + angular.forEach(serviceSubscription[FIELD.ID.SERVICE_INSTANCES][FIELD.ID.SERVICE_INSTANCE], function(instValue, instKey) { + var foo = { "serviceInstanceId": instValue[FIELD.ID.SERVICE_INSTANCE_ID], + "globalCustomerId": subVal[FIELD.ID.GLOBAL_CUSTOMER_ID], + "subscriberName": subVal[FIELD.ID.SUBNAME] }; + $scope.serviceInstanceToCustomer.push(foo); + }); + } + }); + } + }); + DataService.setServiceInstanceToCustomer($scope.serviceInstanceToCustomer); + var serviceIdList = []; + $http.get( FIELD.ID.AAI_GET_SERVICES, { + },{ + timeout: $scope.responseTimeoutMsec + }).then(function(response) { + angular.forEach(response.data, function(value, key) { + angular.forEach(value, function(subVal, key) { + var newVal = { "id" : subVal[FIELD.ID.SERVICE_ID], "description" : subVal[FIELD.ID.SERVICE_DESCRIPTION] }; + serviceIdList.push(newVal); + DataService.setServiceIdList(serviceIdList); + + $location.search({ + "subscriberId": subscriberId, + "serviceType": serviceType, + "serviceInstanceId": serviceInstanceId + }); + + $location.path(COMPONENT.INSTANTIATE_PATH); + }); + }); + }); + }) + ["catch"]($scope.handleServerError); + }; + }); +})(); diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/VidApp.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/VidApp.js new file mode 100755 index 00000000..dcde2ecc --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/VidApp.js @@ -0,0 +1,79 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +(function () { + 'use strict'; + + appDS2.config(['$routeProvider', '$locationProvider', function ($routeProvider) { + $routeProvider + .when('/models/services', { + controller: 'ServiceModelController', + templateUrl: 'app/vid/scripts/view-models/serviceModels.htm' + }) + .when('/models/services/createInstance', { + controller: 'aaiSubscriberController', + templateUrl: 'app/vid/scripts/view-models/createInstanceServiceModels.htm' + }) + .when('/instances/services', { + templateUrl : "app/vid/scripts/view-models/aaiGetSubs.htm", + controller : "aaiSubscriberController" + }) + .when('/instances/subscribers', { + templateUrl : "app/vid/scripts/view-models/aaiGetSubscriberList.htm", + controller : "aaiSubscriberController" + }) + .when('/instances/serviceTypes', { + templateUrl : "app/vid/scripts/view-models/aaiServiceTypes.htm", + controller : "aaiSubscriberController" + }) + .when('/instances/subdetails', { + templateUrl : "app/vid/scripts/view-models/aaiSubDetails.htm", + controller : "aaiSubscriberController" + }) + .when('/instantiate', { + controller: 'InstantiationController', + templateUrl: 'app/vid/scripts/view-models/instantiate.htm' + }) + .otherwise({ + redirectTo: '/models/services' + }); + }]); + + appDS2.service('vidService', function() { + var _model = undefined; + var _instance = undefined; + + this.setModel = function(model) { + _model = model; + }; + + this.getModel = function() { + return _model; + }; + + this.setInstance = function(instance) { + _instance = instance; + }; + + this.getInstance = function() { + return _instance; + }; + }); +})(); diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/aaiSubscriberController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/aaiSubscriberController.js new file mode 100755 index 00000000..5caa3298 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/aaiSubscriberController.js @@ -0,0 +1,821 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +"use strict"; + +appDS2.controller("aaiSubscriberController", [ "COMPONENT", "FIELD", "PARAMETER", "DataService", "PropertyService", "$scope", "$http", "$timeout", "$location", "$log", "$route", "VIDCONFIGURATION", "UtilityService", "vidService","AaiService", + function(COMPONENT, FIELD, PARAMETER, DataService, PropertyService, $scope, $http, $timeout, $location, $log, $route, VIDCONFIGURATION, UtilityService, vidService, AaiService) { + + $scope.showVnfDetails = function(vnf) { + console.log("showVnfDetails"); + DataService.setVnfInstanceId(COMPONENT.VNF_INSTANCE_ID); + DataService + .setInventoryItem(aaiResult[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM][0]); + + $scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, { + componentId : COMPONENT.VNF, + callbackFunction : callbackFunction + }); + } + $scope.popup = new Object(); + + + $scope.isPopupVisible = false; + $scope.defaultBaseUrl = ""; + $scope.responseTimeoutMsec = 60000; + + $scope.serviceTypes=[ FIELD.PROMPT.SELECT_SERVICE ]; + $scope.defaultSubscriberName=[ FIELD.PROMPT.SELECT_SUB ]; + + var callbackFunction = function(response) { + alert(response); + }; + + $scope.getSubs = function() { + $scope.init(); + $scope.fetchSubs(FIELD.PROMPT.FETCHING_SUBS); + $scope.fetchServices(); + + }; + + $scope.cancelCreateSI = function(){ + + window.location.href = COMPONENT.WELCOME_PATH; + + }; + + $scope.getServiceTypes = function(globalCustomerId){ + DataService.setGlobalCustomerId(globalCustomerId); + DataService.setServiceIdList($scope.customerList) + + if (globalCustomerId !== "" && globalCustomerId !== undefined ) { + window.location.href = COMPONENT.SERVICE_TYPE_LIST_PATH + $scope.serviceTypeList; + } + } + + $scope.refreshServiceTypes = function(globalCustomerId){ + DataService.setGlobalCustomerId(globalCustomerId); + + $scope.getServiceTypesList(); + } + + $scope.subId=""; + $scope.createSubscriberName=""; + $scope.serviceTypeList={}; + $scope.custSubList=[]; + $scope.getServiceTypesList = function(){ + var notFound = true; + var globalCustomerId = DataService.getGlobalCustomerId(); + $scope.custSubList = DataService.getServiceIdList(); + if(globalCustomerId !== "" && globalCustomerId !== undefined ){ + $scope.subId=globalCustomerId; + $scope.init(); + $scope.status = FIELD.PROMPT.FETCHING_SERVICE_TYPES; + DataService.setGlobalCustomerId(globalCustomerId); + + AaiService.getSubscriptionServiceTypeList(DataService + .getGlobalCustomerId(), function(response) { + notFound = false; + $scope.setProgress(100); // done + $scope.status = FIELD.STATUS.DONE; + $scope.isSpinnerVisible = false; + $scope.serviceTypeList = response; + for(var i=0; i<$scope.custSubList.length;i++){ + if(globalCustomerId === $scope.custSubList[i].globalCustomerId){ + $scope.createSubscriberName = $scope.custSubList[i].subscriberName; + } + } + }, function(response) { // failure + $scope.showError(FIELD.ERROR.AAI); + $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICE_TYPES + response.status; + $scope.errorDetails = response.data; + }); + } else { + alert(FIELD.ERROR.SELECT); + } + + }; + + $scope.subList = []; + $scope.getAaiServiceModels = function(selectedServicetype,subName){ + DataService.setGlobalCustomerId(selectedServicetype); + DataService.setServiceIdList($scope.serviceTypeList) + DataService.setSubscriberName(subName); + + DataService.setSubscribers($scope.custSubList); + + if (selectedServicetype !== "" && selectedServicetype !== 'undefined') { + $location.path(COMPONENT.CREATE_INSTANCE_PATH); + } + }; + + $scope.serviceTypeName=""; + $scope.getAaiServiceModelsList = function(){ + var globalCustomerId=""; + var serviceTypeId = DataService.getGlobalCustomerId(); + $scope.serviceTypeList = DataService.getServiceIdList(); + $scope.createSubscriberName = DataService.getSubscriberName(); + $scope.status = FIELD.STATUS.FETCHING_SERVICE_CATALOG; + $scope.custSubList = DataService.getSubscribers(); + for(var i=0; i<$scope.serviceTypeList.length;i++){ + if(parseInt(serviceTypeId) === i ){ + $scope.serviceTypeName = $scope.serviceTypeList[i]; + } + }; + for(var i=0; i<$scope.custSubList.length;i++){ + if($scope.createSubscriberName === $scope.custSubList[i].subscriberName){ + globalCustomerId = $scope.custSubList[i].globalCustomerId; + } + }; + + var pathQuery =""; + + if(null !== globalCustomerId && "" !== globalCustomerId && undefined !== globalCustomerId + && null !== serviceTypeId && "" !== serviceTypeId && undefined !== serviceTypeId){ + pathQuery = COMPONENT.SERVICES_PATH +globalCustomerId+"/"+$scope.serviceTypeName; + } + + AaiService.getServiceModels(globalCustomerId,$scope.serviceTypeName,function(response) { // success + console.log("service models : "+response.data); + DataService.setServiceIdList(response); + }, function(response) { // failure + $scope.showError(FIELD.ERROR.AAI); + $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICES+ response.status; + $scope.errorDetails = response.data; + }); + + /*$http.get('/aai_get_services/'+globalCustomerId+''+$scope.serviceTypeName) + .then(function successCallback(response) { + $scope.services = []; + if (angular.isArray(response.data)) { + $scope.services = response.data; + $scope.viewPerPage=10; + $scope.totalPage=$scope.services.length/$scope.viewPerPage; + $scope.sortBy="name"; + $scope.scrollViewPerPage=2; + $scope.currentPage=1; + $scope.searchCategory; + $scope.searchString=""; + $scope.currentPageNum=1; + $scope.isSpinnerVisible = false; + $scope.isProgressVisible = false; + } else { + $scope.status = "Failed to get service models from SDC."; + $scope.error = true; + $scope.isSpinnerVisible = false; + } + }, function errorCallback(response) { + console.log("Error: " + response); + }); */ + + + }; + + $scope.cancelCreateSIType = function(){ + + window.location.href = COMPONENT.SERVICE_MODLES_INSTANCES_SUBSCRIBERS_PATH; + + } + + $scope.fetchServices = function() { + var serviceIdList = []; + + AaiService.getServices2(function(response) { // success + DataService.setServiceIdList(response); + }, function(response) { // failure + $scope.showError(FIELD.ERROR.AAI); + $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICES + response.status; + $scope.errorDetails = response.data; + }); + } + + $scope.refreshSubs = function() { + $scope.fetchSubs(FIELD.PROMPT.REFRESH_SUB_LIST); + $scope.fetchServices(); + }; + + $scope.fetchSubs = function(status) { + $scope.status = status; + + AaiService.getSubList(function(response) { // sucesss + $scope.setProgress(100); // done + $scope.status = FIELD.STATUS.DONE; + $scope.isSpinnerVisible = false; + $scope.customerList = response; + }, function(response) { // failure + $scope.showError(FIELD.ERROR.AAI); + $scope.errorMsg = FIELD.ERROR.AAI_FETCHING_CUST_DATA + response.status; + $scope.errorDetails = response.data; + }); + } + + + $scope.getSubDetails = function(request) { + + $scope.init(); + $scope.selectedSubscriber = $location.search().selectedSubscriber; + $scope.selectedServiceInstance = $location.search().selectedServiceInstance; + $scope.status = FIELD.STATUS.FETCHING_SUB_DETAILS + $scope.selectedSubscriber; + + $scope.displayData = []; + AaiService.getSubDetails($scope.selectedSubscriber, $scope.selectedServiceInstance, function(displayData, subscriberName) { + $scope.displayData = displayData; + $scope.viewPerPage=10; + $scope.totalPage=$scope.displayData.length/$scope.viewPerPage; + $scope.scrollViewPerPage=2; + $scope.currentPage=1; + $scope.searchCategory; + $scope.searchString=""; + $scope.currentPageNum=1; + $scope.defaultSort=COMPONENT.SUBSCRIBER_NAME; + $scope.setProgress(100); // done + $scope.status = FIELD.STATUS.DONE; + $scope.isSpinnerVisible = false; + $scope.subscriberName = subscriberName; + }, function(response) { + $scope.showError(FIELD.ERROR.AAI); + $scope.errorMsg = FIELD.ERROR.AAI_FETCHING_CUST_DATA + response.status; + $scope.errorDetails = response.data; + }); + } + + + $scope.$on(COMPONENT.MSO_DELETE_REQ, function(event, request) { + // $log.debug("deleteInstance: request:"); + // $log.debug(request); + $scope.init(); + + $http.post($scope.baseUrl + request.url, { + requestDetails: request.requestDetails + },{ + timeout: $scope.responseTimeoutMsec + }).then($scope.handleInitialResponse) + ["catch"]($scope.handleServerError); + }); + + $scope.init = function() { + + //PropertyService.setAaiBaseUrl("testaai"); + //PropertyService.setAsdcBaseUrl("testasdc"); + + // takes a default value, retrieves the prop value from the file system and sets it + var msecs = PropertyService.retrieveMsoMaxPollingIntervalMsec(); + PropertyService.setMsoMaxPollingIntervalMsec(msecs); + + // takes a default value, retrieves the prop value from the file system and sets it + var polls = PropertyService.retrieveMsoMaxPolls(); + PropertyService.setMsoMaxPolls(polls); + + //PropertyService.setMsoBaseUrl("testmso"); + PropertyService.setServerResponseTimeoutMsec(); + + /* + * Common parameters that would typically be set when the page is + * displayed for a specific service instance id. + */ + + $scope.baseUrl = $scope.defaultBaseUrl; + + $scope.isSpinnerVisible = true; + $scope.isProgressVisible = true; + $scope.isPopupVisible = true; + $scope.requestId = ""; + $scope.error = ""; + $scope.pollAttempts = 0; + $scope.log = ""; + $scope.enableCloseButton(false); + $scope.resetProgress(); + $scope.setProgress(2); // Show "a little" progress + } + + $scope.getComponentList = function(event, request) { + + $scope.isSpinnerVisible = true; + $scope.isProgressVisible = true; + $scope.isPopupVisible = true; + $scope.requestId = ""; + $scope.error = ""; + $scope.pollAttempts = 0; + $scope.log = ""; + + $scope.resetProgress(); + $scope.setProgress(2); // Show "a little" progress + + $scope.globalCustomerId = $location.search().subscriberId; + $scope.serviceType = $location.search().serviceType; + $scope.serviceInstanceId = $location.search().serviceInstanceId; + $scope.subscriberName = $location.search().subscriberName; + + //$scope.getAsdcModel($location.search().modelUuid); + + $scope.namedQueryId = VIDCONFIGURATION.COMPONENT_LIST_NAMED_QUERY_ID; + $scope.status = FIELD.STATUS.FETCHING_SERVICE_INST_DATA + $scope.serviceInstanceId; + + AaiService.runNamedQuery($scope.namedQueryId, $scope.globalCustomerId, $scope.serviceType, $scope.serviceInstanceId, + function(response) { //success + $scope.handleInitialResponseInventoryItems(response); + $scope.setProgress(100); // done + $scope.status = FIELD.STATUS.DONE; + $scope.isSpinnerVisible = false; + }, + function(response){ //failure + $scope.showError(FIELD.ERROR.AAI); + $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICE_INSTANCE_DATA + response.status; + $scope.errorDetails = response.data; + } + ); + + } + + $scope.handleServerError = function(response, status) { + alert(response.statusText); + } + + $scope.getAsdcModel = function(disData) { + + console.log ("disData"); console.log (JSON.stringify (disData, null, 4)); + + if ( !(UtilityService.hasContents (disData.aaiModelVersionId)) ) { + $scope.errorMsg = FIELD.ERROR.MODEL_VERSION_ID_MISSING; + alert($scope.errorMsg); + return; + } + + // aaiModelVersionId is the model uuid + var pathQuery = COMPONENT.SERVICES_PATH + disData.aaiModelVersionId; + $http({ + method: 'GET', + url: pathQuery + }).then(function successCallback(response) { + vidService.setModel(response.data); + window.location.href = COMPONENT.INSTANTIATE_ROOT_PATH + disData.globalCustomerId + COMPONENT.SUBSCRIBERNAME_SUB_PATH + disData.subscriberName + COMPONENT.SERVICETYPE_SUB_PATH + disData.serviceType + COMPONENT.SERVICEINSTANCEID_SUB_PATH + disData.serviceInstanceId; + console.log("aaiSubscriber getAsdcModel DONE!!!!"); + }, function errorCallback(response) { + console.log("aaiSubscriber getAsdcModel - No matching model found matching the A&AI model version ID = " + disData.aaiModelVersionId); + $scope.errorMsg = FIELD.ERROR.NO_MATCHING_MODEL_AAI + disData.aaiModelVersionId; + alert($scope.errorMsg); + }); + + } + + $scope.getTenants = function(globalCustomerId) { + $http.get(FIELD.ID.AAI_GET_TENTANTS + globalCustomerId) + .then(function successCallback(response) { + return response.data; + //$location.path("/instantiate"); + }, function errorCallback(response) { + //TODO + }); + } + + $scope.handleInitialResponseInventoryItems = function(response) { + + $scope.inventoryResponseItemList = response.data[FIELD.ID.INVENTORY_RESPONSE_ITEM]; // get data from json + console.log($scope.inventoryResponseItemList.toString()); + + $scope.displayData = []; + $scope.vnfs = []; + + $scope.counter = 100; + + $scope.subscriberName = ""; + // just look up the subscriber name in A&AI here... + AaiService.getSubscriberName($scope.globalCustomerId, function(response) { + $scope.subscriberName = response; + DataService.setSubscriberName($scope.subscriberName); + + angular.forEach($scope.inventoryResponseItemList, function(inventoryResponseItem, key) { + + $scope.inventoryResponseItem = inventoryResponseItem; + + $scope.service.instance = { + "name": $scope.inventoryResponseItem[FIELD.ID.SERVICE_INSTANCE][FIELD.ID.SERVICE_INSTANCE_NAME], + "serviceInstanceId": $scope.serviceInstanceId, + "serviceType": $scope.serviceType, + "globalCustomerId": $scope.globalCustomerId, + "subscriberName": $scope.subscriberName, + "id": $scope.serviceInstanceId, + "inputs": { + "a": { + "type": PARAMETER.STRING, + "description": FIELD.PROMPT.VAR_DESCRIPTION_A, + "default": FIELD.PROMPT.DEFAULT_A + }, + "b": { + "type": PARAMETER.STRING, + "description": FIELD.PROMPT.VAR_DESCRIPTION_B, + "default": FIELD.PROMPT.DEFAULT_B + }, + }, + "object": $scope.inventoryResponseItem[FIELD.ID.SERVICE_INSTANCE], + "vnfs": [], + "networks": [] + } + + if (inventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) { + + angular.forEach(inventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function(subInventoryResponseItem, key) { + // i expect to find vnfs now + + if (subInventoryResponseItem[FIELD.ID.L3_NETWORK] != null) { + var l3NetworkObject = subInventoryResponseItem[FIELD.ID.L3_NETWORK]; + var l3Network = { "id": $scope.counter++, + "name": l3NetworkObject[FIELD.ID.NETWORK_NAME], + "itemType": FIELD.ID.L3_NETWORK, + "nodeId": l3NetworkObject[FIELD.ID.NETWORK_ID], + "nodeType": l3NetworkObject[FIELD.ID.NETWORK_TYPE], + "nodeStatus": l3NetworkObject[FIELD.ID.ORCHESTRATION_STATUS], + "object": l3NetworkObject, + "nodes": [], + "subnets": [] + }; + if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) { + //console.log ("subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS]="); + //console.log (JSON.stringify (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS], null, 4 )); + angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function(subSubInventoryResponseItem, key) { + //console.log (JSON.stringify (subSubInventoryResponseItem, null, 4 )); + var subnet = {}; + var subnetObject; + if (subSubInventoryResponseItem[FIELD.ID.SUB_NET] != null) { + subnetObject = subSubInventoryResponseItem[FIELD.ID.SUB_NET]; + subnet = { + "subnet-id": subnetObject[FIELD.ID.SUBNET_ID], + "subnet-name": subnetObject[FIELD.ID.SUBNET_NAME], + "gateway-address": subnetObject[FIELD.ID.GATEWAY_ADDRESS], + "network-start-address": subnetObject[FIELD.ID.NETWORK_START_ADDRESS], + "cidr-mask": subnetObject[FIELD.ID.CIDR_MASK] + }; + l3Network.subnets.push(subnet); + } + }); + } + $scope.service.instance[FIELD.ID.NETWORKS].push(l3Network); + } + + if (subInventoryResponseItem[FIELD.ID.GENERIC_VNF] != null) { + var genericVnfObject = subInventoryResponseItem[FIELD.ID.GENERIC_VNF]; + + var genericVnf = { + "name": genericVnfObject[FIELD.ID.VNF_NAME], + "id": $scope.counter++, + "itemType": COMPONENT.VNF, + "nodeType": genericVnfObject[FIELD.ID.VNF_TYPE], + "nodeId": genericVnfObject[FIELD.ID.VNF_ID], + "nodeStatus": genericVnfObject[FIELD.ID.ORCHESTRATION_STATUS], + "object": genericVnfObject, + "vfModules": [], + "volumeGroups": [], + "availableVolumeGroups": [] + }; + $scope.service.instance[FIELD.ID.VNFS].push(genericVnf); + + // look for volume-groups + if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) { + angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function(vfmodules, key) { + + if (vfmodules[FIELD.ID.VOLUME_GROUP] != null) { + var volumeGroupObject = vfmodules[FIELD.ID.VOLUME_GROUP]; + var volumeGroup = { "id": $scope.counter++, + "name": volumeGroupObject[FIELD.ID.VOLUME_GROUP_NAME], + "itemType": FIELD.ID.VOLUME_GROUP, + "nodeId": volumeGroupObject[FIELD.ID.VOLUME_GROUP_ID], + "nodeType": volumeGroupObject[FIELD.ID.VNF_TYPE], + "nodeStatus": volumeGroupObject[FIELD.ID.ORCHESTRATION_STATUS], + "object": volumeGroupObject, + "nodes": [] + }; + genericVnf[FIELD.ID.VOLUMEGROUPS].push(volumeGroup); + genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS].push(volumeGroup); + } + }); + } + // now we've loaded up the availableVolumeGroups, we can use it + if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) { + angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function(vfmodules, key) { + + if (vfmodules[FIELD.ID.VF_MODULE] != null) { + var vfModuleObject = vfmodules[FIELD.ID.VF_MODULE]; + var vfModule = { "id": $scope.counter++, + "name": vfModuleObject[FIELD.ID.VF_MODULE_NAME], + "itemType": FIELD.ID.VF_MODULE, + "nodeType": FIELD.ID.VF_MODULE, + "nodeStatus": vfModuleObject[FIELD.ID.ORCHESTRATION_STATUS], + "volumeGroups": [], + "object": vfModuleObject, + "networks": [] + }; + genericVnf[FIELD.ID.VF_MODULES].push(vfModule); + if (vfmodules[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) { + angular.forEach(vfmodules[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function(networks, key) { + if (networks[FIELD.ID.L3_NETWORK] != null) { + var l3NetworkObject = networks[FIELD.ID.L3_NETWORK]; + var l3Network = { "id": $scope.counter++, + "name": l3NetworkObject[FIELD.ID.NETWORK_NAME], + "itemType": FIELD.ID.L3_NETWORK, + "nodeId": l3NetworkObject[FIELD.ID.NETWORK_ID], + "nodeType": l3NetworkObject[FIELD.ID.NETWORK_TYPE], + "nodeStatus": l3NetworkObject[FIELD.ID.ORCHESTRATION_STATUS], + "object": l3NetworkObject, + "nodes": [] + }; + vfModule[FIELD.ID.NETWORKS].push(l3Network); + } + if (networks[FIELD.ID.VOLUME_GROUP] != null) { + var volumeGroupObject = networks[FIELD.ID.VOLUME_GROUP]; + + var volumeGroup = { "id": $scope.counter++, + "name": volumeGroupObject[FIELD.ID.VOLUME_GROUP_NAME], + "itemType": FIELD.ID.VOLUME_GROUP, + "nodeId": volumeGroupObject[FIELD.ID.VOLUME_GROUP_ID], + "nodeType": volumeGroupObject[FIELD.ID.VNF_TYPE], + "nodeStatus": volumeGroupObject[FIELD.ID.ORCHESTRATION_STATUS], + "object": volumeGroupObject, + "nodes": [] + }; + var tmpVolGroup = []; + + angular.forEach(genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS], function(avgroup, key) { + if (avgroup.name != volumeGroup.name) { + tmpVolGroup.push(avgroup); + } + }); + + genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS] = tmpVolGroup; + + vfModule[FIELD.ID.VOLUMEGROUPS].push(volumeGroup); + } + + }); + } + } + }); + } + } + }); + } + }); + }); + } + + $scope.handleInitialResponse = function(response) { + try { + $scope.enableCloseButton(true); + $scope.updateLog(response); + if (response.data.status < 200 || response.data.status > 202) { + $scope.showError(FIELD.ERROR.MSO); + $scope.status = FIELD.ERROR.AAI_FETCHING_CUST_DATA + response.data.status; + + return; + } + + $scope.setProgress(100); // done + $scope.status = FIELD.STATUS.DONE; + $scope.isSpinnerVisible = false; + + $scope.customer = response.data.customer; // get data from json + + $scope.customerList = []; + + angular.forEach($scope.customer, function(subVal, subKey) { + var cust = { "globalCustomerId": subVal[FIELD.ID.GLOBAL_CUSTOMER_ID], "subscriberName": subVal[FIELD.ID.SUBNAME] }; + $scope.customerList.push(cust); + }); + + } catch (error) { + $scope.showContentError(error); + } + } + + $scope.autoGetSubs = function() { + /* + * Optionally comment in / out one of these method calls (or add a similar + * entry) to auto-invoke an entry when the test screen is redrawn. + */ + $scope.getSubs(); + + } + + $scope.updateLog = function(response) { +// $scope.log = UtilityService.getCurrentTime() + " HTTP Status: " + +// UtilityService.getHttpStatusText(response.data.status) + "\n" + +// angular.toJson(response.data.entity, true) + "\n\n" + $scope.log; +// UtilityService.checkUndefined("entity", response.data.entity); +// UtilityService.checkUndefined("status", response.data.status); + } + + $scope.handleServerError = function(response, status) { + $scope.enableCloseButton(true); + var message = UtilityService.getHttpErrorMessage(response); + if (message != ""){ + message = " (" + message + ")"; + } + $scope.showError(FIELD.ERROR.SYSTEM_ERROR + message); + } + + $scope.showContentError = function(message) { + // $log.debug(message); + console.log(message); + if (UtilityService.hasContents(message)) { + $scope.showError("System failure (" + message + ")"); + } else { + $scope.showError(FIELD.ERROR.SYSTEM_ERROR); + } + } + + $scope.showError = function(message) { + $scope.isSpinnerVisible = false; + $scope.isProgressVisible = false; + $scope.error = message; + $scope.status = FIELD.STATUS.ERROR; + } + + $scope.close = function() { + if ($scope.timer != undefined) { + $timeout.cancel($scope.timer); + } + $scope.isPopupVisible = false; + } + + + + /* + * Consider converting the progress bar mechanism, the disabled button handling + * and the following methods to generic Angular directive(s) and/or approach. + */ + + $scope.enableCloseButton = function(isEnabled) { + var selector = FIELD.STYLE.MSO_CTRL_BTN; + + $scope.isCloseEnabled = isEnabled; + + if (isEnabled) { + $(selector).addClass(FIELD.STYLE.BTN_PRIMARY).removeClass(FIELD.STYLE.BTN_INACTIVE).attr(FIELD.STYLE.BTN_TYPE, FIELD.STYLE.PRIMARY); + } else { + $(selector).removeClass(FIELD.STYLE.BTN_PRIMARY).addClass(FIELD.STYLE.BTN_INACTIVE).attr(FIELD.STYLE.BTN_TYPE, FIELD.STYLE.DISABLED); + } + } + + $scope.resetProgress = function() { + $scope.percentProgress = 0; + $scope.progressClass = FIELD.STYLE.PROGRESS_BAR_INFO; + } + + $scope.setProgress = function(percentProgress) { + percentProgress = parseInt(percentProgress); + if (percentProgress >= 100) { + $scope.progressClass = FIELD.STYLE.PROGRESS_BAR_SUCCESS; + } + + if (percentProgress < $scope.percentProgress) { + return; + } + + $scope.percentProgress = percentProgress; + $scope.progressWidth = {width: percentProgress + "%"}; + if (percentProgress >= 5) { + $scope.progressText = percentProgress + " %"; + } else { + // Hidden since color combination is barely visible when progress portion is narrow. + $scope.progressText = ""; + } + } + + $scope.reloadRoute = function() { + $route.reload(); + } + + $scope.prevPage = function() { + $scope.currentPage--; + } + + $scope.nextPage = function() { + $scope.currentPage++; + } + $scope.serviceInstanceses = [{"sinstance":FIELD.NAME.SERVICE_INSTANCE_Id},{"sinstance":FIELD.NAME.SERVICE_INSTANCE_NAME}] + $scope.getSubscriberDet = function(selectedCustomer,selectedserviceinstancetype,selectedServiceInstance){ + + var sintype =selectedserviceinstancetype; + if (selectedServiceInstance != "" && selectedServiceInstance != undefined) { + selectedServiceInstance.trim(); + + // check with A&AI + $http.get(COMPONENT.AAI_GET_SERVICE_INSTANCE_PATH + selectedServiceInstance+"/"+sintype + "?r=" + Math.random(), { + + },{ + timeout: $scope.responseTimeoutMsec + }).then(function(response) { + var notFound = true; + if (angular.isArray(response.data[FIELD.ID.RESULT_DATA])) { + var item = []; + var urlParts = []; + item = response.data[FIELD.ID.RESULT_DATA][0]; + var url = item[FIELD.ID.RESOURCE_LINK]; + var globalCustomerId = ""; + var serviceSubscription = ""; + // split it and find the customer Id and service-subscription + urlParts = url.split("/"); + if (urlParts[7] === FIELD.ID.CUSTOMER) { + globalCustomerId = urlParts[8]; + } + if (urlParts[10] === FIELD.ID.SERVICE_SUBSCRIPTION) { + serviceSubscription = urlParts[11]; + } + + if (globalCustomerId !== "") { + notFound = false; + window.location.href = COMPONENT.SELECTED_SERVICE_SUB_PATH + serviceSubscription + COMPONENT.SELECTEDSUBSCRIBER_SUB_PATH + globalCustomerId + COMPONENT.SELECTEDSERVICEINSTANCE_SUB_PATH + selectedServiceInstance; + } + } + if (notFound) { + alert(FIELD.ERROR.SERVICE_INST_DNE); + } + }); // add a failure callback... + } else if (selectedCustomer != null) { + window.location.href = COMPONENT.SELECTED_SUB_PATH + selectedCustomer; + } else { + alert(FIELD.ERROR.SELECT); + } + }; + }]).directive('restrictInput', function(){ + + return { + + restrict: 'A', + require: 'ngModel', + link: function($scope, element, attr, ctrl){ + ctrl.$parsers.unshift(function(viewValue){ + + var types = $scope.$eval(attr.restrictInput); + if(!types.regex && types.type){ + + switch(types.type){ + case 'Service Instance Name' : types.regex = '^[a-zA-Z0-9-_]*$'; break; + default: types.regex= ''; + } + } + var reg = new RegExp(types.regex); + if(reg.test(viewValue)){ + return viewValue; + } else { + var overrideValue = (reg.test(viewValue) ? viewValue : ''); + element.val(overrideValue); + return overrideValue; + } + }); + } + }; + + }); +appDS2.controller('TreeCtrl', ['$scope', function ($scope) { + $scope.remove = function (scope) { + scope.remove(); + }; + + $scope.toggle = function (scope) { + scope.toggle(); + }; + + $scope.moveLastToTheBeginning = function () { + var a = $scope.data.pop(); + $scope.data.splice(0, 0, a); + }; + + $scope.newSubItem = function (scope) { + var nodeData = scope.$modelValue; + nodeData.nodes.push({ + id: nodeData.id * 10 + nodeData.nodes.length, + title: nodeData.title + '.' + (nodeData.nodes.length + 1), + nodes: [] + }); + }; + + $scope.collapseAll = function () { + $scope.$broadcast(FIELD.ID.ANGULAR_UI_TREE_COLLAPSEALL); + }; + + $scope.expandAll = function () { + $scope.$broadcast(FIELD.ID.ANGULAR_UI_TREE_EXPANDALL); + }; + + +}]); + + + diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/creationDialogController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/creationDialogController.js new file mode 100755 index 00000000..6a1c14c5 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/creationDialogController.js @@ -0,0 +1,163 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +"use strict"; + +var creationDialogController = function( COMPONENT, FIELD, $scope, $http, $timeout, $log, + CreationService, UtilityService, DataService) { + + $scope.isDialogVisible = false; + $scope.summaryControl = {}; + $scope.userProvidedControl = {}; + + var callbackFunction = undefined; + var componentId = undefined; + + $scope.$on(COMPONENT.CREATE_COMPONENT, function(event, request) { + + $scope.isSpinnerVisible = true; + $scope.isErrorVisible = false; + $scope.isDataVisible = false; + $scope.isConfirmEnabled = false; + $scope.isDialogVisible = true; + $scope.popup.isVisible = true; + + callbackFunction = request.callbackFunction; + componentId = request.componentId; + CreationService.initializeComponent(request.componentId); + + CreationService.setHttpErrorHandler(function(response) { + showError(FIELD.ERROR.SYSTEM_FAILURE, UtilityService + .getHttpErrorMessage(response)); + }); + + $scope.componentName = CreationService.getComponentDisplayName(); + + CreationService.getParameters(handleGetParametersResponse); + + }); + + var handleGetParametersResponse = function(parameters) { + $scope.summaryControl.setList(parameters.summaryList); + $scope.userProvidedControl.setList(parameters.userProvidedList); + + $scope.isSpinnerVisible = false; + $scope.isDataVisible = true; + $scope.isConfirmEnabled = true; + }; + + var validateInstanceName = function(iname) { + var patt1 = /^([a-z])+([0-9a-z\-_\.]*)$/i; + + if ( iname == null ){ + return false; + } + if ( !iname.match(patt1) ) { + return false; + } + return true; + } + + $scope.userParameterChanged = function(id) { + CreationService.updateUserParameterList(id, $scope.userProvidedControl); + } + + $scope.confirm = function() { + + var requiredFields = $scope.userProvidedControl.getRequiredFields(); + if (requiredFields !== "") { + showError(FIELD.ERROR.MISSING_DATA, requiredFields); + return; + } + + var paramList = $scope.userProvidedControl.getList(); + var instanceName = ""; + + if ( DataService.getALaCarte() ) { + if ( paramList != null ) { + for (var i = 0; i < paramList.length; i++) { + if (paramList[i].id === FIELD.ID.INSTANCE_NAME) { + instanceName = paramList[i].value; + break; + } + } + } + var isValid = validateInstanceName (instanceName); + if ( isValid ) { + $scope.isErrorVisible = false; + } else { + showError(FIELD.ERROR.INVALID_INSTANCE_NAME + instanceName, + FIELD.ERROR.INSTANCE_NAME_VALIDATE); + return; + } + } + + var requestDetails = CreationService + .getMsoRequestDetails($scope.userProvidedControl.getList()); + + $scope.isDialogVisible = false; + + $scope.$broadcast(COMPONENT.MSO_CREATE_REQ, { + url : CreationService.getMsoUrl(), + requestDetails : requestDetails, + componentId: componentId, + callbackFunction : function(response) { + if (response.isSuccessful) { + $scope.popup.isVisible = false; + runCallback(response); + } else { + $scope.isDialogVisible = false; + $scope.popup.isVisible = false; + } + } + }); + } + + $scope.cancel = function() { + $scope.isDialogVisible = false; + $scope.popup.isVisible = false; + runCallback(false); + } + + var runCallback = function(response) { + if (angular.isFunction(callbackFunction)) { + callbackFunction({ + isSuccessful : response.isSuccessful, + control : $scope.userProvidedControl.getList(), + instanceId : response.instanceId + }); + } + } + + var showError = function(summary, details) { + var message = summary; + if (UtilityService.hasContents(details)) { + message += " (" + details + ")"; + } + $scope.isSpinnerVisible = false; + $scope.isErrorVisible = true; + $scope.error = message; + } + +} + +appDS2.controller("creationDialogController", [ "COMPONENT", "FIELD", "$scope", "$http", + "$timeout", "$log", "CreationService", "UtilityService", "DataService", + creationDialogController ]); diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/deletionDialogController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/deletionDialogController.js new file mode 100755 index 00000000..137673d4 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/deletionDialogController.js @@ -0,0 +1,119 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +"use strict"; + +var deletionDialogController = function( COMPONENT, FIELD, $scope, $http, $timeout, $log, + DeletionService, UtilityService) { + + $scope.isDialogVisible = false; + $scope.summaryControl = {}; + $scope.userProvidedControl = {}; + + var callbackFunction = undefined; + var componentId = undefined; + + $scope.$on(COMPONENT.DELETE_COMPONENT, function(event, request) { + + $scope.isDataVisible = false; + $scope.isSpinnerVisible = false; + $scope.isErrorVisible = false; + $scope.isDialogVisible = true; + $scope.popup.isVisible = true; + $scope.isConfirmEnabled = false; + + callbackFunction = request.callbackFunction; + componentId = request.componentId; + + DeletionService.initializeComponent(request.componentId); + + $scope.componentName = DeletionService.getComponentDisplayName(); + + $scope.summaryControl.setList(DeletionService.getSummaryList()); + + DeletionService.getParameters(handleGetParametersResponse); + + }); + + var handleGetParametersResponse = function(parameters, dontshow) { + $scope.summaryControl.setList(parameters.summaryList); + $scope.userProvidedControl.setList(parameters.userProvidedList); + + $scope.isSpinnerVisible = false; + if (dontshow) + $scope.isDataVisible = false; + else + $scope.isDataVisible = true; + $scope.isConfirmEnabled = true; + }; + + $scope.userParameterChanged = function(id) { + DeletionService.updateUserParameterList(id, $scope.userProvidedControl); + } + + $scope.confirm = function() { + + var requiredFields = $scope.userProvidedControl.getRequiredFields(); + if (requiredFields === "") { + $scope.isErrorVisible = false; + } else { + showError(FIELD.ERROR.MISSING_DATA, requiredFields); + return; + } + + + var requestDetails = DeletionService.getMsoRequestDetails($scope.userProvidedControl.getList()); + + $scope.isDialogVisible = false; + + $scope.$broadcast(COMPONENT.MSO_DELETE_REQ, { + url : DeletionService.getMsoUrl(), + requestDetails : requestDetails, + componentId: componentId, + callbackFunction : function(isSuccessful) { + if (isSuccessful) { + $scope.popup.isVisible = false; + runCallback(true); + } else { + $scope.isDialogVisible = true; + } + } + }); + + } + + $scope.cancel = function() { + $scope.isDialogVisible = false; + $scope.popup.isVisible = false; + runCallback(false); + } + + var runCallback = function(isSuccessful) { + if (angular.isFunction(callbackFunction)) { + callbackFunction({ + isSuccessful : isSuccessful + }); + } + } +} + +appDS2.controller("deletionDialogController", [ "COMPONENT", "FIELD", "$scope", "$http", + "$timeout", "$log", "DeletionService", "UtilityService", + deletionDialogController ]); diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/detailsDialogController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/detailsDialogController.js new file mode 100755 index 00000000..ddb1ac1d --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/detailsDialogController.js @@ -0,0 +1,84 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +"use strict"; + +var detailsDialogController = function($scope, $http, $timeout, $log, + MsoService, DetailsService, UtilityService, COMPONENT, FIELD) { + + $scope.isDialogVisible = false; + $scope.summaryControl = {}; + $scope.detailsControl = {}; + + $scope.$on(COMPONENT.SHOW_COMPONENT_DETAILS, function(event, request) { + + $scope.log = ""; + $scope.isSpinnerVisible = true; + $scope.isErrorVisible = false; + $scope.isDialogVisible = true; + $scope.popup.isVisible = true; + + DetailsService.initializeComponent(request.componentId); + + $scope.componentName = DetailsService.getComponentDisplayName(); + + $scope.summaryControl.setList(DetailsService.getSummaryList()); + + $scope.detailsControl.setList(DetailsService.getDetailsList()); + + UtilityService.setHttpErrorHandler(function(response) { + showError(FIELD.ERROR.SYSTEM_FAILURE, UtilityService + .getHttpErrorMessage(response)); + }); + + MsoService.getOrchestrationRequests( + DetailsService.getMsoFilterString(), handleGetResponse); + }); + + var handleGetResponse = function(response) { + $scope.isSpinnerVisible = false; + try { + $scope.log = MsoService + .getFormattedGetOrchestrationRequestsResponse(response); + } catch (error) { + $scope.log = MsoService.getFormattedCommonResponse(response); + MsoService.showResponseContentError(error, showError); + } + } + + $scope.close = function() { + $scope.isDialogVisible = false; + $scope.popup.isVisible = false; + } + + var showError = function(summary, details) { + var message = summary; + if (UtilityService.hasContents(details)) { + message += " (" + details + ")"; + } + $scope.isSpinnerVisible = false; + $scope.isErrorVisible = true; + $scope.error = message; + } +} + +appDS2.controller("detailsDialogController", [ "$scope", "$http", "$timeout", + "$log", "MsoService", "DetailsService", "UtilityService", "COMPONENT", "FIELD", + detailsDialogController ]); diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/msoCommitController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/msoCommitController.js new file mode 100755 index 00000000..65fac289 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/msoCommitController.js @@ -0,0 +1,300 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +"use strict"; + +/* + * "msoCommitController.js" provides controller code to commit MSO requests. + * + * HIGHLIGHTS: + * + * Parent HTML/JSP code is expected to include "msoCommit.htm" (via + * "ng-include") and this file (via " +
+ +
+
+ + {{status}} +
+ +
{{errorMsg}}
{{errorDetails | json}}
+ +

Search Existing Service Instances

+
+ Please search by the Subscriber name or enter Service Instance Id or Service Instance Name below: 

+ + + + + + + + + + + + + + + + +
+
+ +
+
+
+ +    +
+
+
+ +
+
+
+ +
+
+ +
+ +
+
+ + +
+ +
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiGetSubscriberList.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiGetSubscriberList.htm new file mode 100755 index 00000000..6a911be1 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiGetSubscriberList.htm @@ -0,0 +1,67 @@ + + + + + +
+ +
+
+ + {{status}} +
+ +
{{errorMsg}}
{{errorDetails | json}}
+ +

Create New Service Instance

+ + + + + + + + + + + +
+
+ +
+
+
+ +    +
+
+ +
+ +    +
+
+ + +
+ +
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiServiceTypes.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiServiceTypes.htm new file mode 100755 index 00000000..6711bfaf --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiServiceTypes.htm @@ -0,0 +1,80 @@ + + + + + +
+ +
+
+ + {{status}} +
+
{{errorMsg}}
{{errorDetails | json}}
+

Create New Service Instance

+ + + + + + + + + + + + + + + + + +
+
+ +
+
+
+ + +
+
+
+ +
+
+
+ +    +
+
+ +
+ +    +
+
+ + +
+ +
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubDetails.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubDetails.htm new file mode 100755 index 00000000..2426f152 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubDetails.htm @@ -0,0 +1,95 @@ + + +
+ +
+
+ + + {{status}} +
+ +
{{errorMsg}}
{{errorDetails | json}}
+ +

Subscriber Details for {{selectedSubscriber}} ({{selectedSubscriberName}})

+
+
+ Filter: + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
View/EditGlobal Customer IDSubscriber NameService TypeService Instance NameService Instance ID
+ +
+ + + + + + +
+ + + Jump to page: + + Results per page: 10 + | 25 + | 50 + + +
+ + +
+ +
+ + +
+ +
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubViewEdit.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubViewEdit.htm new file mode 100755 index 00000000..a7ea8336 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubViewEdit.htm @@ -0,0 +1,147 @@ + + +
+ +
+
+
+
+
+ +
+
+ + {{status}} +
+ +

+
VIEW/EDIT SERVICE INSTANCE
+

+ + +
+ + +
+ + + + + + + + + +
SUBSCRIBER: + {{globalCustomerId}}SERVICE TYPE: + {{serviceType}}SERVICE INSTANCE + ID: {{serviceInstanceId}}
Service Instance + Name: {{serviceInstanceName || "Not defined"}} +
+ +
+ + +
+ +
+ + EXISTING +
+
+
+
    +
  1. +
+
+
+ +
+ AVAILABLE + + + +
+
+
+
    +
  1. +
+
+
+
+
+
+ + + +
+  				{{inventoryResponseItem | json}}
+			
+
+
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/createInstanceServiceModels.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/createInstanceServiceModels.htm new file mode 100755 index 00000000..a78b95ee --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/createInstanceServiceModels.htm @@ -0,0 +1,125 @@ + + + +
+
+
+
+ + + + + + Error: {{status}} + +

+ + + + + + + + + + + + + + + +
+
+ +
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+ +
+ Filter: + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActionUUIDInvariant UUIDNameVersionCategoryDistribution StatusLast Updated ByTosca Model
+ + + + + + +
+ + + Jump to page: + + Results per page: 10 + | 25 + | 50 + + +
+ +
+
+ diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/creationDialog.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/creationDialog.htm new file mode 100755 index 00000000..0ac74a9a --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/creationDialog.htm @@ -0,0 +1,64 @@ + + +
+ +
+
+ +

Create {{componentName}} -- {{createType}}

+
+ +
+ {{error}} +
+ +
+ +

+ User Provided Data ( indicates required field) +

+ + +
+

+ Enter Data and Confirm to
Create {{componentName}} +

+

+ Cancel to Return to Previous Page.
Data entered + will be lost +

+
+ +
+
+ + +
+
+ +
+ +
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/deletionDialog.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/deletionDialog.htm new file mode 100755 index 00000000..b4b93166 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/deletionDialog.htm @@ -0,0 +1,70 @@ + + +
+ +
+
+ +

Delete {{componentName}}

+
+ +
+ {{error}} +
+ + + +
+ +

+ User Provided Data ( indicates required field) +

+ + +
+

+ Enter Data and Confirm to
Delete {{componentName}} +

+

+ Cancel to Return to Previous Page.
Data entered + will be lost +

+
+
+ +
+ + + +
+
+ +
+ +
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/detailsDialog.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/detailsDialog.htm new file mode 100755 index 00000000..0e72e772 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/detailsDialog.htm @@ -0,0 +1,48 @@ + + +
+ +
+ +

Service Instance Details

+
+ +
+ {{error}} +
+ + + +

{{componentName}} Details

+ + + +

Instantiation Transactions

+ +
{{log}}
+ +
+ +
+ +
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/instantiate.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/instantiate.htm new file mode 100755 index 00000000..e4bb67ff --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/instantiate.htm @@ -0,0 +1,248 @@ + + +
+ +
+
+
+
+
+
+
+
+ + {{status}} +
+ +
{{errorMsg}}
{{errorDetails | json}}
+ +

View/Edit Service Instance

+ + +
+ +
+ + + + + + + + + +
SUBSCRIBER: + {{service.instance.subscriberName}}SERVICE TYPE: + {{service.instance.serviceType}}SERVICE INSTANCE + ID: {{service.instance.serviceInstanceId}}
Service Instance + Name: {{service.instance.name || "Not defined"}} +
+ +
+ +
+ +
    +
  1. +
    + + + + SERVICE INSTANCE: {{aService.instance.name}} + + + +
    + + +
    + + +
    + + + +
    + + + +
    +
      +
    1. +
      + + + + VNF: {{vnf.name}} | TYPE: {{vnf.nodeType}} | ORCH STATUS: {{vnf.nodeStatus}} + + + + +
      + + + +
      + + +
      + + + + +
      + +
      + + + +
      + +
      + + + + +
      + + + + + +
      +
        +
      1. +
        + + + + VFMODULE: {{vfModule.name}} | TYPE: {{vfModule.nodeType}} | ORCH STATUS: {{vfModule.nodeStatus}} + + + + +
        + +
        + + + +
        +
          +
        1. +
          + VOLUME GROUP: {{volumeGroup.name}} | TYPE: {{volumeGroup.nodeType}} | ORCH STATUS: {{volumeGroup.nodeStatus}} + + + + +
          +
        2. +
        +
      2. +
      +
        +
      1. +
        + VOLUME GROUP: {{volumeGroup.name}} | TYPE: {{volumeGroup.nodeType}} | ORCH STATUS: {{volumeGroup.nodeStatus}} + + + + + + +
        +
      2. +
      +
    2. +
    +
      +
    1. +
      + NETWORK: {{network.name}} | TYPE: {{network.nodeType}} | ORCH STATUS: {{network.nodeStatus}} + + + + + + + + +
      +
    2. +
    +
  2. +
+
+
+
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/msoCommit.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/msoCommit.htm new file mode 100755 index 00000000..e3f415c4 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/msoCommit.htm @@ -0,0 +1,47 @@ + + +
+ +
+ {{status}} +
+ + + +
{{log}}
+ +
+ +
+
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/popupWindow.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/popupWindow.htm new file mode 100755 index 00000000..b932f25d --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/popupWindow.htm @@ -0,0 +1,30 @@ + + +
+ + + + +
+
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/serviceModels.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/serviceModels.htm new file mode 100755 index 00000000..c0a8ee54 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/serviceModels.htm @@ -0,0 +1,91 @@ + + + +
+
+
+
+ + + + + + Error: {{status}} + +

+ +
+ Filter: + +
+ +

Browse SDC Service Models

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActionUUIDInvariant UUIDNameVersionCategoryDistribution StatusLast Updated ByTosca Model
+ + + + + + +
+ + + Jump to page: + + Results per page: 10 + | 25 + | 50 + + +
+ +
+
+ diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/statusDialog.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/statusDialog.htm new file mode 100755 index 00000000..914516b8 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/statusDialog.htm @@ -0,0 +1,66 @@ + + +
+ +
+ +

VNF Update Prov Status

+
+ +
+ {{error}} +
+ +
+

{{success}}

+
+ + + +

{{componentName}} Status

+ + + +

+ Modify Prov_Status: ( indicates required field) +

+ + +
+

+ Select Target Prov Status and Submit to
to Change the Prov Status of {{componentName}} +

+

+ Close to Return to Previous Page.
+

+
+ +
+ + +
+ +
diff --git a/vid-app-common/src/main/webapp/app/vid/styles/aaiGetSubs.css b/vid-app-common/src/main/webapp/app/vid/styles/aaiGetSubs.css new file mode 100755 index 00000000..feabda8e --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/styles/aaiGetSubs.css @@ -0,0 +1,62 @@ +div[ng-controller=aaiSubscriberController] .popupContents { + text-align: left; +} + +div[ng-controller=aaiSubscriberController] .statusLine { + vertical-align: center; +} + +div[ng-controller=aaiSubscriberController] .statusLine img { + width: 20px; + margin: 10px; +} + +div[ng-controller=aaiSubscriberController] .status { + margin-left: 5px; +} + +div[ng-controller=aaiSubscriberController] .feedback { + height: 35px; + vertical-align: center; +} + +div[ng-controller=aaiSubscriberController] .progress { + margin: 0px 10px; + font-weight: bold; +} + +div[ng-controller=aaiSubscriberController] .error { + width: 630px; + font-weight: bold; + font-size: 16px; + color: red; + margin: 0px 10px 0px 45px; +} + +div[ng-controller=aaiSubscriberController] .error img { + width: 25px; + margin: 0px 10px; +} + +div[ng-controller=aaiSubscriberController] .buttonRow { + text-align: center; + margin-bottom: 10px; +} + +div[ng-controller=aaiSubscriberController] .log { + width: 700px; + height: 500px; + border: solid black 1px; + text-align: left !important; + margin: 10px; + padding: 10px; + overflow: auto; +} + +div[ng-controller=aaiSubscriberController] .aaiHidden { + visibility: hidden; +} + +div[ng-controller=aaiSubscriberController] .aaiVisible { + visibility: visible; +} \ No newline at end of file diff --git a/vid-app-common/src/main/webapp/app/vid/styles/aaiSubDetails.css b/vid-app-common/src/main/webapp/app/vid/styles/aaiSubDetails.css new file mode 100755 index 00000000..feabda8e --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/styles/aaiSubDetails.css @@ -0,0 +1,62 @@ +div[ng-controller=aaiSubscriberController] .popupContents { + text-align: left; +} + +div[ng-controller=aaiSubscriberController] .statusLine { + vertical-align: center; +} + +div[ng-controller=aaiSubscriberController] .statusLine img { + width: 20px; + margin: 10px; +} + +div[ng-controller=aaiSubscriberController] .status { + margin-left: 5px; +} + +div[ng-controller=aaiSubscriberController] .feedback { + height: 35px; + vertical-align: center; +} + +div[ng-controller=aaiSubscriberController] .progress { + margin: 0px 10px; + font-weight: bold; +} + +div[ng-controller=aaiSubscriberController] .error { + width: 630px; + font-weight: bold; + font-size: 16px; + color: red; + margin: 0px 10px 0px 45px; +} + +div[ng-controller=aaiSubscriberController] .error img { + width: 25px; + margin: 0px 10px; +} + +div[ng-controller=aaiSubscriberController] .buttonRow { + text-align: center; + margin-bottom: 10px; +} + +div[ng-controller=aaiSubscriberController] .log { + width: 700px; + height: 500px; + border: solid black 1px; + text-align: left !important; + margin: 10px; + padding: 10px; + overflow: auto; +} + +div[ng-controller=aaiSubscriberController] .aaiHidden { + visibility: hidden; +} + +div[ng-controller=aaiSubscriberController] .aaiVisible { + visibility: visible; +} \ No newline at end of file diff --git a/vid-app-common/src/main/webapp/app/vid/styles/aaiSubViewEdit.css b/vid-app-common/src/main/webapp/app/vid/styles/aaiSubViewEdit.css new file mode 100755 index 00000000..feabda8e --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/styles/aaiSubViewEdit.css @@ -0,0 +1,62 @@ +div[ng-controller=aaiSubscriberController] .popupContents { + text-align: left; +} + +div[ng-controller=aaiSubscriberController] .statusLine { + vertical-align: center; +} + +div[ng-controller=aaiSubscriberController] .statusLine img { + width: 20px; + margin: 10px; +} + +div[ng-controller=aaiSubscriberController] .status { + margin-left: 5px; +} + +div[ng-controller=aaiSubscriberController] .feedback { + height: 35px; + vertical-align: center; +} + +div[ng-controller=aaiSubscriberController] .progress { + margin: 0px 10px; + font-weight: bold; +} + +div[ng-controller=aaiSubscriberController] .error { + width: 630px; + font-weight: bold; + font-size: 16px; + color: red; + margin: 0px 10px 0px 45px; +} + +div[ng-controller=aaiSubscriberController] .error img { + width: 25px; + margin: 0px 10px; +} + +div[ng-controller=aaiSubscriberController] .buttonRow { + text-align: center; + margin-bottom: 10px; +} + +div[ng-controller=aaiSubscriberController] .log { + width: 700px; + height: 500px; + border: solid black 1px; + text-align: left !important; + margin: 10px; + padding: 10px; + overflow: auto; +} + +div[ng-controller=aaiSubscriberController] .aaiHidden { + visibility: hidden; +} + +div[ng-controller=aaiSubscriberController] .aaiVisible { + visibility: visible; +} \ No newline at end of file diff --git a/vid-app-common/src/main/webapp/app/vid/styles/angular-ui-tree.css b/vid-app-common/src/main/webapp/app/vid/styles/angular-ui-tree.css new file mode 100755 index 00000000..8a0ea787 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/styles/angular-ui-tree.css @@ -0,0 +1,61 @@ +.angular-ui-tree { +} + +.angular-ui-tree-empty { + border: 1px dashed #bbb; + min-height: 100px; + background-color: #e5e5e5; + background-image: -webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), -webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff); + background-image: -moz-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), -moz-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff); + background-image: linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff); + background-size: 60px 60px; + background-position: 0 0, 30px 30px; + pointer-events: none; +} + +.angular-ui-tree-nodes { + position: relative; + margin: 0; + padding: 0; + list-style: none; +} + +.angular-ui-tree-nodes .angular-ui-tree-nodes { + padding-left: 20px; +} + +.angular-ui-tree-node, .angular-ui-tree-placeholder { + position: relative; + margin: 0; + padding: 0; + min-height: 20px; + line-height: 20px; +} + +.angular-ui-tree-hidden { + display: none; +} + +.angular-ui-tree-placeholder { + margin: 5px 0; + padding: 0; + min-height: 30px; +} + +.angular-ui-tree-handle { + cursor: move; + text-decoration: none; + font-weight: bold; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + min-height: 20px; + line-height: 20px; +} + +.angular-ui-tree-drag { + position: absolute; + pointer-events: none; + z-index: 999; + opacity: .8; +} diff --git a/vid-app-common/src/main/webapp/app/vid/styles/dialogs.css b/vid-app-common/src/main/webapp/app/vid/styles/dialogs.css new file mode 100755 index 00000000..f199aaa0 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/styles/dialogs.css @@ -0,0 +1,133 @@ +/* + * Common style sheet for the pop-up dialogs. + */ + +/* + * Common style settings ... + */ +.popupContents .titleLine img { + float: left; + margin: 5px; + width: 20px; +} + +.popupContents .titleLine>h3 { + display: inline-block; + padding-right: 40px; +} + +.popupContents .requiredIndicator { + width: 14px; + padding-bottom: 5px; +} + +.popupContents div[control=summaryControl] { + display: inline-block; + width: 600px; + margin: 0px 10px 10px 10px; +} + +.popupContents div[control=detailsControl], .popupContents div[control=userProvidedControl] + { + display: inline-block; + border: solid black 1px; + margin: 10px; + padding: 10px; + max-height: 300px; + width: 600px; + overflow: auto; +} + +.popupContents .prompt { + margin: 10px; +} + +.popupContents .prompt p { + margin: 5px; +} + +.popupContents .prompt span { + font-weight: bold; +} + +.popupContents .statusLine { + vertical-align: center; +} + +.popupContents .statusLine img { + width: 20px; + margin: 10px; +} + +.popupContents .status { + margin-left: 5px; +} + +.popupContents .feedback { + height: 35px; + vertical-align: center; +} + +.popupContents .progress { + margin: 0px 10px; +} + +.popupContents .error { + width: 630px; + text-align: left; + font-weight: bold; + font-size: 16px; + color: red; + margin: 0px 10px 0px 45px; + font-weight: bold; +} + +.popupContents .error img { + width: 25px; + margin: 0px 10px; +} + +.popupContents .buttonRow { + text-align: center; + margin-bottom: 10px; +} + +.popupContents .log { + width: 700px; + height: 500px; + border: solid black 1px; + text-align: left !important; + margin: 10px; + padding: 10px; + overflow: auto; +} + +::-webkit-input-placeholder { + text-align: center; +} + +::-moz-placeholder { + text-align: center; +} + +:-ms-input-placeholder { + text-align: center; +} + +/* + * Styling for specific screens ... + */ +div[ng-controller=detailsDialogController] .log { + height: 200px; +} + +/* + * Styling for specific screens ... + */ +div[ng-controller=statusDialogController] .log { + height: 200px; +} + +div[ng-controller=msoCommitController] { + text-align: left; +} \ No newline at end of file diff --git a/vid-app-common/src/main/webapp/app/vid/styles/dummy.txt b/vid-app-common/src/main/webapp/app/vid/styles/dummy.txt new file mode 100755 index 00000000..e69de29b diff --git a/vid-app-common/src/main/webapp/app/vid/styles/instantiate.css b/vid-app-common/src/main/webapp/app/vid/styles/instantiate.css new file mode 100755 index 00000000..13e2cf0a --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/styles/instantiate.css @@ -0,0 +1,62 @@ +div[ng-controller=InstantiationController] .popupContents { + text-align: left; +} + +div[ng-controller=InstantiationController] .statusLine { + vertical-align: center; +} + +div[ng-controller=InstantiationController] .statusLine img { + width: 20px; + margin: 10px; +} + +div[ng-controller=InstantiationController] .status { + margin-left: 5px; +} + +div[ng-controller=InstantiationController] .feedback { + height: 35px; + vertical-align: center; +} + +div[ng-controller=InstantiationController] .progress { + margin: 0px 10px; + font-weight: bold; +} + +div[ng-controller=InstantiationController] .error { + width: 630px; + font-weight: bold; + font-size: 16px; + color: red; + margin: 0px 10px 0px 45px; +} + +div[ng-controller=InstantiationController] .error img { + width: 25px; + margin: 0px 10px; +} + +div[ng-controller=InstantiationController] .buttonRow { + text-align: center; + margin-bottom: 10px; +} + +div[ng-controller=InstantiationController] .log { + width: 700px; + height: 500px; + border: solid black 1px; + text-align: left !important; + margin: 10px; + padding: 10px; + overflow: auto; +} + +div[ng-controller=InstantiationController] .aaiHidden { + visibility: hidden; +} + +div[ng-controller=InstantiationController] .aaiVisible { + visibility: visible; +} \ No newline at end of file diff --git a/vid-app-common/src/main/webapp/app/vid/styles/serviceModels.css b/vid-app-common/src/main/webapp/app/vid/styles/serviceModels.css new file mode 100755 index 00000000..0a642993 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/styles/serviceModels.css @@ -0,0 +1,70 @@ +div[ng-controller=ServiceModelController] .popupContents { + text-align: left; +} + +div[ng-controller=ServiceModelController] .statusLine { + vertical-align: center; +} + +div[ng-controller=ServiceModelController] .statusLine img { + width: 20px; + margin: 10px; +} + +div[ng-controller=ServiceModelController] .status { + margin-left: 5px; +} + +div[ng-controller=ServiceModelController] .feedback { + height: 35px; + vertical-align: center; +} + +div[ng-controller=ServiceModelController] .progress { + margin: 0px 10px; + font-weight: bold; +} + +div[ng-controller=ServiceModelController] .error { + width: 630px; + font-weight: bold; + font-size: 16px; + color: red; + margin: 0px 10px 0px 45px; +} + +div[ng-controller=ServiceModelController] .error img { + width: 25px; + margin: 0px 10px; +} + +div[ng-controller=ServiceModelController] .buttonRow { + text-align: center; + margin-bottom: 10px; +} + +div[ng-controller=ServiceModelController] .log { + width: 700px; + height: 500px; + border: solid black 1px; + text-align: left !important; + margin: 10px; + padding: 10px; + overflow: auto; +} + +div[ng-controller=ServiceModelController] .smcHidden { + visibility: hidden; +} + +div[ng-controller=ServiceModelController] .smcVisible { + visibility: visible; +} + +div[ng-controller=ServiceModelController] .progHidden { + visibility: hidden; +} + +div[ng-controller=ServiceModelController] .progVisible { + visibility: visible; +} \ No newline at end of file diff --git a/vid-app-common/src/main/webapp/app/vid/styles/subscriberSearch.css b/vid-app-common/src/main/webapp/app/vid/styles/subscriberSearch.css new file mode 100755 index 00000000..461de01a --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/styles/subscriberSearch.css @@ -0,0 +1,8 @@ +div[ng-controller=aaiSubscriberSearchController] button { + width: 200px; + margin: 3px; +} + +h3 { + margin-bottom: 5px; +} diff --git a/vid-app-common/src/main/webapp/app/vid/styles/vidTree.css b/vid-app-common/src/main/webapp/app/vid/styles/vidTree.css new file mode 100755 index 00000000..1aec73d8 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/styles/vidTree.css @@ -0,0 +1,67 @@ + +.btn { + margin-right: 8px; +} + +.angular-ui-tree-handle { + background: #f8faff; + border: 1px solid #dae2ea; + color: #7c9eb2; + padding: 10px 10px; +} + +.angular-ui-tree-handle:hover { + color: #438eb9; + background: #f4f6f7; + border-color: #dce2e8; +} + +.angular-ui-tree-placeholder { + background: #f0f9ff; + border: 2px dashed #bed2db; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +tr.angular-ui-tree-empty { + height:100px +} + +.group-title { + background-color: #687074 !important; + color: #FFF !important; +} + + +/* --- Tree --- */ +.tree-node { + border: 1px solid #dae2ea; + background: #f8faff; + color: #7c9eb2; +} + +.nodrop { + background-color: #f2dede; +} + +.tree-node-content { + margin: 10px; +} +.tree-handle { + padding: 10px; + background: #428bca; + color: #FFF; + margin-right: 10px; +} + +.angular-ui-tree-handle:hover { +} + +.angular-ui-tree-placeholder { + background: #f0f9ff; + border: 2px dashed #bed2db; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} \ No newline at end of file diff --git a/vid-app-common/src/main/webapp/app/vid/test/testAaiData.js b/vid-app-common/src/main/webapp/app/vid/test/testAaiData.js new file mode 100755 index 00000000..95dd158f --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/test/testAaiData.js @@ -0,0 +1,254 @@ +var exampleServiceModelInfo = { + modelInvariantId : "SERVICE_INVARIANT_ID_c99-b43e0d88a9a1", + modelNameVersionId : "SERVICE_NAME_VERSION_ID-4d54-8548-5d0ed23e962b", + modelName : "SERVICE_NAME_DE220127", + modelVersion : "SERVICE_VERSION_0.1" +}; + +var exampleVnfModelInfo = { + modelInvariantId : "VNF_INVARIANT_ID_c99-b43e0d88a9a1", + modelNameVersionId : "VNF_NAME_VERSION_ID-4d54-8548-5d0ed23e962b", + modelName : "VNF_NAME_DE220127", + modelVersion : "VNF_VERSION_0.1" +}; + +var exampleVfModuleModelInfo = { + modelInvariantId : "VF_MODULE_INVARIANT_ID_c99-b43e0d88a9a1", + modelNameVersionId : "VF_MODULE_NAME_VERSION_ID-4d54-8548-5d0ed23e962b", + modelName : "VF_MODULE_NAME_DE220127", + modelVersion : "VF_MODULE_VERSION_0.1" +}; + +var exampleVolumeGroupModelInfo = { + modelInvariantId : "VOLUME_GROUP_INVARIANT_ID_c99-b43e0d88a9a1", + modelNameVersionId : "VOLUME_GROUP_NAME_VERSION_ID-4d54-8548-5d0ed23e962b", + modelName : "VOLUME_GROUP_NAME_DE220127", + modelVersion : "VOLUME_GROUP_VERSION_0.1" +}; + +var exampleAvailableVolumeGroupList = [ "Volume Group Alpha", + "Volume Group Baker", "Volume Group Charlie" ]; + +var exampleNetworkModelInfo = { + modelInvariantId : "NETWORK_INVARIANT_ID_c99-b43e0d88a9a1", + modelNameVersionId : "NETWORK_NAME_VERSION_ID-4d54-8548-5d0ed23e962b", + modelName : "NETWORK_NAME_DE220127", + modelVersion : "NETWORK_VERSION_0.1" +}; + +var exampleCloudRegionTenantList = [ { + cloudRegionId : "LEGACYREGION", + tenantId : "ebe382f38e414b4dbf45b408c7e5bf9f", + tenantName : "vMOG-AKRON-123" +}, { + cloudRegionId : "LEGACYREGION", + tenantId : "abcdefhi38e414b4dbf45b408c7e5bf9f", + tenantName : "tenant 2" +}, { + cloudRegionId : "LEGACYREGION", + tenantId : "rstuvwzyx38e414b4dbf45b408c7e5bf9f", + tenantName : "tenant 3" +}, { + cloudRegionId : "cloudR2", + tenantId : "jklmnop38e414b4dbf45b408c7e5bf9f", + tenantName : "tenant4" +}, { + cloudRegionId : "cloudR2", + tenantId : "qurstuv38e414b4dbf45b408c7e5bf9f", + tenantName : "tenant 5" +}, { + cloudRegionId : "cloudR3", + tenantId : "zyxw38e414b4dbf45b408c7e5bf9f", + tenantName : "tenant 6" +} ]; + +var exampleServiceIdList = [ { + id : "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + description : "Mobility" +}, { + id : "e433710f-9217-458d-a79d-1c7aff376d89", + description : "VIRTUAL USP" +}, { + id : "c7611ebe-c324-48f1-8085-94aef0c6ef3d", + description : "HOSTED COMMUNICATIONS" +} ]; + +var exampleServiceItem = { + "generic-service" : { + "service-id" : "415d4d6c-19e8-44ed-bd28-28d41c5b5185", + "service-name" : "ZRDM1MMSC01", + "service-type" : "vMMSC Svc Jul 12/vMMSC VOLUME VF new Jul 12 13", + "service-id" : "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "orchestration-status" : "active", + "in-maint" : false, + "is-closed-loop-disabled" : false, + "resource-version" : "1469558690", + "persona-model-id" : "1fe5c0e1-7ae8-4a3b-bf06-e64b9fa7e7c9", + "persona-model-version" : "1.0" + } +}; + +var exampleVfModuleItem = { + "generic-vfModule" : { + "vfModule-id" : "415d4d6c-19e8-44ed-bd28-28d41c5b5185", + "vfModule-name" : "ZRDM1MMSC01", + "vfModule-type" : "vMMSC Svc Jul 12/vMMSC VOLUME VF new Jul 12 13", + "vfModule-id" : "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "orchestration-status" : "active", + "in-maint" : false, + "is-closed-loop-disabled" : false, + "resource-version" : "1469558690", + "persona-model-id" : "1fe5c0e1-7ae8-4a3b-bf06-e64b9fa7e7c9", + "persona-model-version" : "1.0" + } +}; + +var exampleVolumeGroupItem = { + "generic-volumeGroup" : { + "volumeGroup-id" : "415d4d6c-19e8-44ed-bd28-28d41c5b5185", + "volumeGroup-name" : "ZRDM1MMSC01", + "volumeGroup-type" : "vMMSC Svc Jul 12/vMMSC VOLUME VF new Jul 12 13", + "volumeGroup-id" : "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "orchestration-status" : "active", + "in-maint" : false, + "is-closed-loop-disabled" : false, + "resource-version" : "1469558690", + "persona-model-id" : "1fe5c0e1-7ae8-4a3b-bf06-e64b9fa7e7c9", + "persona-model-version" : "1.0" + } +}; + +var exampleNetworkItem = { + "generic-network" : { + "network-id" : "415d4d6c-19e8-44ed-bd28-28d41c5b5185", + "network-name" : "ZRDM1MMSC01", + "network-type" : "vMMSC Svc Jul 12/vMMSC VOLUME VF new Jul 12 13", + "network-id" : "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "orchestration-status" : "active", + "in-maint" : false, + "is-closed-loop-disabled" : false, + "resource-version" : "1469558690", + "persona-model-id" : "1fe5c0e1-7ae8-4a3b-bf06-e64b9fa7e7c9", + "persona-model-version" : "1.0" + } +}; + +/* + * Sample query provided by Jimmy on 8/11/16. + */ + +var exampleAaiResult = { + "service-instance" : { + "service-instance-id" : "mmsc-test-service-instance", + "resource-version" : "1470921501" + }, + "extra-properties" : {}, + "inventory-response-items" : { + "inventory-response-item" : [ { + "generic-vnf" : { + "vnf-id" : "415d4d6c-19e8-44ed-bd28-28d41c5b5185", + "vnf-name" : "ZRDM1MMSC01", + "vnf-type" : "vMMSC Svc Jul 12/vMMSC VOLUME VF new Jul 12 13", + "service-id" : "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "orchestration-status" : "active", + "in-maint" : false, + "is-closed-loop-disabled" : false, + "resource-version" : "1469558690", + "persona-model-id" : "1fe5c0e1-7ae8-4a3b-bf06-e64b9fa7e7c9", + "persona-model-version" : "1.0" + }, + "extra-properties" : {}, + "inventory-response-items" : { + "inventory-response-item" : [ { + "vf-module" : { + "vf-module-id" : "4dd25057-0b2b-4255-b9cd-669443c9b470", + "vf-module-name" : "ZRDM1MMSC01_base", + "heat-stack-id" : "ZRDM1MMSC01_base/6261554c-6c34-4604-b91c-68afd148a096", + "orchestration-status" : "active", + "is-base-vf-module" : true, + "resource-version" : "1469559159", + "persona-model-id" : "6e3b9ac7-cb21-4f39-99ba-f248ba2a597a", + "persona-model-version" : "1" + }, + "extra-properties" : {}, + "inventory-response-items" : { + "inventory-response-item" : [ + { + "l3-network" : { + "network-id" : "b13635a1-5ab8-4dee-9598-768a83eea099", + "network-name" : "MMS-24413-LAB-vMMSC-01_int_eca_mgmt_net_1", + "network-type" : "CONTRAIL_BASIC", + "network-role" : "int_eca_mgmt", + "network-technology" : "contrail", + "neutron-network-id" : "07919187-754f-49c2-abb3-9888cfd8ec7d", + "is-bound-to-vpn" : false, + "service-id" : "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "network-role-instance" : 0, + "resource-version" : "1469558694", + "orchestration-status" : "active", + "heat-stack-id" : "MMS-24413-LAB-vMMSC-01_int_eca_mgmt_net_1/8d34d139-c95f-4d80-86df-d7d13af01067" + }, + "extra-properties" : {}, + "inventory-response-items" : {} + }, + { + "l3-network" : { + "network-id" : "44e0d9e0-9334-4ec6-9344-07a96dac629f", + "network-name" : "dmz_protected_net_0", + "network-type" : "CONTRAIL_EXTERNAL", + "network-role" : "dmz_protected", + "network-technology" : "contrail", + "neutron-network-id" : "1ad6b2c5-97d0-4298-b016-7e28939e0baf", + "is-bound-to-vpn" : false, + "service-id" : "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "resource-version" : "1469563787", + "orchestration-status" : "active", + "heat-stack-id" : "dmz_protected_net_0/3f93df5c-f4f1-484f-a269-12d3a6b1ec82" + }, + "extra-properties" : {}, + "inventory-response-items" : {} + }, + { + "l3-network" : { + "network-id" : "ac49d99b-5daf-4624-9f8e-188b126ea166", + "network-name" : "cor_direct_net_0", + "network-type" : "CONTRAIL_BASIC", + "network-role" : "cor_direct", + "network-technology" : "contrail", + "neutron-network-id" : "ac49d99b-5daf-4624-9f8e-188b126ea166", + "is-bound-to-vpn" : false, + "service-id" : "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "network-role-instance" : 0, + "resource-version" : "1470846979", + "orchestration-status" : "active", + "heat-stack-id" : "", + "mso-catalog-key" : "" + }, + "extra-properties" : {}, + "inventory-response-items" : {} + }, + { + "l3-network" : { + "network-id" : "c597ab81-fece-49f4-a4f5-710cebb13c29", + "network-name" : "oam_protected_net_0", + "network-type" : "CONTRAIL_BASIC", + "network-role" : "oam_protected", + "network-technology" : "contrail", + "neutron-network-id" : "c597ab81-fece-49f4-a4f5-710cebb13c29", + "is-bound-to-vpn" : false, + "service-id" : "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "network-role-instance" : 0, + "resource-version" : "1470846979", + "orchestration-status" : "active", + "heat-stack-id" : "", + "mso-catalog-key" : "" + }, + "extra-properties" : {}, + "inventory-response-items" : {} + } ] + } + } ] + } + } ] + } +}; diff --git a/vid-app-common/src/main/webapp/app/vid/test/testMso.css b/vid-app-common/src/main/webapp/app/vid/test/testMso.css new file mode 100755 index 00000000..b0844ee7 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/test/testMso.css @@ -0,0 +1,22 @@ +div[ng-controller=testController] button { + width: 200px; + margin: 3px; +} + +h3 { + margin-bottom: 5px; +} + +ol, li { + list-style-type: decimal !important; +} + +div[ng-controller=testController]>div>span { + font-size: 20px; + margin-left: 10px; +} + +div[ng-controller=testController] input[type=checkbox] { + height: 20px; + width: 20px; +} \ No newline at end of file diff --git a/vid-app-common/src/main/webapp/app/vid/test/testMso.js b/vid-app-common/src/main/webapp/app/vid/test/testMso.js new file mode 100755 index 00000000..884ba8d8 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/test/testMso.js @@ -0,0 +1,486 @@ +"use strict"; + +app.config(function($logProvider){ + // Optionally set to "false" to disable debug logging. + $logProvider.debugEnabled(true); +}); + +app.controller("testController", [ "$scope", "$timeout", "$cookieStore", "$log", "COMPONENT", "DataService", "PropertyService", + function($scope, $timeout, $cookieStore, $log, COMPONENT, DataService, PropertyService) { + + $scope.popup = new Object(); + $scope.isTestMode = false; + + $scope.init = function(properties) { + /* + * These 2 statements should be included in non-test code. + */ + PropertyService.setMsoMaxPollingIntervalMsec(properties.msoMaxPollingIntervalMsec); + PropertyService.setMsoMaxPolls(properties.msoMaxPolls); + + /* + * "setTestMode" is only used for testing. + */ + + setTestMode(); + + DataService.setSubscriberName("Mobility"); + DataService.setGlobalCustomerId("CUSTID12345") + DataService.setServiceType("Mobility Type 1"); + DataService.setServiceName("Mobility Service 1"); + DataService.setServiceInstanceId("mmsc-test-service-instance"); + DataService.setVnfInstanceId("abcd-12345-56789"); + DataService.setVfModuleInstanceId("xye-99990123213"); + } + + var TEST_MODE_COOKIE = "isTestModeEnabled"; + + var defaultMsoBaseUrl = PropertyService.getMsoBaseUrl(); + + var setTestMode = function() { + setTestMsoMode($cookieStore.get(TEST_MODE_COOKIE)); + PropertyService.setMsoMaxPollingIntervalMsec(1000); + PropertyService.setMsoMaxPolls(7); + PropertyService.setServerResponseTimeoutMsec(10000); + }; + + $scope.testMsoModeChanged = function() { + setTestMsoMode($scope.isTestMsoMode); + }; + + var setTestMsoMode = function(isEnabled) { + $scope.isTestMsoMode = isEnabled; + $cookieStore.put(TEST_MODE_COOKIE, isEnabled); + if (isEnabled) { + PropertyService.setMsoBaseUrl("testmso"); + } else { + PropertyService.setMsoBaseUrl(defaultMsoBaseUrl); + } + } + + $scope.autoStartCommitTest = function() { + /* + * Optionally comment in / out one of these method calls (or add a similar + * entry) to auto-invoke an entry when the test screen is redrawn. + */ + $timeout(function() { + // $scope.createServiceInstance(); + // $scope.deleteServiceInstance(); + // $scope.generateInvalidUrl404(); + }, 500); + } + + $scope.autoStartQueryTest = function() { + /* + * Optionally comment in / out one of these method calls (or add a similar + * entry) to auto-invoke an entry when the test screen is redrawn. + */ + $timeout(function() { + // $scope.queryServiceInstance(); + }, 500); + } + + $scope.queryServiceInstance = function() { + /* + * Example of method call needed to show service instance details. + */ + $scope.$broadcast("showComponentDetails", { + componentId : COMPONENT.SERVICE + }); + } + + $scope.createServiceInstance = function() { + /* + * Example of method call needed to commit an instance creation request. + */ + $scope.$broadcast("createInstance", { + url : "mso_create_svc_instance", + requestDetails : createServiceRequestDetails + }); + } + + $scope.deleteServiceInstance = function() { + /* + * Example of method call needed to commit an instance deletion request. + */ + $scope.$broadcast("deleteInstance", { + url : "mso_delete_svc_instance/bc305d54-75b4-431b-adb2-eb6b9e546014", + requestDetails : deleteServiceRequestDetails + }); + } + + $scope.createVNFInstance = function() { + /* + * Example of method call needed to commit an instance creation request. + */ + $scope.$broadcast("createInstance", { + url : "mso_create_vnf_instance/bc305d54-75b4-431b-adb2-eb6b9e546099", + requestDetails : createVnfRequestDetails + }); + } + + $scope.deleteVNFInstance = function() { + /* + * Example of method call needed to commit an instance deletion request. + */ + $scope.$broadcast("deleteInstance", { + url : "mso_delete_vnf_instance/bc305d54-75b4-431b-adb2-eb6b9e546014/vnfs/ab9000-0009-9999", + requestDetails : deleteVnfRequestDetails + }); + } + + $scope.createVolumeGroupInstance = function() { + /* + * Example of method call needed to commit an instance creation request. + */ + $scope.$broadcast("createInstance", { + url : "mso_create_volumegroup_instance/bc305d54-75b4-431b-adb2-eb6b9e546099/vnfs/fe305d54-75b4-431b-adb2-eb6b9e546fea", + requestDetails : createVolumeGroupRequestDetails + }); + } + + $scope.deleteVolumeGroupInstance = function() { + /* + * Example of method call needed to commit an instance deletion request. + */ + $scope.$broadcast("deleteInstance", { + url : "mso_delete_volumegroup_instance/bc305d54-75b4-431b-adb2-eb6b9e546014/vnfs/fe305d54-75b4-431b-adb2-eb6b9e546fea/volumeGroups/fe9000-0009-9999", + requestDetails : deleteVolumeGroupRequestDetails + }); + } + $scope.createVFModuleInstance = function() { + /* + * Example of method call needed to commit an instance creation request. + */ + $scope.$broadcast("createInstance", { + url : "mso_create_vfmodule_instance/bc305d54-75b4-431b-adb2-eb6b9e546099/vnfs/111-111-111-111", + requestDetails : createVFModuleRequestDetails + }); + } + + $scope.deleteVFModuleInstance = function() { + /* + * Example of method call needed to commit an instance deletion request. + * + */ + $scope.$broadcast("deleteInstance", { + url : "mso_delete_vfmodule_instance/2/vnfs/ab/vfModules/a1", + requestDetails : deleteVFModuleRequestDetails + }); + } + $scope.createNetworkInstance = function() { + $scope.$broadcast("createInstance", { + url : "mso_create_nw_instance/789098877777", + requestDetails : createNetworkRequestDetails + }); + } + + $scope.deleteNetworkInstance = function() { + $scope.$broadcast("deleteInstance", { + url : "mso_delete_nw_instance/bc305d54-75b4-431b-adb2-eb6b9e546014/networks/ff305d54-75b4-ff1b-fff1-eb6b9e5460ff", + requestDetails : deleteNetworkRequestDetails + }); + } + + $scope.generateError = function(testName) { + // Clone example request object + var request = JSON.parse(JSON.stringify(createServiceRequestDetails)); + request.modelInfo.modelName = testName; + $scope.$broadcast("createInstance", { + url : "mso_create_svc_instance", + requestDetails : request + }); + } + + $scope.generateInvalidUrl404 = function() { + var baseUrl = PropertyService.getMsoBaseUrl(); + PropertyService.setMsoBaseUrl("/INVALID_STRING/"); + + $scope.$broadcast("createInstance", { + url : "mso_create_svc_instance", + requestDetails : createServiceRequestDetails, + callbackFunction : function() { + PropertyService.setMsoBaseUrl(baseUrl); + $scope.popup.isVisible = false; + } + }); + } + + $scope.generateInvalidUrl405 = function() { + $scope.$broadcast("createInstance", { + url : "INVALID_STRING_mso_create_svc_instance", + requestDetails : createServiceRequestDetails + }); + } + + /* + * Test data objects: + */ + /*var requestParameters = { + "subscriptionServiceType":"ef5256d1-5a33-aadf-13ab-12abad84e764", + "userParams":[{"name":"goldenr","value":"Willie"}, {"name":"lab","value":"Jackson"}, {"name":"goldend","value":"Max"}]} */ + var requestParameters = { "subscriptionServiceType":"ef5256d1-5a33-aadf-13ab-12abad84e764", userParams:[] }; + var requestInfo = { + instanceName: "sn5256d1-5a33-55df-13ab-12abad84e764", + productFamilyId: "sn5256d1-5a33-55df-13ab-12abad84edde", + source: "VID", + suppressRollback: true + }; + var subscriberInfo = { + globalSubscriberId : "C12345", + subscriberName : "General Electric Division 12" + }; + + var cloudConfiguration = { + lcpCloudRegionId: "cloudregion1", + tenantId: "df5256d1-5a33-55df-13ab-12abad843456" + + }; + var createServiceRequestDetails = { + modelInfo : { + modelType : "service", + modelInvariantId : "sn5256d1-5a33-55df-13ab-12abad84e764", + modelNameVersionId : "ab6478e4-ea33-3346-ac12-ab121484adca", + modelName : "WanBonding", + modelVersion : "1", + modelCustomizationName: "" + }, + subscriberInfo : subscriberInfo, + requestInfo : requestInfo, + requestParameters : requestParameters + }; + + var deleteServiceRequestDetails = { + modelInfo : { + modelType : "service", + modelInvariantId : "sn5256d1-5a33-55df-13ab-12abad84e764", + modelNameVersionId : "ab6478e4-ea33-3346-ac12-ab121484adca", + modelName : "WanBonding", + modelVersion : "1", + modelCustomizationName: "" + }, + requestInfo : requestInfo + }; + + var createVFModuleRequestDetails = { + modelInfo : { + modelType : "VFModule", + modelInvariantId : "ab5256d1-5a33-55df-13ab-12abad84e764", + modelNameVersionId : "9b6478e4-ea33-3346-ac12-ab121484adc2", + modelName : "model1", + modelVersion : "1", + modelCustomizationName: "" + }, + cloudConfiguration: cloudConfiguration, + requestInfo : requestInfo, + relatedInstanceList: [ + { + relatedInstance: { + instanceId: "c3514e3-5a33-55df-13ab-12abad84e7cc", + modelInfo: { + modelType: "volumeGroup", + modelInvariantId: "ff3514e3-5a33-55df-13ab-12abad84e7ff", + modelNameVersionId: "fe6985cd-ea33-3346-ac12-ab121484a3fe", + modelName: "parentServiceModelName", + modelVersion: "1.0" + } + } + }, + { + relatedInstance: { + instanceId: "c3514e3-5a33-55df-13ab-12abad84e7cc", + modelInfo: { + modelType: "service", + modelInvariantId: "ff3514e3-5a33-55df-13ab-12abad84e7ff", + modelNameVersionId: "fe6985cd-ea33-3346-ac12-ab121484a3fe", + modelName: "parentServiceModelName", + modelVersion: "1.0" + } + } + }, + { + relatedInstance: { + instanceId: "fab256d1-5a33-55df-13ab-12abad8445ff34", + modelInfo: { + modelType: "vnf", + modelInvariantId: "ff5256d1-5a33-55df-13ab-12abad84e7ff", + modelNameVersionId: "fe6478e4-ea33-3346-ac12-ab121484a3fe", + modelName: "vSAMP12", + modelVersion: "1.0", + modelCustomizationName: "vSAMP12 1" + } + } + } + + ], + requestParameters : requestParameters + }; + + var deleteVFModuleRequestDetails = { + modelInfo : { + modelType : "VFModule", + modelInvariantId : "ab5256d1-5a33-55df-13ab-12abad84e764", + modelNameVersionId : "9b6478e4-ea33-3346-ac12-ab121484adc2", + modelName : "model1", + modelVersion : "1", + modelCustomizationName: "" + }, + cloudConfiguration: cloudConfiguration, + requestInfo : requestInfo, + + }; + + var createVnfRequestDetails = { + modelInfo : { + modelType : "vnf", + modelInvariantId : "ab5256d1-5a33-55df-13ab-12abad84efc2", + modelNameVersionId : "9b6478e4-ea33-3346-ac12-ab1214847890", + modelName : "model1", + modelVersion : "1", + modelCustomizationName: "" + }, + requestInfo : requestInfo, + cloudConfiguration : cloudConfiguration, + relatedInstanceList: [ + { + relatedInstance: { + instanceId: "c3514e3-5a09-55df-13ab-1babad84e7cc", + modelInfo: { + modelType: "service", + modelInvariantId: "ff3514e3-5a33-55df-13ab-12abad84e7ff", + modelNameVersionId: "fe6985cd-ea33-3346-ac12-ab121484a3fe", + modelName: "parentServiceModelName", + modelVersion: "1.0" + } + } + } + ] + }; + + var deleteVnfRequestDetails = { + modelInfo : { + modelType : "vnf", + modelInvariantId : "ab5256d1-5a33-55df-13ab-12abad84efc2", + modelNameVersionId : "9b6478e4-ea33-3346-ac12-ab1214847890", + modelName : "model1", + modelVersion : "1", + modelCustomizationName: "" + }, + cloudConfiguration : cloudConfiguration, + requestInfo : requestInfo + }; + var createVolumeGroupRequestDetails = { + modelInfo : { + modelType : "volumeGroup", + modelInvariantId : "ab5256d1-5a33-55df-13ab-12abad84efda", + modelNameVersionId : "9b6478e4-ea33-3346-ac12-ab12148478fa", + modelName : "model1", + modelVersion : "1", + modelCustomizationName: "" + }, + cloudConfiguration : cloudConfiguration, + requestInfo : requestInfo, + relatedInstanceList: [ + { + relatedInstance: { + instanceId: "c3514e3-5a33-55df-13ab-12abad84e7cc", + modelInfo: { + modelType: "service", + modelInvariantId: "ff3514e3-5a33-55df-13ab-12abad84e7ff", + modelNameVersionId: "fe6985cd-ea33-3346-ac12-ab121484a3fe", + modelName: "parentServiceModelName", + modelVersion: "1.0" + } + } + }, + { + relatedInstance: { + instanceId: "fab256d1-5a33-55df-13ab-12abad8445ff34", + modelInfo: { + modelType: "vnf", + modelInvariantId: "ff5256d1-5a33-55df-13ab-12abad84e7ff", + modelNameVersionId: "fe6478e4-ea33-3346-ac12-ab121484a3fe", + modelName: "vSAMP12", + modelVersion: "1.0", + modelCustomizationName: "vSAMP12 1" + } + } + } + ] + + }; + + var deleteVolumeGroupRequestDetails = { + modelInfo : { + modelType : "volumeGroup", + modelInvariantId : "ab5256d1-5a33-55df-13ab-12abad84efda", + modelNameVersionId : "9b6478e4-ea33-3346-ac12-ab12148478fa", + modelName : "vIsbcOamNetwork", + modelVersion : "1", + modelCustomizationName: "" + }, + cloudConfiguration : cloudConfiguration, + requestInfo : requestInfo + }; + + var createNetworkRequestDetails = { + modelInfo : { + modelType : "network", + modelInvariantId : "ab5256d1-5a33-55df-13ab-12abad84e890", + modelNameVersionId : "fe6478e4-ea33-3346-aaaa-ab121484a3fa", + modelName : "vIsbcOamNetwork", + modelVersion : "1", + modelCustomizationName: "" + }, + cloudConfiguration: cloudConfiguration, + requestInfo : requestInfo + }; + + var deleteNetworkRequestDetails = { + modelInfo : { + modelType : "network", + modelId : "ff5256d1-5a33-55df-aaaa-12abad84e7ff", + modelNameVersionId : "fe6478e4-ea33-3346-aaaa-ab121484a3fe", + modelName : "vIsbcOamNetwork", + modelVersion : "1" + }, + relatedModelList : [ + { + relatedModel : { + instanceId : "ff305d54-75b4-431b-adb2-eb6b9e5ff000", + modelInfo : { + modelType : "service", + modelId : "ff3514e3-5a33-55df-13ab-12abad84e7ff", + modelNameVersionId : "fe6985cd-ea33-3346-ac12-ab121484a3fe", + modelName : "Intercarrier Interconnect Session Border Controller", + modelVersion : "1" + } + } + }, + { + relatedModel : { + instanceId : "ff305d54-75b4-ff1b-adb2-eb6b9e5460ff", + modelInfo : { + modelType : "vnf", + modelId : "ff5256d1-5a33-55df-13ab-12abad84e7ff", + modelNameVersionId : "fe6478e4-ea33-3346-ac12-ab121484a3fe", + modelName : "vIsbc", + modelVersion : "1" + } + } + }, + { + relatedModel : { + instanceId : "ff305d54-75b4-ff1b-bdb2-eb6b9e5460ff", + modelInfo : { + modelType : "vfModule", + modelId : "ff5256d1-5a33-55df-13ab-22abad84e7ff", + modelNameVersionId : "fe6478e4-ea33-3346-bc12-ab121484a3fe", + modelName : "vIsbcRtpExpansionModule", + modelVersion : "1" + } + } + } ] + }; + } +]); diff --git a/vid-app-common/src/main/webapp/app/vid/test/testViewEdit.css b/vid-app-common/src/main/webapp/app/vid/test/testViewEdit.css new file mode 100755 index 00000000..0dfb4507 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/test/testViewEdit.css @@ -0,0 +1,30 @@ +div[ng-controller=testViewEditController] button { + width: 120px; +} + +div[ng-controller=testViewEditController]>table { + border: solid black 1px; + width: auto; +} + +div[ng-controller=testViewEditController]>table td { + border: solid black 1px; +} + +h3 { + margin-bottom: 5px; +} + +ol, li { + list-style-type: decimal !important; +} + +div[ng-controller=testViewEditController]>div>span { + font-size: 20px; + margin-left: 10px; +} + +div[ng-controller=testViewEditController] input[type=checkbox] { + height: 20px; + width: 20px; +} \ No newline at end of file diff --git a/vid-app-common/src/main/webapp/app/vid/test/testViewEdit.js b/vid-app-common/src/main/webapp/app/vid/test/testViewEdit.js new file mode 100755 index 00000000..73da4db7 --- /dev/null +++ b/vid-app-common/src/main/webapp/app/vid/test/testViewEdit.js @@ -0,0 +1,376 @@ +"use strict"; + +app.config(function($logProvider) { + // Optionally set to "false" to disable debug logging. + $logProvider.debugEnabled(true); +}); + +var testViewEditController = function(COMPONENT, DataService, PropertyService, + UtilityService, $scope, $timeout, $cookieStore, $log) { + + $scope.popup = new Object(); + $scope.isTestMode = false; + + $scope.init = function(properties) { + + /* + * These 2 statements should be included in non-test code. + */ + PropertyService + .setMsoMaxPollingIntervalMsec(properties.msoMaxPollingIntervalMsec); + PropertyService.setMsoMaxPolls(properties.msoMaxPolls); + + /* + * Common parameters that shows an example of how the view edit screen + * is expected to pass some common service instance values to the + * popups. + */ + + DataService.setSubscriberName("Mobility"); + DataService.setGlobalCustomerId("CUSTID12345") + DataService.setServiceType("Mobility Type 1"); + DataService.setServiceInstanceName("Example Service Instance Name"); + DataService.setServiceName("Mobility Service 1"); + DataService.setServiceInstanceId("mmsc-test-service-instance"); + DataService.setServiceUuid("XXXX-YYYY-ZZZZ"); + DataService.setUserServiceInstanceName("USER_SERVICE_INSTANCE_NAME"); + + /* + * "setTestMode" is only used for testing. + */ + + setTestMode(); + + } + + $scope.autoStartTest = function() { + /* + * Optionally comment in / out one of these method calls (or add a + * similar entry) to auto-invoke an entry as soon as the page is + * refreshed. + */ + $timeout(function() { + // $scope.showServiceDetails(); + // $scope.showVnfDetails(); + // $scope.createService(); + // $scope.deleteService(); + // $scope.createNetwork(); + // $scope.createVnf(); + // $scope.createVfModule(); + // $scope.deleteVnf(); + // $scope.createVfModule(); + }, 500); + } + + /* + * This block of code is only used for testing. + */ + + /* + * The first 3 functions override default values set in the server + * properties file. + * + * 1) The URL for the MSO controller is set to either the "real" controller + * or the test version depending on the "Use test MSO controller" checkbox. + * + * 2) SDC and AAI are set to use test controller versions. + * + * 3) Maximum polling and timeout values are set to lower values to lessen + * the time required to run tests. + * + */ + + var TEST_MODE_COOKIE = "isTestModeEnabled"; + + var defaultMsoBaseUrl = PropertyService.getMsoBaseUrl(); + + var setTestMode = function() { + setTestMsoMode($cookieStore.get(TEST_MODE_COOKIE)); + PropertyService.setAaiBaseUrl("testaai"); + PropertyService.setAsdcBaseUrl("testasdc"); + PropertyService.setMsoMaxPollingIntervalMsec(1000); + PropertyService.setMsoMaxPolls(7); + PropertyService.setServerResponseTimeoutMsec(10000); + }; + + $scope.testMsoModeChanged = function() { + setTestMsoMode($scope.isTestMsoMode); + }; + + var setTestMsoMode = function(isEnabled) { + $scope.isTestMsoMode = isEnabled; + $cookieStore.put(TEST_MODE_COOKIE, isEnabled); + if (isEnabled) { + PropertyService.setMsoBaseUrl("testmso"); + } else { + PropertyService.setMsoBaseUrl(defaultMsoBaseUrl); + } + }; + + var callbackFunction = function(response) { + $scope.callbackResults = ""; + var color = "none"; + $scope.callbackStyle = { + "background-color" : color + }; + /* + * This 1/2 delay was only added to visually highlight the status + * change. Probably not needed in the real application code. + */ + $timeout(function() { + $scope.callbackResults = UtilityService.getCurrentTime() + + " isSuccessful: " + response.isSuccessful; + if (response.isSuccessful) { + color = "#8F8"; + } else { + color = "#F88"; + } + $scope.callbackStyle = { + "background-color" : color + }; + }, 500); + }; + + /* + * End of block of test-specific code + */ + + /* + * Create functions + */ + $scope.createService = function() { + + DataService.setModelId("91238134091820938018230918230989"); + + $scope.$broadcast("createComponent", { + componentId : COMPONENT.SERVICE, + callbackFunction : callbackFunction + }); + } + + $scope.createVnf = function() { + + DataService.setModelId("91238134091820938018230918230989"); + DataService.setModelInstanceName("VNF_MODEL_INSTANCE_NAME"); + + DataService.setCloudRegionTenantList(exampleCloudRegionTenantList) + DataService.setServiceIdList(exampleServiceIdList); + + // Data used to create MSO "relatedInstanceList" object + + DataService.setModelInfo(COMPONENT.SERVICE, exampleServiceModelInfo); + + $scope.$broadcast("createComponent", { + componentId : COMPONENT.VNF, + callbackFunction : callbackFunction + }); + } + + $scope.createVfModule = function() { + DataService + .setInventoryItem(exampleAaiResult["inventory-response-items"][0]); + + DataService.setModelId("91238134091820938018230918230989"); + DataService.setModelInstanceName("VF_MODULE_MODEL_INSTANCE_NAME"); + + DataService.setLcpRegion("Region2"); + DataService.setTenant("Tenant2"); + // Data used to create MSO "relatedInstanceList" object + + DataService.setModelInfo(COMPONENT.SERVICE, exampleServiceModelInfo); + + DataService.setVnfInstanceId("VNF_INSTANCE_ID_12345"); + DataService.setModelInfo(COMPONENT.VNF, exampleVnfModelInfo); + + DataService.setVolumeGroupInstanceId("VOLUME_GROUP_INSTANCE_ID_12345"); + DataService + .setAvailableVolumeGroupList(exampleAvailableVolumeGroupList); + DataService.setModelInfo(COMPONENT.VOLUME_GROUP, + exampleVolumeGroupModelInfo); + + $scope.$broadcast("createComponent", { + componentId : COMPONENT.VF_MODULE, + callbackFunction : callbackFunction + }); + } + + $scope.createVolumeGroup = function() { + + DataService.setModelId("91238134091820938018230918230989"); + DataService.setModelInstanceName("VOLUME_GROUP_MODEL_INSTANCE_NAME"); + DataService.setLcpRegion("Region1"); + DataService.setTenant("Tenant1"); + // Data used to create MSO "relatedInstanceList" object + + DataService.setModelInfo(COMPONENT.SERVICE, exampleServiceModelInfo); + + DataService.setVnfInstanceId("VNF_INSTANCE_ID_12345"); + DataService.setModelInfo(COMPONENT.VNF, exampleVnfModelInfo); + + $scope.$broadcast("createComponent", { + componentId : COMPONENT.VOLUME_GROUP, + callbackFunction : callbackFunction + }); + } + + $scope.createNetwork = function() { + + DataService.setModelId("91238134091820938018230918230989"); + DataService.setModelInstanceName("NETWORK_MODEL_INSTANCE_NAME"); + + DataService.setCloudRegionTenantList(exampleCloudRegionTenantList) + DataService.setServiceIdList(exampleServiceIdList); + + // Data used to create MSO "relatedInstanceList" object + + DataService.setModelInfo(COMPONENT.SERVICE, exampleServiceModelInfo); + + $scope.$broadcast("createComponent", { + componentId : COMPONENT.NETWORK, + callbackFunction : callbackFunction + }); + } + + /* + * Delete functions + */ + $scope.deleteService = function() { + + DataService.setInventoryItem(exampleServiceItem); + + DataService.setModelInfo(COMPONENT.SERVICE, exampleServiceModelInfo); + + $scope.$broadcast("deleteComponent", { + componentId : COMPONENT.SERVICE, + callbackFunction : callbackFunction + }); + } + + $scope.deleteVnf = function() { + + DataService + .setInventoryItem(exampleAaiResult["inventory-response-items"]["inventory-response-item"][0]); + + DataService.setVnfInstanceId("VNF_INSTANCE_ID_12345"); + DataService.setModelInfo(COMPONENT.VNF, exampleVnfModelInfo); + DataService.setLcpRegion("Region3"); + DataService.setTenant("Tenant3"); + + $scope.$broadcast("deleteComponent", { + componentId : COMPONENT.VNF, + callbackFunction : callbackFunction + }); + } + + $scope.deleteVfModule = function() { + + DataService.setInventoryItem(exampleVfModuleItem); + + DataService.setVnfInstanceId("VNF_INSTANCE_ID_12345"); + + DataService.setVfModuleInstanceId("VF_MODULE_INSTANCE_ID_12345"); + DataService.setModelInfo(COMPONENT.VF_MODULE, exampleVfModuleModelInfo); + DataService.setLcpRegion("Region4"); + DataService.setTenant("Tenant4"); + + $scope.$broadcast("deleteComponent", { + componentId : COMPONENT.VF_MODULE, + callbackFunction : callbackFunction + }); + } + + $scope.deleteVolumeGroup = function() { + + DataService.setInventoryItem(exampleVolumeGroupItem); + + DataService.setVolumeGroupInstanceId("VOLUME_GROUP_INSTANCE_ID_12345"); + DataService.setModelInfo(COMPONENT.VOLUME_GROUP, + exampleVolumeGroupModelInfo); + DataService.setLcpRegion("Region3"); + DataService.setTenant("Tenant3"); + + + $scope.$broadcast("deleteComponent", { + componentId : COMPONENT.VOLUME_GROUP, + callbackFunction : callbackFunction + }); + } + + $scope.deleteNetwork = function() { + + DataService.setInventoryItem(exampleNetworkItem); + + DataService.setNetworkInstanceId("NETWORK_INSTANCE_ID_12345"); + DataService.setModelInfo(COMPONENT.NETWORK, exampleNetworkModelInfo); + DataService.setLcpRegion("Region5"); + DataService.setTenant("Tenant5"); + + $scope.$broadcast("deleteComponent", { + componentId : COMPONENT.NETWORK, + callbackFunction : callbackFunction + }); + } + + /* + * Show Details functions + */ + $scope.showServiceDetails = function() { + + DataService.setInventoryItem(exampleServiceItem); + + $scope.$broadcast("showComponentDetails", { + componentId : COMPONENT.SERVICE, + callbackFunction : callbackFunction + }); + } + + $scope.showVnfDetails = function() { + + DataService.setVnfInstanceId("VNF_INSTANCE_ID_12345"); + DataService + .setInventoryItem(exampleAaiResult["inventory-response-items"]["inventory-response-item"][0]); + + $scope.$broadcast("showComponentDetails", { + componentId : COMPONENT.VNF, + callbackFunction : callbackFunction + }); + } + + $scope.showVfModuleDetails = function() { + + DataService.setVnfInstanceId("VNF_INSTANCE_ID_12345"); + DataService.setVfModuleInstanceId("VF_MODULE_INSTANCE_ID_12345"); + DataService.setInventoryItem(exampleVfModuleItem); + + $scope.$broadcast("showComponentDetails", { + componentId : COMPONENT.VF_MODULE, + callbackFunction : callbackFunction + }); + } + + $scope.showVolumeGroupDetails = function() { + + DataService.setVolumeGroupInstanceId("VOLUME_GROUP_INSTANCE_ID_12345"); + DataService.setInventoryItem(exampleVolumeGroupItem); + + $scope.$broadcast("showComponentDetails", { + componentId : COMPONENT.VOLUME_GROUP, + callbackFunction : callbackFunction + }); + } + + $scope.showNetworkDetails = function() { + + DataService.setNetworkInstanceId("NETWORK_INSTANCE_ID_12345"); + DataService.setInventoryItem(exampleNetworkItem); + + $scope.$broadcast("showComponentDetails", { + componentId : COMPONENT.NETWORK, + callbackFunction : callbackFunction + }); + } +} + +app.controller("testViewEditController", [ "COMPONENT", "DataService", + "PropertyService", "UtilityService", "$scope", "$timeout", + "$cookieStore", "$log", testViewEditController ]); \ No newline at end of file diff --git a/vid-app-common/src/main/webapp/index.jsp b/vid-app-common/src/main/webapp/index.jsp new file mode 100755 index 00000000..056f209a --- /dev/null +++ b/vid-app-common/src/main/webapp/index.jsp @@ -0,0 +1,5 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + +<%-- Redirected because we can't set the welcome page to a virtual URL. --%> +<%-- Forward to the intended start page to reduce frustration for new users. --%> + diff --git a/vid-app-common/src/main/webapp/test.jsp b/vid-app-common/src/main/webapp/test.jsp new file mode 100755 index 00000000..1b0c14a4 --- /dev/null +++ b/vid-app-common/src/main/webapp/test.jsp @@ -0,0 +1,29 @@ + +Test VID Properties related to MSO + + +<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties" %> +<%@ page import="org.openecomp.vid.controller.MsoController" %> +<%@ page import="org.openecomp.vid.mso.rest.Request" %> +<%@ page import="org.openecomp.vid.mso.rest.RequestDetails" %> +<%@ page import="org.openecomp.vid.mso.rest.RelatedModel" %> +<%@ page import="org.openecomp.vid.domain.mso.SubscriberInfo" %> +<%@ page import="org.openecomp.vid.domain.mso.Response" %> +<%@ page import="org.openecomp.vid.domain.mso.ModelInfo" %> +<%@ page import="org.openecomp.vid.domain.mso.RequestInfo" %> +<%@ page import="org.openecomp.vid.domain.mso.CloudConfiguration" %> +<%@ page import="org.openecomp.vid.mso.MsoProperties" %> +<%@ page import="java.net.URI" %> +<%@ page import="com.sun.jersey.api.client.ClientResponse" %> + <% + String url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL); + String max_polls = SystemProperties.getProperty(MsoProperties.MSO_MAX_POLLS); + String max_polling_interval_msecs = SystemProperties.getProperty(MsoProperties.MSO_POLLING_INTERVAL_MSECS); + %> +

VID properties related to MSO:

+

MSO server URL:

"<%= url %>"

+

MSO max number of polls:

"<%= max_polls %>"

+

MSO polling interval (msecs):

"<%= max_polling_interval_msecs %>"

+

Try Again

+ + diff --git a/vid-app-common/src/test/java/org/openecomp/ecomp/vid/selenium/FirstClass.java b/vid-app-common/src/test/java/org/openecomp/ecomp/vid/selenium/FirstClass.java new file mode 100755 index 00000000..ed06994a --- /dev/null +++ b/vid-app-common/src/test/java/org/openecomp/ecomp/vid/selenium/FirstClass.java @@ -0,0 +1,606 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.ecomp.vid.selenium; + +import org.testng.annotations.AfterClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.support.ui.Select; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.TimeUnit; +import org.apache.log4j.Logger; +import org.testng.Assert; +import org.testng.asserts.*; + +/** + * The Class FirstClass. + */ +public class FirstClass { + + /** The login button. */ + WebElement loginButton; + + /** The eg. */ + String eg; + + /** The login. */ + WebElement login; + + /** The pwd. */ + WebElement pwd; + + /** The log. */ + Logger log; + + /** The errormessage. */ + WebElement errormessage; + + + /** The driver. */ + WebDriver driver=new FirefoxDriver(); + + + + /** The config prop. */ + private final Properties configProp = new Properties(); + + + /** + * Instantiates a new first class. + */ + private FirstClass() { + // TODO Auto-generated constructor stub + // + try{ + // InputStream input =this.getClass().getClassLoader().getResourceAsStream("objectmap.properties"); + //FileInputStream input1 = new FileInputStream("objectmap.properties"); + + InputStream input =new FileInputStream("objectconfig.properties"); + System.out.println("Read all properties from file"); + configProp.load(input); + System.out.println("Read all properties from file completed"); + } + catch(IOException e) { + + e.printStackTrace(); + } + } + + + /* + + + @BeforeClass + public void setUp() { + System.out.println("*******************"); + System.out.println("launching IE browser"); + System.setProperty("webdriver.ie.driver", driverPath+"IEDriverServer.exe"); + driver = new InternetExplorerDriver(); + driver.findElement(By.className()); + driver.manage().window().maximize(); + + + login = driver.findElement(By.xpath("//input[@class='fn-ebz-text ng-pristine ng-valid']")); + pwd = driver.findElement(By.xpath("//input[@class='span3 ng-pristine ng-valid']")); + loginButton = driver.findElement(By.id("loginBtn")); + } + + + */ + /** + * Sets the up. + */ + // TODO Auto-generated method stub + @BeforeClass + public void setUp() + { + + + //WebDriver driver=new FirefoxDriver(); + + log = Logger.getLogger(FirstClass.class.getName()); + + + + // Get url + driver.get(configProp.getProperty("baseURL")); + driver.manage().window().maximize(); + + + login = driver.findElement(By.xpath(configProp.getProperty("login"))); + + pwd = driver.findElement(By.xpath(configProp.getProperty("pwd"))); + loginButton = driver.findElement(By.id(configProp.getProperty("loginButton"))); + } + + + /** + * Empty username password. + */ + @Test(priority=1) + public void emptyUsernamePassword() + { + + + //User Name and Password field is empty + log.info("-----VID-11 TC-8----Username and password empty"); + loginButton.click(); + errormessage=driver.findElement(By.xpath("//*[@id='errorInfo']/span")); + String errmsg= errormessage.getText(); + //System.out.println("Error message is"+errmsg); + //String expected = "Invaild username or password, Please try again"; + + //Assert.assertEquals(errmsg,expected); + + Boolean str = driver.getPageSource().contains("Invalid username or password, Please try again"); + System.out.println(driver.getPageSource().contains("Invalid username or password, Please try again")); + + if(str==true) + { + log.info("Error message validated"); + log.info("VID-11 TC-8 PASSED"); + + }else + log.error("Failed validation"); + + } + + + + /** + * Invalid user name. + */ + @Test(priority=2) + public void invalidUserName() + { + + log.info("-----VID-11 TC-6----Invalid Username and Valid Password"); + + + login.sendKeys("xxx"); + pwd.sendKeys("abc123"); + loginButton.click(); + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + String errmsg= errormessage.getText(); + String expected = "Invalid username or password, Please try again"; + Assert.assertEquals(errmsg,expected); + //Boolean str1 = driver.getPageSource().contains("Invalid username or password, Please try again"); + //System.out.print(str1); + + log.info("VID-11 TC-6 PASSED"); + + } + + + /** + * Invalid password. + */ + @Test(priority=3) + public void invalidPassword() + { + log.info("-----VID-11 TC-7----Valid Username and Invalid Password"); + // Valid user name and Invalid password. + login.clear(); + pwd.clear(); + login.sendKeys("testuser"); + pwd.sendKeys("xxx"); + loginButton.click(); + driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + + + String errmsg= errormessage.getText(); + String expected = "Invalid username or password, Please try again"; + Assert.assertEquals(errmsg,expected); + + //Boolean str2 = driver.getPageSource().contains("Invaild username or password, Please try again"); + //System.out.print(str2); + + log.info("VID-11 TC-7 PASSED"); + } + + + /** + * Login successful. + */ + @Test(priority=4) + public void loginSuccessful() + { + log.info("-----VID-11 TC-1----Valid Username and Valid Password"); + //Login with valid user name and password. + login.clear(); + login.sendKeys("su"); + pwd.clear(); + pwd.sendKeys("fusion"); + + + loginButton.click(); + driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + + try { + Thread.sleep(6000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Assert.assertTrue(driver.getPageSource().contains("Search Existing Service Instances")); + log.info("VID-11 TC-1 PASSED"); + + } + + + /** + * Verify home page elements left pane. + */ + @Test(priority=5) + public void verifyHomePageElementsLeftPane() + + { + + + log.info("VID-10 TC 1 "); + //VID Home + log.info("VID 11 TC-2"); + driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[1]/a/span")).isDisplayed(); + //Create New Service Instance + driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[2]/a/span")).isDisplayed(); + + //Browse Service Type + driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[3]/a/span")).isDisplayed(); + //View Log + driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[4]/a/span")).isDisplayed(); + + //Profile + driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[5]/a/span")).isDisplayed(); + //Admin + driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[6]/a/span")).isDisplayed(); + //Logout + driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[7]/a/span")).isDisplayed(); + + //Infrastructure Subscriber Name + driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[1]/div/label")).isDisplayed(); + //Infrastructure Subscriber Name Select Drop down + driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select")).isDisplayed(); + //Infrastructure Service Type + driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[1]/div/label")).isDisplayed(); + //Infrastructure Service Type Select Drop down + driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select")).isDisplayed(); + //Submit button + driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[3]/td/div/button")).isDisplayed(); + + //Login Snippet Icon + driver.findElement(By.xpath(".//*[@class='icon-user-small login-snippet-icon']")).isDisplayed(); + + + //String bodyText = driver.findElement(By.tagName("body")).getText(); + //Assert.assertTrue("Text not found!", bodyText.contains("Search Existing Service Instances")); + //Assert.IsTrue(driver.getPageSource.Contains("Search Existing Service Instances")); + + log.info("VID-12 TC-1"); + Assert.assertTrue(driver.getPageSource().contains("Search Existing Service Instances")); + Assert.assertTrue(driver.getPageSource().contains("Please search by the Subscriber name or Service Type from below:")); + log.info("VID-12 TC-1 PASSED"); + log.info("VID-10 TC 1 PASSED"); + log.info("VID-11 TC-2 PASSED"); + } + + + /** + * Disabled submit button. + */ + @Test(priority=6) + public void disabledSubmitButton() + { + log.info("VID-12 TC-13"); + //Assert submit button disabled. + Assert.assertFalse(driver.findElement(By.xpath(configProp.getProperty("submitButton"))).isEnabled()); + log.info("VID-12 TC-13 PASSED"); + + } + + /** + * Default list box value. + */ + @Test(priority=7) + public void defaultListBoxValue() + { + log.info("VID-12 TC-2"); + + + //WebElement subscribername =driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select")); + + Select oSelect = new Select(driver.findElement(By.xpath(configProp.getProperty("subscriberNameDropDown")))); + Select iSelect = new Select(driver.findElement(By.xpath(configProp.getProperty("serviceTypeDropDown")))); + + + WebElement ielement=iSelect.getFirstSelectedOption(); + WebElement oelement=oSelect.getFirstSelectedOption(); + String defaultsubscribername=oelement.getText(); + String defaultservicetype=ielement.getText(); + + Assert.assertEquals(defaultsubscribername,"Select Subscriber Name"); + Assert.assertEquals(defaultservicetype,"Select Service Type"); + + + + + //Verify Select Subscriber Name isDisplayed. + //driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select/option[1]")).isSelected(); + + //Verify Select Service Type isDisplayed. + //driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select/option[1]")).isSelected(); + + + log.info("VID-12 TC-2 PASSED"); + + } + + + + /** + * Select subscriber name drop down. + * + * @throws InterruptedException the interrupted exception + */ + @Test(priority=8) + public void selectSubscriberNameDropDown() throws InterruptedException + { + log.info("------------------VID-10 TC-2,VID-12 TC-11, VID-12 TC-9, VID 12 TC-10,VID-12 TC-6, VID 12 TC-5--------------------"); + + + driver.findElement(By.xpath(configProp.getProperty("subscriberNameDropDown"))); + + driver.findElement(By.xpath(configProp.getProperty("serviceTypeDropDown"))); + Thread.sleep(5000); + + //Infrastructure Subscriber Name + Select oSelect = new Select(driver.findElement(By.xpath(configProp.getProperty("subscriberNameDropDown")))); + + List elementCount = oSelect.getOptions(); + log.info("Select Element Count of Service Name"); + System.out.println(elementCount.size()); + + + //Verifying getInfrastructureSubscribersList + log.info("VID-29 TC-1"); + Assert.assertTrue(elementCount.size()>0); + log.info("VID-29 TC-1 PASSED"); + + oSelect.selectByIndex(2); + String selectedOption = new Select(driver.findElement(By.xpath(configProp.getProperty("subscriberNameDropDown")))).getFirstSelectedOption().getText(); + + System.out.println("Service Name selected is " +selectedOption); + log.info("VID-10 TC-2 PASSED"); + + //Submit button is clicked + driver.findElement(By.xpath(configProp.getProperty("submitButton"))).click(); + + + //Verify whether the page header is displayed "Selected Subscriber's Service Instance Details:" + driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/h1")).isDisplayed(); + //Assert.assertTrue(driver.getPageSource().contains("Selected Subscriber's Service Instance Details:")) + + + //Verify whether the page header is displayed "Global Customer ID" + driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/div/table/thead/tr/th[2]/div")).isDisplayed(); + Assert.assertTrue(driver.getPageSource().contains("Global Customer ID")); + Assert.assertTrue(driver.getPageSource().contains("Subscriber Name")); + Assert.assertTrue(driver.getPageSource().contains("Service Type")); + Assert.assertTrue(driver.getPageSource().contains("Service Instance ID")); + + log.info("VID-12 TC-5 PASSED"); + log.info("VID-12 TC-11 PASSED"); + + WebElement serviceinstancetable =driver.findElement(By.xpath("//table[@class='tablesorter tablesorter-default ng-isolate-scope']")); + + List rows_table = serviceinstancetable.findElements(By.tagName("tr")); + //To calculate no of rows In table. + int rows_count = rows_table.size(); + + //Loop will execute till the last row of table. + for (int row=0; row Columns_row = rows_table.get(row).findElements(By.tagName("td")); + //To calculate no of columns(cells) In that specific row. + int columns_count = Columns_row.size(); + //System.out.println("Number of cells In Row "+row+" are "+columns_count); + + //Loop will execute till the last cell of that specific row. + for (int column=0; column exx= rows_table.get(1).findElements(By.tagName("td")); + eg=Columns_row.get(2).getText(); + // System.out.println("Cell value of row 1 and column 2 is" +eg); + } + } + + + + + //Verify View/Edit isDisplayed and Click + + driver.findElement(By.xpath("//a[@alt='View/Edit']")).isDisplayed(); + + driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/div/table/tbody/tr[1]/td[1]/div/a")).click(); + + log.info("User clicked View/Edit"); + + //Verify the Subscriber Name displayed. + String header= driver.findElement(By.xpath("//h1[@class='heading1 ng-binding']")).getText(); + //System.out.println(header); + + + if(header.contains(eg)) + { + System.out.println("Header contains the subscriber name"); + }else + System.out.println("Header does not contain the subscriber name"); + + + + Assert.assertTrue(driver.getPageSource().contains("PerfTest Subscriber00020021")); + log.info("VID-12 TC-6 PASSED"); + + + + driver.navigate().back(); + //Cancel button isDisplayed + driver.findElement(By.xpath("//button[@class='button button--small button--primary']")).isDisplayed(); + log.info("VID-12 TC-9 PASSED"); + + //Cancel button is clicked + driver.findElement(By.xpath("//button[@class='button button--small button--primary']")).click(); + log.info("Cancel button is clicked"); + + //Verifying VID Home page is displayed + Assert.assertTrue(driver.getPageSource().contains("Search Existing Service Instances")); + log.info("VID-12 TC-10 PASSED"); + + } + + + /** + * Refresh subscriber name. + */ + @Test(priority=9) + public void refreshSubscriberName() + { + log.info("VID-10 TC-4"); + + + driver.findElement(By.xpath(configProp.getProperty("refreshButtonSubscriberName"))).isDisplayed(); + + log.info("VID-10 TC-4 PASSED"); + + + } + + + /** + * Select subscriber type drop down. + * + * @throws InterruptedException the interrupted exception + */ + @Test(priority=9) + public void selectSubscriberTypeDropDown() throws InterruptedException + { + Thread.sleep(5000); + log.info("------------------VID-10 TC-3, VID-12 TC-12,--------------------"); + //Infrastructure Subscriber Type + Select iSelect = new Select(driver.findElement(By.xpath(configProp.getProperty("serviceTypeDropDown")))); + + List ielementCount = iSelect.getOptions(); + log.info("Select Element Count of Service type"); + System.out.println(ielementCount.size()); + iSelect.selectByIndex(1); + + log.info("VID-10 TC-3 PASSED"); + + + //Submit button is clicked + driver.findElement(By.xpath(configProp.getProperty("submitButton"))).click(); + + //Verify whether the page header is displayed "Selected Subscriber's Service Instance Details:" + driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/h1")).isDisplayed(); + //Assert.assertTrue(driver.getPageSource().contains("Selected Subscriber's Service Instance Details:")) + log.info("Page Header: Selected Subscriber's Service Instance Details"); + + + //Verify whether the page header is displayed "Global Customer ID" + driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/div/table/thead/tr/th[2]/div")).isDisplayed(); + + //Assert.assertTrue(driver.getPageSource().contains("Global Customer ID")); + log.info("Table is displayed"); + + log.info("VID-12 TC-12 PASSED"); + + } + + + + /** + * Logout under profile. + */ + @Test(priority=10) + public void logoutUnderProfile() + { + + log.info("-----------VID-11 TC-5---------------------"); + //driver.findElement(By.partialLinkText("Click here to login")).click(); + //driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + + + driver.findElement(By.xpath(".//*[@class='icon-user-small login-snippet-icon']")).click(); + driver.findElement(By.xpath(".//*[@id='reg-logout-div']/a")).click(); + //Validate that the user has logged out of VID. Displays "Portal" + Assert.assertTrue(driver.getPageSource().contains("Portal")); + + log.info("VID-11 TC-5 PASSED"); + + } + + + + /** + * Tear down. + */ + @AfterClass + public void tearDown() + { + driver.close(); + + } + + + + } + + + + diff --git a/vid-app-common/src/test/java/org/openecomp/ecomp/vid/selenium/LogOutLeftPane.java b/vid-app-common/src/test/java/org/openecomp/ecomp/vid/selenium/LogOutLeftPane.java new file mode 100755 index 00000000..66ea075e --- /dev/null +++ b/vid-app-common/src/test/java/org/openecomp/ecomp/vid/selenium/LogOutLeftPane.java @@ -0,0 +1,242 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.ecomp.vid.selenium; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.TimeUnit; + +import org.apache.log4j.Logger; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.support.ui.Select; +import org.testng.Assert; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +/** + * The Class LogOutLeftPane. + */ +@Test(enabled=true) +public class LogOutLeftPane { + + /** The login button. */ + WebElement loginButton; + + /** The login. */ + WebElement login; + + /** The pwd. */ + WebElement pwd; + + /** The log. */ + Logger log; + + /** The errormessage. */ + WebElement errormessage; + + /** The driver. */ + WebDriver driver=new FirefoxDriver(); + + + /** The config prop. */ + private final Properties configProp = new Properties(); + + + /** + * Instantiates a new log out left pane. + */ + private LogOutLeftPane() { + // TODO Auto-generated constructor stub + // + try{ + // InputStream input =this.getClass().getClassLoader().getResourceAsStream("objectmap.properties"); + //FileInputStream input1 = new FileInputStream("objectmap.properties"); + + InputStream input =new FileInputStream("objectconfig.properties"); + System.out.println("Read all properties from file"); + configProp.load(input); + System.out.println("Read all properties from file completed"); + } + catch(IOException e) { + + e.printStackTrace(); + } + } + + + + + /** + * Do before test. + */ + // TODO Auto-generated method stub + @BeforeTest + public void doBeforeTest() + { + //WebDriver driver=new FirefoxDriver(); + + log = Logger.getLogger(LogOutLeftPane.class.getName()); + + + + // Get url + driver.get("http://vid.onap.org:9080/vid/login_external.htm"); + driver.manage().window().maximize(); + + + login = driver.findElement(By.xpath("//input[@class='fn-ebz-text ng-pristine ng-valid']")); + pwd = driver.findElement(By.xpath("//input[@class='span3 ng-pristine ng-valid']")); + loginButton = driver.findElement(By.id("loginBtn")); + } + + + /** + * Expand collapse panel. + * + * @throws InterruptedException the interrupted exception + */ + @Test(priority=1) + public void expandCollapsePanel() throws InterruptedException + { + + + + login.clear(); + login.sendKeys("su"); + pwd.clear(); + pwd.sendKeys("fusion"); + //driver.findElement(By.partialLinkText("Click here to login")).click(); + //driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + + loginButton.click(); + driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + + + log.info("Clicking Profile link from left pane"); + Thread.sleep(3000); + System.out.println("properties file details --->"+configProp.getProperty("profilelink")); + driver.findElement(By.xpath(configProp.getProperty("profilelink"))).click(); + Thread.sleep(3000); + + //Verify whether the sub panel is displayed + //To verify the following :Search import from webphone and Self + driver.findElement(By.xpath(".//*[@id='panel4']")).isDisplayed(); + log.info("Expand and collapse passed for Profile link"); + + //For Admin + //Verify expand and collapse working for ADMIN + log.info("Clicking Admin link from left pane"); + driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[6]/a/span")).click(); + //To verify the following: Roles, Roles Functions, Usages + driver.findElement(By.xpath(".//*[@id='panel5']")).isDisplayed(); + + + log.info("Expand and collapse passed for ADMIN link"); + + log.info("VID-11 TC-3 PASSED"); + + } + + + /** + * Drop down list. + * + * @throws InterruptedException the interrupted exception + */ + @Test(priority=2) + public void dropDownList() throws InterruptedException + { + //VID-12 TC-3 + log.info("VID-12 TC-3"); + //driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select")); + + //driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select")); + Thread.sleep(5000); + + //Infrastructure Subscriber Name + Select oSelect = new Select(driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select"))); + Select iSelect = new Select(driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select"))); + + List elementCount = oSelect.getOptions(); + log.info("Subscriber Name Drop Down"); + System.out.println(elementCount.size()); + oSelect.selectByIndex(1); + log.info("Subscriber name selected"); + //String selectedOption = new Select(driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select"))).getFirstSelectedOption().getText(); + + + List count = iSelect.getOptions(); + log.info("Subscriber type drop down"); + System.out.println(count.size()); + oSelect.selectByIndex(1); + log.info("Subscriber type selected"); + + + + //Submit button is clicked + driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[3]/td/div/button")).click(); + + + //Verify whether the page header is displayed "Selected Subscriber's Service Instance Details:" + driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/h1")).isDisplayed(); + log.info("VID-12 TC-3 PASSED"); + } + + + + + /** + * Logout left pane. + */ + @Test(priority=3) + public void logoutLeftPane() + { + //To Verify if the logout link redirects to Login page when clicked. + + + /*log.info("----------------VID-11 TC-4----------------"); + login.clear(); + login.sendKeys("testuser"); + pwd.clear(); + pwd.sendKeys("abc123"); + //driver.findElement(By.partialLinkText("Click here to login")).click(); + //driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + + loginButton.click(); + driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);*/ + log.info("----------------VID-11 TC-4----------------"); + driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[7]/a")).click(); + //Validate that the user has logged out of VID. Displays "Portal" + Assert.assertTrue(driver.getPageSource().contains("Portal")); + + log.info("VID 11 TC-4 PASSED"); + + driver.close(); + + } + +} diff --git a/vid-app-common/src/test/java/org/openecomp/fusion/core/MockApplicationContextTestSuite.java b/vid-app-common/src/test/java/org/openecomp/fusion/core/MockApplicationContextTestSuite.java new file mode 100755 index 00000000..64d72abe --- /dev/null +++ b/vid-app-common/src/test/java/org/openecomp/fusion/core/MockApplicationContextTestSuite.java @@ -0,0 +1,176 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.fusion.core; + +import java.io.IOException; + +import org.junit.Before; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.AnnotationConfigWebContextLoader; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; + +import org.openecomp.portalsdk.core.conf.AppConfig; +import org.openecomp.portalsdk.core.objectcache.AbstractCacheManager; +import org.openecomp.portalsdk.core.util.SystemProperties; +import org.openecomp.portalsdk.core.util.CacheManager; + +/** + * + * + * + * In order to write a unit test, + * 1. inherit this class - See SanityTest.java + * 2. place the "war" folder on your test class's classpath + * 3. run the test with the following VM argument; This is important because when starting the application from Container, the System Properties file (SystemProperties.java) can have the direct path + * but, when running from the Mock Junit container, the path should be prefixed with "classpath" to enable the mock container to search for the file in the classpath + * -Dcontainer.classpath="classpath:" + * + */ + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class, classes = {MockAppConfig.class}) +@ActiveProfiles(value="test") +public class MockApplicationContextTestSuite { + + /** The wac. */ + @Autowired + public WebApplicationContext wac; + + /** The mock mvc. */ + private MockMvc mockMvc; + + /** + * Setup. + */ + @Before + public void setup() { + if(mockMvc == null) { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + + } + } + + /** + * Gets the bean. + * + * @param name the name + * @return the bean + */ + public Object getBean(String name) { + return this.wac.getBean(name); + } + + + /** + * Gets the mock mvc. + * + * @return the mock mvc + */ + public MockMvc getMockMvc() { + return mockMvc; + } + + /** + * Sets the mock mvc. + * + * @param mockMvc the new mock mvc + */ + public void setMockMvc(MockMvc mockMvc) { + this.mockMvc = mockMvc; + } + + /** + * Gets the web application context. + * + * @return the web application context + */ + public WebApplicationContext getWebApplicationContext() { + return wac; + } + + + + +} + + + @Configuration + @ComponentScan(basePackages = "org.openecomp", + excludeFilters = { + // the following source configurations should not be scanned; instead of using Exclusion filter, we can use the @Profile annotation to exclude them + // see AppConfig class + //@ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.openecomp.portalsdk.core.*AppConfig*")//, + //@ComponentScan.Filter(type = FilterType.REGEX, pattern = org.openecomp.*.*AppConfig*") + } + ) + @Profile("test") + class MockAppConfig extends AppConfig { + + @Bean + public SystemProperties systemProperties(){ + return new MockSystemProperties(); + } + + @Bean + public AbstractCacheManager cacheManager() { + return new CacheManager() { + + public void configure() throws IOException { + + } + }; + } + + protected String[] tileDefinitions() { + return new String[] {"classpath:/WEB-INF/fusion/defs/definitions.xml", "classpath:/WEB-INF/defs/definitions.xml"}; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + //registry.addInterceptor(new SessionTimeoutInterceptor()).excludePathPatterns(getExcludeUrlPathsForSessionTimeout()); + //registry.addInterceptor(resourceInterceptor()); + } + + public static class MockSystemProperties extends SystemProperties { + + public MockSystemProperties() { + } + + } + + } + + + + diff --git a/vid-app-common/src/test/java/org/openecomp/fusionapp/controller/NetMapTest.java b/vid-app-common/src/test/java/org/openecomp/fusionapp/controller/NetMapTest.java new file mode 100755 index 00000000..8c00c3b3 --- /dev/null +++ b/vid-app-common/src/test/java/org/openecomp/fusionapp/controller/NetMapTest.java @@ -0,0 +1,48 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.fusionapp.controller; + +import org.junit.Assert; +import org.junit.Test; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import org.openecomp.fusion.core.MockApplicationContextTestSuite; + +/** + * The Class NetMapTest. + */ +public class NetMapTest extends MockApplicationContextTestSuite { + + /** + * Test get net map. + * + * @throws Exception the exception + */ + @Test + public void testGetNetMap() throws Exception { + ResultActions ra =getMockMvc().perform(MockMvcRequestBuilders.get("/net_map")); + //Assert.assertEquals(UrlAccessRestrictedException.class,ra.andReturn().getResolvedException().getClass()); + Assert.assertEquals("net_map_int",ra.andReturn().getModelAndView().getModel().get("frame_int")); + } + + +} diff --git a/vid-app-common/src/test/java/org/openecomp/fusionapp/service/ProfileServiceTest.java b/vid-app-common/src/test/java/org/openecomp/fusionapp/service/ProfileServiceTest.java new file mode 100755 index 00000000..43370c70 --- /dev/null +++ b/vid-app-common/src/test/java/org/openecomp/fusionapp/service/ProfileServiceTest.java @@ -0,0 +1,69 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.fusionapp.service; + +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import org.openecomp.fusion.core.MockApplicationContextTestSuite; +import org.openecomp.portalsdk.core.domain.Profile; +import org.openecomp.portalsdk.core.domain.User; +import org.openecomp.portalsdk.core.service.ProfileService; +import org.openecomp.portalsdk.core.service.UserProfileService; + + +/** + * The Class ProfileServiceTest. + */ +public class ProfileServiceTest extends MockApplicationContextTestSuite { + + /** The service. */ + @Autowired + ProfileService service; + + /** The user profile service. */ + @Autowired + UserProfileService userProfileService; + + /** + * Test find all. + */ + @Test + public void testFindAll() { + + List profiles = service.findAll(); + Assert.assertTrue(profiles.size() > 0); + } + + /** + * Test find all active. + */ + @Test + public void testFindAllActive() { + + List users = userProfileService.findAllActive(); + List activeUsers = userProfileService.findAllActive(); + Assert.assertTrue(users.size() - activeUsers.size() >= 0); + } +} diff --git a/vid-app-common/src/test/java/org/openecomp/src/main/java/org/vid/dao/FnAppDoaImplTest.java b/vid-app-common/src/test/java/org/openecomp/src/main/java/org/vid/dao/FnAppDoaImplTest.java new file mode 100755 index 00000000..08fd9f59 --- /dev/null +++ b/vid-app-common/src/test/java/org/openecomp/src/main/java/org/vid/dao/FnAppDoaImplTest.java @@ -0,0 +1,45 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * 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========================================================= + */ + +package org.openecomp.src.main.java.org.vid.dao; + +import java.io.IOException; +import java.sql.SQLException; + +import org.junit.Test; + +import org.openecomp.vid.dao.FnAppDoaImpl; + +public class FnAppDoaImplTest { + + @Test + public void testGetconnection() throws ClassNotFoundException, IOException, SQLException{ + FnAppDoaImpl impl=new FnAppDoaImpl(); + impl.getConnection(null,null,null, null); + + } + + @Test + public void testProfileCount() throws ClassNotFoundException, IOException, SQLException{ + FnAppDoaImpl impl=new FnAppDoaImpl(); + impl.getProfileCount(null,null,null, null); + } + +} diff --git a/vid-app-common/src/test/resources/objectconfig.properties b/vid-app-common/src/test/resources/objectconfig.properties new file mode 100755 index 00000000..312e5bcc --- /dev/null +++ b/vid-app-common/src/test/resources/objectconfig.properties @@ -0,0 +1,16 @@ +baseURL=http://vid.onap.org:9080/vid/login_external.htm + + + +login=//input[@class='fn-ebz-text ng-pristine ng-valid'] +pwd=//input[@class='span3 ng-pristine ng-valid'] +loginButton=loginBtn + + +profilelink=html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[5]/a/span +refreshButtonSubscriberName=//img[@src='static/fusion/images/refresh.jpg'] + +subscriberNameDropDown=.//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select +serviceTypeDropDown=.//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select +submitButton=.//*[@id='mContent']/div/div/table/tbody/tr[3]/td/div/button + -- cgit 1.2.3-korg