footmark/slb/vserver_group.py (146 lines of code) (raw):

""" Represents an SLB """ from footmark.slb.slbobject import TaggedSLBObject class VServerGroup(TaggedSLBObject): def __init__(self, connection=None, owner_id=None, name=None, description=None, id=None): super(VServerGroup, self).__init__(connection) self.tags = {} def __repr__(self): return 'VServerGroup:%s' % self.id def __getattr__(self, name): if name == 'id': return self.vserver_group_id if name == 'name': return self.vserver_group_name def __setattr__(self, name, value): if name == 'id': self.vserver_group_id = value if name == 'name': self.vserver_group_name = value super(TaggedSLBObject, self).__setattr__(name, value) def set(self, backend_servers=None, vserver_group_name=None): ''' set attribute ''' changed = False if backend_servers and self.backend_servers['backend_server']: set = [] for old in self.backend_servers['backend_server']: for new in backend_servers: if new['server_id'] == old['server_id']: for key in list(old.keys()): if key in new and str(old[key]) != str(new[key]): set.append(new) if set: params = {'vserver_group_id': self.vserver_group_id} for index in range(0, len(set), 20): params['backend_servers'] = self.format_backend_servers(set[index:index+20]) if self.connection.set_vserver_group_attribute(**params): changed = True return changed def add(self, backend_servers): ''' add backend servers ''' add = [] changed = False if backend_servers: if not self.backend_servers['backend_server']: add = backend_servers else: old = [] for o in self.backend_servers['backend_server']: old.append(o['server_id']) for new in backend_servers: if new not in old: add.append(new) if add: params = {'vserver_group_id': self.vserver_group_id} for index in range(0, len(add), 20): params['backend_servers'] = self.format_backend_servers(add[index:index+20]) if self.connection.add_vserver_group_backend_servers(**params): changed = True return changed def remove(self, backend_servers): ''' remove backend servers ''' removed = [] changed = False if backend_servers: if not self.backend_servers['backend_server']: return False else: old = [] for o in self.backend_servers['backend_server']: old.append(o['server_id']) for new in backend_servers: if new['server_id'] in old: removed.append(new) if removed: params = {'vserver_group_id': self.vserver_group_id} for index in range(0, len(removed), 20): params['backend_servers'] = self.format_backend_servers(removed[index:index+20]) if self.connection.remove_vserver_group_backend_servers(**params): changed = True return changed def modify(self, backend_servers): ''' modify backend servers ''' changed = False old = [] new = [] if backend_servers and self.backend_servers['backend_server']: for o in self.backend_servers['backend_server']: for n in backend_servers: if o['server_id'] == n['server_id']: for key in list(o.keys()): if key in n and str(o[key]) != str(n[key]): old.append(o) new.append(n) break if old and new: params = {'vserver_group_id': self.vserver_group_id} for index in range(0, len(old), 20): params['old_backend_servers'] = self.format_backend_servers(old[index:index+20]) params['new_backend_servers'] = self.format_backend_servers(new[index:index+20]) if self.connection.modify_vserver_group_backend_servers(**params): changed = True return changed def delete(self): ''' delete vserver group ''' return self.connection.delete_vserver_group(**{'vserver_group_id':self.vserver_group_id}) def get(self): ''' describe vserver group attribute ''' return self.connection.describe_vserver_group_attribute(**{'vserver_group_id':self.vserver_group_id}) def read(self): group = {} for name, value in list(self.__dict__.items()): if name in ["connection", "region", "request_id"]: continue if name == "backend_servers": if value and value['backend_server']: value = value['backend_server'] else: value = [] if name == "vserver_group_id": group['id'] = value if name == "vserver_group_name": group['name'] = value group[name] = value return group def format_backend_servers(self, servers): backend_servers = [] for s in servers: server = {} for key, value in list(s.items()): split = [] for k in str(key).split("_"): split.append(str.upper(k[0])+k[1:]) server["".join(split)] = value backend_servers.append(server) return backend_servers