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