Adding nemo engine.
[nemo.git] / nemo-impl / src / main / java / org / opendaylight / nemo / user / vnspacemanager / syntaxcheck / NodeDefinitionCheck.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.syntaxcheck;\r
9 \r
10 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeType;\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.PropertyName;\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.NodeDefinitions;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.definitions.NodeDefinition;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.Property;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.definitions.PropertyDefinition;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.PropertyValues;\r
19 \r
20 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\r
21 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;\r
22 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
23 import org.opendaylight.yangtools.yang.common.RpcResult;\r
24 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;\r
25 import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;\r
26 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
27 import com.google.common.base.Optional;\r
28 import com.google.common.base.Function;\r
29 import com.google.common.util.concurrent.CheckedFuture;\r
30 import com.google.common.util.concurrent.FutureCallback;\r
31 import com.google.common.util.concurrent.Futures;\r
32 import com.google.common.util.concurrent.ListenableFuture;\r
33 \r
34 import org.slf4j.Logger;\r
35 import org.slf4j.LoggerFactory;\r
36 \r
37 import java.util.List;\r
38 \r
39 /**\r
40  * Created by z00293636 on 2015/9/2.\r
41  */\r
42 public class NodeDefinitionCheck {\r
43 \r
44     private DataBroker dataBroker;\r
45     private List<NodeDefinition> nodeDefinitionList;\r
46     private static final Logger LOG = LoggerFactory.getLogger(NodeDefinitionCheck.class);\r
47 \r
48     public NodeDefinitionCheck(DataBroker dataBroker)\r
49     {\r
50         this.dataBroker = dataBroker;\r
51         nodeDefinitionList = null;\r
52     }\r
53 \r
54     public String CheckNodeDefinition(Node node)\r
55     {\r
56         String errorInfo = null;\r
57         Boolean NodeHasDefined = false;\r
58 \r
59         fetchNodeDefinitions();\r
60         if (nodeDefinitionList != null)\r
61         {\r
62             for (NodeDefinition nodeDefinition : nodeDefinitionList)\r
63             {\r
64                 if (nodeDefinition.getNodeType().equals(node.getNodeType()))\r
65                 {\r
66                     NodeHasDefined = true;\r
67                     List<Property> nodeProperties = node.getProperty();\r
68                     List<PropertyDefinition> nodePropertyDefinitions = nodeDefinition.getPropertyDefinition();\r
69 \r
70                     if (nodeProperties != null && nodePropertyDefinitions == null)\r
71                     {\r
72                         errorInfo = "This type of node has no properties.";\r
73                         break;\r
74                     }\r
75                     else if (nodeProperties != null && nodePropertyDefinitions != null)\r
76                     {\r
77                         errorInfo = checkProperty(nodeProperties, nodeDefinition.getPropertyDefinition());\r
78                         if (errorInfo != null)\r
79                         {\r
80                             break;\r
81                         }\r
82                     }\r
83                 }\r
84             }\r
85         }\r
86 \r
87         if (!NodeHasDefined)\r
88         {\r
89             errorInfo = "This type of Node has not been defined.";\r
90         }\r
91         return errorInfo;\r
92     }\r
93 \r
94     private String checkProperty(List<Property> nodeProperties, List<PropertyDefinition> nodePropertyDefinitions)\r
95     {\r
96         Boolean propertyHasDefine = false;\r
97         String errorInfo = null;\r
98 \r
99         for (Property property : nodeProperties)\r
100         {\r
101             if (errorInfo != null)\r
102             {\r
103                 break;\r
104             }\r
105             else\r
106             {\r
107                 for (PropertyDefinition propertydefinition : nodePropertyDefinitions)\r
108                 {\r
109                     if (property.getPropertyName().equals(propertydefinition.getPropertyName()))\r
110                     {\r
111                         propertyHasDefine = true;\r
112                         PropertyValues propertyValues = property.getPropertyValues();\r
113                         PropertyDefinition.PropertyValueType propertyValueType = propertydefinition.getPropertyValueType();\r
114 \r
115                         if (propertyValues != null && propertyValueType != null)\r
116                         {\r
117                             if (propertydefinition.getIsReadOnly()!=null)\r
118                             {\r
119                                 if (propertydefinition.getIsRequired().getIntValue() == 1)\r
120                                 {\r
121                                     errorInfo = "The property"+ property.getPropertyName().toString()+" is readonly, can not be written.";\r
122                                     break;\r
123                                 }\r
124                             }\r
125                             else if (propertyValueType.getIntValue() == 0 && !(propertyValues.getIntValue() == null && propertyValues.getStringValue() != null && propertyValues.getRangeValue() == null))\r
126                             {\r
127                                 errorInfo =  "The property value type"+property.getPropertyName().toString()+" should be string";\r
128                                 break;\r
129                             }\r
130                             else if (propertyValueType.getIntValue() == 1 && !(propertyValues.getIntValue() != null && propertyValues.getStringValue() == null && propertyValues.getRangeValue() == null))\r
131                             {\r
132                                 errorInfo =  "The property value type"+property.getPropertyName().toString()+" should be integer";\r
133                                 break;\r
134                             }\r
135                             else if (propertyValueType.getIntValue() == 2 && !(propertyValues.getIntValue() == null && propertyValues.getStringValue() == null && propertyValues.getRangeValue() != null))\r
136                             {\r
137                                 errorInfo =  "The property value type"+property.getPropertyName().toString()+" should be range";\r
138                                 break;\r
139                             }\r
140                         }\r
141                     }\r
142                   }\r
143 \r
144                 if (!propertyHasDefine)\r
145                 {\r
146                     errorInfo = "The property"+property.getPropertyName().toString()+"has not been defined.";\r
147                 }\r
148             }\r
149         }\r
150 \r
151         if (errorInfo == null)\r
152         {\r
153             Boolean requiredProperty = false;\r
154             for (PropertyDefinition propertyDefinition : nodePropertyDefinitions)\r
155             {\r
156                 if (propertyDefinition.getIsRequired()!=null)\r
157                 {\r
158                     if (propertyDefinition.getIsRequired().getIntValue() ==0)\r
159                     {\r
160                        for (Property property: nodeProperties)\r
161                        {\r
162                            if (property.getPropertyName().equals(propertyDefinition.getPropertyName()))\r
163                            {\r
164                                 requiredProperty = true;\r
165                            }\r
166                        }\r
167                         if (!requiredProperty)\r
168                         {\r
169                             errorInfo = "The required property "+ propertyDefinition.getPropertyName().toString() + "is not included in the intent.";\r
170                             break;\r
171                         }\r
172                     }\r
173                 }\r
174             }\r
175         }\r
176         return errorInfo;\r
177     }\r
178 \r
179     private void fetchNodeDefinitions()\r
180     {\r
181         InstanceIdentifier<NodeDefinitions> nodedefinitionId = InstanceIdentifier.builder(NodeDefinitions.class).build();\r
182         ListenableFuture<Optional<NodeDefinitions>> nodedefinitionFuture = dataBroker.newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION, nodedefinitionId);\r
183         Futures.addCallback(nodedefinitionFuture, new FutureCallback<Optional<NodeDefinitions>>() {\r
184             @Override\r
185             public void onSuccess(Optional<NodeDefinitions> result)\r
186             {\r
187                 setNodeDefinitionList(result.get().getNodeDefinition());\r
188                 return;\r
189             }\r
190 \r
191             @Override\r
192             public void onFailure(Throwable t)\r
193             {\r
194                 LOG.error("Can not read node definitions information.", t);\r
195                 return;\r
196             }\r
197         });\r
198         return ;\r
199     }\r
200 \r
201     private void setNodeDefinitionList(List<NodeDefinition> nodeDefinitionsList)\r
202     {\r
203         this.nodeDefinitionList = nodeDefinitionsList;\r
204     }\r
205 }\r