Sync Integ to Master
[sdc.git] / test-apis-ci / src / main / java / org / openecomp / sdc / ci / tests / utils / DistributionUtils.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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.sdc.ci.tests.utils;
22
23 import java.io.IOException;
24 import java.text.ParseException;
25 import java.util.ArrayList;
26 import java.util.Collections;
27 import java.util.HashMap;
28 import java.util.List;
29 import java.util.Map;
30 import java.util.Map.Entry;
31
32 import org.codehaus.jettison.json.JSONArray;
33 import org.codehaus.jettison.json.JSONException;
34 import org.codehaus.jettison.json.JSONObject;
35 import org.openecomp.sdc.be.model.ArtifactDefinition;
36 import org.openecomp.sdc.be.model.ComponentInstance;
37 import org.openecomp.sdc.be.model.Service;
38 import org.openecomp.sdc.be.model.User;
39 import org.openecomp.sdc.ci.tests.api.Urls;
40 import org.openecomp.sdc.ci.tests.config.Config;
41 import org.openecomp.sdc.ci.tests.datatypes.DistributionMonitorObject;
42 import org.openecomp.sdc.ci.tests.datatypes.ServiceDistributionStatus;
43 import org.openecomp.sdc.ci.tests.datatypes.enums.DistributionNotificationStatusEnum;
44 import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
45 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
46 import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
47 import org.openecomp.sdc.ci.tests.utils.rest.BaseRestUtils;
48 import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
49 import org.openecomp.sdc.ci.tests.utils.rest.ServiceRestUtils;
50 //import org.openecomp.sdc.be.components.distribution.engine.DistributionStatusNotificationEnum;
51
52 import com.clearspring.analytics.util.Pair;
53 import com.google.gson.Gson;
54
55 import fj.data.Either;
56
57  public class DistributionUtils extends BaseRestUtils{
58          
59          final static String serviceDistributionSuffix = "/sdc/v1/catalog/services/";
60
61          public static ServiceDistributionStatus getLatestServiceDistributionObject(Service service) throws IOException, ParseException {
62                         ServiceDistributionStatus serviceDistributionStatus = null;
63                         RestResponse distributionServiceList = ServiceRestUtils.getDistributionServiceList(service, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
64                         Map<Long, ServiceDistributionStatus> serviveDistributionStatusMap = ResponseParser.convertServiceDistributionStatusToObject(distributionServiceList.getResponse());
65                         if(serviveDistributionStatusMap.size() != 0){
66                                 serviceDistributionStatus = getLatestServiceDistributionObjectFromMap(serviveDistributionStatusMap);
67                                 return serviceDistributionStatus;
68                         }
69                         
70                         return null;
71         }
72
73         public static ServiceDistributionStatus getLatestServiceDistributionObjectFromMap(Map<Long, ServiceDistributionStatus> serviceDistributionStatusMap) {
74                 
75                 ServiceDistributionStatus serviceDistributionStatus = null;
76                 if (serviceDistributionStatusMap.size() == 1 ){
77                         for (Entry<Long, ServiceDistributionStatus> entry : serviceDistributionStatusMap.entrySet()) {
78                                 return entry.getValue();
79                         }
80                 }
81                 else{
82                         serviceDistributionStatus = getFilteredServiceDistributionObject(serviceDistributionStatusMap);
83                 }
84                 
85                 return serviceDistributionStatus;
86         }
87
88         private static ServiceDistributionStatus getFilteredServiceDistributionObject(Map<Long, ServiceDistributionStatus> serviceDistributionStatusMap) {
89                 
90                 List<Long> list = new ArrayList<Long>();
91                 list.addAll(serviceDistributionStatusMap.keySet());
92                 Collections.sort(list);
93                 return serviceDistributionStatusMap.get(list.get(list.size() - 1));
94         }
95         
96         public static Map<String, String> getArtifactsMapOfDistributedService(Service service) throws Exception{
97                 
98                 Map<String, String> expectedDistributionArtifactMap = new HashMap<String, String>();
99                 expectedDistributionArtifactMap = addServiceDeploymentArtifactToMap(service, expectedDistributionArtifactMap);
100                 expectedDistributionArtifactMap = addComponentInstancesDeploymentArtifactToMap(service, expectedDistributionArtifactMap);
101                 
102                 return expectedDistributionArtifactMap;
103         }
104         
105         
106         public static Map<String, String> addServiceDeploymentArtifactToMap(Service service, Map<String, String> distributionArtifactMap){
107                 
108                 Map<String, ArtifactDefinition> deploymentArtifacts = service.getDeploymentArtifacts();
109                 if (deploymentArtifacts != null && deploymentArtifacts.size() > 0){
110                         for(Entry<String, ArtifactDefinition> artifact : deploymentArtifacts.entrySet()){
111                                 String url = buildServiceDeploymentUrl(service, artifact.getValue().getArtifactName(), artifact.getValue().getArtifactUUID());
112                                 distributionArtifactMap.put(artifact.getKey(), url);
113                         }
114                 }
115                 
116                 return distributionArtifactMap;
117         }
118         
119         private static String buildServiceDeploymentUrl(Service service, String artifactName, String artifactUUID) {
120 //              format  "/sdc/v1/catalog/services/" + service.getSystemName() + "/" + service.getVersion() + "/artifacts/AAI-" + service.getName() + "-service-1.xml"
121                 return serviceDistributionSuffix + service.getSystemName() + "/" + service.getVersion() + "/artifacts/" + artifactName;
122         }
123
124         public static String buildResourceInstanceDeploymentUrl(Service service, String artifactName, String artifactUUID){
125                 
126 //                      /sdc/v1/catalog/services/Servicefordistribution/1.0  /resourceInstances/nestedfrommarina2   /artifacts/FEAdd_On_Module_vProbeLauncher.yaml
127                 String resourceInstanceNormalizedName = getResourceInstanceNormalizeName(service, artifactName, artifactUUID );
128                 return serviceDistributionSuffix + service.getSystemName() + "/" + service.getVersion() + "/resourceInstances/" + resourceInstanceNormalizedName  +"/artifacts/" + artifactName;
129         }
130         
131         public static String getResourceInstanceNormalizeName(Service service, String artifactName, String artifactUUID) {
132                 for (ComponentInstance componentInstance : service.getComponentInstances()){
133                         for(String key : componentInstance.getDeploymentArtifacts().keySet()){
134                                 if(componentInstance.getDeploymentArtifacts().get(key).getArtifactUUID().equals(artifactUUID)) {
135                                         return componentInstance.getNormalizedName();
136                                 }
137                         }
138                 }
139                 return null;
140         }
141
142         public static Map<String, String> addComponentInstancesDeploymentArtifactToMap(Service service, Map<String, String> distributionArtifactMap){
143 //                      TODO Andrey create correct method to build RI url
144                 if(service.getComponentInstances() != null && service.getComponentInstances().size() != 0){
145                 for(ComponentInstance componentInstance : service.getComponentInstances()){
146                         if (componentInstance.getDeploymentArtifacts() != null && componentInstance.getDeploymentArtifacts().size() != 0){
147                                 for(Entry<String, ArtifactDefinition> artifact : componentInstance.getDeploymentArtifacts().entrySet()){
148                                         String url = buildResourceInstanceDeploymentUrl(service, artifact.getValue().getArtifactName(), artifact.getValue().getArtifactUUID());;
149                                         distributionArtifactMap.put(artifact.getKey(), url);
150                                 }
151                         }
152                 }
153         }
154                 
155                 return distributionArtifactMap;
156         }
157          
158         
159         
160         public static RestResponse getDistributionStatus(User sdncModifierDetails, String distributionId) throws IOException {
161
162                 Config config = Utils.getConfig();
163                 String url = String.format(Urls.DISTRIBUTION_SERVICE_MONITOR, config.getCatalogBeHost(), config.getCatalogBePort(), distributionId);
164                 return sendGet(url, sdncModifierDetails.getUserId());
165                 
166         }
167         
168         
169         /**
170          * @param response
171          * @return parsed distribution list of DistributionMonitorObject java objects
172          * @throws JSONException
173          */
174         public static Map<String, List<DistributionMonitorObject>> getSortedDistributionStatus(RestResponse response) throws JSONException{
175                 
176                 ArrayList<DistributionMonitorObject> distributionStatusList = new ArrayList<DistributionMonitorObject>();
177                 String responseString = response.getResponse();
178                 JSONObject jObject;
179                 JSONArray jsonArray = null;
180                 jObject = new JSONObject(responseString);
181                 jsonArray = jObject.getJSONArray("distributionStatusList");
182                 
183                 Gson gson = new Gson();
184                 for(int i=0; i<jsonArray.length(); i++){
185                         String jsonElement = jsonArray.get(i).toString();
186                         DistributionMonitorObject distributionStatus = gson.fromJson(jsonElement, DistributionMonitorObject.class);
187                         distributionStatusList.add(distributionStatus);
188                 }
189                         Map<String, List<DistributionMonitorObject>> sortedDistributionMapByConsumer = sortDistributionStatusByConsumer(distributionStatusList);
190                 
191                 return sortedDistributionMapByConsumer;
192         }
193
194         /**
195          * @param distributionStatusList
196          * @return sorted distribution map where key is consumer name and value contains list of corresponded DistributionMonitorObject java object
197          */
198         public static Map<String, List<DistributionMonitorObject>> sortDistributionStatusByConsumer(ArrayList<DistributionMonitorObject> distributionStatusList) {
199                 //              sort distribution status list per consumer
200                                 Map<String, List<DistributionMonitorObject>> distributionStatusMapByConsumer = new HashMap<String, List<DistributionMonitorObject>>();
201                                 for(DistributionMonitorObject distributionListElement : distributionStatusList){
202                                         String key = distributionListElement.getOmfComponentID();
203                                         List<DistributionMonitorObject> list = new ArrayList<>();
204                                         if(distributionStatusMapByConsumer.get(key) != null){
205                                                 list = distributionStatusMapByConsumer.get(key);
206                                                 list.add(distributionListElement);
207                                                 distributionStatusMapByConsumer.put(key, list);
208                                         }else{
209                                                 list.add(distributionListElement);
210                                                 distributionStatusMapByConsumer.put(key, list);
211                                         }
212                                         
213                                 }
214                                 return distributionStatusMapByConsumer;
215         }
216         
217         
218         /**
219          * @param pair
220          * @return consumer Status map: if map is empty - all consumers successes download and deploy the artifacts,
221          * else - return failed consumer status per url 
222          */
223         public static Pair<Boolean, Map<String, List<String>>> verifyDistributionStatus(Map<String, List<DistributionMonitorObject>> map){
224                 
225                 Map<String, List<String>> consumerStatusMap = new HashMap<>();
226                 List<Boolean> flag = new ArrayList<>();
227                 for (Entry<String, List<DistributionMonitorObject>> distributionMonitor : map.entrySet()){
228                         int notifiedCount = 0, downloadCount = 0, deployCount = 0;
229                         List<String> failedList = new ArrayList<>();
230                         List<DistributionMonitorObject> listValue = distributionMonitor.getValue();
231                         for(DistributionMonitorObject distributionStatus : listValue){
232                                 String status = distributionStatus.getStatus();
233                                 switch (status) {
234                                 case "NOTIFIED": notifiedCount++;
235                                         break;
236                                 case "NOT_NOTIFIED":
237                                 break;
238                                 case "DOWNLOAD_OK": downloadCount++;
239                                 break;
240                                 case "DEPLOY_OK": deployCount++;
241                                 break;
242                                 default:
243                                         failedList.add("Url " + distributionStatus.getUrl() + " failed with status " + distributionStatus.getStatus());
244                                         break;
245                                 }
246                         }
247                         if((notifiedCount != downloadCount || notifiedCount != deployCount) && notifiedCount != 0){
248                                 consumerStatusMap.put(distributionMonitor.getKey(), failedList);
249                                 flag.add(false);
250                         }
251                         if(notifiedCount == 0){
252                                 flag.add(true);
253                         }
254                 }
255         
256                 if(!flag.contains(false)){
257                         return Pair.create(true, consumerStatusMap);
258                 }else{
259                         return Pair.create(false, consumerStatusMap);
260                 }
261
262         }
263         
264         
265         
266  }