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.openecomp.mso.apihandlerinfra.tenantisolation.process;
23 import java.util.ArrayList;
24 import java.util.List;
26 import org.openecomp.mso.apihandlerinfra.tenantisolation.CloudOrchestrationRequest;
27 import org.openecomp.mso.apihandlerinfra.tenantisolation.exceptions.TenantIsolationException;
28 import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RelatedInstanceList;
29 import org.openecomp.mso.client.aai.entities.AAIResultWrapper;
30 import org.openecomp.mso.client.aai.objects.AAIOperationalEnvironment;
31 import org.openecomp.mso.client.grm.GRMClient;
32 import org.openecomp.mso.client.grm.beans.OperationalInfo;
33 import org.openecomp.mso.client.grm.beans.Property;
34 import org.openecomp.mso.client.grm.beans.ServiceEndPoint;
35 import org.openecomp.mso.client.grm.beans.ServiceEndPointList;
36 import org.openecomp.mso.client.grm.beans.ServiceEndPointRequest;
37 import org.openecomp.mso.client.grm.beans.Version;
38 import org.openecomp.mso.logger.MessageEnum;
39 import org.openecomp.mso.logger.MsoLogger;
40 import org.apache.commons.lang3.StringUtils;
42 import com.fasterxml.jackson.databind.ObjectMapper;
44 public class CreateVnfOperationalEnvironment extends OperationalEnvironmentProcess {
46 private static final String SERVICE_NAME = "CreateVnfOperationalEnvironment";
47 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
48 private ObjectMapper mapper = new ObjectMapper();
49 private GRMClient grmClient;
51 public CreateVnfOperationalEnvironment(CloudOrchestrationRequest request, String requestId) {
52 super(request, requestId);
53 MsoLogger.setServiceName (getRequestId());
54 MsoLogger.setLogContext(getRequestId(), getRequest().getOperationalEnvironmentId());
59 public void execute() {
61 msoLogger.debug("Begin of execute method in " + SERVICE_NAME);
62 //Retrieve ECOMP Managing environment info in A&AI
63 AAIResultWrapper aaiResultWrapper = getAaiHelper().getAaiOperationalEnvironment(getEcompManagingEnvironmentId());
64 AAIOperationalEnvironment aaiEnv = mapper.readValue(aaiResultWrapper.getJson(), AAIOperationalEnvironment.class);
66 //Find ECOMP environments in GRM
67 msoLogger.debug(" Start of GRM findRunningServicesAsString");
68 String searchKey = getSearchKey(aaiEnv);
69 String tenantContext = getTenantContext().toUpperCase();
70 String jsonResponse = getGRMClient().findRunningServicesAsString(searchKey, 1, tenantContext);
71 ServiceEndPointList sel = getObjectMapper().readValue(jsonResponse, ServiceEndPointList.class);
72 if(sel.getServiceEndPointList().size() == 0) {
73 throw new TenantIsolationException("GRM did not find any matches for " + searchKey + " in " + tenantContext);
75 //Replicate end-point for VNF Operating environment in GRM
76 List<ServiceEndPointRequest> serviceEndpointRequestList = buildEndPointRequestList(sel);
78 int total = serviceEndpointRequestList.size();
79 for(ServiceEndPointRequest request : serviceEndpointRequestList) {
80 msoLogger.debug("Creating endpoint " + ++ctr + " of " + total + ": " + request.getServiceEndPoint().getName());
81 getGRMClient().addServiceEndPoint(request);
84 //Create VNF operating in A&AI
85 getAaiHelper().createOperationalEnvironment(getAaiClientObjectBuilder().buildAAIOperationalEnvironment("INACTIVE"));
86 getAaiHelper().createRelationship(getRequest().getOperationalEnvironmentId(), getEcompManagingEnvironmentId());
88 //Update request database
89 getRequestDb().updateInfraSuccessCompletion("SUCCESSFULLY created VNF operational environment", getRequestId(), getRequest().getOperationalEnvironmentId());
92 msoLogger.error(MessageEnum.APIH_GENERAL_EXCEPTION, "", "", "", MsoLogger.ErrorCode.DataError, e.getMessage());
93 getRequestDb().updateInfraFailureCompletion(e.getMessage(), requestId, getRequest().getOperationalEnvironmentId());
98 protected String getEcompManagingEnvironmentId() throws TenantIsolationException {
99 RelatedInstanceList[] relatedInstances = getRequest().getRequestDetails().getRelatedInstanceList();
100 if (relatedInstances.length > 0 && relatedInstances[0].getRelatedInstance() != null) {
101 return relatedInstances[0].getRelatedInstance().getInstanceId();
103 throw new TenantIsolationException("Unable to get Managing ECOMP Environment ID, request related instance list is empty!");
108 protected String getTenantContext() throws TenantIsolationException {
109 if(!StringUtils.isEmpty(getRequest().getRequestDetails().getRequestParameters().getTenantContext())) {
110 return getRequest().getRequestDetails().getRequestParameters().getTenantContext();
113 throw new TenantIsolationException("Tenant Context is missing from request!");
118 private List<ServiceEndPointRequest> buildEndPointRequestList(ServiceEndPointList serviceEndPointList) throws TenantIsolationException {
119 List<ServiceEndPoint> endpointList = serviceEndPointList.getServiceEndPointList();
120 msoLogger.debug("Number of service endpoints from GRM: " + endpointList.size());
121 List<ServiceEndPointRequest> serviceEndPointRequestList = new ArrayList<ServiceEndPointRequest>();
122 for(ServiceEndPoint serviceEndpoint : endpointList) {
123 serviceEndPointRequestList.add(buildServiceEndpoint(serviceEndpoint));
125 return serviceEndPointRequestList;
129 private ServiceEndPointRequest buildServiceEndpoint(ServiceEndPoint serviceEndpoint) throws TenantIsolationException {
131 //@TODO: handle nulls? Put in a ServiceEndpointWrapper class which will check for nulls and flatten access to fields
132 Version ver = new Version();
133 ver.setMajor(serviceEndpoint.getVersion().getMajor());
134 ver.setMinor(serviceEndpoint.getVersion().getMinor());
135 ver.setPatch(serviceEndpoint.getVersion().getPatch());
137 ServiceEndPoint endpoint = new ServiceEndPoint();
138 endpoint.setName(buildServiceNameForVnf(serviceEndpoint.getName()));
140 endpoint.setVersion(ver);
141 endpoint.setHostAddress(serviceEndpoint.getHostAddress());
142 endpoint.setListenPort(serviceEndpoint.getListenPort());
143 endpoint.setLatitude(serviceEndpoint.getLatitude());
144 endpoint.setLongitude(serviceEndpoint.getLongitude());
145 endpoint.setContextPath(serviceEndpoint.getContextPath());
146 endpoint.setRouteOffer(serviceEndpoint.getRouteOffer());
148 OperationalInfo operInfo = new OperationalInfo();
149 operInfo.setCreatedBy(serviceEndpoint.getOperationalInfo().getCreatedBy());
150 operInfo.setUpdatedBy(serviceEndpoint.getOperationalInfo().getUpdatedBy());
152 endpoint.setOperationalInfo(operInfo);
153 endpoint.setProperties(serviceEndpoint.getProperties());
155 String env = getEnvironmentName(serviceEndpoint.getProperties());
157 ServiceEndPointRequest serviceEndPontRequest = new ServiceEndPointRequest();
158 serviceEndPontRequest.setEnv(env);
159 serviceEndPontRequest.setServiceEndPoint(endpoint);
161 return serviceEndPontRequest;
165 protected String getEnvironmentName(List<Property> props) {
167 for(Property prop : props) {
168 if(prop.getName().equalsIgnoreCase("Environment")) {
169 env = prop.getValue();
176 protected String buildServiceNameForVnf(String fqName) throws TenantIsolationException {
177 // Service name format is: {tenantContext}.{workloadContext}.{serviceName} e.g. TEST.ECOMP_PSL.Inventory
178 // We need to extract the serviceName, in the above example: "Inventory"
179 String[] tokens = fqName.split("[.]");
181 if(tokens.length > 0) {
182 serviceName = tokens[tokens.length-1];
185 throw new TenantIsolationException("Fully qualified service name is null.");
187 String tenantContext = getRequest().getRequestDetails().getRequestParameters().getTenantContext();
188 String workloadContext = getRequest().getRequestDetails().getRequestParameters().getWorkloadContext();
189 return tenantContext + "." + workloadContext + "." + serviceName;
193 protected GRMClient getGRMClient() {
194 if(this.grmClient == null) {
195 this.grmClient = new GRMClient();
197 return this.grmClient;
201 protected String getSearchKey(AAIOperationalEnvironment aaiEnv) {
202 return aaiEnv.getTenantContext() + "." + aaiEnv.getWorkloadContext() + ".*";
205 protected ObjectMapper getObjectMapper() {
211 protected String getServiceName() {
212 return CreateVnfOperationalEnvironment.SERVICE_NAME;