This program is to manage SDC (Software-Defined Clouds) in autonomic mechanism.
This program is built on top of several assumptions and thus these need to be set up before usage.
OpenStack: admission control, VM allocation, tenant authentication, and other cloud management functionalities.
-
OpenStack Neutron: manages VM networks. Neutron is used to create/manage virtual networks on tenants side.
-
OpenDayLight: SDN controller. Basically all switches are connected to ODL, while networks on hosts and VMs are managed by OS Neutron.
-
OpenVSwitch: software-based switch. All switches composing our topology are OVS, which can be easily managed from ODL.
Base network topology is 3-tier fat-tree multi-path topology. There are Core, Aggregate, and Edge switches, where Edge switches are connected to hosts.
-
192.168.0.X
: For a tenant network. All hosts have this IP range. -
192.168.99.X
: For a management network. Switches can be accessed through this IP range. -
IP range of hosts:
192.168.99.1
-192.168.99.99
/192.168.99.130
-192.168.99.254
-
IP range of switches:
192.168.99.100
-192.168.99.129
-
OS and ODL Controller:
192.168.99.1
In each switch, an OVS bridge is created to forward packets between ports using this command:
sudo ovs-vsctl add-br ovsbr0
All ports are added to the bridge.
sudo ovs-vsctl add-port ovsbr0 eth1
sudo ovs-vsctl add-port ovsbr0 eth2
sudo ovs-vsctl add-port ovsbr0 eth3
sudo ovs-vsctl add-port ovsbr0 eth4
Set SDN controller for the ovsbr0 bridge.
sudo ovs-vsctl set-controller ovsbr0 tcp:192.168.99.1:6633
Note that TCP port 6633 is for ODL OpenFlow. Another port is used for OS Neutron to manage the hosts OpenFlow network.
In addition to the differentiated IP addresses, switches are set up with a specific DPID (mac address) in order to identify their tiers easily.
-
Core switches:
40960000
-40960009
= (0x2710000 - 0x2710009) -
Aggr switches:
40960010
-40960019
= (0x271000A - 0x2710013) -
Edge switches:
40960020
-40960029
= (0x2710014 - 0x271001D)
DPID can be set up using OVS management command:
sudo ovs-vsctl set bridge ovsbr0 other-config:hwaddr=00:00:02:71:00:00
Note that the last two digits in DPID is same as the last two digits in IP address of the switch. For example, 40960027 switch will have an IP address 192.168.99.127.
This is important to identify a switch using both IP address and DPID, because ODL uses both identifier on different purpose.
Port number in OVS bridge at each switch is matching to the name of interface. For example, the port number of an interface eth2
is set to 2
in ovsbr0
.
Port number to interface name mapping can be checked:
sudo ovs-ofctl show ovsbr0
We used OVSDB plugin in order to manage QoS queues in OVS switches. OVSDB requires to set an external ID to identify different OVS switches. This command sets an external ID ('ovsdb:40960000') for OpenDayLight OVSDB plugin.
sudo ovs-vsctl set open_vswitch . external-ids:opendaylight-iid=/network-topology:network-topology/network-topology:topology[network-topology:topology-id=\'ovsdb:1\']/network-topology:node[network-topology:node-id=\'ovsdb:40960000\']
Also, OVS manager should be set in order to control the OVSDB by the controller.
sudo ovs-vsctl set-manager tcp:192.168.99.1:6641
Note that port 6641 is for ODL OVSDB plugin. Port 6640 was used by OS Neutron to manage OVSDB.
Default path for Fat-Tree can be set up using network_defpath.py
program. It uses source-address packet distribution among multiple paths.
To initiate default paths:
python network_defpath.py set
To delete the default paths initiated with this program, use:
python network_defpath.py del
This is a python module to get the monitored mesurements of the network using sFlow. Make sure that sFlow is properly set up and running on the controller.
- Set up sFlow - switches
For each OVS node, use the following command to add sFlow agent that sends the monitored statististics to the sFlow controller.
sudo ovs-vsctl -- \
--id=@sflow create sflow agent=eth0 target="192.168.99.1\:6343" header=128 sampling=64 polling=10 -- \
set bridge ovsbr0 sflow=@sflow
- agent=eth0 eth0 is the network interface that connects to the sFlow collector (192.168.99.1)
- target="192.168.99.1:6343 IP and port of the sFlow collector
- bridge ovsbr0 a bridge to monitor the network packets. Note that sFlow reports incoming traffic of each port in the specified OVS bridge. If you want to monitor multiple bridges, set sflow for every bridge.
- Set up sFlow - collector
An sFlow collector is in charge of gathering monitored data from each agent and providing the aggregated measurements to the user. We use (sFlow-rt)[http://www.sflow-rt.com/download.php], which is simple to install and easy to use. It also provides a basic web UI with several applications optionally downloadable from their website.
sFlow-rt has two port numbers. sflow.port
is for collecting data from switches, and http.port
is to provide REST API to the users. These settings can be found in start.sh
script.
network_monitor
module uses REST API of sFlow-rt
program.
Once sFlow is configured at every switch, as well as installing sFlow-rt, network_monitor
can be used to get the network monitored data.
-
python network_monitor.py flow <src> <dst>
shows a BW usage from src to dst host. -
python network_monitor.py <switch_id> <port>
shows an incoming BW usage at port of the switch.
It also includes many APIs which can be used to get monitored data. Note that all the information from this module is a real time. For example, the current path returned from monitor_get_current_path(topo, src, dst)
function is a path that is used at the moment. If there is no packet using the network from src and dst, it will return None, which does not mean that there is no path. Instead, it intends there is no packet from src to dst currently seen in the network.
This is a web based networking monitoring UI, that shows the real-time network usage. It uses topo_discovery
to get the network topology and sdc_odl_monitor
to get the real-time bandwidth usage.
python sdc_viz.py
Once the module is running up, it creates a HTTP server that can be retrieved from any web browser. The monitoring data is updated every second.
For web rendering, we use (D3 Javascript library)[https://d3js.org/].
This program is to manage QoS of the network. It manages QoS and Queue entries in OVS, and sets a specific flow to use the established QoS and Queues to provide end-to-end minimum BW guarantees.
This module uses OVSDB plugin in ODL in order to create and delete QoS and Queue entries. After that, the flow rules are pushed through the normal OF for a specific source and destination pair.
CAUTION
Be careful to use this module. It can make a critical effect to the network configuration because it directly manages OVSDB of all switches. If something happens in this module, it can mess up the entrie network.
At ODL, simply install (OVSDB plugin)[http://docs.opendaylight.org/en/stable-carbon/developer-guide/ovsdb-developer-guide.html#] feature and change the port number of OVSDB plugin to avoid any conflict.
Before installing the feature, the default port (6640) for the OVSDB manager can be changed in the config file:
in etc/custom.properties
:
```
ovsdb.listenPort=6640
```
After change the port, the plugin can be installed in ODL karaf console:
karaf> feature:install odl-ovsdb-southbound-impl
For each switch, use the following command to set up the OVS to connect OVSDB plugin in ODL.
sudo ovs-vsctl set-manager tcp:192.168.99.1:6641
Currently it provides only testing command.
python network_manager_qos.py test-set
: create several test queues between two hosts.python network_manager_qos.py test-del
: delete the test queues created fromtest-set
.
Please refer to the source code for more details.
This is a fundamental library used for all modules. It retrieves the network topology information using ODL's REST API, and provides the relavant information to each module.
Simply run the python using python topo_discovery.py
to get the network topology.
Use the relavant APIs in this module to get any information about the network.