49263100f8644c1390f5a29629d4baa9e8f259f9
[nemo.git] / nemo-impl / src / main / java / org / opendaylight / nemo / user / vnspacemanager / languagestyle / updateintentlang / UpdateOperationLang.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.languagestyle.updateintentlang;\r
9 \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
38 \r
39 \r
40 import java.util.*;\r
41 \r
42 /**\r
43  * Created by z00293636 on 2015/11/6.\r
44  */\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
51 \r
52     public UpdateOperationLang(DataBroker dataBroker, TenantManage tenantManage){\r
53         this.tenantManage = tenantManage;\r
54         updateOperation = new UpdateOperation(dataBroker, tenantManage);\r
55     }\r
56 \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
63         }\r
64         return errorInfo;\r
65     }\r
66 \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
76 \r
77 \r
78         if (user.getOperations()!=null){\r
79             if (user.getOperations().getOperation()!=null){\r
80                 operationList = user.getOperations().getOperation();\r
81             }\r
82         }\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
89                 }\r
90             }\r
91         }\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
96         }\r
97 \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
104                     }\r
105                 }\r
106             }\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
112                     }\r
113                 }\r
114             }\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
120                     }\r
121                 }\r
122             }\r
123         }\r
124         if (!TargetExist){\r
125             errorInfo = "The target "+target+" is not exist in user vn space.";\r
126             return errorInfo;\r
127         }\r
128         operationBuilder.setOperationName(new OperationName(operationname));\r
129         operationBuilder.setPriority(Long.parseLong(priority));\r
130 \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
139 //                        }\r
140 //                    }\r
141 //                }\r
142 //            }\r
143             errorInfo = createCondition(conditions);\r
144             if (errorInfo==null) {\r
145                 operationBuilder.setConditionSegment(conditionSegmentList);\r
146             }\r
147         }\r
148 \r
149         if (!actions.isEmpty() && errorInfo ==null){\r
150             errorInfo = createAction(user,actions);\r
151             if (errorInfo==null){\r
152                 operationBuilder.setAction(actionList);\r
153             }\r
154         }\r
155         operation = operationBuilder.build();\r
156         return  errorInfo;\r
157     }\r
158 \r
159     private String createCondition(LinkedHashMap<String,LinkedHashMap<String,String>> conditions){\r
160         String errorInfo = null;\r
161 \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
168 \r
169             String preRelationOperator = condition[0];\r
170             if (preRelationOperator == null){\r
171                 conditionSegmentBuilder.setPrecursorRelationOperator(ConditionSegment.PrecursorRelationOperator.None);\r
172             }\r
173             else if (preRelationOperator.equals(NEMOConstants.not)){\r
174                 conditionSegmentBuilder.setPrecursorRelationOperator(ConditionSegment.PrecursorRelationOperator.Not);\r
175             }\r
176             else if (preRelationOperator.equals(NEMOConstants.and)){\r
177                 conditionSegmentBuilder.setPrecursorRelationOperator(ConditionSegment.PrecursorRelationOperator.And);\r
178             }\r
179             else if (preRelationOperator.equals(NEMOConstants.or)){\r
180                 conditionSegmentBuilder.setPrecursorRelationOperator(ConditionSegment.PrecursorRelationOperator.Or);\r
181             }\r
182 \r
183             String condtionName = condition[1];\r
184             conditionSegmentBuilder.setConditionParameterName(new ConditionParameterName(condtionName));\r
185 \r
186             String matchPattern = condition[2];\r
187             if (matchPattern.equals(NEMOConstants.equal)){\r
188                 conditionSegmentBuilder.setConditionParameterMatchPattern(ConditionSegment.ConditionParameterMatchPattern.Equal);\r
189             }\r
190             else if (matchPattern.equals(NEMOConstants.not_equal)){\r
191                 conditionSegmentBuilder.setConditionParameterMatchPattern(ConditionSegment.ConditionParameterMatchPattern.NotEqual);\r
192             }\r
193             else if (matchPattern.equals(NEMOConstants.greater_than)){\r
194                 conditionSegmentBuilder.setConditionParameterMatchPattern(ConditionSegment.ConditionParameterMatchPattern.GreaterThan);\r
195             }\r
196             else if (matchPattern.equals(NEMOConstants.less_than)){\r
197                 conditionSegmentBuilder.setConditionParameterMatchPattern(ConditionSegment.ConditionParameterMatchPattern.LessThan);\r
198             }\r
199             else if (matchPattern.equals(NEMOConstants.not_less_than)){\r
200                 conditionSegmentBuilder.setConditionParameterMatchPattern(ConditionSegment.ConditionParameterMatchPattern.NotLessThan);\r
201             }\r
202             else if (matchPattern.equals(NEMOConstants.not_greater_than)){\r
203                 conditionSegmentBuilder.setConditionParameterMatchPattern(ConditionSegment.ConditionParameterMatchPattern.NotGreaterThan);\r
204             }\r
205             else if (matchPattern.equals(NEMOConstants.between)){\r
206                 conditionSegmentBuilder.setConditionParameterMatchPattern(ConditionSegment.ConditionParameterMatchPattern.Between);\r
207             }\r
208 \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
213 \r
214             if (targetValue.get(value).equals(NEMOConstants.string)){\r
215                 conditionParameterTargetValueBuilder.setStringValue(value);\r
216             }\r
217             else if (targetValue.get(value).equals(NEMOConstants.integer)){\r
218                 conditionParameterTargetValueBuilder.setIntValue(Long.parseLong(value));\r
219             }\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
226                 }\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
230                 }\r
231                 else {\r
232                     errorInfo = "The value "+values[0]+" and "+values[1]+" should not be equal.";\r
233                     return errorInfo;\r
234                 }\r
235             }\r
236 \r
237             conditionSegmentBuilder.setConditionParameterTargetValue(conditionParameterTargetValueBuilder.build());\r
238             conditionSegmentList.add(conditionSegmentBuilder.build());\r
239         }\r
240         return errorInfo;\r
241     }\r
242 \r
243     private String createAction(User user,LinkedHashMap<String,LinkedHashMap<String,String>>actions){\r
244         String errorInfo = null;\r
245         int order = 0;\r
246         for (String actionname : actions.keySet())\r
247         {\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
252 \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
258 \r
259             int actionorder = 0;\r
260             for (String actionvalue : actionvalues.keySet())\r
261             {\r
262                 if (actionvalues.get(actionvalue).equals(NEMOConstants.string))\r
263                 {\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
271                                         ParaExist = true;\r
272                                         stringValueBuilder.setKey(new StringValueKey((long) actionorder, node.getNodeId().getValue()));\r
273                                         stringValueBuilder.setValue(node.getNodeId().getValue());\r
274                                     }\r
275                                 }\r
276                             }\r
277                             if (user.getObjects().getConnection() != null) {\r
278                                 for (Connection connection : user.getObjects().getConnection()) {\r
279                                     if (connection.getConnectionName().getValue().equals(actionvalue)) {\r
280                                         ParaExist = true;\r
281                                         stringValueBuilder.setKey(new StringValueKey((long) actionorder, connection.getConnectionId().getValue()));\r
282                                         stringValueBuilder.setValue(connection.getConnectionId().getValue());\r
283                                     }\r
284                                 }\r
285                             }\r
286                             if (user.getObjects().getFlow() != null) {\r
287                                 for (Flow flow : user.getObjects().getFlow()) {\r
288                                     if (flow.getFlowName().getValue().equals(actionvalue)) {\r
289                                         ParaExist = true;\r
290                                         stringValueBuilder.setKey(new StringValueKey((long) actionorder, flow.getFlowId().getValue()));\r
291                                         stringValueBuilder.setValue(flow.getFlowId().getValue());\r
292                                     }\r
293                                 }\r
294                             }\r
295                             if (!ParaExist){\r
296                                 errorInfo = "The parameter object is not exist in user vn space.";\r
297                             }\r
298 \r
299                             stringValueBuilder.setOrder((long) actionorder);\r
300                             stringValueList.add(stringValueBuilder.build());\r
301                             actionorder++;\r
302                         }\r
303                     }\r
304 \r
305                     else{\r
306                         errorInfo = "The parameter"+actionvalue +" in action should be string";\r
307                         return errorInfo;\r
308                     }\r
309                 }\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
317                         actionorder ++;\r
318                     }\r
319                     else{\r
320                         errorInfo = "The parameter"+actionvalue +" in action should be int";\r
321                         return errorInfo;\r
322                     }\r
323                 }\r
324                 if (actionvalues.get(actionvalue).equals(NEMOConstants.range)){\r
325                     if (intValueList.isEmpty()&&stringValueList.isEmpty())\r
326                     {\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
333                         }\r
334                         else{\r
335                             rangeValueBuilder.setMin(Long.parseLong(rangevalue[1]));\r
336                             rangeValueBuilder.setMax(Long.parseLong(rangevalue[0]));\r
337                         }\r
338                         rangeValue = rangeValueBuilder.build();\r
339                         actionorder ++;\r
340                     }\r
341                     else{\r
342                         errorInfo = "The parameter"+actionvalue +" in action should be range";\r
343                         return errorInfo;\r
344                     }\r
345                 }\r
346             }\r
347             if (intValueList.isEmpty()) {\r
348                 intValueList = null;\r
349                 parameterValuesBuilder.setIntValue(intValueList);\r
350             }\r
351             if (stringValueList.isEmpty()){\r
352                 stringValueList = null;\r
353                 parameterValuesBuilder.setStringValue(stringValueList);\r
354             }\r
355             parameterValuesBuilder.setIntValue(intValueList).setStringValue(stringValueList).setRangeValue(rangeValue);\r
356             actionBuilder.setParameterValues(parameterValuesBuilder.build());\r
357             actionList.add(actionBuilder.build());\r
358         }\r
359         return errorInfo;\r
360     }\r
361 }\r