def handle_replicated_pool(request, service): pool_name = request.get('name') replicas = request.get('replicas') quota = request.get('max-bytes') # Optional params pg_num = request.get('pg_num') if pg_num: # Cap pg_num to max allowed just in case. osds = get_osds(service) if osds: pg_num = min(pg_num, (len(osds) * 100 // replicas)) # Check for missing params if pool_name is None or replicas is None: msg = "Missing parameter. name and replicas are required" log(msg, level=ERROR) return {'exit-code': 1, 'stderr': msg} pool = ReplicatedPool(service=service, name=pool_name, replicas=replicas, pg_num=pg_num) if not pool_exists(service=service, name=pool_name): log("Creating pool '%s' (replicas=%s)" % (pool.name, replicas), level=INFO) pool.create() else: log("Pool '%s' already exists - skipping create" % pool.name, level=DEBUG) # Set a quota if requested if quota is not None: set_pool_quota(service=service, pool_name=pool_name, max_bytes=quota)
def handle_erasure_pool(request, service): pool_name = request.get('name') erasure_profile = request.get('erasure-profile') quota = request.get('max-bytes') if erasure_profile is None: erasure_profile = "default-canonical" # Check for missing params if pool_name is None: msg = "Missing parameter. name is required for the pool" log(msg, level=ERROR) return {'exit-code': 1, 'stderr': msg} # TODO: Default to 3/2 erasure coding. I believe this requires min 5 osds if not erasure_profile_exists(service=service, name=erasure_profile): # TODO: Fail and tell them to create the profile or default msg = ("erasure-profile {} does not exist. Please create it with: " "create-erasure-profile".format(erasure_profile)) log(msg, level=ERROR) return {'exit-code': 1, 'stderr': msg} pool = ErasurePool(service=service, name=pool_name, erasure_code_profile=erasure_profile) # Ok make the erasure pool if not pool_exists(service=service, name=pool_name): log("Creating pool '%s' (erasure_profile=%s)" % (pool.name, erasure_profile), level=INFO) pool.create() # Set a quota if requested if quota is not None: set_pool_quota(service=service, pool_name=pool_name, max_bytes=quota)
def handle_erasure_pool(request, service): """Create a new erasure coded pool. :param request: dict of request operations and params. :param service: The ceph client to run the command under. :returns: dict. exit-code and reason if not 0. """ pool_name = request.get('name') erasure_profile = request.get('erasure-profile') max_bytes = request.get('max-bytes') max_objects = request.get('max-objects') weight = request.get('weight') group_name = request.get('group') allow_ec_overwrites = request.get('allow-ec-overwrites') if erasure_profile is None: erasure_profile = "default-canonical" app_name = request.get('app-name') # Check for missing params if pool_name is None: msg = "Missing parameter. name is required for the pool" log(msg, level=ERROR) return {'exit-code': 1, 'stderr': msg} if group_name: group_namespace = request.get('group-namespace') # Add the pool to the group named "group_name" add_pool_to_group(pool=pool_name, group=group_name, namespace=group_namespace) # TODO: Default to 3/2 erasure coding. I believe this requires min 5 osds if not erasure_profile_exists(service=service, name=erasure_profile): # TODO: Fail and tell them to create the profile or default msg = ("erasure-profile {} does not exist. Please create it with: " "create-erasure-profile".format(erasure_profile)) log(msg, level=ERROR) return {'exit-code': 1, 'stderr': msg} pool = ErasurePool(service=service, name=pool_name, erasure_code_profile=erasure_profile, percent_data=weight, app_name=app_name, allow_ec_overwrites=allow_ec_overwrites) # Ok make the erasure pool if not pool_exists(service=service, name=pool_name): log("Creating pool '{}' (erasure_profile={})".format( pool.name, erasure_profile), level=INFO) pool.create() # Set a quota if requested if max_bytes or max_objects: set_pool_quota(service=service, pool_name=pool_name, max_bytes=max_bytes, max_objects=max_objects)
def handle_replicated_pool(request, service): """Create a new replicated pool. :param request: dict of request operations and params. :param service: The ceph client to run the command under. :returns: dict. exit-code and reason if not 0. """ pool_name = request.get('name') replicas = request.get('replicas') quota = request.get('max-bytes') weight = request.get('weight') group_name = request.get('group') # Optional params pg_num = request.get('pg_num') if pg_num: # Cap pg_num to max allowed just in case. osds = get_osds(service) if osds: pg_num = min(pg_num, (len(osds) * 100 // replicas)) app_name = request.get('app-name') # Check for missing params if pool_name is None or replicas is None: msg = "Missing parameter. name and replicas are required" log(msg, level=ERROR) return {'exit-code': 1, 'stderr': msg} if group_name: group_namespace = request.get('group-namespace') # Add the pool to the group named "group_name" add_pool_to_group(pool=pool_name, group=group_name, namespace=group_namespace) kwargs = {} if pg_num: kwargs['pg_num'] = pg_num if weight: kwargs['percent_data'] = weight if replicas: kwargs['replicas'] = replicas if app_name: kwargs['app_name'] = app_name pool = ReplicatedPool(service=service, name=pool_name, **kwargs) if not pool_exists(service=service, name=pool_name): log("Creating pool '{}' (replicas={})".format(pool.name, replicas), level=INFO) pool.create() else: log("Pool '{}' already exists - skipping create".format(pool.name), level=DEBUG) # Set a quota if requested if quota is not None: set_pool_quota(service=service, pool_name=pool_name, max_bytes=quota)
def set_pool_max_bytes(): """ Sets the max bytes quota for a pool. Sets the pool quota maximum bytes for the pool specified by the action parameter 'name' to the value specified by the action parameter 'max' """ pool_name = action_get("name") max_bytes = action_get("max") set_pool_quota(service='ceph', pool_name=pool_name, max_bytes=max_bytes)
def handle_erasure_pool(request, service): """Create a new erasure coded pool. :param request: dict of request operations and params. :param service: The ceph client to run the command under. :returns: dict. exit-code and reason if not 0. """ pool_name = request.get('name') erasure_profile = request.get('erasure-profile') quota = request.get('max-bytes') weight = request.get('weight') group_name = request.get('group') if erasure_profile is None: erasure_profile = "default-canonical" app_name = request.get('app-name') # Check for missing params if pool_name is None: msg = "Missing parameter. name is required for the pool" log(msg, level=ERROR) return {'exit-code': 1, 'stderr': msg} if group_name: group_namespace = request.get('group-namespace') # Add the pool to the group named "group_name" add_pool_to_group(pool=pool_name, group=group_name, namespace=group_namespace) # TODO: Default to 3/2 erasure coding. I believe this requires min 5 osds if not erasure_profile_exists(service=service, name=erasure_profile): # TODO: Fail and tell them to create the profile or default msg = ("erasure-profile {} does not exist. Please create it with: " "create-erasure-profile".format(erasure_profile)) log(msg, level=ERROR) return {'exit-code': 1, 'stderr': msg} pool = ErasurePool(service=service, name=pool_name, erasure_code_profile=erasure_profile, percent_data=weight, app_name=app_name) # Ok make the erasure pool if not pool_exists(service=service, name=pool_name): log("Creating pool '{}' (erasure_profile={})" .format(pool.name, erasure_profile), level=INFO) pool.create() # Set a quota if requested if quota is not None: set_pool_quota(service=service, pool_name=pool_name, max_bytes=quota)
# # Copyright 2016 Canonical Ltd # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import sys sys.path.append('hooks') from subprocess import CalledProcessError from charmhelpers.core.hookenv import action_get, log, action_fail from charmhelpers.contrib.storage.linux.ceph import set_pool_quota if __name__ == '__main__': max_bytes = action_get("max") name = action_get("pool-name") try: set_pool_quota(service='admin', pool_name=name, max_bytes=max_bytes) except CalledProcessError as e: log(e) action_fail("Set pool quota failed with message: {}".format(e.message))
def set_pool_max_bytes(): pool_name = action_get("pool-name") max_bytes = action_get("max") set_pool_quota(service='ceph', pool_name=pool_name, max_bytes=max_bytes)