NETVIRT-1630 migrate to md-sal apis
[netvirt.git] / neutronvpn / shell / src / main / java / org / opendaylight / netvirt / neutronvpn / shell / ConfigureL3VpnCommand.java
1 /*
2  * Copyright (c) 2016, 2017 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.netvirt.neutronvpn.shell;
9
10 import java.util.ArrayList;
11 import java.util.Arrays;
12 import java.util.List;
13 import java.util.concurrent.ExecutionException;
14 import java.util.concurrent.Future;
15 import org.apache.karaf.shell.commands.Command;
16 import org.apache.karaf.shell.commands.Option;
17 import org.apache.karaf.shell.console.OsgiCommandSupport;
18 import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
19 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.AssociateNetworksInputBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.AssociateNetworksOutput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.CreateL3VPNInputBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.CreateL3VPNOutput;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.DeleteL3VPNInputBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.DeleteL3VPNOutput;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.DissociateNetworksInputBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.DissociateNetworksOutput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.NeutronvpnService;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.createl3vpn.input.L3vpn;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.createl3vpn.input.L3vpnBuilder;
32 import org.opendaylight.yangtools.yang.common.RpcResult;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36 @Command(scope = "vpnservice", name = "configure-l3vpn", description = "Create/Delete Neutron L3VPN")
37 public class ConfigureL3VpnCommand extends OsgiCommandSupport {
38
39     private static final Logger LOG = LoggerFactory.getLogger(ConfigureL3VpnCommand.class);
40
41     private INeutronVpnManager neutronVpnManager;
42     private RpcConsumerRegistry rpcConsumerRegistry;
43     private NeutronvpnService neutronvpnService;
44
45     public void setNeutronVpnManager(INeutronVpnManager neutronVpnManager) {
46         this.neutronVpnManager = neutronVpnManager;
47     }
48
49     public void setRpcConsumerRegistry(RpcConsumerRegistry rpcConsumerRegistry) {
50         this.rpcConsumerRegistry = rpcConsumerRegistry;
51     }
52
53     @Option(name = "-op", aliases = {"--operation"}, description = "create-l3-vpn/delete-l3-vpn",
54             required = false, multiValued = false)
55     String op;
56
57     @Option(name = "-vid", aliases = {"--vpnid"}, description = "VPN ID", required = false, multiValued = false)
58     String vid;
59
60     @Option(name = "-n", aliases = {"--name"}, description = "VPN Name", required = false, multiValued = false)
61     String name;
62
63     @Option(name = "-tid", aliases = {"--tenantid"}, description = "Tenant ID", required = false, multiValued = false)
64     String tid;
65
66     @Option(name = "-rd", aliases = {"--rd"}, description = "Route Distinguisher", required = false, multiValued =
67             false)
68     String rd;
69
70     @Option(name = "-irt", aliases = {"--import-rts"}, description = "List of Import RTs", required = false,
71             multiValued = false)
72     String irt;
73
74     @Option(name = "-ert", aliases = {"--export-rts"}, description = "List of Export RTs", required = false,
75             multiValued = false)
76     String ert;
77
78     @Option(name = "-sid", aliases = {"--subnet-uuid"}, description = "List of Subnet IDs", required = false,
79             multiValued = false)
80     String sid;
81
82     @Override
83     protected Object doExecute() throws Exception {
84         if (rpcConsumerRegistry != null) {
85             neutronvpnService = rpcConsumerRegistry.getRpcService(NeutronvpnService.class);
86             if (neutronvpnService != null) {
87                 if (op != null) {
88                     switch (op) {
89                         case "create-l3-vpn":
90                             createL3VpnCLI();
91                             break;
92                         case "delete-l3-vpn":
93                             deleteL3VpnCLI();
94                             break;
95                         default:
96                             session.getConsole().println("Invalid argument.");
97                             session.getConsole().println(getHelp(""));
98                             break;
99                     }
100                 } else {
101                     session.getConsole().println("Too few arguments");
102                     session.getConsole().println(getHelp(""));
103                 }
104             } else {
105                 session.getConsole().println("neutronvpnservice not initialized");
106             }
107         } else {
108             session.getConsole().println("rpcProviderRegistryService not initialized");
109         }
110         return null;
111     }
112
113     private void createL3VpnCLI() throws InterruptedException, ExecutionException {
114         if (vid == null) {
115             session.getConsole().println("Please supply a valid VPN ID");
116             session.getConsole().println(getHelp("create"));
117             return;
118         }
119
120         if (rd == null) {
121             session.getConsole().println("Please supply a valid RD");
122             session.getConsole().println(getHelp("create"));
123             return;
124         }
125
126         if (irt == null) {
127             session.getConsole().println("Please supply a valid list of import RTs separated by {,}");
128             session.getConsole().println(getHelp("create"));
129             return;
130         }
131
132         if (ert == null) {
133             session.getConsole().println("Please supply a valid list of export RTs separated by {,}");
134             session.getConsole().println(getHelp("create"));
135             return;
136         }
137
138         Uuid vuuid = new Uuid(vid);
139
140         RpcResult<CreateL3VPNOutput> createL3VpnRpcResult = null;
141         {
142             ArrayList<String> rdList = new ArrayList<>(Arrays.asList(rd.split(",")));
143             ArrayList<String> irtList = new ArrayList<>(Arrays.asList(irt.split(",")));
144             ArrayList<String> ertList = new ArrayList<>(Arrays.asList(ert.split(",")));
145             Uuid tuuid = null;
146
147             if (tid != null) {
148                 tuuid = new Uuid(tid);
149             }
150
151             List<L3vpn> l3vpns = new ArrayList<>();
152             L3vpn l3vpn = new L3vpnBuilder().setId(vuuid).setName(name).setRouteDistinguisher(rdList)
153                     .setImportRT(irtList).setExportRT(ertList).setTenantId(tuuid).build();
154             l3vpns.add(l3vpn);
155             Future<RpcResult<CreateL3VPNOutput>> result =
156                     neutronvpnService.createL3VPN(new CreateL3VPNInputBuilder().setL3vpn(l3vpns).build());
157             createL3VpnRpcResult = result.get();
158             if (createL3VpnRpcResult.isSuccessful()) {
159                 session.getConsole().println("L3VPN created successfully");
160                 LOG.trace("createl3vpn: {}", result);
161             } else {
162                 session.getConsole().println("Error populating createL3VPN : " + result.get().getErrors());
163                 session.getConsole().println(getHelp("create"));
164             }
165         }
166
167         /**
168          * passing a subnetId list alongwith create-l3-vpn CLI implicitly indicates that
169          * association of network(s) to VPN is being intended.
170          */
171         if (createL3VpnRpcResult.isSuccessful()) {
172             {
173                 List<Uuid> networkIdList = new ArrayList<>();
174
175                 if (sid != null) {
176                     for (String sidStr : sid.split(",")) {
177                         Uuid subnetId = new Uuid(sidStr);
178                         Uuid networkId = neutronVpnManager.getNetworkForSubnet(subnetId);
179                         if (networkId != null) {
180                             networkIdList.add(networkId);
181                         } else {
182                             session.getConsole().println("Could not find network for subnet " + subnetId.getValue()
183                                     + ". Not proceeding with adding subnet to VPN");
184                         }
185                     }
186
187                     if (!networkIdList.isEmpty()) {
188                         Future<RpcResult<AssociateNetworksOutput>> result =
189                                 neutronvpnService.associateNetworks(new AssociateNetworksInputBuilder()
190                                         .setVpnId(vuuid).setNetworkId(networkIdList).build());
191                         RpcResult<AssociateNetworksOutput> associateNetworksRpcResult = result.get();
192                         if (associateNetworksRpcResult.isSuccessful()) {
193                             session.getConsole().println("Subnet(s) added to VPN successfully");
194                             LOG.trace("associateNetworks: {}", result);
195                         } else {
196                             session.getConsole().println("Error while adding subnet(s) to VPN: "
197                                     + result.get().getErrors());
198                             session.getConsole().println(getHelp("create"));
199                         }
200                     }
201                 }
202             }
203         }
204     }
205
206     private void deleteL3VpnCLI() throws InterruptedException, ExecutionException {
207         if (vid == null) {
208             session.getConsole().println("Please supply a valid VPN ID");
209             session.getConsole().println(getHelp("delete"));
210             return;
211         }
212         Uuid vpnId = new Uuid(vid);
213
214         // disassociation of network(s) (removal of subnet(s)) from VPN to be followed by deletion of VPN
215         RpcResult<DissociateNetworksOutput> dissociateNetworksRpcResult = null;
216         List<Uuid> networkIdList = null;
217         networkIdList = neutronVpnManager.getNetworksForVpn(vpnId);
218
219         if (networkIdList != null && !networkIdList.isEmpty()) {
220             Future<RpcResult<DissociateNetworksOutput>> result =
221                     neutronvpnService.dissociateNetworks(new DissociateNetworksInputBuilder()
222                             .setVpnId(vpnId).setNetworkId(networkIdList).build());
223             dissociateNetworksRpcResult = result.get();
224             if (dissociateNetworksRpcResult.isSuccessful()) {
225                 session.getConsole().println("Subnet(s) removed from VPN successfully");
226                 LOG.trace("dissociateNetworks: {}", result);
227             } else {
228                 session.getConsole().println("Error while removing subnet(s) from VPN: "
229                         + result.get().getErrors());
230                 session.getConsole().println(getHelp("delete"));
231             }
232         }
233
234         if (networkIdList == null || networkIdList.isEmpty() || dissociateNetworksRpcResult.isSuccessful()) {
235             List<Uuid> vpnIdList = new ArrayList<>();
236             vpnIdList.add(vpnId);
237
238             Future<RpcResult<DeleteL3VPNOutput>> result =
239                     neutronvpnService.deleteL3VPN(new DeleteL3VPNInputBuilder().setId(vpnIdList).build());
240             RpcResult<DeleteL3VPNOutput> rpcResult = result.get();
241             if (rpcResult.isSuccessful()) {
242                 session.getConsole().println("L3VPN deleted successfully");
243                 LOG.trace("deletel3vpn: {}", result);
244             } else {
245                 session.getConsole().println("Error populating deleteL3VPN : " + result.get().getErrors());
246                 session.getConsole().println(getHelp("delete"));
247             }
248         } else {
249             session.getConsole().println("Not proceeding with deletion of L3VPN since error(s) encountered "
250                     + "in removing subnet(s) from VPN");
251         }
252     }
253
254     private String getHelp(String cmd) {
255         StringBuilder help = new StringBuilder("Usage:");
256         switch (cmd) {
257             case "create":
258                 help.append("exec configure-vpn -op/--operation create-l3-vpn -vid/--vpnid <id>\n");
259                 help.append("-rd/--rd <rd> -irt/--import-rts <irt1,irt2,..> -ert/--export-rts <ert1,ert2,..>\n");
260                 help.append("[-sid/--subnet-uuid <subnet1,subnet2,..>]\n");
261                 break;
262             case "delete":
263                 help.append("exec configure-vpn -op/--operation delete-l3-vpn -vid/--vpnid <id> \n");
264                 break;
265             case "":
266                 help.append("exec configure-vpn -op/--operation create-l3-vpn -vid/--vpnid <id>\n");
267                 help.append("-rd/--rd <rd> -irt/--import-rts <irt1,irt2,..> -ert/--export-rts <ert1,ert2,..>\n");
268                 help.append("[-sid/--subnet-uuid <subnet1,subnet2,..>]\n");
269                 help.append("exec configure-vpn -op/--operation delete-l3-vpn -vid/--vpnid <id> \n");
270                 break;
271             default:
272                 break;
273         }
274         return help.toString();
275     }
276
277 }