30031599c095bba5e49292f0cfeea6fcafd746a1
[aai/esr-server.git] / esr-mgr / src / main / java / org / onap / aai / esr / wrapper / VimManagerWrapper.java
1 /**
2  * Copyright 2017-2018 ZTE Corporation.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.onap.aai.esr.wrapper;
17
18 import java.util.ArrayList;
19 import java.util.List;
20 import javax.ws.rs.core.Response;
21 import org.onap.aai.esr.entity.aai.CloudRegionDetail;
22 import org.onap.aai.esr.entity.aai.CloudRegionList;
23 import org.onap.aai.esr.entity.aai.Complex;
24 import org.onap.aai.esr.entity.aai.ComplexList;
25 import org.onap.aai.esr.entity.aai.EsrSystemInfo;
26 import org.onap.aai.esr.entity.aai.Relationship;
27 import org.onap.aai.esr.entity.aai.RelationshipData;
28 import org.onap.aai.esr.entity.rest.VimRegisterInfo;
29 import org.onap.aai.esr.entity.rest.VimRegisterResponse;
30 import org.onap.aai.esr.exception.ExceptionUtil;
31 import org.onap.aai.esr.exception.ExtsysException;
32 import org.onap.aai.esr.externalservice.aai.CloudRegionProxy;
33 import org.onap.aai.esr.externalservice.cloud.Tenant;
34 import org.onap.aai.esr.externalservice.cloud.VimManagerProxy;
35 import org.onap.aai.esr.util.ExtsysUtil;
36 import org.onap.aai.esr.util.VimManagerUtil;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39 import com.google.gson.Gson;
40
41 public class VimManagerWrapper {
42
43     private static VimManagerWrapper vimManagerWrapper;
44     private static final Logger LOG = LoggerFactory.getLogger(VimManagerWrapper.class);
45
46     private static VimManagerUtil vimManagerUtil = new VimManagerUtil();
47
48     private static CloudRegionProxy cloudRegionProxy = new CloudRegionProxy();
49
50     private static ExtsysUtil extsysUtil = new ExtsysUtil();
51
52     /**
53      * get VimManagerWrapper instance.
54      * 
55      * @return vim manager wrapper instance
56      */
57     public static VimManagerWrapper getInstance() {
58         if (vimManagerWrapper == null) {
59             vimManagerWrapper = new VimManagerWrapper(cloudRegionProxy);
60         }
61         return vimManagerWrapper;
62     }
63     
64     public VimManagerWrapper(CloudRegionProxy cloudRegionProxy) {
65         VimManagerWrapper.cloudRegionProxy = cloudRegionProxy;
66     }
67
68     public Response registerVim(VimRegisterInfo vimRegisterInfo) {
69         LOG.info("Start register VIM, input VIM info is: " + extsysUtil.objectToString(vimRegisterInfo));
70         VimRegisterResponse result = new VimRegisterResponse();
71         CloudRegionDetail cloudRegion = vimManagerUtil.vimRegisterInfo2CloudRegion(vimRegisterInfo);
72         String cloudOwner = vimRegisterInfo.getCloudOwner();
73         String cloudRegionId = vimRegisterInfo.getCloudRegionId();
74         String physicalLocationId = vimRegisterInfo.getPhysicalLocationId();
75         String complexName = getComplexName(physicalLocationId);
76         cloudRegion.setComplexName(complexName);
77         try {
78             cloudRegionProxy.registerVim(cloudOwner, cloudRegionId, cloudRegion);
79             result.setCloudOwner(cloudOwner);
80             result.setCloudRegionId(cloudRegionId);
81             createRelationship(cloudOwner, cloudRegionId, physicalLocationId);
82             updateVimWithMultiCloud(cloudRegion, cloudOwner, cloudRegionId);
83             return Response.ok(result).build();
84         } catch (ExtsysException error) {
85             LOG.error("Register VIM failed !", error);
86             throw ExceptionUtil.buildExceptionResponse(error.getMessage());
87         }
88     }
89
90     private void updateVimWithMultiCloud(CloudRegionDetail cloudRegion, String cloudOwner, String cloudRegionId) {
91         Tenant tenant = new Tenant();
92         tenant.setDefaultTenant(cloudRegion.getEsrSystemInfoList().getEsrSystemInfo().get(0).getDefaultTenant());
93         try {
94             VimManagerProxy.updateVim(cloudOwner, cloudRegionId, tenant);
95         } catch (ExtsysException e) {
96             LOG.error("Update VIM by Multi-cloud failed !", e);
97         }
98     }
99     
100     private void createRelationship(String cloudOwner, String cloudRegionId, String physicalLocationId) {
101         Relationship relationship = new Relationship();
102         RelationshipData relationshipData = new RelationshipData();
103         List<RelationshipData> relationshipDatas = new ArrayList<>();
104         String relatedLink = "/aai/v11/cloud-infrastructure/complexes/complex/" + physicalLocationId;
105         relationship.setRelatedTo("complex");
106         relationship.setRelatedLink(relatedLink);
107         relationshipData.setRelationshipKey("complex.physical-location-id");
108         relationshipData.setRelationshipValue(physicalLocationId);
109         relationshipDatas.add(relationshipData);
110         relationship.setRelationshipData(relationshipDatas);
111         try {
112             cloudRegionProxy.createCloudRegionRelationShip(cloudOwner, cloudRegionId, relationship);
113         } catch (ExtsysException e) {
114             LOG.error("Create relationship between cloudRegion and complex failed !", e);
115         }
116     }
117
118     public Response updateVim(String cloudOwner, String cloudRegionId, VimRegisterInfo vimRegisterInfo) {
119         LOG.info("Start update VIM, input VIM info is: " + extsysUtil.objectToString(vimRegisterInfo));
120         VimRegisterResponse result = new VimRegisterResponse();
121
122         CloudRegionDetail cloudRegionDetail = getVimUpdateInfo(vimRegisterInfo);
123         try {
124             cloudRegionProxy.registerVim(cloudOwner, cloudRegionId, cloudRegionDetail);
125             result.setCloudOwner(cloudOwner);
126             result.setCloudRegionId(cloudRegionId);
127             return Response.ok(result).build();
128         } catch (ExtsysException e) {
129             LOG.error("Update VIM failed !", e);
130             throw ExceptionUtil.buildExceptionResponse(e.getMessage());
131         }
132     }
133
134     public Response queryVimListDetails() {
135         List<VimRegisterInfo> vimRegisterInfos = new ArrayList<>();
136         CloudRegionList cloudRegionList = new CloudRegionList();
137         try {
138             String aaiVimList = cloudRegionProxy.qureyVimList();
139             cloudRegionList = new Gson().fromJson(aaiVimList, CloudRegionList.class);
140             vimRegisterInfos = getVimDetailList(cloudRegionList);
141             return Response.ok(vimRegisterInfos).build();
142         } catch (ExtsysException error) {
143             LOG.error("Query vim list details failed !", error);
144             return Response.ok(vimRegisterInfos).build();
145         }
146
147     }
148
149     public Response queryVimById(String cloudOwner, String cloudRegionId) {
150         VimRegisterInfo vim = new VimRegisterInfo();
151         CloudRegionDetail cloudRegionDetail = new CloudRegionDetail();
152         try {
153             String cloudRegionstr = cloudRegionProxy.queryVimDetail(cloudOwner, cloudRegionId);
154             LOG.info("Response from AAI by query VIM: " + cloudRegionstr);
155             cloudRegionDetail = new Gson().fromJson(cloudRegionstr, CloudRegionDetail.class);
156             vim = vimManagerUtil.cloudRegion2VimRegisterInfo(cloudRegionDetail);
157             return Response.ok(vim).build();
158         } catch (ExtsysException e) {
159             LOG.error("Query vim details by ID failed !", e);
160             return Response.ok(vim).build();
161         }
162
163     }
164
165     private List<VimRegisterInfo> getVimDetailList(CloudRegionList cloudRegionList) {
166         List<VimRegisterInfo> vimRegisterInfos = new ArrayList<>();
167         int cloudRegionNum = cloudRegionList.getCloudRegion().size();
168         for (int i = 0; i < cloudRegionNum; i++) {
169             String cloudOwner = cloudRegionList.getCloudRegion().get(i).getCloudOwner();
170             String cloudRegionId = cloudRegionList.getCloudRegion().get(i).getCloudRegionId();
171             VimRegisterInfo vimRegisterInfo = getVimDetail(cloudOwner, cloudRegionId);
172             vimRegisterInfos.add(vimRegisterInfo);
173         }
174         return vimRegisterInfos;
175     }
176
177     private VimRegisterInfo getVimDetail(String cloudOwner, String cloudRegionId) {
178         CloudRegionDetail cloudRegionDetail = new CloudRegionDetail();
179         VimRegisterInfo registeredVimInfo = new VimRegisterInfo();
180         try {
181             String cloudRegionstr = cloudRegionProxy.queryVimDetail(cloudOwner, cloudRegionId);
182             cloudRegionDetail = new Gson().fromJson(cloudRegionstr, CloudRegionDetail.class);
183             registeredVimInfo = vimManagerUtil.cloudRegion2VimRegisterInfo(cloudRegionDetail);
184         } catch (ExtsysException error) {
185             LOG.error("query VIM detail failed ! cloud-owner = " + cloudOwner + ", cloud-region-id = " + cloudRegionId,
186                     error);
187         }
188         return registeredVimInfo;
189     }
190
191     private CloudRegionDetail getOriginalCloudRegion(String cloudOwner, String cloudRegionId) {
192         CloudRegionDetail cloudRegionDetail = new CloudRegionDetail();
193         try {
194             String cloudRegionstr = cloudRegionProxy.queryVimDetail(cloudOwner, cloudRegionId);
195             cloudRegionDetail = new Gson().fromJson(cloudRegionstr, CloudRegionDetail.class);
196             return cloudRegionDetail;
197         } catch (ExtsysException error) {
198             LOG.error("query VIM detail failed ! cloud-owner = " + cloudOwner + ", cloud-region-id = " + cloudRegionId,
199                     error);
200             return null;
201         }
202     }
203
204     private CloudRegionDetail getVimUpdateInfo(VimRegisterInfo vimRegisterInfo) {
205         String cloudOwner = vimRegisterInfo.getCloudOwner();
206         String cloudRegionId = vimRegisterInfo.getCloudRegionId();
207         CloudRegionDetail originalCloudRegionDetail = getOriginalCloudRegion(cloudOwner, cloudRegionId);
208         String resourceVersion = originalCloudRegionDetail.getResourceVersion();
209         CloudRegionDetail cloudRegionDetail = vimManagerUtil.vimRegisterInfo2CloudRegion(vimRegisterInfo);
210         if (resourceVersion != null) {
211             cloudRegionDetail.setResourceVersion(resourceVersion);
212             EsrSystemInfo originalSystemInfo = originalCloudRegionDetail.getEsrSystemInfoList().getEsrSystemInfo().get(0);
213             cloudRegionDetail.getEsrSystemInfoList().getEsrSystemInfo().get(0)
214                     .setEsrSystemInfoId(originalSystemInfo.getEsrSystemInfoId());
215             cloudRegionDetail.getEsrSystemInfoList().getEsrSystemInfo().get(0)
216                     .setResouceVersion(originalSystemInfo.getResouceVersion());
217         }
218         return cloudRegionDetail;
219     }
220
221     public Response delVim(String cloudOwner, String cloudRegionId) {
222         CloudRegionDetail cloudRegionDetail = queryCloudRegionDetail(cloudOwner, cloudRegionId);
223         String resourceVersion = cloudRegionDetail.getResourceVersion();
224         try {
225             cloudRegionProxy.deleteVim(cloudOwner, cloudRegionId, resourceVersion);
226             return Response.noContent().build();
227         } catch (ExtsysException e) {
228             LOG.error("Delete cloud region from A&AI failed! cloud-owner = " + cloudOwner + ", cloud-region-id = "
229                     + cloudRegionId + "resouce-version:" + resourceVersion, e);
230             throw ExceptionUtil.buildExceptionResponse(e.getMessage());
231         }
232     }
233
234     private CloudRegionDetail queryCloudRegionDetail(String cloudOwner, String cloudRegionId) {
235         CloudRegionDetail cloudRegionDetail = new CloudRegionDetail();
236         try {
237             String cloudRegionStr = cloudRegionProxy.queryVimDetail(cloudOwner, cloudRegionId);
238             LOG.info("Response from AAI by query cloud region: " + cloudRegionStr);
239             cloudRegionDetail = new Gson().fromJson(cloudRegionStr, CloudRegionDetail.class);
240         } catch (ExtsysException e) {
241             LOG.error("Query EMS detail failed! cloud-owner = " + cloudOwner + ", cloud-region-id = " + cloudRegionId,
242                     e);
243             throw ExceptionUtil.buildExceptionResponse(e.getMessage());
244         }
245         return cloudRegionDetail;
246     }
247     
248     private String getComplexName(String physicalLocationId) {
249         Complex complex = new Complex();
250         try {
251             String complexStr = cloudRegionProxy.queryComplex(physicalLocationId);
252             LOG.info("The complexes query result is: " + complexStr);
253             complex = new Gson().fromJson(complexStr, Complex.class);
254             return complex.getComplexName();
255         } catch (ExtsysException e) {
256             LOG.error("Query complex by physical location Id failed !", e);
257             return null;
258         }
259     }
260
261     public Response queryComplexes() {
262         ComplexList complexList = new ComplexList();
263         List<String> physicalLocationIdList = new ArrayList<>();
264         try {
265             String complexesString = cloudRegionProxy.qureyComplexes();
266             LOG.info("The complexes query result is: " + complexesString);
267             complexList = new Gson().fromJson(complexesString, ComplexList.class);
268             for (int i=0; i<complexList.getComplex().size(); i++) {
269                 physicalLocationIdList.add(complexList.getComplex().get(i).getPhysicalLocationId());
270             }
271         } catch (ExtsysException e) {
272             LOG.error("Query complexes failed !", e);
273         }
274         return Response.ok(physicalLocationIdList).build();
275     }
276 }