REST can be used/called with verity of programming languages, or even just using wget. However, since this blog was already using TCL for AppShape++ scripting, we may as well keep using TCL for REST too. However, RESTing with TCL is a bit pain in the ..., so this time I'll use python instead.
All most forgot to explain what REST is. Its a way to run remote procedures calls using HTTP. Example calls:
- Read interface counters
- Update real's weight
- Bring down a real inside a group
Here are two screenshots. The first is how I get the current status of real 1, and the second is how I disable real 1.
Lab goal
Using the base setup, create python script to toggle the status of real 1 from not enabled to enabled and from disable to enable.
Setup
The loadbalancer is Radware's Alteon VA version 29.5.1.0
The initial Alteon VA configuration can be found here.
Notice the group and hosts are preconfigured:
Notice the group and hosts are preconfigured:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /c/slb/real 1 ena ipver v4 rip 10.136.85.1 /c/slb/real 2 ena ipver v4 rip 10.136.85.2 /c/slb/real 3 ena ipver v4 rip 10.136.85.3 /c/slb/group 10 ipver v4 add 1 add 2 add 3 |
Python script
I have used python 2.7 and the following modules: json and requests
Alteon's REST API is using json as its data format. Python's build in json module converts python dict to json format and vice-versa.
requests is a very easy python module to use for REST API.
Here is the source code for the python script. See the comments inside for explanations:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | import requests import json import sys # set Alteon and real parameters ALTEON = "10.136.1.100" REAL = "1" USER = "admin" PASSWORD = "admin" # get the current status of real server # ============================================================ # set authentication object myAuth=requests.auth.HTTPBasicAuth(USER, PASSWORD) # set request string with the ALTEON name/ip address and the 'real' we want to toggle reqSTR = "https://"+ALTEON+"/config/SlbOperEnhRealServerTable/" + REAL # turn off SSL warning. Don't do this in production! # see here how to deal with it http://docs.python-requests.org/en/latest/user/advanced/#ssl-cert-verification requests.packages.urllib3.disable_warnings() # send the request, use the auth object, don't verify certification and return a python dct out of json string # The return is a one item dict with 'SlbNewCfgEnhRealServerTable' as key. # That item contains one item list, hence the [0] # That list item is another dict with two entries: 'Status' and 'Index' we need the Status r = requests.get(reqSTR, auth=myAuth, verify=False).json()['SlbOperEnhRealServerTable'][0] state = r['Status'] # print current state and set the new requierd state if state == 1: print "Real is enabled. Changing status to disabled" newStatus = "2" # disabled elif state == 2: print "Real is disabled. Changing status to enabled" newStatus = "1" # enabled elif state == 3: print "Real is disabled but waiting for cookies to timeout. Changing status to enabled" newStatus = "1" # enabled elif state == 4: print "Real is disabled but waiting for sessions to timeout. Changing status to enabled" newStatus = "1" # enabled elif state == 5: print "Real is disabled but waiting for sessions to timeout and for cookeis to timeout. Changing status to enabled" newStatus = "1" # enabled else: # we should never get here print "error retrieving real status. return object:" print r sys.exit(0) # set the new real status # ============================================================ # create JSON data to be passed myData = json.dumps({'Status' : newStatus}) # send the oper command to change the status. Notice that his time the method is PUT r = requests.put(reqSTR, auth=myAuth, verify=False, data=myData).json()['status'] # print the return status of the command print r |
Test
Summary
Alteon's REST API is easy to use and straight forward. It is way better then using expect scripts for automation.