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.UpdateOperation;
\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.*;
\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Connection;
\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow;
\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;
\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.Operation;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.OperationBuilder;
\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.OperationKey;
\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;
\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.ParameterValuesBuilder;
\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.IntValue;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.IntValueBuilder;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.IntValueKey;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.RangeValue;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.RangeValueBuilder;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValue;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValueBuilder;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValueKey;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.condition.instance.ConditionSegment;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.condition.instance.ConditionSegmentBuilder;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.condition.instance.ConditionSegmentKey;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.condition.instance.condition.segment.ConditionParameterTargetValueBuilder;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.ActionBuilder;
\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.ActionKey;
\r
43 * Created by z00293636 on 2015/11/6.
\r
45 public class UpdateOperationLang {
\r
46 private TenantManage tenantManage;
\r
47 private Operation operation;
\r
48 private UpdateOperation updateOperation;
\r
49 List<ConditionSegment> conditionSegmentList = new ArrayList<ConditionSegment>();
\r
50 List<Action> actionList = new ArrayList<Action>();
\r
52 public UpdateOperationLang(DataBroker dataBroker, TenantManage tenantManage){
\r
53 this.tenantManage = tenantManage;
\r
54 updateOperation = new UpdateOperation(dataBroker, tenantManage);
\r
57 public String OperationHandling(UserId userId, String operationname, String target, String priority,
\r
58 LinkedHashMap<String,LinkedHashMap<String,String>> conditions,LinkedHashMap<String,LinkedHashMap<String,String>>actions){
\r
59 String errorInfo = null;
\r
60 errorInfo = createOperation(userId,operationname,target,priority,conditions,actions);
\r
61 if (errorInfo==null){
\r
62 errorInfo = updateOperation.OperationHandling(userId,this.operation);
\r
67 private String createOperation(UserId userId, String operationname, String target, String priority,
\r
68 LinkedHashMap<String,LinkedHashMap<String,String>> conditions,LinkedHashMap<String,LinkedHashMap<String,String>>actions){
\r
69 String errorInfo = null;
\r
70 tenantManage.fetchVNSpace(userId);
\r
71 User user = tenantManage.getUser();
\r
72 List<Operation> operationList = new ArrayList<Operation>();
\r
73 Boolean OperationExist = false;
\r
74 Boolean TargetExist = false;
\r
75 OperationBuilder operationBuilder = new OperationBuilder();
\r
78 if (user.getOperations()!=null){
\r
79 if (user.getOperations().getOperation()!=null){
\r
80 operationList = user.getOperations().getOperation();
\r
83 if (!operationList.isEmpty()){
\r
84 for (Operation operation1:operationList){
\r
85 if (operation1.getOperationName().getValue().equals(operationname)){
\r
86 OperationExist = true;
\r
87 operationBuilder.setKey(operation1.getKey());
\r
88 operationBuilder.setOperationId(operation1.getOperationId());
\r
92 if (!OperationExist) {
\r
93 OperationId operationId = new OperationId(UUID.randomUUID().toString());
\r
94 operationBuilder.setKey(new OperationKey(operationId));
\r
95 operationBuilder.setOperationId(operationId);
\r
98 if (user.getObjects()!=null){
\r
99 if (user.getObjects().getNode()!=null){
\r
100 for(Node node : user.getObjects().getNode()){
\r
101 if (node.getNodeName().getValue().equals(target)){
\r
102 TargetExist = true;
\r
103 operationBuilder.setTargetObject(node.getNodeId());
\r
107 if (user.getObjects().getConnection()!=null){
\r
108 for (Connection connection : user.getObjects().getConnection()){
\r
109 if (connection.getConnectionName().getValue().equals(target)){
\r
110 TargetExist = true;
\r
111 operationBuilder.setTargetObject(connection.getConnectionId());
\r
115 if (user.getObjects().getFlow()!=null){
\r
116 for (Flow flow: user.getObjects().getFlow()){
\r
117 if (flow.getFlowName().getValue().equals(target)){
\r
118 TargetExist = true;
\r
119 operationBuilder.setTargetObject(flow.getFlowId());
\r
125 errorInfo = "The target "+target+" is not exist in user vn space.";
\r
128 operationBuilder.setOperationName(new OperationName(operationname));
\r
129 operationBuilder.setPriority(Long.parseLong(priority));
\r
131 if (!conditions.isEmpty() && errorInfo==null){
\r
132 // for (String condtionName : conditions.keySet()){
\r
133 // if (condtionName.equals(NEMOConstants.time)){
\r
134 // LinkedHashMap<String,String> values = conditions.get(condtionName);
\r
135 // Iterator<String> iterator = values.values().iterator();
\r
136 // while (iterator.hasNext()){
\r
137 // if (!((iterator.next().equals(NEMOConstants.y_m_d))||iterator.next().equals(NEMOConstants.h_m_s))){
\r
138 // return "The target value is not a legal time";
\r
143 errorInfo = createCondition(conditions);
\r
144 if (errorInfo==null) {
\r
145 operationBuilder.setConditionSegment(conditionSegmentList);
\r
149 if (!actions.isEmpty() && errorInfo ==null){
\r
150 errorInfo = createAction(user,actions);
\r
151 if (errorInfo==null){
\r
152 operationBuilder.setAction(actionList);
\r
155 operation = operationBuilder.build();
\r
159 private String createCondition(LinkedHashMap<String,LinkedHashMap<String,String>> conditions){
\r
160 String errorInfo = null;
\r
162 for (String conditionname : conditions.keySet()){
\r
163 String[] condition = conditionname.split(NEMOConstants.comma);
\r
164 ConditionSegmentBuilder conditionSegmentBuilder = new ConditionSegmentBuilder();
\r
165 ConditionSegmentId conditionSegmentId = new ConditionSegmentId(UUID.randomUUID().toString());
\r
166 conditionSegmentBuilder.setKey(new ConditionSegmentKey(conditionSegmentId));
\r
167 conditionSegmentBuilder.setConditionSegmentId(conditionSegmentId);
\r
169 String preRelationOperator = condition[0];
\r
170 if (preRelationOperator == null){
\r
171 conditionSegmentBuilder.setPrecursorRelationOperator(ConditionSegment.PrecursorRelationOperator.None);
\r
173 else if (preRelationOperator.equals(NEMOConstants.not)){
\r
174 conditionSegmentBuilder.setPrecursorRelationOperator(ConditionSegment.PrecursorRelationOperator.Not);
\r
176 else if (preRelationOperator.equals(NEMOConstants.and)){
\r
177 conditionSegmentBuilder.setPrecursorRelationOperator(ConditionSegment.PrecursorRelationOperator.And);
\r
179 else if (preRelationOperator.equals(NEMOConstants.or)){
\r
180 conditionSegmentBuilder.setPrecursorRelationOperator(ConditionSegment.PrecursorRelationOperator.Or);
\r
183 String condtionName = condition[1];
\r
184 conditionSegmentBuilder.setConditionParameterName(new ConditionParameterName(condtionName));
\r
186 String matchPattern = condition[2];
\r
187 if (matchPattern.equals(NEMOConstants.equal)){
\r
188 conditionSegmentBuilder.setConditionParameterMatchPattern(ConditionSegment.ConditionParameterMatchPattern.Equal);
\r
190 else if (matchPattern.equals(NEMOConstants.not_equal)){
\r
191 conditionSegmentBuilder.setConditionParameterMatchPattern(ConditionSegment.ConditionParameterMatchPattern.NotEqual);
\r
193 else if (matchPattern.equals(NEMOConstants.greater_than)){
\r
194 conditionSegmentBuilder.setConditionParameterMatchPattern(ConditionSegment.ConditionParameterMatchPattern.GreaterThan);
\r
196 else if (matchPattern.equals(NEMOConstants.less_than)){
\r
197 conditionSegmentBuilder.setConditionParameterMatchPattern(ConditionSegment.ConditionParameterMatchPattern.LessThan);
\r
199 else if (matchPattern.equals(NEMOConstants.not_less_than)){
\r
200 conditionSegmentBuilder.setConditionParameterMatchPattern(ConditionSegment.ConditionParameterMatchPattern.NotLessThan);
\r
202 else if (matchPattern.equals(NEMOConstants.not_greater_than)){
\r
203 conditionSegmentBuilder.setConditionParameterMatchPattern(ConditionSegment.ConditionParameterMatchPattern.NotGreaterThan);
\r
205 else if (matchPattern.equals(NEMOConstants.between)){
\r
206 conditionSegmentBuilder.setConditionParameterMatchPattern(ConditionSegment.ConditionParameterMatchPattern.Between);
\r
209 LinkedHashMap<String, String> targetValue = conditions.get(conditionname);
\r
210 ConditionParameterTargetValueBuilder conditionParameterTargetValueBuilder = new ConditionParameterTargetValueBuilder();
\r
211 Iterator<String> iterator = targetValue.keySet().iterator();
\r
212 String value = iterator.next();
\r
214 if (targetValue.get(value).equals(NEMOConstants.string)){
\r
215 conditionParameterTargetValueBuilder.setStringValue(value);
\r
217 else if (targetValue.get(value).equals(NEMOConstants.integer)){
\r
218 conditionParameterTargetValueBuilder.setIntValue(Long.parseLong(value));
\r
220 else if (targetValue.get(value).equals(NEMOConstants.range)){
\r
221 RangeValueBuilder rangeValueBuilder = new RangeValueBuilder();
\r
222 String[] values = value.split(NEMOConstants.comma);
\r
223 if (Long.parseLong(values[0])>Long.parseLong(values[1])){
\r
224 rangeValueBuilder.setMax(Long.valueOf(values[0]));
\r
225 rangeValueBuilder.setMin(Long.parseLong(values[1]));
\r
227 else if (Long.parseLong(values[0])<Long.parseLong(values[1])){
\r
228 rangeValueBuilder.setMin(Long.parseLong(values[0]));
\r
229 rangeValueBuilder.setMax(Long.parseLong(values[1]));
\r
232 errorInfo = "The value "+values[0]+" and "+values[1]+" should not be equal.";
\r
237 conditionSegmentBuilder.setConditionParameterTargetValue(conditionParameterTargetValueBuilder.build());
\r
238 conditionSegmentList.add(conditionSegmentBuilder.build());
\r
243 private String createAction(User user,LinkedHashMap<String,LinkedHashMap<String,String>>actions){
\r
244 String errorInfo = null;
\r
246 for (String actionname : actions.keySet())
\r
248 ActionBuilder actionBuilder = new ActionBuilder();
\r
249 actionBuilder.setKey(new ActionKey(new ActionName(actionname)));
\r
250 actionBuilder.setActionName(new ActionName(actionname));
\r
251 actionBuilder.setOrder((long) order);
\r
253 ParameterValuesBuilder parameterValuesBuilder = new ParameterValuesBuilder();
\r
254 LinkedHashMap<String, String> actionvalues = actions.get(actionname);
\r
255 List<IntValue> intValueList = new ArrayList<IntValue>();
\r
256 List<StringValue> stringValueList = new ArrayList<StringValue>();
\r
257 RangeValue rangeValue = null;
\r
259 int actionorder = 0;
\r
260 for (String actionvalue : actionvalues.keySet())
\r
262 if (actionvalues.get(actionvalue).equals(NEMOConstants.string))
\r
264 if (intValueList.isEmpty()&&rangeValue==null) {
\r
265 Boolean ParaExist = false;
\r
266 StringValueBuilder stringValueBuilder = new StringValueBuilder();
\r
267 if (user.getObjects() != null) {
\r
268 if (user.getObjects().getNode() != null) {
\r
269 for (Node node : user.getObjects().getNode()) {
\r
270 if (node.getNodeName().getValue().equals(actionvalue)) {
\r
272 stringValueBuilder.setKey(new StringValueKey((long) actionorder, node.getNodeId().getValue()));
\r
273 stringValueBuilder.setValue(node.getNodeId().getValue());
\r
277 if (user.getObjects().getConnection() != null) {
\r
278 for (Connection connection : user.getObjects().getConnection()) {
\r
279 if (connection.getConnectionName().getValue().equals(actionvalue)) {
\r
281 stringValueBuilder.setKey(new StringValueKey((long) actionorder, connection.getConnectionId().getValue()));
\r
282 stringValueBuilder.setValue(connection.getConnectionId().getValue());
\r
286 if (user.getObjects().getFlow() != null) {
\r
287 for (Flow flow : user.getObjects().getFlow()) {
\r
288 if (flow.getFlowName().getValue().equals(actionvalue)) {
\r
290 stringValueBuilder.setKey(new StringValueKey((long) actionorder, flow.getFlowId().getValue()));
\r
291 stringValueBuilder.setValue(flow.getFlowId().getValue());
\r
296 errorInfo = "The parameter object is not exist in user vn space.";
\r
299 stringValueBuilder.setOrder((long) actionorder);
\r
300 stringValueList.add(stringValueBuilder.build());
\r
306 errorInfo = "The parameter"+actionvalue +" in action should be string";
\r
310 if (actionvalues.get(actionvalue).equals(NEMOConstants.integer)) {
\r
311 if (stringValueList.isEmpty()&&rangeValue==null){
\r
312 IntValueBuilder intValueBuilder = new IntValueBuilder();
\r
313 intValueBuilder.setKey(new IntValueKey((long)actionorder,Long.parseLong(actionvalue)));
\r
314 intValueBuilder.setOrder((long)actionorder);
\r
315 intValueBuilder.setValue(Long.parseLong(actionvalue));
\r
316 intValueList.add(intValueBuilder.build());
\r
320 errorInfo = "The parameter"+actionvalue +" in action should be int";
\r
324 if (actionvalues.get(actionvalue).equals(NEMOConstants.range)){
\r
325 if (intValueList.isEmpty()&&stringValueList.isEmpty())
\r
327 String[] rangevalue = new String[2];
\r
328 rangevalue = actionvalue.split(NEMOConstants.comma);
\r
329 RangeValueBuilder rangeValueBuilder = new RangeValueBuilder();
\r
330 if (Long.parseLong(rangevalue[0])<Long.parseLong(rangevalue[1])){
\r
331 rangeValueBuilder.setMin(Long.parseLong(rangevalue[0]));
\r
332 rangeValueBuilder.setMax(Long.parseLong(rangevalue[1]));
\r
335 rangeValueBuilder.setMin(Long.parseLong(rangevalue[1]));
\r
336 rangeValueBuilder.setMax(Long.parseLong(rangevalue[0]));
\r
338 rangeValue = rangeValueBuilder.build();
\r
342 errorInfo = "The parameter"+actionvalue +" in action should be range";
\r
347 if (intValueList.isEmpty()) {
\r
348 intValueList = null;
\r
349 parameterValuesBuilder.setIntValue(intValueList);
\r
351 if (stringValueList.isEmpty()){
\r
352 stringValueList = null;
\r
353 parameterValuesBuilder.setStringValue(stringValueList);
\r
355 parameterValuesBuilder.setIntValue(intValueList).setStringValue(stringValueList).setRangeValue(rangeValue);
\r
356 actionBuilder.setParameterValues(parameterValuesBuilder.build());
\r
357 actionList.add(actionBuilder.build());
\r