Modify nemo rpc input and related implementation.
[nemo.git] / nemo-impl / src / main / java / org / opendaylight / nemo / user / vnspacemanager / structurestyle / updateintent / UpdateNode.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.structurestyle.updateintent;\r
9 \r
10 import com.google.common.base.Optional;\r
11 import com.google.common.util.concurrent.CheckedFuture;\r
12 import com.google.common.util.concurrent.FutureCallback;\r
13 import com.google.common.util.concurrent.Futures;\r
14 import com.google.common.util.concurrent.ListenableFuture;\r
15 import com.google.common.util.concurrent.SettableFuture;\r
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
17 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\r
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
19 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;\r
20 import org.opendaylight.nemo.user.tenantmanager.TenantManage;\r
21 import org.opendaylight.nemo.user.vnspacemanager.languagestyle.NEMOConstants;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeType;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.Users;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.Objects;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.NodeBuilder;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.NodeKey;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.UserKey;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.NodeDefinitions;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.definitions.NodeDefinition;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.Property;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.definitions.PropertyDefinition;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.PropertyValues;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.property.values.StringValue;\r
37 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
38 import org.slf4j.Logger;\r
39 import org.slf4j.LoggerFactory;\r
40 \r
41 import java.util.HashMap;\r
42 import java.util.List;\r
43 import java.util.Map;\r
44 import java.util.concurrent.ExecutionException;\r
45 import java.util.concurrent.TimeUnit;\r
46 import java.util.concurrent.TimeoutException;\r
47 \r
48 /**\r
49  * Created by z00293636 on 2015/8/31.\r
50  */\r
51 public class UpdateNode {\r
52 \r
53     private DataBroker dataBroker;\r
54     private TenantManage tenantManage;\r
55     private GetDefinitions getDefinitions;\r
56     private ValueCheck valueCheck;\r
57     private static final Logger LOG = LoggerFactory.getLogger(UpdateNode.class);\r
58 \r
59     public UpdateNode(DataBroker dataBroker,TenantManage tenantManage){\r
60         this.dataBroker = dataBroker;\r
61         this.tenantManage = tenantManage;\r
62         getDefinitions = new GetDefinitions(dataBroker);\r
63         valueCheck = new ValueCheck();\r
64     }\r
65 \r
66 \r
67     public String NodeHandling(UserId userId,Node node){\r
68         String errorInfo = null;\r
69         errorInfo = checkDefinition(node);\r
70         if (errorInfo !=null){\r
71             return errorInfo;\r
72         }\r
73         else{\r
74             errorInfo = checkInstance(userId, node);\r
75             if (errorInfo!=null){\r
76                 return errorInfo;\r
77             }\r
78             else {\r
79                 WriteTransaction t = dataBroker.newWriteOnlyTransaction();\r
80                 if (userId != null && node.getNodeId() !=null){\r
81                     Node node1 = new NodeBuilder(node).build();\r
82                     NodeKey nodeKey = new NodeKey(node.getKey());\r
83                     UserKey userKey = new UserKey(userId);\r
84 \r
85                     InstanceIdentifier<Node> nodeid = InstanceIdentifier.builder(Users.class).child(User.class, userKey).child(Objects.class).child(Node.class,nodeKey).build();\r
86                     t.put(LogicalDatastoreType.CONFIGURATION, nodeid, node1,true);\r
87                     CheckedFuture<Void, TransactionCommitFailedException> f = t.submit();\r
88                     Futures.addCallback(f, new FutureCallback<Void>() {\r
89                         @Override\r
90                         public void onFailure(Throwable t) {\r
91                             LOG.error("Could not write endpoint base container", t);\r
92                         }\r
93 \r
94                         @Override\r
95                         public void onSuccess(Void result) {\r
96                         }\r
97                     });\r
98                 }\r
99             }\r
100         }\r
101         return errorInfo;\r
102     }\r
103 \r
104     private String checkInstance(UserId userId, Node node){\r
105         String errorInfo = null;\r
106         tenantManage.fetchVNSpace(userId);\r
107         User user = tenantManage.getUser();\r
108 \r
109         if (user!=null){\r
110             if (user.getObjects()!=null){\r
111                 if (user.getObjects().getNode()!=null){\r
112                     List<Node> nodeList = user.getObjects().getNode();\r
113                     for (Node node1 : nodeList){\r
114                         if (node1.getNodeId().equals(node.getNodeId())){\r
115                             if ( !node1.getNodeName().equals(node.getNodeName())) {\r
116                                 errorInfo = "The node name should not be changed.";\r
117                                 break;\r
118                             }\r
119                             if  (!node1.getNodeType().equals(node.getNodeType())){\r
120                                 errorInfo = "The node type should not be changed.";\r
121                                 break;\r
122                             }\r
123                         }\r
124                     }\r
125                 }\r
126             }\r
127         }\r
128         return errorInfo;\r
129     }\r
130 \r
131     private String checkDefinition(Node node){\r
132         String errorInfo = null;\r
133         final Map<NodeType, NodeDefinition> map = getDefinitions.getNodeDefinition();\r
134         if (map.isEmpty()){\r
135             return "This type of Node has not been defined.";\r
136         }\r
137         else {\r
138             if (map.containsKey(node.getNodeType())){\r
139                 List<Property> nodeProperties = node.getProperty();\r
140                 List<PropertyDefinition> nodePropertyDefinitions = map.get(node.getNodeType()).getPropertyDefinition();\r
141 \r
142                 if (nodeProperties != null && nodePropertyDefinitions == null){\r
143                     errorInfo = "This type of node has no properties.";\r
144                 }\r
145                 else if (nodeProperties != null && nodePropertyDefinitions != null){\r
146                     errorInfo = checkProperty(nodeProperties, nodePropertyDefinitions);\r
147                     if (errorInfo != null){\r
148                     }\r
149                     else {\r
150                         errorInfo = checkPredefine(nodeProperties);\r
151                     }\r
152                 }\r
153             }\r
154             else {\r
155                 return "This type of Node has not been defined.";\r
156             }\r
157         }\r
158         return errorInfo;\r
159     }\r
160 \r
161     private String checkProperty(List<Property> nodeProperties, List<PropertyDefinition> nodePropertyDefinitions){\r
162         Boolean propertyHasDefine = false;\r
163         String errorInfo = null;\r
164 \r
165         for (Property property : nodeProperties){\r
166             if (errorInfo != null){\r
167                 break;\r
168             }\r
169             else{\r
170                 for (PropertyDefinition propertydefinition : nodePropertyDefinitions){\r
171                     if (property.getPropertyName().equals(propertydefinition.getPropertyName())){\r
172                         propertyHasDefine = true;\r
173                         PropertyValues propertyValues = property.getPropertyValues();\r
174                         PropertyDefinition.PropertyValueType propertyValueType = propertydefinition.getPropertyValueType();\r
175 \r
176                         if (propertyValues != null && propertyValueType != null){\r
177                             if (propertydefinition.getIsReadOnly()!=null\r
178                                     && PropertyDefinition.IsReadOnly.ReadOnly == propertydefinition.getIsReadOnly()){\r
179                                 if (propertydefinition.getIsRequired().getIntValue() == 1){\r
180                                     errorInfo = "The property "+ property.getPropertyName().getValue()+" is readonly, can not be written.";\r
181                                     break;\r
182                                 }\r
183                             }\r
184                             else if (propertyValueType.getIntValue() == 0 && !(propertyValues.getIntValue() == null\r
185                                     && propertyValues.getStringValue() != null && propertyValues.getRangeValue() == null)){\r
186                                 errorInfo =  "The property value type "+property.getPropertyName().getValue()+" should be string";\r
187                                 break;\r
188                             }\r
189                             else if (propertyValueType.getIntValue() == 1 && !(propertyValues.getIntValue() != null\r
190                                     && propertyValues.getStringValue() == null && propertyValues.getRangeValue() == null)){\r
191                                 errorInfo =  "The property value type "+property.getPropertyName().getValue()+" should be integer";\r
192                                 break;\r
193                             }\r
194                             else if (propertyValueType.getIntValue() == 2 && !(propertyValues.getIntValue() == null\r
195                                     && propertyValues.getStringValue() == null && propertyValues.getRangeValue() != null)){\r
196                                 errorInfo =  "The property value type "+property.getPropertyName().getValue()+" should be range";\r
197                                 break;\r
198                             }\r
199                         }\r
200                     }\r
201                 }\r
202 \r
203                 if (!propertyHasDefine){\r
204                     errorInfo = "The property "+property.getPropertyName().getValue()+" has not been defined.";\r
205                 }\r
206             }\r
207         }\r
208 \r
209         if (errorInfo == null){\r
210             Boolean requiredProperty = false;\r
211             for (PropertyDefinition propertyDefinition : nodePropertyDefinitions){\r
212                 if (propertyDefinition.getIsRequired()!=null){\r
213                     if (propertyDefinition.getIsRequired().getIntValue() ==0){\r
214                         for (Property property: nodeProperties){\r
215                             if (property.getPropertyName().equals(propertyDefinition.getPropertyName())){\r
216                                 requiredProperty = true;\r
217                             }\r
218                         }\r
219                         if (!requiredProperty){\r
220                             errorInfo = "The required property "+ propertyDefinition.getPropertyName().getValue() + "is not included in the intent.";\r
221                             break;\r
222                         }\r
223                     }\r
224                 }\r
225             }\r
226         }\r
227         return errorInfo;\r
228     }\r
229 \r
230     private String checkPredefine(List<Property> nodeProperties){\r
231         String errorInfo = null;\r
232         for (Property property : nodeProperties){\r
233             if (property.getPropertyName().getValue().equals(NEMOConstants.mac_address)){\r
234                 List<StringValue> stringValues = property.getPropertyValues().getStringValue();\r
235                 Boolean legalValue = true;\r
236                 for (StringValue stringValue : stringValues){\r
237                    legalValue = valueCheck.checkMac(stringValue.getValue());\r
238                 }\r
239                 if (!legalValue){\r
240                     errorInfo = "The " + NEMOConstants.mac_address + " is not legal.";\r
241                 }\r
242             }\r
243             if (property.getPropertyName().getValue().equals(NEMOConstants.ip_address)){\r
244                 List<StringValue> stringValues = property.getPropertyValues().getStringValue();\r
245                 Boolean legalValue = true;\r
246                 for (StringValue stringValue : stringValues){\r
247                     if (stringValue.getValue().contains("/")){\r
248                         legalValue = valueCheck.checkIpPrefix(stringValue.getValue());\r
249                     }\r
250                     else {\r
251                         legalValue = valueCheck.checkIpAddress(stringValue.getValue());\r
252                     }\r
253                 }\r
254                 if (!legalValue){\r
255                     errorInfo = "The " + NEMOConstants.ip_address + " is not legal.";\r
256                 }\r
257             }\r
258             if (property.getPropertyName().getValue().equals(NEMOConstants.gateway_ip)){\r
259                 List<StringValue> stringValues = property.getPropertyValues().getStringValue();\r
260                 Boolean legalValue = true;\r
261                 for (StringValue stringValue : stringValues){\r
262                     legalValue = valueCheck.checkIpAddress(stringValue.getValue());\r
263                 }\r
264                 if (!legalValue){\r
265                     errorInfo = "The " + NEMOConstants.gateway_ip + " is not legal.";\r
266                 }\r
267             }\r
268             if (property.getPropertyName().getValue().equals(NEMOConstants.ac_info_network)){\r
269                 List<StringValue> stringValues = property.getPropertyValues().getStringValue();\r
270                 Boolean legalValue = true;\r
271                 for (StringValue stringValue : stringValues){\r
272                    if (!(stringValue.getValue().equals(NEMOConstants.layer2)||stringValue.getValue().equals(NEMOConstants.layer3))){\r
273                        errorInfo = "The " + NEMOConstants.ac_info_network + " is not legal.";\r
274                    }\r
275                 }\r
276             }\r
277             if (property.getPropertyName().getValue().equals(NEMOConstants.operating_mode)){\r
278                 List<StringValue> stringValues = property.getPropertyValues().getStringValue();\r
279                 Boolean legalValue = true;\r
280                 for (StringValue stringValue : stringValues){\r
281                     if (!(stringValue.getValue().equals(NEMOConstants.layer2)||stringValue.getValue().equals(NEMOConstants.layer3))){\r
282                         errorInfo = "The " + NEMOConstants.operating_mode + " is not legal.";\r
283                     }\r
284                 }\r
285             }\r
286         }\r
287         return errorInfo;\r
288     }\r
289 }\r