diff options
author | IWASE Yusuke <iwase.yusuke0@gmail.com> | 2017-08-21 16:19:33 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2017-08-29 22:49:36 +0900 |
commit | f85ae784652367c4a7e8b212644af105ae955763 (patch) | |
tree | 23eca77b0c207299a8ed01a05e8210347b223c26 | |
parent | bc7451dc7c932ce314abf635b017ed11d041c9e1 (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.py | 41 |
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' |