Skip to content

Commit

Permalink
Add create_routers rally_ovs task
Browse files Browse the repository at this point in the history
- support lrp-* commands in ovsclients_impl.py
- lrouter and lnetwork in NB and SB OVN database
- jinja template file for router task
- router travis-ci job

Signed-off-by: Hui Kang <kangh@us.ibm.com>
  • Loading branch information
Hui Kang committed Sep 19, 2016
1 parent 83168b1 commit b59e6a7
Show file tree
Hide file tree
Showing 9 changed files with 181 additions and 9 deletions.
7 changes: 7 additions & 0 deletions ansible/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,13 @@ in the rally container.
rally-ovs task start /root/rally-ovn/workload/create_and_list_acls.json


- Create routers

::

rally-ovs task start /root/rally-ovn/workload/create_routers.json


To clean up the emulation environment, run

::
Expand Down
7 changes: 7 additions & 0 deletions ansible/group_vars/all.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,13 @@ networks_created_batch_size: "1"

acls_per_port: "1"

router_number: "1"
routers_create_batch_size: "1"
networks_per_router: "2"
# Valid options are [ none, join, chain ]
router_connection_method: "none"


########################
# OVS Repository to test
########################
Expand Down
1 change: 1 addition & 0 deletions ansible/roles/rally/tasks/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
- "create_and_list_lports"
- "create_networks"
- "create_and_list_acls"
- "create_routers"

- name: Copying over create-sandbox file on farm node
template:
Expand Down
32 changes: 32 additions & 0 deletions ansible/roles/rally/templates/create_routers.json.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"version": 2,
"title": "Create OVN logical routers",
"subtasks": [{
"title": "Create OVN logical routers",
"workloads": [{
"name": "OvnNetwork.create_routers",
"args": {
"router_create_args": {
"amount": {{ router_number }},
"batch": {{ routers_create_batch_size }},
},
"router_connection_method": {{ router_connection_method }},
"networks_per_router": {{ networks_per_router }},
"network_create_args": {
"amount": {{ network_number }},
"batch": {{ networks_created_batch_size }},
"start_cidr": "{{ network_start_cidr }}",
"physical_network": "providernet"
}
},
"runner": {
"type": "serial","times": 1},
"context": {
"ovn_multihost" : {
"controller": "ovn-controller-node"
},
"sandbox":{ "tag": "ToR1"}
}
}]
}]
}
7 changes: 7 additions & 0 deletions ci/ansible/all.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@ ports_created_batch_size: "1"
networks_created_batch_size: "1"
acls_per_port: "5"

router_number: "1"
routers_create_batch_size: "1"
networks_per_router: "2"
# Valid options are [ none, join, chain ]
router_connection_method: "none"


################
# OVS Repository
################
Expand Down
14 changes: 14 additions & 0 deletions ci/scale-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ $OVNSUDO docker exec ovn-rally rally task report $TASKID --out /root/create-netw
$OVNSUDO docker exec ovn-rally rally task results $TASKID > ./create-networks-data.json
$OVNSUDO docker cp ovn-rally:/root/create-networks-output.html .
$OVNSUDO docker exec ovn-rally rally task delete --uuid $TASKID
$OVNSUDO rm -rf /tmp/rally-ovs-output.raw

$OVNSUDO docker exec ovn-rally rally-ovs task start /root/rally-ovn/workload/create_and_list_lports.json 2>&1 | tee /tmp/rally-ovs-output.raw
check_ovn_rally /tmp/rally-ovs-output.raw
Expand All @@ -39,6 +40,7 @@ $OVNSUDO docker exec ovn-rally rally task report $TASKID --out /root/create-and-
$OVNSUDO docker exec ovn-rally rally task results $TASKID > ./create-and-list-lports-data.json
$OVNSUDO docker cp ovn-rally:/root/create-and-list-lports-output.html .
$OVNSUDO docker exec ovn-rally rally task delete --uuid $TASKID
$OVNSUDO rm -rf /tmp/rally-ovs-output.raw

$OVNSUDO docker exec ovn-rally rally-ovs task start /root/rally-ovn/workload/create_and_list_acls.json 2>&1 | tee /tmp/rally-ovs-output.raw
check_ovn_rally /tmp/rally-ovs-output.raw
Expand All @@ -48,6 +50,7 @@ $OVNSUDO docker exec ovn-rally rally task report $TASKID --out /root/create-and-
$OVNSUDO docker exec ovn-rally rally task results $TASKID > ./create-and-list-acls-data.json
$OVNSUDO docker cp ovn-rally:/root/create-and-list-acls-output.html .
$OVNSUDO docker exec ovn-rally rally task delete --uuid $TASKID
$OVNSUDO rm -rf /tmp/rally-ovs-output.raw

$OVNSUDO docker exec ovn-rally rally-ovs task start /root/rally-ovn/workload/create_and_bind_ports.json 2>&1 | tee /tmp/rally-ovs-output.raw
check_ovn_rally /tmp/rally-ovs-output.raw
Expand All @@ -57,6 +60,17 @@ $OVNSUDO docker exec ovn-rally rally task report $TASKID --out /root/create-and-
$OVNSUDO docker exec ovn-rally rally task results $TASKID > ./create-and-bind-ports-data.json
$OVNSUDO docker cp ovn-rally:/root/create-and-bind-ports-output.html .
$OVNSUDO docker exec ovn-rally rally task delete --uuid $TASKID
$OVNSUDO rm -rf /tmp/rally-ovs-output.raw

$OVNSUDO docker exec ovn-rally rally-ovs task start /root/rally-ovn/workload/create_routers.json 2>&1 | tee /tmp/rally-ovs-output.raw
check_ovn_rally /tmp/rally-ovs-output.raw
TASKID=$($OVNSUDO docker exec ovn-rally rally task list --uuids-only)
# NOTE(mestery): HTML and JSON data are collected differently, look to consolidate
$OVNSUDO docker exec ovn-rally rally task report $TASKID --out /root/create-routers-output.html
$OVNSUDO docker exec ovn-rally rally task results $TASKID > ./create-routers-data.json
$OVNSUDO docker cp ovn-rally:/root/create-routers-output.html .
$OVNSUDO docker exec ovn-rally rally task delete --uuid $TASKID
$OVNSUDO rm -rf /tmp/rally-ovs-output.raw

$OVNSUDO docker ps

Expand Down
20 changes: 19 additions & 1 deletion rally_ovs/plugins/ovs/ovsclients_impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,24 @@ def flush(self):
self.cmds = None


def db_set(self, table, record, *col_values):
args = [table, record]
args += set_colval_args(*col_values)
self.run("set", args=args)


def lrouter_port_add(self, lrouter, name, mac=None, ip_addr=None):
params =[lrouter, name, mac, ip_addr]
self.run("lrp-add", args=params)
return {"name":name}


def lrouter_add(self, name):
params = [name]
self.run("lr-add", args=params)
return {"name":name}


def lswitch_add(self, name):
params = [name]

Expand All @@ -107,7 +125,7 @@ def lswitch_del(self, name):
def lswitch_list(self):
self.run("ls-list")

def lport_add(self, lswitch, name):
def lswitch_port_add(self, lswitch, name):
params =[lswitch, name]
self.run("lsp-add", args=params)

Expand Down
77 changes: 69 additions & 8 deletions rally_ovs/plugins/ovs/scenarios/ovn.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,16 @@ class OvnScenario(scenario.OvsScenario):
return: [{"name": "lswitch_xxxx_xxxxx", "cidr": netaddr.IPNetwork}, ...]
'''
@atomic.action_timer("ovn.create_lswitch")
def _create_lswitches(self, lswitch_create_args):
def _create_lswitches(self, lswitch_create_args, num_switches=-1):

print("create lswitch")
self.RESOURCE_NAME_FORMAT = "lswitch_XXXXXX_XXXXXX"

amount = lswitch_create_args.get("amount", 1)
batch = lswitch_create_args.get("batch", amount)

if (num_switches == -1):
num_switches = lswitch_create_args.get("amount", 1)
batch = lswitch_create_args.get("batch", num_switches)

start_cidr = lswitch_create_args.get("start_cidr", "")
if start_cidr:
start_cidr = netaddr.IPNetwork(start_cidr)
Expand All @@ -52,7 +55,7 @@ def _create_lswitches(self, lswitch_create_args):

flush_count = batch
lswitches = []
for i in range(amount):
for i in range(num_switches):
name = self.generate_random_name()

lswitch = ovn_nbctl.lswitch_add(name)
Expand Down Expand Up @@ -131,7 +134,7 @@ def _create_lports(self, lswitch, lport_create_args = [], lport_amount=1):
lports = []
for i in range(lport_amount):
name = self.generate_random_name()
lport = ovn_nbctl.lport_add(lswitch["name"], name)
lport = ovn_nbctl.lswitch_port_add(lswitch["name"], name)

ip = str(ip_addrs.next()) if ip_addrs else ""
mac = utils.get_random_mac(base_mac)
Expand Down Expand Up @@ -226,11 +229,69 @@ def _delete_acl(self, lswitches):
ovn_nbctl.flush()


@atomic.action_timer("ovn_network.create_routers")
def _create_routers(self, router_create_args):
LOG.info("Create Logical routers")
self.RESOURCE_NAME_FORMAT = "lrouter_XXXXXX_XXXXXX"

amount = router_create_args.get("amount", 1)
batch = router_create_args.get("batch", 1)

ovn_nbctl = self.controller_client("ovn-nbctl")
ovn_nbctl.set_sandbox("controller-sandbox", self.install_method)
ovn_nbctl.enable_batch_mode()

flush_count = batch
lrouters = []

for i in range(amount):
name = self.generate_random_name()
lrouter = ovn_nbctl.lrouter_add(name)
lrouters.append(lrouter)

flush_count -= 1
if flush_count < 1:
ovn_nbctl.flush()
flush_count = batch

ovn_nbctl.flush() # ensure all commands be run
ovn_nbctl.enable_batch_mode(False)

return lrouters


def _connect_network_to_router(self, router, network):
LOG.info("Connect network %s to router %s" % (network["name"], router["name"]))

ovn_nbctl = self.controller_client("ovn-nbctl")
install_method = self.install_method
ovn_nbctl.set_sandbox("controller-sandbox", install_method)
ovn_nbctl.enable_batch_mode(False)


base_mac = [i[:2] for i in self.task["uuid"].split('-')]
base_mac[0] = str(hex(int(base_mac[0], 16) & 254))
base_mac[3:] = ['00']*3
mac = utils.get_random_mac(base_mac)

lrouter_port = ovn_nbctl.lrouter_port_add(router["name"], network["name"], mac,
str(network["cidr"]))
ovn_nbctl.flush()


switch_router_port = "rp-" + network["name"]
lport = ovn_nbctl.lswitch_port_add(network["name"], switch_router_port)
ovn_nbctl.db_set('Logical_Switch_Port', switch_router_port,
('options', {"router_port":network["name"]}),
('type', 'router'),
('address', "\\"+"\""+mac+"\\"+"\""))
ovn_nbctl.flush()

# NOTE(huikang): num_networks overides the "amount" in network_create_args
@atomic.action_timer("ovn_network.create_network")
def _create_networks(self, network_create_args):
def _create_networks(self, network_create_args, num_networks=-1):
physnet = network_create_args.get("physical_network", None)
lswitches = self._create_lswitches(network_create_args)
lswitches = self._create_lswitches(network_create_args, num_networks)
batch = network_create_args.get("batch", len(lswitches))

LOG.info("Create network method: %s" % self.install_method)
Expand All @@ -243,7 +304,7 @@ def _create_networks(self, network_create_args):
for lswitch in lswitches:
network = lswitch["name"]
port = "provnet-%s" % network
ovn_nbctl.lport_add(network, port)
ovn_nbctl.lswitch_port_add(network, port)
ovn_nbctl.lport_set_addresses(port, ["unknown"])
ovn_nbctl.lport_set_type(port, "localnet")
ovn_nbctl.lport_set_options(port, "network_name=%s" % physnet)
Expand Down
25 changes: 25 additions & 0 deletions rally_ovs/plugins/ovs/scenarios/ovn_network.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,31 @@ def create_networks(self, network_create_args):
self._create_networks(network_create_args)


@scenario.configure(context={})
def create_routers(self, router_create_args=None,
router_connection_method=None,
networks_per_router=None,
network_create_args=None):
lrouters = self._create_routers(router_create_args)

num_router = int(router_create_args.get("amount", 0))
num_networks = int(networks_per_router) * num_router
lnetworks = self._create_networks(network_create_args, num_networks)


# Connect network to routers
j = 0
for i in range(len(lrouters)):
lrouter = lrouters[i]
LOG.info("Connect %s networks to router %s" % (networks_per_router, lrouter["name"]))
for k in range(j, j+int(networks_per_router)):
lnetwork = lnetworks[k]
LOG.info("connect networks %s cidr %s" % (lnetwork["name"], lnetwork["cidr"]))
self._connect_network_to_router(lrouter, lnetwork)

j += int(networks_per_router)


@validation.number("ports_per_network", minval=1, integer_only=True)
@scenario.configure(context={})
def create_and_bind_ports(self,
Expand Down

0 comments on commit b59e6a7

Please sign in to comment.