示例#1
0
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,
    ]
示例#2
0
 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)
示例#3
0
 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)
示例#4
0
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
示例#5
0
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)
示例#6
0
class InitScript(Model):
    FIELDS = [
        Field('content', data_type=str),
    ]
示例#7
0
class ContainerMount(Model):
    FIELDS = [
        Field('type', data_type=str),
        Field('source', data_type=str),
        Field('directory', data_type=str),
    ]
示例#8
0
class SharedStorage(Model):
    FIELDS = [
        Field('type', data_type=str),
        Field('source', data_type=str)
    ]
示例#9
0
 def test_int_field_good(self):
     f = Field('name', int)
     f.validate(1)
示例#10
0
class MyModel(Model):
    FIELDS = [
        Field('strfield', str, ''),
        Field('intfield', int, 0),
    ]