class User(Model): FIELDS = [ Field('nickname', data_type=str), Field('openid', data_type=str), Field('approved', data_type=bool, def_value=False), Field('admin', data_type=bool, def_value=False, required=False), Field('api_key', data_type=str, required=False) ] CHILDREN = [ InitScript, ]
def test_str_field_bad(self): with self.assertRaises(ModelError): Field('f', str, 12) f = Field('f', str, '12') with self.assertRaises(ModelError): f.validate(12) with self.assertRaises(ModelError): f.validate(None)
def test_int_field_bad(self): with self.assertRaises(ModelError): Field('f', int, '12') f = Field('f', int, 12) with self.assertRaises(ModelError): f.validate('12') with self.assertRaises(ModelError): f.validate(None)
class Host(Model): FIELDS = [ Field('distro_id', data_type=str), Field('distro_release', data_type=str), Field('distro_codename', data_type=str), Field('mem_total', data_type=int), Field('cpu_total', data_type=int), Field('cpu_type', data_type=str), Field('enlisted', data_type=bool, def_value=False, required=False), Field('max_containers', data_type=int, def_value=0, required=False), SecretField('api_key'), ] CHILDREN = [ Container, ] def __repr__(self): return self.name def get_container(self, name): for c in self.containers: if c.name == name: return c raise ModelError('Container not found: %s' % name, 404) def _get_ping_file(self): return os.path.join(self._modeldir, 'pings.log') def ping(self): with open(self._get_ping_file(), mode='a') as f: f.write('%d\n' % time.time()) @property def online(self): """Online means we've been "pinged" in the last 3 minutes.""" ping_file = self._get_ping_file() if not os.path.exists(ping_file): return False now = time.time() mtime = os.path.getmtime(self._get_ping_file()) return now - mtime < 180 # pinged in last 3 minutes
class Container(Model): FIELDS = [ Field('template', data_type=str, required=False), Field('release', data_type=str, required=False), Field('init_script', data_type=str, required=False), Field('date_requested', int, required=False), Field('date_created', int, required=False), Field('max_memory', int, required=False), Field('re_create', data_type=bool, def_value=False, required=False), Field('state', data_type=str, def_value='UNKNOWN', required=False), Field('keep_running', data_type=bool, def_value=True, required=False), Field('ips', data_type=str, required=False), Field('one_shot', data_type=bool, def_value=False, required=False), Field('requested_by', data_type=str, required=False), ] CHILDREN = [ContainerMount, InitScript] @property def requested_str(self): v = self.date_requested if v: return datetime.datetime.fromtimestamp(v) return '?' @property def created_str(self): v = self.date_created if v: return datetime.datetime.fromtimestamp(v) return '?' def update(self, data): if self.date_created and \ data.get('date_created', 0) > self.date_created: data['re_create'] = False return super(Container, self).update(data) def _get_log_file(self, logname): logdir = os.path.join(self._modeldir, 'logs') if not os.path.exists(logdir): os.mkdir(logdir) return os.path.join(logdir, logname) def append_log(self, logname, content): with open(self._get_log_file(logname), 'a') as f: f.write(content) def get_log_names(self): logdir = os.path.join(self._modeldir, 'logs') if os.path.exists(logdir): return os.listdir(logdir) return [] def get_log(self, logname): with open(self._get_log_file(logname)) as f: return f.read() def __repr__(self): return self.name @staticmethod def validate_template_release(template, release): releases = CONTAINER_TYPES.get(template) if not releases: raise KeyError('Invalid template type: %s' % template) if release not in releases: raise KeyError('Invalid release for template: %s' % release)
class InitScript(Model): FIELDS = [ Field('content', data_type=str), ]
class ContainerMount(Model): FIELDS = [ Field('type', data_type=str), Field('source', data_type=str), Field('directory', data_type=str), ]
class SharedStorage(Model): FIELDS = [ Field('type', data_type=str), Field('source', data_type=str) ]
def test_int_field_good(self): f = Field('name', int) f.validate(1)
class MyModel(Model): FIELDS = [ Field('strfield', str, ''), Field('intfield', int, 0), ]