def place(self, block=True): if get_domain() == None: print 'SDB Persistence Domain not set' domain_name = self.get_string('Specify SDB Domain') set_domain(domain_name) s = ServerSet() for item in self.items: r = item.ami.run(min_count=1, max_count=item.quantity, key_name=item.key.name, user_data=item.get_userdata_string(), security_groups=item.groups, instance_type=item.instance_type, placement=item.zone.name) if block: states = [i.state for i in r.instances] if states.count('running') != len(states): print states time.sleep(15) states = [i.update() for i in r.instances] for i in r.instances: server = Server() server.name = item.name server.instance_id = i.id server.reservation = r server.save() s.append(server) if len(s) == 1: return s[0] else: return s
def find(cls, **params): keys = params.keys() if len(keys) > 4: raise SDBPersistanceError('Too many fields, max is 4') parts = ["['__type__'='%s'] union ['__lineage__'starts-with'%s']" % (cls.__name__, cls.get_lineage())] properties = cls.find_properties() for key in keys: found = False for property in properties: if property.name == key: found = True if isinstance(property, ScalarProperty): checker = property.checker parts.append("['%s' = '%s']" % (key, checker.to_string(params[key]))) else: raise SDBPersistanceError('%s is not a searchable field' % key) if not found: raise SDBPersistanceError('%s is not a valid field' % key) query = ' intersection '.join(parts) domain = get_domain() if domain: rs = domain.query(query) else: rs = [] return object_lister(None, rs)
def place(self, block=True): if get_domain() == None: print('SDB Persistence Domain not set') domain_name = self.get_string('Specify SDB Domain') set_domain(domain_name) s = ServerSet() for item in self.items: r = item.ami.run(min_count=1, max_count=item.quantity, key_name=item.key.name, user_data=item.get_userdata_string(), security_groups=item.groups, instance_type=item.instance_type, placement=item.zone.name) if block: states = [i.state for i in r.instances] if states.count('running') != len(states): print(states) time.sleep(15) states = [i.update() for i in r.instances] for i in r.instances: server = Server() server.name = item.name server.instance_id = i.id server.reservation = r server.save() s.append(server) if len(s) == 1: return s[0] else: return s
def test(domain_name): print 'Initialize the Persistance system' set_domain(domain_name) print 'Call test1' s1 = test1() # now create a new instance and read the saved data from SDB print 'Now sleep to wait for things to converge' time.sleep(5) print 'Now lookup the object and compare the fields' s2 = TestScalar(s1.id) assert s1.name == s2.name assert s1.description == s2.description assert s1.size == s2.size assert s1.offset == s2.offset assert s1.foo == s2.foo #assert s1.date == s2.date print 'Call test2' s2 = test2(s1.name) print 'Call test3' s3 = test3(s1) print 'Call test4' s4 = test4(s1, s3) print 'Call test5' s6 = test6() s5 = test5(s6) domain = get_domain() item1 = domain.get_item(s1.id) item2 = domain.get_item(s2.id) item3 = domain.get_item(s3.id) item4 = domain.get_item(s4.id) item5 = domain.get_item(s5.id) item6 = domain.get_item(s6.id) return [(s1, item1), (s2, item2), (s3, item3), (s4, item4), (s5, item5), (s6, item6)]
def list(cls, max_items=None): domain = get_domain() if domain: rs = domain.query("['__type__' = '%s']" % cls.__name__, max_items=max_items) else: rs = [] return object_lister(cls, rs)
def get_related_objects(self, ref_name, ref_cls=None): domain = get_domain() if domain: query = "['%s' = '%s']" % (ref_name, self.id) if ref_cls: query += " intersection ['__type__'='%s']" % ref_cls.__name__ rs = domain.query(query) else: rs = [] return object_lister(ref_cls, rs)
def save(self): attrs = {'__type__' : self.__class__.__name__, '__module__' : self.__class__.__module__, '__lineage__' : self.get_lineage()} for property in self.find_properties(): attrs[property.name] = property.to_string(self) domain = get_domain() if domain: domain.put_attributes(self.id, attrs, replace=True) self.auto_update = True
def load(self, obj): domain = get_domain() a = domain.get_attributes(obj.id, self.name) # try to get the attribute value from SDB if self.name in a: value = self.checker.from_string(a[self.name]) setattr(obj, self.slot_name, value) # if it's not there, set the value to the default value else: self.__set__(obj, self.checker.default)
def update_config(self): if not self.config.has_section('Credentials'): self.config.add_section('Credentials') self.config.set('Credentials', 'aws_access_key_id', self.ec2.aws_access_key_id) self.config.set('Credentials', 'aws_secret_access_key', self.ec2.aws_secret_access_key) if not self.config.has_section('Pyami'): self.config.add_section('Pyami') sdb_domain = get_domain() if sdb_domain: self.config.set('Pyami', 'server_sdb_domain', sdb_domain.name) self.config.set('Pyami', 'server_sdb_name', self.name)
def update_config(self): if not self.config.has_section('Credentials'): self.config.add_section('Credentials') self.config.set('Credentials', 'aws_access_key_id', self.ec2.aws_access_key_id) self.config.set('Credentials', 'aws_secret_access_key', self.ec2.aws_secret_access_key) if not self.config.has_section('Pyami'): self.config.add_section('Pyami') sdb_domain = get_domain() if sdb_domain: self.config.set('Pyami', 'server_sdb_domain', sdb_domain) self.config.set('Pyami', 'server_sdb_name', self.name)
def __set__(self, obj, value): if not isinstance(value, list): raise SDBPersistanceError('Value must be a list') self._list = value str_list = [] for value in self._list: str_list.append(self.checker.to_string(value)) domain = get_domain() try: domain.put_attributes(obj.id, {self.name : str_list}, replace=True) except: print 'problem setting value: %s' % value
def __init__(self, id=None): self.id = id if self.id: self.auto_update = True domain = get_domain() if domain: attrs = domain.get_attributes(self.id, '__type__') if len(attrs.keys()) == 0: raise SDBPersistanceError('Object %s: not found' % self.id) else: self.id = str(uuid.uuid4()) self.auto_update = False
def load(self, obj): if obj != None: _list = [] domain = get_domain() a = domain.get_attributes(obj.id, self.name) if self.name in a: lst = a[self.name] if not isinstance(lst, list): lst = [lst] for value in lst: value = self.checker.from_string(value) _list.append(value) setattr(obj, self.slot_name, MultiValue(self, obj, _list))
def get(cls, id=None, **params): domain = get_domain() if domain and id: a = domain.get_attributes(id, '__type__') if a.has_key('__type__'): return cls(id) else: raise SDBPersistanceError('%s object with id=%s does not exist' % (cls.__name__, id)) else: rs = cls.find(**params) try: obj = rs.next() except StopIteration: raise SDBPersistanceError('%s object matching query does not exist' % cls.__name__) try: rs.next() except StopIteration: return obj raise SDBPersistanceError('Query matched more than 1 item')
def save(self, obj): domain = get_domain() domain.put_attributes(obj.id, {self.name : self.to_string(obj)}, replace=True)
def append(self, value): self.checker.check(value) self._list.append(value) domain = get_domain() domain.put_attributes(self.object.id, {self.name: self.checker.to_string(value)}, replace=False)
def __delitem__(self, key): item = self[key] self._list.__delitem__(key) domain = get_domain() domain.delete_attributes(self.object.id, {self.name: [self.checker.to_string(item)]})
def delete(self): domain = get_domain() if domain: domain.delete_attributes(self.id)