2 * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.
\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
8 package org.opendaylight.nemo.user.vnspacemanager.syntaxcheck;
\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
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
34 import org.slf4j.Logger;
\r
35 import org.slf4j.LoggerFactory;
\r
37 import java.util.List;
\r
40 * Created by z00293636 on 2015/9/2.
\r
42 public class NodeDefinitionCheck {
\r
44 private DataBroker dataBroker;
\r
45 private List<NodeDefinition> nodeDefinitionList;
\r
46 private static final Logger LOG = LoggerFactory.getLogger(NodeDefinitionCheck.class);
\r
48 public NodeDefinitionCheck(DataBroker dataBroker)
\r
50 this.dataBroker = dataBroker;
\r
51 nodeDefinitionList = null;
\r
54 public String CheckNodeDefinition(Node node)
\r
56 String errorInfo = null;
\r
57 Boolean NodeHasDefined = false;
\r
59 fetchNodeDefinitions();
\r
60 if (nodeDefinitionList != null)
\r
62 for (NodeDefinition nodeDefinition : nodeDefinitionList)
\r
64 if (nodeDefinition.getNodeType().equals(node.getNodeType()))
\r
66 NodeHasDefined = true;
\r
67 List<Property> nodeProperties = node.getProperty();
\r
68 List<PropertyDefinition> nodePropertyDefinitions = nodeDefinition.getPropertyDefinition();
\r
70 if (nodeProperties != null && nodePropertyDefinitions == null)
\r
72 errorInfo = "This type of node has no properties.";
\r
75 else if (nodeProperties != null && nodePropertyDefinitions != null)
\r
77 errorInfo = checkProperty(nodeProperties, nodeDefinition.getPropertyDefinition());
\r
78 if (errorInfo != null)
\r
87 if (!NodeHasDefined)
\r
89 errorInfo = "This type of Node has not been defined.";
\r
94 private String checkProperty(List<Property> nodeProperties, List<PropertyDefinition> nodePropertyDefinitions)
\r
96 Boolean propertyHasDefine = false;
\r
97 String errorInfo = null;
\r
99 for (Property property : nodeProperties)
\r
101 if (errorInfo != null)
\r
107 for (PropertyDefinition propertydefinition : nodePropertyDefinitions)
\r
109 if (property.getPropertyName().equals(propertydefinition.getPropertyName()))
\r
111 propertyHasDefine = true;
\r
112 PropertyValues propertyValues = property.getPropertyValues();
\r
113 PropertyDefinition.PropertyValueType propertyValueType = propertydefinition.getPropertyValueType();
\r
115 if (propertyValues != null && propertyValueType != null)
\r
117 if (propertydefinition.getIsReadOnly()!=null)
\r
119 if (propertydefinition.getIsRequired().getIntValue() == 1)
\r
121 errorInfo = "The property"+ property.getPropertyName().toString()+" is readonly, can not be written.";
\r
125 else if (propertyValueType.getIntValue() == 0 && !(propertyValues.getIntValue() == null && propertyValues.getStringValue() != null && propertyValues.getRangeValue() == null))
\r
127 errorInfo = "The property value type"+property.getPropertyName().toString()+" should be string";
\r
130 else if (propertyValueType.getIntValue() == 1 && !(propertyValues.getIntValue() != null && propertyValues.getStringValue() == null && propertyValues.getRangeValue() == null))
\r
132 errorInfo = "The property value type"+property.getPropertyName().toString()+" should be integer";
\r
135 else if (propertyValueType.getIntValue() == 2 && !(propertyValues.getIntValue() == null && propertyValues.getStringValue() == null && propertyValues.getRangeValue() != null))
\r
137 errorInfo = "The property value type"+property.getPropertyName().toString()+" should be range";
\r
144 if (!propertyHasDefine)
\r
146 errorInfo = "The property"+property.getPropertyName().toString()+"has not been defined.";
\r
151 if (errorInfo == null)
\r
153 Boolean requiredProperty = false;
\r
154 for (PropertyDefinition propertyDefinition : nodePropertyDefinitions)
\r
156 if (propertyDefinition.getIsRequired()!=null)
\r
158 if (propertyDefinition.getIsRequired().getIntValue() ==0)
\r
160 for (Property property: nodeProperties)
\r
162 if (property.getPropertyName().equals(propertyDefinition.getPropertyName()))
\r
164 requiredProperty = true;
\r
167 if (!requiredProperty)
\r
169 errorInfo = "The required property "+ propertyDefinition.getPropertyName().toString() + "is not included in the intent.";
\r
179 private void fetchNodeDefinitions()
\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
185 public void onSuccess(Optional<NodeDefinitions> result)
\r
187 setNodeDefinitionList(result.get().getNodeDefinition());
\r
192 public void onFailure(Throwable t)
\r
194 LOG.error("Can not read node definitions information.", t);
\r
201 private void setNodeDefinitionList(List<NodeDefinition> nodeDefinitionsList)
\r
203 this.nodeDefinitionList = nodeDefinitionsList;
\r