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.fa...@epfl.ch>
Signed-off-by: IWASE Yusuke <iwase.yusu...@gmail.com>
---
 ryu/app/rest_qos.py | 41 +++++++++++++++++++++++++++++------------
 1 file changed, 29 insertions(+), 12 deletions(-)

diff --git a/ryu/app/rest_qos.py b/ryu/app/rest_qos.py
index 9fe72ed..d17b0e1 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'
 
-- 
2.7.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Ryu-devel mailing list
Ryu-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to