2  * ============LICENSE_START=======================================================
 
   3  *  Copyright (C) 2019 Nordix Foundation.
 
   4  * ================================================================================
 
   5  * Licensed under the Apache License, Version 2.0 (the "License");
 
   6  * you may not use this file except in compliance with the License.
 
   7  * You may obtain a copy of the License at
 
   9  *      http://www.apache.org/licenses/LICENSE-2.0
 
  11  * Unless required by applicable law or agreed to in writing, software
 
  12  * distributed under the License is distributed on an "AS IS" BASIS,
 
  13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  14  * See the License for the specific language governing permissions and
 
  15  * limitations under the License.
 
  17  * SPDX-License-Identifier: Apache-2.0
 
  18  * ============LICENSE_END=========================================================
 
  21 package org.onap.so.adapters.vnfmadapter.jobmanagement;
 
  23 import static org.slf4j.LoggerFactory.getLogger;
 
  24 import com.google.common.base.Optional;
 
  25 import com.google.common.collect.Maps;
 
  27 import java.util.UUID;
 
  28 import org.onap.so.adapters.vnfmadapter.extclients.aai.AaiServiceProvider;
 
  29 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.VnfmServiceProvider;
 
  30 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse200;
 
  31 import org.onap.so.adapters.vnfmadapter.rest.exceptions.JobNotFoundException;
 
  32 import org.onap.vnfmadapter.v1.model.OperationEnum;
 
  33 import org.onap.vnfmadapter.v1.model.OperationStateEnum;
 
  34 import org.onap.vnfmadapter.v1.model.OperationStatusRetrievalStatusEnum;
 
  35 import org.onap.vnfmadapter.v1.model.QueryJobResponse;
 
  36 import org.slf4j.Logger;
 
  37 import org.springframework.beans.factory.annotation.Autowired;
 
  38 import org.springframework.stereotype.Component;
 
  41  * Manages jobs enabling the status of jobs to be queried. A job is associated with an operation on a VNFM.
 
  44 public class JobManager {
 
  45     private static final String SEPARATOR = "_";
 
  46     private static Logger logger = getLogger(JobManager.class);
 
  47     private final Map<String, VnfmOperation> mapOfJobIdToVnfmOperation = Maps.newConcurrentMap();
 
  48     private final VnfmServiceProvider vnfmServiceProvider;
 
  49     private final AaiServiceProvider aaiServiceProvider;
 
  52     JobManager(final VnfmServiceProvider vnfmServiceProvider, final AaiServiceProvider aaiServiceProvider) {
 
  53         this.vnfmServiceProvider = vnfmServiceProvider;
 
  54         this.aaiServiceProvider = aaiServiceProvider;
 
  58      * Create a job associated with an operation on a VNFM.
 
  60      * @param vnfmId the VNFM the operation relates to
 
  61      * @param operationId the ID of the associated VNFM operation
 
  62      * @param waitForNotificationForSuccess if set to <code>true</code> the {@link QueryJobResponse#getOperationState()}
 
  63      *        shall not return {@link org.onap.vnfmadapter.v1.model.OperationStateEnum#COMPLETED} unless a required
 
  64      *        notification has been processed
 
  65      * @return the ID of the job. Can be used to query the job using {@link #getVnfmOperation(String)}
 
  67     public String createJob(final String vnfmId, final String operationId,
 
  68             final boolean waitForNotificationForSuccess) {
 
  69         final String jobId = vnfmId + SEPARATOR + UUID.randomUUID().toString();
 
  70         final VnfmOperation vnfmOperation = new VnfmOperation(vnfmId, operationId, waitForNotificationForSuccess);
 
  71         mapOfJobIdToVnfmOperation.put(jobId, vnfmOperation);
 
  76      * Get the operation, associated with the given job ID, from the VNFM.
 
  78      * @param jobId the job ID
 
  79      * @return the associated operation from the VNFM, or <code>null</code> of no operation is associated with the given
 
  82     public QueryJobResponse getVnfmOperation(final String jobId) {
 
  83         final VnfmOperation vnfmOperation = mapOfJobIdToVnfmOperation.get(jobId);
 
  84         final QueryJobResponse response = new QueryJobResponse();
 
  86         if (vnfmOperation == null) {
 
  87             throw new JobNotFoundException("No job found with ID: " + jobId);
 
  90         if (vnfmOperation.isVnfDeleted()) {
 
  91             response.setOperationStatusRetrievalStatus(OperationStatusRetrievalStatusEnum.STATUS_FOUND);
 
  92             return response.operationState(getOperationState(vnfmOperation, null));
 
  96             final Optional<InlineResponse200> operationOptional = vnfmServiceProvider.getOperation(
 
  97                     aaiServiceProvider.invokeGetVnfm(vnfmOperation.getVnfmId()), vnfmOperation.getOperationId());
 
  99             if (!operationOptional.isPresent()) {
 
 100                 return response.operationStatusRetrievalStatus(OperationStatusRetrievalStatusEnum.OPERATION_NOT_FOUND);
 
 102             final InlineResponse200 operation = operationOptional.get();
 
 104             logger.debug("Job Id: {} operationId: {} operation details: {} ", jobId, operation.getId(), operation);
 
 106             if (operation.getOperationState() == null) {
 
 107                 return response.operationStatusRetrievalStatus(OperationStatusRetrievalStatusEnum.WAITING_FOR_STATUS);
 
 110             response.setOperationStatusRetrievalStatus(OperationStatusRetrievalStatusEnum.STATUS_FOUND);
 
 111             response.setId(operation.getId());
 
 112             response.setOperation(OperationEnum.fromValue(operation.getOperation().getValue()));
 
 113             response.setOperationState(getOperationState(vnfmOperation, operation));
 
 114             response.setStartTime(operation.getStartTime());
 
 115             response.setStateEnteredTime(operation.getStateEnteredTime());
 
 116             response.setVnfInstanceId(operation.getVnfInstanceId());
 
 119         } catch (final Exception exception) {
 
 120             logger.error("Exception encountered trying to get operation status for operation id "
 
 121                     + vnfmOperation.getOperationId(), exception);
 
 122             return response.operationStatusRetrievalStatus(OperationStatusRetrievalStatusEnum.WAITING_FOR_STATUS);
 
 126     private OperationStateEnum getOperationState(final VnfmOperation vnfmOperation,
 
 127             final InlineResponse200 operationResponse) {
 
 128         switch (vnfmOperation.getNotificationStatus()) {
 
 129             case NOTIFICATION_PROCESSING_PENDING:
 
 130                 return org.onap.vnfmadapter.v1.model.OperationStateEnum.PROCESSING;
 
 131             case NOTIFICATION_PROCEESING_SUCCESSFUL:
 
 132                 return org.onap.vnfmadapter.v1.model.OperationStateEnum.COMPLETED;
 
 133             case NOTIFICATION_PROCESSING_FAILED:
 
 134                 return org.onap.vnfmadapter.v1.model.OperationStateEnum.FAILED;
 
 136                 if (operationResponse == null || operationResponse.getOperationState() == null)
 
 138                 return OperationStateEnum.fromValue(operationResponse.getOperationState().getValue());
 
 142     public void notificationProcessedForOperation(final String operationId,
 
 143             final boolean notificationProcessingWasSuccessful) {
 
 144         logger.debug("Notification processed for operation ID {} success?: {}", operationId,
 
 145                 notificationProcessingWasSuccessful);
 
 146         final java.util.Optional<VnfmOperation> relatedOperation = mapOfJobIdToVnfmOperation.values().stream()
 
 147                 .filter(operation -> operation.getOperationId().equals(operationId)).findFirst();
 
 148         if (relatedOperation.isPresent()) {
 
 149             relatedOperation.get().setNotificationProcessed(notificationProcessingWasSuccessful);
 
 151             logger.debug("No operation found for operation ID {} ", operationId);
 
 156     public void vnfDeleted(final String operationId) {
 
 157         logger.debug("VNF deleyed for operation ID {}", operationId);
 
 158         final java.util.Optional<VnfmOperation> relatedOperation = mapOfJobIdToVnfmOperation.values().stream()
 
 159                 .filter(operation -> operation.getOperationId().equals(operationId)).findFirst();
 
 160         if (relatedOperation.isPresent()) {
 
 161             relatedOperation.get().setVnfDeleted();
 
 163             logger.debug("No operation found for operation ID {} ", operationId);