blob: 79125b25a5bea62db5e407af023995f7169c1a03 [file] [log] [blame]
daniel parkb5817102018-02-15 00:18:51 +09001/*
2 * Copyright 2018-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.openstacknetworking.cli;
17
18import com.google.common.collect.Lists;
19import org.apache.karaf.shell.commands.Argument;
20import org.apache.karaf.shell.commands.Command;
21import org.onlab.packet.Ip4Address;
22import org.onlab.packet.IpAddress;
23import org.onlab.packet.VlanId;
24import org.onosproject.cli.AbstractShellCommand;
25import org.onosproject.openstacknetworking.api.ExternalPeerRouter;
daniel park32b42202018-03-14 16:53:44 +090026import org.onosproject.openstacknetworking.api.OpenstackNetworkAdminService;
daniel park576969a2018-03-09 07:07:41 +090027import org.onosproject.openstacknetworking.api.OpenstackRouterService;
28import org.openstack4j.model.network.Network;
29import org.openstack4j.model.network.Router;
30import org.openstack4j.model.network.Subnet;
daniel parkb5817102018-02-15 00:18:51 +090031
32import java.util.List;
33
34/**
35 * Updates external peer router macc address.
36 */
37@Command(scope = "onos", name = "openstack-update-peer-router-vlan",
38 description = "Updates external peer router vlan")
39public class UpdateExternalPeerRouterVlanCommand extends AbstractShellCommand {
40 @Argument(index = 0, name = "ip address", description = "ip address",
41 required = true, multiValued = false)
42 private String ipAddress = null;
43
44 @Argument(index = 1, name = "vlan id", description = "vlan id",
45 required = true, multiValued = false)
46 private String vlanId = null;
47
48 private static final String FORMAT = "%-20s%-20s%-20s";
49 private static final String NO_ELEMENT = "There's no external peer router information with given ip address";
50 private static final String NONE = "None";
51
52 @Override
53 protected void execute() {
daniel park32b42202018-03-14 16:53:44 +090054 OpenstackNetworkAdminService osNetAdminService = AbstractShellCommand.get(OpenstackNetworkAdminService.class);
daniel park576969a2018-03-09 07:07:41 +090055 OpenstackRouterService osRouterService = AbstractShellCommand.get(OpenstackRouterService.class);
daniel parkb5817102018-02-15 00:18:51 +090056
57 IpAddress externalPeerIpAddress = IpAddress.valueOf(
58 IpAddress.Version.INET, Ip4Address.valueOf(ipAddress).toOctets());
59
daniel park32b42202018-03-14 16:53:44 +090060 if (osNetAdminService.externalPeerRouters().isEmpty()) {
daniel parkb5817102018-02-15 00:18:51 +090061 print(NO_ELEMENT);
62 return;
daniel park32b42202018-03-14 16:53:44 +090063 } else if (osNetAdminService.externalPeerRouters().stream()
Jian Li5e2ad4a2018-07-16 13:40:53 +090064 .noneMatch(router -> router.ipAddress().toString().equals(ipAddress))) {
daniel parkb5817102018-02-15 00:18:51 +090065 print(NO_ELEMENT);
66 return;
67 }
68
daniel park32b42202018-03-14 16:53:44 +090069 Subnet subnet = osNetAdminService.subnets().stream()
daniel park576969a2018-03-09 07:07:41 +090070 .filter(s -> s.getGateway().equals(ipAddress))
71 .findAny().orElse(null);
72 if (subnet == null) {
73 return;
74 }
75
daniel park32b42202018-03-14 16:53:44 +090076 Network network = osNetAdminService.network(subnet.getNetworkId());
daniel park576969a2018-03-09 07:07:41 +090077 if (network == null) {
78 return;
79 }
80
81 Router router = osRouterService.routers().stream()
82 .filter(r -> r.getExternalGatewayInfo().getNetworkId().equals(network.getId()))
83 .findAny().orElse(null);
84
85 if (router == null) {
86 return;
87 }
88
daniel parkb5817102018-02-15 00:18:51 +090089 try {
90 if (vlanId.equals(NONE)) {
daniel park32b42202018-03-14 16:53:44 +090091 osNetAdminService.updateExternalPeerRouterVlan(externalPeerIpAddress, VlanId.NONE);
92 osNetAdminService.deriveExternalPeerRouterMac(router.getExternalGatewayInfo(), router, VlanId.NONE);
daniel parkb5817102018-02-15 00:18:51 +090093 } else {
daniel park32b42202018-03-14 16:53:44 +090094 osNetAdminService.updateExternalPeerRouterVlan(externalPeerIpAddress, VlanId.vlanId(vlanId));
95 osNetAdminService.deriveExternalPeerRouterMac(
daniel park576969a2018-03-09 07:07:41 +090096 router.getExternalGatewayInfo(), router, VlanId.vlanId(vlanId));
97
daniel parkb5817102018-02-15 00:18:51 +090098 }
99 } catch (IllegalArgumentException e) {
100 log.error("Exception occurred because of {}", e.toString());
101 }
102
103 print(FORMAT, "Router IP", "Mac Address", "VLAN ID");
daniel park32b42202018-03-14 16:53:44 +0900104 List<ExternalPeerRouter> routers = Lists.newArrayList(osNetAdminService.externalPeerRouters());
daniel parkb5817102018-02-15 00:18:51 +0900105
daniel park576969a2018-03-09 07:07:41 +0900106 for (ExternalPeerRouter r: routers) {
Jian Li5e2ad4a2018-07-16 13:40:53 +0900107 print(FORMAT, r.ipAddress(),
108 r.macAddress().toString(),
109 r.vlanId());
daniel parkb5817102018-02-15 00:18:51 +0900110 }
111 }
112}