1 package org.openecomp.sdc.model.impl.zusammen;
3 import static org.openecomp.core.zusammen.api.ZusammenUtil.buildElement;
4 import static org.openecomp.core.zusammen.api.ZusammenUtil.buildStructuralElement;
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;
31 import java.io.ByteArrayInputStream;
32 import java.util.Collection;
34 import java.util.Objects;
35 import java.util.Optional;
36 import java.util.stream.Collectors;
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);
43 protected ZusammenAdaptor zusammenAdaptor;
44 protected ElementType elementType;
46 public ServiceModelDaoZusammenImpl(ZusammenAdaptor zusammenAdaptor) {
47 this.zusammenAdaptor = zusammenAdaptor;
48 this.elementType = ElementType.ServiceModel;
52 public void registerVersioning(String versionableEntityType) {
57 public ToscaServiceModel getServiceModel(String vspId, Version version) {
58 SessionContext context = ZusammenUtil.createSessionContext();
59 ElementContext elementContext = new ElementContext(vspId, version.getId());
61 Optional<ElementInfo> serviceModel = getServiceModelElementInfo(context, elementContext);
62 if (!serviceModel.isPresent()) {
66 Id serviceModelElementId = serviceModel.get().getId();
67 Map<String, ServiceTemplate> serviceTemplates =
68 getTemplates(context, elementContext, serviceModelElementId);
69 if (serviceTemplates == null) {
73 FileContentHandler artifacts = getArtifacts(context, elementContext, serviceModelElementId);
74 String entryDefinitionServiceTemplate =
75 serviceModel.get().getInfo().getProperty(BASE_PROPERTY);
77 return new ToscaServiceModel(artifacts, serviceTemplates, entryDefinitionServiceTemplate);
81 public void storeServiceModel(String vspId, Version version, ToscaServiceModel serviceModel) {
82 logger.info("Storing service model for VendorSoftwareProduct id -> {}", vspId);
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)));
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)));
96 ZusammenElement serviceModelElement = buildStructuralElement(elementType, Action.UPDATE);
97 serviceModelElement.getInfo()
98 .addProperty(BASE_PROPERTY, serviceModel.getEntryDefinitionServiceTemplate());
100 serviceModelElement.addSubElement(templatesElement);
101 serviceModelElement.addSubElement(artifactsElement);
103 ZusammenElement vspModel = buildStructuralElement(ElementType.VspModel, Action.IGNORE);
104 vspModel.addSubElement(serviceModelElement);
106 SessionContext context = ZusammenUtil.createSessionContext();
107 ElementContext elementContext = new ElementContext(vspId, version.getId());
108 zusammenAdaptor.saveElement(context, elementContext, vspModel, "Store service model");
111 .info("Finished storing {} for VendorSoftwareProduct id -> {}", elementType.name(), vspId);
115 public ServiceElement getServiceModelInfo(String vspId, Version version, String name) {
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());
124 SessionContext context = ZusammenUtil.createSessionContext();
125 ElementContext elementContext = new ElementContext(vspId, version.getId());
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());
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())));
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);
158 zusammenAdaptor.saveElement(context, elementContext, serviceModelElement,
159 String.format("Delete content of Templates and Artifacts of %s", elementType.name()));
161 logger.info("Finished deleting content of Templates and Artifacts of {} of vsp {} version {}",
162 elementType.name(), vspId, version.getId());
166 public void overrideServiceModel(String vspId,
168 ToscaServiceModel serviceModel) {
169 SessionContext context = ZusammenUtil.createSessionContext();
170 ElementContext elementContext = new ElementContext(vspId, version.getId());
172 ZusammenElement serviceModelElement = buildStructuralElement(elementType, Action.IGNORE);
174 Optional<ElementInfo> origServiceModel = getServiceModelElementInfo(context, elementContext);
175 if (!origServiceModel.isPresent()) {
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());
184 zusammenAdaptor.saveElement(context, elementContext, serviceModelElement, "Override service model");
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()) {
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);
206 private Optional<ElementInfo> getServiceModelElementInfo(SessionContext context,
207 ElementContext elementContext) {
208 Collection<ElementInfo> vspModelSubs = zusammenAdaptor
209 .listElementsByName(context, elementContext, null, ElementType.VspModel.name());
211 return vspModelSubs.stream()
212 .filter(elementInfo -> elementInfo.getInfo() != null
213 && elementType.name().equals(elementInfo.getInfo().getName()))
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());
223 if (templatesElementInfo.isPresent()) {
224 Collection<Element> elements = zusammenAdaptor.listElementData(context, elementContext,
225 templatesElementInfo.get().getId());
227 return elements.stream().collect(Collectors.toMap(
228 element -> element.getInfo().getName(),
229 this::elementToServiceTemplate));
234 private FileContentHandler getArtifacts(SessionContext context, ElementContext elementContext,
235 Id serviceModelElementId) {
236 Optional<ElementInfo> artifactsElement = zusammenAdaptor.getElementInfoByName(
237 context, elementContext, serviceModelElementId, ElementType.Artifacts.name());
239 if (artifactsElement.isPresent()) {
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(),
246 return fileContentHandler;
252 private Element buildServiceTemplateElement(String name, ServiceTemplate serviceTemplate,
253 String entryDefinitionServiceTemplate,
255 ZusammenElement zusammenElement = buildElement(null, action);
256 Info info = new Info();
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;
267 protected ZusammenElement buildArtifactElement(String name, byte[] artifact, Action action) {
268 ZusammenElement artifactElement = buildElement(null, action);
269 Info info = new Info();
271 info.addProperty(ElementPropertyName.elementType.name(), ElementType.Artifact.name());
272 artifactElement.setInfo(info);
273 artifactElement.setData(new ByteArrayInputStream(artifact));
275 return artifactElement;
279 private ServiceTemplate elementToServiceTemplate(Element element) {
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());