diff options
Diffstat (limited to 'asdc-controller/src')
9 files changed, 200 insertions, 59 deletions
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/activity/DeployActivitySpecs.java b/asdc-controller/src/main/java/org/onap/so/asdc/activity/DeployActivitySpecs.java index 87008f1d8f..43eb277d21 100644 --- a/asdc-controller/src/main/java/org/onap/so/asdc/activity/DeployActivitySpecs.java +++ b/asdc-controller/src/main/java/org/onap/so/asdc/activity/DeployActivitySpecs.java @@ -91,7 +91,7 @@ public class DeployActivitySpecs { if (activitySpecActivitySpecCategories == null || activitySpecActivitySpecCategories.size() == 0) { return; } - List<String> categoryList = new ArrayList<String>(); + List<String> categoryList = new ArrayList<>(); for (ActivitySpecActivitySpecCategories activitySpecCat : activitySpecActivitySpecCategories) { if (activitySpecCat != null) { if (activitySpecCat.getActivitySpecCategories() != null) { @@ -107,8 +107,8 @@ public class DeployActivitySpecs { if (activitySpecActivitySpecParameters == null || activitySpecActivitySpecParameters.size() == 0) { return; } - List<Input> inputs = new ArrayList<Input>(); - List<Output> outputs = new ArrayList<Output>(); + List<Input> inputs = new ArrayList<>(); + List<Output> outputs = new ArrayList<>(); for (ActivitySpecActivitySpecParameters activitySpecParam : activitySpecActivitySpecParameters) { if (activitySpecParam != null) { if (activitySpecParam.getActivitySpecParameters() != null) { 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 9597158cb6..faa40a694b 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 @@ -79,6 +79,8 @@ public class ASDCController { protected static final Logger logger = LoggerFactory.getLogger(ASDCController.class); + private static final String UNKNOWN = "Unknown"; + protected boolean isAsdcClientAutoManaged = false; protected String controllerName; @@ -117,6 +119,25 @@ public class ASDCController { @Autowired DeployActivitySpecs deployActivitySpecs; + public ASDCController() { + this(""); + } + + public ASDCController(String controllerConfigName) { + isAsdcClientAutoManaged = true; + this.controllerName = controllerConfigName; + } + + public ASDCController(String controllerConfigName, IDistributionClient asdcClient, + IVfResourceInstaller resourceinstaller) { + distributionClient = asdcClient; + } + + public ASDCController(String controllerConfigName, IDistributionClient asdcClient) { + distributionClient = asdcClient; + this.controllerName = controllerConfigName; + } + public int getNbOfNotificationsOngoing() { return nbOfNotificationsOngoing; } @@ -157,25 +178,6 @@ public class ASDCController { return this.controllerStatus; } - public ASDCController() { - this(""); - } - - public ASDCController(String controllerConfigName) { - isAsdcClientAutoManaged = true; - this.controllerName = controllerConfigName; - } - - public ASDCController(String controllerConfigName, IDistributionClient asdcClient, - IVfResourceInstaller resourceinstaller) { - distributionClient = asdcClient; - } - - public ASDCController(String controllerConfigName, IDistributionClient asdcClient) { - distributionClient = asdcClient; - this.controllerName = controllerConfigName; - } - public String getControllerName() { return controllerName; } @@ -409,7 +411,7 @@ public class ASDCController { for (IArtifactInfo artifactInfo : resourceStructure.getResourceInstance().getArtifacts()) { if ((DistributionStatusEnum.DEPLOY_OK.equals(distribStatus) - && !artifactInfo.getArtifactType().equalsIgnoreCase("OTHER") + && !("OTHER").equalsIgnoreCase(artifactInfo.getArtifactType()) && !resourceStructure.isAlreadyDeployed()) // This could be NULL if the artifact is a VF module artifact, this won't be present in the MAP && resourceStructure.getArtifactsMapByUUID().get(artifactInfo.getArtifactUUID()) != null @@ -486,7 +488,7 @@ public class ASDCController { status.name(), artifactURL, "ASDC", "sendASDCNotification"); logger.debug(event); - String action = ""; + try { IDistributionStatusMessage message = new DistributionStatusMessage(artifactURL, consumerID, distributionID, status, timestamp); @@ -498,7 +500,7 @@ public class ASDCController { } else { this.distributionClient.sendDownloadStatus(message); } - action = "sendDownloadStatus"; + break; case DEPLOY: if (errorReason != null) { @@ -506,7 +508,7 @@ public class ASDCController { } else { this.distributionClient.sendDeploymentStatus(message); } - action = "sendDeploymentdStatus"; + break; default: break; @@ -882,7 +884,7 @@ public class ASDCController { } } - private static final String UNKNOWN = "Unknown"; + /** * @return the address of the ASDC we are connected to. diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/JsonVfModuleMetaData.java b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/JsonVfModuleMetaData.java index f4d3e5ce48..20cd9801e9 100644 --- a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/JsonVfModuleMetaData.java +++ b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/JsonVfModuleMetaData.java @@ -33,16 +33,16 @@ public class JsonVfModuleMetaData implements IVfModuleData { @JsonProperty("artifacts") private List<String> artifacts; @JsonProperty("properties") - // private List<Map<String, Object>> properties = new ArrayList<>(); + private Map<String, String> properties = new HashMap<>(); + @JsonIgnore + private Map<String, Object> attributesMap = new HashMap<>(); + public Map<String, String> getProperties() { return properties; } - @JsonIgnore - private Map<String, Object> attributesMap = new HashMap<>(); - @Override public List<String> getArtifacts() { return artifacts; 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 c61306fb77..9fd5c2adeb 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 @@ -124,7 +124,7 @@ public class NotificationDataImpl implements INotificationData { @Override public List<IResourceInstance> getResources() { - List<IResourceInstance> ret = new ArrayList<IResourceInstance>(); + List<IResourceInstance> ret = new ArrayList<>(); if (resources != null) { ret.addAll(resources); } @@ -145,7 +145,7 @@ public class NotificationDataImpl implements INotificationData { @Override public List<IArtifactInfo> getServiceArtifacts() { - List<IArtifactInfo> temp = new ArrayList<IArtifactInfo>(); + List<IArtifactInfo> temp = new ArrayList<>(); if (serviceArtifacts != null) { temp.addAll(serviceArtifacts); } 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 62d11ffec9..2f109cd9d3 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 @@ -31,7 +31,6 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties(ignoreUnknown = true) public class ResourceInfoImpl implements IResourceInstance { - public ResourceInfoImpl() {} private String resourceInstanceName; private String resourceCustomizationUUID; @@ -44,6 +43,8 @@ public class ResourceInfoImpl implements IResourceInstance { private String subcategory; private List<ArtifactInfoImpl> artifacts; + public ResourceInfoImpl() {} + private ResourceInfoImpl(IResourceInstance resourceInstance) { resourceInstanceName = resourceInstance.getResourceInstanceName(); resourceCustomizationUUID = resourceInstance.getResourceCustomizationUUID(); @@ -58,7 +59,7 @@ public class ResourceInfoImpl implements IResourceInstance { } public static List<ResourceInfoImpl> convertToJsonContainer(List<IResourceInstance> resources) { - List<ResourceInfoImpl> buildResources = new ArrayList<ResourceInfoImpl>(); + List<ResourceInfoImpl> buildResources = new ArrayList<>(); if (resources != null) { for (IResourceInstance resourceInstance : resources) { buildResources.add(new ResourceInfoImpl(resourceInstance)); @@ -114,7 +115,7 @@ public class ResourceInfoImpl implements IResourceInstance { @Override public List<IArtifactInfo> getArtifacts() { - List<IArtifactInfo> temp = new ArrayList<IArtifactInfo>(); + List<IArtifactInfo> temp = new ArrayList<>(); if (artifacts != null) { temp.addAll(artifacts); } diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/rest/ASDCRestInterface.java b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/rest/ASDCRestInterface.java index 14ea0cde4b..6a9c1aa848 100644 --- a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/rest/ASDCRestInterface.java +++ b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/rest/ASDCRestInterface.java @@ -50,13 +50,12 @@ import org.springframework.stereotype.Component; * This is a TEST only rest interface. It is not used in production, it is used to aid in testing the ASDC service on * jboss without the need to be connected to the ASDC service broker. It starts the test at the treatNotification step * and simulates both the notification step as well as the artifact download step. - * + * <p> * i.e. http://localhost:8080/asdc/treatNotification/v1 - * + * <p> * i.e. http://localhost:8080/asdc/statusData/v1 - * - * @author jm5423 * + * @author jm5423 */ @Path("/") @@ -64,10 +63,6 @@ import org.springframework.stereotype.Component; @Profile("test") public class ASDCRestInterface { - private static DistributionClientEmulator distributionClientEmulator; - - private static JsonStatusData statusData; - private static final Logger logger = LoggerFactory.getLogger(ASDCRestInterface.class); @Autowired @@ -83,7 +78,7 @@ public class ASDCRestInterface { public Response invokeASDCService(NotificationDataImpl request, @HeaderParam("resource-location") String resourceLocation) throws ASDCControllerException, ASDCParametersException, IOException { - distributionClientEmulator = new DistributionClientEmulator(resourceLocation); + DistributionClientEmulator distributionClientEmulator = new DistributionClientEmulator(resourceLocation); asdcController.setControllerName("asdc-controller1"); asdcController.setDistributionClient(distributionClientEmulator); @@ -100,22 +95,24 @@ public class ASDCRestInterface { public Response invokeASDCStatusData(String request) { try { - distributionClientEmulator = new DistributionClientEmulator("resource-examples/"); - statusData = JsonStatusData.instantiateNotifFromJsonFile("resource-examples/"); + DistributionClientEmulator distributionClientEmulator = + new DistributionClientEmulator("resource-examples/"); + JsonStatusData statusData = JsonStatusData.instantiateNotifFromJsonFile("resource-examples/"); - ASDCController asdcController = new ASDCController("asdc-controller1", distributionClientEmulator); - asdcController.initASDC(); + ASDCController controller = new ASDCController("asdc-controller1", distributionClientEmulator); + controller.initASDC(); toscaInstaller.installTheComponentStatus(statusData); - asdcController.closeASDC(); + controller.closeASDC(); + + logger.info("{} {} {} {}", MessageEnum.ASDC_ARTIFACT_DEPLOY_SUC.toString(), statusData.getDistributionID(), + "ASDC", "ASDC Updates Are Complete"); } catch (Exception e) { logger.info("Error caught " + e.getMessage()); logger.error("{} {} {} {} {} {}", MessageEnum.ASDC_GENERAL_EXCEPTION.toString(), "Exception caught during ASDCRestInterface", "ASDC", "invokeASDCService", ErrorCode.BusinessProcesssError.getValue(), "Exception in invokeASDCService", e); } - logger.info("ASDC Updates are complete"); - logger.info("{} {} {} {}", MessageEnum.ASDC_ARTIFACT_DEPLOY_SUC.toString(), statusData.getDistributionID(), - "ASDC", "ASDC Updates Are Complete"); + return null; } } diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/installer/ASDCElementInfo.java b/asdc-controller/src/main/java/org/onap/so/asdc/installer/ASDCElementInfo.java index 043055e23c..81b0843671 100644 --- a/asdc-controller/src/main/java/org/onap/so/asdc/installer/ASDCElementInfo.java +++ b/asdc-controller/src/main/java/org/onap/so/asdc/installer/ASDCElementInfo.java @@ -47,7 +47,7 @@ public class ASDCElementInfo { * <li>{@link ASDCElementTypeEnum#VNF_RESOURCE}</li> * <ul> */ - public static enum ASDCElementTypeEnum { + public enum ASDCElementTypeEnum { /** * The type VNF_RESOURCE. Represents a VNF_RESOURCE element. */ 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 4e97b5f290..b3741584f4 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 @@ -26,6 +26,7 @@ package org.onap.so.asdc.installer.heat; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -145,6 +146,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.util.CollectionUtils; @Component public class ToscaResourceInstaller { @@ -1020,8 +1022,15 @@ public class ToscaResourceInstaller { vnfcInstanceGroupCustomizationRepo.saveAndFlush(vnfcInstanceGroupCustomization); } - - service.getVnfCustomizations().add(vnfResource); + List<String> seqResult = processVNFCGroupSequence(toscaResourceStruct, groupList); + if (!CollectionUtils.isEmpty(seqResult)) { + String resultStr = seqResult.stream().collect(Collectors.joining(",")); + vnfResource.setVnfcInstanceGroupOrder(resultStr); + logger.debug( + "vnfcGroupOrder result for service uuid(" + service.getModelUUID() + ") : " + resultStr); + } + // add this vnfResource with existing vnfResource for this service + addVnfCustomization(service, vnfResource); } else { logger.debug("Notification VF ResourceCustomizationUUID: " + vfNotificationResource.getResourceCustomizationUUID() + " doesn't match " @@ -1030,6 +1039,85 @@ public class ToscaResourceInstaller { } } + private List<String> processVNFCGroupSequence(ToscaResourceStructure toscaResourceStructure, + List<Group> groupList) { + if (CollectionUtils.isEmpty(groupList)) { + return Collections.emptyList(); + } + + ISdcCsarHelper iSdcCsarHelper = toscaResourceStructure.getSdcCsarHelper(); + List<String> strSequence = new ArrayList<>(groupList.size()); + List<Group> tempGroupList = new ArrayList<>(groupList.size()); + List<NodeTemplate> nodes = new ArrayList<>(); + tempGroupList.addAll(groupList); + + for (Group group : groupList) { + List<NodeTemplate> nodeList = group.getMemberNodes(); + boolean hasRequirements = false; + for (NodeTemplate node : nodeList) { + RequirementAssignments requirements = iSdcCsarHelper.getRequirementsOf(node); + if (requirements != null && requirements.getAll() != null && !requirements.getAll().isEmpty()) { + hasRequirements = true; + break; + } + } + + if (!hasRequirements) { + strSequence.add(group.getName()); + tempGroupList.remove(group); + nodes.addAll(nodeList); + } + } + + getVNFCGroupSequenceList(strSequence, tempGroupList, nodes, iSdcCsarHelper); + + return strSequence; + + } + + private void getVNFCGroupSequenceList(List<String> strSequence, List<Group> groupList, List<NodeTemplate> nodes, + ISdcCsarHelper iSdcCsarHelper) { + if (CollectionUtils.isEmpty(groupList)) { + return; + } + + List<Group> tempGroupList = new ArrayList<>(); + tempGroupList.addAll(groupList); + + for (Group group : groupList) { + ArrayList<NodeTemplate> members = group.getMemberNodes(); + for (NodeTemplate memberNode : members) { + boolean isAllExists = true; + RequirementAssignments requirements = iSdcCsarHelper.getRequirementsOf(memberNode); + if (requirements == null || requirements.getAll() == null || requirements.getAll().isEmpty()) { + continue; + } + List<RequirementAssignment> rqaList = requirements.getAll(); + for (RequirementAssignment rqa : rqaList) { + String name = rqa.getNodeTemplateName(); + for (NodeTemplate node : nodes) { + if (name.equals(node.getName())) { + break; + } + } + + isAllExists = false; + break; + } + + if (isAllExists) { + strSequence.add(group.getName()); + tempGroupList.remove(group); + nodes.addAll(group.getMemberNodes()); + } + } + + if (tempGroupList.size() != 0 && tempGroupList.size() < groupList.size()) { + getVNFCGroupSequenceList(strSequence, tempGroupList, nodes, iSdcCsarHelper); + } + } + } + public void processWatchdog(String distributionId, String servideUUID, Optional<String> distributionNotification, String consumerId) { WatchdogServiceModVerIdLookup modVerIdLookup = @@ -1758,12 +1846,37 @@ public class ToscaResourceInstaller { vfcInstanceGroupCustom.setFunction(toscaResourceStructure.getSdcCsarHelper() .getNodeTemplatePropertyLeafValue(vnfcNodeTemplate, getInputName)); vfcInstanceGroupCustom.setInstanceGroup(vfcInstanceGroup); - + createVFCInstanceGroupMembers(vfcInstanceGroupCustom, group); return vfcInstanceGroupCustom; } + private void createVFCInstanceGroupMembers(VnfcInstanceGroupCustomization vfcInstanceGroupCustom, Group group) { + List<NodeTemplate> members = group.getMemberNodes(); + if (!CollectionUtils.isEmpty(members)) { + for (NodeTemplate vfcTemplate : members) { + VnfcCustomization vnfcCustomization = new VnfcCustomization(); + + Metadata metadata = vfcTemplate.getMetaData(); + vnfcCustomization + .setModelCustomizationUUID(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)); + vnfcCustomization.setModelInstanceName(vfcTemplate.getName()); + vnfcCustomization.setModelUUID(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID)); + vnfcCustomization + .setModelInvariantUUID(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID)); + vnfcCustomization.setModelVersion(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)); + vnfcCustomization.setModelName(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME)); + vnfcCustomization.setToscaNodeType(testNull(vfcTemplate.getType())); + vnfcCustomization + .setDescription(testNull(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION))); + + // @After vfcInstanceGroupCustom merged + // vfcInstanceGroupCustom.getVnfcCustomizations().add(vnfcCustomization); + } + } + } + protected VfModuleCustomization createVFModuleResource(Group group, NodeTemplate vfTemplate, ToscaResourceStructure toscaResourceStructure, VfResourceStructure vfResourceStructure, IVfModuleData vfModuleData, VnfResourceCustomization vnfResource, Service service, @@ -2197,19 +2310,24 @@ public class ToscaResourceInstaller { } protected VnfResourceCustomization createVnfResource(NodeTemplate vfNodeTemplate, - ToscaResourceStructure toscaResourceStructure, Service service) { + ToscaResourceStructure toscaResourceStructure, Service service) throws ArtifactInstallerException { VnfResourceCustomization vnfResourceCustomization = null; if (vnfResourceCustomization == null) { VnfResource vnfResource = findExistingVnfResource(service, vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)); - if (vnfResource == null) + if (vnfResource == null) { vnfResource = createVnfResource(vfNodeTemplate); + } vnfResourceCustomization = createVnfResourceCustomization(vfNodeTemplate, toscaResourceStructure, vnfResource); vnfResourceCustomization.setVnfResources(vnfResource); vnfResourceCustomization.setService(service); + + // setting resource input for vnf customization + vnfResourceCustomization.setResourceInput( + getResourceInput(toscaResourceStructure, vnfResourceCustomization.getModelCustomizationUUID())); vnfResource.getVnfResourceCustomizations().add(vnfResourceCustomization); } @@ -2280,6 +2398,13 @@ public class ToscaResourceInstaller { } + if (vnfResourceCustomization.getMinInstances() == null && vnfResourceCustomization.getMaxInstances() == null) { + vnfResourceCustomization.setMinInstances(Integer.getInteger(toscaResourceStructure.getSdcCsarHelper() + .getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_MININSTANCES))); + vnfResourceCustomization.setMaxInstances(Integer.getInteger(toscaResourceStructure.getSdcCsarHelper() + .getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES))); + } + toscaResourceStructure.setCatalogVnfResourceCustomization(vnfResourceCustomization); return vnfResourceCustomization; @@ -2492,6 +2617,19 @@ public class ToscaResourceInstaller { return inputName; } + // this method add provided vnfCustomization to service with + // existing customization available in db. + private void addVnfCustomization(Service service, VnfResourceCustomization vnfResourceCustomization) { + List<Service> services = serviceRepo.findByModelUUID(service.getModelUUID()); + if (services.size() > 0) { + // service exist in db + Service existingService = services.get(0); + List<VnfResourceCustomization> vnfCustomizations = existingService.getVnfCustomizations(); + vnfCustomizations.forEach(e -> service.getVnfCustomizations().add(e)); + } + service.getVnfCustomizations().add(vnfResourceCustomization); + } + protected static Timestamp getCurrentTimeStamp() { diff --git a/asdc-controller/src/test/resources/schema.sql b/asdc-controller/src/test/resources/schema.sql index 8cc5ee9d49..bdd906d870 100644 --- a/asdc-controller/src/test/resources/schema.sql +++ b/asdc-controller/src/test/resources/schema.sql @@ -1109,6 +1109,7 @@ CREATE TABLE `vnf_resource_customization` ( `CREATION_TIMESTAMP` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `VNF_RESOURCE_MODEL_UUID` varchar(200) NOT NULL, `SERVICE_MODEL_UUID` varchar(200) NOT NULL, + `VNFCINSTANCEGROUP_ORDER` varchar(200) default NULL, PRIMARY KEY (`ID`), UNIQUE KEY `UK_vnf_resource_customization` (`MODEL_CUSTOMIZATION_UUID`,`SERVICE_MODEL_UUID`), KEY `fk_vnf_resource_customization__vnf_resource1_idx` (`VNF_RESOURCE_MODEL_UUID`), @@ -1135,6 +1136,8 @@ CREATE TABLE `vnfc_customization` ( `MODEL_NAME` varchar(200) NOT NULL, `TOSCA_NODE_TYPE` varchar(200) NOT NULL, `DESCRIPTION` varchar(1200) DEFAULT NULL, + `RESOURCE_INPUT` varchar(20000) DEFAULT NULL, + `VNFC_INSTANCE_GROUP_CUSTOMIZATION_ID` integer DEFAULT NULL, `CREATION_TIMESTAMP` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`MODEL_CUSTOMIZATION_UUID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; |