2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.onap.so.apihandlerinfra.tenantisolation.process;
23 import java.util.ArrayList;
24 import java.util.List;
26 import javax.ws.rs.NotFoundException;
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;
54 import com.fasterxml.jackson.databind.ObjectMapper;
57 public class CreateVnfOperationalEnvironment {
59 private static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.APIH, CreateVnfOperationalEnvironment.class);
60 protected CloudOrchestrationRequest request;
63 private AAIClientObjectBuilder aaiClientObjectBuilder;
65 private AAIClientHelper aaiHelper;
67 private RequestsDBHelper requestDb;
68 private GRMClient grmClient;
70 public void execute(String requestId, CloudOrchestrationRequest request) throws ApiException{
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");
78 AAIOperationalEnvironment aaiEnv = objectMapper.readValue(aaiResultWrapper.getJson(), AAIOperationalEnvironment.class);
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);
90 //Replicate end-point for VNF Operating environment in GRM
91 List<ServiceEndPointRequest> serviceEndpointRequestList = buildEndPointRequestList(sel);
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);
99 //Create VNF operating in A&AI
100 aaiHelper.createOperationalEnvironment(aaiClientObjectBuilder.buildAAIOperationalEnvironment("INACTIVE", request));
101 aaiHelper.createRelationship(request.getOperationalEnvironmentId(), getEcompManagingEnvironmentId());
103 //Update request database
104 requestDb.updateInfraSuccessCompletion("SUCCESSFULLY created VNF operational environment", requestId, request.getOperationalEnvironmentId());
106 }catch(Exception e) {
107 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_GENERAL_EXCEPTION, MsoLogger.ErrorCode.DataError).build();
110 ValidateException validateException = new ValidateException.Builder(e.getMessage(),
111 HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
113 throw validateException;
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();
128 protected String getTenantContext() throws TenantIsolationException {
129 if(!StringUtils.isEmpty(request.getRequestDetails().getRequestParameters().getTenantContext())) {
130 return request.getRequestDetails().getRequestParameters().getTenantContext();
133 throw new TenantIsolationException("Tenant Context is missing from request!");
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));
145 return serviceEndPointRequestList;
149 private ServiceEndPointRequest buildServiceEndpoint(ServiceEndPoint serviceEndpoint) throws TenantIsolationException {
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());
157 ServiceEndPoint endpoint = new ServiceEndPoint();
158 endpoint.setName(buildServiceNameForVnf(serviceEndpoint.getName()));
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());
168 OperationalInfo operInfo = new OperationalInfo();
169 operInfo.setCreatedBy(serviceEndpoint.getOperationalInfo().getCreatedBy());
170 operInfo.setUpdatedBy(serviceEndpoint.getOperationalInfo().getUpdatedBy());
172 endpoint.setOperationalInfo(operInfo);
173 endpoint.setProperties(serviceEndpoint.getProperties());
175 String env = getEnvironmentName(serviceEndpoint.getProperties());
177 ServiceEndPointRequest serviceEndPontRequest = new ServiceEndPointRequest();
178 serviceEndPontRequest.setEnv(env);
179 serviceEndPontRequest.setServiceEndPoint(endpoint);
181 return serviceEndPontRequest;
185 protected String getEnvironmentName(List<Property> props) {
187 for(Property prop : props) {
188 if(prop.getName().equalsIgnoreCase("Environment")) {
189 env = prop.getValue();
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("[.]");
201 if(tokens.length > 0) {
202 serviceName = tokens[tokens.length-1];
205 throw new TenantIsolationException("Fully qualified service name is null.");
207 String tenantContext = request.getRequestDetails().getRequestParameters().getTenantContext();
208 String workloadContext = request.getRequestDetails().getRequestParameters().getWorkloadContext();
209 return tenantContext + "." + workloadContext + "." + serviceName;
212 protected String getSearchKey(AAIOperationalEnvironment aaiEnv) {
213 return aaiEnv.getTenantContext() + "." + aaiEnv.getWorkloadContext() + ".*";
216 public void setRequest(CloudOrchestrationRequest request) {
217 this.request = request;
220 private GRMClient getGrmClient() {
221 if(grmClient == null) {
222 this.grmClient = new GRMClient();