1 package org.onap.vid.services;
3 import org.apache.commons.lang3.tuple.ImmutablePair;
4 import org.apache.commons.lang3.tuple.Pair;
5 import org.hibernate.NonUniqueObjectException;
6 import org.json.JSONObject;
7 import org.json.simple.JSONArray;
8 import org.json.simple.parser.JSONParser;
9 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
10 import org.onap.portalsdk.core.service.DataAccessService;
11 import org.onap.portalsdk.core.util.SystemProperties;
12 import org.onap.vid.changeManagement.*;
13 import org.onap.vid.exceptions.NotFoundException;
14 import org.onap.vid.model.VNFDao;
15 import org.onap.vid.model.VidWorkflow;
16 import org.onap.vid.mso.MsoBusinessLogic;
17 import org.onap.vid.mso.MsoResponseWrapperInterface;
18 import org.onap.vid.mso.rest.Request;
19 import org.onap.vid.scheduler.SchedulerProperties;
20 import org.onap.vid.scheduler.SchedulerRestInterfaceIfc;
21 import org.springframework.beans.factory.annotation.Autowired;
22 import org.springframework.http.HttpStatus;
23 import org.springframework.http.ResponseEntity;
24 import org.springframework.stereotype.Service;
25 import org.springframework.util.StringUtils;
26 import org.springframework.web.multipart.MultipartFile;
28 import javax.ws.rs.BadRequestException;
29 import java.io.IOException;
31 import java.util.stream.Collectors;
35 public class ChangeManagementServiceImpl implements ChangeManagementService {
37 private final static String PRIMARY_KEY = "payload";
38 private final static Set<String> REQUIRED_KEYS = new HashSet<>(Arrays.asList("request-parameters", "configuration-parameters"));
39 private final DataAccessService dataAccessService;
40 private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ChangeManagementServiceImpl.class);
41 private MsoBusinessLogic msoBusinessLogic;
42 private final SchedulerRestInterfaceIfc restClient;
45 private CsvService csvService;
48 public ChangeManagementServiceImpl(DataAccessService dataAccessService, MsoBusinessLogic msoBusinessLogic, SchedulerRestInterfaceIfc schedulerRestInterface) {
49 this.dataAccessService = dataAccessService;
50 this.msoBusinessLogic = msoBusinessLogic;
51 this.restClient = schedulerRestInterface;
55 public Collection<Request> getMSOChangeManagements() {
56 Collection<Request> result = null;
57 return msoBusinessLogic.getOrchestrationRequestsForDashboard();
60 protected RequestDetails findRequestByVnfName(List<RequestDetails> requests, String vnfName) {
65 for (RequestDetails requestDetails : requests) {
66 if (requestDetails.getVnfName().equals(vnfName)) {
67 return requestDetails;
75 public ResponseEntity<String> doChangeManagement(ChangeManagementRequest request, String vnfName) {
78 ResponseEntity<String> response;
79 RequestDetails currentRequestDetails = findRequestByVnfName(request.getRequestDetails(), vnfName);
80 MsoResponseWrapperInterface msoResponseWrapperObject = null;
81 if (currentRequestDetails != null) {
83 String serviceInstanceId = extractServiceInstanceId(currentRequestDetails, request.getRequestType());
84 String vnfInstanceId = extractVnfInstanceId(currentRequestDetails, request.getRequestType());
85 String requestType = request.getRequestType();
87 switch (requestType.toLowerCase()) {
88 case ChangeManagementRequest.UPDATE: {
89 msoResponseWrapperObject = msoBusinessLogic.updateVnf(currentRequestDetails, serviceInstanceId, vnfInstanceId);
92 case ChangeManagementRequest.REPLACE: {
93 msoResponseWrapperObject = msoBusinessLogic.replaceVnf(currentRequestDetails, serviceInstanceId, vnfInstanceId);
96 case ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE: {
97 msoResponseWrapperObject = msoBusinessLogic.updateVnfSoftware(currentRequestDetails, serviceInstanceId, vnfInstanceId);
100 case ChangeManagementRequest.CONFIG_UPDATE: {
101 msoResponseWrapperObject = msoBusinessLogic.updateVnfConfig(currentRequestDetails, serviceInstanceId, vnfInstanceId);
104 case ChangeManagementRequest.SCALE_OUT:{
105 msoResponseWrapperObject = msoBusinessLogic.scaleOutVfModuleInstance(currentRequestDetails, serviceInstanceId, vnfInstanceId);
109 logger.error("Failure during doChangeManagement with request " + request.toString());
111 response = new ResponseEntity<String>(msoResponseWrapperObject.getResponse(), HttpStatus.OK);
113 } catch (Exception e) {
114 logger.error("Failure during doChangeManagement with request " + request.toString(), e);
120 // AH:TODO: return ChangeManagementResponse
124 private String extractVnfInstanceId(RequestDetails currentRequestDetails, String requestType) {
125 if (currentRequestDetails.getVnfInstanceId() == null) {
126 logger.error("Failed to extract vnfInstanceId");
127 throw new BadRequestException("No vnfInstanceId in request " + requestType);
129 return currentRequestDetails.getVnfInstanceId();
132 protected String extractServiceInstanceId(RequestDetails currentRequestDetails, String requestType) {
134 String serviceInstanceId = currentRequestDetails.getRelatedInstList().get(0).getRelatedInstance().getInstanceId();
135 serviceInstanceId.toString(); //throw exception in case that serviceInstanceId is null...
136 return serviceInstanceId;
137 } catch (Exception e) {
138 logger.error("Failed to extract serviceInstanceId");
139 throw new BadRequestException("No instanceId in request " + requestType);
144 public JSONArray getSchedulerChangeManagements() {
145 JSONArray result = null;
147 String path = SystemProperties.getProperty(SchedulerProperties.SCHEDULER_GET_SCHEDULES);
148 org.onap.vid.scheduler.RestObject<String> restObject = new org.onap.vid.scheduler.RestObject<>();
150 String str = new String();
152 restClient.Get(str, "", path, restObject);
153 String restCallResult = restObject.get();
154 JSONParser parser = new JSONParser();
155 Object parserResult = parser.parse(restCallResult);
156 result = (JSONArray) parserResult;
157 } catch (Exception e) {
165 public Pair<String, Integer> deleteSchedule(String scheduleId) {
167 String path = String.format(SystemProperties.getProperty(SchedulerProperties.SCHEDULER_DELETE_SCHEDULE), scheduleId);
168 org.onap.vid.scheduler.RestObject<String> restObject = new org.onap.vid.scheduler.RestObject<>();
169 String str = new String();
171 restClient.Delete(str, "", path, restObject);
172 String restCallResult = restObject.get();
173 return new ImmutablePair<>(restCallResult, restObject.getStatusCode());
174 } catch (Exception e) {
175 logger.error(e.getMessage(), e);
176 return new ImmutablePair<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR.value());
181 public VnfWorkflowRelationResponse addVnfWorkflowRelation(VnfWorkflowRelationRequest vnfWorkflowRelationRequest) {
182 VnfWorkflowRelationResponse vnfWorkflowRelationResponse = new VnfWorkflowRelationResponse();
183 for (WorkflowsDetail workflowsDetail : vnfWorkflowRelationRequest.getWorkflowsDetails()) {
184 if (StringUtils.isEmpty(workflowsDetail.getVnfDetails().getUUID()) ||
185 StringUtils.isEmpty(workflowsDetail.getVnfDetails().getInvariantUUID())) {
186 vnfWorkflowRelationResponse.getErrors().add("Using empty UUID or invariantUUID is not allowed. Relation details: " + workflowsDetail.toString());
189 @SuppressWarnings("unchecked") List<VNFDao> vnfList = dataAccessService.getList(VNFDao.class, getVnfQueryString(workflowsDetail.getVnfDetails().getUUID(), workflowsDetail.getVnfDetails().getInvariantUUID()), null, null);
190 if (vnfList.size() == 0) {
191 vnfList.add(saveNewVnf(workflowsDetail));
193 @SuppressWarnings("unchecked") List<VidWorkflow> workflowList = dataAccessService.getList(VidWorkflow.class, String.format(" where wokflowName = '%s'", workflowsDetail.getWorkflowName()), null, null);
194 if (workflowList.size() == 0) {
195 vnfWorkflowRelationResponse.getErrors().add("Not Found instance of workflow " + workflowsDetail.getWorkflowName() + " for vnf with UUID " + workflowsDetail.getVnfDetails().getUUID() + " and with invariantUUID " + workflowsDetail.getVnfDetails().getInvariantUUID());
198 vnfList.get(0).getWorkflows().add(workflowList.get(0));
200 dataAccessService.saveDomainObject(vnfList.get(0), null);
201 } catch (NonUniqueObjectException e) {
202 //In case the relation already exists, we continue running on the list
205 return vnfWorkflowRelationResponse;
209 public VnfWorkflowRelationResponse deleteVnfWorkflowRelation(VnfWorkflowRelationRequest vnfWorkflowRelationRequest) {
210 VnfWorkflowRelationResponse vnfWorkflowRelationResponse = new VnfWorkflowRelationResponse();
211 for (WorkflowsDetail workflowsDetail : vnfWorkflowRelationRequest.getWorkflowsDetails()) {
212 @SuppressWarnings("unchecked") List<VNFDao> vnfList = dataAccessService.getList(VNFDao.class, getVnfQueryString(workflowsDetail.getVnfDetails().getUUID(), workflowsDetail.getVnfDetails().getInvariantUUID()), null, null);
213 if (vnfList.size() != 1) {
214 vnfWorkflowRelationResponse.getErrors().add("Found " + vnfList.size() + " instances of vnf with UUID " + workflowsDetail.getVnfDetails().getUUID() + " and vnfInvariantUUID " + workflowsDetail.getVnfDetails().getInvariantUUID());
217 VidWorkflow vidWorkflow = getWorkflowOfVnf(vnfList.get(0), workflowsDetail.getWorkflowName());
218 if (vidWorkflow == null) {
219 vnfWorkflowRelationResponse.getErrors().add("Not Found instance of workflow " + workflowsDetail.getWorkflowName() + " for vnf with UUID " + workflowsDetail.getVnfDetails().getUUID() + " and with invariantUUID " + workflowsDetail.getVnfDetails().getInvariantUUID());
222 vnfList.get(0).getWorkflows().remove(vidWorkflow);
223 dataAccessService.saveDomainObject(vnfList.get(0), null);
225 return vnfWorkflowRelationResponse;
230 public List<String> getWorkflowsForVnf(GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest) {
231 List<VNFDao> vnfDaoList = new ArrayList<>();
232 List<Set<String>> workflowsList = new ArrayList<>();
233 getVnfDaoList(vnfDaoList, getVnfWorkflowRelationRequest);
234 getWorkflowsList(workflowsList, vnfDaoList);
235 return intersectWorkflows(workflowsList);
238 private void getVnfDaoList(List<VNFDao> vnfDaoList, GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest) {
239 for (VnfDetails vnfDetails : getVnfWorkflowRelationRequest.getVnfDetails()) {
240 @SuppressWarnings("unchecked") List<VNFDao> vnfList = dataAccessService.getList(VNFDao.class, getVnfQueryString(vnfDetails.getUUID(), vnfDetails.getInvariantUUID()), null, null);
241 if (vnfList.size() != 1) {
242 throw new NotFoundException("Found" + vnfList.size() + " instances of vnf with UUID" + vnfDetails.getUUID() + " and vnfInvariantUUID" + vnfDetails.getInvariantUUID());
244 vnfDaoList.add(vnfList.get(0));
248 private void getWorkflowsList(List<Set<String>> workflowsList, List<VNFDao> vnfDaoList) {
249 for (VNFDao vnfDao : vnfDaoList) {
250 Set<String> tempWorkflows = vnfDao.getWorkflows().stream().map(VidWorkflow::getWokflowName).collect(Collectors.toSet());
251 workflowsList.add(tempWorkflows);
255 private List<String> intersectWorkflows(List<Set<String>> workflowsList) {
256 Set<String> workflows = workflowsList.get(0);
257 for (Set<String> workflow : workflowsList) {
258 workflows.retainAll(workflow);
260 return new ArrayList<>(workflows);
263 private String getVnfQueryString(String UUID, String invariantUUID) {
264 return " where vnfInvariantUUID = '" + invariantUUID + "' and vnfUUID = '" + UUID + "'";
267 private VidWorkflow getWorkflowOfVnf(VNFDao vnfDao, String workflowName) {
268 VidWorkflow vidWorkflowRes = null;
269 for (VidWorkflow vidWorkflow : vnfDao.getWorkflows()) {
270 if (vidWorkflow.getWokflowName().equals(workflowName)) {
271 vidWorkflowRes = vidWorkflow;
274 return vidWorkflowRes;
277 private VNFDao saveNewVnf(WorkflowsDetail workflowsDetail) {
278 VNFDao vnfDao = new VNFDao();
279 vnfDao.setVnfUUID(workflowsDetail.getVnfDetails().getUUID());
280 vnfDao.setVnfInvariantUUID(workflowsDetail.getVnfDetails().getInvariantUUID());
281 dataAccessService.saveDomainObject(vnfDao, null);
286 public VnfWorkflowRelationAllResponse getAllVnfWorkflowRelations() {
287 @SuppressWarnings("unchecked") List<VNFDao> vnfList = dataAccessService.getList(VNFDao.class, null);
288 return new VnfWorkflowRelationAllResponse(
290 .map(VnfDetailsWithWorkflows::new)
291 .collect(Collectors.toList()));
295 public String uploadConfigUpdateFile(MultipartFile file) {
296 JSONObject json = null;
298 json = csvService.convertCsvToJson(csvService.readCsv(file));
299 } catch (InstantiationException | IllegalAccessException | IOException e) {
300 throw new BadRequestException("Invalid csv file", e);
302 if (!validateJsonOutput(json))
303 throw new BadRequestException("Invalid csv file");
304 json = json.getJSONObject(PRIMARY_KEY);
305 json = new JSONObject().put(PRIMARY_KEY, json.toString());
306 return json.toString();
309 private boolean validateJsonOutput(org.json.JSONObject json) {
310 if (!json.has(PRIMARY_KEY) || !json.getJSONObject(PRIMARY_KEY).keySet().containsAll(REQUIRED_KEYS))