7bc3436f2226016db4571f71bb96bb6af781302a
[sdc.git] / openecomp-be / lib / openecomp-sdc-model-lib / openecomp-sdc-model-impl / src / main / java / org / openecomp / sdc / model / impl / zusammen / ServiceModelDaoZusammenImpl.java
1 package org.openecomp.sdc.model.impl.zusammen;
2
3 import static org.openecomp.core.zusammen.api.ZusammenUtil.buildElement;
4 import static org.openecomp.core.zusammen.api.ZusammenUtil.buildStructuralElement;
5
6 import com.amdocs.zusammen.adaptor.inbound.api.types.item.Element;
7 import com.amdocs.zusammen.adaptor.inbound.api.types.item.ElementInfo;
8 import com.amdocs.zusammen.adaptor.inbound.api.types.item.ZusammenElement;
9 import com.amdocs.zusammen.datatypes.Id;
10 import com.amdocs.zusammen.datatypes.SessionContext;
11 import com.amdocs.zusammen.datatypes.item.Action;
12 import com.amdocs.zusammen.datatypes.item.ElementContext;
13 import com.amdocs.zusammen.datatypes.item.Info;
14 import org.apache.commons.io.IOUtils;
15 import org.openecomp.core.model.dao.ServiceModelDao;
16 import org.openecomp.core.model.errors.RetrieveServiceTemplateFromDbErrorBuilder;
17 import org.openecomp.core.model.types.ServiceElement;
18 import org.openecomp.core.utilities.file.FileContentHandler;
19 import org.openecomp.core.zusammen.api.ZusammenAdaptor;
20 import org.openecomp.core.zusammen.api.ZusammenUtil;
21 import org.openecomp.sdc.common.errors.CoreException;
22 import org.openecomp.sdc.datatypes.model.ElementType;
23 import org.openecomp.sdc.logging.api.Logger;
24 import org.openecomp.sdc.logging.api.LoggerFactory;
25 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
26 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
27 import org.openecomp.sdc.tosca.services.ToscaExtensionYamlUtil;
28 import org.openecomp.sdc.versioning.dao.types.Version;
29 import org.openecomp.types.ElementPropertyName;
30
31 import java.io.ByteArrayInputStream;
32 import java.util.Collection;
33 import java.util.Map;
34 import java.util.Objects;
35 import java.util.Optional;
36 import java.util.stream.Collectors;
37
38 public class ServiceModelDaoZusammenImpl
39     implements ServiceModelDao<ToscaServiceModel, ServiceElement> {
40   private static final String BASE_PROPERTY = "base";
41   private static final Logger logger = LoggerFactory.getLogger(ServiceModelDaoZusammenImpl.class);
42
43   protected ZusammenAdaptor zusammenAdaptor;
44   protected ElementType elementType;
45
46   public ServiceModelDaoZusammenImpl(ZusammenAdaptor zusammenAdaptor) {
47     this.zusammenAdaptor = zusammenAdaptor;
48     this.elementType = ElementType.ServiceModel;
49   }
50
51   @Override
52   public void registerVersioning(String versionableEntityType) {
53
54   }
55
56   @Override
57   public ToscaServiceModel getServiceModel(String vspId, Version version) {
58     SessionContext context = ZusammenUtil.createSessionContext();
59     ElementContext elementContext = new ElementContext(vspId, version.getId());
60
61     Optional<ElementInfo> serviceModel = getServiceModelElementInfo(context, elementContext);
62     if (!serviceModel.isPresent()) {
63       return null;
64     }
65
66     Id serviceModelElementId = serviceModel.get().getId();
67     Map<String, ServiceTemplate> serviceTemplates =
68         getTemplates(context, elementContext, serviceModelElementId);
69     if (serviceTemplates == null) {
70       return null;
71     }
72
73     FileContentHandler artifacts = getArtifacts(context, elementContext, serviceModelElementId);
74     String entryDefinitionServiceTemplate =
75         serviceModel.get().getInfo().getProperty(BASE_PROPERTY);
76
77     return new ToscaServiceModel(artifacts, serviceTemplates, entryDefinitionServiceTemplate);
78   }
79
80   @Override
81   public void storeServiceModel(String vspId, Version version, ToscaServiceModel serviceModel) {
82     logger.info("Storing service model for VendorSoftwareProduct id -> {}", vspId);
83
84     ZusammenElement templatesElement = buildStructuralElement(ElementType.Templates, Action.UPDATE);
85     serviceModel.getServiceTemplates().entrySet().forEach(entry -> templatesElement.addSubElement(
86         buildServiceTemplateElement(entry.getKey(), entry.getValue(),
87             serviceModel.getEntryDefinitionServiceTemplate(), Action.CREATE)));
88
89     ZusammenElement artifactsElement = buildStructuralElement(ElementType.Artifacts, Action.UPDATE);
90     if (Objects.nonNull(serviceModel.getArtifactFiles())) {
91       serviceModel.getArtifactFiles().getFiles().entrySet()
92           .forEach(entry -> artifactsElement.addSubElement(
93               buildArtifactElement(entry.getKey(), entry.getValue(), Action.CREATE)));
94     }
95
96     ZusammenElement serviceModelElement = buildStructuralElement(elementType, Action.UPDATE);
97     serviceModelElement.getInfo()
98         .addProperty(BASE_PROPERTY, serviceModel.getEntryDefinitionServiceTemplate());
99
100     serviceModelElement.addSubElement(templatesElement);
101     serviceModelElement.addSubElement(artifactsElement);
102
103     ZusammenElement vspModel = buildStructuralElement(ElementType.VspModel, Action.IGNORE);
104     vspModel.addSubElement(serviceModelElement);
105
106     SessionContext context = ZusammenUtil.createSessionContext();
107     ElementContext elementContext = new ElementContext(vspId, version.getId());
108     zusammenAdaptor.saveElement(context, elementContext, vspModel, "Store service model");
109
110     logger
111         .info("Finished storing {} for VendorSoftwareProduct id -> {}", elementType.name(), vspId);
112   }
113
114   @Override
115   public ServiceElement getServiceModelInfo(String vspId, Version version, String name) {
116     return null;
117   }
118
119   @Override
120   public void deleteAll(String vspId, Version version) {
121     logger.info("Started deleting content of Templates and Artifacts of {} of vsp {} version {}",
122         elementType.name(), vspId, version.getId());
123
124     SessionContext context = ZusammenUtil.createSessionContext();
125     ElementContext elementContext = new ElementContext(vspId, version.getId());
126
127     Optional<ElementInfo> serviceModel = getServiceModelElementInfo(context, elementContext);
128     if (!serviceModel.isPresent()) {
129       logger.info("{} of vsp {} version {} does not exist - nothing to delete", elementType.name(),
130           vspId, version.getId());
131       return;
132     }
133
134     ZusammenElement serviceModelElement = buildElement(serviceModel.get().getId(), Action.IGNORE);
135     for (Id serviceModelSubElementId :
136         serviceModel.get().getSubElements().stream()
137             .map(ElementInfo::getId)
138             .collect(Collectors.toSet())) {
139       ElementInfo serviceModelSubElementInfo =
140           zusammenAdaptor.getElementInfo(context, elementContext, serviceModelSubElementId)
141               .orElseThrow(() -> new IllegalStateException(String.format(
142                   "Element %s declared as sub element of element %s (%s) does not exist",
143                   serviceModelSubElementId.getValue(),
144                   serviceModel.get().getId().getValue(),
145                   elementType.name())));
146
147       if (ElementType.Templates.name().equals(serviceModelSubElementInfo.getInfo().getName())
148           || ElementType.Artifacts.name().equals(serviceModelSubElementInfo.getInfo().getName())) {
149         ZusammenElement serviceModelSubElement =
150             buildElement(serviceModelSubElementId, Action.IGNORE);
151         serviceModelSubElement.setSubElements(serviceModelSubElementInfo.getSubElements().stream()
152             .map(elementInfo -> buildElement(elementInfo.getId(), Action.DELETE))
153             .collect(Collectors.toSet()));
154         serviceModelElement.addSubElement(serviceModelSubElement);
155       }
156     }
157
158     zusammenAdaptor.saveElement(context, elementContext, serviceModelElement,
159         String.format("Delete content of Templates and Artifacts of %s", elementType.name()));
160
161     logger.info("Finished deleting content of Templates and Artifacts of {} of vsp {} version {}",
162         elementType.name(), vspId, version.getId());
163   }
164
165   @Override
166   public void overrideServiceModel(String vspId,
167                                    Version version,
168                                    ToscaServiceModel serviceModel) {
169     SessionContext context = ZusammenUtil.createSessionContext();
170     ElementContext elementContext = new ElementContext(vspId, version.getId());
171
172     ZusammenElement serviceModelElement = buildStructuralElement(elementType, Action.IGNORE);
173
174     Optional<ElementInfo> origServiceModel = getServiceModelElementInfo(context, elementContext);
175     if (!origServiceModel.isPresent()) {
176       return;
177     }
178
179     Id serviceModelElementId = origServiceModel.get().getId();
180     serviceModelElement.setElementId(serviceModelElementId);
181     overrideServiceTemplates(serviceModelElementId, serviceModel, context, elementContext, serviceModelElement);
182     serviceModelElement.getInfo().addProperty(BASE_PROPERTY, serviceModel.getEntryDefinitionServiceTemplate());
183
184     zusammenAdaptor.saveElement(context, elementContext, serviceModelElement, "Override service model");
185   }
186
187
188   private void overrideServiceTemplates(Id serviceModelElementId,
189                                         ToscaServiceModel serviceModel,
190                                         SessionContext context,
191                                         ElementContext elementContext,
192                                         ZusammenElement serviceModelElement) {
193     Optional<ElementInfo> elementInfo = zusammenAdaptor.getElementInfoByName(
194         context, elementContext, serviceModelElementId, ElementType.Templates.name());
195     if (!elementInfo.isPresent()) {
196       return;
197     }
198     ZusammenElement templateElement = buildStructuralElement(ElementType.Templates, Action.UPDATE);
199     templateElement.setElementId(elementInfo.get().getId());
200     serviceModel.getServiceTemplates().forEach((templateName, serviceTemplate) -> templateElement.addSubElement(
201         buildServiceTemplateElement(templateName, serviceTemplate,
202             serviceModel.getEntryDefinitionServiceTemplate(), Action.UPDATE)));
203     serviceModelElement.addSubElement(templateElement);
204   }
205
206   private Optional<ElementInfo> getServiceModelElementInfo(SessionContext context,
207                                                            ElementContext elementContext) {
208     Collection<ElementInfo> vspModelSubs = zusammenAdaptor
209         .listElementsByName(context, elementContext, null, ElementType.VspModel.name());
210
211     return vspModelSubs.stream()
212         .filter(elementInfo -> elementInfo.getInfo() != null
213             && elementType.name().equals(elementInfo.getInfo().getName()))
214         .findFirst();
215   }
216
217   private Map<String, ServiceTemplate> getTemplates(SessionContext context,
218                                                     ElementContext elementContext,
219                                                     Id serviceModelElementId) {
220     Optional<ElementInfo> templatesElementInfo = zusammenAdaptor.getElementInfoByName(
221         context, elementContext, serviceModelElementId, ElementType.Templates.name());
222
223     if (templatesElementInfo.isPresent()) {
224       Collection<Element> elements = zusammenAdaptor.listElementData(context, elementContext,
225           templatesElementInfo.get().getId());
226
227       return elements.stream().collect(Collectors.toMap(
228           element -> element.getInfo().getName(),
229           this::elementToServiceTemplate));
230     }
231     return null;
232   }
233
234   private FileContentHandler getArtifacts(SessionContext context, ElementContext elementContext,
235                                           Id serviceModelElementId) {
236     Optional<ElementInfo> artifactsElement = zusammenAdaptor.getElementInfoByName(
237         context, elementContext, serviceModelElementId, ElementType.Artifacts.name());
238
239     if (artifactsElement.isPresent()) {
240
241       Collection<Element> elements = zusammenAdaptor.listElementData(context, elementContext,
242           artifactsElement.get().getId());
243       FileContentHandler fileContentHandler = new FileContentHandler();
244       elements.forEach(element -> fileContentHandler.addFile(element.getInfo().getName(),
245           element.getData()));
246       return fileContentHandler;
247     }
248
249     return null;
250   }
251
252   private Element buildServiceTemplateElement(String name, ServiceTemplate serviceTemplate,
253                                               String entryDefinitionServiceTemplate,
254                                               Action action) {
255     ZusammenElement zusammenElement = buildElement(null, action);
256     Info info = new Info();
257     info.setName(name);
258     info.setDescription(serviceTemplate.getDescription());
259     info.addProperty(ElementPropertyName.elementType.name(), ElementType.ServiceTemplate.name());
260     info.addProperty(BASE_PROPERTY, entryDefinitionServiceTemplate);
261     String yaml = new ToscaExtensionYamlUtil().objectToYaml(serviceTemplate);
262     zusammenElement.setData(new ByteArrayInputStream(yaml.getBytes()));
263     zusammenElement.setInfo(info);
264     return zusammenElement;
265   }
266
267   protected ZusammenElement buildArtifactElement(String name, byte[] artifact, Action action) {
268     ZusammenElement artifactElement = buildElement(null, action);
269     Info info = new Info();
270     info.setName(name);
271     info.addProperty(ElementPropertyName.elementType.name(), ElementType.Artifact.name());
272     artifactElement.setInfo(info);
273     artifactElement.setData(new ByteArrayInputStream(artifact));
274
275     return artifactElement;
276   }
277
278
279   private ServiceTemplate elementToServiceTemplate(Element element) {
280     try {
281       String yamlContent = IOUtils.toString(element.getData());
282       return new ToscaExtensionYamlUtil().
283           yamlToObject(yamlContent, ServiceTemplate.class);
284     } catch (Exception e) {
285       throw new CoreException(
286           new RetrieveServiceTemplateFromDbErrorBuilder(
287               element.getInfo().getName(), e.getMessage()).build());
288     }
289   }
290 }