~frankban/juju-quickstart/env-creation-proto

« back to all changes in this revision

Viewing changes to quickstart/envs/models2.py

  • Committer: Francesco Banconi
  • Date: 2013-11-30 01:02:59 UTC
  • Revision ID: francesco.banconi@canonical.com-20131130010259-tpc31hihheizt3bz
Checkpoint.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from collections import OrderedDict
 
2
import inspect
 
3
import operator
 
4
 
 
5
from quickstart.envs.fields import (
 
6
    AutoGeneratedField,
 
7
    BoolField,
 
8
    Field,
 
9
    ProviderField,
 
10
    StringField,
 
11
)
 
12
 
 
13
 
 
14
class _EnvMeta(type):
 
15
 
 
16
    def __new__(cls, name, bases, attrs):
 
17
        env_class = super(_EnvMeta, cls).__new__(cls, name, bases, attrs)
 
18
        fields = []
 
19
        predicate = lambda value: isinstance(value, Field)
 
20
        for name, field in inspect.getmembers(env_class, predicate=predicate):
 
21
            field.name = name
 
22
            fields.append(field)
 
23
        env_class._fields = sorted(
 
24
            fields, key=operator.attrgetter('_position'))
 
25
        return env_class
 
26
 
 
27
 
 
28
class BaseEnv(object):
 
29
 
 
30
    __metaclass__ = _EnvMeta
 
31
 
 
32
    fields_excluded_from_dict = ('name', 'is_default')
 
33
 
 
34
    provider = ProviderField()
 
35
    name = StringField(
 
36
        'environment name',
 
37
        'the environment name to use with Juju (can be an arbitrary value)',
 
38
        required=True)
 
39
    admin_secret = AutoGeneratedField(
 
40
        'admin secret',
 
41
        'the password that will be used to authenticate to the environment '
 
42
        '(it will be automatically generated if not provided)')
 
43
    is_default = BoolField('default', 'make this the default environment')
 
44
 
 
45
    def __init__(self, **kwargs):
 
46
        for key, value in kwargs.items():
 
47
            setattr(self, key, value)
 
48
        self.provider = self.provider_type
 
49
 
 
50
    def __repr__(self):
 
51
        return '<{}: {}>'.format(self.__class__.__name__, self.name)
 
52
 
 
53
    def __str__(self):
 
54
        return '{} (type: {})'.format(self.name, self.provider)
 
55
 
 
56
    @property
 
57
    def fields(self):
 
58
        for field in self._fields:
 
59
            yield field, getattr(self, field.name)
 
60
 
 
61
    def as_dict(self):
 
62
        return dict(
 
63
            (field.dest, value) for field, value in self.fields
 
64
            if field.name not in self.fields_excluded_from_dict
 
65
        )
 
66
 
 
67
 
 
68
class LocalEnv(BaseEnv):
 
69
 
 
70
    provider_type = 'local'
 
71
 
 
72
 
 
73
 
 
74
class Ec2Env(BaseEnv):
 
75
 
 
76
    provider_type = 'ec2'
 
77
 
 
78
    access_key = StringField('access key', 'the AWS access key', required=True)
 
79
    secret_key = StringField('secret key', 'the AWS secret key', required=True)
 
80
    control_bucket = AutoGeneratedField(
 
81
        'control bucket',
 
82
        'the control bucket to use with AWS '
 
83
        '(it will be automatically generated if not provided)')
 
84
    is_default = BoolField('default', 'make this the default environment')
 
85
 
 
86
 
 
87
class Environments(OrderedDict):
 
88
 
 
89
    def set_default_env(name):
 
90
        pass
 
91
 
 
92