2 * ============LICENSE_START==============================================
3 * Copyright (c) 2019 AT&T Intellectual Property.
4 * =======================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License"); you may
6 * not use this file except in compliance with the License. You may obtain a
7 * 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
14 * or implied. See the License for the specific language governing
15 * permissions and limitations under the License.
16 * ============LICENSE_END=================================================
20 package org.onap.optf.cmso.optimizer.clients.optimizer;
22 import com.fasterxml.jackson.databind.ObjectMapper;
23 import java.util.Optional;
24 import java.util.UUID;
25 import org.onap.observations.Observation;
26 import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerEngineResponse;
27 import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerEngineResponse.OptimizerEngineResponseStatus;
28 import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerResults;
29 import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerSchedule;
30 import org.onap.optf.cmso.optimizer.clients.topology.TopologyRequestManager;
31 import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse;
32 import org.onap.optf.cmso.optimizer.common.LogMessages;
33 import org.onap.optf.cmso.optimizer.model.Optimizer;
34 import org.onap.optf.cmso.optimizer.model.Request;
35 import org.onap.optf.cmso.optimizer.model.Response;
36 import org.onap.optf.cmso.optimizer.model.dao.OptimizerDao;
37 import org.onap.optf.cmso.optimizer.model.dao.RequestDao;
38 import org.onap.optf.cmso.optimizer.model.dao.ResponseDao;
39 import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerRequest;
40 import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerResponse;
41 import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerResponse.OptimizeScheduleStatus;
42 import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerScheduleInfo;
43 import org.springframework.beans.factory.annotation.Autowired;
44 import org.springframework.core.env.Environment;
45 import org.springframework.stereotype.Component;
48 * The Class OPtimizerRequestManager.
51 public class OptimizerRequestManager {
57 RequestDao requestDao;
60 OptimizerDao optimizerDao;
63 ResponseDao responseDao;
66 OptimizerClient optimizerClient;
69 TopologyRequestManager topologyRequestManager;
72 * Creates the Optimizer request.
74 * @param requestRow the request row
75 * @return the Optimizer response
77 public OptimizerEngineResponse createOptimizerRequest(Request requestRow) {
80 Optimizer optimizer = getExistingOptmizer(requestRow.getUuid());
81 if (optimizer == null) {
82 optimizer = new Optimizer();
83 optimizer.setUuid(requestRow.getUuid());
84 optimizer.setOptimizeRetries(0);
86 optimizer.setOptimizeStart(System.currentTimeMillis());
87 OptimizerEngineResponse apiResponse = optimizerClient.makeRequest(requestRow, optimizer);
88 if (apiResponse.getStatus() == OptimizerEngineResponseStatus.COMPLETED) {
89 optimizer.setOptimizeEnd(System.currentTimeMillis());
90 optimizer.setOptimizeResponse(""); // Perhaps we do not need to persist...
91 buildFinalResponse(requestRow, apiResponse);
93 optimizerDao.save(optimizer);
96 OptimizerEngineResponse apiResponse = new OptimizerEngineResponse();
97 apiResponse.setRequestId(requestRow.getUuid().toString());
98 apiResponse.setStatus(OptimizerEngineResponseStatus.IN_QUEUE);
99 apiResponse.setPollingSeconds(60);
105 private void buildFinalResponse(Request requestRow, OptimizerEngineResponse apiResponse) {
106 Optional<Response> opt = responseDao.findById(requestRow.getUuid());
107 Response responseRow = null;
110 responseRow = opt.get();
112 if (responseRow == null)
114 responseRow = new Response();
115 responseRow.setUuid(requestRow.getUuid());
120 OptimizerResults results = apiResponse.getOptimizerResults();
121 OptimizerResponse response = new OptimizerResponse();
122 response.setRequestId(requestRow.getUuid().toString());
123 response.setStatus(OptimizeScheduleStatus.COMPLETED);
124 String optString = requestRow.getRequest();
126 OptimizerRequest optimizerResquest = new ObjectMapper().readValue(optString, OptimizerRequest.class);
127 TopologyResponse topologyResponse = topologyRequestManager.getTopologyResponse(requestRow.getUuid());
128 ElementWindowMapping ewm = new ElementWindowMapping(optimizerResquest, topologyResponse);
129 ewm.initializeForProcessResult();
130 for (OptimizerSchedule result : results.getSchedules()) {
131 OptimizerScheduleInfo info = ewm.processResult(result);
133 response.getSchedules().add(info);
136 responseRow.setRepsonse(new ObjectMapper().writeValueAsString(response));
137 requestRow.setStatus(OptimizeScheduleStatus.COMPLETED.toString());
138 responseDao.save(responseRow);
139 requestDao.save(requestRow);
143 Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
144 requestRow.setStatus(OptimizeScheduleStatus.FAILED.toString());
145 requestRow.setMessage(e.getMessage());
146 responseRow.setRepsonse("");
147 responseDao.save(responseRow);
148 requestDao.save(requestRow);
154 private boolean okToDispatch() {
155 // TODO Auto-generated method stub
157 // Will probably change to @Async on makeRequest to queue requests in a different thread.
163 * Gets the existing optimizer row.
165 * @param uuid the uuid
166 * @return the existing optmizer row
168 public Optimizer getExistingOptmizer(UUID uuid) {
169 Optional<Optimizer> oppt = optimizerDao.findById(uuid);
170 if (oppt.isPresent()) {