AT&T 1712 and 1802 release code
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / openecomp / mso / 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.openecomp.mso.apihandlerinfra.tenantisolation.process;
22
23 import java.util.ArrayList;
24 import java.util.List;
25
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;
41
42 import com.fasterxml.jackson.databind.ObjectMapper;
43
44 public class CreateVnfOperationalEnvironment extends OperationalEnvironmentProcess {
45         
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;
50     
51         public CreateVnfOperationalEnvironment(CloudOrchestrationRequest request, String requestId) {
52                 super(request, requestId);
53         MsoLogger.setServiceName (getRequestId());
54         MsoLogger.setLogContext(getRequestId(), getRequest().getOperationalEnvironmentId());
55         }
56
57
58         @Override
59         public void execute() {
60                 try {
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);
65         
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);
74                         }
75                         //Replicate end-point for VNF Operating environment in GRM
76                         List<ServiceEndPointRequest> serviceEndpointRequestList = buildEndPointRequestList(sel);
77                         int ctr = 0;
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);
82                         }
83                         
84                         //Create VNF operating in A&AI
85                         getAaiHelper().createOperationalEnvironment(getAaiClientObjectBuilder().buildAAIOperationalEnvironment("INACTIVE"));
86                         getAaiHelper().createRelationship(getRequest().getOperationalEnvironmentId(), getEcompManagingEnvironmentId());
87                         
88                         //Update request database
89                         getRequestDb().updateInfraSuccessCompletion("SUCCESSFULLY created VNF operational environment", getRequestId(), getRequest().getOperationalEnvironmentId()); 
90                 }
91                 catch(Exception e) {
92                         msoLogger.error(MessageEnum.APIH_GENERAL_EXCEPTION, "", "", "", MsoLogger.ErrorCode.DataError, e.getMessage());
93                         getRequestDb().updateInfraFailureCompletion(e.getMessage(), requestId, getRequest().getOperationalEnvironmentId());
94                 }
95         }
96         
97         
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();
102                 } else {
103                         throw new TenantIsolationException("Unable to get Managing ECOMP Environment ID, request related instance list is empty!");
104                 }
105         }
106         
107         
108         protected String getTenantContext() throws TenantIsolationException {
109                 if(!StringUtils.isEmpty(getRequest().getRequestDetails().getRequestParameters().getTenantContext())) {
110                         return getRequest().getRequestDetails().getRequestParameters().getTenantContext();
111                 }
112                 else {
113                         throw new TenantIsolationException("Tenant Context is missing from request!");
114                 }
115         }
116         
117         
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));
124                 }
125                 return serviceEndPointRequestList;
126         }
127         
128         
129         private ServiceEndPointRequest buildServiceEndpoint(ServiceEndPoint serviceEndpoint) throws TenantIsolationException {
130                 
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());
136
137                 ServiceEndPoint endpoint = new ServiceEndPoint();
138                 endpoint.setName(buildServiceNameForVnf(serviceEndpoint.getName())); 
139                 
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());
147                 
148                 OperationalInfo operInfo = new OperationalInfo();
149                 operInfo.setCreatedBy(serviceEndpoint.getOperationalInfo().getCreatedBy());
150                 operInfo.setUpdatedBy(serviceEndpoint.getOperationalInfo().getUpdatedBy());
151                 
152                 endpoint.setOperationalInfo(operInfo);
153                 endpoint.setProperties(serviceEndpoint.getProperties());
154                         
155                 String env = getEnvironmentName(serviceEndpoint.getProperties());
156                 
157                 ServiceEndPointRequest serviceEndPontRequest = new ServiceEndPointRequest();
158                 serviceEndPontRequest.setEnv(env);
159                 serviceEndPontRequest.setServiceEndPoint(endpoint);
160                 
161                 return serviceEndPontRequest;
162         }
163         
164         
165         protected String getEnvironmentName(List<Property> props) {
166                 String env = "";
167                 for(Property prop : props) {
168                         if(prop.getName().equalsIgnoreCase("Environment")) {
169                                 env = prop.getValue();
170                         }
171                 }
172                 return env;
173         }
174         
175         
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("[.]");
180                 String serviceName;
181                 if(tokens.length > 0) {
182                         serviceName = tokens[tokens.length-1];
183                 }
184                 else {
185                         throw new TenantIsolationException("Fully qualified service name is null.");
186                 }
187                 String tenantContext = getRequest().getRequestDetails().getRequestParameters().getTenantContext();
188                 String workloadContext = getRequest().getRequestDetails().getRequestParameters().getWorkloadContext();
189                 return tenantContext + "." + workloadContext + "." + serviceName;
190         }
191         
192
193         protected GRMClient getGRMClient() {
194                 if(this.grmClient == null) {
195                         this.grmClient = new GRMClient();
196                 }
197                 return this.grmClient;
198         }
199
200         
201         protected String getSearchKey(AAIOperationalEnvironment aaiEnv)  {
202                 return aaiEnv.getTenantContext() + "." + aaiEnv.getWorkloadContext() + ".*";
203         }
204         
205         protected ObjectMapper getObjectMapper() {
206                 return mapper;
207         }
208
209
210         @Override
211         protected String getServiceName() {
212                 return CreateVnfOperationalEnvironment.SERVICE_NAME;
213         }
214
215
216 }