Support for defining attributes on a node_type
[sdc.git] / catalog-model / src / main / java / org / openecomp / sdc / be / model / Resource.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.be.model;
22
23 import java.util.List;
24 import java.util.Map;
25 import java.util.Optional;
26 import java.util.stream.Collectors;
27 import lombok.EqualsAndHashCode;
28 import lombok.Getter;
29 import lombok.Setter;
30 import lombok.ToString;
31
32 import org.openecomp.sdc.be.config.ConfigurationManager;
33 import org.openecomp.sdc.be.dao.utils.MapUtil;
34 import org.openecomp.sdc.be.datatypes.components.ResourceMetadataDataDefinition;
35 import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition;
36 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
37 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
38 import org.openecomp.sdc.be.model.category.CategoryDefinition;
39 import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
40
41 @Getter
42 @Setter
43 @EqualsAndHashCode(callSuper = true)
44 @ToString
45 public class Resource extends Component {
46
47     /**
48      * Please note that more than one "derivedFrom" resource is not currently supported by the app. The first list
49      * element is always addressed.
50      */
51     private List<String> derivedFrom;
52
53     /**
54      * The derivedList is a chain of derivedFrom. e.g. if resource C is derived from resource B that is derived from
55      * resource A - then A, B is the "DerivedList" of resource C
56      */
57     private List<String> derivedList;
58
59     private Map<String, String> derivedFromMapOfIdToName;
60
61     private List<AttributeDataDefinition> attributes;
62
63     private String toscaVersion;
64
65     public Resource() {
66         super(new ResourceMetadataDefinition());
67         this.getComponentMetadataDefinition().getMetadataDataDefinition().setComponentType(ComponentTypeEnum.RESOURCE);
68     }
69
70     public Resource(ComponentMetadataDefinition componentMetadataDefinition) {
71         super(componentMetadataDefinition);
72         if (this.getComponentMetadataDefinition().getMetadataDataDefinition() == null) {
73             this.getComponentMetadataDefinition().componentMetadataDataDefinition =
74                     new ResourceMetadataDataDefinition();
75         }
76         this.getComponentMetadataDefinition().getMetadataDataDefinition().setComponentType(ComponentTypeEnum.RESOURCE);
77     }
78
79     public Boolean isAbstract() {
80         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
81                 .isAbstract();
82     }
83
84     public void setAbstract(Boolean isAbstract) {
85         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
86                 .setAbstract(isAbstract);
87     }
88
89     public String getCost() {
90         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
91                 .getCost();
92     }
93
94     public void setCost(String cost) {
95         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).setCost(cost);
96     }
97
98     public String getLicenseType() {
99         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
100                 .getLicenseType();
101     }
102
103     public void setLicenseType(String licenseType) {
104         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
105                 .setLicenseType(licenseType);
106     }
107
108     public String getToscaResourceName() {
109         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
110                 .getToscaResourceName();
111     }
112
113     public void setToscaResourceName(String toscaResourceName) {
114         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
115                 .setToscaResourceName(toscaResourceName);
116     }
117
118     public ResourceTypeEnum getResourceType() {
119         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
120                 .getResourceType();
121     }
122
123     public void setResourceType(ResourceTypeEnum resourceType) {
124         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
125                 .setResourceType(resourceType);
126     }
127
128     public String getVendorName() {
129         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
130                 .getVendorName();
131     }
132
133     public void setVendorName(String vendorName) {
134         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
135                 .setVendorName(vendorName);
136     }
137
138     public String getVendorRelease() {
139         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
140                 .getVendorRelease();
141     }
142
143     public void setVendorRelease(String vendorRelease) {
144         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
145                 .setVendorRelease(vendorRelease);
146     }
147
148     public String getResourceVendorModelNumber() {
149         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
150                 .getResourceVendorModelNumber();
151     }
152
153     public void setResourceVendorModelNumber(String resourceVendorModelNumber) {
154         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
155                 .setResourceVendorModelNumber(resourceVendorModelNumber);
156     }
157
158     @Override
159     public String fetchGenericTypeToscaNameFromConfig() {
160         return fetchToscaNameFromConfigBasedOnCategory().orElse(fetchToscaNameFromConfigBasedOnAssetType());
161     }
162
163     public String fetchToscaNameFromConfigBasedOnAssetType() {
164         String result = super.fetchGenericTypeToscaNameFromConfig();
165         if (null == result) {
166             result = ConfigurationManager.getConfigurationManager().getConfiguration().getGenericAssetNodeTypes()
167                     .get(ResourceTypeEnum.VFC.getValue());
168         }
169         return result;
170     }
171
172     private Optional<String> fetchToscaNameFromConfigBasedOnCategory() {
173         return getHeadOption(this.getCategories()).flatMap(category -> getHeadOption(category.getSubcategories()).map(
174                 subCategory -> fetchToscaNameFromConfigBasedOnCategory(category.getName(), subCategory.getName())));
175     }
176
177     private String fetchToscaNameFromConfigBasedOnCategory(final String resourceCategory,
178             final String resourceSubCategory) {
179         return Optional
180                 .ofNullable(ConfigurationManager.getConfigurationManager().getConfiguration().getResourceNodeTypes())
181                 .map(categoryNames -> categoryNames.get(resourceCategory))
182                 .map(subCategoryNames -> subCategoryNames.get(resourceSubCategory)).orElse(null);
183     }
184
185     @Override
186     public String assetType() {
187         return this.getResourceType().name();
188     }
189
190     @Override
191     public boolean shouldGenerateInputs() {
192         return !(this.getResourceType().isAtomicType());
193     }
194
195     @Override
196     public boolean deriveFromGeneric() {
197         return this.shouldGenerateInputs()
198                 || (derivedFrom != null && derivedFrom.contains(fetchGenericTypeToscaNameFromConfig()));
199     }
200
201     public Map<String, List<RequirementCapabilityRelDef>> groupRelationsFromCsarByInstanceName(Resource resource) {
202         List<RequirementCapabilityRelDef> componentInstanceRelationsFromCsar = resource.getComponentInstancesRelations()
203                 .stream().filter(r -> !r.isOriginUI()).collect(Collectors.toList());
204         Map<String, List<RequirementCapabilityRelDef>> relationsByInstanceId =
205                 MapUtil.groupListBy(componentInstanceRelationsFromCsar, RequirementCapabilityRelDef::getFromNode);
206         return MapUtil.convertMapKeys(relationsByInstanceId,
207                 instId -> getInstanceInvariantNameFromInstanceId(resource, instId));
208     }
209
210     private String getInstanceInvariantNameFromInstanceId(Resource resource, String instId) {
211         Optional<ComponentInstance> componentInstanceById = resource.getComponentInstanceById(instId);
212         return componentInstanceById.isPresent() ? componentInstanceById.get().getInvariantName() : null;
213     }
214
215 }