2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  # Copyright (c) 2020, CMCC Technologies Co., Ltd.
 
   7  # Licensed under the Apache License, Version 2.0 (the "License")
 
   8  # you may not use this file except in compliance with the License.
 
   9  # You may obtain a copy of the License at
 
  11  #       http://www.apache.org/licenses/LICENSE-2.0
 
  13  # Unless required by applicable law or agreed to in writing, software
 
  14  # distributed under the License is distributed on an "AS IS" BASIS,
 
  15  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  16  # See the License for the specific language governing permissions and
 
  17  # limitations under the License.
 
  18  * ============LICENSE_END=========================================================
 
  21 package org.onap.so.adapters.nssmf.manager.impl;
 
  23 import com.fasterxml.jackson.core.JsonProcessingException;
 
  24 import com.fasterxml.jackson.core.type.TypeReference;
 
  25 import com.fasterxml.jackson.databind.ObjectMapper;
 
  26 import org.apache.http.Header;
 
  27 import org.apache.http.HttpStatus;
 
  28 import org.apache.http.message.BasicHeader;
 
  29 import org.onap.aai.domain.yang.ServiceInstance;
 
  30 import org.onap.so.adapters.nssmf.entity.NssmfInfo;
 
  31 import org.onap.so.adapters.nssmf.entity.RestResponse;
 
  32 import org.onap.so.adapters.nssmf.enums.ActionType;
 
  33 import org.onap.so.adapters.nssmf.enums.JobStatus;
 
  34 import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
 
  35 import org.onap.so.adapters.nssmf.util.NssmfAdapterUtil;
 
  36 import org.onap.so.beans.nsmf.*;
 
  37 import org.onap.so.db.request.beans.ResourceOperationStatus;
 
  38 import org.slf4j.Logger;
 
  39 import org.slf4j.LoggerFactory;
 
  40 import java.io.InputStream;
 
  41 import java.util.HashMap;
 
  42 import java.util.List;
 
  44 import static java.lang.String.valueOf;
 
  45 import static org.onap.so.adapters.nssmf.enums.JobStatus.*;
 
  46 import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.StatusDesc.QUERY_JOB_STATUS_FAILED;
 
  47 import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.StatusDesc.QUERY_JOB_STATUS_SUCCESS;
 
  48 import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.marshal;
 
  49 import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.unMarshal;
 
  51 public abstract class ExternalNssmfManager extends BaseNssmfManager {
 
  53     private static final Logger logger = LoggerFactory.getLogger(ExternalNssmfManager.class);
 
  56     protected String wrapAllocateReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
 
  57         return doWrapExtAllocateReqBody(nbiRequest);
 
  60     protected abstract String doWrapExtAllocateReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException;
 
  63     protected String wrapModifyReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
 
  64         return doWrapModifyReqBody(nbiRequest);
 
  67     protected abstract String doWrapModifyReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException;
 
  70     protected String wrapDeAllocateReqBody(DeAllocateNssi deAllocateNssi) throws ApplicationException {
 
  71         return doWrapDeAllocateReqBody(deAllocateNssi);
 
  74     protected abstract String doWrapDeAllocateReqBody(DeAllocateNssi deAllocateNssi) throws ApplicationException;
 
  77     protected void afterQueryJobStatus(ResourceOperationStatus status) {
 
  78         logger.info("afterQueryJobStatus = " + status);
 
  79         if (Integer.parseInt(status.getProgress()) == 100) {
 
  80             logger.info("after query finished = " + status);
 
  81             ActionType jobOperType = ActionType.valueOf(status.getOperType());
 
  83             if (ActionType.ALLOCATE.equals(jobOperType)) {
 
  84                 ServiceInstance nssiInstance = restUtil.getServiceInstance(serviceInfo);
 
  85                 if (nssiInstance == null) {
 
  86                     nssiInstance = new ServiceInstance();
 
  89                 nssiInstance.setServiceInstanceId(serviceInfo.getNssiId());
 
  90                 nssiInstance.setServiceInstanceName(serviceInfo.getNssiName());
 
  91                 nssiInstance.setServiceType(serviceInfo.getSST());
 
  93                 nssiInstance.setOrchestrationStatus(initStatus);
 
  94                 nssiInstance.setModelInvariantId(serviceInfo.getServiceInvariantUuid());
 
  95                 nssiInstance.setModelVersionId(serviceInfo.getServiceUuid());
 
  96                 nssiInstance.setServiceInstanceLocationId(serviceInfo.getPLMNIdList());
 
  97                 nssiInstance.setEnvironmentContext(esrInfo.getNetworkType().getNetworkType());
 
  98                 nssiInstance.setServiceRole("nssi");
 
 100                 restUtil.createServiceInstance(nssiInstance, serviceInfo);
 
 101             } else if (ActionType.DEALLOCATE.equals(jobOperType)) {
 
 102                 restUtil.deleteServiceInstance(serviceInfo);
 
 108     protected String wrapActDeActReqBody(ActDeActNssi actDeActNssi) throws ApplicationException {
 
 109         return marshal(actDeActNssi);
 
 113     protected RestResponse doQueryJobStatus(ResourceOperationStatus status) throws ApplicationException {
 
 114         return doResponseStatus(status);
 
 117     private RestResponse doResponseStatus(ResourceOperationStatus status) throws ApplicationException {
 
 118         RestResponse restResponse = sendRequest(null);
 
 119         JobStatusResponse jobStatusResponse = unMarshal(restResponse.getResponseContent(), JobStatusResponse.class);
 
 121         ResponseDescriptor rspDesc = jobStatusResponse.getResponseDescriptor();
 
 123         logger.info("status = {}", status);
 
 124         rspDesc.setNssiId(status.getResourceInstanceID());
 
 126         jobStatusResponse.setResponseDescriptor(rspDesc);
 
 127         restResponse.setResponseContent(marshal(jobStatusResponse));
 
 128         updateRequestDbJobStatus(rspDesc, status, restResponse);
 
 133     protected String wrapReqBody(Object object) throws ApplicationException {
 
 134         return marshal(object);
 
 138     protected RestResponse sendRequest(String content) throws ApplicationException {
 
 139         return sendExternalRequest(content);
 
 143     protected String getApiVersion() {
 
 149     protected RestResponse sendExternalRequest(String content) throws ApplicationException {
 
 150         NssmfInfo nssmfInfo = restUtil.getNssmfHost(esrInfo);
 
 151         Header header = new BasicHeader("X-Auth-Token", restUtil.getToken(nssmfInfo));
 
 152         String nssmfUrl = nssmfInfo.getUrl() + this.nssmfUrl;
 
 153         return restUtil.send(nssmfUrl, this.httpMethod, content, header);
 
 156     protected void updateRequestDbJobStatus(ResponseDescriptor rspDesc, ResourceOperationStatus status,
 
 157             RestResponse rsp) throws ApplicationException {
 
 158         status.setProgress(Integer.toString(rspDesc.getProgress()));
 
 159         switch (fromString(rspDesc.getStatus())) {
 
 161                 updateDbStatus(status, rsp.getStatus(), STARTED, QUERY_JOB_STATUS_SUCCESS);
 
 164                 updateDbStatus(status, rsp.getStatus(), PROCESSING, QUERY_JOB_STATUS_SUCCESS);
 
 167                 if (rspDesc.getProgress() == 100) {
 
 168                     updateDbStatus(status, rsp.getStatus(), FINISHED, QUERY_JOB_STATUS_SUCCESS);
 
 172                 updateDbStatus(status, rsp.getStatus(), ERROR, QUERY_JOB_STATUS_FAILED);
 
 173                 throw new ApplicationException(500, QUERY_JOB_STATUS_FAILED);
 
 175                 throw new ApplicationException(500, QUERY_JOB_STATUS_FAILED);
 
 179     protected void updateDbStatus(ResourceOperationStatus status, int rspStatus, JobStatus jobStatus,
 
 180             String description) {
 
 181         status.setErrorCode(valueOf(rspStatus));
 
 182         status.setStatus(jobStatus.toString());
 
 183         status.setStatusDescription(description);
 
 184         repository.save(status);
 
 188     protected RestResponse doQuerySubnetCapability(QuerySubnetCapability req) throws ApplicationException {
 
 190         ObjectMapper oMapper = new ObjectMapper();
 
 191         InputStream inputStream = TypeReference.class.getResourceAsStream("/subnetCapability.json");
 
 192         Map subnetCapability = new HashMap<>();
 
 194             subnetCapability = oMapper.readValue(inputStream, Map.class);
 
 195         } catch (Exception e) {
 
 196             logger.debug("Exception while reading subnet capability value from json", e);
 
 198         Map<String, Object> responseMap = new HashMap<>();
 
 199         List<String> subnetTypes = req.getSubnetTypes();
 
 200         for (String value : subnetTypes) {
 
 201             if (subnetCapability.containsKey(value)) {
 
 202                 responseMap.put(value, subnetCapability.get(value));
 
 205         String response = null;
 
 207             response = oMapper.writeValueAsString(responseMap);
 
 208         } catch (JsonProcessingException e) {
 
 209             logger.debug("Exception while converting subnet capability object to String {}", e.getMessage());
 
 212         RestResponse rsp = new RestResponse();
 
 213         rsp.setStatus(HttpStatus.SC_OK);
 
 214         rsp.setResponseContent(response);
 
 219      * after request, if response code is 2XX, continue handle, else return
 
 222     protected void afterRequest() throws ApplicationException {
 
 223         if (valueOf(restResponse.getStatus()).startsWith("2")) {
 
 229     protected void doAfterRequest() throws ApplicationException {
 
 231         NssiResponse response = unMarshal(restResponse.getResponseContent(), NssiResponse.class);
 
 232         ResourceOperationStatus status =
 
 233                 new ResourceOperationStatus(serviceInfo.getNsiId(), response.getJobId(), serviceInfo.getServiceUuid());
 
 234         status.setResourceInstanceID(response.getNssiId());
 
 235         status.setOperType(actionType.toString());
 
 236         status.setProgress("0");
 
 238         updateDbStatus(status, restResponse.getStatus(), STARTED, NssmfAdapterUtil.getStatusDesc(actionType));