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