1 package org.openecomp.sdc.model.impl.zusammen;
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;
28 import java.io.ByteArrayInputStream;
29 import java.util.Collection;
31 import java.util.Objects;
32 import java.util.Optional;
33 import java.util.stream.Collectors;
35 import static org.openecomp.core.zusammen.api.ZusammenUtil.buildElement;
36 import static org.openecomp.core.zusammen.api.ZusammenUtil.buildStructuralElement;
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().forEach((key, value) -> templatesElement.addSubElement(
86 buildServiceTemplateElement(key, value, serviceModel.getEntryDefinitionServiceTemplate(), Action.CREATE)));
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)));
94 ZusammenElement serviceModelElement = buildServiceModelElement(serviceModel.getEntryDefinitionServiceTemplate());
96 serviceModelElement.addSubElement(templatesElement);
97 serviceModelElement.addSubElement(artifactsElement);
99 ZusammenElement vspModel = buildStructuralElement(ElementType.VspModel, Action.IGNORE);
100 vspModel.addSubElement(serviceModelElement);
102 SessionContext context = ZusammenUtil.createSessionContext();
103 ElementContext elementContext = new ElementContext(vspId, version.getId());
104 zusammenAdaptor.saveElement(context, elementContext, vspModel, "Store service model");
107 .info("Finished storing {} for VendorSoftwareProduct id -> {}", elementType.name(), vspId);
111 public ServiceElement getServiceModelInfo(String vspId, Version version, String name) {
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());
120 SessionContext context = ZusammenUtil.createSessionContext();
121 ElementContext elementContext = new ElementContext(vspId, version.getId());
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());
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())));
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);
154 zusammenAdaptor.saveElement(context, elementContext, serviceModelElement,
155 String.format("Delete content of Templates and Artifacts of %s", elementType.name()));
157 logger.info("Finished deleting content of Templates and Artifacts of {} of vsp {} version {}",
158 elementType.name(), vspId, version.getId());
162 public void overrideServiceModel(String vspId,
164 ToscaServiceModel serviceModel) {
165 SessionContext context = ZusammenUtil.createSessionContext();
166 ElementContext elementContext = new ElementContext(vspId, version.getId());
168 Optional<ElementInfo> origServiceModel = getServiceModelElementInfo(context, elementContext);
169 if (!origServiceModel.isPresent()) {
172 Id serviceModelElementId = origServiceModel.get().getId();
174 ZusammenElement serviceModelElement = buildServiceModelElement(serviceModel.getEntryDefinitionServiceTemplate());
175 serviceModelElement.setElementId(serviceModelElementId);
177 overrideServiceTemplates(serviceModelElementId, serviceModel, context, elementContext, serviceModelElement);
179 zusammenAdaptor.saveElement(context, elementContext, serviceModelElement, "Override service model");
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()) {
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);
201 private Optional<ElementInfo> getServiceModelElementInfo(SessionContext context,
202 ElementContext elementContext) {
203 Collection<ElementInfo> vspModelSubs = zusammenAdaptor
204 .listElementsByName(context, elementContext, null, ElementType.VspModel.name());
206 return vspModelSubs.stream()
207 .filter(elementInfo -> elementInfo.getInfo() != null
208 && elementType.name().equals(elementInfo.getInfo().getName()))
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());
218 if (templatesElementInfo.isPresent()) {
219 Collection<Element> elements = zusammenAdaptor.listElementData(context, elementContext,
220 templatesElementInfo.get().getId());
222 return elements.stream().collect(Collectors.toMap(
223 element -> element.getInfo().getName(),
224 this::elementToServiceTemplate));
229 private FileContentHandler getArtifacts(SessionContext context, ElementContext elementContext,
230 Id serviceModelElementId) {
231 Optional<ElementInfo> artifactsElement = zusammenAdaptor.getElementInfoByName(
232 context, elementContext, serviceModelElementId, ElementType.Artifacts.name());
234 if (artifactsElement.isPresent()) {
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(),
241 return fileContentHandler;
247 private ZusammenElement buildServiceModelElement(String entryDefinitionServiceTemplate) {
248 ZusammenElement serviceModelElement = buildStructuralElement(elementType, Action.UPDATE);
249 serviceModelElement.getInfo().addProperty(BASE_PROPERTY, entryDefinitionServiceTemplate);
250 return serviceModelElement;
253 private Element buildServiceTemplateElement(String name, ServiceTemplate serviceTemplate,
254 String entryDefinitionServiceTemplate,
256 ZusammenElement zusammenElement = buildElement(null, action);
257 Info info = new Info();
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;
268 protected ZusammenElement buildArtifactElement(String name, byte[] artifact, Action action) {
269 ZusammenElement artifactElement = buildElement(null, action);
270 Info info = new Info();
272 info.addProperty(ElementPropertyName.elementType.name(), ElementType.Artifact.name());
273 artifactElement.setInfo(info);
274 artifactElement.setData(new ByteArrayInputStream(artifact));
276 return artifactElement;
280 private ServiceTemplate elementToServiceTemplate(Element element) {
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());