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.sdc.ci.tests.utils;
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;
30 import java.util.Map.Entry;
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;
52 import com.clearspring.analytics.util.Pair;
53 import com.google.gson.Gson;
55 import fj.data.Either;
57 public class DistributionUtils extends BaseRestUtils{
59 final static String serviceDistributionSuffix = "/sdc/v1/catalog/services/";
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;
73 public static ServiceDistributionStatus getLatestServiceDistributionObjectFromMap(Map<Long, ServiceDistributionStatus> serviceDistributionStatusMap) {
75 ServiceDistributionStatus serviceDistributionStatus = null;
76 if (serviceDistributionStatusMap.size() == 1 ){
77 for (Entry<Long, ServiceDistributionStatus> entry : serviceDistributionStatusMap.entrySet()) {
78 return entry.getValue();
82 serviceDistributionStatus = getFilteredServiceDistributionObject(serviceDistributionStatusMap);
85 return serviceDistributionStatus;
88 private static ServiceDistributionStatus getFilteredServiceDistributionObject(Map<Long, ServiceDistributionStatus> serviceDistributionStatusMap) {
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));
96 public static Map<String, String> getArtifactsMapOfDistributedService(Service service) throws Exception{
98 Map<String, String> expectedDistributionArtifactMap = new HashMap<String, String>();
99 expectedDistributionArtifactMap = addServiceDeploymentArtifactToMap(service, expectedDistributionArtifactMap);
100 expectedDistributionArtifactMap = addComponentInstancesDeploymentArtifactToMap(service, expectedDistributionArtifactMap);
102 return expectedDistributionArtifactMap;
106 public static Map<String, String> addServiceDeploymentArtifactToMap(Service service, Map<String, String> distributionArtifactMap){
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);
116 return distributionArtifactMap;
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;
124 public static String buildResourceInstanceDeploymentUrl(Service service, String artifactName, String artifactUUID){
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;
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();
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);
155 return distributionArtifactMap;
160 public static RestResponse getDistributionStatus(User sdncModifierDetails, String distributionId) throws IOException {
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());
171 * @return parsed distribution list of DistributionMonitorObject java objects
172 * @throws JSONException
174 public static Map<String, List<DistributionMonitorObject>> getSortedDistributionStatus(RestResponse response) throws JSONException{
176 ArrayList<DistributionMonitorObject> distributionStatusList = new ArrayList<DistributionMonitorObject>();
177 String responseString = response.getResponse();
179 JSONArray jsonArray = null;
180 jObject = new JSONObject(responseString);
181 jsonArray = jObject.getJSONArray("distributionStatusList");
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);
189 Map<String, List<DistributionMonitorObject>> sortedDistributionMapByConsumer = sortDistributionStatusByConsumer(distributionStatusList);
191 return sortedDistributionMapByConsumer;
195 * @param distributionStatusList
196 * @return sorted distribution map where key is consumer name and value contains list of corresponded DistributionMonitorObject java object
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);
209 list.add(distributionListElement);
210 distributionStatusMapByConsumer.put(key, list);
214 return distributionStatusMapByConsumer;
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
223 public static Pair<Boolean, Map<String, List<String>>> verifyDistributionStatus(Map<String, List<DistributionMonitorObject>> map){
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();
234 case "NOTIFIED": notifiedCount++;
238 case "DOWNLOAD_OK": downloadCount++;
240 case "DEPLOY_OK": deployCount++;
243 failedList.add("Url " + distributionStatus.getUrl() + " failed with status " + distributionStatus.getStatus());
247 if((notifiedCount != downloadCount || notifiedCount != deployCount) && notifiedCount != 0){
248 consumerStatusMap.put(distributionMonitor.getKey(), failedList);
251 if(notifiedCount == 0){
256 if(!flag.contains(false)){
257 return Pair.create(true, consumerStatusMap);
259 return Pair.create(false, consumerStatusMap);