Merge "Update the VFC NS resource recipe"
[so.git] / bpmn / MSOCoreBPMN / src / main / java / org / openecomp / mso / bpmn / core / domain / ServiceDecomposition.java
1 /*-\r
2  * ============LICENSE_START=======================================================\r
3  * ONAP - SO\r
4  * ================================================================================\r
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\r
6  * ================================================================================\r
7  * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * you may not use this file except in compliance with the License.\r
9  * You may obtain a copy of the License at\r
10  *\r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  *\r
13  * Unless required by applicable law or agreed to in writing, software\r
14  * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * See the License for the specific language governing permissions and\r
17  * limitations under the License.\r
18  * ============LICENSE_END=========================================================\r
19  */\r
20 \r
21 package org.openecomp.mso.bpmn.core.domain;\r
22 \r
23 \r
24 import java.io.Serializable;\r
25 import java.util.ArrayList;\r
26 import java.util.Collections;\r
27 import java.util.Iterator;\r
28 import java.util.List;\r
29 \r
30 import com.fasterxml.jackson.annotation.JsonIgnore;\r
31 import com.fasterxml.jackson.annotation.JsonProperty;\r
32 import com.fasterxml.jackson.annotation.JsonRootName;\r
33 \r
34 import org.openecomp.mso.bpmn.core.json.DecomposeJsonUtil;\r
35 import org.openecomp.mso.bpmn.core.json.JsonDecomposingException;\r
36 \r
37 \r
38 /**\r
39  * Service Decomposition Structure\r
40  * This Java object contains service information:\r
41  * - Service model info\r
42  * - Service type and role\r
43  * - list of VNF resource's decompositon\r
44  * - list of network resource's decompositon\r
45  * - list of allotted resource's decompositon\r
46  */\r
47 @JsonRootName(value = "serviceResources")\r
48 //@JsonTypeInfo(include=As.WRAPPER_OBJECT, use=Id.NAME)\r
49 public class ServiceDecomposition extends JsonWrapper implements Serializable {\r
50 \r
51         private static final long serialVersionUID = 1L;\r
52 \r
53         @JsonProperty("modelInfo")\r
54         private ModelInfo modelInfo;\r
55         @JsonProperty("serviceType")\r
56         private String serviceType;\r
57         @JsonProperty("serviceRole")\r
58         private String serviceRole;\r
59         private ServiceInstance serviceInstance;\r
60         @JsonProperty("vnfResource")\r
61         private List <VnfResource>  vnfResources;\r
62         @JsonProperty("networkResource")\r
63         private List <NetworkResource>  networkResources;\r
64         @JsonProperty("allottedResource")\r
65         private List <AllottedResource>  allottedResources;\r
66 \r
67         public ServiceDecomposition () {\r
68         }\r
69 \r
70         //*****\r
71         //GET and SET section\r
72         /**\r
73          * Return just the service model portion of the Service Decomposition as a Java object.\r
74          * The service model object should support retrieval as JSON string that is formatted correctly for sending serviceModelInfo to Building Blocks.\r
75          * @return\r
76          */\r
77         public ModelInfo getModelInfo() {\r
78                 return modelInfo;\r
79         }\r
80         public void setModelInfo(ModelInfo modelInfo) {\r
81                 this.modelInfo = modelInfo;\r
82         }\r
83         public ServiceInstance getServiceInstance() {\r
84                 return serviceInstance;\r
85         }\r
86         public void setServiceInstance(ServiceInstance serviceInstance) {\r
87                 this.serviceInstance = serviceInstance;\r
88         }\r
89         public List<VnfResource> getServiceVnfs() {\r
90                 return vnfResources;\r
91         }\r
92         public void setServiceVnfs(List<VnfResource> vnfResources) {\r
93                 this.vnfResources = vnfResources;\r
94         }\r
95         public List<NetworkResource> getServiceNetworks() {\r
96                 return networkResources;\r
97         }\r
98         public void setServiceNetworks(List<NetworkResource> networkResources) {\r
99                 this.networkResources = networkResources;\r
100         }\r
101         public List<AllottedResource> getServiceAllottedResources() {\r
102                 return allottedResources;\r
103         }\r
104         public void setServiceAllottedResources(List<AllottedResource> allottedResources) {\r
105                 this.allottedResources = allottedResources;\r
106         }\r
107         public String getServiceType() {\r
108                 return serviceType;\r
109         }\r
110 \r
111         public void setServiceType(String serviceType) {\r
112                 this.serviceType = serviceType;\r
113         }\r
114 \r
115         public String getServiceRole() {\r
116                 return serviceRole;\r
117         }\r
118 \r
119         public void setServiceRole(String serviceRole) {\r
120                 this.serviceRole = serviceRole;\r
121         }\r
122         //*****\r
123 \r
124         //*****\r
125         //Access methods\r
126 \r
127 \r
128         /**\r
129          * This method returns one combined list of Resources of All Types\r
130          * @return\r
131          */\r
132         @JsonIgnore\r
133         public List<Resource> getServiceResources(){\r
134                 ArrayList serviceResources = new ArrayList();\r
135                 if(this.getServiceAllottedResources() != null){\r
136                         serviceResources.addAll(this.getServiceAllottedResources());\r
137                 }\r
138                 if(this.getServiceNetworks() != null){\r
139                         serviceResources.addAll(this.getServiceNetworks());\r
140                 }\r
141                 if(this.getServiceVnfs() != null){\r
142                         serviceResources.addAll(this.getServiceVnfs());\r
143                 }\r
144                 return serviceResources;\r
145         }\r
146 \r
147         /**\r
148          * This method returns String representation of one combined list of Resources of All Types\r
149          */\r
150         @JsonIgnore\r
151         public String getServiceResourcesJsonString() {\r
152                 return listToJson((this.getServiceNetworks())) +\r
153                         listToJson((this.getServiceVnfs())) +\r
154                         listToJson((this.getServiceAllottedResources()));\r
155         }\r
156 \r
157         /**\r
158          * Returns a JSON list of all Network Resource structures (i.e. the serialized NetworkDecomposition objects).\r
159          * @return\r
160          */\r
161         @JsonIgnore\r
162         public String getServiceNetworksJson(){\r
163                 return listToJson(this.getServiceNetworks());\r
164         }\r
165         /**\r
166          * Returns a JSON list of all VnfResource structures (i.e. the serialized VnfResource objects).\r
167          * @return\r
168          */\r
169         @JsonIgnore\r
170         public String getServiceVnfsJson(){\r
171                 return listToJson(this.getServiceVnfs());\r
172         }\r
173         /**\r
174          * Returns a JSON list of all Allotted Resource structures (i.e. the serialized AllottedResource objects).\r
175          * @return\r
176          */\r
177         @JsonIgnore\r
178         public String getServiceAllottedResourcesJson(){\r
179                 return listToJson(this.getServiceAllottedResources());\r
180         }\r
181 \r
182         //TODO - define Resource Object ID\r
183         @JsonIgnore\r
184         public String getVnfResource(String resourceObjectId) {\r
185 \r
186         for (Resource resource : getServiceResources()) {\r
187             //resource.getModelInfo().getModelInvariantId();\r
188 \r
189             if ("extracted information".equals(resourceObjectId)) {\r
190                 return resource.toJsonString();\r
191             }\r
192         }\r
193                 return "";\r
194         }\r
195 \r
196         //Methods to add Resource to the list\r
197         /**\r
198          * Add VNF resource to the list\r
199          * @param vnfResource\r
200          */\r
201         public void addVnfResource(Resource vnfResource) {\r
202                 if (vnfResources == null){\r
203                         vnfResources = new ArrayList<>();\r
204                 }\r
205                 this.vnfResources.add((VnfResource)vnfResource);\r
206         }\r
207         /**\r
208          * Add Network resource to the list\r
209          * @param networkResource\r
210          */\r
211         public void addNetworkResource(Resource networkResource) {\r
212                 if (networkResources == null){\r
213                         networkResources = new ArrayList<>();\r
214                 }\r
215                 this.networkResources.add((NetworkResource)networkResource);\r
216         }\r
217         /**\r
218          * Add Allotted resource to the list\r
219          * @param allottedResource\r
220          */\r
221         public void addAllottedResource(Resource allottedResource) {\r
222                 if (allottedResources == null){\r
223                         allottedResources = new ArrayList<>();\r
224                 }\r
225                 this.allottedResources.add((AllottedResource)allottedResource);\r
226         }\r
227 \r
228         /**\r
229          * Add resource to the list\r
230          * Given a ResourceDecomposition (subclass) object, add it to the Service Decomposition (in the appropriate category, e.g. as a VNF, Network, or Allotted Resource).\r
231          * As dependencies are not currently supported, add it to the end of any ordered lists.\r
232          * @param resource\r
233          */\r
234         public void addResource(Resource resource) {\r
235                 //create resource based upon type\r
236                 switch (resource.resourceType) {\r
237                 case VNF:\r
238                         this.addVnfResource(resource);\r
239                         break;\r
240                 case NETWORK:\r
241                         this.addNetworkResource(resource);\r
242                      break;\r
243                 case ALLOTTED_RESOURCE:\r
244                         this.addAllottedResource(resource);\r
245                     break;\r
246                 default:\r
247                      throw new IllegalArgumentException("Invalid resource type: " + resource.resourceType);\r
248                  }\r
249         }\r
250 \r
251         /**\r
252          * Add resource to the list\r
253          * @param jsonResource\r
254          */\r
255         public void addVnfResource(String jsonResource) throws JsonDecomposingException {\r
256                 VnfResource vnfResource = null;\r
257                 vnfResource = DecomposeJsonUtil.jsonToVnfResource(jsonResource);\r
258                 this.addVnfResource(vnfResource);\r
259         }\r
260         /**\r
261          * Add resource to the list\r
262          * @param jsonResource\r
263          */\r
264         public void addNetworkResource(String jsonResource) throws JsonDecomposingException {\r
265                 NetworkResource networkResource = null;\r
266                 networkResource = DecomposeJsonUtil.jsonToNetworkResource(jsonResource);\r
267                 this.addVnfResource(networkResource);\r
268         }\r
269         /**\r
270          * Add resource to the list\r
271          * @param jsonResource\r
272          */\r
273         public void addAllottedResource(String jsonResource) throws JsonDecomposingException {\r
274                 AllottedResource allottedResource = null;\r
275                 allottedResource = DecomposeJsonUtil.jsonToAllottedResource(jsonResource);\r
276                 this.addVnfResource(allottedResource);\r
277         }\r
278 \r
279         /**\r
280          * Given a ResourceDecomposition (subclass) object, locate it in the Service Decomposition by its unique ID, and replace the current version with the new one.\r
281          * This method should support concurrency control via an auto-incrementing field in the ResourceDecomposition class.\r
282          * @param newResource\r
283          * @return TRUE if replacement was a success\r
284          */\r
285         public boolean replaceResource(Resource newResource){\r
286                 boolean result = false;\r
287                 List serviceResources = getServiceResources();\r
288                 for (Resource resource : (Iterable<Resource>) serviceResources) {\r
289                         System.out.println("resource found");\r
290                         if (resource.resourceType == newResource.resourceType) {\r
291                                 System.out.println("resource type matches");\r
292                                 if (resource.getResourceId().equalsIgnoreCase(newResource.getResourceId())) {\r
293                                         System.out.println("resource id matches");\r
294                                         //returns TRUE if replacement is a success\r
295                                         result = Collections.replaceAll(serviceResources, resource, newResource);\r
296                                 }\r
297                         }\r
298                 }\r
299                 //set updated list into ServiceDecomposition\r
300                 this.setResourceList(serviceResources);\r
301                 return result;\r
302         }\r
303 \r
304         /**\r
305          * Given a ResourceDecomposition as a JSON string, locate it in the Service Decomposition by its unique ID,\r
306          *  and replace the current version with the new one.\r
307          * @param jsonString\r
308          * @return\r
309          */\r
310         public boolean replaceResource(String jsonString){\r
311                 //TODO: define unique ID for the Resource!\r
312                 return false;\r
313         }\r
314 \r
315         /**\r
316          *  Given a resource object ID, locate it in the Service Decomposition by its unique ID, and delete it.\r
317          * @param resource\r
318          * @return TRUE if delete was a success\r
319          */\r
320         public boolean deleteResource(Resource resource){\r
321                 List serviceResources = getServiceResources();\r
322                 for (Resource item : (Iterable<Resource>) serviceResources) {\r
323                         if (item.resourceType == resource.resourceType) {\r
324                                 if (item.getResourceId().equalsIgnoreCase(resource.getResourceId())) {\r
325                                         //returns TRUE if replacement is a success\r
326                                         return serviceResources.remove(resource);\r
327                                 }\r
328                         }\r
329                 }\r
330 \r
331                 return false;\r
332         }\r
333 \r
334         /**\r
335          * Generic method to set List of ResourceDecomposition objects\r
336          * @param resources\r
337          * @return\r
338          */\r
339         public boolean setResourceList(List<Resource> resources){\r
340                 //create resource based upon type\r
341                 switch (resources.get(0).resourceType) {\r
342                 case VNF:\r
343                         this.setServiceVnfs((List<VnfResource>)(List<?>)resources);\r
344                         break;\r
345                 case NETWORK:\r
346                         this.setServiceNetworks((List<NetworkResource>)(List<?>)resources);\r
347                     break;\r
348                 case ALLOTTED_RESOURCE:\r
349                         this.setServiceAllottedResources((List<AllottedResource>)(List<?>)resources);\r
350                     break;\r
351                 default:\r
352                      throw new IllegalArgumentException("Invalid resource type: " + resources.get(0).resourceType);\r
353                  }\r
354 \r
355                 return false;\r
356         }\r
357 \r
358         /**\r
359          *\r
360          * This method locates and returns a resource in a given\r
361          * Service Decomposition object by its unique resource id.\r
362          * Returns null if resource doesn't exist.\r
363          *\r
364          * @param resourceId - id of the resource\r
365          * @return resource\r
366          */\r
367         @JsonIgnore\r
368         public Resource getServiceResource(String resourceId){\r
369                 List<Resource> resources = getServiceResources();\r
370                 for (Resource resource : resources) {\r
371                         if (resource.getResourceId().equalsIgnoreCase(resourceId)) {\r
372                                 //match\r
373                                 return resource;\r
374                         }\r
375                 }\r
376                 return null;\r
377         }\r
378 }\r