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.languagestyle.updateintentlang;
\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
30 * Created by z00293636 on 2015/10/31.
\r
32 public class UpdateNodeLang {
\r
33 private TenantManage tenantManage;
\r
34 private UpdateNode updateNode;
\r
36 private UpdateTemplateInstanceLang updateTemplateInstanceLang;
\r
37 private GetDefinitions getDefinitions;
\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
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
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
53 Boolean nodeModel = false;
\r
54 if (tenantManage.getTempalteDefinition(userId)!=null){
\r
55 if (tenantManage.getTempalteDefinition(userId).containsKey(new TemplateName(nodetype))){
\r
59 else if (tenantManage.getDefinitionDataStore(userId)!=null){
\r
60 if (tenantManage.getDefinitionDataStore(userId).containsKey(new TemplateName(nodetype))){
\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
78 if (!subnodes.isEmpty()){
\r
79 return "Subnodes should not be included in template instance.";
\r
82 errorInfo = updateTemplateInstanceLang.templateInstanceLang(userId,nodename,nodetype,propertyList);
\r
86 if (!propertyList.isEmpty()){
\r
87 errorInfo = checkProperty(propertyList);
\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
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
107 while (iterator.hasNext()) {
\r
108 if (valueType.equals(NEMOConstants.range)) {
\r
109 errorInfo = "The property should just has one range value.";
\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
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
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
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
137 else if (tenantManage.getNodeDataStore(userId)!=null){
\r
138 node1 = tenantManage.getNodeDataStore(userId).get(nodeId);
\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
151 return "The host " + nodename + " is not exist in physical network.";
\r
155 NodeId nodeId = new NodeId(UUID.randomUUID().toString());
\r
156 nodeBuilder.setKey(new NodeKey(nodeId))
\r
157 .setNodeId(nodeId);
\r
161 nodeBuilder.setKey(node1.getKey())
\r
162 .setNodeId(node1.getNodeId());
\r
165 nodeBuilder.setNodeName(new NodeName(nodename))
\r
166 .setNodeType(new NodeType(nodetype));
\r
170 if (!subnodes.isEmpty())
\r
172 List<SubNode> subNodeList = new ArrayList<SubNode>();
\r
174 for (String subnodeName : subnodes)
\r
176 String nodeId = tenantManage.getObjectId(userId,subnodeName);
\r
177 if (nodeId==null) {
\r
178 return "The subnode " +subnodeName+ " is not exist.";
\r
181 SubNodeBuilder subNodeBuilder = new SubNodeBuilder();
\r
182 subNodeBuilder.setKey(new SubNodeKey(new NodeId(nodeId)))
\r
183 .setNodeId(new NodeId(nodeId))
\r
186 subNodeList.add(subNodeBuilder.build());
\r
189 nodeBuilder.setSubNode(subNodeList);
\r
192 if (errorInfo==null && !propertyList.isEmpty())
\r
194 PropertyBuilder propertyBuilder = new PropertyBuilder();
\r
195 List<Property> nodeproperty = new ArrayList<Property>();
\r
196 for (String propertyname : propertyList.keySet())
\r
198 propertyBuilder.setKey(new PropertyKey(new PropertyName(propertyname)));
\r
199 propertyBuilder.setPropertyName(new PropertyName(propertyname));
\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
208 for (String value : valuetype.keySet())
\r
210 if (valuetype.get(value).equals(NEMOConstants.string))
\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
218 if (valuetype.get(value).equals(NEMOConstants.integer))
\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
226 if (valuetype.get(value).equals(NEMOConstants.range))
\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
233 rangeValueBuilder.setMin(Long.parseLong(rangevalue[0]));
\r
234 rangeValueBuilder.setMax(Long.parseLong(rangevalue[1]));
\r
238 rangeValueBuilder.setMin(Long.parseLong(rangevalue[1]));
\r
239 rangeValueBuilder.setMax(Long.parseLong(rangevalue[0]));
\r
241 RangeValue = rangeValueBuilder.build();
\r
242 propertyValuesBuilder.setRangeValue(RangeValue);
\r
246 if (intValueList.isEmpty())
\r
248 intValueList = null;
\r
249 propertyValuesBuilder.setIntValue(intValueList);
\r
251 if (stringValueList.isEmpty())
\r
253 stringValueList = null;
\r
254 propertyValuesBuilder.setStringValue(stringValueList);
\r
257 propertyValuesBuilder.setIntValue(intValueList).setStringValue(stringValueList).setRangeValue(RangeValue);
\r
258 propertyBuilder.setPropertyValues(propertyValuesBuilder.build());
\r
259 nodeproperty.add(propertyBuilder.build());
\r
261 nodeBuilder.setProperty(nodeproperty);
\r
263 this.node = nodeBuilder.build();
\r