Package: ryurest
ryurestA Python module to interact with the REST API of the Ryu SDN controller.ABOUTThese are two Python modules that individually provide either a functional or object-orientated approach to using the Ryu REST API.The modules make use of the Requests framework to interact with the RYU REST API.MODULESBoth the modules contain identical functions/methods. Which one you should use depends entirely on how comfortable you are with Python (although it is generally seen as better practice in the community to use OO approaches where possible)ryuswitchObject-orientated approach.Provides theRyuSwitchclass to instantiate the physical switches connected to the controller as objects.ryufuncFunctional approach.Allows you to call the RyuSwitch methods directly (although a switch Datapath ID (DPID) must be passed as an argument in most cases).REQUIREMENTSRun the Ryu controller with REST API enabled.:$ sudo ryu-manager ryu.app.simple_switch_13 ryu.app.ofctl_restINSTALLATIONPyPi$ pip install ryurestYou may wish to usesudowith this command.From sourceAlternatively you can either download or clone this repository, place the requiredryufunc.pyand/orryuswitch.pymodules into your project directory, and import them as per normal.$ git clone https://github.com/nathancatania/ryurest# imports the functional moduleimportryufunc# imports the object-orientated modulefromryuswitchimportRySwitchYou may also need to install therequestslibrary if it is not already on your machine:$ pip install requestsUSAGEryuswitch.py (Object-Orientated module)1. Import theryurestmodule and theRyuSwitchclass into your scriptfrom ryurest import RyuSwitch2. Create one or more RyuSwitch objectsswitch1 = RyuSwitch( DPID )If you do not know any of the DPIDs of the connected switches, you can initialize with no arguments and call the.get_switches()method to return an array of DPIDs.Be sure to assign any object created in this way a DPID manually:# Create a switch
switch0 = RyuSwitch()

# Get an array of Datapath IDs (DPIDs) for all connected switches
DPID_list = switch0.get_switches()

# Assign a DPID manually to the switch created
switch0.DPID = DPID_list[0]3. [OPTIONAL] Change the REST API URIThe default location for the Ryu REST API is:http://localhost:8080If Ryu is running on the same PC as the module (localhost), then there is no need to change anything.If the Ryu controller is running on a different machine and/or port, you MUST set the API path within eachRyuSwitchobject created.switch1 = RyuSwitch( DPID_list[0] )
switch1.API = "http://192.168.1.30:8080"

switch2 = RyuSwitch( DPID_list[1] )
switch2.API = "http://192.168.1.30:8080"Warning!If altering the API path, DO NOT add a trailing ‘/’ at the end or the API call will fail!4. Execute the class methods as required# Gets all flows in flowtable
flows = switch1.get_flows()Some methods have optional filters as well.Consult theryuswitch.pymodule or theRyu REST API documentationfor more info.ryufunc.py (functional module)1. From theryurestmodule, importryufuncinto your scriptfrom ryurest import ryufunc2. [OPTIONAL] Change the REST API URIThe default location for the Ryu REST API is:http://localhost:8080If Ryu is running on the same PC as the module (localhost), then there is no need to change anything.If the Ryu controller is running on a different machine and/or port, you MUST set the API path. This is global for the entire ryufunc namespace.print ryufunc.API
# prints: http://localhost:8080

# Change the default IP and Port
ryufunc.API = "http://192.168.0.30:8080"Warning!If altering the API path, DO NOT add a trailing ‘/’ at the end or the API call will fail!3. [OPTIONAL] Obtain a list of Datapath IDs (DPIDs)If you know the DPID(s) of the switch(es) you wish to interact with, you can skip this step.To return an array containing all of the DPIDs (switches) connected to the Ryu controller, use the get_switches() function:DPID_list = ryufunc.get_switches()

# Prints a list of all DPIDs
for DPID in DPID_list:
   print DPID

# Access how you would any other array
switch1_dpid = DPID_list[0]
switch2_dpid = DPID_list[1]
# etc...4. Execute the functions as requiredOnce you know the DPID(s) of the connected switch(es), you can start to execute function calls.# Gets all flows in flowtable
flows = ryufunc.get_flows( switch1_dpid )     # returns JSONSome methods have optional filters.Consult theryufunc.pymodule or theRyu REST API documentationfor more info.RETURN FORMATSIf API call wassuccessful…All the .get_x() methods will returnJSON formatted data; EXCEPT .get_switches() which will return an array of DPIDs.All the .set_x(), .delete_x(), .modify_X() methods will return booleanTrue.If the API callfails…ALL methods/functions will return booleanFalse.This means that you can useifstatements to check for and handle errors accordingly.