diff options
11 files changed, 160 insertions, 522 deletions
diff --git a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoMulticloudUtils.java b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoMulticloudUtils.java index 3eb3fe188d..c648cc2137 100644 --- a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoMulticloudUtils.java +++ b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoMulticloudUtils.java @@ -525,7 +525,7 @@ public class MsoMulticloudUtils extends MsoHeatUtils implements VduPlugin { private StackInfo getStackStatus(String cloudSiteId, String cloudOwner, String tenantId, String instanceId, boolean pollForCompletion, int timeoutMinutes, boolean backout) throws MsoException { - StackInfo stackInfo = new StackInfo(); + StackInfo stackInfo; // If client has requested a final response, poll for stack completion if (pollForCompletion) { diff --git a/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V7.3__UpdateVnfcCustResourceInputLength.sql b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V7.3__UpdateVnfcCustResourceInputLength.sql new file mode 100644 index 0000000000..66c01538f7 --- /dev/null +++ b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V7.3__UpdateVnfcCustResourceInputLength.sql @@ -0,0 +1,4 @@ +use catalogdb; + +ALTER TABLE vnfc_customization + MODIFY IF EXISTS RESOURCE_INPUT varchar(20000);
\ No newline at end of file diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterImpl.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterImpl.java index 52b97da61a..5641186eca 100644 --- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterImpl.java +++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterImpl.java @@ -310,7 +310,6 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter { // First, look up to see if the Network already exists (by name). // For HEAT orchestration of networks, the stack name will always match the network name StackInfo heatStack = null; - long queryNetworkStarttime = System.currentTimeMillis(); try { heatStack = heat.queryStack(cloudSiteId, CLOUD_OWNER, tenantId, networkName); } catch (MsoException me) { @@ -564,7 +563,6 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter { // Verify that the Network exists // For Neutron-based orchestration, the networkId is the Neutron Network UUID. NetworkInfo netInfo = null; - long queryNetworkStarttime = System.currentTimeMillis(); try { netInfo = neutron.queryNetwork(networkId, tenantId, cloudSiteId); } catch (MsoException me) { @@ -608,7 +606,6 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter { // First, look up to see that the Network already exists. // For Heat-based orchestration, the networkId is the network Stack ID. StackInfo heatStack = null; - long queryStackStarttime = System.currentTimeMillis(); try { heatStack = heat.queryStack(cloudSiteId, CLOUD_OWNER, tenantId, networkName); } catch (MsoException me) { @@ -728,7 +725,6 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter { // Update the network stack // Ignore MsoStackNotFound exception because we already checked. - long updateStackStarttime = System.currentTimeMillis(); try { heatStack = heatWithUpdate.updateStack(cloudSiteId, CLOUD_OWNER, tenantId, networkId, template, stackParams, true, heatTemplate.getTimeoutMinutes()); @@ -892,9 +888,6 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter { logger.debug("*** QUERY Network with Network: {} in {}/{}", networkNameOrId, cloudSiteId, tenantId); - // Will capture execution time for metrics - long startTime = System.currentTimeMillis(); - if (commonUtils.isNullOrEmpty(cloudSiteId) || commonUtils.isNullOrEmpty(tenantId) || commonUtils.isNullOrEmpty(networkNameOrId)) { @@ -919,7 +912,6 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter { String neutronId = null; // Try Heat first, since networks may be named the same as the Heat stack StackInfo heatStack = null; - long queryStackStarttime = System.currentTimeMillis(); try { heatStack = heat.queryStack(cloudSiteId, CLOUD_OWNER, tenantId, networkNameOrId); } catch (MsoException me) { @@ -961,7 +953,6 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter { // Query directly against the Neutron Network for the details // no RouteTargets available for ContrailV2 in neutron net-show // networkId is heatStackId - long queryNetworkStarttime = System.currentTimeMillis(); try { NetworkInfo netInfo = neutron.queryNetwork(neutronId, tenantId, cloudSiteId); if (netInfo != null) { diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/tenant/TenantAdapterRest.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/tenant/TenantAdapterRest.java index 6a38cc60e6..c782adec64 100644 --- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/tenant/TenantAdapterRest.java +++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/tenant/TenantAdapterRest.java @@ -100,7 +100,7 @@ public class TenantAdapterRest { logger.debug("createTenant enter: {}", req.toJsonString()); String newTenantId = null; - TenantRollback tenantRollback = new TenantRollback(); + TenantRollback tenantRollback; try { Holder<String> htenant = new Holder<>(); 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 8b3bccf892..00ca74b5f4 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 @@ -1068,10 +1068,11 @@ public class ToscaResourceInstaller { EntityQuery.newBuilder("org.openecomp.groups.VfcInstanceGroup"), TopologyTemplateQuery.newBuilder(SdcTypes.VF).customizationUUID(vfCustomizationUUID), false); + Set<VnfcCustomization> existingVnfcGroupSet = new HashSet<>(); for (IEntityDetails groupEntity : vfcEntityList) { - VnfcInstanceGroupCustomization vnfcInstanceGroupCustomization = - createVNFCInstanceGroup(groupEntity, nodeTemplate, vnfResource, toscaResourceStruct); + VnfcInstanceGroupCustomization vnfcInstanceGroupCustomization = createVNFCInstanceGroup(groupEntity, + nodeTemplate, vnfResource, toscaResourceStruct, existingVnfcGroupSet); vnfcInstanceGroupCustomizationRepo.saveAndFlush(vnfcInstanceGroupCustomization); } @@ -1888,7 +1889,7 @@ public class ToscaResourceInstaller { protected VnfcInstanceGroupCustomization createVNFCInstanceGroup(IEntityDetails vfcInstanceEntity, NodeTemplate vnfcNodeTemplate, VnfResourceCustomization vnfResourceCustomization, - ToscaResourceStructure toscaResourceStructure) { + ToscaResourceStructure toscaResourceStructure, Set<VnfcCustomization> existingVnfcGroupSet) { Metadata instanceMetadata = vfcInstanceEntity.getMetadata(); @@ -1958,39 +1959,47 @@ public class ToscaResourceInstaller { vfcInstanceGroupCustom.setInstanceGroup(vfcInstanceGroup); ArrayList<Input> inputs = vnfcNodeTemplate.getSubMappingToscaTemplate().getInputs(); - createVFCInstanceGroupMembers(vfcInstanceGroupCustom, vfcInstanceEntity, inputs); + createVFCInstanceGroupMembers(vfcInstanceGroupCustom, vfcInstanceEntity, inputs, existingVnfcGroupSet); return vfcInstanceGroupCustom; } private void createVFCInstanceGroupMembers(VnfcInstanceGroupCustomization vfcInstanceGroupCustom, - IEntityDetails vfcModuleEntity, List<Input> inputList) { + IEntityDetails vfcModuleEntity, List<Input> inputList, Set<VnfcCustomization> existingVnfcGroupSet) { List<IEntityDetails> members = vfcModuleEntity.getMemberNodes(); if (!CollectionUtils.isEmpty(members)) { for (IEntityDetails vfcEntity : members) { - VnfcCustomization vnfcCustomization = new VnfcCustomization(); - - Metadata metadata = vfcEntity.getMetadata(); - vnfcCustomization - .setModelCustomizationUUID(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)); - vnfcCustomization.setModelInstanceName(vfcEntity.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(vfcEntity.getToscaType())); - vnfcCustomization - .setDescription(testNull(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION))); - vnfcCustomization.setResourceInput(getVnfcResourceInput(vfcEntity, inputList)); - vnfcCustomization.setVnfcInstanceGroupCustomization(vfcInstanceGroupCustom); - List<VnfcCustomization> vnfcCustomizations = vfcInstanceGroupCustom.getVnfcCustomizations(); - - if (vnfcCustomizations == null) { - vnfcCustomizations = new ArrayList<>(); - vfcInstanceGroupCustom.setVnfcCustomizations(vnfcCustomizations); + + VnfcCustomization existingVfcGroup = findExistingVfc(existingVnfcGroupSet, + vfcEntity.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)); + + if (existingVfcGroup == null) { + VnfcCustomization vnfcCustomization = new VnfcCustomization(); + + Metadata metadata = vfcEntity.getMetadata(); + vnfcCustomization.setModelCustomizationUUID( + metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)); + vnfcCustomization.setModelInstanceName(vfcEntity.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(vfcEntity.getToscaType())); + vnfcCustomization + .setDescription(testNull(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION))); + vnfcCustomization.setResourceInput(getVnfcResourceInput(vfcEntity, inputList)); + vnfcCustomization.setVnfcInstanceGroupCustomization(vfcInstanceGroupCustom); + List<VnfcCustomization> vnfcCustomizations = vfcInstanceGroupCustom.getVnfcCustomizations(); + + if (vnfcCustomizations == null) { + vnfcCustomizations = new ArrayList<>(); + vfcInstanceGroupCustom.setVnfcCustomizations(vnfcCustomizations); + } + vnfcCustomizations.add(vnfcCustomization); + + existingVnfcGroupSet.add(vnfcCustomization); } - vnfcCustomizations.add(vnfcCustomization); } } } diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/BuildingBlockTestDataSetup.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/BuildingBlockTestDataSetup.java index e9d8a5dee9..c421a67e7b 100644 --- a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/BuildingBlockTestDataSetup.java +++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/BuildingBlockTestDataSetup.java @@ -26,7 +26,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; -import org.assertj.core.util.Arrays; import org.camunda.bpm.engine.delegate.DelegateExecution; import org.camunda.bpm.engine.impl.pvm.runtime.ExecutionImpl; import org.junit.Before; @@ -65,9 +64,6 @@ import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoServiceInstance; import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoVfModule; import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; import org.onap.so.client.exception.BBObjectNotFoundException; -import org.onap.so.bpmn.servicedecomposition.bbobjects.AllottedResource; -import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoAllottedResource; -import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoServiceProxy; public class BuildingBlockTestDataSetup { private int collectionCounter; @@ -80,7 +76,6 @@ public class BuildingBlockTestDataSetup { private int pnfCounter; private int projectCounter; private int serviceInstanceCounter; - private int serviceProxyCounter; private int serviceSubscriptionCounter; private int vfModuleCounter; private int volumeGroupCounter; @@ -112,7 +107,6 @@ public class BuildingBlockTestDataSetup { pnfCounter = 0; projectCounter = 0; serviceInstanceCounter = 0; - serviceProxyCounter = 0; serviceSubscriptionCounter = 0; vfModuleCounter = 0; volumeGroupCounter = 0; @@ -145,14 +139,6 @@ public class BuildingBlockTestDataSetup { return userInput; } - public Map<String, String> setUserInput() { - Map<String, String> userInput = buildUserInput(); - - gBBInput.setUserInput(userInput); - - return userInput; - } - public RequestContext buildRequestContext() { RequestContext requestContext = new RequestContext(); requestContext.setMsoRequestId(UUID.randomUUID().toString()); @@ -216,14 +202,6 @@ public class BuildingBlockTestDataSetup { return orchestrationContext; } - public OrchestrationContext setOrchestrationContext() { - OrchestrationContext orchestrationContext = buildOrchestrationContext(); - - gBBInput.setOrchContext(orchestrationContext); - - return orchestrationContext; - } - public Collection buildCollection() { collectionCounter++; @@ -350,7 +328,7 @@ public class BuildingBlockTestDataSetup { Collection collection = new Collection(); collection.setId("testId"); - ServiceInstance serviceInstance = null; + ServiceInstance serviceInstance; try { serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID); @@ -363,30 +341,6 @@ public class BuildingBlockTestDataSetup { return collection; } - public InstanceGroup setInstanceGroup() { - InstanceGroup instanceGroup = new InstanceGroup(); - instanceGroup.setId("testId"); - instanceGroup.setInstanceGroupFunction("testInstanceGroupFunction"); - - Collection collection = null; - - try { - ServiceInstance serviceInstance = - extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID); - collection = serviceInstance.getCollection(); - - if (collection == null) { - collection = setCollection(); - } - } catch (BBObjectNotFoundException e) { - collection = setCollection(); - } - - collection.setInstanceGroup(instanceGroup); - - return instanceGroup; - } - public VpnBinding buildVpnBinding() { vpnBindingCounter++; @@ -398,21 +352,6 @@ public class BuildingBlockTestDataSetup { return vpnBinding; } - public VpnBinding setVpnBinding() { - VpnBinding vpnBinding = buildVpnBinding(); - - Customer customer = gBBInput.getCustomer(); - - if (customer == null) { - customer = buildCustomer(); - } - - customer.getVpnBindings().add(vpnBinding); - lookupKeyMap.put(ResourceKey.VPN_ID, vpnBinding.getVpnId()); - - return vpnBinding; - } - public InstanceGroup buildInstanceGroup() { instanceGroupCounter++; @@ -529,7 +468,7 @@ public class BuildingBlockTestDataSetup { public VfModule setVfModule() { VfModule vfModule = buildVfModule(); - GenericVnf genericVnf = null; + GenericVnf genericVnf; try { genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID); @@ -582,8 +521,6 @@ public class BuildingBlockTestDataSetup { } public ServiceProxy buildServiceProxy() { - serviceProxyCounter++; - ServiceProxy serviceProxy = new ServiceProxy(); serviceProxy.setServiceInstance(buildServiceInstance()); serviceProxy.getServiceInstance().getVnfs().add(buildGenericVnf()); @@ -617,86 +554,4 @@ public class BuildingBlockTestDataSetup { return vpnBondingLink; } - - public VpnBondingLink setVpnBondingLink() { - VpnBondingLink vpnBondingLink = buildVpnBondingLink(); - - ServiceInstance serviceInstance = null; - - try { - serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID); - } catch (BBObjectNotFoundException e) { - serviceInstance = setServiceInstance(); - } - - serviceInstance.getVpnBondingLinks().add(vpnBondingLink); - lookupKeyMap.put(ResourceKey.VPN_BONDING_LINK_ID, vpnBondingLink.getVpnBondingLinkId()); - - - return vpnBondingLink; - } - - public Customer setAvpnCustomer() { - Customer customer = buildCustomer(); - - gBBInput.setCustomer(customer); - - return customer; - } - - public ServiceProxy setServiceProxy(String uniqueIdentifier, String type) { - ServiceProxy serviceProxy = new ServiceProxy(); - serviceProxy.setId("testProxyId" + uniqueIdentifier); - serviceProxy.setType(type); - - ModelInfoServiceProxy modelInfo = new ModelInfoServiceProxy(); - modelInfo.setModelInvariantUuid("testProxyModelInvariantUuid" + uniqueIdentifier); - modelInfo.setModelName("testProxyModelName" + uniqueIdentifier); - modelInfo.setModelUuid("testProxyModelUuid" + uniqueIdentifier); - modelInfo.setModelVersion("testProxyModelVersion" + uniqueIdentifier); - modelInfo.setModelInstanceName("testProxyInstanceName" + uniqueIdentifier); - - serviceProxy.setModelInfoServiceProxy(modelInfo); - - return serviceProxy; - } - - public AllottedResource setAllottedResource(String uniqueIdentifier) { - AllottedResource ar = new AllottedResource(); - ar.setId("testAllottedResourceId" + uniqueIdentifier); - - ModelInfoAllottedResource modelInfo = new ModelInfoAllottedResource(); - modelInfo.setModelInvariantUuid("testAllottedModelInvariantUuid" + uniqueIdentifier); - modelInfo.setModelName("testAllottedModelName" + uniqueIdentifier); - modelInfo.setModelUuid("testAllottedModelUuid" + uniqueIdentifier); - modelInfo.setModelVersion("testAllottedModelVersion" + uniqueIdentifier); - modelInfo.setModelInstanceName("testAllottedInstanceName" + uniqueIdentifier); - - ar.setModelInfoAllottedResource(modelInfo); - - return ar; - } - - public Configuration setConfiguration() { - Configuration config = new Configuration(); - config.setConfigurationId("testConfigurationId"); - ModelInfoConfiguration modelInfoConfig = new ModelInfoConfiguration(); - modelInfoConfig.setModelCustomizationId("modelCustomizationId"); - modelInfoConfig.setModelVersionId("modelVersionId"); - modelInfoConfig.setModelInvariantId("modelInvariantId"); - modelInfoConfig.setPolicyName("policyName"); - config.setModelInfoConfiguration(modelInfoConfig); - - List<Configuration> configurations = new ArrayList<>(); - configurations.add(config); - ServiceInstance serviceInstance = new ServiceInstance(); - try { - serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID); - } catch (BBObjectNotFoundException e) { - serviceInstance = setServiceInstance(); - } - lookupKeyMap.put(ResourceKey.CONFIGURATION_ID, "testConfigurationId"); - serviceInstance.setConfigurations(configurations); - return config; - } } diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/SerializableChecker.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/SerializableChecker.java deleted file mode 100644 index 47ddea1b4f..0000000000 --- a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/SerializableChecker.java +++ /dev/null @@ -1,163 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP - SO - * ================================================================================ - * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.so; - -import java.io.Serializable; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public final class SerializableChecker { - public static class SerializationFailure { - private final String mContainingClass; - private final String mMemberName; - - public SerializationFailure(String inNonSerializableClass, String inMemberName) { - mContainingClass = inNonSerializableClass; - mMemberName = inMemberName; - } - - public String getContainingClass() { - return mContainingClass; - } - - public String getMemberName() { - return mMemberName; - } - - public String getBadMemberString() { - if (mMemberName == null) - return mContainingClass; - return mContainingClass + "." + mMemberName; - } - - @Override - public String toString() { - return "SerializationFailure [mNonSerializableClass=" + mContainingClass + ", mMemberName=" + mMemberName - + "]"; - } - } - - private static class SerializationCheckerData { - private Set<Class<?>> mSerializableClasses; - - SerializationCheckerData() { - mSerializableClasses = new HashSet<Class<?>>(); - } - - boolean isAlreadyChecked(Class<?> inClass) { - return mSerializableClasses.contains(inClass); - } - - void addSerializableClass(Class<?> inClass) { - mSerializableClasses.add(inClass); - } - } - - private SerializableChecker() {} - - public static SerializationFailure isFullySerializable(Class<?> inClass) { - if (!isSerializable(inClass)) - return new SerializationFailure(inClass.getName(), null); - - return isFullySerializable(inClass, new SerializationCheckerData()); - } - - private static SerializationFailure isFullySerializable(Class<?> inClass, - SerializationCheckerData inSerializationCheckerData) { - for (Field field : declaredFields(inClass)) { - Class<?> fieldDeclaringClass = field.getType(); - - if (field.getType() == Object.class) - continue; - - if (Modifier.isStatic(field.getModifiers())) - continue; - - if (field.isSynthetic()) - continue; - - if (fieldDeclaringClass.isInterface() || fieldDeclaringClass.isPrimitive()) - continue; - - if (Modifier.isAbstract(field.getType().getModifiers())) - continue; - - if (inSerializationCheckerData.isAlreadyChecked(fieldDeclaringClass)) - continue; - - if (isSerializable(fieldDeclaringClass)) { - inSerializationCheckerData.addSerializableClass(inClass); - - SerializationFailure failure = isFullySerializable(field.getType(), inSerializationCheckerData); - if (failure != null) - return failure; - else - continue; - } - - if (Modifier.isTransient(field.getModifiers())) - continue; - - return new SerializationFailure(field.getDeclaringClass().getName(), field.getName()); - } - return null; - } - - private static boolean isSerializable(Class<?> inClass) { - Set<Class<?>> interfaces = getInterfaces(inClass); - if (interfaces == null) - return false; - boolean isSerializable = interfaces.contains(Serializable.class); - if (isSerializable) - return true; - - for (Class<?> classInterface : interfaces) { - if (isSerializable(classInterface)) - return true; - } - - if (inClass.getSuperclass() != null && isSerializable(inClass.getSuperclass())) - return true; - - return false; - } - - private static Set<Class<?>> getInterfaces(Class<?> inFieldDeclaringClass) { - return new HashSet<Class<?>>(Arrays.asList(inFieldDeclaringClass.getInterfaces())); - } - - private static List<Field> declaredFields(Class<?> inClass) { - List<Field> fields = new ArrayList<Field>(Arrays.asList(inClass.getDeclaredFields())); - - Class<?> parentClasses = inClass.getSuperclass(); - - if (parentClasses == null) - return fields; - fields.addAll(declaredFields(parentClasses)); - - return fields; - } -} diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/SerializationTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/SerializationTest.java index b970b95b97..e9e83a59ae 100644 --- a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/SerializationTest.java +++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/SerializationTest.java @@ -20,7 +20,6 @@ package org.onap.so.bpmn.servicedecomposition; -import static org.junit.Assert.assertEquals; import java.io.ByteArrayOutputStream; import java.io.Externalizable; import java.io.File; @@ -33,8 +32,7 @@ import java.util.Map; import org.camunda.bpm.engine.delegate.DelegateExecution; import org.camunda.bpm.engine.impl.pvm.runtime.ExecutionImpl; import org.junit.Test; -import org.onap.so.SerializableChecker; -import org.onap.so.SerializableChecker.SerializationFailure; +import static org.junit.Assert.assertEquals; import org.onap.so.bpmn.common.BuildingBlockExecution; import org.onap.so.bpmn.common.DelegateExecutionImpl; import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; diff --git a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/SerializableChecker.java b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/SerializableChecker.java deleted file mode 100644 index 47ddea1b4f..0000000000 --- a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/SerializableChecker.java +++ /dev/null @@ -1,163 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP - SO - * ================================================================================ - * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.so; - -import java.io.Serializable; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public final class SerializableChecker { - public static class SerializationFailure { - private final String mContainingClass; - private final String mMemberName; - - public SerializationFailure(String inNonSerializableClass, String inMemberName) { - mContainingClass = inNonSerializableClass; - mMemberName = inMemberName; - } - - public String getContainingClass() { - return mContainingClass; - } - - public String getMemberName() { - return mMemberName; - } - - public String getBadMemberString() { - if (mMemberName == null) - return mContainingClass; - return mContainingClass + "." + mMemberName; - } - - @Override - public String toString() { - return "SerializationFailure [mNonSerializableClass=" + mContainingClass + ", mMemberName=" + mMemberName - + "]"; - } - } - - private static class SerializationCheckerData { - private Set<Class<?>> mSerializableClasses; - - SerializationCheckerData() { - mSerializableClasses = new HashSet<Class<?>>(); - } - - boolean isAlreadyChecked(Class<?> inClass) { - return mSerializableClasses.contains(inClass); - } - - void addSerializableClass(Class<?> inClass) { - mSerializableClasses.add(inClass); - } - } - - private SerializableChecker() {} - - public static SerializationFailure isFullySerializable(Class<?> inClass) { - if (!isSerializable(inClass)) - return new SerializationFailure(inClass.getName(), null); - - return isFullySerializable(inClass, new SerializationCheckerData()); - } - - private static SerializationFailure isFullySerializable(Class<?> inClass, - SerializationCheckerData inSerializationCheckerData) { - for (Field field : declaredFields(inClass)) { - Class<?> fieldDeclaringClass = field.getType(); - - if (field.getType() == Object.class) - continue; - - if (Modifier.isStatic(field.getModifiers())) - continue; - - if (field.isSynthetic()) - continue; - - if (fieldDeclaringClass.isInterface() || fieldDeclaringClass.isPrimitive()) - continue; - - if (Modifier.isAbstract(field.getType().getModifiers())) - continue; - - if (inSerializationCheckerData.isAlreadyChecked(fieldDeclaringClass)) - continue; - - if (isSerializable(fieldDeclaringClass)) { - inSerializationCheckerData.addSerializableClass(inClass); - - SerializationFailure failure = isFullySerializable(field.getType(), inSerializationCheckerData); - if (failure != null) - return failure; - else - continue; - } - - if (Modifier.isTransient(field.getModifiers())) - continue; - - return new SerializationFailure(field.getDeclaringClass().getName(), field.getName()); - } - return null; - } - - private static boolean isSerializable(Class<?> inClass) { - Set<Class<?>> interfaces = getInterfaces(inClass); - if (interfaces == null) - return false; - boolean isSerializable = interfaces.contains(Serializable.class); - if (isSerializable) - return true; - - for (Class<?> classInterface : interfaces) { - if (isSerializable(classInterface)) - return true; - } - - if (inClass.getSuperclass() != null && isSerializable(inClass.getSuperclass())) - return true; - - return false; - } - - private static Set<Class<?>> getInterfaces(Class<?> inFieldDeclaringClass) { - return new HashSet<Class<?>>(Arrays.asList(inFieldDeclaringClass.getInterfaces())); - } - - private static List<Field> declaredFields(Class<?> inClass) { - List<Field> fields = new ArrayList<Field>(Arrays.asList(inClass.getDeclaredFields())); - - Class<?> parentClasses = inClass.getSuperclass(); - - if (parentClasses == null) - return fields; - fields.addAll(declaredFields(parentClasses)); - - return fields; - } -} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCRequestTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCRequestTasks.java index 3383fde0a8..e55fa9e24b 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCRequestTasks.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCRequestTasks.java @@ -102,6 +102,9 @@ public class SDNCRequestTasks { String asyncRequest = (String) execution.getVariable(request.getCorrelationName() + MESSAGE); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); + dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new InputSource(new StringReader(asyncRequest))); diff --git a/docs/release-notes.rst b/docs/release-notes.rst index 05c0c14042..4ad5f5876f 100644 --- a/docs/release-notes.rst +++ b/docs/release-notes.rst @@ -7,12 +7,12 @@ Service Orchestrator Release Notes ================================== The SO provides the highest level of service orchestration in the ONAP architecture. -The SO provides the highest level of service orchestration in the ONAP architecture. -Version: 1.5.3 + +Version: 5.0.1 ----------------------- -:Release Date: 2019-10-10 +:Release Date: 2019-10-11 **Docker Images** @@ -28,6 +28,7 @@ Version: 1.5.3 - onap/so/so-monitoring,1.5.3 - onap/so/vfc-adapter,1.5.3 - onap/so/vnfm-adapter,1.5.3 + - onap/so/vnfm-simulator,1.5.3 **Release Purpose** @@ -38,11 +39,109 @@ The R5 El Alto release of ONAP is a maintenance release, focusing on deployabili The main goal of the El-Alto release was to improve documentation, UT improvement for various kinds of resources. **Epics** - +- [`SO-1756 <https://jira.onap.org/browse/SO-1756>`__\ ] - Enhance SO VNFM Adapter **Stories** +- [`SO-2376 <https://jira.onap.org/browse/SO-2376>`__\ ] - Improve fall out case handling +- [`SO-2363 <https://jira.onap.org/browse/SO-2363>`__\ ] - Update Resume Logic and Add Workflow Listeners +- [`SO-2353 <https://jira.onap.org/browse/SO-2353>`__\ ] - update logging to match onap logging library +- [`SO-2352 <https://jira.onap.org/browse/SO-2352>`__\ ] - Improvements to relationship handling in VNFM adapter +- [`SO-2332 <https://jira.onap.org/browse/SO-2332>`__\ ] - Remove unused table requestdb.active_requests. +- [`SO-2306 <https://jira.onap.org/browse/SO-2306>`__\ ] - getentity csar logging +- [`SO-2301 <https://jira.onap.org/browse/SO-2301>`__\ ] - Integrate Logging Library +- [`SO-2297 <https://jira.onap.org/browse/SO-2297>`__\ ] - updated all sql files including in tests to use +- [`SO-2291 <https://jira.onap.org/browse/SO-2291>`__\ ] - Created external task utils in a common location +- [`SO-2283 <https://jira.onap.org/browse/SO-2283>`__\ ] - Convert NetworkCollection to use GetEntity API. +- [`SO-2282 <https://jira.onap.org/browse/SO-2282>`__\ ] - Convert to use the GetEntity API +- [`SO-2259 <https://jira.onap.org/browse/SO-2259>`__\ ] - Added default value for when ErrorCode is null in mdc +- [`SO-2244 <https://jira.onap.org/browse/SO-2244>`__\ ] - Updated VNF and VfModules to use the getEntity API. +- [`SO-2233 <https://jira.onap.org/browse/SO-2233>`__\ ] - fixed dsl builder to correctly add output +- [`SO-2232 <https://jira.onap.org/browse/SO-2232>`__\ ] - Initial commit of validation framework to APIH +- [`SO-2231 <https://jira.onap.org/browse/SO-2231>`__\ ] - asdc controller treat distributionid as requestid in mdc +- [`SO-2224 <https://jira.onap.org/browse/SO-2224>`__\ ] - Updated vnfc instance groups to use the getEntity API. +- [`SO-2216 <https://jira.onap.org/browse/SO-2216>`__\ ] - health check now entirely config based +- [`SO-2205 <https://jira.onap.org/browse/SO-2205>`__\ ] - add rainy day handling with SERVICE_ROLE and type +- [`SO-2202 <https://jira.onap.org/browse/SO-2202>`__\ ] - Updated cvnfc's to use the getEntity API +- [`SO-2190 <https://jira.onap.org/browse/SO-2190>`__\ ] - VNFM adapter support two way TLS +- [`SO-2180 <https://jira.onap.org/browse/SO-2180>`__\ ] - Support oauth for calls from VNFM to VNFM adapter +- [`SO-2169 <https://jira.onap.org/browse/SO-2169>`__\ ] - Add oauth for calls from VNFM adapter to VNFM +- [`SO-2157 <https://jira.onap.org/browse/SO-2157>`__\ ] - Upgrade springboot.version from 2.0.5 to 2.1.5 +- [`SO-2147 <https://jira.onap.org/browse/SO-2147>`__\ ] - Converted NetworkResource to use the parser getEntity method +- [`SO-2143 <https://jira.onap.org/browse/SO-2143>`__\ ] - Implement TLS for calls into VNFM adapter +- [`SO-2142 <https://jira.onap.org/browse/SO-2142>`__\ ] - mso to enhance get orchestration request to include workflow step +- [`SO-2122 <https://jira.onap.org/browse/SO-2122>`__\ ] - Added servicename to MDC so that it gets logged and added enter and exit markers +- [`SO-2121 <https://jira.onap.org/browse/SO-2121>`__\ ] - Removing the application-local.yaml files from the projects to fix CSO pen test issues +- [`SO-2116 <https://jira.onap.org/browse/SO-2116>`__\ ] - Implement TLS for calls from VNFM adapter to VNFM +- [`SO-2114 <https://jira.onap.org/browse/SO-2114>`__\ ] - We need to expand column request_status on table archived_infra_requests as well +- [`SO-2111 <https://jira.onap.org/browse/SO-2111>`__\ ] - add query stack data and populate table step +- [`SO-2097 <https://jira.onap.org/browse/SO-2097>`__\ ] - Global JJB Migration of SO +- [`SO-2093 <https://jira.onap.org/browse/SO-2093>`__\ ] - mso will support new requeststate values +- [`SO-2092 <https://jira.onap.org/browse/SO-2092>`__\ ] - update bpmn to save extsystemerrorsource +- [`SO-2080 <https://jira.onap.org/browse/SO-2080>`__\ ] - support new query param format +- [`SO-2068 <https://jira.onap.org/browse/SO-2068>`__\ ] - improved logging when no exception data is found +- [`SO-2066 <https://jira.onap.org/browse/SO-2066>`__\ ] - SO API Security Matrix +- [`SO-2064 <https://jira.onap.org/browse/SO-2064>`__\ ] - Alpine porting check +- [`SO-2057 <https://jira.onap.org/browse/SO-2057>`__\ ] - Update failsafe dependency to 2.0.1 +- [`SO-2055 <https://jira.onap.org/browse/SO-2055>`__\ ] - enhance workflowaction to handle resume func +- [`SO-2054 <https://jira.onap.org/browse/SO-2054>`__\ ] - add rollback ext system error source +- [`SO-2052 <https://jira.onap.org/browse/SO-2052>`__\ ] - Javadoc and logging improvement +- [`SO-2048 <https://jira.onap.org/browse/SO-2048>`__\ ] - Building individual repos for reducing compilation time +- [`SO-2043 <https://jira.onap.org/browse/SO-2043>`__\ ] - Security updates for maven dependencies +- [`SO-2035 <https://jira.onap.org/browse/SO-2035>`__\ ] - update apih to accept new uri parameter +- [`SO-2032 <https://jira.onap.org/browse/SO-2032>`__\ ] - support no payload for alacarte deletes +- [`SO-2024 <https://jira.onap.org/browse/SO-2024>`__\ ] - Validate ServiceInstance name using createNodesUri. +- [`SO-2023 <https://jira.onap.org/browse/SO-2023>`__\ ] - add is_data_internal column to request processing data +- [`SO-2022 <https://jira.onap.org/browse/SO-2022>`__\ ] - Validate name for InstanceGroup, Configuration and Network. +- [`SO-2021 <https://jira.onap.org/browse/SO-2021>`__\ ] - update multi stage code to accurately skip bbs if true +- [`SO-2020 <https://jira.onap.org/browse/SO-2020>`__\ ] - mso to validate the name uniqueness during object creation in a ai +- [`SO-2018 <https://jira.onap.org/browse/SO-2018>`__\ ] - Changes related to eviction of connections from connection pool +- [`SO-2017 <https://jira.onap.org/browse/SO-2017>`__\ ] - use count format and limit one for exists +- [`SO-2015 <https://jira.onap.org/browse/SO-2015>`__\ ] - support async operation for vf module operations with sdnc +- [`SO-2001 <https://jira.onap.org/browse/SO-2001>`__\ ] - Added ext_system_error_source column to requestdb +- [`SO-1999 <https://jira.onap.org/browse/SO-1999>`__\ ] - replaced String.repeat with static final strings +- [`SO-1990 <https://jira.onap.org/browse/SO-1990>`__\ ] - resume request copying request body rewrite requestorid +- [`SO-1976 <https://jira.onap.org/browse/SO-1976>`__\ ] - Enhance naming service support +- [`SO-1975 <https://jira.onap.org/browse/SO-1975>`__\ ] - Accommodate WAN Networking +- [`SO-1963 <https://jira.onap.org/browse/SO-1963>`__\ ] - apih resume request handling more generic +- [`SO-1960 <https://jira.onap.org/browse/SO-1960>`__\ ] - apih to populate original request id +- [`SO-1914 <https://jira.onap.org/browse/SO-1914>`__\ ] - Renamed NF fields in catalog db pojo +- [`SO-1902 <https://jira.onap.org/browse/SO-1902>`__\ ] - Added script for adding original_request_id column +- [`SO-1898 <https://jira.onap.org/browse/SO-1898>`__\ ] - Audit service enhancements +- [`SO-1897 <https://jira.onap.org/browse/SO-1897>`__\ ] - fix keypair conflict issue in openstack adapter +- [`SO-1893 <https://jira.onap.org/browse/SO-1893>`__\ ] - Initial checkin of updates for vf module replace +- [`SO-1867 <https://jira.onap.org/browse/SO-1867>`__\ ] - store openstack request status in requestdb +- [`SO-1866 <https://jira.onap.org/browse/SO-1866>`__\ ] - Update Rainy day handling to be more robust +- [`SO-1847 <https://jira.onap.org/browse/SO-1847>`__\ ] - Added inProgress request check to resume +- [`SO-1831 <https://jira.onap.org/browse/SO-1831>`__\ ] - Resume APIH Functionality +- [`SO-1807 <https://jira.onap.org/browse/SO-1807>`__\ ] - Store Cloud Request in Database, add to request service +- [`SO-1697 <https://jira.onap.org/browse/SO-1697>`__\ ] - Support State transition for configuration building blocks +- [`SO-1538 <https://jira.onap.org/browse/SO-1538>`__\ ] - Integration Test for SO VNFM Adapter - Perform the functional test to validate VNFM Adapter NBI and SOL003-based SBI +- [`SO-1447 <https://jira.onap.org/browse/SO-1447>`__\ ] - Refine multicloud use of SO cloudsites and identify DB +- [`SO-1446 <https://jira.onap.org/browse/SO-1446>`__\ ] - Multicloud API updates for generic clouds - +**Key Issues Addressed** +- [`SO-2400 <https://jira.onap.org/browse/SO-2400>`__\ ] - vCPE Create Res Cust Service Error : Execption in create execution list +- [`SO-2382 <https://jira.onap.org/browse/SO-2382>`__\ ] - SO ConfigAssign Java Exception +- [`SO-2378 <https://jira.onap.org/browse/SO-2378>`__\ ] - Java lang exception in Homing +- [`SO-2375 <https://jira.onap.org/browse/SO-2375>`__\ ] - vCPE instantiate gmux fails due to API Handler error +- [`SO-2357 <https://jira.onap.org/browse/SO-2357>`__\ ] - Distribution of K8S service fails +- [`SO-2354 <https://jira.onap.org/browse/SO-2354>`__\ ] - vCPE model_customization_id not found on create vfmodule +- [`SO-2351 <https://jira.onap.org/browse/SO-2351>`__\ ] - SO Distribution Error on Allotted Resource - duplicate primary +- [`SO-2349 <https://jira.onap.org/browse/SO-2349>`__\ ] - Exception in DMAAP Client when PNF_READY event arrives from PRH +- [`SO-2337 <https://jira.onap.org/browse/SO-2337>`__\ ] - Git clone not working for CSIT filename too long +- [`SO-2289 <https://jira.onap.org/browse/SO-2289>`__\ ] - CreateVcpeResCustService_simplified workflow used in PnP PNF registration workflow returns an exception in Dmaap listener +- [`SO-2229 <https://jira.onap.org/browse/SO-2229>`__\ ] - sdc adapter and openstack container in crash loopback +- [`SO-2228 <https://jira.onap.org/browse/SO-2228>`__\ ] - SDC Handler crash loopback +- [`SO-2222 <https://jira.onap.org/browse/SO-2222>`__\ ] - SO 1.5.0-STAGING-latest containers fail liveness probe +- [`SO-2221 <https://jira.onap.org/browse/SO-2221>`__\ ] - SO 1.5.0-STAGING-latest container fails to start +- [`SO-2082 <https://jira.onap.org/browse/SO-2082>`__\ ] - Delete Network does not work correctly +- [`SO-2038 <https://jira.onap.org/browse/SO-2038>`__\ ] - Fix build and harkari-cp version, Get LF to add dependency +- [`SO-2003 <https://jira.onap.org/browse/SO-2003>`__\ ] - No workflow assigned to 'Dissociate' button in VID +- [`SO-1934 <https://jira.onap.org/browse/SO-1934>`__\ ] - ETSI Building Block Fails to Execute - Due to variables not being mapped correctly in the workflow +- [`SO-1892 <https://jira.onap.org/browse/SO-1892>`__\ ] - CatalogDbClent - sql query error +- [`SO-1809 <https://jira.onap.org/browse/SO-1809>`__\ ] - 'DoDeleteE2EServiceInstance' calls 'AAI GenericGetService' sub-process which is deleted from SO common-bpmn +- [`SO-1644 <https://jira.onap.org/browse/SO-1644>`__\ ] - SO doesn't keep the proxy settings within the containers +- [`SO-1605 <https://jira.onap.org/browse/SO-1605>`__\ ] - SO fails on updating Camunda table when DoCreateVfModule for vCPE infra service **Security Notes** @@ -54,14 +153,19 @@ The main goal of the El-Alto release was to improve documentation, UT improvemen **Known Issues** +- [`SO-2063 <https://jira.onap.org/browse/SO-2063>`__\ ] - AAF integration +- [`SO-2403 <https://jira.onap.org/browse/SO-2403>`__\ ] - Not Displaying correct Workflow Name +- [`SO-2430 <https://jira.onap.org/browse/SO-2430>`__\ ] - vCPE Create VFmodule Fails on Query to SDNC +- [`SO-2433 <https://jira.onap.org/browse/SO-2433>`__\ ] - Not providing user options during Pause For Manual Task +- [`SO-2434 <https://jira.onap.org/browse/SO-2434>`__\ ] - Displaying Un-needed Mandatory User Inputs for Workflow with Pause +- [`SO-1754 <https://jira.onap.org/browse/SO-1754>`__\ ] - SO-Mariadb: 'VNF_RESOURCE_CUSTOMIZATION' DB update bug when service is distributed. +- [`SO-2447 <https://jira.onap.org/browse/SO-2447>`__\ ] - Openstack Adatper fails to find Stack Name and creates duplicate stack with address conflict + OJSI Issues - [`OJSI-110 <https://jira.onap.org/browse/OJSI-110>`__\ ] - so-monitor exposes plain text HTTP endpoint using port 30224 - - [`OJSI-138 <https://jira.onap.org/browse/OJSI-138>`__\ ] - so exposes plain text HTTP endpoint using port 30277 - - [`OJSI-169 <https://jira.onap.org/browse/OJSI-169>`__\ ] - Port 30224 exposes unprotected service outside of cluster - - [`OJSI-203 <https://jira.onap.org/browse/OJSI-203>`__\ ] - SO exposes unprotected APIs/UIs (CVE-2019-12128 |