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