Merge "Revert "Fixed the lock times and populated error variable""
authorByung-Woo Jun <byung-woo.jun@est.tech>
Mon, 2 Nov 2020 18:31:43 +0000 (18:31 +0000)
committerGerrit Code Review <gerrit@onap.org>
Mon, 2 Nov 2020 18:31:43 +0000 (18:31 +0000)
37 files changed:
adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/annotation/RequestLogger.java [new file with mode: 0644]
adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/consts/NssmfAdapterConsts.java
adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/controller/NssmfAdapterController.java
adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiServiceProvider.java
adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiServiceProviderImpl.java
adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/interceptor/LoggerInterceptor.java
adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/interceptor/RequestLogAspect.java [new file with mode: 0644]
adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/BaseNssmfManager.java
adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/ExternalNssmfManager.java
adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/InternalNssmfManager.java
adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/external/ExternalAnNssmfManager.java
adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/util/RestUtil.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/HeatBridgeImpl.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/helpers/AaiHelper.java
adapters/mso-openstack-adapters/src/test/java/org/onap/so/heatbridge/HeatBridgeImplTest.java
asdc-controller/src/main/java/org/onap/so/asdc/installer/VfResourceStructure.java
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/DoHandleOofRequest.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/OofUtils.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSliceService.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateSliceServiceInstance.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateSliceServiceOption.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateTnNssiInstance.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateNSSI.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/TnAllocateNssi.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/TnNssmfUtils.groovy
bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoCreateSliceServiceInstance.bpmn
bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoCreateTnNssiInstance.bpmn
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionTest.java
common/src/main/java/org/onap/so/beans/nsmf/NssmfAdapterNBIRequest.java
common/src/main/java/org/onap/so/beans/nsmf/SliceTaskParamsAdapter.java
common/src/main/java/org/onap/so/configuration/rest/HttpClientConnectionConfiguration.java
common/src/main/java/org/onap/so/configuration/rest/HttpComponentsClientConfiguration.java
releases/1.7.6-nslcm-adapter.yaml [new file with mode: 0644]
releases/1.7.7.yaml [new file with mode: 0644]
so-simulator/src/main/java/org/onap/so/simulator/actions/aai/ProcessVnfc.java
version.properties

diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/annotation/RequestLogger.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/annotation/RequestLogger.java
new file mode 100644 (file)
index 0000000..44f814a
--- /dev/null
@@ -0,0 +1,31 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, CMCC Technologies Co., Ltd.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License")
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ #       http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.nssmf.annotation;
+
+
+import java.lang.annotation.*;
+
+@Target({ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface RequestLogger {
+    boolean ignore() default false;
+}
index 28789f2..84e1eb2 100644 (file)
@@ -159,7 +159,7 @@ public class NssmfAdapterConsts {
                 new NssmfUrlInfo(EXTERNAL_QUERY_JOB_STATUS, HttpMethod.GET));
 
         urlInfoMap.put(generateKey(ExecutorType.INTERNAL, null, ActionType.QUERY_SUB_NET_CAPABILITY),
-                new NssmfUrlInfo(INTERNAL_QUERY_SUB_NET_CAPABILITY, HttpMethod.POST));
+                new NssmfUrlInfo(INTERNAL_QUERY_SUB_NET_CAPABILITY, HttpMethod.GET));
     }
 
     /**
index 02d7468..3732e2c 100644 (file)
@@ -1,5 +1,6 @@
 package org.onap.so.adapters.nssmf.controller;
 
+import org.onap.so.adapters.nssmf.annotation.RequestLogger;
 import org.onap.so.adapters.nssmf.service.NssmfManagerService;
 import org.onap.so.beans.nsmf.*;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -9,6 +10,7 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 
 @RestController
 @RequestMapping(value = "/api/rest/provMns/v1", produces = {APPLICATION_JSON}, consumes = {APPLICATION_JSON})
+@RequestLogger
 public class NssmfAdapterController {
 
     @Autowired
index 665b111..77662bf 100644 (file)
@@ -33,4 +33,7 @@ public interface AaiServiceProvider {
     void invokeCreateServiceInstance(ServiceInstance nssiInstance, String globalSubscriberId, String serviceType,
             String serviceInstanceId);
 
+    ServiceInstance invokeGetServiceInstance(String globalSubscriberId, String serviceType, String serviceInstanceId);
+
+    void invokeDeleteServiceInstance(String globalSubscriberId, String serviceType, String serviceInstanceId);
 }
index b972517..1d7c42a 100644 (file)
@@ -75,4 +75,24 @@ public class AaiServiceProviderImpl implements AaiServiceProvider {
                 .customer(globalSubscriberId).serviceSubscription(serviceType).serviceInstance(serviceInstanceId));
         aaiClientProvider.getAaiClient().create(uri, nssiInstance);
     }
+
+    @Override
+    public ServiceInstance invokeGetServiceInstance(String globalSubscriberId, String serviceType,
+            String serviceInstanceId) {
+        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
+                .customer(globalSubscriberId).serviceSubscription(serviceType).serviceInstance(serviceInstanceId));
+
+        return aaiClientProvider.getAaiClient().get(ServiceInstance.class, uri).orElseGet(() -> {
+            logger.debug("ServiceInstance " + serviceInstanceId + " not found in AAI");
+            return null;
+        });
+    }
+
+    @Override
+    public void invokeDeleteServiceInstance(String globalSubscriberId, String serviceType, String serviceInstanceId) {
+        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
+                .customer(globalSubscriberId).serviceSubscription(serviceType).serviceInstance(serviceInstanceId));
+
+        aaiClientProvider.getAaiClient().delete(uri);
+    }
 }
index ea6a125..bca4a12 100644 (file)
  # limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.so.adapters.nssmf.interceptor;
 
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Pointcut;
-import org.aspectj.lang.reflect.MethodSignature;
-import org.onap.so.adapters.nssmf.annotation.ServiceLogger;
-import org.onap.so.adapters.nssmf.util.NssmfAdapterUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.annotation.Order;
+import org.apache.logging.log4j.ThreadContext;
 import org.springframework.stereotype.Component;
-import java.lang.reflect.Method;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.UUID;
 
-/**
- * support to print logger of service method
- */
-@Aspect
-@Order(100)
 @Component
-public class LoggerInterceptor {
-
-    private static final Logger logger = LoggerFactory.getLogger(LoggerInterceptor.class);
+public class LoggerInterceptor implements HandlerInterceptor {
 
-    @Pointcut("execution(* org.onap.so.adapters.nssmf.service..*(..))")
-    public void serviceLogger() {
+    private final static String TRACE_ID = "traceId";
 
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
+            throws Exception {
+        String traceId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
+        ThreadContext.put(TRACE_ID, traceId);
+        return true;
     }
 
-    @Around("serviceLogger()")
-    public Object around(ProceedingJoinPoint joinPoint) {
-        try {
-            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
-            Method method = signature.getMethod();
-
-            Class<?> targetClass = method.getDeclaringClass();
-
-            StringBuilder classAndMethod = new StringBuilder();
-            ServiceLogger classAnnotation = targetClass.getAnnotation(ServiceLogger.class);
-            ServiceLogger methodAnnotation = method.getAnnotation(ServiceLogger.class);
-
-            if (classAnnotation == null && methodAnnotation == null) {
-                return joinPoint.proceed();
-            }
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
+            ModelAndView modelAndView) throws Exception {
 
-            if (classAnnotation != null) {
-                if (classAnnotation.ignore()) {
-                    return joinPoint.proceed();
-                }
-                classAndMethod.append(classAnnotation.value()).append("-");
-            }
-
-            String target = targetClass.getName() + "#" + method.getName();
-
-            String params = NssmfAdapterUtil.marshal(joinPoint.getArgs());
-
-            logger.info("{} Start: Method = {} \nParams = {}", classAndMethod.toString(), target, params);
-
-            long start = System.currentTimeMillis();
-            Object result = joinPoint.proceed();
-            long timeConsuming = System.currentTimeMillis() - start;
-
-            logger.info("\n{} End: Method = {}, Spend time = {}ms \nResult = {}", classAndMethod.toString(), target,
-                    timeConsuming, NssmfAdapterUtil.marshal(result));
-            return result;
+    }
 
-        } catch (Throwable e) {
-            logger.error(e.getMessage(), e);
-        }
-        return null;
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
+            throws Exception {
+        ThreadContext.remove(TRACE_ID);
     }
 }
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/interceptor/RequestLogAspect.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/interceptor/RequestLogAspect.java
new file mode 100644 (file)
index 0000000..95f26b4
--- /dev/null
@@ -0,0 +1,227 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, CMCC Technologies Co., Ltd.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License")
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ #       http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.adapters.nssmf.interceptor;
+
+import lombok.Data;
+import lombok.ToString;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.*;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.onap.so.adapters.nssmf.annotation.RequestLogger;
+import org.onap.so.adapters.nssmf.annotation.ServiceLogger;
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.onap.so.adapters.nssmf.util.NssmfAdapterUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.multipart.MultipartFile;
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * support to print logger of service method
+ */
+@Aspect
+@Order(100)
+@Component
+public class RequestLogAspect {
+
+    private static final Logger logger = LoggerFactory.getLogger(RequestLogAspect.class);
+
+    @Pointcut("execution(* org.onap.so.adapters.nssmf.service..*(..))")
+    public void serviceLogger() {
+
+    }
+
+    @Around("serviceLogger()")
+    public Object around(ProceedingJoinPoint joinPoint) {
+        try {
+            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+            Method method = signature.getMethod();
+
+            Class<?> targetClass = method.getDeclaringClass();
+
+            StringBuilder classAndMethod = new StringBuilder();
+            ServiceLogger classAnnotation = targetClass.getAnnotation(ServiceLogger.class);
+            ServiceLogger methodAnnotation = method.getAnnotation(ServiceLogger.class);
+
+            if (classAnnotation == null && methodAnnotation == null) {
+                return joinPoint.proceed();
+            }
+
+            if (classAnnotation != null) {
+                if (classAnnotation.ignore()) {
+                    return joinPoint.proceed();
+                }
+                classAndMethod.append(classAnnotation.value()).append("-");
+            }
+
+            String target = targetClass.getName() + "#" + method.getName();
+
+            String params = NssmfAdapterUtil.marshal(joinPoint.getArgs());
+
+            logger.info("{} Start: Method = {} \nParams = {}", classAndMethod.toString(), target, params);
+
+            long start = System.currentTimeMillis();
+            Object result = joinPoint.proceed();
+            long timeConsuming = System.currentTimeMillis() - start;
+
+            logger.info("\n{} End: Method = {}, Spend time = {}ms \nResult = {}", classAndMethod.toString(), target,
+                    timeConsuming, NssmfAdapterUtil.marshal(result));
+            return result;
+
+        } catch (Throwable e) {
+            logger.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    @Pointcut("execution(* org.onap.so.adapters.nssmf.controller..*(..))")
+    public void controllerLogger() {
+
+    }
+
+    @Around("controllerLogger()")
+    public Object doAroundRequest(ProceedingJoinPoint point) throws Throwable {
+        MethodSignature signature = (MethodSignature) point.getSignature();
+        Method method = signature.getMethod();
+        Class<?> targetClass = method.getDeclaringClass();
+
+        RequestLogger classAnnotation = targetClass.getAnnotation(RequestLogger.class);
+        RequestLogger methodAnnotation = method.getAnnotation(RequestLogger.class);
+
+        if ((classAnnotation == null && methodAnnotation == null)
+                || (classAnnotation != null && classAnnotation.ignore())
+                || (methodAnnotation != null && methodAnnotation.ignore())) {
+            return point.proceed();
+        }
+
+        long start = System.currentTimeMillis();
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+
+        assert attributes != null;
+        HttpServletRequest request = attributes.getRequest();
+        Object result = point.proceed();
+        RequestInfo requestInfo = new RequestInfo();
+        requestInfo.setIp(request.getRemoteAddr());
+        requestInfo.setUrl(request.getRequestURL().toString());
+        requestInfo.setHttpMethod(request.getMethod());
+        requestInfo.setClassMethod(String.format("%s.%s", signature.getDeclaringTypeName(), signature.getName()));
+        requestInfo.setRequestParams(getRequestParamsByProceedingJoinPoint(point));
+        requestInfo.setResult(result);
+        requestInfo.setTimeCost(System.currentTimeMillis() - start);
+        logger.info("Request Info      : {}", NssmfAdapterUtil.marshal(requestInfo));
+        return result;
+    }
+
+    @AfterThrowing(pointcut = "controllerLogger()", throwing = "e")
+    public void doAfterRequestThrow(JoinPoint joinPoint, RuntimeException e) {
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        Method method = signature.getMethod();
+        Class<?> targetClass = method.getDeclaringClass();
+
+        RequestLogger classAnnotation = targetClass.getAnnotation(RequestLogger.class);
+        RequestLogger methodAnnotation = method.getAnnotation(RequestLogger.class);
+
+        if ((classAnnotation == null && methodAnnotation == null)
+                || (classAnnotation != null && classAnnotation.ignore())
+                || (methodAnnotation != null && methodAnnotation.ignore())) {
+            return;
+        }
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        assert attributes != null;
+        HttpServletRequest request = attributes.getRequest();
+        RequestErrorInfo requestErrorInfo = new RequestErrorInfo();
+        requestErrorInfo.setIp(request.getRemoteAddr());
+        requestErrorInfo.setUrl(request.getRequestURL().toString());
+        requestErrorInfo.setHttpMethod(request.getMethod());
+        requestErrorInfo.setClassMethod(String.format("%s.%s", joinPoint.getSignature().getDeclaringTypeName(),
+                joinPoint.getSignature().getName()));
+        requestErrorInfo.setRequestParams(getRequestParamsByJoinPoint(joinPoint));
+        requestErrorInfo.setException(e);
+        String res;
+        try {
+            res = NssmfAdapterUtil.marshal(requestErrorInfo);
+            logger.info("Error Request Info      : {}", res);
+        } catch (ApplicationException ex) {
+            logger.info("Error Request Info      : {}", requestErrorInfo);
+        }
+    }
+
+    private Map<String, Object> getRequestParamsByJoinPoint(JoinPoint joinPoint) {
+        String[] paramNames = ((MethodSignature) joinPoint.getSignature()).getParameterNames();
+        Object[] paramValues = joinPoint.getArgs();
+
+        return buildRequestParam(paramNames, paramValues);
+    }
+
+
+    private Map<String, Object> getRequestParamsByProceedingJoinPoint(ProceedingJoinPoint proceedingJoinPoint) {
+        String[] paramNames = ((MethodSignature) proceedingJoinPoint.getSignature()).getParameterNames();
+        Object[] paramValues = proceedingJoinPoint.getArgs();
+
+        return buildRequestParam(paramNames, paramValues);
+    }
+
+    private Map<String, Object> buildRequestParam(String[] paramNames, Object[] paramValues) {
+        Map<String, Object> requestParams = new HashMap<>();
+        for (int i = 0; i < paramNames.length; i++) {
+            Object value = paramValues[i];
+
+            if (value instanceof MultipartFile) {
+                MultipartFile file = (MultipartFile) value;
+                value = file.getOriginalFilename();
+            }
+
+            requestParams.put(paramNames[i], value);
+        }
+
+        return requestParams;
+    }
+
+    @Data
+    @ToString
+    private class RequestInfo {
+        private String ip;
+        private String url;
+        private String httpMethod;
+        private String classMethod;
+        private Object requestParams;
+        private Object result;
+        private Long timeCost;
+    }
+
+    @Data
+    @ToString
+    private class RequestErrorInfo {
+        private String ip;
+        private String url;
+        private String httpMethod;
+        private String classMethod;
+        private Object requestParams;
+        private RuntimeException exception;
+    }
+}
index 2ccd88a..c4f269c 100644 (file)
@@ -193,7 +193,7 @@ public abstract class BaseNssmfManager implements NssmfManager {
         return doQuerySubnetCapability(nbiRequest.getSubnetCapabilityQuery());
     }
 
-    protected abstract RestResponse doQuerySubnetCapability(String req) throws ApplicationException;
+    protected abstract <T> RestResponse doQuerySubnetCapability(T req) throws ApplicationException;
 
     /**
      * send request to nssmf
index 0d0d896..bb2b83f 100644 (file)
@@ -25,6 +25,7 @@ import org.apache.http.message.BasicHeader;
 import org.onap.aai.domain.yang.ServiceInstance;
 import org.onap.so.adapters.nssmf.entity.NssmfInfo;
 import org.onap.so.adapters.nssmf.entity.RestResponse;
+import org.onap.so.adapters.nssmf.enums.ActionType;
 import org.onap.so.adapters.nssmf.enums.JobStatus;
 import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
 import org.onap.so.adapters.nssmf.util.NssmfAdapterUtil;
@@ -63,24 +64,32 @@ public abstract class ExternalNssmfManager extends BaseNssmfManager {
     protected void afterQueryJobStatus(ResourceOperationStatus status) {
         if (Integer.parseInt(status.getProgress()) == 100) {
 
-            ServiceInstance nssiInstance = new ServiceInstance();
-            nssiInstance.setServiceInstanceId(serviceInfo.getNssiId());
-            nssiInstance.setServiceInstanceName(serviceInfo.getNssiName());
-            nssiInstance.setServiceType(serviceInfo.getSST());
+            ActionType jobOperType = ActionType.valueOf(status.getOperType());
 
-            nssiInstance.setOrchestrationStatus(initStatus);
-            nssiInstance.setModelInvariantId(serviceInfo.getServiceInvariantUuid());
-            nssiInstance.setModelVersionId(serviceInfo.getServiceUuid());
-            nssiInstance.setServiceInstanceLocationId(serviceInfo.getPLMNIdList());
-            nssiInstance.setEnvironmentContext(esrInfo.getNetworkType().getNetworkType());
-            nssiInstance.setServiceRole("nssi");
+            if (ActionType.ALLOCATE.equals(jobOperType)) {
+                ServiceInstance nssiInstance = restUtil.getServiceInstance(serviceInfo);
+                if (nssiInstance == null) {
+                    nssiInstance = new ServiceInstance();
+                }
 
-            restUtil.createServiceInstance(nssiInstance, serviceInfo);
+                nssiInstance.setServiceInstanceId(serviceInfo.getNssiId());
+                nssiInstance.setServiceInstanceName(serviceInfo.getNssiName());
+                nssiInstance.setServiceType(serviceInfo.getSST());
+
+                nssiInstance.setOrchestrationStatus(initStatus);
+                nssiInstance.setModelInvariantId(serviceInfo.getServiceInvariantUuid());
+                nssiInstance.setModelVersionId(serviceInfo.getServiceUuid());
+                nssiInstance.setServiceInstanceLocationId(serviceInfo.getPLMNIdList());
+                nssiInstance.setEnvironmentContext(esrInfo.getNetworkType().getNetworkType());
+                nssiInstance.setServiceRole("nssi");
+
+                restUtil.createServiceInstance(nssiInstance, serviceInfo);
+            } else if (ActionType.DEALLOCATE.equals(jobOperType)) {
+                restUtil.deleteServiceInstance(serviceInfo);
+            }
         }
     }
 
-
-
     @Override
     protected String wrapActDeActReqBody(ActDeActNssi actDeActNssi) throws ApplicationException {
         return marshal(actDeActNssi);
@@ -157,7 +166,7 @@ public abstract class ExternalNssmfManager extends BaseNssmfManager {
     }
 
     @Override
-    protected RestResponse doQuerySubnetCapability(String req) throws ApplicationException {
+    protected <T> RestResponse doQuerySubnetCapability(T req) throws ApplicationException {
         RestResponse response = new RestResponse();
         response.setStatus(200);
         response.setResponseContent(null);
index 348bf12..4705e87 100644 (file)
@@ -122,8 +122,8 @@ public abstract class InternalNssmfManager extends BaseNssmfManager {
     protected abstract String doWrapModifyReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException;
 
     @Override
-    protected RestResponse doQuerySubnetCapability(String req) throws ApplicationException {
+    protected <T> RestResponse doQuerySubnetCapability(T req) throws ApplicationException {
         // handler
-        return sendRequest(req);
+        return sendRequest(marshal(req));
     }
 }
index 491da0a..c51b72d 100644 (file)
@@ -76,6 +76,7 @@ public class ExternalAnNssmfManager extends ExternalNssmfManager {
             ResourceOperationStatus status =
                     new ResourceOperationStatus(serviceInfo.getNsiId(), resp.getJobId(), serviceInfo.getServiceUuid());
             status.setResourceInstanceID(nssiId);
+            status.setOperType(actionType.toString());
 
             updateDbStatus(status, restResponse.getStatus(), JobStatus.FINISHED,
                     NssmfAdapterUtil.getStatusDesc(actionType));
@@ -128,6 +129,8 @@ public class ExternalAnNssmfManager extends ExternalNssmfManager {
 
         updateRequestDbJobStatus(responseDescriptor, status, restResponse);
 
+        status.setProgress(Integer.toString(responseDescriptor.getProgress()));
+
         return restResponse;
     }
 
index 0c5999b..a7adbe1 100644 (file)
@@ -77,6 +77,16 @@ public class RestUtil {
                 serviceInfo.getSubscriptionServiceType(), serviceInfo.getNssiId());
     }
 
+    public ServiceInstance getServiceInstance(ServiceInfo serviceInfo) {
+        return aaiSvcProv.invokeGetServiceInstance(serviceInfo.getGlobalSubscriberId(),
+                serviceInfo.getSubscriptionServiceType(), serviceInfo.getNssiId());
+    }
+
+    public void deleteServiceInstance(ServiceInfo serviceInfo) {
+        aaiSvcProv.invokeDeleteServiceInstance(serviceInfo.getGlobalSubscriberId(),
+                serviceInfo.getSubscriptionServiceType(), serviceInfo.getNssiId());
+    }
+
     public NssmfInfo getNssmfHost(EsrInfo esrInfo) throws ApplicationException {
         EsrThirdpartySdncList sdncList = aaiSvcProv.invokeGetThirdPartySdncList();
         if (sdncList != null && sdncList.getEsrThirdpartySdnc() != null) {
@@ -214,7 +224,11 @@ public class RestUtil {
                 break;
 
             case GET:
-                base = new HttpGet(url);
+                HttpGetWithBody get = new HttpGetWithBody(url);
+                if (content != null) {
+                    get.setEntity(new StringEntity(content, APPLICATION_JSON));
+                }
+                base = get;
                 break;
 
             case PUT:
@@ -275,6 +289,29 @@ public class RestUtil {
         }
     }
 
+    class HttpGetWithBody extends HttpEntityEnclosingRequestBase {
+        public static final String METHOD_NAME = "GET";
+
+        public HttpGetWithBody() {
+            super();
+        }
+
+        public HttpGetWithBody(final String uri) {
+            super();
+            setURI(URI.create(uri));
+        }
+
+        public HttpGetWithBody(final URI uri) {
+            super();
+            setURI(uri);
+        }
+
+        @Override
+        public String getMethod() {
+            return METHOD_NAME;
+        }
+    }
+
 
     public HttpClient getHttpsClient() {
 
index c8cb8d9..5f17f3c 100644 (file)
@@ -328,11 +328,6 @@ public class HeatBridgeImpl implements HeatBridgeApi {
                     .cloudRegion(cloudOwner, cloudRegionId).tenant(tenantId).vserver(vserver.getVserverId()));
             if (resourcesClient.exists(vserverUri)) {
                 AAIResultWrapper existingVserver = resourcesClient.get(vserverUri);
-                if (!existingVserver.hasRelationshipsTo(Types.VNFC)) {
-                    AAIResourceUri vnfcUri =
-                            AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().vnfc(server.getName()));
-                    transaction.connect(vserverUri, vnfcUri);
-                }
                 if (!existingVserver.hasRelationshipsTo(Types.VF_MODULE)) {
                     AAIResourceUri vfModuleUri = AAIUriFactory.createResourceUri(
                             AAIFluentTypeBuilder.network().genericVnf(genericVnfId).vfModule(vfModuleId));
index c1a97ce..8e6f8cc 100644 (file)
@@ -92,13 +92,6 @@ public class AaiHelper {
                 AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().genericVnf(genericVnfId)));
         relationships.add(genericVnfRelationship);
 
-        // vserver to vnfc relationship
-        if (!StringUtils.isEmpty(server.getName())) {
-            Relationship vnfcRelationship = buildRelationship(
-                    AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().vnfc(server.getName())));
-            relationships.add(vnfcRelationship);
-        }
-
         // vserver to vf-module relationship
         Relationship vfModuleRelationship = buildRelationship(AAIUriFactory
                 .createResourceUri(AAIFluentTypeBuilder.network().genericVnf(genericVnfId).vfModule(vfModuleId)));
index 309a143..7912bce 100644 (file)
@@ -297,15 +297,15 @@ public class HeatBridgeImplTest {
 
         org.onap.aai.domain.yang.RelationshipList relList = aaiHelper.getVserverRelationshipList(CLOUD_OWNER, REGION_ID,
                 "test-genericVnf-id", "test-vfModule-id", server1);
-        assertEquals(4, relList.getRelationship().size());
+        assertEquals(3, relList.getRelationship().size());
 
         org.onap.aai.domain.yang.RelationshipList relList2 = aaiHelper.getVserverRelationshipList(CLOUD_OWNER,
                 REGION_ID, "test-genericVnf-id", "test-vfModule-id", server2);
-        assertEquals(3, relList2.getRelationship().size());
+        assertEquals(2, relList2.getRelationship().size());
 
         org.onap.aai.domain.yang.RelationshipList relList3 = aaiHelper.getVserverRelationshipList(CLOUD_OWNER,
                 REGION_ID, "test-genericVnf-id", "test-vfModule-id", server3);
-        assertEquals(3, relList3.getRelationship().size());
+        assertEquals(2, relList3.getRelationship().size());
     }
 
 
index 1b54632..6497a99 100644 (file)
@@ -120,6 +120,10 @@ public class VfResourceStructure extends ResourceStructure {
             case ASDCConfiguration.OTHER:
             case ASDCConfiguration.CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT:
             case ASDCConfiguration.HELM:
+                if (artifactInfo.getArtifactName().contains("dummy")
+                        && artifactInfo.getArtifactName().contains("ignore")) {
+                    break;
+                }
                 artifactsMapByUUID.put(artifactInfo.getArtifactUUID(), vfModuleArtifact);
                 break;
             case ASDCConfiguration.VF_MODULES_METADATA:
@@ -143,6 +147,9 @@ public class VfResourceStructure extends ResourceStructure {
             return;
         }
         for (IVfModuleData vfModuleMeta : vfModulesMetadataList) {
+            if (vfModuleMeta.getVfModuleModelName().contains("dummy")
+                    && vfModuleMeta.getVfModuleModelName().contains("ignore"))
+                continue;
             vfModulesStructureList.add(new VfModuleStructure(this, vfModuleMeta));
         }
         setNumberOfResources(vfModulesMetadataList.size());
index 644cf5e..b457bdc 100644 (file)
@@ -83,7 +83,7 @@ class DoHandleOofRequest extends AbstractServiceTaskProcessor {
                execution.setVariable("oofRequestPayload", requestJson)
        }
        
-       public void callOofAdapter(DelegateExecution execution) {
+       void callOofAdapter(DelegateExecution execution) {
                logger.debug("Start callOofAdapter")
                String requestId = execution.getVariable("msoRequestId")
                String oofAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.oof.endpoint", execution)
@@ -95,7 +95,7 @@ class DoHandleOofRequest extends AbstractServiceTaskProcessor {
                Response httpResponse = httpClient.post(oofRequest)
                int responseCode = httpResponse.getStatus()
                logger.debug("OOF sync response code is: " + responseCode)
-               if(responseCode != 200){
+        if(responseCode < 200 || responseCode >= 300){
                        exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from OOF.")
                }
        }
index 30cbeaf..ff31c46 100644 (file)
@@ -540,10 +540,8 @@ class OofUtils {
                         "    \"timeout\": 600,\n" +
                         "    \"callbackUrl\": \"${callbackUrl}\"\n" +
                         "    },\n")
-        response.append(" \"serviceProfile\": {\n" +
-                "   \"serviceProfileParameters\": ")
-        response.append(json);
-        response.append("\n }\n")
+        response.append(" \"serviceProfile\":")
+        response.append(json)
         response.append("\n}\n")
         return response.toString()
     }
index 72fd052..5f0d412 100644 (file)
@@ -21,6 +21,7 @@
 package org.onap.so.bpmn.infrastructure.scripts
 
 import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder
+import org.onap.so.serviceinstancebeans.Service
 
 import static org.apache.commons.lang3.StringUtils.*
 import org.camunda.bpm.engine.delegate.BpmnError
@@ -126,21 +127,22 @@ public class CreateSliceService extends AbstractServiceTaskProcessor {
 
             logger.debug("modelInfo: " + serviceModelInfo)
 
-            //requestParameters
-            String subscriptionServiceType = jsonUtil.getJsonValue(ssRequest, "requestDetails.requestParameters.subscriptionServiceType")
-            if (isBlank(subscriptionServiceType)) {
-                msg = "Input subscriptionServiceType is null"
-                logger.debug(msg)
-                exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
-            } else {
-                execution.setVariable("subscriptionServiceType", subscriptionServiceType)
-            }
-            logger.debug("subscriptionServiceType: " + subscriptionServiceType)
+//            //requestParameters
+//            String subscriptionServiceType = jsonUtil.getJsonValue(ssRequest, "requestDetails.requestParameters.subscriptionServiceType")
+//            if (isBlank(subscriptionServiceType)) {
+//                msg = "Input subscriptionServiceType is null"
+//                logger.debug(msg)
+//                exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+//            } else {
+//                subscriptionServiceType = "5G"
+//                execution.setVariable("subscriptionServiceType", subscriptionServiceType)
+//            }
+//            logger.debug("subscriptionServiceType: " + subscriptionServiceType)
 
             /*
             * Extracting User Parameters from incoming Request and converting into a Map
             */
-            Map reqMap = jsonSlurper.parseText(ssRequest)
+            Map reqMap = jsonSlurper.parseText(ssRequest) as Map
 
             //InputParams
             def userParamsList = reqMap.requestDetails?.requestParameters?.userParams
@@ -168,6 +170,7 @@ public class CreateSliceService extends AbstractServiceTaskProcessor {
             execution.setVariable("serviceInputParams", inputMap)
             execution.setVariable("uuiRequest", uuiRequest)
             execution.setVariable("serviceProfile", serviceProfile)
+            execution.setVariable("subscriptionServiceType", serviceObject.get("serviceType"))
 
             //TODO
             //execution.setVariable("serviceInputParams", jsonUtil.getJsonValue(siRequest, "requestDetails.requestParameters.userParams"))
index 48e1acd..fc80a9f 100644 (file)
@@ -101,6 +101,9 @@ class DoCreateSliceServiceInstance extends AbstractServiceTaskProcessor{
          */
         String serviceRole = "service-profile"
         String serviceType = execution.getVariable("serviceType")
+        String globalSubscriberId = execution.getVariable("globalSubscriberId")
+        String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
         Map<String, Object> serviceProfile = sliceParams.getServiceProfile()
         String ssInstanceId = execution.getVariable("serviceInstanceId")
         try {
@@ -121,7 +124,10 @@ class DoCreateSliceServiceInstance extends AbstractServiceTaskProcessor{
             ss.setEnvironmentContext(snssai)
             ss.setServiceRole(serviceRole)
 
-            AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(execution.getVariable("globalSubscriberId")).serviceSubscription(execution.getVariable("subscriptionServiceType")).serviceInstance(ssInstanceId))
+            AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
+                    .customer(globalSubscriberId)
+                    .serviceSubscription(subscriptionServiceType)
+                    .serviceInstance(ssInstanceId))
             client.create(uri, ss)
         } catch (BpmnError e) {
             throw e
@@ -139,8 +145,8 @@ class DoCreateSliceServiceInstance extends AbstractServiceTaskProcessor{
         //rollbackData.put("SERVICEINSTANCE", "disableRollback", disableRollback.toString())
         rollbackData.put("SERVICEINSTANCE", "rollbackAAI", "true")
         rollbackData.put("SERVICEINSTANCE", "serviceInstanceId", ssInstanceId)
-        rollbackData.put("SERVICEINSTANCE", "subscriptionServiceType", execution.getVariable("subscriptionServiceType"))
-        rollbackData.put("SERVICEINSTANCE", "globalSubscriberId", execution.getVariable("globalSubscriberId"))
+        rollbackData.put("SERVICEINSTANCE", "subscriptionServiceType", subscriptionServiceType)
+        rollbackData.put("SERVICEINSTANCE", "globalSubscriberId", globalSubscriberId)
         execution.setVariable("rollbackData", rollbackData)
         execution.setVariable("RollbackData", rollbackData)
         logger.debug("RollbackData:" + rollbackData)
@@ -156,6 +162,8 @@ class DoCreateSliceServiceInstance extends AbstractServiceTaskProcessor{
         /**
          * todo: ServiceProfile params changed
          */
+        String globalSubscriberId = execution.getVariable("globalSubscriberId")
+        String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
         SliceTaskParamsAdapter sliceParams =
                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
         Map<String, Object> serviceProfileMap = sliceParams.getServiceProfile()
@@ -181,11 +189,11 @@ class DoCreateSliceServiceInstance extends AbstractServiceTaskProcessor{
         serviceProfile.setSurvivalTime("0")
         serviceProfile.setReliability("")
         try {
-            AAIResourceUri uri = AAIUriFactory.createResourceUri(
-                AAIFluentTypeBuilder.business().customer(execution.getVariable("globalSubscriberId"))
-                .serviceSubscription(execution.getVariable("subscriptionServiceType"))
-                .serviceInstance(serviceProfileInstanceId)
-                .serviceProfile(serviceProfileId))
+            AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
+                    .customer(globalSubscriberId)
+                    .serviceSubscription(subscriptionServiceType)
+                    .serviceInstance(serviceProfileInstanceId)
+                    .serviceProfile(serviceProfileId))
             client.create(uri, serviceProfile)
             execution.setVariable("sliceTaskParams", sliceParams)
 
@@ -206,15 +214,21 @@ class DoCreateSliceServiceInstance extends AbstractServiceTaskProcessor{
     public void createAllottedResource(DelegateExecution execution) {
 
         try {
-
+            String globalSubscriberId = execution.getVariable("globalSubscriberId")
+            String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
             ServiceDecomposition serviceDecomposition =
                     execution.getVariable("serviceProfileDecomposition") as ServiceDecomposition
+            String serviceInstanceId = execution.getVariable("serviceInstanceId")
 
             List<org.onap.so.bpmn.core.domain.AllottedResource> allottedResourceList = serviceDecomposition.getAllottedResources()
             for(org.onap.so.bpmn.core.domain.AllottedResource allottedResource : allottedResourceList) {
                 String allottedResourceId = UUID.randomUUID().toString()
 
-                AAIResourceUri allottedResourceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(execution.getVariable("globalSubscriberId")).serviceSubscription(execution.getVariable("subscriptionServiceType")).serviceInstance(execution.getVariable("serviceInstanceId")).allottedResource(allottedResourceId))
+                AAIResourceUri allottedResourceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
+                        .customer(globalSubscriberId)
+                        .serviceSubscription(subscriptionServiceType)
+                        .serviceInstance(serviceInstanceId)
+                        .allottedResource(allottedResourceId))
 
                 execution.setVariable("allottedResourceUri", allottedResourceUri)
                 String arType = allottedResource.getAllottedResourceType()
index 1d5232f..cfdbe98 100644 (file)
@@ -371,6 +371,9 @@ class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{
                 execution.setVariable("needQuerySliceProfile", true)
             }
             else {
+                if(execution.getVariable("needQuerySliceProfile")){
+                    execution.setVariable("needQuerySliceProfile", false)
+                }
                 processNewNSI(solution, sliceTaskParams)
             }
         }
index 7beafef..f20bca9 100644 (file)
@@ -22,6 +22,7 @@ package org.onap.so.bpmn.infrastructure.scripts
 
 import org.camunda.bpm.engine.delegate.BpmnError
 import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.aai.domain.yang.NetworkPolicy
 import org.onap.aai.domain.yang.SliceProfile
 import org.onap.aaiclient.client.aai.AAIResourcesClient
 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
@@ -133,7 +134,7 @@ class DoCreateTnNssiInstance extends AbstractServiceTaskProcessor {
             throw e
         } catch (Exception ex) {
             String msg = "Exception in DoCreateTnNssiInstance.createServiceInstance: " + ex.getMessage()
-            logger.info(msg)
+            logger.error(msg)
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
         }
     }
@@ -163,6 +164,8 @@ class DoCreateTnNssiInstance extends AbstractServiceTaskProcessor {
                 resource.setAllottedResourceName("network_" + execution.getVariable("sliceServiceInstanceName"))
                 getAAIClient().create(allottedResourceUri, resource)
 
+                createNetworkPolicyForAllocatedResource(execution, ssInstanceId, allottedResourceId)
+
                 String linkArrayStr = jsonUtil.getJsonValue(networkStr, "connectionLinks")
                 createLogicalLinksForAllocatedResource(execution, linkArrayStr, ssInstanceId, allottedResourceId)
             }
@@ -170,7 +173,81 @@ class DoCreateTnNssiInstance extends AbstractServiceTaskProcessor {
             throw e
         } catch (Exception ex) {
             String msg = "Exception in DoCreateTnNssiInstance.createAllottedResource: " + ex.getMessage()
-            logger.info(msg)
+            logger.error(msg)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+        }
+    }
+
+    void createNetworkPolicy(DelegateExecution execution, String ssInstanceId, String networkPolicyId) {
+        try {
+
+            String sliceProfileStr = execution.getVariable("sliceProfile")
+            if (sliceProfileStr == null || sliceProfileStr.isEmpty()) {
+                String msg = "ERROR: createNetworkPolicy: sliceProfile is null"
+                logger.error(msg)
+                exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+            }
+
+            NetworkPolicy networkPolicy = new NetworkPolicy();
+            networkPolicy.setNetworkPolicyId(networkPolicyId)
+            networkPolicy.setName("TSCi policy")
+            networkPolicy.setType("SLA")
+            networkPolicy.setNetworkPolicyFqdn(ssInstanceId)
+
+            String latencyStr = jsonUtil.getJsonValue(sliceProfileStr, "latency")
+            if (latencyStr != null && !latencyStr.isEmpty()) {
+                networkPolicy.setLatency(Integer.parseInt(latencyStr))
+            }
+
+            String bwStr = jsonUtil.getJsonValue(sliceProfileStr, "maxBandwidth")
+            if (bwStr != null && !bwStr.isEmpty()) {
+                networkPolicy.setMaxBandwidth(Integer.parseInt(bwStr))
+            } else {
+                log.debug("ERROR: createNetworkPolicy: maxBandwidth is null")
+            }
+
+            //networkPolicy.setReliability(new Object())
+
+            AAIResourceUri networkPolicyUri =
+                    AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkPolicy(networkPolicyId))
+            getAAIClient().create(networkPolicyUri, networkPolicy)
+
+        } catch (BpmnError e) {
+            throw e
+        } catch (Exception ex) {
+            String msg = "Exception in DoCreateSliceServiceInstance.instantiateSliceService. " + ex.getMessage()
+            logger.error(msg)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+        }
+    }
+
+    void createNetworkPolicyForAllocatedResource(DelegateExecution execution,
+                                                 String ssInstanceId,
+                                                 String allottedResourceId) {
+        try {
+            AAIResourceUri allottedResourceUri =
+                    AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
+                            .customer(execution.getVariable("globalSubscriberId"))
+                            .serviceSubscription(execution.getVariable("subscriptionServiceType"))
+                            .serviceInstance(ssInstanceId)
+                            .allottedResource(allottedResourceId))
+
+            if (!getAAIClient().exists(allottedResourceUri)) {
+                logger.info("ERROR: createLogicalLinksForAllocatedResource: allottedResource not exist: uri={}",
+                        allottedResourceUri)
+                return
+            }
+
+            String networkPolicyId = UUID.randomUUID().toString()
+            createNetworkPolicy(execution, ssInstanceId, networkPolicyId)
+
+            tnNssmfUtils.attachNetworkPolicyToAllottedResource(execution, AAI_VERSION, allottedResourceUri, networkPolicyId);
+
+        } catch (BpmnError e) {
+            throw e
+        } catch (Exception ex) {
+            String msg = "Exception in DoCreateSliceServiceInstance.instantiateSliceService. " + ex.getMessage()
+            logger.error(msg)
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
         }
     }
@@ -219,7 +296,7 @@ class DoCreateTnNssiInstance extends AbstractServiceTaskProcessor {
             throw e
         } catch (Exception ex) {
             String msg = "Exception in DoCreateTnNssiInstance.createLogicalLinksForAllocatedResource: " + ex.getMessage()
-            logger.info(msg)
+            logger.error(msg)
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
         }
     }
index 75ef7d3..f3bc47e 100644 (file)
@@ -151,6 +151,7 @@ class DoDeallocateNSSI extends AbstractServiceTaskProcessor
         serviceInfo.setServiceInvariantUuid(serviceInvariantUuid)
         serviceInfo.setServiceUuid(serviceUuid)
         serviceInfo.setNsiId(nsiId)
+        serviceInfo.setNssiId(nssiId)
         serviceInfo.setGlobalSubscriberId(globalSubscriberId)
         serviceInfo.setSubscriptionServiceType(subscriptionServiceType)
         String serviceInfoString = objectMapper.writeValueAsString(serviceInfo)
index e856522..8a276ed 100644 (file)
@@ -321,7 +321,8 @@ class TnAllocateNssi extends AbstractServiceTaskProcessor {
                                 String status,
                                 String progress,
                                 String statusDescription) {
-        String serviceId = execution.getVariable("sliceServiceInstanceId")
+        String serviceId = execution.getVariable("dummyServiceId")
+        String ssInstanceId = execution.getVariable("sliceServiceInstanceId")
         String jobId = execution.getVariable("jobId")
         String nsiId = execution.getVariable("nsiId")
 
@@ -329,6 +330,7 @@ class TnAllocateNssi extends AbstractServiceTaskProcessor {
         roStatus.setServiceId(serviceId)
         roStatus.setOperationId(jobId)
         roStatus.setResourceTemplateUUID(nsiId)
+        roStatus.setResourceInstanceID(ssInstanceId)
         roStatus.setOperType("Allocate")
         roStatus.setProgress(progress)
         roStatus.setStatus(status)
index 869b55b..d97f416 100644 (file)
@@ -118,55 +118,67 @@ class TnNssmfUtils {
         if (execution.getVariable("vnfParamsExistFlag") == true) {
             sdncVNFParamsXml = buildSDNCParamsXml(execution)
         } else {
-            sdncVNFParamsXml = ""
+            sdncVNFParamsXml = buildDefaultVnfInputParams(vnfId)
         }
 
         String sdncRequest =
-                """<sdncadapterworkflow:SDNCAdapterWorkflowRequest xmlns:ns5="http://org.onap/so/request/types/v1"
-                                                                                                       xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1"
-                                                                                                       xmlns:sdncadapter="http://org.onap/workflow/sdnc/adapter/schema/v1">
-          <sdncadapter:RequestHeader>
-                               <sdncadapter:RequestId>${MsoUtils.xmlEscape(uuid)}</sdncadapter:RequestId>
-                               <sdncadapter:SvcInstanceId>${MsoUtils.xmlEscape(svcInstId)}</sdncadapter:SvcInstanceId>
-                               <sdncadapter:SvcAction>${MsoUtils.xmlEscape(svcAction)}</sdncadapter:SvcAction>
-                               <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
-                               <sdncadapter:CallbackUrl>${MsoUtils.xmlEscape(callbackURL)}</sdncadapter:CallbackUrl>
-                               <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
-               </sdncadapter:RequestHeader>
-       <sdncadapterworkflow:SDNCRequestData>
-               <request-information>
-                       <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
-                       <request-action>${MsoUtils.xmlEscape(reqAction)}</request-action>
-                       <source>${MsoUtils.xmlEscape(source)}</source>
-                       <notification-url/>
-                       <order-number/>
-                       <order-version/>
-               </request-information>
-               <service-information>
-                       <service-id>${MsoUtils.xmlEscape(serviceId)}</service-id>
-                       <subscription-service-type>${MsoUtils.xmlEscape(subServiceType)}</subscription-service-type>
-                       ${serviceEcompModelInformation}
-                       <service-instance-id>${MsoUtils.xmlEscape(svcInstId)}</service-instance-id>
-                       <global-customer-id>${MsoUtils.xmlEscape(globalSubscriberId)}</global-customer-id>
-               </service-information>
-               <vnf-information>
-                       <vnf-id>${MsoUtils.xmlEscape(vnfId)}</vnf-id>
-                       <vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
-                       ${vnfEcompModelInformation}
-               </vnf-information>
-               <vnf-request-input>
-                       ${vnfNameString}
-                       <tenant>${MsoUtils.xmlEscape(tenantId)}</tenant>
-                       <aic-cloud-region>${MsoUtils.xmlEscape(cloudSiteId)}</aic-cloud-region>
-                       ${sdncVNFParamsXml}
-               </vnf-request-input>
-       </sdncadapterworkflow:SDNCRequestData>
-       </sdncadapterworkflow:SDNCAdapterWorkflowRequest>"""
+        """<sdncadapterworkflow:SDNCAdapterWorkflowRequest xmlns:ns5="http://org.onap/so/request/types/v1"
+                                                    xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1"
+                                                    xmlns:sdncadapter="http://org.onap/workflow/sdnc/adapter/schema/v1">
+         <sdncadapter:RequestHeader>
+            <sdncadapter:RequestId>${MsoUtils.xmlEscape(uuid)}</sdncadapter:RequestId>
+            <sdncadapter:SvcInstanceId>${MsoUtils.xmlEscape(svcInstId)}</sdncadapter:SvcInstanceId>
+            <sdncadapter:SvcAction>${MsoUtils.xmlEscape(svcAction)}</sdncadapter:SvcAction>
+            <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
+            <sdncadapter:CallbackUrl>${MsoUtils.xmlEscape(callbackURL)}</sdncadapter:CallbackUrl>
+            <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
+         </sdncadapter:RequestHeader>
+    <sdncadapterworkflow:SDNCRequestData>
+        <request-information>
+            <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
+            <request-action>${MsoUtils.xmlEscape(reqAction)}</request-action>
+            <source>${MsoUtils.xmlEscape(source)}</source>
+            <notification-url/>
+            <order-number/>
+            <order-version/>
+        </request-information>
+        <service-information>
+            <service-id>${MsoUtils.xmlEscape(serviceId)}</service-id>
+            <subscription-service-type>${MsoUtils.xmlEscape(subServiceType)}</subscription-service-type>
+            ${serviceEcompModelInformation}
+            <service-instance-id>${MsoUtils.xmlEscape(svcInstId)}</service-instance-id>
+            <global-customer-id>${MsoUtils.xmlEscape(globalSubscriberId)}</global-customer-id>
+        </service-information>
+        <vnf-information>
+            <vnf-id>${MsoUtils.xmlEscape(vnfId)}</vnf-id>
+            <vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
+            ${vnfEcompModelInformation}
+        </vnf-information>
+        <vnf-request-input>
+            ${vnfNameString}
+            <tenant>${MsoUtils.xmlEscape(tenantId)}</tenant>
+            <aic-cloud-region>${MsoUtils.xmlEscape(cloudSiteId)}</aic-cloud-region>
+            ${sdncVNFParamsXml}
+        </vnf-request-input>
+    </sdncadapterworkflow:SDNCRequestData>
+    </sdncadapterworkflow:SDNCAdapterWorkflowRequest>"""
 
         logger.debug("sdncRequest:  " + sdncRequest)
         return sdncRequest
     }
 
+
+    String buildDefaultVnfInputParams(String vnfName) {
+        String res =
+                """<vnf-input-parameters>
+                      <param>
+                          <name>${MsoUtils.xmlEscape(vnfName)}</name>
+                      </param>
+                   </vnf-input-parameters>"""
+
+        return res
+    }
+
     String buildSDNCParamsXml(DelegateExecution execution) {
         String params = ""
         StringBuilder sb = new StringBuilder()
@@ -241,19 +253,19 @@ class TnNssmfUtils {
     }
 
     String getExecutionInputParams(DelegateExecution execution) {
-        String res = "msoRequestId=" + execution.getVariable("msoRequestId") +
-                ", modelInvariantUuid=" + execution.getVariable("modelInvariantUuid") +
-                ", modelUuid=" + execution.getVariable("modelUuid") +
-                ", serviceInstanceID=" + execution.getVariable("serviceInstanceID") +
-                ", operationType=" + execution.getVariable("operationType") +
-                ", globalSubscriberId=" + execution.getVariable("globalSubscriberId") +
-                ", dummyServiceId=" + execution.getVariable("dummyServiceId") +
-                ", nsiId=" + execution.getVariable("nsiId") +
-                ", networkType=" + execution.getVariable("networkType") +
-                ", subscriptionServiceType=" + execution.getVariable("subscriptionServiceType") +
-                ", jobId=" + execution.getVariable("jobId") +
-                ", sliceParams=" + execution.getVariable("sliceParams") +
-                ", servicename=" + execution.getVariable("servicename")
+        String res = "\n msoRequestId=" + execution.getVariable("msoRequestId") +
+                "\n modelInvariantUuid=" + execution.getVariable("modelInvariantUuid") +
+                "\n modelUuid=" + execution.getVariable("modelUuid") +
+                "\n serviceInstanceID=" + execution.getVariable("serviceInstanceID") +
+                "\n operationType=" + execution.getVariable("operationType") +
+                "\n globalSubscriberId=" + execution.getVariable("globalSubscriberId") +
+                "\n dummyServiceId=" + execution.getVariable("dummyServiceId") +
+                "\n nsiId=" + execution.getVariable("nsiId") +
+                "\n networkType=" + execution.getVariable("networkType") +
+                "\n subscriptionServiceType=" + execution.getVariable("subscriptionServiceType") +
+                "\n jobId=" + execution.getVariable("jobId") +
+                "\n sliceParams=" + execution.getVariable("sliceParams") +
+                "\n servicename=" + execution.getVariable("servicename")
 
         return res
     }
@@ -297,7 +309,6 @@ class TnNssmfUtils {
     void attachLogicalLinkToAllottedResource(DelegateExecution execution, String aaiVersion, AAIResourceUri arUri,
                                              String logicalLinkId) {
 
-
         String toLink = "aai/${aaiVersion}/network/logical-links/logical-link/${logicalLinkId}"
 
         Relationship relationship = new Relationship()
@@ -307,4 +318,18 @@ class TnNssmfUtils {
 
         createRelationShipInAAI(execution, arUri, relationship)
     }
+
+    void attachNetworkPolicyToAllottedResource(DelegateExecution execution, String aaiVersion,
+                                               AAIResourceUri aaiResourceUri, String networkPolicyId) {
+
+        String toLink = "aai/${aaiVersion}/network/network-policies/network-policy/${networkPolicyId}"
+
+        Relationship relationship = new Relationship()
+        relationship.setRelatedLink(toLink)
+        relationship.setRelatedTo("network-policy")
+        relationship.setRelationshipLabel("org.onap.relationships.inventory.Uses")
+
+        createRelationShipInAAI(execution, aaiResourceUri, relationship)
+
+    }
 }
index 2aa7da2..f2d4d7c 100644 (file)
@@ -44,7 +44,7 @@ dcsi.createAllottedResource(execution)</bpmn:script>
       <bpmn:incoming>SequenceFlow_0khtova</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1wafqwa</bpmn:outgoing>
       <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
-def dcsi= new CreateSliceService()
+def dcsi = new DoCreateSliceServiceInstance()
 dcsi.prepareDecomposeService(execution)</bpmn:script>
     </bpmn:scriptTask>
     <bpmn:callActivity id="CallActivity_0svmkxh" name="Call Decompose Service" calledElement="DecomposeService">
@@ -135,4 +135,4 @@ dcsi.prepareDecomposeService(execution)</bpmn:script>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
-</bpmn:definitions>
\ No newline at end of file
+</bpmn:definitions>
index 55adbe3..fefa022 100644 (file)
@@ -21,9 +21,9 @@ def dcsi = new DoCreateTnNssiInstance()
 dcsi.createServiceInstance(execution)</bpmn:script>
     </bpmn:scriptTask>
     <bpmn:sequenceFlow id="SequenceFlow_1uiz85h" sourceRef="Activity_16luyg1" targetRef="Event_1rsf7yb" />
-    <bpmn:sequenceFlow id="SequenceFlow_0g5bwvl" sourceRef="instantiate_NSTask" targetRef="Activity_08tw2di" />
+    <bpmn:sequenceFlow id="SequenceFlow_0g5bwvl" sourceRef="instantiate_NSTask" targetRef="ScriptTask_18rzwzb" />
     <bpmn:scriptTask id="ScriptTask_18rzwzb" name="Create Allottedsource in AAI" scriptFormat="groovy">
-      <bpmn:incoming>Flow_106ei42</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0g5bwvl</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_17u69c4</bpmn:outgoing>
       <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def dcsi = new DoCreateTnNssiInstance()
@@ -74,14 +74,6 @@ dcsi.validateSDNCResponse(execution, response, "allocate")</bpmn:script>
       <bpmn:incoming>SequenceFlow_17u69c4</bpmn:incoming>
       <bpmn:linkEventDefinition id="LinkEventDefinition_1skl6p7" name="SdncOperation" />
     </bpmn:intermediateThrowEvent>
-    <bpmn:scriptTask id="Activity_08tw2di" name="create Slice Profile in AAI" scriptFormat="groovy">
-      <bpmn:incoming>SequenceFlow_0g5bwvl</bpmn:incoming>
-      <bpmn:outgoing>Flow_106ei42</bpmn:outgoing>
-      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
-def dcsi = new DoCreateTnNssiInstance()
-dcsi.createSliceProfile(execution)</bpmn:script>
-    </bpmn:scriptTask>
-    <bpmn:sequenceFlow id="Flow_106ei42" sourceRef="Activity_08tw2di" targetRef="ScriptTask_18rzwzb" />
   </bpmn:process>
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
     <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="DoCreateTnNssiInstance">
@@ -98,12 +90,12 @@ dcsi.createSliceProfile(execution)</bpmn:script>
         <di:waypoint x="299" y="375" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_17u69c4_di" bpmnElement="SequenceFlow_17u69c4">
-        <di:waypoint x="930" y="129" />
-        <di:waypoint x="1102" y="129" />
+        <di:waypoint x="830" y="129" />
+        <di:waypoint x="982" y="129" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0g5bwvl_di" bpmnElement="SequenceFlow_0g5bwvl">
-        <di:waypoint x="574" y="129" />
-        <di:waypoint x="650" y="129" />
+        <di:waypoint x="600" y="129" />
+        <di:waypoint x="730" y="129" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1uiz85h_di" bpmnElement="SequenceFlow_1uiz85h">
         <di:waypoint x="840" y="375" />
@@ -113,37 +105,25 @@ dcsi.createSliceProfile(execution)</bpmn:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0khtova_di" bpmnElement="SequenceFlow_0khtova">
-        <di:waypoint x="393" y="129" />
-        <di:waypoint x="474" y="129" />
+        <di:waypoint x="410" y="129" />
+        <di:waypoint x="500" y="129" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="436" y="108" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1qo2pln_di" bpmnElement="SequenceFlow_1qo2pln">
         <di:waypoint x="211" y="129" />
-        <di:waypoint x="251" y="129" />
-        <di:waypoint x="251" y="129" />
-        <di:waypoint x="293" y="129" />
+        <di:waypoint x="310" y="129" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="266" y="123" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="Flow_106ei42_di" bpmnElement="Flow_106ei42">
-        <di:waypoint x="750" y="129" />
-        <di:waypoint x="830" y="129" />
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="allocateTnNssi_StartEvent">
         <dc:Bounds x="175" y="111" width="36" height="36" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="153" y="147" width="86" height="27" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ScriptTask_03j6ogo_di" bpmnElement="PreprocessIncomingRequest_task">
-        <dc:Bounds x="293" y="89" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ScriptTask_1qmmew8_di" bpmnElement="instantiate_NSTask">
-        <dc:Bounds x="474" y="89" width="100" height="80" />
-      </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="Event_0l9vk9p_di" bpmnElement="Event_0l9vk9p">
         <dc:Bounds x="175" y="357" width="36" height="36" />
         <bpmndi:BPMNLabel>
@@ -163,16 +143,19 @@ dcsi.createSliceProfile(execution)</bpmn:script>
         <dc:Bounds x="972" y="357" width="36" height="36" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="Event_1a9swwa_di" bpmnElement="Event_1a9swwa">
-        <dc:Bounds x="1102" y="111" width="36" height="36" />
+        <dc:Bounds x="982" y="111" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1093" y="154" width="59" height="27" />
+          <dc:Bounds x="973" y="154" width="59" height="27" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ScriptTask_18rzwzb_di" bpmnElement="ScriptTask_18rzwzb">
-        <dc:Bounds x="830" y="89" width="100" height="80" />
+        <dc:Bounds x="730" y="89" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="Activity_08tw2di_di" bpmnElement="Activity_08tw2di">
-        <dc:Bounds x="650" y="89" width="100" height="80" />
+      <bpmndi:BPMNShape id="ScriptTask_1qmmew8_di" bpmnElement="instantiate_NSTask">
+        <dc:Bounds x="500" y="89" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_03j6ogo_di" bpmnElement="PreprocessIncomingRequest_task">
+        <dc:Bounds x="310" y="89" width="100" height="80" />
       </bpmndi:BPMNShape>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
index d9ad245..7c4f735 100644 (file)
@@ -30,6 +30,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -1663,8 +1664,11 @@ public class WorkflowAction {
                 execution.setVariable(BBConstants.G_ISTOPLEVELFLOW, northBoundRequest.getIsToplevelflow());
             }
             List<OrchestrationFlow> flows = northBoundRequest.getOrchestrationFlowList();
-            if (flows == null)
+            if (flows == null) {
                 flows = new ArrayList<>();
+            } else {
+                flows.sort(Comparator.comparingInt(OrchestrationFlow::getSequenceNumber));
+            }
             for (OrchestrationFlow flow : flows) {
                 if (!flow.getFlowName().contains("BB") && !flow.getFlowName().contains("Activity")) {
                     List<OrchestrationFlow> macroQueryFlows =
index 53d1bea..50ff074 100644 (file)
@@ -3110,9 +3110,11 @@ public class WorkflowActionTest extends BaseTaskTest {
 
     private List<OrchestrationFlow> createFlowList(String... flowNames) {
         List<OrchestrationFlow> result = new ArrayList<>();
+        int sequenceNumber = 1;
         for (String flowName : flowNames) {
             OrchestrationFlow orchFlow = new OrchestrationFlow();
             orchFlow.setFlowName(flowName);
+            orchFlow.setSequenceNumber(sequenceNumber++);
             result.add(orchFlow);
         }
         return result;
index a44dbd6..e498905 100644 (file)
@@ -44,7 +44,7 @@ public class NssmfAdapterNBIRequest implements Serializable {
 
     private DeAllocateNssi deAllocateNssi;
 
-    private String subnetCapabilityQuery;
+    private Object subnetCapabilityQuery;
 
     private String responseId;
 }
index 8ea0eb6..e97aa70 100644 (file)
@@ -48,23 +48,23 @@ public class SliceTaskParamsAdapter implements Serializable {
 
     private String nstName;
 
-    private Map<String, Object> serviceProfile;
+    private Map<String, Object> serviceProfile = new HashMap<>();
 
     private String suggestNsiId;
 
     private String suggestNsiName;
 
-    private TemplateInfo NSTInfo;
+    private TemplateInfo NSTInfo = new TemplateInfo();
 
-    private SliceTaskInfo<TnSliceProfile> tnBHSliceTaskInfo;
+    private SliceTaskInfo<TnSliceProfile> tnBHSliceTaskInfo = new SliceTaskInfo<>();
 
-    private SliceTaskInfo<TnSliceProfile> tnMHSliceTaskInfo;
+    private SliceTaskInfo<TnSliceProfile> tnMHSliceTaskInfo = new SliceTaskInfo<>();
 
-    private SliceTaskInfo<TnSliceProfile> tnFHSliceTaskInfo;
+    private SliceTaskInfo<TnSliceProfile> tnFHSliceTaskInfo = new SliceTaskInfo<>();
 
-    private SliceTaskInfo<CnSliceProfile> cnSliceTaskInfo;
+    private SliceTaskInfo<CnSliceProfile> cnSliceTaskInfo = new SliceTaskInfo<>();
 
-    private SliceTaskInfo<AnSliceProfile> anSliceTaskInfo;
+    private SliceTaskInfo<AnSliceProfile> anSliceTaskInfo = new SliceTaskInfo<>();
 
     @SuppressWarnings("unchecked")
     public void convertFromJson(String jsonString) throws IOException {
@@ -226,6 +226,10 @@ public class SliceTaskParamsAdapter implements Serializable {
      */
     private <T> Map<String, Object> bean2Map(T t) {
         Map<String, Object> resMap = new HashMap<>();
+        if (t == null) {
+            return resMap;
+        }
+
         try {
             Field[] fields = t.getClass().getDeclaredFields();
             for (Field field : fields) {
index 6c2c76e..b17b1fe 100644 (file)
@@ -38,15 +38,18 @@ public class HttpClientConnectionConfiguration {
     @Value(value = "${rest.http.client.configuration.socketTimeOutInSec:180}")
     private int socketTimeOutInSeconds;
 
-    @Value(value = "${rest.http.client.configuration.socketTimeOutInSec:600}")
+    @Value(value = "${rest.http.client.configuration.timeToLiveInSeconds:600}")
     private int timeToLiveInSeconds;
 
-    @Value(value = "${rest.http.client.configuration.maxConnections:10}")
+    @Value(value = "${rest.http.client.configuration.maxConnections:100}")
     private int maxConnections;
 
-    @Value(value = "${rest.http.client.configuration.maxConnectionsPerRoute:2}")
+    @Value(value = "${rest.http.client.configuration.maxConnectionsPerRoute:20}")
     private int maxConnectionsPerRoute;
 
+    @Value(value = "${rest.http.client.configuration.evictIdleConnectionsTimeInSec:5}")
+    private int evictIdleConnectionsTimeInSec;
+
     /**
      * @return the socket connection time out in milliseconds
      */
@@ -82,4 +85,8 @@ public class HttpClientConnectionConfiguration {
         return (int) TimeUnit.SECONDS.toMinutes(timeToLiveInSeconds);
     }
 
+    public long getEvictIdleConnectionsTimeInSec() {
+        return evictIdleConnectionsTimeInSec;
+    }
+
 }
index 882ed95..aef2ed1 100644 (file)
@@ -22,6 +22,7 @@ package org.onap.so.configuration.rest;
 
 import java.util.concurrent.TimeUnit;
 import org.apache.http.client.config.RequestConfig;
+import org.apache.http.impl.NoConnectionReuseStrategy;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
@@ -55,7 +56,10 @@ public class HttpComponentsClientConfiguration {
         return HttpClientBuilder.create().setConnectionManager(poolingHttpClientConnectionManager())
                 .setMaxConnPerRoute(clientConnectionConfiguration.getMaxConnectionsPerRoute())
                 .setMaxConnTotal(clientConnectionConfiguration.getMaxConnections())
-                .setDefaultRequestConfig(requestConfig()).build();
+                .setDefaultRequestConfig(requestConfig()).setConnectionReuseStrategy(NoConnectionReuseStrategy.INSTANCE)
+                .evictExpiredConnections().evictIdleConnections(
+                        clientConnectionConfiguration.getEvictIdleConnectionsTimeInSec(), TimeUnit.SECONDS)
+                .build();
     }
 
     @Bean
diff --git a/releases/1.7.6-nslcm-adapter.yaml b/releases/1.7.6-nslcm-adapter.yaml
new file mode 100644 (file)
index 0000000..0f78b9f
--- /dev/null
@@ -0,0 +1,9 @@
+---
+distribution_type: 'container'
+container_release_tag: '1.7.7'
+project: 'so'
+log_dir: 'so-maven-docker-stage-master/510/'
+ref: '1757b2f9727591fd5907f43834dbe9f0b8261740'
+containers:
+    - name: 'so/so-etsi-nfvo-ns-lcm'
+      version: '1.7.6-20201102T0420'
\ No newline at end of file
diff --git a/releases/1.7.7.yaml b/releases/1.7.7.yaml
new file mode 100644 (file)
index 0000000..d19c974
--- /dev/null
@@ -0,0 +1,33 @@
+---
+distribution_type: 'container'
+container_release_tag: '1.7.7'
+project: 'so'
+log_dir: 'so-maven-docker-stage-master/504/'
+ref: 'deb4f1d1292d661b08f8969a117b7b979551158a'
+containers:
+    - name: 'so/vnfm-adapter'
+      version: '1.7.6-20201027T1345'
+    - name: 'so/catalog-db-adapter'
+      version: '1.7.6-20201027T1345'
+    - name: 'so/request-db-adapter'
+      version: '1.7.6-20201027T1345'
+    - name: 'so/openstack-adapter'
+      version: '1.7.6-20201027T1345'
+    - name: 'so/sdnc-adapter'
+      version: '1.7.6-20201027T1345'
+    - name: 'so/vfc-adapter'
+      version: '1.7.6-20201027T1345'
+    - name: 'so/sdc-controller'
+      version: '1.7.6-20201027T1345'
+    - name: 'so/bpmn-infra'
+      version: '1.7.6-20201027T1345'
+    - name: 'so/so-monitoring'
+      version: '1.7.6-20201027T1345'
+    - name: 'so/api-handler-infra'
+      version: '1.7.6-20201027T1345'
+    - name: 'so/nssmf-adapter'
+      version: '1.7.6-20201027T1345'
+    - name: 'so/mso-cnf-adapter'
+      version: '1.7.6-20201027T1345'
+    - name: 'so/so-oof-adapter'
+      version: '1.7.6-20201027T1345'
\ No newline at end of file
index d8d62d9..80e50be 100644 (file)
@@ -1,7 +1,11 @@
 package org.onap.so.simulator.actions.aai;
 
+import java.util.Optional;
 import org.onap.aai.domain.yang.Vnfc;
+import org.onap.aai.domain.yang.Vserver;
+import org.onap.aai.domain.yang.Vservers;
 import org.onap.aaiclient.client.aai.AAIResourcesClient;
+import org.onap.aaiclient.client.aai.entities.uri.AAIPluralResourceUri;
 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri;
 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory;
 import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder;
@@ -58,6 +62,26 @@ public class ProcessVnfc extends AbstractTestAction {
                         .genericVnf(context.getVariable("vnfId")).vfModule(context.getVariable("vfModuleId")));
                 logger.debug("creating VNFC edge to vf module");
                 aaiResourceClient.connect(vfModuleURI, vnfcURI);
+            } else if (context.getVariable("requestAction").equals("CreateVfModuleInstance")
+                    && context.getVariable("serviceAction").equals("activate")) {
+                logger.debug("creating edge between vserver and vnfc");
+                AAIResourceUri vnfcURI =
+                        AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().vnfc("ssc_server_1"));
+                AAIPluralResourceUri vserverPlural =
+                        AAIUriFactory
+                                .createResourceUri(AAIFluentTypeBuilder.cloudInfrastructure()
+                                        .cloudRegion(context.getVariable("cloudOwner"),
+                                                context.getVariable("cloudRegion"))
+                                        .tenant(context.getVariable("tenant")).vservers())
+                                .queryParam("vserver-name", "ssc_server_1");
+                Optional<Vserver> vserver = aaiResourceClient.getFirst(Vservers.class, Vserver.class, vserverPlural);
+                if (vserver.isPresent()) {
+                    AAIResourceUri vserverURI =
+                            AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.cloudInfrastructure()
+                                    .cloudRegion(context.getVariable("cloudOwner"), context.getVariable("cloudRegion"))
+                                    .tenant(context.getVariable("tenant")).vserver(vserver.get().getVserverId()));
+                    aaiResourceClient.connect(vserverURI, vnfcURI);
+                }
             }
 
         } catch (Exception e) {
index ae46bac..10c9593 100644 (file)
@@ -4,7 +4,7 @@
 
 major=1
 minor=7
-patch=5
+patch=6
 
 base_version=${major}.${minor}.${patch}