cfe23ba59408c5f4c0d3c6518ed20500f374e4bd
[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(false)) {
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             responseRow = opt.get();
110         }
111         if (responseRow == null) {
112             responseRow = new Response();
113             responseRow.setUuid(requestRow.getUuid());
114         }
115
116         try {
117             OptimizerResponse response = new OptimizerResponse();
118             response.setRequestId(requestRow.getUuid().toString());
119             response.setStatus(OptimizeScheduleStatus.COMPLETED);
120             String optString = requestRow.getRequest();
121
122             OptimizerRequest optimizerResquest = new ObjectMapper().readValue(optString, OptimizerRequest.class);
123             TopologyResponse topologyResponse = topologyRequestManager.getTopologyResponse(requestRow.getUuid());
124             ElementWindowMapping ewm = new ElementWindowMapping(optimizerResquest, topologyResponse);
125             ewm.initializeForProcessResult();
126             OptimizerResults results = apiResponse.getOptimizerResults();
127             for (OptimizerSchedule result : results.getSchedules()) {
128                 OptimizerScheduleInfo info = ewm.processResult(result);
129                 if (info != null) {
130                     response.getSchedules().add(info);
131                 }
132             }
133             responseRow.setRepsonse(new ObjectMapper().writeValueAsString(response));
134             requestRow.setStatus(OptimizeScheduleStatus.COMPLETED.toString());
135             responseDao.save(responseRow);
136             requestDao.save(requestRow);
137         } catch (Exception e) {
138             Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
139             requestRow.setStatus(OptimizeScheduleStatus.FAILED.toString());
140             requestRow.setMessage(e.getMessage());
141             responseRow.setRepsonse("");
142             responseDao.save(responseRow);
143             requestDao.save(requestRow);
144         }
145     }
146
147
148
149     private boolean okToDispatch(boolean checkDispatchability) {
150         if (checkDispatchability) {
151             // not yet implemented
152             return false;
153         }
154         else {
155             return true;
156         }
157     }
158
159
160     /**
161      * Gets the existing optimizer row.
162      *
163      * @param uuid the uuid
164      * @return the existing optmizer row
165      */
166     public Optimizer getExistingOptmizer(UUID uuid) {
167         Optional<Optimizer> oppt = optimizerDao.findById(uuid);
168         if (oppt.isPresent()) {
169             return oppt.get();
170         }
171         return null;
172     }
173
174
175
176 }