c911804e5c4703b857d2d06b82578355f0b7df17
[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.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;
46
47 /**
48  * The Class OPtimizerRequestManager.
49  */
50 @Component
51 public class OptimizerRequestManager {
52
53     @Autowired
54     Environment env;
55
56     @Autowired
57     RequestDao requestDao;
58
59     @Autowired
60     OptimizerDao optimizerDao;
61
62     @Autowired
63     ResponseDao responseDao;
64
65     @Autowired
66     OptimizerClient optimizerClient;
67
68     @Autowired
69     TopologyRequestManager topologyRequestManager;
70
71     /**
72      * Creates the Optimizer request.
73      *
74      * @param requestRow the request row
75      * @return the Optimizer response
76      */
77     public OptimizerEngineResponse createOptimizerRequest(Request requestRow) {
78         //
79         if (okToDispatch()) {
80             Optimizer optimizer = getExistingOptmizer(requestRow.getUuid());
81             if (optimizer == null) {
82                 optimizer = new Optimizer();
83                 optimizer.setUuid(requestRow.getUuid());
84                 optimizer.setOptimizeRetries(0);
85             }
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);
92             }
93             optimizerDao.save(optimizer);
94             return apiResponse;
95         } else {
96             OptimizerEngineResponse apiResponse = new OptimizerEngineResponse();
97             apiResponse.setRequestId(requestRow.getUuid().toString());
98             apiResponse.setStatus(OptimizerEngineResponseStatus.IN_QUEUE);
99             apiResponse.setPollingSeconds(60);
100             return apiResponse;
101         }
102     }
103
104
105     private void buildFinalResponse(Request requestRow, OptimizerEngineResponse apiResponse) {
106         Optional<Response> opt = responseDao.findById(requestRow.getUuid());
107         Response responseRow = null;
108         if (opt.isPresent())
109         {
110             responseRow = opt.get();
111         }
112         if (responseRow == null)
113         {
114             responseRow = new Response();
115             responseRow.setUuid(requestRow.getUuid());
116         }
117
118         try
119         {
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();
125
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);
132                 if (info != null) {
133                     response.getSchedules().add(info);
134                 }
135             }
136             responseRow.setRepsonse(new ObjectMapper().writeValueAsString(response));
137             requestRow.setStatus(OptimizeScheduleStatus.COMPLETED.toString());
138             responseDao.save(responseRow);
139             requestDao.save(requestRow);
140         }
141         catch (Exception e)
142         {
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);
149         }
150     }
151
152
153
154     private boolean okToDispatch() {
155         // TODO Auto-generated method stub
156
157         // Will probably change to @Async on makeRequest to queue requests in a different thread.
158         return true;
159     }
160
161
162     /**
163      * Gets the existing optimizer row.
164      *
165      * @param uuid the uuid
166      * @return the existing optmizer row
167      */
168     public Optimizer getExistingOptmizer(UUID uuid) {
169         Optional<Optimizer> oppt = optimizerDao.findById(uuid);
170         if (oppt.isPresent()) {
171             return oppt.get();
172         }
173         return null;
174     }
175
176
177
178
179 }