From 8b56e8d08070785152ba7c97e9a1878fa3652722 Mon Sep 17 00:00:00 2001 From: "Smokowski, Steve (ss835w)" Date: Thu, 11 Apr 2019 12:09:04 -0400 Subject: [PATCH] Fix vFW Distrobution Missing check to not reprocess service Issue-ID: SO-1674 Change-Id: I152c61fb726eb8979eb30c8dcb5f4eed05fc4b8b Signed-off-by: Smokowski, Steve (ss835w) --- .../org/onap/so/asdc/client/ASDCController.java | 24 +- .../client/test/emulators/ArtifactInfoImpl.java | 2 + .../test/emulators/NotificationDataImpl.java | 2 + .../client/test/emulators/ResourceInfoImpl.java | 2 + .../installer/heat/ToscaResourceInstaller.java | 52 +-- .../client/test/rest/ASDCRestInterfaceTest.java | 37 ++ .../resources/resource-examples/vFW/base_vfw.env | 38 ++ .../resources/resource-examples/vFW/base_vfw.yaml | 491 +++++++++++++++++++++ .../resource-examples/vFW/notification.json | 80 ++++ .../resource-examples/vFW/service-Vfw.csar | Bin 0 -> 96717 bytes .../vFW/vfw1f52feb055020_modules.json | 25 ++ asdc-controller/src/test/resources/schema.sql | 171 ++++++- 12 files changed, 864 insertions(+), 60 deletions(-) create mode 100644 asdc-controller/src/test/resources/resource-examples/vFW/base_vfw.env create mode 100644 asdc-controller/src/test/resources/resource-examples/vFW/base_vfw.yaml create mode 100644 asdc-controller/src/test/resources/resource-examples/vFW/notification.json create mode 100644 asdc-controller/src/test/resources/resource-examples/vFW/service-Vfw.csar create mode 100644 asdc-controller/src/test/resources/resource-examples/vFW/vfw1f52feb055020_modules.json diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java b/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java index 57e9c173b9..f2e875fc0c 100644 --- a/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java +++ b/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java @@ -655,6 +655,7 @@ public class ASDCController { // For each artifact, create a structure describing the VFModule in a ordered flat level ResourceStructure resourceStructure = null; String msoConfigPath = getMsoConfigPath(); + boolean hasVFResource = false; ToscaResourceStructure toscaResourceStructure = new ToscaResourceStructure(msoConfigPath); boolean deploySuccessful = true; String errorMessage = null; @@ -697,7 +698,7 @@ public class ASDCController { + resourceStructure.getResourceInstance().getResourceUUID()); if ("VF".equals(resourceType) && !"Allotted Resource".equalsIgnoreCase(category)) { - + hasVFResource = true; for (IArtifactInfo artifact : resource.getArtifacts()) { IDistributionClientDownloadResult resultArtifact = this.downloadTheArtifact(artifact, iNotif.getDistributionID()); @@ -730,16 +731,19 @@ public class ASDCController { logger.error("Exception occurred", e); } - // Deploy VF resource and artifacts - logger.debug("Preparing to deploy Service: {}", iNotif.getServiceUUID()); - try { - this.deployResourceStructure(resourceStructure, toscaResourceStructure); - } catch (ArtifactInstallerException e) { - deploySuccessful = false; - errorMessage = e.getMessage(); - logger.error("Exception occurred", e); - } + if (!hasVFResource) { + + logger.debug("No resources found for Service: " + iNotif.getServiceUUID()); + logger.debug("Preparing to deploy Service: {}", iNotif.getServiceUUID()); + try { + this.deployResourceStructure(resourceStructure, toscaResourceStructure); + } catch (ArtifactInstallerException e) { + deploySuccessful = false; + errorMessage = e.getMessage(); + logger.error("Exception occurred", e); + } + } this.sendCsarDeployNotification(iNotif, resourceStructure, toscaResourceStructure, deploySuccessful, errorMessage); } diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ArtifactInfoImpl.java b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ArtifactInfoImpl.java index b3618a8095..f4cfb1361f 100644 --- a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ArtifactInfoImpl.java +++ b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ArtifactInfoImpl.java @@ -23,9 +23,11 @@ package org.onap.so.asdc.client.test.emulators; import java.util.ArrayList; import java.util.List; import org.onap.sdc.api.notification.IArtifactInfo; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.EqualsBuilder; +@JsonIgnoreProperties(ignoreUnknown = true) public class ArtifactInfoImpl implements IArtifactInfo { private String artifactName; diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/NotificationDataImpl.java b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/NotificationDataImpl.java index f8d7bb09f5..c61306fb77 100644 --- a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/NotificationDataImpl.java +++ b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/NotificationDataImpl.java @@ -29,12 +29,14 @@ import org.onap.sdc.api.notification.INotificationData; import org.onap.sdc.api.notification.IResourceInstance; import org.springframework.stereotype.Component; import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; @Component @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +@JsonIgnoreProperties(ignoreUnknown = true) public class NotificationDataImpl implements INotificationData { @JsonProperty("distributionID") diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ResourceInfoImpl.java b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ResourceInfoImpl.java index 91597611fd..62d11ffec9 100644 --- a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ResourceInfoImpl.java +++ b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ResourceInfoImpl.java @@ -27,7 +27,9 @@ import org.apache.commons.lang3.builder.HashCodeBuilder; import org.onap.sdc.api.notification.IArtifactInfo; import org.onap.sdc.api.notification.IResourceInstance; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +@JsonIgnoreProperties(ignoreUnknown = true) public class ResourceInfoImpl implements IResourceInstance { public ResourceInfoImpl() {} diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java index e61aafac2e..f3a495825c 100644 --- a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java +++ b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java @@ -261,7 +261,7 @@ public class ToscaResourceInstaller { try { Service existingService = serviceRepo.findOneByModelUUID(vfResourceStructure.getNotification().getServiceUUID()); - if (existingService != null && serviceDeployed == false) + if (existingService != null && !serviceDeployed) status = true; if (status) { logger.info(vfResourceStructure.getResourceInstance().getResourceInstanceName(), @@ -387,12 +387,11 @@ public class ToscaResourceInstaller { List artifactListForLogging = new ArrayList<>(); try { createToscaCsar(toscaResourceStruct); - Service service = createService(toscaResourceStruct, vfResourceStruct); + createService(toscaResourceStruct, vfResourceStruct); + Service service = toscaResourceStruct.getCatalogService(); List vfNodeTemplatesList = toscaResourceStruct.getSdcCsarHelper().getServiceVfList(); - for (NodeTemplate nodeTemplate : vfNodeTemplatesList) { - Metadata metadata = nodeTemplate.getMetaData(); String serviceType = toscaResourceStruct.getCatalogService().getServiceType(); String vfCustomizationCategory = toscaResourceStruct.getSdcCsarHelper() @@ -402,7 +401,6 @@ public class ToscaResourceInstaller { } processResourceSequence(toscaResourceStruct, service); - processVFResources(toscaResourceStruct, service, vfResourceStructure); List allottedResourceList = toscaResourceStruct.getSdcCsarHelper().getAllottedResources(); processAllottedResources(toscaResourceStruct, service, allottedResourceList); processNetworks(toscaResourceStruct, service); @@ -410,7 +408,7 @@ public class ToscaResourceInstaller { processNetworkCollections(toscaResourceStruct, service); // Process Service Proxy & Configuration processServiceProxyAndConfiguration(toscaResourceStruct, service); - + logger.info("Saving Service: {} ", service.getModelName()); serviceRepo.save(service); WatchdogComponentDistributionStatus status = new WatchdogComponentDistributionStatus( @@ -763,48 +761,6 @@ public class ToscaResourceInstaller { } - protected void processVFResources(ToscaResourceStructure toscaResourceStruct, Service service, - VfResourceStructure vfResourceStructure) throws Exception { - logger.debug("processVFResources"); - - List vfNodeTemplatesList = toscaResourceStruct.getSdcCsarHelper().getServiceVfList(); - // String servicecategory = toscaResourceStruct.getCatalogService().getCategory(); - // String serviceType = toscaResourceStruct.getCatalogService().getServiceType(); - - for (NodeTemplate nodeTemplate : vfNodeTemplatesList) { - Metadata metadata = nodeTemplate.getMetaData(); - String vfCustomizationCategory = metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY); - logger.debug("VF Category is : " + vfCustomizationCategory); - - // Do not treat Allotted Resources as VNF resources - if (ALLOTTED_RESOURCE.equalsIgnoreCase(vfCustomizationCategory)) { - continue; - } - - String vfCustomizationUUID = metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID); - logger.debug("VFCustomizationUUID=" + vfCustomizationUUID); - - IResourceInstance vfNotificationResource = vfResourceStructure.getResourceInstance(); - - // Make sure the VF ResourceCustomizationUUID from the notification and tosca - // customizations match before comparing their VF Modules UUID's - logger.debug("Checking if Notification VF ResourceCustomizationUUID: " - + vfNotificationResource.getResourceCustomizationUUID() + " matches Tosca VF Customization UUID: " - + vfCustomizationUUID); - - if (vfCustomizationUUID.equals(vfNotificationResource.getResourceCustomizationUUID())) { - logger.debug("vfCustomizationUUID: " + vfCustomizationUUID - + " matches vfNotificationResource CustomizationUUID"); - - processVfModules(toscaResourceStruct, vfResourceStructure, service, nodeTemplate, metadata, - vfCustomizationCategory); - } else { - logger.debug("Notification VF ResourceCustomizationUUID: " - + vfNotificationResource.getResourceCustomizationUUID() + " doesn't match " - + "Tosca VF Customization UUID: " + vfCustomizationUUID); - } - } - } /** * This is used to process the PNF specific resource, including resource and resource_customization. diff --git a/asdc-controller/src/test/java/org/onap/so/asdc/client/test/rest/ASDCRestInterfaceTest.java b/asdc-controller/src/test/java/org/onap/so/asdc/client/test/rest/ASDCRestInterfaceTest.java index 815f419c40..2e5ad13c21 100644 --- a/asdc-controller/src/test/java/org/onap/so/asdc/client/test/rest/ASDCRestInterfaceTest.java +++ b/asdc-controller/src/test/java/org/onap/so/asdc/client/test/rest/ASDCRestInterfaceTest.java @@ -42,6 +42,7 @@ import org.onap.so.asdc.client.test.emulators.DistributionClientEmulator; import org.onap.so.asdc.client.test.emulators.NotificationDataImpl; import org.onap.so.db.catalog.beans.AllottedResource; import org.onap.so.db.catalog.beans.AllottedResourceCustomization; +import org.onap.so.db.catalog.beans.Service; import org.onap.so.db.catalog.data.repository.AllottedResourceRepository; import org.onap.so.db.catalog.data.repository.NetworkResourceRepository; import org.onap.so.db.catalog.data.repository.ServiceRepository; @@ -138,6 +139,42 @@ public class ASDCRestInterfaceTest extends BaseTest { .ignoring("0x1.allotedResourceCustomization.created")); } + @Test + @Transactional + public void test_VFW_Distrobution() throws Exception { + + wireMockServer.stubFor(post(urlPathMatching("/aai/.*")) + .willReturn(aResponse().withStatus(200).withHeader("Content-Type", "application/json"))); + + ObjectMapper mapper = new ObjectMapper(); + NotificationDataImpl request = mapper.readValue( + new File("src/test/resources/resource-examples/vFW/notification.json"), NotificationDataImpl.class); + headers.add("resource-location", "src/test/resources/resource-examples/vFW/"); + HttpEntity entity = new HttpEntity(request, headers); + + ResponseEntity response = restTemplate.exchange(createURLWithPort("test/treatNotification/v1"), + HttpMethod.POST, entity, String.class); + + assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode().value()); + + Service expectedService = new Service(); + expectedService.setDescription("catalog service description"); + expectedService.setModelInvariantUUID("3164f9ff-d7e7-4813-ab32-6be7e1cacb18"); + expectedService.setModelName("vFW 2019-04-10 21:53:05"); + expectedService.setModelUUID("e16e4ed9-3429-423a-bc3c-1389ae91491c"); + expectedService.setModelVersion("1.0"); + + + + Service actualService = serviceRepo.findOneByModelUUID("e16e4ed9-3429-423a-bc3c-1389ae91491c"); + + + if (actualService == null) + throw new Exception("No Allotted Resource Written to database"); + + assertEquals(expectedService.getModelName(), actualService.getModelName()); + } + @Test public void invokeASDCStatusDataNullTest() { String request = ""; diff --git a/asdc-controller/src/test/resources/resource-examples/vFW/base_vfw.env b/asdc-controller/src/test/resources/resource-examples/vFW/base_vfw.env new file mode 100644 index 0000000000..f490db5249 --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/vFW/base_vfw.env @@ -0,0 +1,38 @@ +parameters: + cloud_env: "openstack" + dcae_collector_ip: "10.0.4.1" + dcae_collector_port: "30235" + demo_artifacts_version: "1.4.0-SNAPSHOT" + install_script_version: "1.4.0-SNAPSHOT" + key_name: "vfw_key" + nexus_artifact_repo: "https://nexus.onap.org" + onap_private_net_cidr: "10.0.0.0/16" + onap_private_net_id: "PUT THE ONAP PRIVATE NETWORK NAME HERE" + onap_private_subnet_id: "PUT THE ONAP PRIVATE NETWORK NAME HERE" + protected_private_net_cidr: "192.168.20.0/24" + protected_private_net_id: "zdfw1fwl01_protected" + pub_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN" + public_net_id: "PUT THE PUBLIC NETWORK ID HERE" + sec_group: "PUT THE ONAP SECURITY GROUP HERE" + unprotected_private_net_cidr: "192.168.10.0/24" + unprotected_private_net_id: "zdfw1fwl01_unprotected" + vf_module_id: "vFirewall" + vfw_flavor_name: "PUT THE VM FLAVOR NAME HERE (m1.medium suggested)" + vfw_image_name: "PUT THE VM IMAGE NAME HERE (UBUNTU 1404 required)" + vfw_int_protected_private_floating_ip: "192.168.10.200" + vfw_int_protected_private_ip_0: "192.168.20.100" + vfw_int_unprotected_private_ip_0: "192.168.10.100" + vfw_name_0: "zdfw1fwl01fwl01" + vfw_onap_private_ip_0: "10.0.100.1" + vnf_id: "vFirewall_demo_app" + vnf_name: "vFW" + vpg_flavor_name: "PUT THE VM FLAVOR NAME HERE (m1.medium suggested)" + vpg_image_name: "PUT THE VM IMAGE NAME HERE (UBUNTU 1404 required)" + vpg_int_unprotected_private_ip_0: "192.168.10.200" + vpg_name_0: "zdfw1fwl01pgn01" + vpg_onap_private_ip_0: "10.0.100.2" + vsn_flavor_name: "PUT THE VM FLAVOR NAME HERE (m1.medium suggested)" + vsn_image_name: "PUT THE VM IMAGE NAME HERE (UBUNTU 1404 required)" + vsn_int_protected_private_ip_0: "192.168.20.250" + vsn_name_0: "zdfw1fwl01snk01" + vsn_onap_private_ip_0: "10.0.100.3" diff --git a/asdc-controller/src/test/resources/resource-examples/vFW/base_vfw.yaml b/asdc-controller/src/test/resources/resource-examples/vFW/base_vfw.yaml new file mode 100644 index 0000000000..6137e8ab8b --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/vFW/base_vfw.yaml @@ -0,0 +1,491 @@ +########################################################################## +# +#==================LICENSE_START========================================== +# +# +# Copyright (c) 2017 AT&T Intellectual Property. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +#==================LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# +########################################################################## + +heat_template_version: 2013-05-23 + +description: Heat template that deploys vFirewall demo app for ONAP + +############## +# # +# PARAMETERS # +# # +############## + +parameters: + vfw_image_name: + type: string + label: Image name or ID + description: Image to be used for compute instance + vfw_flavor_name: + type: string + label: Flavor + description: Type of instance (flavor) to be used + vpg_image_name: + type: string + label: Image name or ID + description: Image to be used for compute instance + vpg_flavor_name: + type: string + label: Flavor + description: Type of instance (flavor) to be used + vsn_image_name: + type: string + label: Image name or ID + description: Image to be used for compute instance + vsn_flavor_name: + type: string + label: Flavor + description: Type of instance (flavor) to be used + public_net_id: + type: string + label: Public network name or ID + description: Public network that enables remote connection to VNF + unprotected_private_net_id: + type: string + label: Unprotected private network name or ID + description: Private network that connects vPacketGenerator with vFirewall + protected_private_net_id: + type: string + label: Protected private network name or ID + description: Private network that connects vFirewall with vSink + onap_private_net_id: + type: string + label: ONAP management network name or ID + description: Private network that connects ONAP components and the VNF + onap_private_subnet_id: + type: string + label: ONAP management sub-network name or ID + description: Private sub-network that connects ONAP components and the VNF + unprotected_private_net_cidr: + type: string + label: Unprotected private network CIDR + description: The CIDR of the unprotected private network + protected_private_net_cidr: + type: string + label: Protected private network CIDR + description: The CIDR of the protected private network + onap_private_net_cidr: + type: string + label: ONAP private network CIDR + description: The CIDR of the protected private network + vfw_int_unprotected_private_ip_0: + type: string + label: vFirewall private IP address towards the unprotected network + description: Private IP address that is assigned to the vFirewall to communicate with the vPacketGenerator + vfw_int_protected_private_ip_0: + type: string + label: vFirewall private IP address towards the protected network + description: Private IP address that is assigned to the vFirewall to communicate with the vSink + vfw_onap_private_ip_0: + type: string + label: vFirewall private IP address towards the ONAP management network + description: Private IP address that is assigned to the vFirewall to communicate with ONAP components + vfw_int_protected_private_floating_ip: + type: string + label: same value as vpg_int_unprotected_private_ip_0 + description: IP to inform OpenStack to enable vfw protected private port to allow packets coming from the packet generator + vpg_int_unprotected_private_ip_0: + type: string + label: vPacketGenerator private IP address towards the unprotected network + description: Private IP address that is assigned to the vPacketGenerator to communicate with the vFirewall + vpg_onap_private_ip_0: + type: string + label: vPacketGenerator private IP address towards the ONAP management network + description: Private IP address that is assigned to the vPacketGenerator to communicate with ONAP components + vsn_int_protected_private_ip_0: + type: string + label: vSink private IP address towards the protected network + description: Private IP address that is assigned to the vSink to communicate with the vFirewall + vsn_onap_private_ip_0: + type: string + label: vSink private IP address towards the ONAP management network + description: Private IP address that is assigned to the vSink to communicate with ONAP components + vfw_name_0: + type: string + label: vFirewall name + description: Name of the vFirewall + vpg_name_0: + type: string + label: vPacketGenerator name + description: Name of the vPacketGenerator + vsn_name_0: + type: string + label: vSink name + description: Name of the vSink + vnf_id: + type: string + label: VNF ID + description: The VNF ID is provided by ONAP + vnf_name: + type: string + label: VNF NAME + description: The VNF NAME is provided by ONAP + vf_module_id: + type: string + label: vFirewall module ID + description: The vFirewall Module ID is provided by ONAP + dcae_collector_ip: + type: string + label: DCAE collector IP address + description: IP address of the DCAE collector + dcae_collector_port: + type: string + label: DCAE collector port + description: Port of the DCAE collector + key_name: + type: string + label: Key pair name + description: Public/Private key pair name + pub_key: + type: string + label: Public key + description: Public key to be installed on the compute instance + install_script_version: + type: string + label: Installation script version number + description: Version number of the scripts that install the vFW demo app + demo_artifacts_version: + type: string + label: Artifacts version used in demo vnfs + description: Artifacts (jar, tar.gz) version used in demo vnfs + nexus_artifact_repo: + type: string + description: Root URL for the Nexus repository for Maven artifacts. + cloud_env: + type: string + label: Cloud environment + description: Cloud environment (e.g., openstack, rackspace) + sec_group: + type: string + description: ONAP Security Group + +############# +# # +# RESOURCES # +# # +############# + +resources: + random-str: + type: OS::Heat::RandomString + properties: + length: 4 + + my_keypair: + type: OS::Nova::KeyPair + properties: + name: + str_replace: + template: vnfname_base_rand + params: + base: { get_param: key_name } + rand: { get_resource: random-str } + vnfname: { get_param: vnf_name } + public_key: { get_param: pub_key } + save_private_key: false + + # NETWORK_ROLE: unprotected_private + # NETWORK_TYPE: internal + int_unprotected_private_network: + type: OS::Neutron::Net + properties: + name: + str_replace: + template: vnfname_netid + params: + netid: { get_param: unprotected_private_net_id } + vnfname: { get_param: vnf_name } + + # NETWORK_ROLE: protected_private + # NETWORK_TYPE: internal + int_protected_private_network: + type: OS::Neutron::Net + properties: + name: + str_replace: + template: vnfname_netid + params: + netid: { get_param: protected_private_net_id } + vnfname: { get_param: vnf_name } + + # NETWORK_ROLE: unprotected_private + # NETWORK_TYPE: internal + int_unprotected_private_subnet: + type: OS::Neutron::Subnet + properties: + network: { get_resource: int_unprotected_private_network } + cidr: { get_param: unprotected_private_net_cidr } + + # NETWORK_ROLE: protected_private + # NETWORK_TYPE: internal + int_protected_private_subnet: + type: OS::Neutron::Subnet + properties: + network: { get_resource: int_protected_private_network } + cidr: { get_param: protected_private_net_cidr } + + ### Virtual Firewall instantiation ### + + # VM_TYPE: vfw + # NETWORK_ROLE: protected_private + # NETWORK_TYPE: internal + vfw_0_int_unprotected_private_port_0: + type: OS::Neutron::Port + properties: + network: { get_resource: int_unprotected_private_network } + fixed_ips: [{"subnet": { get_resource: int_unprotected_private_subnet }, "ip_address": { get_param: vfw_int_unprotected_private_ip_0 }}] + security_groups: + - { get_param: sec_group } + + # VM_TYPE: vfw + # NETWORK_ROLE: protected_private + # NETWORK_TYPE: internal + vfw_0_int_protected_private_port_0: + type: OS::Neutron::Port + properties: + allowed_address_pairs: [{ "ip_address": { get_param: vfw_int_protected_private_floating_ip }}] + network: { get_resource: int_protected_private_network } + fixed_ips: [{"subnet": { get_resource: int_protected_private_subnet }, "ip_address": { get_param: vfw_int_protected_private_ip_0 }}] + security_groups: + - { get_param: sec_group } + + # VM_TYPE: vfw + # NETWORK_ROLE: onap_private + # NETWORK_TYPE: external + vfw_0_onap_private_port_0: + type: OS::Neutron::Port + properties: + network: { get_param: onap_private_net_id } + fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vfw_onap_private_ip_0 }}] + security_groups: + - { get_param: sec_group } + + # VM_TYPE: vfw + vfw_server_0: + type: OS::Nova::Server + properties: + image: { get_param: vfw_image_name } + flavor: { get_param: vfw_flavor_name } + name: { get_param: vfw_name_0 } + key_name: { get_resource: my_keypair } + networks: + - network: { get_param: public_net_id } + - port: { get_resource: vfw_0_int_unprotected_private_port_0 } + - port: { get_resource: vfw_0_int_protected_private_port_0 } + - port: { get_resource: vfw_0_onap_private_port_0 } + metadata: + vnf_id: { get_param: vnf_id } + vf_module_id: { get_param: vf_module_id } + vnf_name: { get_param: vnf_name } + user_data_format: RAW + user_data: + str_replace: + params: + __dcae_collector_ip__ : { get_param: dcae_collector_ip } + __dcae_collector_port__ : { get_param: dcae_collector_port } + __demo_artifacts_version__ : { get_param: demo_artifacts_version } + __install_script_version__ : { get_param: install_script_version } + __vfw_private_ip_0__ : { get_param: vfw_int_unprotected_private_ip_0 } + __vfw_private_ip_1__ : { get_param: vfw_int_protected_private_ip_0 } + __vfw_private_ip_2__ : { get_param: vfw_onap_private_ip_0 } + __unprotected_private_net_cidr__ : { get_param: unprotected_private_net_cidr } + __protected_private_net_cidr__ : { get_param: protected_private_net_cidr } + __onap_private_net_cidr__ : { get_param: onap_private_net_cidr } + __cloud_env__ : { get_param: cloud_env } + __nexus_artifact_repo__: { get_param: nexus_artifact_repo } + template: | + #!/bin/bash + + # Create configuration files + mkdir /opt/config + echo "__dcae_collector_ip__" > /opt/config/dcae_collector_ip.txt + echo "__dcae_collector_port__" > /opt/config/dcae_collector_port.txt + echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt + echo "__install_script_version__" > /opt/config/install_script_version.txt + echo "__vfw_private_ip_0__" > /opt/config/vfw_private_ip_0.txt + echo "__vfw_private_ip_1__" > /opt/config/vfw_private_ip_1.txt + echo "__vfw_private_ip_2__" > /opt/config/vfw_private_ip_2.txt + echo "__unprotected_private_net_cidr__" > /opt/config/unprotected_private_net_cidr.txt + echo "__protected_private_net_cidr__" > /opt/config/protected_private_net_cidr.txt + echo "__onap_private_net_cidr__" > /opt/config/onap_private_net_cidr.txt + echo "__cloud_env__" > /opt/config/cloud_env.txt + echo "__nexus_artifact_repo__" > /opt/config/nexus_artifact_repo.txt + + # Download and run install script + apt-get update + apt-get -y install unzip + if [[ "__install_script_version__" =~ "SNAPSHOT" ]]; then REPO=snapshots; else REPO=releases; fi + curl -k -L "__nexus_artifact_repo__/service/local/artifact/maven/redirect?r=${REPO}&g=org.onap.demo.vnf.vfw&a=vfw-scripts&e=zip&v=__install_script_version__" -o /opt/vfw-scripts-__install_script_version__.zip + unzip -j /opt/vfw-scripts-__install_script_version__.zip -d /opt v_firewall_install.sh + cd /opt + chmod +x v_firewall_install.sh + ./v_firewall_install.sh + + + ### Virtual Packet Generator instantiation ### + + vpg_0_int_unprotected_private_port_0: + type: OS::Neutron::Port + properties: + network: { get_resource: int_unprotected_private_network } + fixed_ips: [{"subnet": { get_resource: int_unprotected_private_subnet }, "ip_address": { get_param: vpg_int_unprotected_private_ip_0 }}] + security_groups: + - { get_param: sec_group } + + vpg_0_onap_private_port_0: + type: OS::Neutron::Port + properties: + network: { get_param: onap_private_net_id } + fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vpg_onap_private_ip_0 }}] + security_groups: + - { get_param: sec_group } + + vpg_server_0: + type: OS::Nova::Server + properties: + image: { get_param: vpg_image_name } + flavor: { get_param: vpg_flavor_name } + name: { get_param: vpg_name_0 } + key_name: { get_resource: my_keypair } + networks: + - network: { get_param: public_net_id } + - port: { get_resource: vpg_0_int_unprotected_private_port_0 } + - port: { get_resource: vpg_0_onap_private_port_0 } + metadata: + vnf_id: { get_param: vnf_id } + vf_module_id: { get_param: vf_module_id } + vnf_name: { get_param: vnf_name } + user_data_format: RAW + user_data: + str_replace: + params: + __fw_ipaddr__: { get_param: vfw_int_unprotected_private_ip_0 } + __protected_net_cidr__: { get_param: protected_private_net_cidr } + __sink_ipaddr__: { get_param: vsn_int_protected_private_ip_0 } + __demo_artifacts_version__ : { get_param: demo_artifacts_version } + __install_script_version__ : { get_param: install_script_version } + __vpg_private_ip_0__ : { get_param: vpg_int_unprotected_private_ip_0 } + __vpg_private_ip_1__ : { get_param: vpg_onap_private_ip_0 } + __unprotected_private_net_cidr__ : { get_param: unprotected_private_net_cidr } + __onap_private_net_cidr__ : { get_param: onap_private_net_cidr } + __cloud_env__ : { get_param: cloud_env } + __nexus_artifact_repo__: { get_param: nexus_artifact_repo } + template: | + #!/bin/bash + + # Create configuration files + mkdir /opt/config + echo "__fw_ipaddr__" > /opt/config/fw_ipaddr.txt + echo "__protected_net_cidr__" > /opt/config/protected_net_cidr.txt + echo "__sink_ipaddr__" > /opt/config/sink_ipaddr.txt + echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt + echo "__install_script_version__" > /opt/config/install_script_version.txt + echo "__vpg_private_ip_0__" > /opt/config/vpg_private_ip_0.txt + echo "__vpg_private_ip_1__" > /opt/config/vpg_private_ip_1.txt + echo "__unprotected_private_net_cidr__" > /opt/config/unprotected_private_net_cidr.txt + echo "__onap_private_net_cidr__" > /opt/config/onap_private_net_cidr.txt + echo "__cloud_env__" > /opt/config/cloud_env.txt + echo "__nexus_artifact_repo__" > /opt/config/nexus_artifact_repo.txt + + # Download and run install script + apt-get update + apt-get -y install unzip + if [[ "__install_script_version__" =~ "SNAPSHOT" ]]; then REPO=snapshots; else REPO=releases; fi + curl -k -L "__nexus_artifact_repo__/service/local/artifact/maven/redirect?r=${REPO}&g=org.onap.demo.vnf.vfw&a=vfw-scripts&e=zip&v=__install_script_version__" -o /opt/vfw-scripts-__install_script_version__.zip + unzip -j /opt/vfw-scripts-__install_script_version__.zip -d /opt v_packetgen_install.sh + cd /opt + chmod +x v_packetgen_install.sh + ./v_packetgen_install.sh + + + ### Virtual Sink instantiation ### + + vsn_0_int_protected_private_port_0: + type: OS::Neutron::Port + properties: + network: { get_resource: int_protected_private_network } + fixed_ips: [{"subnet": { get_resource: int_protected_private_subnet }, "ip_address": { get_param: vsn_int_protected_private_ip_0 }}] + security_groups: + - { get_param: sec_group } + + vsn_0_onap_private_port_0: + type: OS::Neutron::Port + properties: + network: { get_param: onap_private_net_id } + fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vsn_onap_private_ip_0 }}] + security_groups: + - { get_param: sec_group } + + vsn_server_0: + type: OS::Nova::Server + properties: + image: { get_param: vsn_image_name } + flavor: { get_param: vsn_flavor_name } + name: { get_param: vsn_name_0 } + key_name: { get_resource: my_keypair } + networks: + - network: { get_param: public_net_id } + - port: { get_resource: vsn_0_int_protected_private_port_0 } + - port: { get_resource: vsn_0_onap_private_port_0 } + metadata: + vnf_id: { get_param: vnf_id } + vf_module_id: { get_param: vf_module_id } + vnf_name: { get_param: vnf_name } + user_data_format: RAW + user_data: + str_replace: + params: + __protected_net_gw__: { get_param: vfw_int_protected_private_ip_0 } + __unprotected_net__: { get_param: unprotected_private_net_cidr } + __install_script_version__ : { get_param: install_script_version } + __vsn_private_ip_0__ : { get_param: vsn_int_protected_private_ip_0 } + __vsn_private_ip_1__ : { get_param: vsn_onap_private_ip_0 } + __protected_private_net_cidr__ : { get_param: protected_private_net_cidr } + __onap_private_net_cidr__ : { get_param: onap_private_net_cidr } + __cloud_env__ : { get_param: cloud_env } + __nexus_artifact_repo__: { get_param: nexus_artifact_repo } + template: | + #!/bin/bash + + # Create configuration files + mkdir /opt/config + echo "__protected_net_gw__" > /opt/config/protected_net_gw.txt + echo "__unprotected_net__" > /opt/config/unprotected_net.txt + echo "__install_script_version__" > /opt/config/install_script_version.txt + echo "__vsn_private_ip_0__" > /opt/config/vsn_private_ip_0.txt + echo "__vsn_private_ip_1__" > /opt/config/vsn_private_ip_1.txt + echo "__protected_private_net_cidr__" > /opt/config/protected_private_net_cidr.txt + echo "__onap_private_net_cidr__" > /opt/config/onap_private_net_cidr.txt + echo "__cloud_env__" > /opt/config/cloud_env.txt + echo "__nexus_artifact_repo__" > /opt/config/nexus_artifact_repo.txt + + # Download and run install script + apt-get update + apt-get -y install unzip + if [[ "__install_script_version__" =~ "SNAPSHOT" ]]; then REPO=snapshots; else REPO=releases; fi + curl -k -L "__nexus_artifact_repo__/service/local/artifact/maven/redirect?r=${REPO}&g=org.onap.demo.vnf.vfw&a=vfw-scripts&e=zip&v=__install_script_version__" -o /opt/vfw-scripts-__install_script_version__.zip + unzip -j /opt/vfw-scripts-__install_script_version__.zip -d /opt v_sink_install.sh + cd /opt + chmod +x v_sink_install.sh + ./v_sink_install.sh diff --git a/asdc-controller/src/test/resources/resource-examples/vFW/notification.json b/asdc-controller/src/test/resources/resource-examples/vFW/notification.json new file mode 100644 index 0000000000..4e93df510b --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/vFW/notification.json @@ -0,0 +1,80 @@ +{ + "distributionID": "3d1c9f3c-550e-41c3-bfb6-800f8274a40c", + "resources": [ + { + "artifacts": [ + { + "artifactChecksum": "NDg0ZDJjYTIzNDhlZmFkZjRjMzM5MTkzOGFhZTU5ZjI=", + "artifactDescription": "Auto-generated VF Modules information artifact", + "artifactName": "vfw1f52feb055020_modules.json", + "artifactTimeout": 120, + "artifactType": "VF_MODULES_METADATA", + "artifactURL": "vfw1f52feb055020_modules.json", + "artifactUUID": "7ff1c5cb-8ca1-43b1-8f97-05c0d8c879ec", + "artifactVersion": "1", + "relatedArtifactsInfo": [] + }, + { + "artifactChecksum": "MDQyYTIxMTlhZDdlMzdiNjBjNjdjZTFhMWE0NThmMzc=", + "artifactDescription": "created from csar", + "artifactName": "base_vfw.yaml", + "artifactTimeout": 120, + "artifactType": "HEAT", + "artifactURL": "base_vfw.yaml", + "artifactUUID": "4f0b1b88-09ab-43b9-9506-57de3c69433a", + "artifactVersion": "2", + "generatedArtifact": { + "artifactChecksum": "MjQ2YWIxOTY2M2E0ZjAzMTI4NjVkNWZkZGRmM2VmMGI=", + "artifactDescription": "Auto-generated HEAT Environment deployment artifact", + "artifactName": "base_vfw.env", + "artifactTimeout": 120, + "artifactType": "HEAT_ENV", + "artifactURL": "base_vfw.env", + "artifactUUID": "005bc362-b40f-4c54-82bc-2716147f9c3a", + "artifactVersion": "2", + "generatedFromUUID": "4f0b1b88-09ab-43b9-9506-57de3c69433a" + }, + "relatedArtifactsInfo": [] + }, + { + "artifactChecksum": "MjQ2YWIxOTY2M2E0ZjAzMTI4NjVkNWZkZGRmM2VmMGI=", + "artifactDescription": "Auto-generated HEAT Environment deployment artifact", + "artifactName": "base_vfw.env", + "artifactTimeout": 120, + "artifactType": "HEAT_ENV", + "artifactURL": "base_vfw.env", + "artifactUUID": "005bc362-b40f-4c54-82bc-2716147f9c3a", + "artifactVersion": "2", + "relatedArtifactsInfo": [] + } + ], + "category": "Generic", + "resourceType": "VF", + "resourceCustomizationUUID": "0451bf8d-49e1-4f7f-960f-2e24f27c9f42", + "resourceInstanceName": "vFW 1f52feb0-5502 0", + "resourceInvariantUUID": "459f18ec-aaee-40d1-8fae-60fec2aae37f", + "resourceName": "vFW 1f52feb0-5502", + "resourceUUID": "1b1346cb-bf0b-4097-9d1b-5a041c536897", + "resourceVersion": "1.0", + "subcategory": "Abstract" + } + ], + "serviceArtifacts": [ + { + "artifactChecksum": "YWNkZTJmYmVmYTg0NTdjMzg0MjVjZTliOTRiYTQ5YjM=", + "artifactDescription": "TOSCA definition package of the asset", + "artifactName": "service-Vfw20190410215305-csar.csar", + "artifactTimeout": 0, + "artifactType": "TOSCA_CSAR", + "artifactURL": "service-Vfw.csar", + "artifactUUID": "f4fcb0ba-40d3-46d2-819e-3b69eda88fcf", + "artifactVersion": "1" + } + ], + "serviceDescription": "catalog service description", + "serviceInvariantUUID": "3164f9ff-d7e7-4813-ab32-6be7e1cacb18", + "serviceName": "vFW 2019-04-10 21:53:05", + "serviceUUID": "e16e4ed9-3429-423a-bc3c-1389ae91491c", + "serviceVersion": "1.0", + "workloadContext": "Production" +} diff --git a/asdc-controller/src/test/resources/resource-examples/vFW/service-Vfw.csar b/asdc-controller/src/test/resources/resource-examples/vFW/service-Vfw.csar new file mode 100644 index 0000000000000000000000000000000000000000..fe0b9f313119d7b6dcaa45bdf75f4c94aa09d57b GIT binary patch literal 96717 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 uAk=eL;d8tf5^a%>M(0YUQv1 literal 0 HcmV?d00001 diff --git a/asdc-controller/src/test/resources/resource-examples/vFW/vfw1f52feb055020_modules.json b/asdc-controller/src/test/resources/resource-examples/vFW/vfw1f52feb055020_modules.json new file mode 100644 index 0000000000..944adbd0d2 --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/vFW/vfw1f52feb055020_modules.json @@ -0,0 +1,25 @@ +[ + { + "vfModuleModelName": "Vfw1f52feb05502..base_vfw..module-0", + "vfModuleModelInvariantUUID": "062e75f9-ccbd-4946-8d31-92118efac741", + "vfModuleModelVersion": "1", + "vfModuleModelUUID": "3f99a421-abd0-4e5e-a9e4-3b9b8464ddb6", + "vfModuleModelCustomizationUUID": "12c7bf93-9021-41cf-8c65-86856cfab11d", + "isBase": true, + "artifacts": [ + "4f0b1b88-09ab-43b9-9506-57de3c69433a", + "005bc362-b40f-4c54-82bc-2716147f9c3a" + ], + "properties": { + "min_vf_module_instances": "1", + "vf_module_label": "base_vfw", + "max_vf_module_instances": "1", + "vfc_list": "", + "vf_module_description": "", + "vf_module_type": "Base", + "availability_zone_count": "", + "volume_group": "false", + "initial_count": "1" + } + } +] \ No newline at end of file diff --git a/asdc-controller/src/test/resources/schema.sql b/asdc-controller/src/test/resources/schema.sql index 2db2dfb5bf..0b48b2e35f 100644 --- a/asdc-controller/src/test/resources/schema.sql +++ b/asdc-controller/src/test/resources/schema.sql @@ -1,7 +1,6 @@ --------START Catalog DB SCHEMA -------- use catalogdb; - set foreign_key_checks=0; DROP TABLE IF EXISTS `allotted_resource`; /*!40101 SET @saved_cs_client = @@character_set_client */; @@ -1170,7 +1169,7 @@ CREATE TABLE `vnfc_instance_group_customization` ( set foreign_key_checks=1; CREATE TABLE IF NOT EXISTS `pnf_resource` ( - `ORCHESTRATION_MODE` varchar(20) NOT NULL DEFAULT 'HEAT', + `ORCHESTRATION_MODE` varchar(20) DEFAULT NULL, `DESCRIPTION` varchar(1200) DEFAULT NULL, `CREATION_TIMESTAMP` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `MODEL_UUID` varchar(200) NOT NULL, @@ -1208,6 +1207,170 @@ CREATE TABLE IF NOT EXISTS `pnf_resource_customization_to_service` ( PRIMARY KEY (`SERVICE_MODEL_UUID`,`RESOURCE_MODEL_CUSTOMIZATION_UUID`) )ENGINE=InnoDB DEFAULT CHARSET=latin1; +CREATE TABLE IF NOT EXISTS `workflow` ( + `ID` int(11) NOT NULL AUTO_INCREMENT, + `ARTIFACT_UUID` varchar(200) NOT NULL, + `ARTIFACT_NAME` varchar(200) NOT NULL, + `NAME` varchar(200) NOT NULL, + `OPERATION_NAME` varchar(200) DEFAULT NULL, + `VERSION` double NOT NULL, + `DESCRIPTION` varchar(1200) DEFAULT NULL, + `BODY` longtext DEFAULT NULL, + `RESOURCE_TARGET` varchar(200) NOT NULL, + `SOURCE` varchar(200) NOT NULL, + `TIMEOUT_MINUTES` int(11) DEFAULT NULL, + `ARTIFACT_CHECKSUM` varchar(200) DEFAULT 'MANUAL RECORD', + `CREATION_TIMESTAMP` datetime NOT NULL DEFAULT current_timestamp(), + PRIMARY KEY (`ID`), + UNIQUE KEY `UK_workflow` (`ARTIFACT_UUID`,`NAME`,`VERSION`,`SOURCE`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE IF NOT EXISTS `vnf_resource_to_workflow` ( + `ID` int(11) NOT NULL AUTO_INCREMENT, + `VNF_RESOURCE_MODEL_UUID` varchar(200) NOT NULL, + `WORKFLOW_ID` int(11) NOT NULL, + PRIMARY KEY (`ID`), + UNIQUE KEY `UK_vnf_resource_to_workflow` (`VNF_RESOURCE_MODEL_UUID`,`WORKFLOW_ID`), + KEY `fk_vnf_resource_to_workflow__workflow1_idx` (`WORKFLOW_ID`), + KEY `fk_vnf_resource_to_workflow__vnf_res_mod_uuid_idx` (`VNF_RESOURCE_MODEL_UUID`), + CONSTRAINT `fk_vnf_resource_to_workflow__vnf_resource1` FOREIGN KEY (`VNF_RESOURCE_MODEL_UUID`) REFERENCES `vnf_resource` (`MODEL_UUID`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_vnf_resource_to_workflow__workflow1` FOREIGN KEY (`WORKFLOW_ID`) REFERENCES `workflow` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE IF NOT EXISTS `activity_spec` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `NAME` VARCHAR(200) NOT NULL, + `DESCRIPTION` VARCHAR(1200) NOT NULL, + `VERSION` DOUBLE NOT NULL, + `CREATION_TIMESTAMP` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`ID`), + UNIQUE INDEX `UK_activity_spec` (`NAME` ASC, `VERSION` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = latin1; + +CREATE TABLE IF NOT EXISTS `user_parameters` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `NAME` VARCHAR(200) NOT NULL, + `PAYLOAD_LOCATION` VARCHAR(500) NULL, + `LABEL` VARCHAR(200) NOT NULL, + `TYPE` VARCHAR(200) NOT NULL, + `DESCRIPTION` VARCHAR(1200) NULL, + `IS_REQUIRED` TINYINT(1) NOT NULL, + `MAX_LENGTH` INT(11) NULL, + `ALLOWABLE_CHARS` VARCHAR(200) NULL, + `CREATION_TIMESTAMP` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`ID`), + UNIQUE INDEX `UK_user_parameters` (`NAME` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = latin1; + +CREATE TABLE IF NOT EXISTS `workflow_activity_spec_sequence` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `WORKFLOW_ID` INT(11) NOT NULL, + `ACTIVITY_SPEC_ID` INT(11) NOT NULL, + `SEQ_NO` INT(11) NOT NULL, + PRIMARY KEY (`ID`), + UNIQUE INDEX `UK_workflow_activity_spec_sequence` (`WORKFLOW_ID` ASC, `ACTIVITY_SPEC_ID` ASC, `SEQ_NO` ASC), + INDEX `fk_workflow_activity_spec_sequence__activity_spec_idx` (`ACTIVITY_SPEC_ID` ASC), + INDEX `fk_workflow_activity_spec_sequence__workflow_actifact_uuid_idx` (`WORKFLOW_ID` ASC), + CONSTRAINT `fk_workflow_activity_spec_sequence__activity_spec1` + FOREIGN KEY (`ACTIVITY_SPEC_ID`) + REFERENCES `activity_spec` (`ID`) + ON DELETE CASCADE + ON UPDATE CASCADE, + CONSTRAINT `fk_workflow_activity_spec_sequence__workflow1` + FOREIGN KEY (`WORKFLOW_ID`) + REFERENCES `workflow` (`ID`) + ON DELETE CASCADE + ON UPDATE CASCADE) +ENGINE = InnoDB +DEFAULT CHARACTER SET = latin1; + +CREATE TABLE IF NOT EXISTS `activity_spec_parameters` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `NAME` VARCHAR(200) NOT NULL, + `TYPE` VARCHAR(200) NOT NULL, + `DIRECTION` VARCHAR(200) NULL, + `DESCRIPTION` VARCHAR(1200) NULL, + `CREATION_TIMESTAMP` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`ID`), + UNIQUE INDEX `UK_activity_spec_parameters` (`NAME` ASC, `DIRECTION` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = latin1; + +CREATE TABLE IF NOT EXISTS `activity_spec_categories` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `NAME` VARCHAR(200) NOT NULL, + PRIMARY KEY (`ID`), + UNIQUE INDEX `UK_activity_spec_categories` (`NAME` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = latin1; + +CREATE TABLE IF NOT EXISTS `activity_spec_to_activity_spec_categories` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `ACTIVITY_SPEC_ID` INT(11) NOT NULL, + `ACTIVITY_SPEC_CATEGORIES_ID` INT(11) NOT NULL, + PRIMARY KEY (`ID`), + UNIQUE INDEX `UK_activity_spec_to_activity_spec_categories` (`ACTIVITY_SPEC_ID` ASC, `ACTIVITY_SPEC_CATEGORIES_ID` ASC), + INDEX `fk_activity_spec_to_activity_spec_categories__activity_spec_idx` (`ACTIVITY_SPEC_CATEGORIES_ID` ASC), + INDEX `fk_activity_spec_to_activity_spec_categories__activity_spec_idx1` (`ACTIVITY_SPEC_ID` ASC), + CONSTRAINT `fk_activity_spec_to_activity_spec_categories__activity_spec1` + FOREIGN KEY (`ACTIVITY_SPEC_ID`) + REFERENCES `activity_spec` (`ID`) + ON DELETE CASCADE + ON UPDATE CASCADE, + CONSTRAINT `fk_activity_spec_to_activity_spec_categories__activity_spec_c1` + FOREIGN KEY (`ACTIVITY_SPEC_CATEGORIES_ID`) + REFERENCES `activity_spec_categories` (`ID`) + ON DELETE CASCADE + ON UPDATE CASCADE) +ENGINE = InnoDB +DEFAULT CHARACTER SET = latin1; + +CREATE TABLE IF NOT EXISTS `activity_spec_to_activity_spec_parameters` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `ACTIVITY_SPEC_ID` INT(11) NOT NULL, + `ACTIVITY_SPEC_PARAMETERS_ID` INT(11) NOT NULL, + PRIMARY KEY (`ID`), + INDEX `fk_activity_spec_to_activity_spec_params__act_sp_param_id_idx` (`ACTIVITY_SPEC_PARAMETERS_ID` ASC), + UNIQUE INDEX `UK_activity_spec_to_activity_spec_parameters` (`ACTIVITY_SPEC_ID` ASC, `ACTIVITY_SPEC_PARAMETERS_ID` ASC), + INDEX `fk_activity_spec_to_activity_spec_parameters__act_spec_id_idx` (`ACTIVITY_SPEC_ID` ASC), + CONSTRAINT `fk_activity_spec_to_activity_spec_parameters__activity_spec_1` + FOREIGN KEY (`ACTIVITY_SPEC_ID`) + REFERENCES `activity_spec` (`ID`) + ON DELETE CASCADE + ON UPDATE CASCADE, + CONSTRAINT `fk_activity_spec_to_activity_spec_parameters__activ_spec_param1` + FOREIGN KEY (`ACTIVITY_SPEC_PARAMETERS_ID`) + REFERENCES `activity_spec_parameters` (`ID`) + ON DELETE CASCADE + ON UPDATE CASCADE) +ENGINE = InnoDB +DEFAULT CHARACTER SET = latin1; + +CREATE TABLE IF NOT EXISTS `activity_spec_to_user_parameters` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `ACTIVITY_SPEC_ID` INT(11) NOT NULL, + `USER_PARAMETERS_ID` INT(11) NOT NULL, + PRIMARY KEY (`ID`), + UNIQUE INDEX `UK_activity_spec_to_user_parameters` (`ACTIVITY_SPEC_ID` ASC, `USER_PARAMETERS_ID` ASC), + INDEX `fk_activity_spec_to_user_parameters__user_parameters1_idx` (`USER_PARAMETERS_ID` ASC), + INDEX `fk_activity_spec_to_user_parameters__activity_spec1_idx` (`ACTIVITY_SPEC_ID` ASC), + CONSTRAINT `fk_activity_spec_to_user_parameters__activity_spec1` + FOREIGN KEY (`ACTIVITY_SPEC_ID`) + REFERENCES `activity_spec` (`ID`) + ON DELETE CASCADE + ON UPDATE CASCADE, + CONSTRAINT `fk_activity_spec_to_user_parameters__user_parameters1` + FOREIGN KEY (`USER_PARAMETERS_ID`) + REFERENCES `user_parameters` (`ID`) + ON DELETE CASCADE + ON UPDATE CASCADE) +ENGINE = InnoDB +DEFAULT CHARACTER SET = latin1; + + + --------START Request DB SCHEMA -------- CREATE DATABASE requestdb; USE requestdb; @@ -1477,3 +1640,7 @@ create table if not exists model ( CONSTRAINT uk1_model UNIQUE (`MODEL_TYPE`, `MODEL_VERSION_ID`), FOREIGN KEY (`RECIPE`) REFERENCES `model_recipe` (`MODEL_ID`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1; + + + + -- 2.16.6