2 * Copyright (c) 2016, 2017 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
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
8 package org.opendaylight.netvirt.neutronvpn.shell;
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;
36 @Command(scope = "vpnservice", name = "configure-l3vpn", description = "Create/Delete Neutron L3VPN")
37 public class ConfigureL3VpnCommand extends OsgiCommandSupport {
39 private static final Logger LOG = LoggerFactory.getLogger(ConfigureL3VpnCommand.class);
41 private INeutronVpnManager neutronVpnManager;
42 private RpcConsumerRegistry rpcConsumerRegistry;
43 private NeutronvpnService neutronvpnService;
45 public void setNeutronVpnManager(INeutronVpnManager neutronVpnManager) {
46 this.neutronVpnManager = neutronVpnManager;
49 public void setRpcConsumerRegistry(RpcConsumerRegistry rpcConsumerRegistry) {
50 this.rpcConsumerRegistry = rpcConsumerRegistry;
53 @Option(name = "-op", aliases = {"--operation"}, description = "create-l3-vpn/delete-l3-vpn",
54 required = false, multiValued = false)
57 @Option(name = "-vid", aliases = {"--vpnid"}, description = "VPN ID", required = false, multiValued = false)
60 @Option(name = "-n", aliases = {"--name"}, description = "VPN Name", required = false, multiValued = false)
63 @Option(name = "-tid", aliases = {"--tenantid"}, description = "Tenant ID", required = false, multiValued = false)
66 @Option(name = "-rd", aliases = {"--rd"}, description = "Route Distinguisher", required = false, multiValued =
70 @Option(name = "-irt", aliases = {"--import-rts"}, description = "List of Import RTs", required = false,
74 @Option(name = "-ert", aliases = {"--export-rts"}, description = "List of Export RTs", required = false,
78 @Option(name = "-sid", aliases = {"--subnet-uuid"}, description = "List of Subnet IDs", required = false,
83 protected Object doExecute() throws Exception {
84 if (rpcConsumerRegistry != null) {
85 neutronvpnService = rpcConsumerRegistry.getRpcService(NeutronvpnService.class);
86 if (neutronvpnService != null) {
96 session.getConsole().println("Invalid argument.");
97 session.getConsole().println(getHelp(""));
101 session.getConsole().println("Too few arguments");
102 session.getConsole().println(getHelp(""));
105 session.getConsole().println("neutronvpnservice not initialized");
108 session.getConsole().println("rpcProviderRegistryService not initialized");
113 private void createL3VpnCLI() throws InterruptedException, ExecutionException {
115 session.getConsole().println("Please supply a valid VPN ID");
116 session.getConsole().println(getHelp("create"));
121 session.getConsole().println("Please supply a valid RD");
122 session.getConsole().println(getHelp("create"));
127 session.getConsole().println("Please supply a valid list of import RTs separated by {,}");
128 session.getConsole().println(getHelp("create"));
133 session.getConsole().println("Please supply a valid list of export RTs separated by {,}");
134 session.getConsole().println(getHelp("create"));
138 Uuid vuuid = new Uuid(vid);
140 RpcResult<CreateL3VPNOutput> createL3VpnRpcResult = null;
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(",")));
148 tuuid = new Uuid(tid);
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();
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);
162 session.getConsole().println("Error populating createL3VPN : " + result.get().getErrors());
163 session.getConsole().println(getHelp("create"));
168 * passing a subnetId list alongwith create-l3-vpn CLI implicitly indicates that
169 * association of network(s) to VPN is being intended.
171 if (createL3VpnRpcResult.isSuccessful()) {
173 List<Uuid> networkIdList = new ArrayList<>();
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);
182 session.getConsole().println("Could not find network for subnet " + subnetId.getValue()
183 + ". Not proceeding with adding subnet to VPN");
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);
196 session.getConsole().println("Error while adding subnet(s) to VPN: "
197 + result.get().getErrors());
198 session.getConsole().println(getHelp("create"));
206 private void deleteL3VpnCLI() throws InterruptedException, ExecutionException {
208 session.getConsole().println("Please supply a valid VPN ID");
209 session.getConsole().println(getHelp("delete"));
212 Uuid vpnId = new Uuid(vid);
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);
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);
228 session.getConsole().println("Error while removing subnet(s) from VPN: "
229 + result.get().getErrors());
230 session.getConsole().println(getHelp("delete"));
234 if (networkIdList == null || networkIdList.isEmpty() || dissociateNetworksRpcResult.isSuccessful()) {
235 List<Uuid> vpnIdList = new ArrayList<>();
236 vpnIdList.add(vpnId);
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);
245 session.getConsole().println("Error populating deleteL3VPN : " + result.get().getErrors());
246 session.getConsole().println(getHelp("delete"));
249 session.getConsole().println("Not proceeding with deletion of L3VPN since error(s) encountered "
250 + "in removing subnet(s) from VPN");
254 private String getHelp(String cmd) {
255 StringBuilder help = new StringBuilder("Usage:");
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");
263 help.append("exec configure-vpn -op/--operation delete-l3-vpn -vid/--vpnid <id> \n");
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");
274 return help.toString();