security check issues
[sdc/dcae-d/dt-be-main.git] / dcaedt_tools / src / main / java / tools / DeployTemplate.java
1 package tools;
2 import com.google.gson.JsonObject;
3 import json.templateInfo.TemplateInfo;
4 import org.onap.sdc.dcae.composition.restmodels.CreateVFCMTRequest;
5 import org.onap.sdc.dcae.composition.restmodels.sdc.ResourceDetailed;
6 import org.onap.sdc.dcae.composition.util.DcaeBeConstants;
7 import utilities.IDcaeRestClient;
8 import utilities.IReport;
9
10 import java.util.ArrayList;
11 import java.util.List;
12 import java.util.Map;
13 import java.util.concurrent.atomic.AtomicInteger;
14
15
16 public class DeployTemplate {
17     private static final String FAILED_UPDATE_VFCMT = "Failed update vfcmt: ";
18     private static final String FAILED = "failed";
19     private final IReport report;
20     private final IDcaeRestClient dcaeRestClient;
21     private LoggerError errLogger = LoggerError.getInstance();
22     private LoggerDebug debugLogger = LoggerDebug.getInstance();
23
24     DeployTemplate(IReport report, IDcaeRestClient dcaeRestClient) {
25
26         this.report = report;
27         this.dcaeRestClient = dcaeRestClient;
28     }
29
30     public void deploy(Map<TemplateInfo, JsonObject> templateInfoToJsonObjectMap) {
31         ArrayList<ResourceDetailed> vfcmtList = new ArrayList<>();
32         List<ResourceDetailed> regularVfcmtList = dcaeRestClient.getAllVfcmts();
33         if (regularVfcmtList != null) {
34             vfcmtList.addAll(regularVfcmtList);
35         }
36         List<ResourceDetailed> baseVfcmtList = dcaeRestClient.getAllBaseVfcmts();
37         if (baseVfcmtList != null) {
38             vfcmtList.addAll(baseVfcmtList);
39         }
40
41         List<TemplateInfo> updatedTemplateInfos = new ArrayList<>();
42         vfcmtList.forEach(vfcmt ->
43                 templateInfoToJsonObjectMap.keySet().stream().filter(templateInfo -> templateInfo.getName().equalsIgnoreCase(vfcmt.getName())).forEach(templateInfo -> {
44                     update(vfcmt, templateInfo, templateInfoToJsonObjectMap.get(templateInfo));
45                     updatedTemplateInfos.add(templateInfo);
46                 }));
47         templateInfoToJsonObjectMap.keySet().stream()
48                 .filter(templateInfo -> !updatedTemplateInfos.contains(templateInfo))
49                 .forEach(templateInfo -> createNew(templateInfo, templateInfoToJsonObjectMap.get(templateInfo)));
50
51         verify(templateInfoToJsonObjectMap);
52     }
53
54     private void verify(Map<TemplateInfo, JsonObject> templateInfoToJsonObjectMap) {
55         AtomicInteger foundCount = new AtomicInteger();
56         debugLogger.log("Starting verify deployment");
57         ArrayList<ResourceDetailed> vfcmtList = new ArrayList<>();
58         List<ResourceDetailed> regularVfcmtList = dcaeRestClient.getAllVfcmts();
59         if (regularVfcmtList != null) {
60             vfcmtList.addAll(regularVfcmtList);
61         }
62         List<ResourceDetailed> baseVfcmtList = dcaeRestClient.getAllBaseVfcmts();
63         if (baseVfcmtList != null) {
64             vfcmtList.addAll(baseVfcmtList);
65         }
66
67         templateInfoToJsonObjectMap.keySet()
68                 .forEach(templateInfo -> vfcmtList.stream()
69                         .filter(vfcmt -> vfcmt.getName().equalsIgnoreCase(templateInfo.getName()))
70                         .forEach(vfcmt -> foundCount.getAndIncrement()));
71         if (foundCount.get() == templateInfoToJsonObjectMap.size()) {
72             debugLogger.log("Deployment verify finished successfully");
73         } else {
74             errLogger.log("Deployment verify finished successfully");
75             String msg = "Deployment verify finished with errors, found only: " +
76                     foundCount.get() + " of " + templateInfoToJsonObjectMap.size() + " vfcmts";
77             report.addErrorMessage(msg);
78             errLogger.log(msg);
79         }
80     }
81
82     private void createNew(TemplateInfo templateInfo, JsonObject jsonObject) {
83         try {
84             CreateVFCMTRequest createVFCMTRequest = new CreateVFCMTRequest();
85             createVFCMTRequest.setName(templateInfo.getName());
86             createVFCMTRequest.setDescription(templateInfo.getDescription());
87             createVFCMTRequest.setSubcategory(templateInfo.getSubCategory());
88             createVFCMTRequest.setCategory(templateInfo.getCategory());
89             ResourceDetailed vfcmt = dcaeRestClient.createResource(createVFCMTRequest);
90
91             saveAndCertify(jsonObject, vfcmt);
92
93         } catch (Exception e) {
94             String msg = FAILED_UPDATE_VFCMT + templateInfo.getName() + ", With general message: " + e.getMessage();
95             report.addErrorMessage(msg);
96             errLogger.log(msg + " " + e);
97             report.setStatusCode(2);
98         }
99     }
100
101     private void update(ResourceDetailed vfcmt, TemplateInfo templateInfo, JsonObject jsonObject) {
102         ResourceDetailed checkedoutVfcmt = vfcmt;
103         try {
104             boolean vfcmtIsCheckedOut = isCheckedOut(vfcmt);
105             if (vfcmtIsCheckedOut && differentUserCannotCheckout(dcaeRestClient.getUserId(), vfcmt)){
106                 report.addErrorMessage(FAILED_UPDATE_VFCMT + vfcmt.getName() + ", cannot checkout vfcmt");
107                 return;
108             }
109             if (templateInfo.getUpdateIfExist()) {
110                 if (!vfcmtIsCheckedOut) {
111                     checkedoutVfcmt = dcaeRestClient.checkoutVfcmt(vfcmt.getUuid());
112                 }
113                 if (checkedoutVfcmt != null) {
114                     checkedoutVfcmt.setSubCategory(templateInfo.getSubCategory());
115                     checkedoutVfcmt.setCategory(templateInfo.getCategory());
116                     checkedoutVfcmt.setDescription(templateInfo.getDescription());
117                     dcaeRestClient.updateResource(checkedoutVfcmt);
118                     saveAndCertify(jsonObject, checkedoutVfcmt);
119                 }
120             } else {
121                 report.addNotUpdatedMessage("vfcmt: " + vfcmt.getName() + " found, but didn't update.");
122             }
123         } catch (Exception e) {
124             String msg = FAILED_UPDATE_VFCMT + vfcmt.getName() + ", With general message: " + e.getMessage();
125             report.addErrorMessage(msg);
126             errLogger.log( msg + " " + e);
127                         report.setStatusCode(2);
128         }
129     }
130
131     private void saveAndCertify(JsonObject jsonObject, ResourceDetailed checkedoutVfcmt) {
132                 jsonObject.addProperty("cid", checkedoutVfcmt.getUuid());
133         if (saveCompositionAndCertify(checkedoutVfcmt, jsonObject)) {
134             report.addUpdatedMessage("vfcmt: " + checkedoutVfcmt.getName() + " updated successfully");
135         } else {
136             report.addErrorMessage("VFCMT " + checkedoutVfcmt.getName() + " failed to update");
137         }
138     }
139
140     private boolean saveCompositionAndCertify(ResourceDetailed vfcmt, JsonObject jsonObject) {
141         if (vfcmt.getUuid() == null) {
142             return false;
143         }
144
145         debugLogger.log("Saving cdump of: " + vfcmt.getName() + " vfcmt");
146         debugLogger.log(jsonObject.toString());
147
148         String responseEntity = dcaeRestClient.saveComposition(vfcmt.getUuid(), jsonObject.toString());
149         if (responseEntity.equalsIgnoreCase(FAILED)) {
150             String msg = "Failed saving vfcmt: " + vfcmt.getName();
151             report.addErrorMessage(msg);
152             errLogger.log(msg);
153             return false;
154         }
155         dcaeRestClient.certifyVfcmt(vfcmt.getUuid());
156         return true;
157     }
158
159     private boolean isCheckedOut(ResourceDetailed asset) {
160         return DcaeBeConstants.LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT == DcaeBeConstants.LifecycleStateEnum.findState(asset.getLifecycleState());
161     }
162
163     private Boolean differentUserCannotCheckout(String userId, ResourceDetailed asset) {
164         String lastUpdaterUserId = asset.getLastUpdaterUserId();
165         if (lastUpdaterUserId != null && !lastUpdaterUserId.equals(userId)) {
166             String msg = "User conflicts. Operation not allowed for user "+userId+" on resource checked out by "+lastUpdaterUserId;
167             report.addErrorMessage(msg);
168             errLogger.log(msg);
169             return true;
170         } else {
171             return false;
172         }
173     }
174 }