a47d04f1b02b4cb12fbc7238b6d53039b88f2157
[groupbasedpolicy.git] / renderers / vpp / src / main / java / org / opendaylight / groupbasedpolicy / renderer / vpp / commands / VhostUserCommand.java
1 /*\r
2  * Copyright (c) 2016 Cisco Systems. 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 \r
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.commands;\r
10 \r
11 import com.google.common.base.Preconditions;\r
12 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;\r
13 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
14 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General;\r
15 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;\r
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;\r
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;\r
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VhostUserRole;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentation;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentationBuilder;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.L2Builder;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VhostUserBuilder;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.l2.interconnection.BridgeBasedBuilder;\r
25 import org.slf4j.Logger;\r
26 import org.slf4j.LoggerFactory;\r
27 \r
28 public class VhostUserCommand extends AbstractInterfaceCommand {\r
29 \r
30     private static final Logger LOG = LoggerFactory.getLogger(VhostUserCommand.class);\r
31     private String socket;\r
32     private VhostUserRole role;\r
33     private String bridgeDomain;\r
34 \r
35     private VhostUserCommand(VhostUserCommandBuilder builder) {\r
36         this.name = builder.getName();\r
37         this.operation = builder.getOperation();\r
38         this.socket = builder.getSocket();\r
39         this.role = builder.getRole();\r
40         this.enabled = builder.isEnabled();\r
41         this.description = builder.getDescription();\r
42         this.bridgeDomain = builder.getBridgeDomain();\r
43 \r
44     }\r
45 \r
46     public static VhostUserCommandBuilder builder() {\r
47         return new VhostUserCommandBuilder();\r
48     }\r
49 \r
50     public String getSocket() {\r
51         return socket;\r
52     }\r
53 \r
54     public VhostUserRole getRole() {\r
55         return role;\r
56     }\r
57 \r
58     public String getBridgeDomain() {\r
59         return bridgeDomain;\r
60     }\r
61 \r
62     @Override\r
63     public void execute(ReadWriteTransaction readWriteTransaction) {\r
64         switch (getOperation()) {\r
65 \r
66             case PUT:\r
67                 LOG.info("Executing Add operation for command: {}", this);\r
68                 put(readWriteTransaction);\r
69                 break;\r
70             case DELETE:\r
71                 LOG.info("Executing Delete operation for command: {}", this);\r
72                 delete(readWriteTransaction);\r
73                 break;\r
74             case MERGE:\r
75                 LOG.info("Executing Update operation for command: {}", this);\r
76                 merge(readWriteTransaction);\r
77                 break;\r
78             default:\r
79                 LOG.error("Execution failed for command: {}", this);\r
80                 break;\r
81         }\r
82     }\r
83 \r
84     private void put(ReadWriteTransaction readWriteTransaction) {\r
85         Preconditions.checkNotNull(name, "Interface name should not be null");\r
86 \r
87         InterfaceBuilder interfaceBuilder = getVhostUserInterfaceBuilder();\r
88 \r
89         readWriteTransaction.put(LogicalDatastoreType.CONFIGURATION,\r
90                 VppIidFactory.getInterfaceIID(interfaceBuilder.getKey()), interfaceBuilder.build(), true);\r
91     }\r
92 \r
93     private void merge(ReadWriteTransaction readWriteTransaction) {\r
94         Preconditions.checkNotNull(name, "Interface name should not be null");\r
95 \r
96         InterfaceBuilder interfaceBuilder = getVhostUserInterfaceBuilder();\r
97 \r
98             readWriteTransaction.merge(LogicalDatastoreType.CONFIGURATION,\r
99                     VppIidFactory.getInterfaceIID(interfaceBuilder.getKey()), interfaceBuilder.build());\r
100     }\r
101 \r
102     private InterfaceBuilder getVhostUserInterfaceBuilder() {\r
103         InterfaceBuilder interfaceBuilder =\r
104                 new InterfaceBuilder().setKey(new InterfaceKey(name))\r
105                         .setEnabled(enabled)\r
106                         .setDescription(description)\r
107                         .setType(\r
108                                 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VhostUser.class)\r
109                         .setName(name)\r
110                         .setLinkUpDownTrapEnable(Interface.LinkUpDownTrapEnable.Enabled);\r
111 \r
112         // Create the vhost augmentation\r
113         VppInterfaceAugmentation vppAugmentation =\r
114                 new VppInterfaceAugmentationBuilder()\r
115                         .setVhostUser(new VhostUserBuilder().setRole(role).setSocket(socket).build())\r
116                         .setL2(new L2Builder()\r
117                                 .setInterconnection(new BridgeBasedBuilder().setBridgeDomain(bridgeDomain).build()).build())\r
118                         .build();\r
119 \r
120         interfaceBuilder.addAugmentation(VppInterfaceAugmentation.class, vppAugmentation);\r
121         return interfaceBuilder;\r
122     }\r
123 \r
124     private void delete(ReadWriteTransaction readWriteTransaction) {\r
125         try {\r
126             readWriteTransaction.delete(LogicalDatastoreType.CONFIGURATION,\r
127                     VppIidFactory.getInterfaceIID(new InterfaceKey(name)));\r
128         } catch (IllegalStateException ex) {\r
129             LOG.debug("Vhost Interface is not present in DS", ex);\r
130         }\r
131 \r
132     }\r
133 \r
134     public static class VhostUserCommandBuilder {\r
135 \r
136         private String name;\r
137         private General.Operations operation;\r
138         private String socket;\r
139         private VhostUserRole role = VhostUserRole.Server;\r
140         private boolean enabled = true;\r
141         private String description;\r
142         private String bridgeDomain;\r
143 \r
144         public String getName() {\r
145             return name;\r
146         }\r
147 \r
148         public VhostUserCommandBuilder setName(String name) {\r
149             this.name = name;\r
150             return this;\r
151         }\r
152 \r
153         public General.Operations getOperation() {\r
154             return operation;\r
155         }\r
156 \r
157         public VhostUserCommandBuilder setOperation(General.Operations operation) {\r
158             this.operation = operation;\r
159             return this;\r
160         }\r
161 \r
162         public String getSocket() {\r
163             return socket;\r
164         }\r
165 \r
166         public VhostUserCommandBuilder setSocket(String socket) {\r
167             this.socket = socket;\r
168             return this;\r
169         }\r
170 \r
171         public VhostUserRole getRole() {\r
172             return role;\r
173         }\r
174 \r
175         public VhostUserCommandBuilder setRole(VhostUserRole role) {\r
176             this.role = role;\r
177             return this;\r
178         }\r
179 \r
180         public boolean isEnabled() {\r
181             return enabled;\r
182         }\r
183 \r
184         public VhostUserCommandBuilder setEnabled(boolean enabled) {\r
185             this.enabled = enabled;\r
186             return this;\r
187         }\r
188 \r
189         public String getDescription() {\r
190             return description;\r
191         }\r
192 \r
193         public VhostUserCommandBuilder setDescription(String description) {\r
194             this.description = description;\r
195             return this;\r
196         }\r
197 \r
198         public String getBridgeDomain() {\r
199             return bridgeDomain;\r
200         }\r
201 \r
202         public VhostUserCommandBuilder setBridgeDomain(String bridgeDomain) {\r
203             this.bridgeDomain = bridgeDomain;\r
204             return this;\r
205         }\r
206 \r
207         /**\r
208          * VhostUserCommand build method.\r
209          *\r
210          * @return VhostUserCommand\r
211          * @throws IllegalArgumentException if name, operation or socket is null.\r
212          */\r
213         public VhostUserCommand build() {\r
214             Preconditions.checkArgument(this.name != null);\r
215             Preconditions.checkArgument(this.operation != null);\r
216             Preconditions.checkArgument(this.socket != null);\r
217 \r
218             return new VhostUserCommand(this);\r
219         }\r
220     }\r
221 }\r