root / snfOCCI / APIserver.py @ dcb17973
History | View | Annotate | Download (4.1 kB)
1 |
#!/usr/bin/env python
|
---|---|
2 |
|
3 |
from snfOCCI.registry import snfRegistry |
4 |
from snfOCCI.compute import ComputeBackend |
5 |
from snfOCCI.config import SERVER_CONFIG |
6 |
|
7 |
from kamaki.clients.compute import ComputeClient |
8 |
from kamaki.clients.cyclades import CycladesClient |
9 |
from kamaki.config import Config |
10 |
|
11 |
from occi.core_model import Mixin, Resource |
12 |
from occi.backend import MixinBackend |
13 |
from occi.extensions.infrastructure import COMPUTE, START, STOP, SUSPEND, RESTART, RESOURCE_TEMPLATE, OS_TEMPLATE |
14 |
from occi.wsgi import Application |
15 |
|
16 |
from wsgiref.simple_server import make_server |
17 |
from wsgiref.validate import validator |
18 |
|
19 |
|
20 |
|
21 |
|
22 |
class MyAPP(Application): |
23 |
'''
|
24 |
An OCCI WSGI application.
|
25 |
'''
|
26 |
|
27 |
def refresh_images(self, snf, client): |
28 |
|
29 |
images = snf.list_images() |
30 |
for image in images: |
31 |
IMAGE_ATTRIBUTES = {'occi.core.id': str(image['id'])} |
32 |
IMAGE = Mixin("http://schemas.ogf.org/occi/infrastructure#", str(image['name']), [OS_TEMPLATE], attributes = IMAGE_ATTRIBUTES) |
33 |
self.register_backend(IMAGE, MixinBackend())
|
34 |
|
35 |
def refresh_flavors(self, snf, client): |
36 |
|
37 |
flavors = snf.list_flavors() |
38 |
for flavor in flavors: |
39 |
details = snf.get_flavor_details(flavor['id'])
|
40 |
FLAVOR_ATTRIBUTES = {'occi.core.id': flavor['id'], |
41 |
'occi.compute.cores': details['cpu'], |
42 |
'occi.compute.memory': details['ram'], |
43 |
'occi.storage.size': details['disk'], |
44 |
} |
45 |
FLAVOR = Mixin("http://schemas.ogf.org/occi/infrastructure#", str(flavor['name']), [RESOURCE_TEMPLATE], attributes = FLAVOR_ATTRIBUTES) |
46 |
self.register_backend(FLAVOR, MixinBackend())
|
47 |
|
48 |
|
49 |
def refresh_compute_instances(self, snf): |
50 |
'''Syncing registry with cyclades resources'''
|
51 |
|
52 |
servers = snf.list_servers() |
53 |
snf_keys = [] |
54 |
for server in servers: |
55 |
snf_keys.append(str(server['id'])) |
56 |
|
57 |
resources = self.registry.resources
|
58 |
occi_keys = resources.keys() |
59 |
|
60 |
diff = [x for x in snf_keys if '/compute/'+x not in occi_keys] |
61 |
for key in diff: |
62 |
|
63 |
details = snf.get_server_details(int(key))
|
64 |
flavor = snf.get_flavor_details(details['flavorRef'])
|
65 |
|
66 |
resource = Resource(key, COMPUTE, []) |
67 |
resource.actions = [START] |
68 |
resource.attributes['occi.core.id'] = key
|
69 |
resource.attributes['occi.compute.state'] = 'inactive' |
70 |
resource.attributes['occi.compute.architecture'] = SERVER_CONFIG['compute_arch'] |
71 |
resource.attributes['occi.compute.cores'] = flavor['cpu'] |
72 |
resource.attributes['occi.compute.memory'] = flavor['ram'] |
73 |
resource.attributes['occi.compute.hostname'] = SERVER_CONFIG['hostname'] % {'id':int(key)} |
74 |
|
75 |
self.registry.add_resource(key, resource, None) |
76 |
|
77 |
diff = [x for x in occi_keys if x[9:] not in snf_keys] |
78 |
for key in diff: |
79 |
self.registry.delete_resource(key, None) |
80 |
|
81 |
|
82 |
def __call__(self, environ, response): |
83 |
|
84 |
conf = Config() |
85 |
conf.set('compute_token',environ['HTTP_AUTH_TOKEN']) |
86 |
compClient = ComputeClient(conf) |
87 |
cyclClient = CycladesClient(conf) |
88 |
|
89 |
#Up-to-date flavors and images
|
90 |
self.refresh_compute_instances(compClient)
|
91 |
self.refresh_images(compClient, cyclClient)
|
92 |
self.refresh_flavors(compClient, cyclClient)
|
93 |
|
94 |
# token will be represented in self.extras
|
95 |
return self._call_occi(environ, response, security = None, token = environ['HTTP_AUTH_TOKEN'], snf = compClient, client = cyclClient) |
96 |
|
97 |
|
98 |
def main(): |
99 |
|
100 |
APP = MyAPP(registry = snfRegistry()) |
101 |
COMPUTE_BACKEND = ComputeBackend() |
102 |
|
103 |
APP.register_backend(COMPUTE, COMPUTE_BACKEND) |
104 |
APP.register_backend(START, COMPUTE_BACKEND) |
105 |
APP.register_backend(STOP, COMPUTE_BACKEND) |
106 |
APP.register_backend(RESTART, COMPUTE_BACKEND) |
107 |
APP.register_backend(SUSPEND, COMPUTE_BACKEND) |
108 |
APP.register_backend(RESOURCE_TEMPLATE, MixinBackend()) |
109 |
APP.register_backend(OS_TEMPLATE, MixinBackend()) |
110 |
|
111 |
VALIDATOR_APP = validator(APP) |
112 |
HTTPD = make_server('', SERVER_CONFIG['port'], VALIDATOR_APP) |
113 |
HTTPD.serve_forever() |
114 |
|