)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"774d22fe781213ae1c4f0b4932af39f7e5a24e11","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"50d4e3e3_5661b3db","updated":"2022-01-26 14:01:28.000000000","message":"So we might need some more ways of expressing the validation rules. The current failure in https://review.opendev.org/c/openstack/neutron/+/808961 is because at the point in time when the user creates a VNIC_DIRECT port with the PORT_CAP_SWITCHDEV capability, Nova has obviously not filled in the rest of the information yet.","commit_id":"de128a4811343086448b071b0ffbff71c8cd1eae"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"3fc3d04432bd43cab2d40419497d586d10b81686","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"cd0fc550_bcbe5dd4","in_reply_to":"50d4e3e3_5661b3db","updated":"2022-01-27 09:01:53.000000000","message":"Not including the `capabilities` key in the generic binding profile validation code appears to solve the issue. The port capabilities is already receiving special treatment and handled separately, so this does make sense. New patch set on the way shortly.","commit_id":"de128a4811343086448b071b0ffbff71c8cd1eae"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"ce6708780a443a58c13f949c610042c3d2e2cd54","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"5d691e2a_c6e6c6f6","updated":"2022-01-28 17:55:23.000000000","message":"Thank you for your review, much appreciated!","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"}],"neutron/common/ovn/constants.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"730759bd7c3a5936c162754687006f6f92c06b07","unresolved":true,"context_lines":[{"line_number":67,"context_line":"# validated to be of one of the listed types."},{"line_number":68,"context_line":"OVNPortBindingProfileParamSet \u003d collections.namedtuple("},{"line_number":69,"context_line":"    \u0027OVNPortBindingProfileParamSet\u0027, [\u0027param_set\u0027, \u0027vnic_type\u0027, \u0027capability\u0027],"},{"line_number":70,"context_line":"    defaults\u003d[None, None])"},{"line_number":71,"context_line":"OVN_PORT_BINDING_PROFILE_PARAMS \u003d ["},{"line_number":72,"context_line":"    OVNPortBindingProfileParamSet({\u0027parent_name\u0027: [str],"},{"line_number":73,"context_line":"                                   \u0027tag\u0027: [int]}),"}],"source_content_type":"text/x-python","patch_set":2,"id":"099037cf_8787ef35","line":70,"updated":"2022-01-25 08:32:23.000000000","message":"this is available since Python 3.7 and we are still supporting 3.6. That\u0027s why UT job is failing on this patch","commit_id":"dd7a80ecad0a143ce6aa4659109e44d9d9bd8ff8"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"5cc34b0d954a95d9467516615b1db29cdcbbf23f","unresolved":true,"context_lines":[{"line_number":67,"context_line":"# validated to be of one of the listed types."},{"line_number":68,"context_line":"OVNPortBindingProfileParamSet \u003d collections.namedtuple("},{"line_number":69,"context_line":"    \u0027OVNPortBindingProfileParamSet\u0027, [\u0027param_set\u0027, \u0027vnic_type\u0027, \u0027capability\u0027],"},{"line_number":70,"context_line":"    defaults\u003d[None, None])"},{"line_number":71,"context_line":"OVN_PORT_BINDING_PROFILE_PARAMS \u003d ["},{"line_number":72,"context_line":"    OVNPortBindingProfileParamSet({\u0027parent_name\u0027: [str],"},{"line_number":73,"context_line":"                                   \u0027tag\u0027: [int]}),"}],"source_content_type":"text/x-python","patch_set":2,"id":"52beaf6f_bba5b24c","line":70,"in_reply_to":"099037cf_8787ef35","updated":"2022-01-25 15:45:22.000000000","message":"Ah, thank you for pointing that out. And curse those dead snakes! I\u0027ll rework.","commit_id":"dd7a80ecad0a143ce6aa4659109e44d9d9bd8ff8"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"1d850ce4dd7e114d2fa925c269ebc4345d0a9256","unresolved":false,"context_lines":[{"line_number":67,"context_line":"# validated to be of one of the listed types."},{"line_number":68,"context_line":"OVNPortBindingProfileParamSet \u003d collections.namedtuple("},{"line_number":69,"context_line":"    \u0027OVNPortBindingProfileParamSet\u0027, [\u0027param_set\u0027, \u0027vnic_type\u0027, \u0027capability\u0027],"},{"line_number":70,"context_line":"    defaults\u003d[None, None])"},{"line_number":71,"context_line":"OVN_PORT_BINDING_PROFILE_PARAMS \u003d ["},{"line_number":72,"context_line":"    OVNPortBindingProfileParamSet({\u0027parent_name\u0027: [str],"},{"line_number":73,"context_line":"                                   \u0027tag\u0027: [int]}),"}],"source_content_type":"text/x-python","patch_set":2,"id":"457f10c5_fb350c78","line":70,"in_reply_to":"52beaf6f_bba5b24c","updated":"2022-01-26 05:54:51.000000000","message":"Done","commit_id":"dd7a80ecad0a143ce6aa4659109e44d9d9bd8ff8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2a6d3e7858eeb34edc1ec065980113f5c210ebaf","unresolved":true,"context_lines":[{"line_number":48,"context_line":"METADATA_LIVENESS_CHECK_EXT_ID_KEY \u003d \u0027neutron:metadata_liveness_check_at\u0027"},{"line_number":49,"context_line":"OVN_PORT_BINDING_PROFILE \u003d portbindings.PROFILE"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"PORT_CAP_PARAM \u003d \u0027capabilities\u0027"},{"line_number":52,"context_line":"PORT_CAP_SWITCHDEV \u003d \u0027switchdev\u0027"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"# Port Binding Profile data validation"},{"line_number":55,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":6,"id":"4b758e75_4233e73f","line":52,"range":{"start_line":51,"start_character":0,"end_line":52,"end_character":32},"updated":"2022-01-28 11:24:06.000000000","message":"1) Instead of moving \"PORT_CAP_SWITCHDEV\" here, in the middle of the OVN variables, I would add \"PORT_CAP_PARAM\" after PS base PORT_CAP_SWITCHDEV position.\n\n2) Now you are creating a constant for \"capabilities\", replace all occurrences of this string in the code. There are 9.","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"ce6708780a443a58c13f949c610042c3d2e2cd54","unresolved":false,"context_lines":[{"line_number":48,"context_line":"METADATA_LIVENESS_CHECK_EXT_ID_KEY \u003d \u0027neutron:metadata_liveness_check_at\u0027"},{"line_number":49,"context_line":"OVN_PORT_BINDING_PROFILE \u003d portbindings.PROFILE"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"PORT_CAP_PARAM \u003d \u0027capabilities\u0027"},{"line_number":52,"context_line":"PORT_CAP_SWITCHDEV \u003d \u0027switchdev\u0027"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"# Port Binding Profile data validation"},{"line_number":55,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":6,"id":"cc4245db_1ff86eaa","line":52,"range":{"start_line":51,"start_character":0,"end_line":52,"end_character":32},"in_reply_to":"4b758e75_4233e73f","updated":"2022-01-28 17:55:23.000000000","message":"1)\nI see what you mean, I suspect this is an artifact of me splitting the patch up in two. In the next patch set [0] I will reference PORT_CAP_SWITCHDEV in OVN_PORT_BINDING_PROFILE_PARAMS.\n\nWould you be ok with the move in that case, or would you prefer if I move OVN_PORT_BINDING_PROFILE_PARAMS below PORT_CAP_SWITCHDEV?\n\nAlternatively we could move PORT_CAP_SWITCHDEV to neutron-lib if there is time for that.\n\nFor now I\u0027ll move them to their original location and we can decide when [0] is ready for review.\n\n0: https://review.opendev.org/c/openstack/neutron/+/808961\n\n2)\nIndeed, I forgot to do that, thank you for pointing that out!","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"c81bb51e3adbc6a1955ce278157cfa1b25215b3b","unresolved":true,"context_lines":[{"line_number":63,"context_line":"# match keys in the port binding data.  A value of \u0027None\u0027 means not to check"},{"line_number":64,"context_line":"# type for this key, when a list of type classes is provided the data will be"},{"line_number":65,"context_line":"# validated to be of one of the listed types."},{"line_number":66,"context_line":"OVNPortBindingProfileParamSet \u003d collections.namedtuple("},{"line_number":67,"context_line":"    \u0027OVNPortBindingProfileParamSet\u0027, [\u0027param_set\u0027, \u0027vnic_type\u0027, \u0027capability\u0027])"},{"line_number":68,"context_line":"OVN_PORT_BINDING_PROFILE_PARAMS \u003d ["},{"line_number":69,"context_line":"    OVNPortBindingProfileParamSet({\u0027parent_name\u0027: [str],"},{"line_number":70,"context_line":"                                   \u0027tag\u0027: [int]},"},{"line_number":71,"context_line":"                                  None, None),"},{"line_number":72,"context_line":"    OVNPortBindingProfileParamSet({\u0027vtep-physical-switch\u0027: [str],"},{"line_number":73,"context_line":"                                   \u0027vtep-logical-switch\u0027: [str]},"},{"line_number":74,"context_line":"                                  None, None),"},{"line_number":75,"context_line":"]"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"MIGRATING_ATTR \u003d \u0027migrating_to\u0027"},{"line_number":78,"context_line":"OVN_ROUTER_PORT_OPTION_KEYS \u003d [\u0027router-port\u0027, \u0027nat-addresses\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"a7db213b_55d8a01e","line":75,"range":{"start_line":66,"start_character":0,"end_line":75,"end_character":1},"updated":"2022-02-16 10:07:58.000000000","message":"Thanks for the long description (here and https://review.opendev.org/c/openstack/neutron/+/818420/11/neutron/common/ovn/utils.py#272 )","commit_id":"1f970697906e91f932d3dec7fd8e5197bf81893c"}],"neutron/common/ovn/utils.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2a6d3e7858eeb34edc1ec065980113f5c210ebaf","unresolved":true,"context_lines":[{"line_number":236,"context_line":"    param_dict \u003d {}"},{"line_number":237,"context_line":"    vnic_type \u003d port.get(portbindings.VNIC_TYPE, portbindings.VNIC_NORMAL)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    # A port\u0027s capabilities is listed as part of the binding profile, but we"},{"line_number":240,"context_line":"    # treat it separately and do not want it to be included in the generic"},{"line_number":241,"context_line":"    # validation."},{"line_number":242,"context_line":"    capabilities \u003d get_port_capabilities(port)"},{"line_number":243,"context_line":"    if not isinstance(capabilities, list):"},{"line_number":244,"context_line":"        msg \u003d _(\u0027Invalid binding:profile. %s must be of type list.\u0027"},{"line_number":245,"context_line":"                ) % constants.PORT_CAP_PARAM"}],"source_content_type":"text/x-python","patch_set":6,"id":"a746c2bb_3be588d3","line":242,"range":{"start_line":239,"start_character":3,"end_line":242,"end_character":46},"updated":"2022-01-28 11:24:06.000000000","message":"There is no need to use this helper when in L247-251 you know exactly what the structure is.\n\nI would resume this in two lines:\n  binding_profile \u003d copy.deepcopy(port[constants.OVN_PORT_BINDING_PROFILE])\n  capabilities \u003d binding_profile.pop(constants.PORT_CAP_PARAM, [])","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"ce6708780a443a58c13f949c610042c3d2e2cd54","unresolved":false,"context_lines":[{"line_number":236,"context_line":"    param_dict \u003d {}"},{"line_number":237,"context_line":"    vnic_type \u003d port.get(portbindings.VNIC_TYPE, portbindings.VNIC_NORMAL)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    # A port\u0027s capabilities is listed as part of the binding profile, but we"},{"line_number":240,"context_line":"    # treat it separately and do not want it to be included in the generic"},{"line_number":241,"context_line":"    # validation."},{"line_number":242,"context_line":"    capabilities \u003d get_port_capabilities(port)"},{"line_number":243,"context_line":"    if not isinstance(capabilities, list):"},{"line_number":244,"context_line":"        msg \u003d _(\u0027Invalid binding:profile. %s must be of type list.\u0027"},{"line_number":245,"context_line":"                ) % constants.PORT_CAP_PARAM"}],"source_content_type":"text/x-python","patch_set":6,"id":"a41a5edb_a08d421f","line":242,"range":{"start_line":239,"start_character":3,"end_line":242,"end_character":46},"in_reply_to":"a746c2bb_3be588d3","updated":"2022-01-28 17:55:23.000000000","message":"Ack","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2a6d3e7858eeb34edc1ec065980113f5c210ebaf","unresolved":true,"context_lines":[{"line_number":254,"context_line":"        if pbp_param_set.vnic_type:"},{"line_number":255,"context_line":"            if pbp_param_set.vnic_type !\u003d vnic_type:"},{"line_number":256,"context_line":"                continue"},{"line_number":257,"context_line":"            if (capabilities and pbp_param_set.capability not in capabilities):"},{"line_number":258,"context_line":"                continue"},{"line_number":259,"context_line":"        param_set \u003d pbp_param_set.param_set"},{"line_number":260,"context_line":"        param_keys \u003d param_set.keys()"}],"source_content_type":"text/x-python","patch_set":6,"id":"25865cfe_30fcdd61","line":257,"range":{"start_line":257,"start_character":16,"end_line":257,"end_character":28},"updated":"2022-01-28 11:24:06.000000000","message":"capabilities is, by default, an empty list. This check is not needed, only this:\n  if pbp_param_set.capability not in capabilities:","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2a6d3e7858eeb34edc1ec065980113f5c210ebaf","unresolved":true,"context_lines":[{"line_number":254,"context_line":"        if pbp_param_set.vnic_type:"},{"line_number":255,"context_line":"            if pbp_param_set.vnic_type !\u003d vnic_type:"},{"line_number":256,"context_line":"                continue"},{"line_number":257,"context_line":"            if (capabilities and pbp_param_set.capability not in capabilities):"},{"line_number":258,"context_line":"                continue"},{"line_number":259,"context_line":"        param_set \u003d pbp_param_set.param_set"},{"line_number":260,"context_line":"        param_keys \u003d param_set.keys()"}],"source_content_type":"text/x-python","patch_set":6,"id":"38cdb333_7e7033cd","line":257,"range":{"start_line":257,"start_character":15,"end_line":257,"end_character":16},"updated":"2022-01-28 11:24:06.000000000","message":"nit: unneeded parenthesis","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"6119320c69b06b866751bef58f5ded4dca68ebd6","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        if pbp_param_set.vnic_type:"},{"line_number":255,"context_line":"            if pbp_param_set.vnic_type !\u003d vnic_type:"},{"line_number":256,"context_line":"                continue"},{"line_number":257,"context_line":"            if (capabilities and pbp_param_set.capability not in capabilities):"},{"line_number":258,"context_line":"                continue"},{"line_number":259,"context_line":"        param_set \u003d pbp_param_set.param_set"},{"line_number":260,"context_line":"        param_keys \u003d param_set.keys()"}],"source_content_type":"text/x-python","patch_set":6,"id":"e25a4d00_fdecf21b","line":257,"range":{"start_line":257,"start_character":16,"end_line":257,"end_character":28},"in_reply_to":"095cc9d5_03226766","updated":"2022-02-08 10:40:34.000000000","message":"Marking this as resolved, please let me know if you do not agree.","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"ce6708780a443a58c13f949c610042c3d2e2cd54","unresolved":true,"context_lines":[{"line_number":254,"context_line":"        if pbp_param_set.vnic_type:"},{"line_number":255,"context_line":"            if pbp_param_set.vnic_type !\u003d vnic_type:"},{"line_number":256,"context_line":"                continue"},{"line_number":257,"context_line":"            if (capabilities and pbp_param_set.capability not in capabilities):"},{"line_number":258,"context_line":"                continue"},{"line_number":259,"context_line":"        param_set \u003d pbp_param_set.param_set"},{"line_number":260,"context_line":"        param_keys \u003d param_set.keys()"}],"source_content_type":"text/x-python","patch_set":6,"id":"095cc9d5_03226766","line":257,"range":{"start_line":257,"start_character":16,"end_line":257,"end_character":28},"in_reply_to":"25865cfe_30fcdd61","updated":"2022-01-28 17:55:23.000000000","message":"That would change the behavior of the code.  We only want to check non-presence of the capability if the binding profile has capabilities.","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"ce6708780a443a58c13f949c610042c3d2e2cd54","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        if pbp_param_set.vnic_type:"},{"line_number":255,"context_line":"            if pbp_param_set.vnic_type !\u003d vnic_type:"},{"line_number":256,"context_line":"                continue"},{"line_number":257,"context_line":"            if (capabilities and pbp_param_set.capability not in capabilities):"},{"line_number":258,"context_line":"                continue"},{"line_number":259,"context_line":"        param_set \u003d pbp_param_set.param_set"},{"line_number":260,"context_line":"        param_keys \u003d param_set.keys()"}],"source_content_type":"text/x-python","patch_set":6,"id":"ccdb74bc_390a65d2","line":257,"range":{"start_line":257,"start_character":15,"end_line":257,"end_character":16},"in_reply_to":"38cdb333_7e7033cd","updated":"2022-01-28 17:55:23.000000000","message":"Ack","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2a6d3e7858eeb34edc1ec065980113f5c210ebaf","unresolved":true,"context_lines":[{"line_number":260,"context_line":"        param_keys \u003d param_set.keys()"},{"line_number":261,"context_line":"        for param_key in param_keys:"},{"line_number":262,"context_line":"            try:"},{"line_number":263,"context_line":"                param_dict[param_key] \u003d (binding_profile[param_key])"},{"line_number":264,"context_line":"            except KeyError:"},{"line_number":265,"context_line":"                pass"},{"line_number":266,"context_line":"        if len(param_dict) \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1e95398f_6b183dd2","line":263,"range":{"start_line":263,"start_character":40,"end_line":263,"end_character":41},"updated":"2022-01-28 11:24:06.000000000","message":"unneeded parenthesis","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"ce6708780a443a58c13f949c610042c3d2e2cd54","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        param_keys \u003d param_set.keys()"},{"line_number":261,"context_line":"        for param_key in param_keys:"},{"line_number":262,"context_line":"            try:"},{"line_number":263,"context_line":"                param_dict[param_key] \u003d (binding_profile[param_key])"},{"line_number":264,"context_line":"            except KeyError:"},{"line_number":265,"context_line":"                pass"},{"line_number":266,"context_line":"        if len(param_dict) \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":6,"id":"301a8118_a7fb1262","line":263,"range":{"start_line":263,"start_character":40,"end_line":263,"end_character":41},"in_reply_to":"1e95398f_6b183dd2","updated":"2022-01-28 17:55:23.000000000","message":"Ack","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2a6d3e7858eeb34edc1ec065980113f5c210ebaf","unresolved":true,"context_lines":[{"line_number":270,"context_line":"                    \u0027required.\u0027) % param_keys"},{"line_number":271,"context_line":"            raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":272,"context_line":"        if (len(binding_profile) !\u003d len("},{"line_number":273,"context_line":"                param_keys)):"},{"line_number":274,"context_line":"            msg \u003d _(\u0027Invalid binding:profile. too many parameters\u0027)"},{"line_number":275,"context_line":"            raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":276,"context_line":"        break"}],"source_content_type":"text/x-python","patch_set":6,"id":"5256e845_62e17724","line":273,"range":{"start_line":273,"start_character":16,"end_line":273,"end_character":29},"updated":"2022-01-28 11:24:06.000000000","message":"nit: unneeded line break","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"ce6708780a443a58c13f949c610042c3d2e2cd54","unresolved":false,"context_lines":[{"line_number":270,"context_line":"                    \u0027required.\u0027) % param_keys"},{"line_number":271,"context_line":"            raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":272,"context_line":"        if (len(binding_profile) !\u003d len("},{"line_number":273,"context_line":"                param_keys)):"},{"line_number":274,"context_line":"            msg \u003d _(\u0027Invalid binding:profile. too many parameters\u0027)"},{"line_number":275,"context_line":"            raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":276,"context_line":"        break"}],"source_content_type":"text/x-python","patch_set":6,"id":"f280ec78_f437ccd7","line":273,"range":{"start_line":273,"start_character":16,"end_line":273,"end_character":29},"in_reply_to":"5256e845_62e17724","updated":"2022-01-28 17:55:23.000000000","message":"Ack","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2a6d3e7858eeb34edc1ec065980113f5c210ebaf","unresolved":true,"context_lines":[{"line_number":278,"context_line":"    if not param_dict:"},{"line_number":279,"context_line":"        return {}"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    for param_key, param_types in param_set.items():"},{"line_number":282,"context_line":"        if param_types is None:"},{"line_number":283,"context_line":"            continue"},{"line_number":284,"context_line":"        param_value \u003d param_dict[param_key]"},{"line_number":285,"context_line":"        for param_type in param_types:"},{"line_number":286,"context_line":"            if isinstance(param_value, param_type):"},{"line_number":287,"context_line":"                break"},{"line_number":288,"context_line":"        else:"},{"line_number":289,"context_line":"            msg \u003d _(\u0027Invalid binding:profile. %(key)s %(value)s \u0027"},{"line_number":290,"context_line":"                    \u0027value invalid type\u0027) % {\u0027key\u0027: param_key,"},{"line_number":291,"context_line":"                                             \u0027value\u0027: param_value}"},{"line_number":292,"context_line":"            raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    # Make sure we can successfully look up the port indicated by"},{"line_number":295,"context_line":"    # parent_name.  Just let it raise the right exception if there is a"}],"source_content_type":"text/x-python","patch_set":6,"id":"033e31ec_eefea1a0","line":292,"range":{"start_line":281,"start_character":0,"end_line":292,"end_character":1},"updated":"2022-01-28 11:24:06.000000000","message":"Please, provide an example here, in a comment, of what the input \"param_set\" should be. It is a bit difficult to follow what are we doing here and why.","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"ce6708780a443a58c13f949c610042c3d2e2cd54","unresolved":false,"context_lines":[{"line_number":278,"context_line":"    if not param_dict:"},{"line_number":279,"context_line":"        return {}"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    for param_key, param_types in param_set.items():"},{"line_number":282,"context_line":"        if param_types is None:"},{"line_number":283,"context_line":"            continue"},{"line_number":284,"context_line":"        param_value \u003d param_dict[param_key]"},{"line_number":285,"context_line":"        for param_type in param_types:"},{"line_number":286,"context_line":"            if isinstance(param_value, param_type):"},{"line_number":287,"context_line":"                break"},{"line_number":288,"context_line":"        else:"},{"line_number":289,"context_line":"            msg \u003d _(\u0027Invalid binding:profile. %(key)s %(value)s \u0027"},{"line_number":290,"context_line":"                    \u0027value invalid type\u0027) % {\u0027key\u0027: param_key,"},{"line_number":291,"context_line":"                                             \u0027value\u0027: param_value}"},{"line_number":292,"context_line":"            raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    # Make sure we can successfully look up the port indicated by"},{"line_number":295,"context_line":"    # parent_name.  Just let it raise the right exception if there is a"}],"source_content_type":"text/x-python","patch_set":6,"id":"b3eaa4b7_e19f4b0f","line":292,"range":{"start_line":281,"start_character":0,"end_line":292,"end_character":1},"in_reply_to":"033e31ec_eefea1a0","updated":"2022-01-28 17:55:23.000000000","message":"Ack","commit_id":"c72cdc280569847dc9b96a7ff08fc64d54021518"}]}
