Specify a model while creating a VSP
[sdc.git] / openecomp-be / lib / openecomp-sdc-vendor-software-product-lib / openecomp-sdc-vendor-software-product-core / src / main / java / org / openecomp / sdc / vendorsoftwareproduct / dao / impl / zusammen / VendorSoftwareProductInfoDaoZusammenImpl.java
1 /*
2  * Copyright © 2016-2018 European Support Limited
3  * Modifications Copyright (C) 2021 Nordix Foundation.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 package org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen;
18
19 import static org.openecomp.core.zusammen.api.ZusammenUtil.buildStructuralElement;
20 import static org.openecomp.core.zusammen.api.ZusammenUtil.createSessionContext;
21
22 import com.amdocs.zusammen.adaptor.inbound.api.types.item.ZusammenElement;
23 import com.amdocs.zusammen.datatypes.SessionContext;
24 import com.amdocs.zusammen.datatypes.item.Action;
25 import com.amdocs.zusammen.datatypes.item.ElementContext;
26 import com.amdocs.zusammen.datatypes.item.Info;
27 import java.io.ByteArrayInputStream;
28 import java.util.Collection;
29 import java.util.stream.Collectors;
30 import lombok.AllArgsConstructor;
31 import lombok.Getter;
32 import org.openecomp.core.zusammen.api.ZusammenAdaptor;
33 import org.openecomp.sdc.datatypes.model.ElementType;
34 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
35 import org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen.convertor.ElementToVSPGeneralConvertor;
36 import org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen.convertor.ElementToVSPQuestionnaireConvertor;
37 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.OnboardingMethod;
38 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
39 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspQuestionnaireEntity;
40 import org.openecomp.sdc.versioning.ActionVersioningManagerFactory;
41 import org.openecomp.sdc.versioning.dao.types.Version;
42 import org.openecomp.sdc.versioning.types.VersionableEntityMetadata;
43 import org.openecomp.sdc.versioning.types.VersionableEntityStoreType;
44
45 public class VendorSoftwareProductInfoDaoZusammenImpl implements VendorSoftwareProductInfoDao {
46
47     private static final String EMPTY_DATA = "{}";
48     private ZusammenAdaptor zusammenAdaptor;
49
50     public VendorSoftwareProductInfoDaoZusammenImpl(ZusammenAdaptor zusammenAdaptor) {
51         this.zusammenAdaptor = zusammenAdaptor;
52     }
53
54     @Override
55     public void registerVersioning(String versionableEntityType) {
56         VersionableEntityMetadata metadata = new VersionableEntityMetadata(VersionableEntityStoreType.Zusammen, "VendorSoftwareProduct", null, null);
57         ActionVersioningManagerFactory.getInstance().createInterface().register(versionableEntityType, metadata);
58     }
59
60     @Override
61     public Collection<VspDetails> list(VspDetails entity) {
62         return zusammenAdaptor.listItems(createSessionContext()).stream()
63             .filter(item -> "VendorSoftwareProduct".equals(item.getInfo().getProperty("item_type"))).map(new ElementToVSPGeneralConvertor()::convert)
64             .collect(Collectors.toList());
65     }
66
67     @Override
68     public void create(VspDetails vspDetails) {
69         ZusammenElement generalElement = mapVspDetailsToZusammenElement(vspDetails, Action.CREATE);
70         SessionContext context = createSessionContext();
71         ElementContext elementContext = new ElementContext(vspDetails.getId(), vspDetails.getVersion().getId());
72         zusammenAdaptor.saveElement(context, elementContext, generalElement, "Create VSP General Info Element");
73         createVspStructure(context, elementContext);
74     }
75
76     private void createVspStructure(SessionContext context, ElementContext elementContext) {
77         createOrchestrationTemplateCandidateStructure(context, elementContext);
78         createVspModelStructure(context, elementContext);
79         zusammenAdaptor.saveElement(context, elementContext, buildStructuralElement(ElementType.DeploymentFlavors, Action.CREATE),
80             "Create VSP Deployment Flavors Element");
81         zusammenAdaptor
82             .saveElement(context, elementContext, buildStructuralElement(ElementType.Processes, Action.CREATE), "Create VSP Processes Element");
83     }
84
85     private void createOrchestrationTemplateCandidateStructure(SessionContext context, ElementContext elementContext) {
86         ByteArrayInputStream emptyData = new ByteArrayInputStream(EMPTY_DATA.getBytes());
87         ZusammenElement candidateContentElement = buildStructuralElement(ElementType.OrchestrationTemplateCandidateContent, Action.CREATE);
88         candidateContentElement.setData(emptyData);
89         ZusammenElement validationData = buildStructuralElement(ElementType.OrchestrationTemplateCandidateValidationData, Action.CREATE);
90         ZusammenElement candidateElement = buildStructuralElement(ElementType.OrchestrationTemplateCandidate, Action.CREATE);
91         candidateElement.setData(emptyData);
92         candidateElement.addSubElement(candidateContentElement);
93         candidateElement.addSubElement(validationData);
94         zusammenAdaptor.saveElement(context, elementContext, candidateElement, "Create Orchestration Template Candidate Elements");
95     }
96
97     private void createVspModelStructure(SessionContext context, ElementContext elementContext) {
98         ZusammenElement vspModel = buildStructuralElement(ElementType.VspModel, Action.CREATE);
99         vspModel.addSubElement(buildOrchestrationTemplateStructure());
100         vspModel.addSubElement(buildStructuralElement(ElementType.Networks, Action.CREATE));
101         vspModel.addSubElement(buildStructuralElement(ElementType.Components, Action.CREATE));
102         vspModel.addSubElement(buildStructuralElement(ElementType.ComponentDependencies, Action.CREATE));
103         ZusammenElement templates = buildStructuralElement(ElementType.Templates, Action.CREATE);
104         ZusammenElement artifacts = buildStructuralElement(ElementType.Artifacts, Action.CREATE);
105         vspModel.addSubElement(buildServiceModelStructure(ElementType.ServiceModel, templates, artifacts));
106         vspModel.addSubElement(buildServiceModelStructure(ElementType.EnrichedServiceModel, templates, artifacts));
107         zusammenAdaptor.saveElement(context, elementContext, vspModel, "Create VSP Model Elements");
108     }
109
110     private ZusammenElement buildOrchestrationTemplateStructure() {
111         ByteArrayInputStream emptyData = new ByteArrayInputStream(EMPTY_DATA.getBytes());
112         ZusammenElement validationData = buildStructuralElement(ElementType.OrchestrationTemplateValidationData, Action.CREATE);
113         validationData.setData(emptyData);
114         ZusammenElement orchestrationTemplateStructure = buildStructuralElement(ElementType.OrchestrationTemplateStructure, Action.CREATE);
115         validationData.setData(emptyData);
116         ZusammenElement orchestrationTemplate = buildStructuralElement(ElementType.OrchestrationTemplate, Action.CREATE);
117         orchestrationTemplate.setData(emptyData);
118         orchestrationTemplate.addSubElement(validationData);
119         orchestrationTemplate.addSubElement(orchestrationTemplateStructure);
120         return orchestrationTemplate;
121     }
122
123     private ZusammenElement buildServiceModelStructure(ElementType serviceModelElementType, ZusammenElement templates, ZusammenElement artifacts) {
124         ZusammenElement serviceModel = buildStructuralElement(serviceModelElementType, Action.CREATE);
125         serviceModel.addSubElement(templates);
126         serviceModel.addSubElement(artifacts);
127         return serviceModel;
128     }
129
130     @Override
131     public void update(VspDetails vspDetails) {
132         ZusammenElement generalElement = mapVspDetailsToZusammenElement(vspDetails, Action.UPDATE);
133         SessionContext context = createSessionContext();
134         zusammenAdaptor.saveElement(context, new ElementContext(vspDetails.getId(), vspDetails.getVersion().getId()), generalElement,
135             "Update VSP General Info Element");
136     }
137
138     @Override
139     public VspDetails get(VspDetails vspDetails) {
140         SessionContext context = createSessionContext();
141         ElementContext elementContext = new ElementContext(vspDetails.getId(), vspDetails.getVersion().getId());
142         return zusammenAdaptor.getElementInfoByName(context, elementContext, null, ElementType.VendorSoftwareProduct.name())
143             .map(new ElementToVSPGeneralConvertor()::convert).map(vsp -> {
144                 vsp.setId(vspDetails.getId());
145                 vsp.setVersion(vspDetails.getVersion());
146                 return vsp;
147             }).orElse(null);
148     }
149
150     @Override
151     public void delete(VspDetails vspDetails) {
152         SessionContext context = createSessionContext();
153         ElementContext elementContext = new ElementContext(vspDetails.getId(), vspDetails.getVersion().getId());
154         zusammenAdaptor
155             .saveElement(context, elementContext, buildStructuralElement(ElementType.VspModel, Action.DELETE), "Delete VSP Model Elements");
156         createVspModelStructure(context, elementContext);
157     }
158
159     @Override
160     public void updateQuestionnaireData(String vspId, Version version, String questionnaireData) {
161         SessionContext context = createSessionContext();
162         ZusammenElement questionnaireElement = mapQuestionnaireToZusammenElement(questionnaireData);
163         zusammenAdaptor.saveElement(context, new ElementContext(vspId, version.getId()), questionnaireElement, "Update VSP Questionnaire");
164     }
165
166     @Override
167     public VspQuestionnaireEntity getQuestionnaire(String vspId, Version version) {
168         SessionContext context = createSessionContext();
169         VspQuestionnaireEntity entity = new ElementToVSPQuestionnaireConvertor().convert(
170             zusammenAdaptor.getElementByName(context, new ElementContext(vspId, version.getId()), null, ElementType.VSPQuestionnaire.name())
171                 .orElse(null));
172         entity.setId(vspId);
173         entity.setVersion(version);
174         return entity;
175     }
176
177     @Override
178     public boolean isManual(String vspId, Version version) {
179         final VspDetails vspDetails = get(new VspDetails(vspId, version));
180         return vspDetails != null && OnboardingMethod.Manual.name().equals(vspDetails.getOnboardingMethod());
181     }
182
183     private ZusammenElement mapVspDetailsToZusammenElement(VspDetails vspDetails, Action action) {
184         ZusammenElement generalElement = buildStructuralElement(ElementType.VendorSoftwareProduct, action);
185         addVspDetailsToInfo(generalElement.getInfo(), vspDetails);
186         return generalElement;
187     }
188
189     private ZusammenElement mapQuestionnaireToZusammenElement(String questionnaireData) {
190         ZusammenElement questionnaireElement = buildStructuralElement(ElementType.VSPQuestionnaire, Action.UPDATE);
191         questionnaireElement.setData(new ByteArrayInputStream(questionnaireData.getBytes()));
192         return questionnaireElement;
193     }
194
195     private void addVspDetailsToInfo(final Info info, final VspDetails vspDetails) {
196         info.addProperty(InfoPropertyName.NAME.getValue(), vspDetails.getName());
197         info.addProperty(InfoPropertyName.DESCRIPTION.getValue(), vspDetails.getDescription());
198         info.addProperty(InfoPropertyName.ICON.getValue(), vspDetails.getIcon());
199         info.addProperty(InfoPropertyName.CATEGORY.getValue(), vspDetails.getCategory());
200         info.addProperty(InfoPropertyName.SUB_CATEGORY.getValue(), vspDetails.getSubCategory());
201         info.addProperty(InfoPropertyName.VENDOR_ID.getValue(), vspDetails.getVendorId());
202         info.addProperty(InfoPropertyName.VENDOR_NAME.getValue(), vspDetails.getVendorName());
203         if (vspDetails.getVlmVersion() != null) {
204             info.addProperty(InfoPropertyName.VENDOR_VERSION.getValue(), vspDetails.getVlmVersion().getId());
205         }
206         info.addProperty(InfoPropertyName.LICENSE_TYPE.getValue(), vspDetails.getLicenseType());
207         info.addProperty(InfoPropertyName.LICENSE_AGREEMENT.getValue(), vspDetails.getLicenseAgreement());
208         info.addProperty(InfoPropertyName.FEATURE_GROUPS.getValue(), vspDetails.getFeatureGroups());
209         info.addProperty(InfoPropertyName.ON_BOARDING_METHOD.getValue(), vspDetails.getOnboardingMethod());
210         if (!vspDetails.getModelIdList().isEmpty()) {
211             info.addProperty(InfoPropertyName.MODELS.getValue(), vspDetails.getModelIdList());
212         }
213     }
214
215     @AllArgsConstructor
216     @Getter
217     public enum InfoPropertyName {
218         // @formatter:off
219         NAME("name"),
220         DESCRIPTION("description"),
221         ICON("icon"),
222         CATEGORY("category"),
223         SUB_CATEGORY("subCategory"),
224         VENDOR_ID("vendorId"),
225         VENDOR_NAME("vendorName"),
226         VENDOR_VERSION("vendorVersion"),
227         LICENSE_TYPE("licenseType"),
228         LICENSE_AGREEMENT("licenseAgreement"),
229         FEATURE_GROUPS("featureGroups"),
230         ON_BOARDING_METHOD("onboardingMethod"),
231         MODELS("models");
232         // @formatter:on
233
234         private final String value;
235
236     }
237 }