Merge from ECOMP's repository
[vid.git] / vid-app-common / src / main / java / org / onap / vid / job / command / ServiceInProgressStatusCommand.java
1 package org.onap.vid.job.command;
2
3 import org.apache.commons.collections.MapUtils;
4 import org.onap.vid.job.Job;
5 import org.onap.vid.job.Job.JobStatus;
6 import org.onap.vid.job.JobCommand;
7 import org.onap.vid.job.JobType;
8 import org.onap.vid.job.NextCommand;
9 import org.onap.vid.job.command.CommandParentData.CommandDataKey;
10 import org.onap.vid.job.impl.JobSharedData;
11 import org.onap.vid.model.serviceInstantiation.ServiceInstantiation;
12 import org.onap.vid.properties.Features;
13 import org.springframework.beans.factory.config.ConfigurableBeanFactory;
14 import org.springframework.context.annotation.Scope;
15 import org.springframework.stereotype.Component;
16
17 import java.util.List;
18 import java.util.Map;
19 import java.util.stream.Collectors;
20 import java.util.stream.Stream;
21
22 @Component
23 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
24 public class ServiceInProgressStatusCommand extends BaseInProgressStatusCommand {
25
26     public ServiceInProgressStatusCommand() {
27     }
28
29     ServiceInProgressStatusCommand(JobSharedData sharedData, MsoResourceIds msoResourceIds) {
30         init(sharedData, msoResourceIds.getRequestId(), msoResourceIds.getInstanceId());
31     }
32
33     @Override
34     protected ExpiryChecker getExpiryChecker() {
35         return new ServiceExpiryChecker();
36     }
37
38     protected NextCommand processJobStatus(Job.JobStatus jobStatus) {
39         JobCommand jobCommand = this;
40         Job.JobStatus nextJobStatus = jobStatus;
41         switch (jobStatus) {
42             case FAILED:
43                 asyncInstantiationBL.handleFailedInstantiation(getSharedData().getJobUuid());
44                 return new NextCommand(nextJobStatus, jobCommand);
45             case PAUSE:
46                 nextJobStatus = Job.JobStatus.IN_PROGRESS;
47                 break;
48             case COMPLETED:
49                 ServiceInstantiation request = (ServiceInstantiation) getSharedData().getRequest();
50                 if (isNeedToCreateChildJobs(request)) {
51                     List<String> childrenJobs = getChildJobs(request);
52                     nextJobStatus = Job.JobStatus.IN_PROGRESS;
53                     jobCommand = new WatchingCommand(getSharedData(), childrenJobs, true);
54                     return new NextCommand(nextJobStatus, jobCommand);
55                 }
56                 break;
57                 default: // for sonar
58         }
59         asyncInstantiationBL.updateServiceInfoAndAuditStatus(getSharedData().getJobUuid(), jobStatus);
60         return new NextCommand(nextJobStatus, jobCommand);
61     }
62
63     private List<String> getChildJobs(ServiceInstantiation request) {
64         Map<String, Object> dataForChild = buildDataForChild(request);
65
66         Stream<String> vnfJobs = request.getVnfs().values().stream().map(
67                 vnf -> jobsBrokerService.add(
68                         jobAdapter.createChildJob(JobType.VnfInstantiation, JobStatus.CREATING , vnf, getSharedData(), dataForChild)).toString()
69         );
70
71         Stream<String> networkJobs = request.getNetworks().values().stream().map(
72                 network -> jobsBrokerService.add(
73                         jobAdapter.createChildJob(JobType.NetworkInstantiation, JobStatus.CREATING , network, getSharedData(), dataForChild)).toString()
74         );
75
76         Stream<String> instanceGroupJobs = request.getVnfGroups().values().stream().map(
77                 instanceGroup -> jobsBrokerService.add(
78                         jobAdapter.createChildJob(JobType.InstanceGroupInstantiation, JobStatus.CREATING , instanceGroup, getSharedData(), dataForChild)).toString()
79         );
80
81         return Stream.of(vnfJobs, networkJobs, instanceGroupJobs)
82                 .reduce(Stream::concat)
83                 .orElseGet(Stream::empty)
84                 .collect(Collectors.toList());
85     }
86
87     public boolean isNeedToCreateChildJobs(ServiceInstantiation request) {
88         return featureManager.isActive(Features.FLAG_ASYNC_ALACARTE_VNF) && request.isALaCarte() &&
89                     (
90                             MapUtils.isNotEmpty(request.getVnfs()) || MapUtils.isNotEmpty(request.getNetworks()) ||
91                             (featureManager.isActive(Features.FLAG_1902_VNF_GROUPING) && MapUtils.isNotEmpty(request.getVnfGroups()))
92                     );
93     }
94
95     protected Map<String, Object> buildDataForChild(ServiceInstantiation request) {
96         commandParentData.addInstanceId(CommandDataKey.SERVICE_INSTANCE_ID, this.instanceId);
97         commandParentData.addModelInfo(CommandDataKey.SERVICE_MODEL_INFO, request.getModelInfo());
98         return commandParentData.getParentData();
99     }
100 }