Module base
[hide private]
[frames] | no frames]

Source Code for Module base

  1  # -*- encoding: utf8 -*-
 
  2  """
 
  3      Some base objects for the aXAPI.
 
  4      
 
  5      Author : Richard Zhang (c)
 
  6      e-mail : rzhang@a10networks.com
 
  7      Date   : 03/05/2012
 
  8  
 
  9  """ 
 10  
 
 11  from cStringIO import StringIO 
 12  import json 
 13  
 
14 -class AxAPI:
15 """ Status: 16 """ 17 STATUS_ENABLED = 1 18 STATUS_DISABLED = 0 19 20 """ Protocol Types in service group and real server: 21 """ 22 PROTO_TCP = 2 23 PROTO_UDP = 3 24 25 """ Load-Balancer methods: 26 """ 27 LB_ROUND_ROBIN = 0 28 LB_WEIGHTED_ROUND_ROBIN = 1 29 LB_LEAST_CONN = 2 30 LB_WEIGHTED_LEAST_CONN = 3 31 LB_LEAST_CONNECTED_ON_SERVICE_PORT = 4 32 LB_WEIGHTED_LEAST_CONN_ON_SERVICE_PORT = 5 33 LB_FAST_RESP_TIME = 6 34 LB_LEAST_REQ = 7 35 LB_STRICT_ROUND_ROBIN = 8 36 LB_STATE_LESS_SOURCE_IP_HASH = 9 37 LB_STATE_LESS_SOURCE_IP_HASH_ONLY = 10 38 LB_STATE_LESS_DEST_IP_HASH = 11 39 LB_STATE_LESS_SOURCE_DEST_IP_HASH = 12 40 LB_STATE_LESS_PER_PACKAGE_ROUND_ROBIN = 13 41 42 """ Virtual Service Types: 43 """ 44 SVC_TCP = 2 45 SVC_UDP = 3 46 SVC_HTTP = 11 47 SVC_HTTPS = 12 48 SVC_FAST_HTTP = 9 49 SVC_RTSP = 5 50 SVC_FTP = 6 51 SVC_MMS = 7 52 SVC_TCP_PROXY = 10 53 SVC_SSL_PROXY = 13 54 SVC_SMTP = 14 55 SVC_SIP = 8 56 SVC_SIP_TCP = 15 57 SVC_SIP_STL = 16 58 SVC_DIAMETER = 17 59 SVC_DNS_UDP = 18 60 SVC_TFTP = 19
61
62 -class AxError(Exception):
63 pass
64
65 -class AxAPIError(AxError):
66 - def __init__(self,code,message):
67 AxError.__init__(self,"%i : %s"%(code,message)) 68 self.code = code 69 self.message = message
70
71 -class AxDictObject(object):
72 """ 73 Transform recursively JSON dictionaries into objects 74 """
75 - def __init__(self,name,obj_dict):
76 self.__name__ = name 77 for k,v in obj_dict.iteritems() : 78 if isinstance(v,dict) : 79 v = AxDictObject(k,v) 80 if isinstance(v,list) : 81 v = [ AxDictObject(k,vi) for vi in v ] 82 self.__dict__[k] = v
83
84 -class AxObject(object):
85 """ 86 Base Object for aXAPI Objects 87 """ 88 __display__ = [] 89 __obj_name__ = "" 90 __obj_readonly__ = False 91 __xml_convrt__ = [] 92
93 - def __init__(self,**params):
94 self._set_properties(**params)
95
96 - def _set_properties(self,**params):
97 self.__dict__.update(params)
98
99 - def __getattr__(self,name):
100 if name not in self.__dict__ : 101 #if not self.loaded : 102 # self.load() 103 return "UNKONWN" 104 try : 105 return self.__dict__[name] 106 except KeyError : 107 raise AttributeError("'%s' object has no attribute '%s'"%(self.__class__.__name__,name))
108
109 - def __setattr__(self,name,values):
110 if self.__obj_readonly__: 111 raise AxError("Read-only instance") 112 else: 113 self.__dict__[name] = values
114
115 - def get(self,key,*args,**kwargs):
116 return self.__dict__.get(key,*args,**kwargs)
117
118 - def __getitem__(self,key):
119 return self.__dict__[key]
120
121 - def __setitem__(self,key,value):
122 if self.__obj_readonly__: 123 raise AxError("Read-only instance") 124 else: 125 self.__dict__[key] = value
126
127 - def __str__(self):
128 vals = [] 129 for k in self.__class__.__display__ : 130 val_found = False 131 try : 132 value = self.__dict__[k] 133 val_found = True 134 except KeyError : 135 #self.load() 136 try : 137 value = self.__dict__[k] 138 val_found = True 139 except KeyError : pass 140 if not val_found : continue 141 if isinstance(value,unicode): 142 value = value.encode("utf8") 143 if isinstance(value,str): 144 value = "'%s'"%value 145 else : value = str(value) 146 if len(value) > 20: value = value[:20]+"..." 147 vals.append("%s = %s"%(k,value)) 148 return "%s(%s)"%(self.__class__.__name__,", ".join(vals))
149
150 - def __repr__(self): return str(self)
151
152 - def getRequestPostDataJson(self):
153 if len(self.__obj_name__) > 0 : 154 data = dict() 155 data[self.__obj_name__] = self.__dict__ 156 else : 157 data = self.__dict__ 158 return json.dumps(data)
159
160 - def _generateListInUrl(self, key_name_str, val_name, aList):
161 count = 1 162 resp_key = key_name_str+"=" 163 resp = "" 164 is_first = True 165 for e in aList: 166 if isinstance(e, dict): 167 # it has to be a Dictionary! 168 if not is_first: 169 resp_key += chr(2) 170 resp += "&" 171 resp_key += val_name+str(count) 172 resp += self._generateDictInUrl(val_name+str(count), e) 173 else: 174 # otherwise, don't know to handle 175 raise AxAPIError(code=99, message="invalid dictionary object") 176 count += 1 177 is_first = False 178 return resp_key+"&"+resp
179
180 - def _generateDictInUrl(self, key_name_str, aDict):
181 resp = key_name_str+"=" 182 is_first = True 183 for k, v in aDict.iteritems(): 184 if type(v) == int: 185 if not is_first: 186 resp += chr(2) 187 resp += k+chr(3)+str(v) 188 is_first = False 189 elif len(v) > 0: 190 if not is_first: 191 resp += chr(2) 192 resp += k+chr(3)+v 193 is_first = False 194 return resp
195
196 - def _appendString(self, file_str, is_first, string):
197 if is_first: 198 file_str.write(string) 199 else: 200 file_str.write("&"+string)
201
202 - def getObjectDict(self):
203 return self.__dict__
204
205 - def getRequestPostDataXml(self):
206 file_str = StringIO() 207 is_first = True 208 for k, v in self.__dict__.iteritems(): 209 if self.__xml_convrt__.has_key(k): 210 # a list value, v 211 if len(v) > 0: 212 self._appendString(file_str, is_first, self._generateListInUrl(k, self.__xml_convrt__[k], v)) 213 is_first = False 214 elif isinstance(v, dict): 215 # key_name: { k1: v1, k2: v2, ..., } 216 if len(v) > 0: 217 self._appendString(file_str, is_first, self._generateDictInUrl(k, v)) 218 is_first = False 219 elif type(v) == int: 220 # key_name: value 221 self._appendString(file_str, is_first, k+"="+str(v)) 222 is_first = False 223 elif len(v) > 0: 224 # key_name: value 225 self._appendString(file_str, is_first, k+"="+v) 226 is_first = False 227 print file_str.getvalue() 228 return file_str.getvalue()
229
230 - def dump(self):
231 """ 232 Debug purpose to print out the AX object internal data. 233 """ 234 print (self.__dict__)
235
236 - def getInfo(self):
237 """ 238 Returns object information as a dictionary. 239 Should be overridden. 240 """ 241 return {}
242