diff --git a/orm/services/image_manager/ims/controllers/v1/orm/images/regions.py b/orm/services/image_manager/ims/controllers/v1/orm/images/regions.py index 439c7853..d5ba5918 100755 --- a/orm/services/image_manager/ims/controllers/v1/orm/images/regions.py +++ b/orm/services/image_manager/ims/controllers/v1/orm/images/regions.py @@ -26,7 +26,7 @@ class RegionController(rest.RestController): status_code=405) @wsexpose(RegionWrapper, str, body=RegionWrapper, rest_content_types='json', status_code=201) - def post(self, image_id, region_wrapper): # add regions to image + def post(self, image_id, region_wrapper): image_logic, utils = di.resolver.unpack(RegionController) auth.authorize(request, "region:create") @@ -58,12 +58,10 @@ class RegionController(rest.RestController): message=str(exception)) @wsexpose(RegionWrapper, str, body=RegionWrapper, rest_content_types='json', status_code=200) - def put(self, image_id, region_wrapper): # add regions to image + def put(self, image_id, region_wrapper): image_logic, utils = di.resolver.unpack(RegionController) auth.authorize(request, "region:update") try: - if not region_wrapper.regions: - raise ErrorStatus("Bad request, invalid json provided") LOG.info("RegionController - replace regions: " + str(region_wrapper)) result = image_logic.replace_regions(image_id, region_wrapper, request.transaction_id) diff --git a/orm/services/image_manager/ims/logic/image_logic.py b/orm/services/image_manager/ims/logic/image_logic.py index 6f19b8a7..bc2c6fc0 100755 --- a/orm/services/image_manager/ims/logic/image_logic.py +++ b/orm/services/image_manager/ims/logic/image_logic.py @@ -59,14 +59,19 @@ def create_image(image_wrapper, image_uuid, transaction_id): @di.dependsOn('rds_proxy') -def send_to_rds_if_needed(sql_image, existing_region_names, http_action, - transaction_id): +def send_to_rds_if_needed(sql_image, + existing_region_names, + http_action, + transaction_id, + optimized=False): rds_proxy = di.resolver.unpack(send_to_rds_if_needed) if (sql_image.regions and len(sql_image.regions) > 0) or len( existing_region_names) > 0: image_dict = sql_image.get_proxy_dict() - update_region_actions(image_dict, existing_region_names, http_action) - if image_dict['regions'] or len(existing_region_names) > 0: + update_region_actions( + image_dict, existing_region_names, http_action, optimized) + + if image_dict['regions']: LOG.debug("Image is valid, sending to RDS Proxy ") rds_proxy.send_image(image_dict, transaction_id, http_action) else: @@ -202,11 +207,12 @@ def add_regions(image_uuid, regions, transaction_id): region_type=region.type) sql_image.add_region(db_region) - datamanager.flush() # i want to get any exception created by + # Flush to get any exception, if any, created by # previous actions against the database + datamanager.flush() send_to_rds_if_needed(sql_image, existing_region_names, "put", - transaction_id) + transaction_id, optimized=True) datamanager.commit() @@ -246,11 +252,13 @@ def replace_regions(image_uuid, regions, transaction_id): db_region = ImageRegion(region_name=region.name, region_type=region.type) sql_image.add_region(db_region) - datamanager.flush() # i want to get any exception created by + + # Flush to get any exception, if any, created by # previous actions against the database + datamanager.flush() send_to_rds_if_needed(sql_image, existing_region_names, "put", - transaction_id) + transaction_id, optimized=True) datamanager.commit() @@ -288,18 +296,19 @@ def delete_region(image_uuid, region_name, transaction_id, force_delete): existing_region_names = sql_image.get_existing_region_names() sql_image.remove_region(region_name) - # Get any exception created by previous actions against the database + # Flush to get any exception, if any, created by + # previous actions against the database datamanager.flush() send_to_rds_if_needed(sql_image, existing_region_names, "put", - transaction_id) + transaction_id, optimized=True) if force_delete: datamanager.commit() else: datamanager.rollback() except ErrorStatus as exp: - LOG.log_exception("ImageLogic - Failed to update image", exp) + LOG.log_exception("ImageLogic - Failed to delete region", exp) datamanager.rollback() raise @@ -532,17 +541,22 @@ def get_image_list_by_params(visibility, region, Customer): raise -def update_region_actions(image_dict, existing_region_names, action="put"): +def update_region_actions(image_dict, existing_region_names, action, + optimized): if action == "delete": set_regions_action(image_dict, "delete") elif action == "post": set_regions_action(image_dict, "create") else: # put + requested_regions = [] for region in image_dict["regions"]: if region["name"] in existing_region_names: region["action"] = "modify" + if not optimized: + requested_regions.append(region) else: region["action"] = "create" + requested_regions.append(region) # add deleted regions for exist_region_name in existing_region_names: @@ -550,8 +564,10 @@ def update_region_actions(image_dict, existing_region_names, action="put"): image_dict["regions"]): continue else: - image_dict["regions"].append( - {"name": exist_region_name, "action": "delete"}) + requested_regions.append({"name": exist_region_name, + "action": "delete"}) + + image_dict["regions"] = requested_regions def region_name_exist_in_regions(region_name, regions):