[SDFAB-644] QoS test for with non-mobile traffic classification

Change-Id: I69e4617fbee1628b3427f2f8be60dec2c8aa95e8
diff --git a/TestON/drivers/common/api/controller/onosrestdriver.py b/TestON/drivers/common/api/controller/onosrestdriver.py
index 7027408..ec90a6d 100755
--- a/TestON/drivers/common/api/controller/onosrestdriver.py
+++ b/TestON/drivers/common/api/controller/onosrestdriver.py
@@ -2393,3 +2393,226 @@
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
+
+    def getSlices( self, ip="DEFAULT", port="DEFAULT", debug=False ):
+        try:
+            output = None
+            if ip == "DEFAULT":
+                main.log.warn( self.name + ": No ip given, reverting to ip from topo file" )
+                ip = self.ip_address
+            if port == "DEFAULT":
+                main.log.warn( self.name + ": No port given, reverting to port " +
+                               "from topo file" )
+                port = self.port
+            url = "/fabrictna/slicing/slice"
+            response = self.send( url=url, ip = ip, port = port, base="/onos" )
+            if response:
+                if 200 <= response[ 0 ] <= 299:
+                    output = response[ 1 ]
+                    if debug:
+                        main.log.debug(self.name + ": read: " + output)
+                    slices = json.loads( output ).get( 'Slices' )
+                    assert slices is not None, "Error parsing json object"
+                    return json.dumps( slices )
+                else:
+                    main.log.error( "Error with REST request, response was: %s: %s" %
+                                    ( response[ 0 ], response[ 1 ] ) )
+                    return main.FALSE
+        except ( AttributeError, AssertionError, TypeError ):
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanAndExit()
+
+    def addSlice( self, slice_id, ip="DEFAULT", port="DEFAULT", debug=False ):
+        self.__slices( slice_id, ip, port, debug, method="POST" )
+
+    def removeSlice( self, slice_id, ip="DEFAULT", port="DEFAULT", debug=False ):
+        self.__slices( slice_id, ip, port, debug, method="DELETE" )
+
+    def getTrafficClasses( self, slice_id, ip="DEFAULT", port="DEFAULT", debug=False ):
+        try:
+            if ip == "DEFAULT":
+                main.log.warn( self.name + ": No ip given, reverting to ip from topo file" )
+                ip = self.ip_address
+            if port == "DEFAULT":
+                main.log.warn( self.name + ": No port given, reverting to port " +
+                               "from topo file" )
+                port = self.port
+            url = "/fabrictna/slicing/tc/%d" % slice_id
+            response = self.send( url=url, ip = ip, port = port, base="/onos" )
+            if response:
+                if 200 <= response[ 0 ] <= 299:
+                    output = response[ 1 ]
+                    if debug:
+                        main.log.debug(self.name + ": read: " + output)
+                    traffic_classes = json.loads( output ).get( 'TrafficClasses' )
+                    assert traffic_classes is not None, "Error parsing json object"
+                    return json.dumps( traffic_classes )
+                else:
+                    main.log.error( "Error with REST request, response was: %s: %s" %
+                                    ( response[ 0 ], response[ 1 ] ) )
+                    return main.FALSE
+        except ( AttributeError, AssertionError, TypeError ):
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanAndExit()
+
+    def addTrafficClassToSlice( self, slice_id, traffic_class,
+                                ip="DEFAULT", port="DEFAULT", debug=False ):
+        self.__trafficClass( slice_id, traffic_class, ip, port, debug, method="POST" )
+
+    def removeTrafficClassToSlice( self, slice_id, traffic_class,
+                                   ip="DEFAULT", port="DEFAULT", debug=False ):
+        self.__trafficClass( slice_id, traffic_class, ip, port, debug, method="DELETE" )
+
+    def addSlicingClassifierFlow( self, slice_id, traffic_class, traffic_selector,
+                                  ip="DEFAULT", port="DEFAULT", debug=False ):
+        self.__slicingClassifierFlow( slice_id, traffic_class, traffic_selector,
+                                     ip, port, debug, method="POST" )
+
+    def removeSlicingClassifierFlow( self, slice_id, traffic_class, traffic_selector,
+                                     ip="DEFAULT", port="DEFAULT", debug=False ):
+        self.__slicingClassifierFlow( slice_id, traffic_class, traffic_selector,
+                                     ip, port, debug, method="DELETE" )
+
+    def getSlicingClassifierFlow( self, slice_id, traffic_class, ip="DEFAULT",
+                                  port="DEFAULT", debug=False ):
+        try:
+            if ip == "DEFAULT":
+                main.log.warn( self.name + ": No ip given, reverting to ip from topo file" )
+                ip = self.ip_address
+            if port == "DEFAULT":
+                main.log.warn( self.name + ": No port given, reverting to port " +
+                               "from topo file" )
+                port = self.port
+            url = "/fabrictna/slicing/flow/%d/%s" % ( slice_id, traffic_class )
+            response = self.send( url=url, ip = ip, port = port, base="/onos" )
+            if response:
+                if 200 <= response[ 0 ] <= 299:
+                    output = response[ 1 ]
+                    if debug:
+                        main.log.debug(self.name + ": read: " + output)
+                    traffic_selector = json.loads( output ).get( 'TrafficSelector' )
+                    assert traffic_selector is not None, "Error parsing json object"
+                    return json.dumps( traffic_selector )
+                else:
+                    main.log.error( "Error with REST request, response was: %s: %s" %
+                                    ( response[ 0 ], response[ 1 ] ) )
+                    return main.FALSE
+        except ( AttributeError, AssertionError, TypeError ):
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanAndExit()
+
+    def __slices( self, slice_id, ip="DEFAULT", port="DEFAULT", debug=False,
+                  method="POST" ):
+        try:
+            if debug:
+                main.log.debug( self.name + ": %s Slice" % method )
+                main.log.debug( self.name + ": Slice ID: %d" % slice_id )
+            if ip == "DEFAULT":
+                main.log.warn( self.name + ": No ip given, reverting to ip from topo file" )
+                ip = self.ip_address
+            if port == "DEFAULT":
+                main.log.warn( self.name + ": No port given, reverting to port " +
+                               "from topo file" )
+                port = self.port
+            url = "/fabrictna/slicing/slice/%d" % slice_id
+            response = self.send( method=method,
+                                  url=url, ip = ip, port = port,
+                                  base="/onos", data = {} )
+            if response:
+                if "200" in str( response[ 0 ] ):
+                    main.log.info( self.name + ": Successfully %s Slice ID: %d " % ( method, slice_id ) )
+                    return main.TRUE
+                else:
+                    main.log.error( "Error with REST request, response was: %s: %s" %
+                                    ( response[ 0 ], response[ 1 ] ) )
+                    return main.FALSE
+        except NotImplementedError as e:
+            raise # Inform the caller
+        except ( AttributeError, TypeError ):
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanAndExit()
+
+    def __trafficClass( self, slice_id, traffic_class, ip="DEFAULT", port="DEFAULT",
+                        debug=False, method="POST" ):
+        try:
+            if debug:
+                main.log.debug( self.name + ": %s Traffic Class" % method )
+                main.log.debug( self.name + ": Slice ID: %d, Traffic Class: %s" % ( slice_id, traffic_class ) )
+            if ip == "DEFAULT":
+                main.log.warn( self.name + ": No ip given, reverting to ip from topo file" )
+                ip = self.ip_address
+            if port == "DEFAULT":
+                main.log.warn( self.name + ": No port given, reverting to port " +
+                               "from topo file" )
+                port = self.port
+            url = "/fabrictna/slicing/tc/%d/%s" % ( slice_id, traffic_class )
+            response = self.send( method=method,
+                                  url=url, ip = ip, port = port,
+                                  base="/onos", data = {} )
+            if response:
+                if "200" in str( response[ 0 ] ):
+                    main.log.info( self.name + ": Successfully %s " % method +
+                                   "Slice ID: %d, Traffic Class: %s" % ( slice_id, traffic_class ) )
+                    return main.TRUE
+                else:
+                    main.log.error( "Error with REST request, response was: %s: %s" %
+                                    ( response[ 0 ], response[ 1 ] ) )
+                    return main.FALSE
+        except NotImplementedError as e:
+            raise # Inform the caller
+        except ( AttributeError, TypeError ):
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanAndExit()
+
+    def __slicingClassifierFlow( self, slice_id, traffic_class, traffic_selector,
+                                 ip="DEFAULT", port="DEFAULT", debug=False,
+                                 method="POST" ):
+        try:
+            if debug:
+                main.log.debug( self.name + ": %s Slicing Classifier Flow" % method )
+                main.log.debug( self.name + ": Slice ID: %d, Traffic Class: %s, Traffic Selector: %s" % (
+                    slice_id, traffic_class, self.pprint( traffic_selector ) ) )
+            if ip == "DEFAULT":
+                main.log.warn( self.name + ": No ip given, reverting to ip from topo file" )
+                ip = self.ip_address
+            if port == "DEFAULT":
+                main.log.warn( self.name + ": No port given, reverting to port " +
+                               "from topo file" )
+                port = self.port
+            url = "/fabrictna/slicing/flow/%d/%s" % ( slice_id, traffic_class )
+            response = self.send( method=method,
+                                  url=url, ip = ip, port = port,
+                                  data=json.dumps( traffic_selector ),
+                                  base="/onos" )
+            if response:
+                if "200" in str( response[ 0 ] ):
+                    main.log.info( self.name + ": Successfully %s Slicing Classifier Flow for " % method +
+                                   "Slice ID: %d, Traffic Class: %s" % ( slice_id, traffic_class ) )
+                    return main.TRUE
+                else:
+                    main.log.error( "Error with REST request, response was: %s: %s" %
+                                    ( response[ 0 ], response[ 1 ] ) )
+                    return main.FALSE
+        except NotImplementedError as e:
+            raise # Inform the caller
+        except ( AttributeError, TypeError ):
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanAndExit()