ranger/orm/services/resource_distributor/rds/services/yaml_customer_builder.py

189 lines
7.3 KiB
Python
Executable File

"""yaml build build yaml from json input."""
import logging
import re
import yaml
from pecan import conf
logger = logging.getLogger(__name__)
def get_users_quotas(data, region):
"""get users and quotas from region
:param data:
:param region:
:return:
"""
users = region['users'] if region['users'] else data['default_region']['users']
quotas = region['quotas'] if region['quotas'] else data['default_region']['quotas']
return users, quotas
def create_final_yaml(title, description, resources, outputs):
"""put all yaml strings together.
:param title: ther version of yaml
:param description: file description
:param resources: body of the yaml file
:param outputs: the output of the yaml
:return: the full string of yaml file
"""
title_yaml = re.sub("'", "", yaml.dump(title, default_flow_style=False))
description_yaml = yaml.dump(description, default_flow_style=False)
resourcesyaml = re.sub("''", '', yaml.dump(resources,
default_flow_style=False))
resources_yaml = re.sub("'", '', resourcesyaml)
yamldata = title_yaml
yamldata = yamldata + "\n" + description_yaml
yamldata = yamldata + "\n" + resources_yaml
yamldata = yamldata + "\n" + yaml.dump(outputs)
return yamldata
def _metadata_to_tags(metadata):
return '[' + ','.join(
str(k) + '=' + str(v) for i in metadata for k, v in i.iteritems()) + ']'
def yamlbuilder(alldata, region):
logger.info("building customer yaml")
logger.debug("start building flavor yaml for region %s" % region['name'])
"""build cstomer yaml.
build yaml file from json
:param alldata: full json data
:param region: data per region
:return: the full string of yaml file
"""
outputs = {}
resources = {}
yaml_version = conf.yaml_configs.customer_yaml.yaml_version
yaml_type = conf.yaml_configs.customer_yaml.yaml_options.type
domain = conf.yaml_configs.customer_yaml.customer_domain
title = {'heat_template_version': yaml_version}
description = {'description': 'yaml file for region - %s' % region['name']}
jsondata = alldata
project_name = jsondata['name']
# enclose project_description in double quotes to prevent yaml parsing issues
# when special characters are encountered
project_description = '"%s"' % (jsondata['description'])
# TODO(amar): remove these lines when using objects instead of string json
status = {"0": False, "1": True}[str(jsondata['enabled'])]
outputs['outputs'] = {}
resources['resources'] = {}
resources['resources']["%s" % alldata['uuid']] =\
{'type': 'OS::Keystone::Project\n',
'properties': {'name': "%s" % project_name,
'project_id': alldata['uuid'],
'description': project_description,
'domain': domain,
'tags': _metadata_to_tags(alldata['metadata']),
'enabled': status}}
# create the output
outputs['outputs']["%s_id" % alldata['uuid']] =\
{"value": {"get_resource": "%s" % alldata['uuid']}}
users, quotas = get_users_quotas(alldata, region)
for user in users:
user_roles = []
any_role = []
for role in user['roles']:
role_format = "%s"
user_roles.append(
{"role": role_format % role,
'project': "{'get_resource': '%s'}" % alldata['uuid']}
)
# create the output for roles
# outputs['outputs']["%s_id" % role] =\
# {"value": {"get_resource": "%s" % role}}
# no support for group when type is ldap
if yaml_type != 'ldap':
# create one group for user
# not real group its only from heat to be able to delete the user
any_role = [
{'project': "{'get_resource': '%s'}" % alldata['uuid'],
'role': "{'get_resource': '%s'}" % role}
]
group_name = "%s_%s_group" % (alldata['uuid'], user['id'])
resources['resources'][group_name] = \
{'type': 'OS::Keystone::Group\n',
'properties': {'name': "%s" % group_name,
'domain': domain,
'description': 'dummy',
'roles': any_role}}
# remove group section when type is ldap
# create users :: added the hard coded groupe
user_group = ["{'get_resource': '%s'}" % group_name]
resources['resources'][user['id']] = \
{'type': 'OS::Keystone::User\n',
'properties': {'name': user['id'],
'groups': user_group,
'roles': user_roles}}
else:
resources['resources'][user['id']] = \
{'type': 'OS::Keystone::UserRoleAssignment\n',
'properties': {'user': user['id'],
'roles': user_roles}}
# create the output for users
outputs['outputs']["%s_id" % user['id']] = \
{"value": {"get_resource": user['id']}}
options = {"compute": ["nova_quota", "OS::Nova::Quota\n"],
"network": ["neutron_quota", "OS::Neutron::Quota\n"],
"storage": ["cinder_quota", "OS::Cinder::Quota\n"]}
adjust_resource = CMSAdjustResource()
adjust_resource.fix_quota_resource_item(alldata['uuid'], quotas, resources, options)
# putting all parts together for full yaml
yamldata = create_final_yaml(title, description, resources, outputs)
logger.debug(
"done building customer yaml for region %s " % region['name'])
return yamldata
class CMSAdjustResource():
def __init__(self):
self.adjust_quota_parameters = CMSAdjustQuotaResource().adjust_quota_parameters
def fix_quota_resource_item(self, uuid, quotas, resources, options):
if conf.yaml_configs.customer_yaml.yaml_options.quotas:
quotas_keys = dict(conf.yaml_configs.customer_yaml.yaml_keys.quotas_keys)
for items in quotas:
for item in items:
# rename quota keys as needed
for quota_item in items[item].keys()[:]:
if quota_item in quotas_keys:
items[item][quotas_keys[quota_item]] = items[item][quota_item]
new_quota_item_key = quotas_keys[quota_item]
del items[item][quota_item]
quota_item = new_quota_item_key
self.adjust_quota_parameters(quota_item, items[item])
# adding project to each quota
items[item]['project'] = \
"{'get_resource': %s}" % uuid
resources['resources'][options[item][0]] = \
{"type": options[item][1], "properties": items[item]}
class CMSAdjustQuotaResource():
def __init__(self):
self.unsupported_quotas = conf.yaml_configs.customer_yaml.cms_quota.resource_quotas.quota_unsupported_params
def adjust_quota_parameters(self, key, item):
if key in self.unsupported_quotas:
del item[key]
logger.warning("Region does not support Quota Parameter {}."
" removed from resource".format(key))