blob: 29d167fb268ba003f95eb8ad836992535c8dc764 [file] [log] [blame]
Hyunsun Moonc7219222017-03-27 11:05:59 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Hyunsun Moonc7219222017-03-27 11:05:59 +09003 *
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
Ray Milkey86ad7bb2018-09-27 12:32:28 -070018import org.apache.karaf.shell.api.action.Command;
Ray Milkey7a2dee52018-09-28 10:58:28 -070019import org.apache.karaf.shell.api.action.lifecycle.Service;
Hyunsun Moonc7219222017-03-27 11:05:59 +090020import org.onosproject.cli.AbstractShellCommand;
21import org.onosproject.openstacknetworking.api.OpenstackNetworkAdminService;
Hyunsun Moonc7219222017-03-27 11:05:59 +090022import org.onosproject.openstacknetworking.api.OpenstackRouterAdminService;
Hyunsun Moonae51e732017-04-25 17:46:21 +090023import org.onosproject.openstacknetworking.api.OpenstackSecurityGroupAdminService;
Jian Li51b844c2018-05-31 10:59:03 +090024import org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil;
Jian Li39057872018-04-16 11:33:12 +090025import org.onosproject.openstacknode.api.OpenstackNode;
26import org.onosproject.openstacknode.api.OpenstackNodeService;
Hyunsun Moonc7219222017-03-27 11:05:59 +090027import org.openstack4j.api.OSClient;
Hyunsun Moonc7219222017-03-27 11:05:59 +090028
sanghoshin2a354e32018-11-09 12:52:44 +080029import java.util.HashMap;
sanghoshin2a354e32018-11-09 12:52:44 +080030import java.util.Map;
Hyunsun Moonc7219222017-03-27 11:05:59 +090031import java.util.Objects;
Jian Li39057872018-04-16 11:33:12 +090032import java.util.Optional;
Hyunsun Moonc7219222017-03-27 11:05:59 +090033
Jian Li40f032a2019-10-02 20:36:09 +090034import static org.onosproject.openstacknetworking.api.Constants.FLOATING_IP_FORMAT;
35import static org.onosproject.openstacknetworking.api.Constants.NETWORK_FORMAT;
36import static org.onosproject.openstacknetworking.api.Constants.PORT_FORMAT;
37import static org.onosproject.openstacknetworking.api.Constants.ROUTER_FORMAT;
38import static org.onosproject.openstacknetworking.api.Constants.SECURITY_GROUP_FORMAT;
39import static org.onosproject.openstacknetworking.api.Constants.SUBNET_FORMAT;
Jian Li0b564282018-06-20 00:50:53 +090040import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.addRouterIface;
Jian Li40f032a2019-10-02 20:36:09 +090041import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printFloatingIp;
42import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printNetwork;
43import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printPort;
44import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printRouter;
45import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printSecurityGroup;
46import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printSubnet;
Jian Li39057872018-04-16 11:33:12 +090047import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER;
Hyunsun Moonc7219222017-03-27 11:05:59 +090048
49/**
50 * Synchronizes OpenStack network states.
51 */
Ray Milkey7a2dee52018-09-28 10:58:28 -070052@Service
Hyunsun Moonc7219222017-03-27 11:05:59 +090053@Command(scope = "onos", name = "openstack-sync-states",
54 description = "Synchronizes all OpenStack network states")
55public class OpenstackSyncStateCommand extends AbstractShellCommand {
56
Hyunsun Moonc7219222017-03-27 11:05:59 +090057 private static final String DEVICE_OWNER_GW = "network:router_gateway";
58 private static final String DEVICE_OWNER_IFACE = "network:router_interface";
59
sanghoshin2a354e32018-11-09 12:52:44 +080060 private static final String HTTP_HEADER_ACCEPT = "accept";
61 private static final String HTTP_HEADER_VALUE_JSON = "application/json";
62
Hyunsun Moonc7219222017-03-27 11:05:59 +090063 @Override
Ray Milkey86ad7bb2018-09-27 12:32:28 -070064 protected void doExecute() {
Jian Li5ecfd1a2018-12-10 11:41:03 +090065 OpenstackSecurityGroupAdminService osSgAdminService =
66 get(OpenstackSecurityGroupAdminService.class);
67 OpenstackNetworkAdminService osNetAdminService =
68 get(OpenstackNetworkAdminService.class);
69 OpenstackRouterAdminService osRouterAdminService =
70 get(OpenstackRouterAdminService.class);
Jian Li39057872018-04-16 11:33:12 +090071 OpenstackNodeService osNodeService = get(OpenstackNodeService.class);
72
Jian Li5ecfd1a2018-12-10 11:41:03 +090073 Map<String, String> headerMap = new HashMap<>();
sanghoshin2a354e32018-11-09 12:52:44 +080074 headerMap.put(HTTP_HEADER_ACCEPT, HTTP_HEADER_VALUE_JSON);
75
Jian Li39057872018-04-16 11:33:12 +090076 Optional<OpenstackNode> node = osNodeService.nodes(CONTROLLER).stream().findFirst();
77 if (!node.isPresent()) {
78 error("Keystone auth info has not been configured. " +
79 "Please specify auth info via network-cfg.json.");
80 return;
81 }
82
Jian Li51b844c2018-05-31 10:59:03 +090083 OSClient osClient = OpenstackNetworkingUtil.getConnectedClient(node.get());
Jian Li39057872018-04-16 11:33:12 +090084
Jian Li51b844c2018-05-31 10:59:03 +090085 if (osClient == null) {
Hyunsun Moonc7219222017-03-27 11:05:59 +090086 return;
Hyunsun Moonc7219222017-03-27 11:05:59 +090087 }
88
Hyunsun Moonae51e732017-04-25 17:46:21 +090089 print("Synchronizing OpenStack security groups");
90 print(SECURITY_GROUP_FORMAT, "ID", "Name");
sanghoshin2a354e32018-11-09 12:52:44 +080091 osClient.headers(headerMap).networking().securitygroup().list().forEach(osSg -> {
Jian Li21536592018-03-06 15:10:55 +090092 if (osSgAdminService.securityGroup(osSg.getId()) != null) {
Hyunsun Moonae51e732017-04-25 17:46:21 +090093 osSgAdminService.updateSecurityGroup(osSg);
94 } else {
95 osSgAdminService.createSecurityGroup(osSg);
96 }
Jian Li40f032a2019-10-02 20:36:09 +090097 printSecurityGroup(osSg);
Hyunsun Moonae51e732017-04-25 17:46:21 +090098 });
99
sanghoshin2a354e32018-11-09 12:52:44 +0800100
Hyunsun Moonae51e732017-04-25 17:46:21 +0900101 print("\nSynchronizing OpenStack networks");
Hyunsun Moonc7219222017-03-27 11:05:59 +0900102 print(NETWORK_FORMAT, "ID", "Name", "VNI", "Subnets");
sanghoshin2a354e32018-11-09 12:52:44 +0800103 osClient.headers(headerMap).networking().network().list().forEach(osNet -> {
Jian Li5a15fe62018-03-06 13:41:20 +0900104 if (osNetAdminService.network(osNet.getId()) != null) {
Hyunsun Moonc7219222017-03-27 11:05:59 +0900105 osNetAdminService.updateNetwork(osNet);
106 } else {
107 osNetAdminService.createNetwork(osNet);
108 }
109 printNetwork(osNet);
110 });
111
sanghoshin2a354e32018-11-09 12:52:44 +0800112
Hyunsun Moonae51e732017-04-25 17:46:21 +0900113 print("\nSynchronizing OpenStack subnets");
Hyunsun Moonc7219222017-03-27 11:05:59 +0900114 print(SUBNET_FORMAT, "ID", "Network", "CIDR");
sanghoshin2a354e32018-11-09 12:52:44 +0800115 osClient.headers(headerMap).networking().subnet().list().forEach(osSubnet -> {
Jian Li5a15fe62018-03-06 13:41:20 +0900116 if (osNetAdminService.subnet(osSubnet.getId()) != null) {
Hyunsun Moonc7219222017-03-27 11:05:59 +0900117 osNetAdminService.updateSubnet(osSubnet);
118 } else {
119 osNetAdminService.createSubnet(osSubnet);
120 }
Jian Li5a15fe62018-03-06 13:41:20 +0900121 printSubnet(osSubnet, osNetAdminService);
Hyunsun Moonc7219222017-03-27 11:05:59 +0900122 });
123
Hyunsun Moonae51e732017-04-25 17:46:21 +0900124 print("\nSynchronizing OpenStack ports");
Hyunsun Moonc7219222017-03-27 11:05:59 +0900125 print(PORT_FORMAT, "ID", "Network", "MAC", "Fixed IPs");
sanghoshin2a354e32018-11-09 12:52:44 +0800126 osClient.headers(headerMap).networking().port().list().forEach(osPort -> {
Jian Li5a15fe62018-03-06 13:41:20 +0900127 if (osNetAdminService.port(osPort.getId()) != null) {
Hyunsun Moonc7219222017-03-27 11:05:59 +0900128 osNetAdminService.updatePort(osPort);
129 } else {
130 osNetAdminService.createPort(osPort);
131 }
Jian Li5a15fe62018-03-06 13:41:20 +0900132 printPort(osPort, osNetAdminService);
Hyunsun Moonc7219222017-03-27 11:05:59 +0900133 });
134
Hyunsun Moonae51e732017-04-25 17:46:21 +0900135 print("\nSynchronizing OpenStack routers");
Hyunsun Moonc7219222017-03-27 11:05:59 +0900136 print(ROUTER_FORMAT, "ID", "Name", "External", "Internal");
sanghoshin2a354e32018-11-09 12:52:44 +0800137 osClient.headers(headerMap).networking().router().list().forEach(osRouter -> {
Jian Lida7c6cb2018-03-06 14:58:54 +0900138 if (osRouterAdminService.router(osRouter.getId()) != null) {
Hyunsun Moonc7219222017-03-27 11:05:59 +0900139 osRouterAdminService.updateRouter(osRouter);
140 } else {
141 osRouterAdminService.createRouter(osRouter);
142 }
143
144 // FIXME do we need to manage router interfaces separately?
Jian Li5a15fe62018-03-06 13:41:20 +0900145 osNetAdminService.ports().stream()
Hyunsun Moonc7219222017-03-27 11:05:59 +0900146 .filter(osPort -> Objects.equals(osPort.getDeviceId(), osRouter.getId()) &&
147 Objects.equals(osPort.getDeviceOwner(), DEVICE_OWNER_IFACE))
Jian Lida7c6cb2018-03-06 14:58:54 +0900148 .forEach(osPort -> addRouterIface(osPort, osRouterAdminService));
Hyunsun Moonc7219222017-03-27 11:05:59 +0900149
Jian Li5a15fe62018-03-06 13:41:20 +0900150 printRouter(osRouter, osNetAdminService);
Hyunsun Moonc7219222017-03-27 11:05:59 +0900151 });
152
Hyunsun Moonae51e732017-04-25 17:46:21 +0900153 print("\nSynchronizing OpenStack floating IPs");
Hyunsun Moonc7219222017-03-27 11:05:59 +0900154 print(FLOATING_IP_FORMAT, "ID", "Floating IP", "Fixed IP");
sanghoshin2a354e32018-11-09 12:52:44 +0800155 osClient.headers(headerMap).networking().floatingip().list().forEach(osFloating -> {
Jian Lida7c6cb2018-03-06 14:58:54 +0900156 if (osRouterAdminService.floatingIp(osFloating.getId()) != null) {
Hyunsun Moonc7219222017-03-27 11:05:59 +0900157 osRouterAdminService.updateFloatingIp(osFloating);
158 } else {
159 osRouterAdminService.createFloatingIp(osFloating);
160 }
161 printFloatingIp(osFloating);
162 });
163 }
Hyunsun Moonc7219222017-03-27 11:05:59 +0900164}