Containerization feature of SO
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / onap / so / apihandlerinfra / tenantisolation / process / CreateVnfOperationalEnvironment.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.so.apihandlerinfra.tenantisolation.process;
22
23 import java.util.ArrayList;
24 import java.util.List;
25
26 import javax.ws.rs.NotFoundException;
27
28 import org.apache.commons.lang3.StringUtils;
29 import org.apache.http.HttpStatus;
30 import org.onap.so.apihandler.common.ErrorNumbers;
31 import org.onap.so.apihandlerinfra.exceptions.ApiException;
32 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
33 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
34 import org.onap.so.apihandlerinfra.tenantisolation.CloudOrchestrationRequest;
35 import org.onap.so.apihandlerinfra.tenantisolation.exceptions.TenantIsolationException;
36 import org.onap.so.apihandlerinfra.tenantisolation.helpers.AAIClientHelper;
37 import org.onap.so.apihandlerinfra.tenantisolation.helpers.AAIClientObjectBuilder;
38 import org.onap.so.apihandlerinfra.tenantisolationbeans.RelatedInstanceList;
39 import org.onap.so.client.aai.entities.AAIResultWrapper;
40 import org.onap.so.client.aai.objects.AAIOperationalEnvironment;
41 import org.onap.so.client.grm.GRMClient;
42 import org.onap.so.client.grm.beans.OperationalInfo;
43 import org.onap.so.client.grm.beans.Property;
44 import org.onap.so.client.grm.beans.ServiceEndPoint;
45 import org.onap.so.client.grm.beans.ServiceEndPointList;
46 import org.onap.so.client.grm.beans.ServiceEndPointRequest;
47 import org.onap.so.client.grm.beans.Version;
48 import org.onap.so.logger.MessageEnum;
49 import org.onap.so.logger.MsoLogger;
50 import org.onap.so.requestsdb.RequestsDBHelper;
51 import org.springframework.beans.factory.annotation.Autowired;
52 import org.springframework.stereotype.Component;
53
54 import com.fasterxml.jackson.databind.ObjectMapper;
55
56 @Component
57 public class CreateVnfOperationalEnvironment {
58         
59         private static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.APIH, CreateVnfOperationalEnvironment.class);
60         protected CloudOrchestrationRequest request;
61         
62         @Autowired 
63         private AAIClientObjectBuilder aaiClientObjectBuilder;
64         @Autowired 
65         private AAIClientHelper aaiHelper;
66         @Autowired 
67         private RequestsDBHelper requestDb;
68         private GRMClient grmClient;
69         
70         public void execute(String requestId, CloudOrchestrationRequest request) throws ApiException{
71                 try {
72                         setRequest(request);
73                         ObjectMapper objectMapper = new ObjectMapper();
74                         AAIResultWrapper aaiResultWrapper = aaiHelper.getAaiOperationalEnvironment(getEcompManagingEnvironmentId());
75                         if (aaiResultWrapper.isEmpty()) {
76                                 throw new NotFoundException(getEcompManagingEnvironmentId() + " not found in A&AI");
77                         }
78                         AAIOperationalEnvironment aaiEnv = objectMapper.readValue(aaiResultWrapper.getJson(), AAIOperationalEnvironment.class);
79
80                         //Find ECOMP environments in GRM
81                         msoLogger.debug(" Start of GRM findRunningServicesAsString");
82                         String searchKey = getSearchKey(aaiEnv);
83                         String tenantContext = getTenantContext().toUpperCase();
84                         String jsonResponse = getGrmClient().findRunningServicesAsString(searchKey, 1, tenantContext);
85                         ServiceEndPointList sel = objectMapper.readValue(jsonResponse, ServiceEndPointList.class);
86                         if(sel.getServiceEndPointList().size() == 0) {
87                                 throw new TenantIsolationException("GRM did not find any matches for " + searchKey + " in " + tenantContext);
88                         }
89
90                         //Replicate end-point for VNF Operating environment in GRM
91                         List<ServiceEndPointRequest> serviceEndpointRequestList = buildEndPointRequestList(sel);
92                         int ctr = 0;
93                         int total = serviceEndpointRequestList.size();
94                         for (ServiceEndPointRequest requestList : serviceEndpointRequestList) {
95                                 msoLogger.debug("Creating endpoint " + ++ctr + " of " + total + ": " + requestList.getServiceEndPoint().getName());
96                                 getGrmClient().addServiceEndPoint(requestList);
97                         }
98
99                         //Create VNF operating in A&AI
100                         aaiHelper.createOperationalEnvironment(aaiClientObjectBuilder.buildAAIOperationalEnvironment("INACTIVE", request));
101                         aaiHelper.createRelationship(request.getOperationalEnvironmentId(), getEcompManagingEnvironmentId());
102
103                         //Update request database
104                         requestDb.updateInfraSuccessCompletion("SUCCESSFULLY created VNF operational environment", requestId, request.getOperationalEnvironmentId());
105
106                 }catch(Exception e) {
107                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_GENERAL_EXCEPTION, MsoLogger.ErrorCode.DataError).build();
108
109
110                         ValidateException validateException = new ValidateException.Builder(e.getMessage(),
111                                         HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
112
113                         throw validateException;
114                 }
115         }
116         
117         
118         protected String getEcompManagingEnvironmentId() throws TenantIsolationException {
119                 RelatedInstanceList[] relatedInstances = request.getRequestDetails().getRelatedInstanceList();
120                 if (relatedInstances.length > 0 && relatedInstances[0].getRelatedInstance() != null) {
121                         return relatedInstances[0].getRelatedInstance().getInstanceId();
122                 } else {
123                         return null;
124                 }
125         }
126         
127         
128         protected String getTenantContext() throws TenantIsolationException {
129                 if(!StringUtils.isEmpty(request.getRequestDetails().getRequestParameters().getTenantContext())) {
130                         return request.getRequestDetails().getRequestParameters().getTenantContext();
131                 }
132                 else {
133                         throw new TenantIsolationException("Tenant Context is missing from request!");
134                 }
135         }
136         
137         
138         private List<ServiceEndPointRequest> buildEndPointRequestList(ServiceEndPointList serviceEndPointList) throws TenantIsolationException {
139                 List<ServiceEndPoint> endpointList = serviceEndPointList.getServiceEndPointList();
140                 msoLogger.debug("Number of service endpoints from GRM: " + endpointList.size());
141                 List<ServiceEndPointRequest> serviceEndPointRequestList = new ArrayList<ServiceEndPointRequest>(); 
142                 for(ServiceEndPoint serviceEndpoint : endpointList) {
143                         serviceEndPointRequestList.add(buildServiceEndpoint(serviceEndpoint));
144                 }
145                 return serviceEndPointRequestList;
146         }
147         
148         
149         private ServiceEndPointRequest buildServiceEndpoint(ServiceEndPoint serviceEndpoint) throws TenantIsolationException {
150                 
151                 //@TODO: handle nulls? Put in a ServiceEndpointWrapper class which will check for nulls and flatten access to fields
152                 Version ver = new Version();
153                 ver.setMajor(serviceEndpoint.getVersion().getMajor());
154                 ver.setMinor(serviceEndpoint.getVersion().getMinor());
155                 ver.setPatch(serviceEndpoint.getVersion().getPatch());
156
157                 ServiceEndPoint endpoint = new ServiceEndPoint();
158                 endpoint.setName(buildServiceNameForVnf(serviceEndpoint.getName()));
159
160                 endpoint.setVersion(ver);
161                 endpoint.setHostAddress(serviceEndpoint.getHostAddress());
162                 endpoint.setListenPort(serviceEndpoint.getListenPort());
163                 endpoint.setLatitude(serviceEndpoint.getLatitude());
164                 endpoint.setLongitude(serviceEndpoint.getLongitude());
165                 endpoint.setContextPath(serviceEndpoint.getContextPath());
166                 endpoint.setRouteOffer(serviceEndpoint.getRouteOffer());
167                 
168                 OperationalInfo operInfo = new OperationalInfo();
169                 operInfo.setCreatedBy(serviceEndpoint.getOperationalInfo().getCreatedBy());
170                 operInfo.setUpdatedBy(serviceEndpoint.getOperationalInfo().getUpdatedBy());
171                 
172                 endpoint.setOperationalInfo(operInfo);
173                 endpoint.setProperties(serviceEndpoint.getProperties());
174                         
175                 String env = getEnvironmentName(serviceEndpoint.getProperties());
176                 
177                 ServiceEndPointRequest serviceEndPontRequest = new ServiceEndPointRequest();
178                 serviceEndPontRequest.setEnv(env);
179                 serviceEndPontRequest.setServiceEndPoint(endpoint);
180                 
181                 return serviceEndPontRequest;
182         }
183         
184         
185         protected String getEnvironmentName(List<Property> props) {
186                 String env = "";
187                 for(Property prop : props) {
188                         if(prop.getName().equalsIgnoreCase("Environment")) {
189                                 env = prop.getValue();
190                         }
191                 }
192                 return env;
193         }
194         
195         
196         protected String buildServiceNameForVnf(String fqName) throws TenantIsolationException {
197                 // Service name format is: {tenantContext}.{workloadContext}.{serviceName}  e.g. TEST.ECOMP_PSL.Inventory
198                 // We need to extract the serviceName, in the above example: "Inventory"
199                 String[] tokens = fqName.split("[.]");
200                 String serviceName;
201                 if(tokens.length > 0) {
202                         serviceName = tokens[tokens.length-1];
203                 }
204                 else {
205                         throw new TenantIsolationException("Fully qualified service name is null.");
206                 }
207                 String tenantContext = request.getRequestDetails().getRequestParameters().getTenantContext();
208                 String workloadContext = request.getRequestDetails().getRequestParameters().getWorkloadContext();
209                 return tenantContext + "." + workloadContext + "." + serviceName;
210         }
211         
212         protected String getSearchKey(AAIOperationalEnvironment aaiEnv)  {
213                 return aaiEnv.getTenantContext() + "." + aaiEnv.getWorkloadContext() + ".*";
214         }
215
216         public void setRequest(CloudOrchestrationRequest request) {
217                 this.request = request;
218         }
219         
220         private GRMClient getGrmClient() {
221                 if(grmClient == null) {
222                         this.grmClient = new GRMClient();
223                 }
224                 
225                 return grmClient;
226         }
227 }