diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_record.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_record.py index f29686eb..6ed03cb6 100755 --- a/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_record.py +++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_record.py @@ -77,14 +77,19 @@ class CustomerRecord: return None def get_customers_status_by_uuids(self, uuid_str): - results = self.session.connection().execute("SELECT resource_id, status from rds_resource_status_view" - " WHERE resource_id in ({})".format(uuid_str)) - resource_status_dict = {} + results = self.session.connection().execute("SELECT id, resource_id, region, status" + " FROM rds_resource_status_view WHERE resource_id IN ({})".format(uuid_str)) + cust_region_dict = {} if results: - resource_status_dict = dict((resource_id, status) for resource_id, status in results) - + resource_status_dict = dict((id, (resource_id, region, status)) for id, resource_id, region, status in results) + # using resource_status_dict, create cust_region_dict with resource_id as key and (region, status) as value + for v in resource_status_dict.values(): + if v[0] in cust_region_dict: + cust_region_dict[v[0]].append(v[1:]) + else: + cust_region_dict[v[0]] = [v[1:]] results.close() - return resource_status_dict + return cust_region_dict def delete_customer_by_uuid(self, uuid): try: diff --git a/orm/services/customer_manager/cms_rest/logic/customer_logic.py b/orm/services/customer_manager/cms_rest/logic/customer_logic.py index 01997375..43ccfb98 100755 --- a/orm/services/customer_manager/cms_rest/logic/customer_logic.py +++ b/orm/services/customer_manager/cms_rest/logic/customer_logic.py @@ -671,8 +671,27 @@ class CustomerLogic(object): for sql_customer in sql_customers: customer = CustomerSummary.from_db_model(sql_customer) if sql_customer.uuid: - status = resource_status_dict.get(sql_customer.uuid) - customer.status = not status and 'no regions' or status + # rds_region_list contains tuples - each containing the region associated + # with the customer along with the region status + rds_region_list = resource_status_dict.get(sql_customer.uuid) + + if rds_region_list and customer.regions: + # set customer.status to 'error' if any of the regions has an 'Error' status' + # else, if any region status shows 'Submitted' then set customer status to 'Pending' + # otherwise customer status is 'Success' + error_status = [item for item in rds_region_list if item[1] == 'Error'] + submitted_status = [item for item in rds_region_list if item[1] == 'Submitted'] + success_status = [item for item in rds_region_list if item[1] == 'Success'] + + if len(error_status) > 0: + customer.status = 'Error' + elif len(submitted_status) > 0: + customer.status = 'Pending' + elif len(success_status) > 0: + customer.status = 'Success' + else: + customer.status = 'no regions' + response.customers.append(customer) return response diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor/flavor_record.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor/flavor_record.py index 547c83f9..93a778c3 100755 --- a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor/flavor_record.py +++ b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor/flavor_record.py @@ -150,14 +150,22 @@ class FlavorRecord: raise def get_flavors_status_by_uuids(self, uuid_str): - results = self.session.connection().execute("SELECT resource_id, status from rds_resource_status_view" - " WHERE resource_id in ({})".format(uuid_str)) - resource_status_dict = {} + results = self.session.connection().execute("SELECT id, resource_id, region, status" + " FROM rds_resource_status_view WHERE resource_id IN ({})".format(uuid_str)) + + flvr_region_dict = {} + if results: - resource_status_dict = dict((resource_id, status) for resource_id, status in results) + resource_status_dict = dict((id, (resource_id, region, status)) for id, resource_id, region, status in results) + # using resource_status_dict, create flvr_region_dict with resource_id as key and (region, status) as value + for v in resource_status_dict.values(): + if v[0] in flvr_region_dict: + flvr_region_dict[v[0]].append(v[1:]) + else: + flvr_region_dict[v[0]] = [v[1:]] results.close() - return resource_status_dict + return flvr_region_dict def get_flavors_by_criteria(self, **criteria): try: diff --git a/orm/services/flavor_manager/fms_rest/logic/flavor_logic.py b/orm/services/flavor_manager/fms_rest/logic/flavor_logic.py index 35feaaa7..638d68f0 100755 --- a/orm/services/flavor_manager/fms_rest/logic/flavor_logic.py +++ b/orm/services/flavor_manager/fms_rest/logic/flavor_logic.py @@ -808,8 +808,34 @@ def get_flavor_list_by_params(visibility, region, tenant, series, vm_type, for sql_flavor in sql_flavors: flavor = Flavor.from_db_model(sql_flavor) if sql_flavor.id: - status = resource_status_dict.get(sql_flavor.id) - flavor.status = not status and 'no regions' or status + # rds_region_list contains tuples - each containing the region associated + # with the flavor along with the region status + rds_region_list = resource_status_dict.get(sql_flavor.id) + + # determine flavor overall status by checking its region statuses: + if rds_region_list and flavor.regions: + # set image.status to 'error' if any of the regions has an 'Error' status' + # else, if any region status shows 'Submitted' then set image status to 'Pending' + # otherwise image status = 'Success' + error_status = [item for item in rds_region_list if item[1] == 'Error'] + submitted_status = [item for item in rds_region_list if item[1] == 'Submitted'] + success_status = [item for item in rds_region_list if item[1] == 'Success'] + + if len(error_status) > 0: + flavor.status = 'Error' + elif len(submitted_status) > 0: + flavor.status = 'Pending' + elif len(success_status) > 0: + flavor.status = 'Success' + + # use rds_region_list to format the regions' statuses in flavor record + for rgn in flavor.regions: + for rds_row_items in rds_region_list: + if rgn.name == rds_row_items[0]: + rgn.status = rds_row_items[1] + else: + flavor.status = 'no regions' + response.flavors.append(flavor) except Exception as exp: diff --git a/orm/services/image_manager/ims/logic/image_logic.py b/orm/services/image_manager/ims/logic/image_logic.py index 9af2202a..9a56361b 100755 --- a/orm/services/image_manager/ims/logic/image_logic.py +++ b/orm/services/image_manager/ims/logic/image_logic.py @@ -511,8 +511,27 @@ def get_image_list_by_params(visibility, region, Customer): for sql_image in sql_images: image = ImageSummary.from_db_model(sql_image) if sql_image.id: - status = resource_status_dict.get(sql_image.id) - image.status = not status and 'no regions' or status + # rds_region_list contains tuples - each containing the regions associated with the image + # along with the region status + rds_region_list = resource_status_dict.get(sql_image.id) + + if rds_region_list and image.regions: + # set image.status to 'error' if any of the regions has an 'Error' status' + # else, if any region status shows 'Submitted' then set image status to 'Pending' + # otherwise image status is 'Success' + error_status = [item for item in rds_region_list if item[1] == 'Error'] + submitted_status = [item for item in rds_region_list if item[1] == 'Submitted'] + success_status = [item for item in rds_region_list if item[1] == 'Success'] + + if len(error_status) > 0: + image.status = 'Error' + elif len(submitted_status) > 0: + image.status = 'Pending' + elif len(success_status) > 0: + image.status = 'Success' + else: + image.status = 'no regions' + response.images.append(image) return response diff --git a/orm/services/image_manager/ims/persistency/sql_alchemy/image/image_record.py b/orm/services/image_manager/ims/persistency/sql_alchemy/image/image_record.py index 6d660e10..89a0759d 100755 --- a/orm/services/image_manager/ims/persistency/sql_alchemy/image/image_record.py +++ b/orm/services/image_manager/ims/persistency/sql_alchemy/image/image_record.py @@ -95,12 +95,17 @@ class ImageRecord(Record): raise def get_images_status_by_uuids(self, uuid_str): - results = self.session.connection().execute("SELECT resource_id, status from rds_resource_status_view" - " WHERE resource_id in ({})".format(uuid_str)) - resource_status_dict = {} + results = self.session.connection().execute("SELECT id, resource_id, region, status" + " FROM rds_resource_status_view WHERE resource_id IN ({})".format(uuid_str)) + img_region_dict = {} if results: - resource_status_dict = dict((resource_id, status) for resource_id, status in results) - + resource_status_dict = dict((id, (resource_id, region, status)) for id, resource_id, region, status in results) + # using resource_status_dict, create img_region_dict with resource_id as key and (region, status) as value + for v in resource_status_dict.values(): + if v[0] in img_region_dict: + img_region_dict[v[0]].append(v[1:]) + else: + img_region_dict[v[0]] = [v[1:]] results.close() return resource_status_dict