jh629g 9470cc0f0d Ranger fixes for python 3.6 and stein heat
Fixes number of errors so that ranger json
sent to heat matches the parameters that heat
expects for resource allocation

Change-Id: I23d77923756fb7f86e311a6fea89cc7724d63b5b
2019-11-08 14:49:13 -06:00

193 lines
7.8 KiB
Python
Executable File

"""create resource moudle."""
import logging
import time
from orm.services.resource_distributor.rds.services import region_resource_id_status as regionResourceIdStatus
from orm.services.resource_distributor.rds.services import (yaml_customer_builder, yaml_flavor_builder,
yaml_group_builder, yaml_image_builder)
from orm.services.resource_distributor.rds.services.base import ConflictValue, ErrorMessage
from orm.services.resource_distributor.rds.services.model.resource_input import ResourceData as InputData
from orm.services.resource_distributor.rds.sot import sot_factory
from orm.services.resource_distributor.rds.utils import utils, uuid_utils
from pecan import conf, request
my_logger = logging.getLogger(__name__)
def _get_inputs_from_resource_type(jsondata,
resource_type,
external_transaction_id,
operation="create"):
if resource_type == "customer" or resource_type == "group":
input_data = InputData(resource_id=jsondata['uuid'],
resource_type=resource_type,
operation=operation,
targets=jsondata['regions'],
model=jsondata,
external_transaction_id=external_transaction_id)
elif resource_type == "flavor" or resource_type == "image":
input_data = InputData(resource_id=jsondata['id'],
resource_type=resource_type,
operation=operation,
targets=jsondata['regions'],
model=jsondata,
external_transaction_id=external_transaction_id)
else:
raise ErrorMessage("no support for resource %s" % resource_type)
return input_data
def _region_valid(region):
if 'rms_status' in region and region[
'rms_status'] not in conf.allow_region_statuses:
return False
return True
def _create_or_update_resource_status(input_data, target, error_msg='',
status="Submitted"):
# check rms region status
if not _region_valid(target):
status = 'Error'
error_msg = "Not sent to ord as status equal to " + target['rms_status']
raise ErrorMessage("Not sent to ord as status equal to %s"
% target['rms_status'])
my_logger.debug("save status as %s" % status)
data_to_save = dict(
timestamp=int(time.time() * 1000),
region=target['name'],
resource_id=input_data.resource_id,
status=status,
transaction_id=input_data.transaction_id,
error_code='',
error_msg=error_msg,
resource_operation=target['action'],
resource_type=input_data.resource_type,
ord_notifier_id='')
regionResourceIdStatus.add_status(data_to_save)
my_logger.debug("status %s saved" % status)
def _set_all_statuses_to_error(input_data, message=None):
targets = input_data.targets
for target in targets:
_create_or_update_resource_status(input_data=input_data, target=target,
error_msg=message or 'system error',
status="Error")
def _create_data_to_sot(input_data):
"""create data.
: build yaml string
:param jsondata: full json in request body
:param resource_type: eg... Customer
:return: return list of dictionaries with yaml string
"""
jsondata = input_data.model
targetslist = []
targets = input_data.targets
for target in targets:
# save start status to submitted for each region
_create_or_update_resource_status(input_data, target)
if not _region_valid(target):
continue
if target['action'] == "delete":
yamldata = "delete"
elif input_data.resource_type == "customer":
yamldata = yaml_customer_builder.yamlbuilder(jsondata, target)
elif input_data.resource_type == "group":
yamldata = yaml_group_builder.yamlbuilder(jsondata, target)
elif input_data.resource_type == "flavor":
yamldata = yaml_flavor_builder.yamlbuilder(jsondata, target)
elif input_data.resource_type == "image":
yamldata = yaml_image_builder.yamlbuilder(jsondata, target)
targetslist.append({"region_id": target['name'],
"resource_type": input_data.resource_type,
"resource_name": input_data.resource_id,
"template_data": yamldata,
"operation": target['action']})
return targetslist
def _upload_to_sot(uuid, tranid, targetslist):
application_id = request.headers[
'X-RANGER-Client'] if 'X-RANGER-Client' in request.headers else \
'NA'
user_id = request.headers[
'X-RANGER-Requester'] if 'X-RANGER-Requester' in request.headers else \
''
sot = sot_factory.get_sot()
headers = {}
headers['X-Auth-Region'] = request.headers[
'X-Auth-Region'] if 'X-Auth-Region' in \
request.headers else ''
headers['X-Auth-Token'] = request.headers[
'X-Auth-Token'] if 'X-Auth-Token' in \
request.headers else ''
sot.save_resource_to_sot(uuid,
tranid,
targetslist,
application_id,
user_id,
headers)
def _check_resource_status(input_data):
resource_id = input_data.resource_id
status = conf.block_by_status
# check if any of the region creation in pending
regions_by_resource = \
regionResourceIdStatus.get_regions_by_status_resource_id(status,
resource_id)
# if any not ready return 409
if regions_by_resource is not None and regions_by_resource.regions:
raise ConflictValue([region.region for region in regions_by_resource.regions])
def update_sot(input_data):
"""create resource."""
my_logger.debug("build yaml file for %s id: %s" % (input_data.resource_type,
input_data.resource_id))
targetslist = _create_data_to_sot(input_data)
my_logger.debug("upload yaml to SoT")
_upload_to_sot(input_data.resource_id,
input_data.transaction_id,
targetslist)
def main(jsondata, external_transaction_id, resource_type, operation):
"""main function handle resource operation."""
my_logger.info("got %s for %s resource" % (operation, resource_type))
try:
input_data = _get_inputs_from_resource_type(
jsondata=jsondata,
resource_type=resource_type,
operation=operation,
external_transaction_id=external_transaction_id
)
my_logger.debug("iterate through the regions see if none in submitted")
_check_resource_status(input_data)
my_logger.debug("get uuid from uuid generator")
input_data.transaction_id = uuid_utils.get_random_uuid()
my_logger.debug("uuid ={}".format(input_data.transaction_id))
# add regions status from rms (to check if it down)
input_data.targets = utils.add_rms_status_to_regions(
input_data.targets, input_data.resource_type)
update_sot(input_data)
except ConflictValue:
raise
except ErrorMessage as exp:
my_logger.error(str(exp))
my_logger.exception(str(exp))
raise
except Exception as e:
my_logger.exception(str(e))
_set_all_statuses_to_error(input_data)
my_logger.error("deleting fails ,Error : {}".format(str(e)))
raise ErrorMessage(str(e))
return input_data.resource_id