34de3df8cb0327167063597a457fc3496176133a
[optf/cmso.git] /
1 /*
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
8  *
9  *        http://www.apache.org/licenses/LICENSE-2.0
10  *
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=================================================
17  *
18  */
19
20 package org.onap.optf.cmso.optimizer.clients.optimizer;
21
22 import com.fasterxml.jackson.databind.ObjectMapper;
23 import java.util.List;
24 import java.util.Optional;
25 import java.util.UUID;
26 import org.onap.observations.Observation;
27 import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerEngineResponse;
28 import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerEngineResponse.OptimizerEngineResponseStatus;
29 import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerResults;
30 import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerSchedule;
31 import org.onap.optf.cmso.optimizer.clients.topology.TopologyRequestManager;
32 import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse;
33 import org.onap.optf.cmso.optimizer.common.LogMessages;
34 import org.onap.optf.cmso.optimizer.model.Optimizer;
35 import org.onap.optf.cmso.optimizer.model.Request;
36 import org.onap.optf.cmso.optimizer.model.Response;
37 import org.onap.optf.cmso.optimizer.model.dao.OptimizerDao;
38 import org.onap.optf.cmso.optimizer.model.dao.RequestDao;
39 import org.onap.optf.cmso.optimizer.model.dao.ResponseDao;
40 import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerRequest;
41 import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerResponse;
42 import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerResponse.OptimizeScheduleStatus;
43 import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerScheduleInfo;
44 import org.springframework.beans.factory.annotation.Autowired;
45 import org.springframework.core.env.Environment;
46 import org.springframework.stereotype.Component;
47
48 /**
49  * The Class OPtimizerRequestManager.
50  */
51 @Component
52 public class OptimizerRequestManager {
53
54     @Autowired
55     Environment env;
56
57     @Autowired
58     RequestDao requestDao;
59
60     @Autowired
61     OptimizerDao optimizerDao;
62
63     @Autowired
64     ResponseDao responseDao;
65
66     @Autowired
67     OptimizerClient optimizerClient;
68
69     @Autowired
70     TopologyRequestManager topologyRequestManager;
71
72     /**
73      * Creates the Optimizer request.
74      *
75      * @param requestRow the request row
76      * @return the Optimizer response
77      */
78     public OptimizerEngineResponse createOptimizerRequest(Request requestRow) {
79         //
80         if (okToDispatch()) {
81             Optimizer optimizer = getExistingOptmizer(requestRow.getUuid());
82             if (optimizer == null) {
83                 optimizer = new Optimizer();
84                 optimizer.setUuid(requestRow.getUuid());
85                 optimizer.setOptimizeRetries(0);
86             }
87             optimizer.setOptimizeStart(System.currentTimeMillis());
88             OptimizerEngineResponse apiResponse = optimizerClient.makeRequest(requestRow, optimizer);
89             if (apiResponse.getStatus() == OptimizerEngineResponseStatus.COMPLETED) {
90                 optimizer.setOptimizeEnd(System.currentTimeMillis());
91                 optimizer.setOptimizeResponse(""); // Perhaps we do not need to persist...
92                 buildFinalResponse(requestRow, apiResponse);
93             }
94             optimizerDao.save(optimizer);
95             return apiResponse;
96         } else {
97             OptimizerEngineResponse apiResponse = new OptimizerEngineResponse();
98             apiResponse.setRequestId(requestRow.getUuid().toString());
99             apiResponse.setStatus(OptimizerEngineResponseStatus.IN_QUEUE);
100             apiResponse.setPollingSeconds(60);
101             return apiResponse;
102         }
103     }
104
105
106     private void buildFinalResponse(Request requestRow, OptimizerEngineResponse apiResponse) {
107         Optional<Response> opt = responseDao.findById(requestRow.getUuid());
108         Response responseRow = null;
109         if (opt.isPresent())
110         {
111             responseRow = opt.get();
112         }
113         if (responseRow == null)
114         {
115             responseRow = new Response();
116             responseRow.setUuid(requestRow.getUuid());
117         }
118
119         try
120         {
121             OptimizerResults results = apiResponse.getOptimizerResults();
122             OptimizerResponse response = new OptimizerResponse();
123             response.setRequestId(requestRow.getUuid().toString());
124
125             String optString = requestRow.getRequest();
126
127             OptimizerRequest optimizerResquest = new ObjectMapper().readValue(optString, OptimizerRequest.class);
128             TopologyResponse topologyResponse = topologyRequestManager.getTopologyResponse(requestRow.getUuid());
129             ElementWindowMapping ewm = new ElementWindowMapping(optimizerResquest, topologyResponse);
130             ewm.initializeForProcessResult();
131             for (OptimizerSchedule result : results.getSchedules()) {
132                 OptimizerScheduleInfo info = ewm.processResult(result);
133                 if (info != null) {
134                     response.getSchedules().add(info);
135                 }
136             }
137             responseRow.setRepsonse(new ObjectMapper().writeValueAsString(response));
138             requestRow.setStatus(OptimizeScheduleStatus.COMPLETED.toString());
139             responseDao.save(responseRow);
140             requestDao.save(requestRow);
141         }
142         catch (Exception e)
143         {
144             Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
145             requestRow.setStatus(OptimizeScheduleStatus.FAILED.toString());
146             requestRow.setMessage(e.getMessage());
147             responseRow.setRepsonse("");
148             responseDao.save(responseRow);
149             requestDao.save(requestRow);
150         }
151     }
152
153
154
155     private boolean okToDispatch() {
156         // TODO Auto-generated method stub
157
158         // Will probably change to @Async on makeRequest to queue requests in a different thread.
159         return true;
160     }
161
162
163     /**
164      * Gets the existing optimizer row.
165      *
166      * @param uuid the uuid
167      * @return the existing optmizer row
168      */
169     public Optimizer getExistingOptmizer(UUID uuid) {
170         Optional<Optimizer> oppt = optimizerDao.findById(uuid);
171         if (oppt.isPresent()) {
172             return oppt.get();
173         }
174         return null;
175     }
176
177
178     public List<OptimizerScheduleInfo> getScheduleInfo(Response responseRow) {
179         // TODO Auto-generated method stub
180         return null;
181     }
182
183
184
185 }