6e17679e4c3624f16022a8dd7bfeffd0ec78d9d7
[sdc.git] /
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 import static org.openecomp.sdc.versioning.dao.impl.zusammen.ItemZusammenDaoImpl.ItemInfoProperty.ITEM_TYPE;
22
23 import com.amdocs.zusammen.adaptor.inbound.api.types.item.ZusammenElement;
24 import com.amdocs.zusammen.datatypes.SessionContext;
25 import com.amdocs.zusammen.datatypes.item.Action;
26 import com.amdocs.zusammen.datatypes.item.ElementContext;
27 import com.amdocs.zusammen.datatypes.item.Info;
28 import java.io.ByteArrayInputStream;
29 import java.util.Collection;
30 import java.util.stream.Collectors;
31 import lombok.AllArgsConstructor;
32 import lombok.Getter;
33 import org.openecomp.core.zusammen.api.ZusammenAdaptor;
34 import org.openecomp.sdc.datatypes.model.ElementType;
35 import org.openecomp.sdc.datatypes.model.ItemType;
36 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
37 import org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen.convertor.ElementToVSPGeneralConvertor;
38 import org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen.convertor.ElementToVSPQuestionnaireConvertor;
39 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.OnboardingMethod;
40 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
41 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspQuestionnaireEntity;
42 import org.openecomp.sdc.versioning.ActionVersioningManagerFactory;
43 import org.openecomp.sdc.versioning.dao.types.Version;
44 import org.openecomp.sdc.versioning.types.VersionableEntityMetadata;
45 import org.openecomp.sdc.versioning.types.VersionableEntityStoreType;
46
47 public class VendorSoftwareProductInfoDaoZusammenImpl implements VendorSoftwareProductInfoDao {
48
49     private static final String EMPTY_DATA = "{}";
50     private ZusammenAdaptor zusammenAdaptor;
51
52     public VendorSoftwareProductInfoDaoZusammenImpl(ZusammenAdaptor zusammenAdaptor) {
53         this.zusammenAdaptor = zusammenAdaptor;
54     }
55
56     @Override
57     public void registerVersioning(String versionableEntityType) {
58         VersionableEntityMetadata metadata = new VersionableEntityMetadata(VersionableEntityStoreType.Zusammen, "VendorSoftwareProduct", null, null);
59         ActionVersioningManagerFactory.getInstance().createInterface().register(versionableEntityType, metadata);
60     }
61
62     @Override
63     public Collection<VspDetails> list(VspDetails entity) {
64         return zusammenAdaptor.listItems(createSessionContext()).stream()
65             .filter(item -> ItemType.vsp.getName().equals(item.getInfo().getProperty(ITEM_TYPE.getName())))
66             .map(new ElementToVSPGeneralConvertor()::convert)
67             .collect(Collectors.toList());
68     }
69
70     @Override
71     public void create(VspDetails vspDetails) {
72         ZusammenElement generalElement = mapVspDetailsToZusammenElement(vspDetails, Action.CREATE);
73         SessionContext context = createSessionContext();
74         ElementContext elementContext = new ElementContext(vspDetails.getId(), vspDetails.getVersion().getId());
75         zusammenAdaptor.saveElement(context, elementContext, generalElement, "Create VSP General Info Element");
76         createVspStructure(context, elementContext);
77     }
78
79     private void createVspStructure(SessionContext context, ElementContext elementContext) {
80         createOrchestrationTemplateCandidateStructure(context, elementContext);
81         createVspModelStructure(context, elementContext);
82         zusammenAdaptor.saveElement(context, elementContext, buildStructuralElement(ElementType.DeploymentFlavors, Action.CREATE),
83             "Create VSP Deployment Flavors Element");
84         zusammenAdaptor
85             .saveElement(context, elementContext, buildStructuralElement(ElementType.Processes, Action.CREATE), "Create VSP Processes Element");
86     }
87
88     private void createOrchestrationTemplateCandidateStructure(SessionContext context, ElementContext elementContext) {
89         ByteArrayInputStream emptyData = new ByteArrayInputStream(EMPTY_DATA.getBytes());
90         ZusammenElement candidateContentElement = buildStructuralElement(ElementType.OrchestrationTemplateCandidateContent, Action.CREATE);
91         candidateContentElement.setData(emptyData);
92         ZusammenElement validationData = buildStructuralElement(ElementType.OrchestrationTemplateCandidateValidationData, Action.CREATE);
93         ZusammenElement candidateElement = buildStructuralElement(ElementType.OrchestrationTemplateCandidate, Action.CREATE);
94         candidateElement.setData(emptyData);
95         candidateElement.addSubElement(candidateContentElement);
96         candidateElement.addSubElement(validationData);
97         zusammenAdaptor.saveElement(context, elementContext, candidateElement, "Create Orchestration Template Candidate Elements");
98     }
99
100     private void createVspModelStructure(SessionContext context, ElementContext elementContext) {
101         ZusammenElement vspModel = buildStructuralElement(ElementType.VspModel, Action.CREATE);
102         vspModel.addSubElement(buildOrchestrationTemplateStructure());
103         vspModel.addSubElement(buildStructuralElement(ElementType.Networks, Action.CREATE));
104         vspModel.addSubElement(buildStructuralElement(ElementType.Components, Action.CREATE));
105         vspModel.addSubElement(buildStructuralElement(ElementType.ComponentDependencies, Action.CREATE));
106         ZusammenElement templates = buildStructuralElement(ElementType.Templates, Action.CREATE);
107         ZusammenElement artifacts = buildStructuralElement(ElementType.Artifacts, Action.CREATE);
108         vspModel.addSubElement(buildServiceModelStructure(ElementType.ServiceModel, templates, artifacts));
109         vspModel.addSubElement(buildServiceModelStructure(ElementType.EnrichedServiceModel, templates, artifacts));
110         zusammenAdaptor.saveElement(context, elementContext, vspModel, "Create VSP Model Elements");
111     }
112
113     private ZusammenElement buildOrchestrationTemplateStructure() {
114         ByteArrayInputStream emptyData = new ByteArrayInputStream(EMPTY_DATA.getBytes());
115         ZusammenElement validationData = buildStructuralElement(ElementType.OrchestrationTemplateValidationData, Action.CREATE);
116         validationData.setData(emptyData);
117         ZusammenElement orchestrationTemplateStructure = buildStructuralElement(ElementType.OrchestrationTemplateStructure, Action.CREATE);
118         validationData.setData(emptyData);
119         ZusammenElement orchestrationTemplate = buildStructuralElement(ElementType.OrchestrationTemplate, Action.CREATE);
120         orchestrationTemplate.setData(emptyData);
121         orchestrationTemplate.addSubElement(validationData);
122         orchestrationTemplate.addSubElement(orchestrationTemplateStructure);
123         return orchestrationTemplate;
124     }
125
126     private ZusammenElement buildServiceModelStructure(ElementType serviceModelElementType, ZusammenElement templates, ZusammenElement artifacts) {
127         ZusammenElement serviceModel = buildStructuralElement(serviceModelElementType, Action.CREATE);
128         serviceModel.addSubElement(templates);
129         serviceModel.addSubElement(artifacts);
130         return serviceModel;
131     }
132
133     @Override
134     public void update(VspDetails vspDetails) {
135         ZusammenElement generalElement = mapVspDetailsToZusammenElement(vspDetails, Action.UPDATE);
136         SessionContext context = createSessionContext();
137         zusammenAdaptor.saveElement(context, new ElementContext(vspDetails.getId(), vspDetails.getVersion().getId()), generalElement,
138             "Update VSP General Info Element");
139     }
140
141     @Override
142     public VspDetails get(VspDetails vspDetails) {
143         SessionContext context = createSessionContext();
144         ElementContext elementContext = new ElementContext(vspDetails.getId(), vspDetails.getVersion().getId());
145         return zusammenAdaptor.getElementInfoByName(context, elementContext, null, ElementType.VendorSoftwareProduct.name())
146             .map(new ElementToVSPGeneralConvertor()::convert).map(vsp -> {
147                 vsp.setId(vspDetails.getId());
148                 vsp.setVersion(vspDetails.getVersion());
149                 return vsp;
150             }).orElse(null);
151     }
152
153     @Override
154     public void delete(VspDetails vspDetails) {
155         SessionContext context = createSessionContext();
156         ElementContext elementContext = new ElementContext(vspDetails.getId(), vspDetails.getVersion().getId());
157         zusammenAdaptor
158             .saveElement(context, elementContext, buildStructuralElement(ElementType.VspModel, Action.DELETE), "Delete VSP Model Elements");
159         createVspModelStructure(context, elementContext);
160     }
161
162     @Override
163     public void updateQuestionnaireData(String vspId, Version version, String questionnaireData) {
164         SessionContext context = createSessionContext();
165         ZusammenElement questionnaireElement = mapQuestionnaireToZusammenElement(questionnaireData);
166         zusammenAdaptor.saveElement(context, new ElementContext(vspId, version.getId()), questionnaireElement, "Update VSP Questionnaire");
167     }
168
169     @Override
170     public VspQuestionnaireEntity getQuestionnaire(String vspId, Version version) {
171         SessionContext context = createSessionContext();
172         VspQuestionnaireEntity entity = new ElementToVSPQuestionnaireConvertor().convert(
173             zusammenAdaptor.getElementByName(context, new ElementContext(vspId, version.getId()), null, ElementType.VSPQuestionnaire.name())
174                 .orElse(null));
175         entity.setId(vspId);
176         entity.setVersion(version);
177         return entity;
178     }
179
180     @Override
181     public boolean isManual(String vspId, Version version) {
182         final VspDetails vspDetails = get(new VspDetails(vspId, version));
183         return vspDetails != null && OnboardingMethod.Manual.name().equals(vspDetails.getOnboardingMethod());
184     }
185
186     private ZusammenElement mapVspDetailsToZusammenElement(VspDetails vspDetails, Action action) {
187         ZusammenElement generalElement = buildStructuralElement(ElementType.VendorSoftwareProduct, action);
188         addVspDetailsToInfo(generalElement.getInfo(), vspDetails);
189         return generalElement;
190     }
191
192     private ZusammenElement mapQuestionnaireToZusammenElement(String questionnaireData) {
193         ZusammenElement questionnaireElement = buildStructuralElement(ElementType.VSPQuestionnaire, Action.UPDATE);
194         questionnaireElement.setData(new ByteArrayInputStream(questionnaireData.getBytes()));
195         return questionnaireElement;
196     }
197
198     private void addVspDetailsToInfo(final Info info, final VspDetails vspDetails) {
199         info.addProperty(InfoPropertyName.NAME.getValue(), vspDetails.getName());
200         info.addProperty(InfoPropertyName.DESCRIPTION.getValue(), vspDetails.getDescription());
201         info.addProperty(InfoPropertyName.ICON.getValue(), vspDetails.getIcon());
202         info.addProperty(InfoPropertyName.CATEGORY.getValue(), vspDetails.getCategory());
203         info.addProperty(InfoPropertyName.SUB_CATEGORY.getValue(), vspDetails.getSubCategory());
204         info.addProperty(InfoPropertyName.VENDOR_ID.getValue(), vspDetails.getVendorId());
205         info.addProperty(InfoPropertyName.VENDOR_NAME.getValue(), vspDetails.getVendorName());
206         if (vspDetails.getVlmVersion() != null) {
207             info.addProperty(InfoPropertyName.VENDOR_VERSION.getValue(), vspDetails.getVlmVersion().getId());
208         }
209         info.addProperty(InfoPropertyName.LICENSE_TYPE.getValue(), vspDetails.getLicenseType());
210         info.addProperty(InfoPropertyName.LICENSE_AGREEMENT.getValue(), vspDetails.getLicenseAgreement());
211         info.addProperty(InfoPropertyName.FEATURE_GROUPS.getValue(), vspDetails.getFeatureGroups());
212         info.addProperty(InfoPropertyName.ON_BOARDING_METHOD.getValue(), vspDetails.getOnboardingMethod());
213         if (!vspDetails.getModelIdList().isEmpty()) {
214             info.addProperty(InfoPropertyName.MODELS.getValue(), vspDetails.getModelIdList());
215         }
216     }
217
218     @AllArgsConstructor
219     @Getter
220     public enum InfoPropertyName {
221         // @formatter:off
222         NAME("name"),
223         DESCRIPTION("description"),
224         ICON("icon"),
225         CATEGORY("category"),
226         SUB_CATEGORY("subCategory"),
227         VENDOR_ID("vendorId"),
228         VENDOR_NAME("vendorName"),
229         VENDOR_VERSION("vendorVersion"),
230         LICENSE_TYPE("licenseType"),
231         LICENSE_AGREEMENT("licenseAgreement"),
232         FEATURE_GROUPS("featureGroups"),
233         ON_BOARDING_METHOD("onboardingMethod"),
234         MODELS("models");
235         // @formatter:on
236
237         private final String value;
238
239     }
240 }