Bug:5226 The sub-node has the same order
[nemo.git] / nemo-impl / src / main / java / org / opendaylight / nemo / user / vnspacemanager / languagestyle / updateintentlang / UpdateNodeLang.java
1 /*\r
2  * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.nemo.user.vnspacemanager.languagestyle.updateintentlang;\r
9 \r
10 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
11 import org.opendaylight.nemo.user.tenantmanager.TenantManage;\r
12 import org.opendaylight.nemo.user.vnspacemanager.languagestyle.NEMOConstants;\r
13 import org.opendaylight.nemo.user.vnspacemanager.structurestyle.updateintent.GetDefinitions;\r
14 import org.opendaylight.nemo.user.vnspacemanager.structurestyle.updateintent.UpdateNode;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHost;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.*;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalHostId;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalHostName;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.NodeBuilder;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.NodeKey;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.*;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.PropertyValuesBuilder;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.property.values.*;\r
26 \r
27 import java.util.*;\r
28 \r
29 /**\r
30  * Created by z00293636 on 2015/10/31.\r
31  */\r
32 public class UpdateNodeLang {\r
33     private TenantManage tenantManage;\r
34     private UpdateNode updateNode;\r
35     private Node node;\r
36     private UpdateTemplateInstanceLang updateTemplateInstanceLang;\r
37     private GetDefinitions getDefinitions;\r
38 \r
39     public UpdateNodeLang(DataBroker dataBroker, TenantManage tenantManage){\r
40         this.tenantManage = tenantManage;\r
41         updateNode = new UpdateNode(dataBroker,tenantManage);\r
42         updateTemplateInstanceLang = new UpdateTemplateInstanceLang(dataBroker, tenantManage);\r
43         getDefinitions = new GetDefinitions(dataBroker);\r
44     }\r
45 \r
46     public String NodeHandling(UserId userId,String nodename, String nodetype, List<String> subnodes, LinkedHashMap<String, LinkedHashMap<String,String>> propertyList){\r
47         String errorInfo = null;\r
48 \r
49         if (nodetype.equals(NEMOConstants.host)&&!subnodes.isEmpty()){\r
50             return  "the node "+nodename+ " is a " + NEMOConstants.host +", it could not contain other nodes.";\r
51         }\r
52 \r
53         Boolean nodeModel = false;\r
54         if (tenantManage.getTempalteDefinition(userId)!=null){\r
55             if (tenantManage.getTempalteDefinition(userId).containsKey(new TemplateName(nodetype))){\r
56                 nodeModel = true;\r
57             }\r
58         }\r
59         else if (tenantManage.getDefinitionDataStore(userId)!=null){\r
60             if (tenantManage.getDefinitionDataStore(userId).containsKey(new TemplateName(nodetype))){\r
61                 nodeModel = true;\r
62             }\r
63         }\r
64         else if (!nodeModel) {\r
65             Map<UserId, User> usersMap = tenantManage.getUsers();\r
66             for (User user : usersMap.values()) {\r
67                 if (user.getUserRole().getValue().equals(NEMOConstants.admin)) {\r
68                     if (tenantManage.getDefinitionDataStore(user.getUserId()) != null) {\r
69                         if (tenantManage.getDefinitionDataStore(user.getUserId()).containsKey(new TemplateName(nodetype))) {\r
70                             nodeModel = true;\r
71                         }\r
72                     }\r
73                 }\r
74             }\r
75         }\r
76 \r
77         if (nodeModel){\r
78             if (!subnodes.isEmpty()){\r
79                 return "Subnodes should not be included in template instance.";\r
80             }\r
81             else {\r
82                 errorInfo = updateTemplateInstanceLang.templateInstanceLang(userId,nodename,nodetype,propertyList);\r
83             }\r
84         }\r
85         else {\r
86             if (!propertyList.isEmpty()){\r
87                 errorInfo = checkProperty(propertyList);\r
88             }\r
89             if (errorInfo==null){\r
90                 errorInfo = createNode(userId, nodename, nodetype, subnodes, propertyList);\r
91                 if (errorInfo == null){\r
92                     return updateNode.NodeHandling(userId,this.node);\r
93                 }\r
94             }\r
95         }\r
96 \r
97         return errorInfo;\r
98     }\r
99 \r
100     private String checkProperty(LinkedHashMap<String, LinkedHashMap<String,String>> propertyList){\r
101         String errorInfo = null;\r
102        for (String propertyName : propertyList.keySet()) {\r
103            LinkedHashMap<String, String> propertyValues = propertyList.get(propertyName);\r
104            Iterator<String> iterator = propertyValues.values().iterator();\r
105            String valueType = iterator.next();\r
106 \r
107            while (iterator.hasNext()) {\r
108                if (valueType.equals(NEMOConstants.range)) {\r
109                    errorInfo = "The property should just has one range value.";\r
110                    return errorInfo;\r
111                }\r
112                else if (valueType.equals(NEMOConstants.string)){\r
113                    if (!iterator.next().equals(NEMOConstants.string)){\r
114                        return "The property " + propertyValues.get(iterator.next()) + " should be string.";\r
115                    }\r
116                }\r
117                else if (valueType.equals(NEMOConstants.integer)){\r
118                    if (!iterator.next().equals(NEMOConstants.integer)){\r
119                        return "The property " + propertyValues.get(iterator.next()) + " should be int.";\r
120                    }\r
121                }\r
122            }\r
123        }\r
124         return errorInfo;\r
125     }\r
126 \r
127     private String createNode(UserId userId, String nodename, String nodetype, List<String> subnodes, LinkedHashMap<String, LinkedHashMap<String,String>> propertyList){\r
128         String errorInfo = null;\r
129         NodeBuilder nodeBuilder = new NodeBuilder();\r
130         Node node1 = null;\r
131 \r
132         if (tenantManage.getObjectId(userId,nodename)!=null){\r
133             NodeId nodeId = new NodeId(tenantManage.getObjectId(userId,nodename));\r
134             if (tenantManage.getNode(userId)!=null){\r
135                 node1 = tenantManage.getNode(userId).get(nodeId);\r
136             }\r
137             else if (tenantManage.getNodeDataStore(userId)!=null){\r
138                 node1 = tenantManage.getNodeDataStore(userId).get(nodeId);\r
139             }\r
140         }\r
141         if (node1==null)\r
142         {\r
143             if (nodetype.equals(NEMOConstants.host)){\r
144                Map<PhysicalHostName, PhysicalHost> physicalHostMap = getDefinitions.getPhysicalHost();\r
145                 if (physicalHostMap.containsKey(new PhysicalHostName(nodename))){\r
146                     PhysicalHostId physicalHostId = physicalHostMap.get(new PhysicalHostName(nodename)).getHostId();\r
147                     nodeBuilder.setKey(new NodeKey(new NodeId(physicalHostId.getValue())))\r
148                                .setNodeId(new NodeId(physicalHostId.getValue()));\r
149                 }\r
150                 else {\r
151                     return "The host " + nodename + " is not exist in physical network.";\r
152                 }\r
153             }\r
154             else {\r
155                 NodeId nodeId = new NodeId(UUID.randomUUID().toString());\r
156                 nodeBuilder.setKey(new NodeKey(nodeId))\r
157                            .setNodeId(nodeId);\r
158             }\r
159         }\r
160         else {\r
161             nodeBuilder.setKey(node1.getKey())\r
162                        .setNodeId(node1.getNodeId());\r
163         }\r
164 \r
165         nodeBuilder.setNodeName(new NodeName(nodename))\r
166                    .setNodeType(new NodeType(nodetype));\r
167 \r
168 \r
169 \r
170         if (!subnodes.isEmpty())\r
171         {\r
172             List<SubNode> subNodeList = new ArrayList<SubNode>();\r
173             Long order = 0L;\r
174             for (String subnodeName : subnodes)\r
175             {\r
176                 String nodeId = tenantManage.getObjectId(userId,subnodeName);\r
177                 if (nodeId==null) {\r
178                     return "The subnode " +subnodeName+ " is not exist.";\r
179                 }\r
180                 else {\r
181                     SubNodeBuilder subNodeBuilder = new SubNodeBuilder();\r
182                     subNodeBuilder.setKey(new SubNodeKey(new NodeId(nodeId)))\r
183                                   .setNodeId(new NodeId(nodeId))\r
184                                   .setOrder(order);\r
185                     order ++;\r
186                     subNodeList.add(subNodeBuilder.build());\r
187                 }\r
188             }\r
189             nodeBuilder.setSubNode(subNodeList);\r
190         }\r
191 \r
192         if (errorInfo==null && !propertyList.isEmpty())\r
193         {\r
194             PropertyBuilder propertyBuilder = new PropertyBuilder();\r
195             List<Property> nodeproperty = new ArrayList<Property>();\r
196             for (String propertyname : propertyList.keySet())\r
197             {\r
198                 propertyBuilder.setKey(new PropertyKey(new PropertyName(propertyname)));\r
199                 propertyBuilder.setPropertyName(new PropertyName(propertyname));\r
200 \r
201                 PropertyValuesBuilder propertyValuesBuilder = new PropertyValuesBuilder();\r
202                 LinkedHashMap<String, String> valuetype = propertyList.get(propertyname);\r
203                 List<IntValue> intValueList = new ArrayList<IntValue>();\r
204                 List<StringValue> stringValueList = new ArrayList<StringValue>();\r
205                 RangeValue RangeValue = null;\r
206 \r
207                 int order = 0;\r
208                 for (String value : valuetype.keySet())\r
209                 {\r
210                     if (valuetype.get(value).equals(NEMOConstants.string))\r
211                     {\r
212                         StringValueBuilder stringValueBuilder = new StringValueBuilder();\r
213                         stringValueBuilder.setKey(new StringValueKey((long)order,value));\r
214                         stringValueBuilder.setValue(value);\r
215                         stringValueBuilder.setOrder((long)order);\r
216                         stringValueList.add(stringValueBuilder.build());\r
217                     }\r
218                     if (valuetype.get(value).equals(NEMOConstants.integer))\r
219                     {\r
220                         IntValueBuilder intValueBuilder = new IntValueBuilder();\r
221                         intValueBuilder.setKey(new IntValueKey((long)order,Long.parseLong(value)));\r
222                         intValueBuilder.setValue(Long.parseLong(value));\r
223                         intValueBuilder.setOrder((long)order);\r
224                         intValueList.add(intValueBuilder.build());\r
225                     }\r
226                     if (valuetype.get(value).equals(NEMOConstants.range))\r
227                     {\r
228                         String[] rangevalue = new String[2];\r
229                         rangevalue = value.split(",");\r
230                         RangeValueBuilder rangeValueBuilder = new RangeValueBuilder();\r
231                         if (Long.parseLong(rangevalue[0])<Long.parseLong(rangevalue[1]))\r
232                         {\r
233                             rangeValueBuilder.setMin(Long.parseLong(rangevalue[0]));\r
234                             rangeValueBuilder.setMax(Long.parseLong(rangevalue[1]));\r
235                         }\r
236                        else\r
237                         {\r
238                             rangeValueBuilder.setMin(Long.parseLong(rangevalue[1]));\r
239                             rangeValueBuilder.setMax(Long.parseLong(rangevalue[0]));\r
240                         }\r
241                         RangeValue = rangeValueBuilder.build();\r
242                         propertyValuesBuilder.setRangeValue(RangeValue);\r
243                     }\r
244                     order++;\r
245                 }\r
246                 if (intValueList.isEmpty())\r
247                 {\r
248                     intValueList = null;\r
249                     propertyValuesBuilder.setIntValue(intValueList);\r
250                 }\r
251                 if (stringValueList.isEmpty())\r
252                 {\r
253                     stringValueList = null;\r
254                     propertyValuesBuilder.setStringValue(stringValueList);\r
255                 }\r
256 \r
257                 propertyValuesBuilder.setIntValue(intValueList).setStringValue(stringValueList).setRangeValue(RangeValue);\r
258                 propertyBuilder.setPropertyValues(propertyValuesBuilder.build());\r
259                 nodeproperty.add(propertyBuilder.build());\r
260             }\r
261             nodeBuilder.setProperty(nodeproperty);\r
262         }\r
263         this.node = nodeBuilder.build();\r
264         return errorInfo;\r
265     }\r
266 }\r