88 lines
2.6 KiB
Python
Raw Normal View History

#!/usr/bin/python
#
# Copyright 2014 Canonical Ltd.
#
import json
from charmhelpers.core.hookenv import (
log,
INFO,
ERROR
)
from charmhelpers.contrib.storage.linux.ceph import (
create_pool,
2014-11-07 15:26:58 +01:00
pool_exists
)
def decode(f):
def decode_inner(req):
return json.dumps(f(json.loads(req)))
return decode_inner
@decode
def process_requests(reqs):
2014-11-10 10:46:09 +00:00
"""Process Ceph broker request(s).
2014-11-10 10:46:09 +00:00
This is a versioned api. API version must be supplied by the client making
the request.
"""
try:
version = reqs.get('api-version')
if version == 1:
return process_requests_v1(reqs['ops'])
except Exception as exc:
log(str(exc), level=ERROR)
msg = ("Unexpected error occurred while processing requests: %s" %
(reqs))
log(msg, level=ERROR)
return {'exit-code': 1, 'stderr': msg}
msg = ("Missing or invalid api version (%s)" % (version))
2014-11-09 12:58:04 +00:00
return {'exit-code': 1, 'stderr': msg}
def process_requests_v1(reqs):
2014-11-10 10:46:09 +00:00
"""Process v1 requests.
2014-11-10 10:46:09 +00:00
Takes a list of requests (dicts) and processes each one. If an error is
found, processing stops and the client is notified in the response.
2014-11-10 10:46:09 +00:00
Returns a response dict containing the exit code (non-zero if any
operation failed along with an explanation).
"""
log("Processing %s ceph broker requests" % (len(reqs)), level=INFO)
for req in reqs:
op = req.get('op')
log("Processing op='%s'" % (op), level=INFO)
# Use admin client since we do not have other client key locations
# setup to use them for these operations.
svc = 'admin'
2014-11-09 12:58:04 +00:00
if op == "create-pool":
2014-11-08 21:13:40 +00:00
params = {'pool': req.get('name'),
'replicas': req.get('replicas')}
if not all(params.iteritems()):
msg = ("Missing parameter(s): %s" %
(' '.join([k for k in params.iterkeys()
if not params[k]])))
log(msg, level=ERROR)
2014-11-09 12:58:04 +00:00
return {'exit-code': 1, 'stderr': msg}
2014-11-08 21:13:40 +00:00
pool = params['pool']
replicas = params['replicas']
if not pool_exists(service=svc, name=pool):
2014-11-08 20:15:17 +00:00
log("Creating pool '%s' (replicas=%s)" % (pool, replicas),
level=INFO)
create_pool(service=svc, name=pool, replicas=replicas)
else:
2014-11-08 20:15:17 +00:00
log("Pool '%s' already exists - skipping create" % (pool),
level=INFO)
else:
msg = "Unknown operation '%s'" % (op)
log(msg, level=ERROR)
2014-11-09 12:58:04 +00:00
return {'exit-code': 1, 'stderr': msg}
2014-11-09 12:58:04 +00:00
return {'exit-code': 0}