import httplib2
import json
import logging
-import os
import urllib
from teuthology import misc as teuthology
log = logging.getLogger(__name__)
-def _lock_url():
- return os.getenv('TEUTHOLOGY_LOCK_SERVER', 'http://localhost:8080/lock')
+def _lock_url(ctx):
+ return ctx.teuthology_config['lock_server']
def send_request(method, url, body=None):
http = httplib2.Http()
method, url, body, resp.status)
return (False, None)
-def lock_many(num, user=None):
+def lock_many(ctx, num, user=None):
if user is None:
user = teuthology.get_user()
- success, content = send_request('POST', _lock_url(),
+ success, content = send_request('POST', _lock_url(ctx),
urllib.urlencode(dict(user=user, num=num)))
if success:
machines = json.loads(content)
log.warn('Could not lock %d nodes', num)
return []
-def lock(name, user=None):
+def lock(ctx, name, user=None):
if user is None:
user = teuthology.get_user()
- success, _ = send_request('POST', _lock_url() + '/' + name,
+ success, _ = send_request('POST', _lock_url(ctx) + '/' + name,
urllib.urlencode(dict(user=user)))
if success:
log.debug('locked %s as %s', name, user)
log.error('failed to lock %s', name)
return success
-def unlock(name, user=None):
+def unlock(ctx, name, user=None):
if user is None:
user = teuthology.get_user()
- success, _ = send_request('DELETE', _lock_url() + '/' + name + '?' + \
+ success, _ = send_request('DELETE', _lock_url(ctx) + '/' + name + '?' + \
urllib.urlencode(dict(user=user)))
if success:
log.debug('unlocked %s', name)
log.error('failed to unlock %s', name)
return success
-def get_status(name):
- success, content = send_request('GET', _lock_url() + '/' + name)
+def get_status(ctx, name):
+ success, content = send_request('GET', _lock_url(ctx) + '/' + name)
if success:
return json.loads(content)
return None
-def list_locks():
- success, content = send_request('GET', _lock_url())
+def list_locks(ctx):
+ success, content = send_request('GET', _lock_url(ctx))
if success:
return json.loads(content)
return None
-def update_lock(name, description=None, status=None):
+def update_lock(ctx, name, description=None, status=None):
updated = {}
if description is not None:
updated['desc'] = description
updated['status'] = status
if updated:
- success, _ = send_request('PUT', _lock_url() + '/' + name + '?' + \
+ success, _ = send_request('PUT', _lock_url(ctx) + '/' + name + '?' + \
urllib.urlencode(updated))
return success
return True
level=loglevel,
)
+ teuthology.read_config(ctx)
+
ret = 0
user = ctx.owner
machines = ctx.machines
return 1
if machines:
- statuses = [get_status(machine) for machine in machines]
+ statuses = [get_status(ctx, machine) for machine in machines]
else:
- statuses = list_locks()
+ statuses = list_locks(ctx)
if statuses:
print json.dumps(statuses, indent=4)
elif ctx.lock:
assert machines, 'You must specify machines to lock.'
for machine in machines:
- if not lock(machine, user):
+ if not lock(ctx, machine, user):
ret = 1
if not ctx.f:
return ret
elif ctx.unlock:
assert machines, 'You must specify machines to unlock.'
for machine in machines:
- if not unlock(machine, user):
+ if not unlock(ctx, machine, user):
ret = 1
if not ctx.f:
return ret
elif ctx.num_to_lock:
assert not machines, \
'The --lock-many option does not support specifying machines'
- result = lock_many(ctx.num_to_lock, user)
+ result = lock_many(ctx, ctx.num_to_lock, user)
if not result:
ret = 1
else:
if ctx.desc is not None or ctx.status is not None:
for machine in machines_to_update:
- update_lock(machine, ctx.desc, ctx.status)
+ update_lock(ctx, machine, ctx.desc, ctx.status)
return ret
def lock_machines(ctx, config):
log.info('Locking machines...')
assert isinstance(config, int), 'config must be an integer'
- newly_locked = lock.lock_many(config, ctx.owner)
+ newly_locked = lock.lock_many(ctx, config, ctx.owner)
if len(newly_locked) != config:
log.error('Could not lock enough machines, unlocking and exiting...')
for machine in newly_locked:
- lock.unlock(machine, ctx.owner)
+ lock.unlock(ctx, machine, ctx.owner)
assert 0
ctx.config['targets'] = newly_locked
try:
finally:
log.info('Unlocking machines...')
for machine in newly_locked:
- lock.unlock(machine, ctx.owner)
+ lock.unlock(ctx, machine, ctx.owner)
def check_lock(ctx, config):
log.info('Checking locks...')
for machine in ctx.config['targets']:
- status = lock.get_status(machine)
+ status = lock.get_status(ctx, machine)
log.debug('machine status is %s', repr(status))
assert status is not None, \
'could not read lock status for {name}'.format(name=machine)