Revision ad21ffa9 ci/utils.py
b/ci/utils.py | ||
---|---|---|
5 | 5 |
""" |
6 | 6 |
|
7 | 7 |
import os |
8 |
import re |
|
8 | 9 |
import sys |
9 | 10 |
import time |
10 | 11 |
import logging |
... | ... | |
17 | 18 |
from kamaki.clients.astakos import AstakosClient |
18 | 19 |
from kamaki.clients.cyclades import CycladesClient |
19 | 20 |
from kamaki.clients.image import ImageClient |
21 |
from kamaki.clients.compute import ComputeClient |
|
20 | 22 |
|
21 | 23 |
DEFAULT_CONFIG_FILE = "new_config" |
22 | 24 |
# UUID of owner of system images |
... | ... | |
165 | 167 |
self.fabric_installed = False |
166 | 168 |
self.kamaki_installed = False |
167 | 169 |
self.cyclades_client = None |
170 |
self.compute_client = None |
|
168 | 171 |
self.image_client = None |
169 | 172 |
|
170 | 173 |
def setup_kamaki(self): |
171 | 174 |
"""Initialize kamaki |
172 | 175 |
|
173 |
Setup cyclades_client and image_client
|
|
176 |
Setup cyclades_client, image_client and compute_client
|
|
174 | 177 |
""" |
175 | 178 |
|
176 | 179 |
config = kamaki_config.Config() |
... | ... | |
198 | 201 |
self.image_client = ImageClient(cyclades_url, token) |
199 | 202 |
self.image_client.CONNECTION_RETRY_LIMIT = 2 |
200 | 203 |
|
204 |
compute_url = \ |
|
205 |
astakos_client.get_service_endpoints('compute')['publicURL'] |
|
206 |
self.logger.debug("Compute API url is %s" % _green(compute_url)) |
|
207 |
self.compute_client = ComputeClient(compute_url, token) |
|
208 |
self.compute_client.CONNECTION_RETRY_LIMIT = 2 |
|
209 |
|
|
201 | 210 |
def _wait_transition(self, server_id, current_status, new_status): |
202 | 211 |
"""Wait for server to go from current_status to new_status""" |
203 | 212 |
self.logger.debug("Waiting for server to become %s" % new_status) |
... | ... | |
232 | 241 |
self._wait_transition(server_id, "ACTIVE", "DELETED") |
233 | 242 |
|
234 | 243 |
@_check_kamaki |
235 |
def create_server(self, image_id=None, flavor_id=None, ssh_keys=None):
|
|
244 |
def create_server(self, image_id=None, flavor_name=None, ssh_keys=None):
|
|
236 | 245 |
"""Create slave server""" |
237 | 246 |
self.logger.info("Create a new server..") |
238 | 247 |
if image_id is None: |
... | ... | |
240 | 249 |
self.logger.debug("Will use image \"%s\"" % _green(image['name'])) |
241 | 250 |
image_id = image["id"] |
242 | 251 |
self.logger.debug("Image has id %s" % _green(image_id)) |
243 |
if flavor_id is None: |
|
244 |
flavor_id = self.config.getint("Deployment", "flavor_id") |
|
252 |
flavor_id = self._find_flavor(flavor_name) |
|
245 | 253 |
server = self.cyclades_client.create_server( |
246 | 254 |
self.config.get('Deployment', 'server_name'), |
247 | 255 |
flavor_id, |
... | ... | |
274 | 282 |
""".format(accept_ssh_from) |
275 | 283 |
_run(cmd, False) |
276 | 284 |
|
285 |
def _find_flavor(self, flavor_name): |
|
286 |
"""Given a flavor_name (reg expression) find a flavor id to use""" |
|
287 |
if flavor_name is None: |
|
288 |
flavor_name = self.config.get('Deployment', 'flavor_name') |
|
289 |
self.logger.debug("Try to find a flavor with name \"%s\"" % flavor_name) |
|
290 |
|
|
291 |
flavors = self.compute_client.list_flavors() |
|
292 |
flavors = [f for f in flavors |
|
293 |
if re.search(flavor_name, f['name']) is not None] |
|
294 |
|
|
295 |
if flavors: |
|
296 |
self.logger.debug("Will use %s with id %s" |
|
297 |
% (flavors[0]['name'], flavors[0]['id'])) |
|
298 |
return flavors[0]['id'] |
|
299 |
else: |
|
300 |
self.logger.error("No matching flavor found.. aborting") |
|
301 |
sys.exit(1) |
|
302 |
|
|
277 | 303 |
def _find_image(self): |
278 | 304 |
"""Find a suitable image to use |
279 | 305 |
|
Also available in: Unified diff