)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":39270,"name":"Shogo Yoshioka","display_name":"Shogo Yoshioka","email":"sh-yoshioka@kddi.com","username":"sh-yoshioka"},"change_message_id":"6b2c56b3cf5b20e2ef9b29551c7d316d3532b467","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"e9eceaba_2d5118fc","updated":"2026-08-21 14:28:44.000000000","message":"Hi Gregory,\n\nI\u0027m so sorry for bothering you, but I just wanted to you review this issue.\nWhen you have a chance, could you please take a look and share your feedback?\nIt would be really helpful for me to move forward with the next steps.\n\nI’d really appreciate it if you could let me know when you think you might be able to review it.\n\nThanks so much!\n\nBest,\nShogo Yoshioka","commit_id":"0691d2c5d32c131016099c029c13b171720b1f60"},{"author":{"_account_id":25613,"name":"Keigo Noha","email":"knoha@redhat.com","username":"knoha"},"change_message_id":"0cbf624f46ebf34bd4a73a2d5edaba1b1a1bec17","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"085a9738_ed9bd1c7","updated":"2026-09-17 01:12:36.000000000","message":"@gthiemon@redhat.com Would you please review the new patch?","commit_id":"848f8c49fa02b5473a4da047d65f5ce4101e7ff8"}],"octavia/api/drivers/amphora_driver/v2/driver.py":[{"author":{"_account_id":37604,"name":"Richard Bachmann","display_name":"rbachman","email":"richard.bachmann@cern.ch","username":"rbachman","status":"Does cloud operations and network stuff at CERN."},"change_message_id":"7c4ed0fb9b0cf29cf9b43a77c59a9216d4d5ffbf","unresolved":true,"context_lines":[{"line_number":497,"context_line":"                operator_fault_string\u003d\u0027Failed to validate the flavor metadata \u0027"},{"line_number":498,"context_line":"                                      \u0027due to: {}\u0027.format(str(e)))"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"        # When flvor profile is referenced by a flavor,"},{"line_number":501,"context_line":"        # allow update request only compute_flavor update."},{"line_number":502,"context_line":"        if allow_amphora_update and previous_flavor is not None:"},{"line_number":503,"context_line":"            diff_keys \u003d {"},{"line_number":504,"context_line":"                key for key in set(flavor_dict) | set(previous_flavor)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7b214597_31172798","line":501,"range":{"start_line":500,"start_character":1,"end_line":501,"end_character":58},"updated":"2026-08-24 15:34:29.000000000","message":"```suggestion\n        # When a flavor profile is referenced by a flavor,\n        # allow update request only for compute_flavor updates.\n```","commit_id":"0691d2c5d32c131016099c029c13b171720b1f60"},{"author":{"_account_id":39270,"name":"Shogo Yoshioka","display_name":"Shogo Yoshioka","email":"sh-yoshioka@kddi.com","username":"sh-yoshioka"},"change_message_id":"c2bf35b8ee9ed06fca3f17c6044692d8388337fd","unresolved":true,"context_lines":[{"line_number":497,"context_line":"                operator_fault_string\u003d\u0027Failed to validate the flavor metadata \u0027"},{"line_number":498,"context_line":"                                      \u0027due to: {}\u0027.format(str(e)))"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"        # When flvor profile is referenced by a flavor,"},{"line_number":501,"context_line":"        # allow update request only compute_flavor update."},{"line_number":502,"context_line":"        if allow_amphora_update and previous_flavor is not None:"},{"line_number":503,"context_line":"            diff_keys \u003d {"},{"line_number":504,"context_line":"                key for key in set(flavor_dict) | set(previous_flavor)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1899ac77_6873e0fe","line":501,"range":{"start_line":500,"start_character":1,"end_line":501,"end_character":58},"in_reply_to":"7b214597_31172798","updated":"2026-08-24 22:20:02.000000000","message":"Thank you for reviewing the comments in the source code.\nI\u0027ve made the changes and update commit.","commit_id":"0691d2c5d32c131016099c029c13b171720b1f60"},{"author":{"_account_id":39115,"name":"Vinicius Marques Rodrigues","email":"vinicius.marques.rodrigues@cern.ch","username":"viniciusr"},"change_message_id":"9197cec0e582e89c794347c75adba42fdf13a9b3","unresolved":true,"context_lines":[{"line_number":475,"context_line":"        allow_amphora_update \u003d False"},{"line_number":476,"context_line":"        previous_flavor \u003d None"},{"line_number":477,"context_line":"        if isinstance(flavor_dict, dict):"},{"line_number":478,"context_line":"            meta \u003d flavor_dict.pop(consts.FLAVOR_META_INFO, None)"},{"line_number":479,"context_line":"            if isinstance(meta, dict):"},{"line_number":480,"context_line":"                allow_amphora_update \u003d meta.get("},{"line_number":481,"context_line":"                    consts.FLAVOR_META_ALLOW_AMPHORA_UPDATE, False)"}],"source_content_type":"text/x-python","patch_set":8,"id":"88bd08fa_e69b810f","line":478,"range":{"start_line":478,"start_character":0,"end_line":478,"end_character":2},"updated":"2026-08-25 14:16:49.000000000","message":"Because this pops `_octavia_flavor_meta` before `validate()`, the key never faces the schema — a POST with `_octavia_flavor_meta` inside `flavor_data` gets stored (201 here, 501 on master). Once stored it comes back as `previous_flavor` while being popped from the incoming dict, so it always lands in the diff and in-use `compute_flavor` updates are refused — resubmitting the key doesn\u0027t help either, it gets popped too.\n\nAdmin-only and unlikely in practice, not blocking on its own. But I couldn\u0027t find a clean fix inside this shape: validating before the pop breaks the update path, and adding the key to the schema legitimizes it on create. Which comes back to Gregory\u0027s earlier point that this belongs in the provider. One way to get there: a `get_updatable_flavor_metadata()` (same family as `get_supported_flavor_metadata()`) where the driver declares the updatable keys and the controller does the diff — `validate_flavor`\u0027s signature stays as-is, and a base `NotImplementedError` keeps existing drivers on today\u0027s behaviour. That\u0027s a bit different from extending `validate_flavor` directly, so curious what you and Gregory think.","commit_id":"848f8c49fa02b5473a4da047d65f5ce4101e7ff8"},{"author":{"_account_id":39270,"name":"Shogo Yoshioka","display_name":"Shogo Yoshioka","email":"sh-yoshioka@kddi.com","username":"sh-yoshioka"},"change_message_id":"5b2f8d9a1302fafa5a812b535a6968661db3056a","unresolved":true,"context_lines":[{"line_number":475,"context_line":"        allow_amphora_update \u003d False"},{"line_number":476,"context_line":"        previous_flavor \u003d None"},{"line_number":477,"context_line":"        if isinstance(flavor_dict, dict):"},{"line_number":478,"context_line":"            meta \u003d flavor_dict.pop(consts.FLAVOR_META_INFO, None)"},{"line_number":479,"context_line":"            if isinstance(meta, dict):"},{"line_number":480,"context_line":"                allow_amphora_update \u003d meta.get("},{"line_number":481,"context_line":"                    consts.FLAVOR_META_ALLOW_AMPHORA_UPDATE, False)"}],"source_content_type":"text/x-python","patch_set":8,"id":"e0115a7b_3ae062d5","line":478,"range":{"start_line":478,"start_character":0,"end_line":478,"end_character":2},"in_reply_to":"88bd08fa_e69b810f","updated":"2026-08-26 08:23:56.000000000","message":"Thank you for your review, Vinicius!\nAnd, as you mentioned in your comment. In the current implementation, if an administrator sends update data that includes _octavia_flavor_meta inside flavor_data, that data remains in flavor profiles\u0027s `flavor_data`.\nI hadn\u0027t noticed that. Thank you.\n\nEvery time `put()` is called, Octavia invokes the `validate_flavor` function within the drivers of all providers.\nSince this `validate_flavor` function is common to all providers (including third-party ones) and because any changes would affect providers other than Amphora, I do not think it would be advisable to change the signature of the function.\nSo I tried to handle the updateability of `flavor_data` on the driver side, so I wrote some code that uses _octavia_flavor_meta.\n\nYour suggestion to use `get_updatable_flavor_metadata()` is very interesting!\nI think we’ll probably need to check in `flavor_profiles.py` whether that `flavor_data` is updatable or not, but if that\u0027s possible to implement, it might work.\nLike you, I’d also like to hear Gregory’s opinion.","commit_id":"848f8c49fa02b5473a4da047d65f5ce4101e7ff8"}],"octavia/api/v2/controllers/flavor_profiles.py":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"cc3486405599ff91946ad3aeb2735ddb88f264b4","unresolved":true,"context_lines":[{"line_number":139,"context_line":"            raise exceptions.InvalidOption(value\u003dNone,"},{"line_number":140,"context_line":"                                           option\u003dconstants.FLAVOR_DATA)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        # If Octavia flavor is already referencing the Octavia flavor profile,"},{"line_number":143,"context_line":"        # only allow to change `compute_flavor`; don\u0027t allow"},{"line_number":144,"context_line":"        # provider_name change and other flavor_data entries changes."},{"line_number":145,"context_line":"        flavor_count \u003d self.repositories.flavor.count(context.session,"},{"line_number":146,"context_line":"                                                      flavor_profile_id\u003did)"},{"line_number":147,"context_line":"        if not isinstance(flavorprofile.provider_name, wtypes.UnsetType):"},{"line_number":148,"context_line":"            if flavor_count \u003e 0:"},{"line_number":149,"context_line":"                raise exceptions.ObjectInUse(object\u003d\u0027Flavor profile\u0027, id\u003did)"},{"line_number":150,"context_line":"        if not isinstance(flavorprofile.flavor_data, wtypes.UnsetType):"},{"line_number":151,"context_line":"            if flavor_count \u003e 0:"},{"line_number":152,"context_line":"                try:"},{"line_number":153,"context_line":"                    new_flavordata \u003d jsonutils.loads(flavorprofile.flavor_data)"},{"line_number":154,"context_line":"                    curr_fp \u003d self._get_db_flavor_profile(context.session, id)"},{"line_number":155,"context_line":"                    curr_flavordata \u003d jsonutils.loads(curr_fp.flavor_data)"},{"line_number":156,"context_line":"                except Exception as e:"},{"line_number":157,"context_line":"                    raise exceptions.InvalidOption("},{"line_number":158,"context_line":"                        value\u003dflavorprofile.flavor_data,"},{"line_number":159,"context_line":"                        option\u003dconstants.FLAVOR_DATA) from e"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"                diff_keys \u003d {"},{"line_number":162,"context_line":"                    key for key in set(new_flavordata) | set(curr_flavordata)"},{"line_number":163,"context_line":"                    if new_flavordata.get(key) !\u003d curr_flavordata.get(key)"},{"line_number":164,"context_line":"                }"},{"line_number":165,"context_line":"                is_otherchange_compute_flavor \u003d ("},{"line_number":166,"context_line":"                    diff_keys - {constants.COMPUTE_FLAVOR})"},{"line_number":167,"context_line":"                if is_otherchange_compute_flavor:"},{"line_number":168,"context_line":"                    raise exceptions.FlavorProfileUpdateContentsError()"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    @wsme_pecan.wsexpose(profile_types.FlavorProfileRootResponse,"},{"line_number":171,"context_line":"                         wtypes.text, status_code\u003d200,"}],"source_content_type":"text/x-python","patch_set":3,"id":"0856281b_a834613f","line":168,"range":{"start_line":142,"start_character":0,"end_line":168,"end_character":71},"updated":"2026-08-05 13:02:13.000000000","message":"IMHO this is too much amphora-oriented for the API,\nI think this code should be handled in the validate_flavor function exposed by the providers (line 209), we can probably extend validate_flavor so it allows updates for flavor_data only for specific fields.\nWDYT?","commit_id":"295609433f31191cdf14a09e0fa748f27b099425"},{"author":{"_account_id":39270,"name":"Shogo Yoshioka","display_name":"Shogo Yoshioka","email":"sh-yoshioka@kddi.com","username":"sh-yoshioka"},"change_message_id":"4fd26628ccab55d97bc7894ce886c8d095412a58","unresolved":true,"context_lines":[{"line_number":139,"context_line":"            raise exceptions.InvalidOption(value\u003dNone,"},{"line_number":140,"context_line":"                                           option\u003dconstants.FLAVOR_DATA)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        # If Octavia flavor is already referencing the Octavia flavor profile,"},{"line_number":143,"context_line":"        # only allow to change `compute_flavor`; don\u0027t allow"},{"line_number":144,"context_line":"        # provider_name change and other flavor_data entries changes."},{"line_number":145,"context_line":"        flavor_count \u003d self.repositories.flavor.count(context.session,"},{"line_number":146,"context_line":"                                                      flavor_profile_id\u003did)"},{"line_number":147,"context_line":"        if not isinstance(flavorprofile.provider_name, wtypes.UnsetType):"},{"line_number":148,"context_line":"            if flavor_count \u003e 0:"},{"line_number":149,"context_line":"                raise exceptions.ObjectInUse(object\u003d\u0027Flavor profile\u0027, id\u003did)"},{"line_number":150,"context_line":"        if not isinstance(flavorprofile.flavor_data, wtypes.UnsetType):"},{"line_number":151,"context_line":"            if flavor_count \u003e 0:"},{"line_number":152,"context_line":"                try:"},{"line_number":153,"context_line":"                    new_flavordata \u003d jsonutils.loads(flavorprofile.flavor_data)"},{"line_number":154,"context_line":"                    curr_fp \u003d self._get_db_flavor_profile(context.session, id)"},{"line_number":155,"context_line":"                    curr_flavordata \u003d jsonutils.loads(curr_fp.flavor_data)"},{"line_number":156,"context_line":"                except Exception as e:"},{"line_number":157,"context_line":"                    raise exceptions.InvalidOption("},{"line_number":158,"context_line":"                        value\u003dflavorprofile.flavor_data,"},{"line_number":159,"context_line":"                        option\u003dconstants.FLAVOR_DATA) from e"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"                diff_keys \u003d {"},{"line_number":162,"context_line":"                    key for key in set(new_flavordata) | set(curr_flavordata)"},{"line_number":163,"context_line":"                    if new_flavordata.get(key) !\u003d curr_flavordata.get(key)"},{"line_number":164,"context_line":"                }"},{"line_number":165,"context_line":"                is_otherchange_compute_flavor \u003d ("},{"line_number":166,"context_line":"                    diff_keys - {constants.COMPUTE_FLAVOR})"},{"line_number":167,"context_line":"                if is_otherchange_compute_flavor:"},{"line_number":168,"context_line":"                    raise exceptions.FlavorProfileUpdateContentsError()"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    @wsme_pecan.wsexpose(profile_types.FlavorProfileRootResponse,"},{"line_number":171,"context_line":"                         wtypes.text, status_code\u003d200,"}],"source_content_type":"text/x-python","patch_set":3,"id":"fee61316_7303fe9c","line":168,"range":{"start_line":142,"start_character":0,"end_line":168,"end_character":71},"in_reply_to":"0856281b_a834613f","updated":"2026-08-05 15:55:04.000000000","message":"Thank you for checking this so quickly!!\n\nWhat I’d like to implement here is allowed to update the `compute_flavor` of the Octavia flavor profile referenced by any Octavia flavor.\n\n1. Therefore, I believe we need to add a conditional branch to the `_validate_update_fp()` function: \nif the Octavia flavor profile referenced by any Octavia flavor, the update request should be rejected without exception, but if the change involves only `compute_flavor`, the process should be allowed to continue.\n2. After that, would it be best to have each provider’s `validate_flavor()` method determine whether it can process or update `flavor_data.compute_flavor`?\n\nIs my understanding correct?","commit_id":"295609433f31191cdf14a09e0fa748f27b099425"},{"author":{"_account_id":39270,"name":"Shogo Yoshioka","display_name":"Shogo Yoshioka","email":"sh-yoshioka@kddi.com","username":"sh-yoshioka"},"change_message_id":"d1c9102e2b5b2a2faf956471b2e254b8a685c50b","unresolved":true,"context_lines":[{"line_number":139,"context_line":"            raise exceptions.InvalidOption(value\u003dNone,"},{"line_number":140,"context_line":"                                           option\u003dconstants.FLAVOR_DATA)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        # If Octavia flavor is already referencing the Octavia flavor profile,"},{"line_number":143,"context_line":"        # only allow to change `compute_flavor`; don\u0027t allow"},{"line_number":144,"context_line":"        # provider_name change and other flavor_data entries changes."},{"line_number":145,"context_line":"        flavor_count \u003d self.repositories.flavor.count(context.session,"},{"line_number":146,"context_line":"                                                      flavor_profile_id\u003did)"},{"line_number":147,"context_line":"        if not isinstance(flavorprofile.provider_name, wtypes.UnsetType):"},{"line_number":148,"context_line":"            if flavor_count \u003e 0:"},{"line_number":149,"context_line":"                raise exceptions.ObjectInUse(object\u003d\u0027Flavor profile\u0027, id\u003did)"},{"line_number":150,"context_line":"        if not isinstance(flavorprofile.flavor_data, wtypes.UnsetType):"},{"line_number":151,"context_line":"            if flavor_count \u003e 0:"},{"line_number":152,"context_line":"                try:"},{"line_number":153,"context_line":"                    new_flavordata \u003d jsonutils.loads(flavorprofile.flavor_data)"},{"line_number":154,"context_line":"                    curr_fp \u003d self._get_db_flavor_profile(context.session, id)"},{"line_number":155,"context_line":"                    curr_flavordata \u003d jsonutils.loads(curr_fp.flavor_data)"},{"line_number":156,"context_line":"                except Exception as e:"},{"line_number":157,"context_line":"                    raise exceptions.InvalidOption("},{"line_number":158,"context_line":"                        value\u003dflavorprofile.flavor_data,"},{"line_number":159,"context_line":"                        option\u003dconstants.FLAVOR_DATA) from e"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"                diff_keys \u003d {"},{"line_number":162,"context_line":"                    key for key in set(new_flavordata) | set(curr_flavordata)"},{"line_number":163,"context_line":"                    if new_flavordata.get(key) !\u003d curr_flavordata.get(key)"},{"line_number":164,"context_line":"                }"},{"line_number":165,"context_line":"                is_otherchange_compute_flavor \u003d ("},{"line_number":166,"context_line":"                    diff_keys - {constants.COMPUTE_FLAVOR})"},{"line_number":167,"context_line":"                if is_otherchange_compute_flavor:"},{"line_number":168,"context_line":"                    raise exceptions.FlavorProfileUpdateContentsError()"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    @wsme_pecan.wsexpose(profile_types.FlavorProfileRootResponse,"},{"line_number":171,"context_line":"                         wtypes.text, status_code\u003d200,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9d45b308_a51b47fc","line":168,"range":{"start_line":142,"start_character":0,"end_line":168,"end_character":71},"in_reply_to":"2f108b8a_4cff2282","updated":"2026-08-12 14:44:41.000000000","message":"I tried modifying the code so that the amphora driver\u0027s validate_flavor function determines whether allow update compute_flavor.\n\nEvery time `put()` is called, Octavia calls validate_flavor function in the drivers for all providers.\nCurrently, validate_flavor function in Amphora driver did not appear to provide a way to compare the new `flavor_data` with the existing one.\n\nSince I didn’t want to change the signature of validate_flavor function (as it is common to all providers, including third-party ones), I instead arranged for the current `flavor_data` to be passed through internal metadata.\n\nFor providers other than Amphora, `_validate_update_fp()` continues to apply the traditional rule: if a flavor already references this profile, the update is rejected.\nOnly when the provider is Amphora do we attach metadata (flags + previous `flavor_data`). `AmphoraProviderDriver.validate_flavor()` reads that metadata, determines whether the update is limited to `compute_flavor`, and then allows the update.","commit_id":"295609433f31191cdf14a09e0fa748f27b099425"},{"author":{"_account_id":39270,"name":"Shogo Yoshioka","display_name":"Shogo Yoshioka","email":"sh-yoshioka@kddi.com","username":"sh-yoshioka"},"change_message_id":"3f9329200fd5828dec964b9324a5e4262d3b50a3","unresolved":true,"context_lines":[{"line_number":139,"context_line":"            raise exceptions.InvalidOption(value\u003dNone,"},{"line_number":140,"context_line":"                                           option\u003dconstants.FLAVOR_DATA)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        # If Octavia flavor is already referencing the Octavia flavor profile,"},{"line_number":143,"context_line":"        # only allow to change `compute_flavor`; don\u0027t allow"},{"line_number":144,"context_line":"        # provider_name change and other flavor_data entries changes."},{"line_number":145,"context_line":"        flavor_count \u003d self.repositories.flavor.count(context.session,"},{"line_number":146,"context_line":"                                                      flavor_profile_id\u003did)"},{"line_number":147,"context_line":"        if not isinstance(flavorprofile.provider_name, wtypes.UnsetType):"},{"line_number":148,"context_line":"            if flavor_count \u003e 0:"},{"line_number":149,"context_line":"                raise exceptions.ObjectInUse(object\u003d\u0027Flavor profile\u0027, id\u003did)"},{"line_number":150,"context_line":"        if not isinstance(flavorprofile.flavor_data, wtypes.UnsetType):"},{"line_number":151,"context_line":"            if flavor_count \u003e 0:"},{"line_number":152,"context_line":"                try:"},{"line_number":153,"context_line":"                    new_flavordata \u003d jsonutils.loads(flavorprofile.flavor_data)"},{"line_number":154,"context_line":"                    curr_fp \u003d self._get_db_flavor_profile(context.session, id)"},{"line_number":155,"context_line":"                    curr_flavordata \u003d jsonutils.loads(curr_fp.flavor_data)"},{"line_number":156,"context_line":"                except Exception as e:"},{"line_number":157,"context_line":"                    raise exceptions.InvalidOption("},{"line_number":158,"context_line":"                        value\u003dflavorprofile.flavor_data,"},{"line_number":159,"context_line":"                        option\u003dconstants.FLAVOR_DATA) from e"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"                diff_keys \u003d {"},{"line_number":162,"context_line":"                    key for key in set(new_flavordata) | set(curr_flavordata)"},{"line_number":163,"context_line":"                    if new_flavordata.get(key) !\u003d curr_flavordata.get(key)"},{"line_number":164,"context_line":"                }"},{"line_number":165,"context_line":"                is_otherchange_compute_flavor \u003d ("},{"line_number":166,"context_line":"                    diff_keys - {constants.COMPUTE_FLAVOR})"},{"line_number":167,"context_line":"                if is_otherchange_compute_flavor:"},{"line_number":168,"context_line":"                    raise exceptions.FlavorProfileUpdateContentsError()"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    @wsme_pecan.wsexpose(profile_types.FlavorProfileRootResponse,"},{"line_number":171,"context_line":"                         wtypes.text, status_code\u003d200,"}],"source_content_type":"text/x-python","patch_set":3,"id":"2f108b8a_4cff2282","line":168,"range":{"start_line":142,"start_character":0,"end_line":168,"end_character":71},"in_reply_to":"fee61316_7303fe9c","updated":"2026-08-05 16:51:55.000000000","message":"To begin with, is it the case that `compute_flavor` isn\u0027t used by providers other than Amphora?","commit_id":"295609433f31191cdf14a09e0fa748f27b099425"},{"author":{"_account_id":37604,"name":"Richard Bachmann","display_name":"rbachman","email":"richard.bachmann@cern.ch","username":"rbachman","status":"Does cloud operations and network stuff at CERN."},"change_message_id":"7c4ed0fb9b0cf29cf9b43a77c59a9216d4d5ffbf","unresolved":true,"context_lines":[{"line_number":144,"context_line":"        # provider_name change and other flavor_data entries changes."},{"line_number":145,"context_line":"        flavor_count \u003d self.repositories.flavor.count(context.session,"},{"line_number":146,"context_line":"                                                      flavor_profile_id\u003did)"},{"line_number":147,"context_line":"        if not isinstance(flavorprofile.provider_name, wtypes.UnsetType):"},{"line_number":148,"context_line":"            if flavor_count \u003e 0:"},{"line_number":149,"context_line":"                raise exceptions.ObjectInUse(object\u003d\u0027Flavor profile\u0027, id\u003did)"},{"line_number":150,"context_line":"        if not isinstance(flavorprofile.flavor_data, wtypes.UnsetType):"},{"line_number":151,"context_line":"            if flavor_count \u003e 0:"},{"line_number":152,"context_line":"                curr_fp \u003d self._get_db_flavor_profile(context.session, id)"},{"line_number":153,"context_line":"                curr_provider \u003d curr_fp.provider_name"},{"line_number":154,"context_line":"                if curr_provider not in constants.AMPHORA_PROVIDER_ALIASES:"}],"source_content_type":"text/x-python","patch_set":7,"id":"b4dc67fd_b6bc40cf","line":151,"range":{"start_line":147,"start_character":0,"end_line":151,"end_character":32},"updated":"2026-08-24 15:34:29.000000000","message":"```suggestion\n\n        if flavor_count \u003e 0:\n            if not isinstance(flavorprofile.provider_name, wtypes.UnsetType):\n                raise exceptions.ObjectInUse(object\u003d\u0027Flavor profile\u0027, id\u003did)\n            if not isinstance(flavorprofile.flavor_data, wtypes.UnsetType):\n\n```\nOne line saved?","commit_id":"0691d2c5d32c131016099c029c13b171720b1f60"},{"author":{"_account_id":39270,"name":"Shogo Yoshioka","display_name":"Shogo Yoshioka","email":"sh-yoshioka@kddi.com","username":"sh-yoshioka"},"change_message_id":"c2bf35b8ee9ed06fca3f17c6044692d8388337fd","unresolved":true,"context_lines":[{"line_number":144,"context_line":"        # provider_name change and other flavor_data entries changes."},{"line_number":145,"context_line":"        flavor_count \u003d self.repositories.flavor.count(context.session,"},{"line_number":146,"context_line":"                                                      flavor_profile_id\u003did)"},{"line_number":147,"context_line":"        if not isinstance(flavorprofile.provider_name, wtypes.UnsetType):"},{"line_number":148,"context_line":"            if flavor_count \u003e 0:"},{"line_number":149,"context_line":"                raise exceptions.ObjectInUse(object\u003d\u0027Flavor profile\u0027, id\u003did)"},{"line_number":150,"context_line":"        if not isinstance(flavorprofile.flavor_data, wtypes.UnsetType):"},{"line_number":151,"context_line":"            if flavor_count \u003e 0:"},{"line_number":152,"context_line":"                curr_fp \u003d self._get_db_flavor_profile(context.session, id)"},{"line_number":153,"context_line":"                curr_provider \u003d curr_fp.provider_name"},{"line_number":154,"context_line":"                if curr_provider not in constants.AMPHORA_PROVIDER_ALIASES:"}],"source_content_type":"text/x-python","patch_set":7,"id":"0e55e15a_13547f9a","line":151,"range":{"start_line":147,"start_character":0,"end_line":151,"end_character":32},"in_reply_to":"b4dc67fd_b6bc40cf","updated":"2026-08-24 22:20:02.000000000","message":"Thank you for your review!\nAs you pointed out, changing the order of operations saves one line.\nI’ve made the change and updated the commit.","commit_id":"0691d2c5d32c131016099c029c13b171720b1f60"}]}
