summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorIWASE Yusuke <iwase.yusuke0@gmail.com>2017-08-21 16:19:33 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2017-08-29 22:49:36 +0900
commitf85ae784652367c4a7e8b212644af105ae955763 (patch)
tree23eca77b0c207299a8ed01a05e8210347b223c26
parentbc7451dc7c932ce314abf635b017ed11d041c9e1 (diff)
rest_qos: Avoid discarding Queues info for each request
Currently, rest_qos discards the Queues info stored on its dictionary for each "Set queue" request. So rest_qos always reply only last Queue setting. This patch fixes to avoid discarding the Queues info and enable to reply all configured Queues settings. Note: In order to store all Queues settings, "port name" field for each Queue will be inserted on the reply of "Get queue configuration" API. - Before: [ { "command_result": { "result": "success", "details": { "0": { "config": { "max-rate": "500000" } }, "1": { "config": { "min-rate": "800000" } } } }, "switch_id": "0000000000000001" } ] - After: [ { "command_result": { "result": "success", "details": { "s1-eth1": { # <-- Inserted "0": { "config": { "max-rate": "500000" } }, "1": { "config": { "min-rate": "800000" } } } } }, "switch_id": "0000000000000001" } ] Reported-by: Fahmy Sherif Alaa Salaheldin <sherif.fahmy@epfl.ch> Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--ryu/app/rest_qos.py41
1 files changed, 29 insertions, 12 deletions
diff --git a/ryu/app/rest_qos.py b/ryu/app/rest_qos.py
index 9fe72ed7..d17b0e1b 100644
--- a/ryu/app/rest_qos.py
+++ b/ryu/app/rest_qos.py
@@ -557,6 +557,22 @@ class QoS(object):
self.vlan_list[VLANID_NONE] = 0 # for VLAN=None
self.dp = dp
self.version = dp.ofproto.OFP_VERSION
+ # Dictionary of port name to Queue config.
+ # e.g.)
+ # self.queue_list = {
+ # "s1-eth1": {
+ # "0": {
+ # "config": {
+ # "max-rate": "600000"
+ # }
+ # },
+ # "1": {
+ # "config": {
+ # "min-rate": "900000"
+ # }
+ # }
+ # }
+ # }
self.queue_list = {}
self.CONF = CONF
self.ovsdb_addr = None
@@ -665,7 +681,15 @@ class QoS(object):
'details': 'ovs_bridge is not exists'}
return REST_COMMAND_RESULT, msg
- self.queue_list.clear()
+ port_name = rest.get(REST_PORT_NAME, None)
+ vif_ports = self.ovs_bridge.get_port_name_list()
+
+ if port_name is not None:
+ if port_name not in vif_ports:
+ raise ValueError('%s port is not exists' % port_name)
+ vif_ports = [port_name]
+
+ queue_list = {}
queue_type = rest.get(REST_QUEUE_TYPE, 'linux-htb')
parent_max_rate = rest.get(REST_QUEUE_MAX_RATE, None)
queues = rest.get(REST_QUEUES, [])
@@ -683,17 +707,9 @@ class QoS(object):
config['min-rate'] = min_rate
if len(config):
queue_config.append(config)
- self.queue_list[queue_id] = {'config': config}
+ queue_list[queue_id] = {'config': config}
queue_id += 1
- port_name = rest.get(REST_PORT_NAME, None)
- vif_ports = self.ovs_bridge.get_port_name_list()
-
- if port_name is not None:
- if port_name not in vif_ports:
- raise ValueError('%s port is not exists' % port_name)
- vif_ports = [port_name]
-
for port_name in vif_ports:
try:
self.ovs_bridge.set_qos(port_name, type=queue_type,
@@ -701,9 +717,10 @@ class QoS(object):
queues=queue_config)
except Exception as msg:
raise ValueError(msg)
+ self.queue_list[port_name] = queue_list
msg = {'result': 'success',
- 'details': self.queue_list}
+ 'details': queue_list}
return REST_COMMAND_RESULT, msg
@@ -718,9 +735,9 @@ class QoS(object):
@rest_command
def delete_queue(self, rest, vlan_id):
- self.queue_list.clear()
if self._delete_queue():
msg = 'success'
+ self.queue_list.clear()
else:
msg = 'failure'