)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"971ad38113b4b0625fa622568a131c257b8d2a05","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Adam Harwell \u003cflux.adam@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2021-04-29 17:24:46 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Use valid_vip_subnet_tag to select subnets"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"For the case of no subnet passed to a create call, Octavia picks the"},{"line_number":10,"context_line":"first ipv4 subnet in the network. Add a config to look for a tag instead"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7040e293_97f13795","line":7,"range":{"start_line":7,"start_character":4,"end_line":7,"end_character":24},"updated":"2021-04-30 00:49:50.000000000","message":"s/vip_subnet_selection_tag","commit_id":"6f36a25a6e0eb818fb9531b6db9a9093453ac7e3"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"3fdb55690006e4bc11788cdf6fddfb6c897f71c8","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Adam Harwell \u003cflux.adam@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2021-04-29 17:24:46 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Use valid_vip_subnet_tag to select subnets"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"For the case of no subnet passed to a create call, Octavia picks the"},{"line_number":10,"context_line":"first ipv4 subnet in the network. Add a config to look for a tag instead"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"151f7670_2811709c","line":7,"range":{"start_line":7,"start_character":4,"end_line":7,"end_character":24},"in_reply_to":"7040e293_97f13795","updated":"2021-04-30 09:46:02.000000000","message":"Done","commit_id":"6f36a25a6e0eb818fb9531b6db9a9093453ac7e3"}],"octavia/api/drivers/amphora_driver/flavor_schema.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9d91084113e53247d95aa92f7f500088e78f1642","unresolved":true,"context_lines":[{"line_number":50,"context_line":"        },"},{"line_number":51,"context_line":"        consts.VALID_VIP_SUBNET_TAG: {"},{"line_number":52,"context_line":"            \"type\": \"string\","},{"line_number":53,"context_line":"            \"description\": \"When users create an LB with no VIP subnet, \""},{"line_number":54,"context_line":"                           \"randomly pick a subnet with this tag from the \""},{"line_number":55,"context_line":"                           \"provided network.\""},{"line_number":56,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":2,"id":"f10fdd7b_d17efa4c","line":53,"range":{"start_line":53,"start_character":46,"end_line":53,"end_character":51},"updated":"2021-04-27 13:50:20.000000000","message":"s/a LB (or maybe spell-out load balancer)","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"25b3c5e14bc65a693929035607c9f05233e38de2","unresolved":true,"context_lines":[{"line_number":50,"context_line":"        },"},{"line_number":51,"context_line":"        consts.VALID_VIP_SUBNET_TAG: {"},{"line_number":52,"context_line":"            \"type\": \"string\","},{"line_number":53,"context_line":"            \"description\": \"When users create an LB with no VIP subnet, \""},{"line_number":54,"context_line":"                           \"randomly pick a subnet with this tag from the \""},{"line_number":55,"context_line":"                           \"provided network.\""},{"line_number":56,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":2,"id":"7c3baf0d_df52d532","line":53,"range":{"start_line":53,"start_character":46,"end_line":53,"end_character":51},"in_reply_to":"e338b119_0232b9b1","updated":"2021-04-27 19:08:08.000000000","message":"Well, then I\u0027d suggest using \u0027load balancer\u0027 as the other things in this file do instead of the abbreviation :p","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"ab7a5f5f2d5fe5d3957c864761e39c0cbb8ffbf9","unresolved":true,"context_lines":[{"line_number":50,"context_line":"        },"},{"line_number":51,"context_line":"        consts.VALID_VIP_SUBNET_TAG: {"},{"line_number":52,"context_line":"            \"type\": \"string\","},{"line_number":53,"context_line":"            \"description\": \"When users create an LB with no VIP subnet, \""},{"line_number":54,"context_line":"                           \"randomly pick a subnet with this tag from the \""},{"line_number":55,"context_line":"                           \"provided network.\""},{"line_number":56,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":2,"id":"e338b119_0232b9b1","line":53,"range":{"start_line":53,"start_character":46,"end_line":53,"end_character":51},"in_reply_to":"f10fdd7b_d17efa4c","updated":"2021-04-27 18:13:29.000000000","message":"https://www.grammar.com/a-vs-an-when-to-use\n\n\"an el-bee\" :D","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"fd4a6a7c1a8deff5f6638032aacea83549d786b1","unresolved":true,"context_lines":[{"line_number":48,"context_line":"            \"type\": \"string\","},{"line_number":49,"context_line":"            \"description\": \"The amphora image tag.\""},{"line_number":50,"context_line":"        },"},{"line_number":51,"context_line":"        consts.VALID_VIP_SUBNET_TAG: {"},{"line_number":52,"context_line":"            \"type\": \"string\","},{"line_number":53,"context_line":"            \"description\": \"When users create an LB with no VIP subnet, \""},{"line_number":54,"context_line":"                           \"randomly pick a subnet with this tag from the \""}],"source_content_type":"text/x-python","patch_set":3,"id":"64a9cd28_742736d8","line":51,"range":{"start_line":51,"start_character":15,"end_line":51,"end_character":21},"updated":"2021-04-27 20:46:52.000000000","message":"nit: \"Valid\" seems a bit presumptuous. grin\nNot sure it adds value here.","commit_id":"7f08f58206604f79822d7f439b373cb45cfafced"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a4c9596a68fd307c1c4af6e13e7a0e625e39b9e6","unresolved":true,"context_lines":[{"line_number":48,"context_line":"            \"type\": \"string\","},{"line_number":49,"context_line":"            \"description\": \"The amphora image tag.\""},{"line_number":50,"context_line":"        },"},{"line_number":51,"context_line":"        consts.VALID_VIP_SUBNET_TAG: {"},{"line_number":52,"context_line":"            \"type\": \"string\","},{"line_number":53,"context_line":"            \"description\": \"When users create an LB with no VIP subnet, \""},{"line_number":54,"context_line":"                           \"randomly pick a subnet with this tag from the \""}],"source_content_type":"text/x-python","patch_set":3,"id":"d2b9107e_89949c86","line":51,"range":{"start_line":51,"start_character":15,"end_line":51,"end_character":21},"in_reply_to":"64a9cd28_742736d8","updated":"2021-04-27 23:45:31.000000000","message":"Yeah, I was just matching the config variable that it overrides, for maximum clarity. If you think this shouldn\u0027t directly match the config var (which it actually didn\u0027t when I first wrote this, then went through and fixed it to match by adding this, lol, because I agree with you) then I am ok to change it back, but I opted for consistency. Alternatively, maybe the config var name can change too, I am open to suggestions. `vip_subnet_selection_tag`?","commit_id":"7f08f58206604f79822d7f439b373cb45cfafced"}],"octavia/api/v2/controllers/load_balancer.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9d91084113e53247d95aa92f7f500088e78f1642","unresolved":true,"context_lines":[{"line_number":170,"context_line":"                    vvst \u003d flavor.flavor_profile.flavor_data.get("},{"line_number":171,"context_line":"                        constants.VALID_VIP_SUBNET_TAG, vvst)"},{"line_number":172,"context_line":"                for subnet_id in subnets:"},{"line_number":173,"context_line":"                    subnet \u003d network_driver.get_subnet(subnet_id)"},{"line_number":174,"context_line":"                    if vvst and vvst in subnet.tags:"},{"line_number":175,"context_line":"                        valid_vip_subnets.append(subnet_id)"},{"line_number":176,"context_line":"                    elif not vvst:"}],"source_content_type":"text/x-python","patch_set":2,"id":"31261e28_a4f16b9d","line":173,"updated":"2021-04-27 13:50:20.000000000","message":"I guess the get_subnet() call doesn\u0027t support it, but you could just as easily pass the tag as a filter.","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a4c9596a68fd307c1c4af6e13e7a0e625e39b9e6","unresolved":true,"context_lines":[{"line_number":170,"context_line":"                    vvst \u003d flavor.flavor_profile.flavor_data.get("},{"line_number":171,"context_line":"                        constants.VALID_VIP_SUBNET_TAG, vvst)"},{"line_number":172,"context_line":"                for subnet_id in subnets:"},{"line_number":173,"context_line":"                    subnet \u003d network_driver.get_subnet(subnet_id)"},{"line_number":174,"context_line":"                    if vvst and vvst in subnet.tags:"},{"line_number":175,"context_line":"                        valid_vip_subnets.append(subnet_id)"},{"line_number":176,"context_line":"                    elif not vvst:"}],"source_content_type":"text/x-python","patch_set":2,"id":"f911e009_34656eef","line":173,"in_reply_to":"02221cda_5601df06","updated":"2021-04-27 23:45:31.000000000","message":"Yeah, after your first comment I thought \"you\u0027re right! I\u0027ll do it quick\" and then started writing it and it got ... messy. That\u0027s why I quickly revised to \"maybe?\" and now I dunno... I still think it\u0027s possible. I could look at doing the filtering above during the original call? Or just re-do the IP allocation based filtering here since it\u0027s local so it\u0027d be quick... I will ponder, but if the only argument on this patch is whether or not this is done one way or the other, that\u0027s fine by me because it means the feature as a whole can move ahead, right? :D","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"fd4a6a7c1a8deff5f6638032aacea83549d786b1","unresolved":true,"context_lines":[{"line_number":170,"context_line":"                    vvst \u003d flavor.flavor_profile.flavor_data.get("},{"line_number":171,"context_line":"                        constants.VALID_VIP_SUBNET_TAG, vvst)"},{"line_number":172,"context_line":"                for subnet_id in subnets:"},{"line_number":173,"context_line":"                    subnet \u003d network_driver.get_subnet(subnet_id)"},{"line_number":174,"context_line":"                    if vvst and vvst in subnet.tags:"},{"line_number":175,"context_line":"                        valid_vip_subnets.append(subnet_id)"},{"line_number":176,"context_line":"                    elif not vvst:"}],"source_content_type":"text/x-python","patch_set":2,"id":"c701860c_61c042a8","line":173,"in_reply_to":"291472e7_edfaef28","updated":"2021-04-27 20:46:52.000000000","message":"Yeah, I wondered the same, would a filtered list call be better than multiple (many?) get subnet calls here. I think the answer is yes, but maybe an early optimization? This is in a user waiting for a response period, so it might be worth doing now.","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"ab7a5f5f2d5fe5d3957c864761e39c0cbb8ffbf9","unresolved":true,"context_lines":[{"line_number":170,"context_line":"                    vvst \u003d flavor.flavor_profile.flavor_data.get("},{"line_number":171,"context_line":"                        constants.VALID_VIP_SUBNET_TAG, vvst)"},{"line_number":172,"context_line":"                for subnet_id in subnets:"},{"line_number":173,"context_line":"                    subnet \u003d network_driver.get_subnet(subnet_id)"},{"line_number":174,"context_line":"                    if vvst and vvst in subnet.tags:"},{"line_number":175,"context_line":"                        valid_vip_subnets.append(subnet_id)"},{"line_number":176,"context_line":"                    elif not vvst:"}],"source_content_type":"text/x-python","patch_set":2,"id":"98cc5aa9_a25d5d59","line":173,"in_reply_to":"31261e28_a4f16b9d","updated":"2021-04-27 18:13:29.000000000","message":"So, I could do this as two separate calls (one in the vvst case, one in the non-vvst case) ... Do we feel strongly about it? I think maybe the *neutron* call supports the filter, just ours doesn\u0027t? That can be fixed. I\u0027m just not overly worried about it since this code is trivially able to handle it.","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"da5ee5fa354ef6f18580751be95573083265c392","unresolved":true,"context_lines":[{"line_number":170,"context_line":"                    vvst \u003d flavor.flavor_profile.flavor_data.get("},{"line_number":171,"context_line":"                        constants.VALID_VIP_SUBNET_TAG, vvst)"},{"line_number":172,"context_line":"                for subnet_id in subnets:"},{"line_number":173,"context_line":"                    subnet \u003d network_driver.get_subnet(subnet_id)"},{"line_number":174,"context_line":"                    if vvst and vvst in subnet.tags:"},{"line_number":175,"context_line":"                        valid_vip_subnets.append(subnet_id)"},{"line_number":176,"context_line":"                    elif not vvst:"}],"source_content_type":"text/x-python","patch_set":2,"id":"b74b5ae3_489f1bd5","line":173,"in_reply_to":"95c6e0df_2c46b242","updated":"2021-04-27 18:33:06.000000000","message":"OH nevermind again, figured out another reason we did it this way -- we\u0027ve already applied some filtering above based on IP availability, so if we re-fetched via tag, we\u0027d have to reapply this. It\u0027s much simpler just to keep it this way.","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"204da7cefcaa18e00782420dcecaa69d38133b03","unresolved":true,"context_lines":[{"line_number":170,"context_line":"                    vvst \u003d flavor.flavor_profile.flavor_data.get("},{"line_number":171,"context_line":"                        constants.VALID_VIP_SUBNET_TAG, vvst)"},{"line_number":172,"context_line":"                for subnet_id in subnets:"},{"line_number":173,"context_line":"                    subnet \u003d network_driver.get_subnet(subnet_id)"},{"line_number":174,"context_line":"                    if vvst and vvst in subnet.tags:"},{"line_number":175,"context_line":"                        valid_vip_subnets.append(subnet_id)"},{"line_number":176,"context_line":"                    elif not vvst:"}],"source_content_type":"text/x-python","patch_set":2,"id":"95c6e0df_2c46b242","line":173,"in_reply_to":"98cc5aa9_a25d5d59","updated":"2021-04-27 18:18:46.000000000","message":"Ah, so this was done this way because for the non-vvst case, it would limit the amount of data we had to pull (it\u0027s often likely we\u0027d only need one GET) and we already have the list of subnet_ids because we are pulling it from the network object -- though I bet the LIST call is not really more expensive in that case, and does save round-trips in the other case. It looks like it does support arbitrary filters, so assuming a tag filter is supported by the neutron API, I think that should work, and it would be a good idea to switch.","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"25b3c5e14bc65a693929035607c9f05233e38de2","unresolved":true,"context_lines":[{"line_number":170,"context_line":"                    vvst \u003d flavor.flavor_profile.flavor_data.get("},{"line_number":171,"context_line":"                        constants.VALID_VIP_SUBNET_TAG, vvst)"},{"line_number":172,"context_line":"                for subnet_id in subnets:"},{"line_number":173,"context_line":"                    subnet \u003d network_driver.get_subnet(subnet_id)"},{"line_number":174,"context_line":"                    if vvst and vvst in subnet.tags:"},{"line_number":175,"context_line":"                        valid_vip_subnets.append(subnet_id)"},{"line_number":176,"context_line":"                    elif not vvst:"}],"source_content_type":"text/x-python","patch_set":2,"id":"291472e7_edfaef28","line":173,"in_reply_to":"b74b5ae3_489f1bd5","updated":"2021-04-27 19:08:08.000000000","message":"Well, in general I\u0027m just thinking there\u0027s a way to have this code make fewer requests to the neutron API, it\u0027s maybe something for another day but if we have a network_id and a tag, it might be quicker to filter in one call, since you can get a list of subnets filtered by them both in one call.","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"09a9b3b8a2e813eb91ddcb35722a6a4a686dae44","unresolved":true,"context_lines":[{"line_number":170,"context_line":"                    vvst \u003d flavor.flavor_profile.flavor_data.get("},{"line_number":171,"context_line":"                        constants.VALID_VIP_SUBNET_TAG, vvst)"},{"line_number":172,"context_line":"                for subnet_id in subnets:"},{"line_number":173,"context_line":"                    subnet \u003d network_driver.get_subnet(subnet_id)"},{"line_number":174,"context_line":"                    if vvst and vvst in subnet.tags:"},{"line_number":175,"context_line":"                        valid_vip_subnets.append(subnet_id)"},{"line_number":176,"context_line":"                    elif not vvst:"}],"source_content_type":"text/x-python","patch_set":2,"id":"02221cda_5601df06","line":173,"in_reply_to":"c701860c_61c042a8","updated":"2021-04-27 22:27:20.000000000","message":"So I retract my proposal.  Looking closer, since we care about both the ip_version and possibly the tag, we have to do a GET to look at them both.  And since we\u0027ve already looked-up the IP availability it just makes a mess - the pseudo code I started writing was worse.","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9d91084113e53247d95aa92f7f500088e78f1642","unresolved":true,"context_lines":[{"line_number":179,"context_line":"                            break"},{"line_number":180,"context_line":"                        # Use the first subnet, in case there are no ipv4 subnets"},{"line_number":181,"context_line":"                        if not valid_vip_subnets:"},{"line_number":182,"context_line":"                            valid_vip_subnets \u003d [subnet_id]"},{"line_number":183,"context_line":"                load_balancer.vip_subnet_id \u003d random.choice(valid_vip_subnets)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"593ae28b_2fb508c0","line":182,"updated":"2021-04-27 13:50:20.000000000","message":"nit: maybe just add a blank line here so it\u0027s painfully obvious it\u0027s not part of the loop.","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"ab7a5f5f2d5fe5d3957c864761e39c0cbb8ffbf9","unresolved":false,"context_lines":[{"line_number":179,"context_line":"                            break"},{"line_number":180,"context_line":"                        # Use the first subnet, in case there are no ipv4 subnets"},{"line_number":181,"context_line":"                        if not valid_vip_subnets:"},{"line_number":182,"context_line":"                            valid_vip_subnets \u003d [subnet_id]"},{"line_number":183,"context_line":"                load_balancer.vip_subnet_id \u003d random.choice(valid_vip_subnets)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"ea83382f_caea92ad","line":182,"in_reply_to":"593ae28b_2fb508c0","updated":"2021-04-27 18:13:29.000000000","message":"Done","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"fd4a6a7c1a8deff5f6638032aacea83549d786b1","unresolved":true,"context_lines":[{"line_number":181,"context_line":"                        if not valid_vip_subnets:"},{"line_number":182,"context_line":"                            valid_vip_subnets \u003d [subnet_id]"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"                load_balancer.vip_subnet_id \u003d random.choice(valid_vip_subnets)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    @staticmethod"},{"line_number":187,"context_line":"    def _validate_port_and_fill_or_validate_subnet(load_balancer,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5c6d3c7f_a62169d8","line":184,"updated":"2021-04-27 20:46:52.000000000","message":"This will blow up if vsst is defined, but no subnets have a matching tag.\nvalid_vip_subnets will end up an empty list, which will raise IndexError.","commit_id":"7f08f58206604f79822d7f439b373cb45cfafced"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"46dddd3f2bb12f6028ea85abc98049d89c4443ac","unresolved":true,"context_lines":[{"line_number":181,"context_line":"                        if not valid_vip_subnets:"},{"line_number":182,"context_line":"                            valid_vip_subnets \u003d [subnet_id]"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"                load_balancer.vip_subnet_id \u003d random.choice(valid_vip_subnets)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    @staticmethod"},{"line_number":187,"context_line":"    def _validate_port_and_fill_or_validate_subnet(load_balancer,"}],"source_content_type":"text/x-python","patch_set":3,"id":"63c65182_99a8d648","line":184,"in_reply_to":"072a8ffe_d065c236","updated":"2021-04-30 00:19:12.000000000","message":"Well, I just redid this whole thing to do the filtering with less GET calls (just one LIST) as suggested.","commit_id":"7f08f58206604f79822d7f439b373cb45cfafced"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"93344d9b2712778343a5103d3218ca5bd779ebdc","unresolved":true,"context_lines":[{"line_number":181,"context_line":"                        if not valid_vip_subnets:"},{"line_number":182,"context_line":"                            valid_vip_subnets \u003d [subnet_id]"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"                load_balancer.vip_subnet_id \u003d random.choice(valid_vip_subnets)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    @staticmethod"},{"line_number":187,"context_line":"    def _validate_port_and_fill_or_validate_subnet(load_balancer,"}],"source_content_type":"text/x-python","patch_set":3,"id":"072a8ffe_d065c236","line":184,"in_reply_to":"2fc238c5_88e86878","updated":"2021-04-28 00:56:14.000000000","message":"I think it should raise a ValidationException with a nice message","commit_id":"7f08f58206604f79822d7f439b373cb45cfafced"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a4c9596a68fd307c1c4af6e13e7a0e625e39b9e6","unresolved":true,"context_lines":[{"line_number":181,"context_line":"                        if not valid_vip_subnets:"},{"line_number":182,"context_line":"                            valid_vip_subnets \u003d [subnet_id]"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"                load_balancer.vip_subnet_id \u003d random.choice(valid_vip_subnets)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    @staticmethod"},{"line_number":187,"context_line":"    def _validate_port_and_fill_or_validate_subnet(load_balancer,"}],"source_content_type":"text/x-python","patch_set":3,"id":"2fc238c5_88e86878","line":184,"in_reply_to":"5c6d3c7f_a62169d8","updated":"2021-04-27 23:45:31.000000000","message":"Yes, that is what I intended. Because it is possible to tag any type of subnet, I assume we don\u0027t need to do the ipv4/ipv6 logic and we just pick one of any tagged -- and if there\u0027s none, it\u0027s an error and should return as such to the user. My only question might be about HOW that\u0027s exposed above -- may need to wrap the highest level call in a try/except and raise a more reasonable error to the user. Or, is the expectation this will return None instead? I can change it to do that, if the result would be better.","commit_id":"7f08f58206604f79822d7f439b373cb45cfafced"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"971ad38113b4b0625fa622568a131c257b8d2a05","unresolved":true,"context_lines":[{"line_number":138,"context_line":"                subnet_filters[\u0027tags\u0027] \u003d vsst"},{"line_number":139,"context_line":"            network_subnets \u003d network_driver.list_subnets(**subnet_filters)"},{"line_number":140,"context_line":"            if load_balancer.vip_address:"},{"line_number":141,"context_line":"                for subnet in network_subnets:"},{"line_number":142,"context_line":"                    if validate.is_ip_member_of_cidr(load_balancer.vip_address,"},{"line_number":143,"context_line":"                                                     subnet.cidr):"},{"line_number":144,"context_line":"                        load_balancer.vip_subnet_id \u003d subnet.id"}],"source_content_type":"text/x-python","patch_set":4,"id":"8156a4de_98aebc29","line":141,"updated":"2021-04-30 00:49:50.000000000","message":"Does this break the existing behavior if the user passed-in vip_subnet_id and vsst is set in the config?  For example, vip_subnet_id\u003d\u0027subnet1\u0027 (no tag), and vsst\u003d2 (matches tag on subnet2), it seems like list_subnets() will filter those with the tag and not find subnet1?  Maybe there\u0027s already a unit test for this case to prove me wrong :)","commit_id":"6f36a25a6e0eb818fb9531b6db9a9093453ac7e3"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"3fdb55690006e4bc11788cdf6fddfb6c897f71c8","unresolved":true,"context_lines":[{"line_number":138,"context_line":"                subnet_filters[\u0027tags\u0027] \u003d vsst"},{"line_number":139,"context_line":"            network_subnets \u003d network_driver.list_subnets(**subnet_filters)"},{"line_number":140,"context_line":"            if load_balancer.vip_address:"},{"line_number":141,"context_line":"                for subnet in network_subnets:"},{"line_number":142,"context_line":"                    if validate.is_ip_member_of_cidr(load_balancer.vip_address,"},{"line_number":143,"context_line":"                                                     subnet.cidr):"},{"line_number":144,"context_line":"                        load_balancer.vip_subnet_id \u003d subnet.id"}],"source_content_type":"text/x-python","patch_set":4,"id":"c24258e1_db8482d3","line":141,"in_reply_to":"8156a4de_98aebc29","updated":"2021-04-30 09:46:02.000000000","message":"All of this is only even run if the user didn\u0027t pass a subnet (see line 130). The VSST concept is only about subnet auto-selection -- if a user provides a subnet, this won\u0027t actually force any further validation, their choice is always accepted.","commit_id":"6f36a25a6e0eb818fb9531b6db9a9093453ac7e3"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"971ad38113b4b0625fa622568a131c257b8d2a05","unresolved":true,"context_lines":[{"line_number":151,"context_line":"            else:"},{"line_number":152,"context_line":"                # If subnet and IP are not provided, pick a subnet with enough"},{"line_number":153,"context_line":"                # available IPs (pref ipv4), unless vip_selection_subnet_tag is"},{"line_number":154,"context_line":"                # set, in which case pick randomlu from all tagged subnets"},{"line_number":155,"context_line":"                if not network_subnets:"},{"line_number":156,"context_line":"                    raise exceptions.ValidationException(detail\u003d_("},{"line_number":157,"context_line":"                        \"Supplied network does not contain a valid subnet.\""}],"source_content_type":"text/x-python","patch_set":4,"id":"6d001794_cd6ae177","line":154,"range":{"start_line":154,"start_character":42,"end_line":154,"end_character":50},"updated":"2021-04-30 00:49:50.000000000","message":"s/randomly","commit_id":"6f36a25a6e0eb818fb9531b6db9a9093453ac7e3"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"3fdb55690006e4bc11788cdf6fddfb6c897f71c8","unresolved":false,"context_lines":[{"line_number":151,"context_line":"            else:"},{"line_number":152,"context_line":"                # If subnet and IP are not provided, pick a subnet with enough"},{"line_number":153,"context_line":"                # available IPs (pref ipv4), unless vip_selection_subnet_tag is"},{"line_number":154,"context_line":"                # set, in which case pick randomlu from all tagged subnets"},{"line_number":155,"context_line":"                if not network_subnets:"},{"line_number":156,"context_line":"                    raise exceptions.ValidationException(detail\u003d_("},{"line_number":157,"context_line":"                        \"Supplied network does not contain a valid subnet.\""}],"source_content_type":"text/x-python","patch_set":4,"id":"f35a69c7_90e5a586","line":154,"range":{"start_line":154,"start_character":42,"end_line":154,"end_character":50},"in_reply_to":"6d001794_cd6ae177","updated":"2021-04-30 09:46:02.000000000","message":"Done","commit_id":"6f36a25a6e0eb818fb9531b6db9a9093453ac7e3"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"97ea007a24e4f6c291bb336b86b244a361c77dc0","unresolved":true,"context_lines":[{"line_number":174,"context_line":"                              list(map(lambda x: x.to_dict(),"},{"line_number":175,"context_line":"                                       network_subnets)))"},{"line_number":176,"context_line":"                    LOG.error(\u0027ip_availability: %s\u0027,"},{"line_number":177,"context_line":"                              ip_avail.subnet_ip_availability)"},{"line_number":178,"context_line":"                    raise exceptions.ValidationException(detail\u003d_("},{"line_number":179,"context_line":"                        \"Subnet(s) in the supplied network do not contain \""},{"line_number":180,"context_line":"                        \"enough available IPs.\""}],"source_content_type":"text/x-python","patch_set":18,"id":"4fa6cb6a_03ecec10","line":177,"updated":"2021-07-14 16:55:21.000000000","message":"Debug?","commit_id":"783b682f6ade8cc94da6e25adf9db149434ccb1c"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"e188fbb40f30e0512f872ed8e46507a7248234b3","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                              list(map(lambda x: x.to_dict(),"},{"line_number":175,"context_line":"                                       network_subnets)))"},{"line_number":176,"context_line":"                    LOG.error(\u0027ip_availability: %s\u0027,"},{"line_number":177,"context_line":"                              ip_avail.subnet_ip_availability)"},{"line_number":178,"context_line":"                    raise exceptions.ValidationException(detail\u003d_("},{"line_number":179,"context_line":"                        \"Subnet(s) in the supplied network do not contain \""},{"line_number":180,"context_line":"                        \"enough available IPs.\""}],"source_content_type":"text/x-python","patch_set":18,"id":"83bc441f_a2cc932c","line":177,"in_reply_to":"4fa6cb6a_03ecec10","updated":"2021-09-17 04:58:06.000000000","message":"Done","commit_id":"783b682f6ade8cc94da6e25adf9db149434ccb1c"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"97ea007a24e4f6c291bb336b86b244a361c77dc0","unresolved":true,"context_lines":[{"line_number":189,"context_line":"                    if not load_balancer.vip_subnet_id:"},{"line_number":190,"context_line":"                        load_balancer.vip_subnet_id \u003d subnet.id"},{"line_number":191,"context_line":"                    if subnet.ip_version \u003d\u003d 4:"},{"line_number":192,"context_line":"                        load_balancer.vip_subnet_id \u003d subnet.id"},{"line_number":193,"context_line":"                        break"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":18,"id":"98b2a4cf_9334320a","line":192,"updated":"2021-07-14 16:55:21.000000000","message":"I\u0027m always loath to change things like this, but I don\u0027t see a reason this can\u0027t be the first check since it\u0027s always over-riding the \"first\" and breaking the loop.\n\nif subnet.ip_version \u003d\u003d 4:\n    load_balancer.vip_subnet_id \u003d subnet.id\n    break\nelif not load_balancer.vip_subnet_id:\n    # Use the first subnet, in case there are no ipv4 subnets\n    load_balancer.vip_subnet_id \u003d subnet.id","commit_id":"783b682f6ade8cc94da6e25adf9db149434ccb1c"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"e188fbb40f30e0512f872ed8e46507a7248234b3","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                    if not load_balancer.vip_subnet_id:"},{"line_number":190,"context_line":"                        load_balancer.vip_subnet_id \u003d subnet.id"},{"line_number":191,"context_line":"                    if subnet.ip_version \u003d\u003d 4:"},{"line_number":192,"context_line":"                        load_balancer.vip_subnet_id \u003d subnet.id"},{"line_number":193,"context_line":"                        break"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":18,"id":"f26174b8_5be384e6","line":192,"in_reply_to":"98b2a4cf_9334320a","updated":"2021-09-17 04:58:06.000000000","message":"Done","commit_id":"783b682f6ade8cc94da6e25adf9db149434ccb1c"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"97ea007a24e4f6c291bb336b86b244a361c77dc0","unresolved":true,"context_lines":[{"line_number":373,"context_line":"                raise exceptions.DisabledOption(option\u003d\u0027flavor\u0027,"},{"line_number":374,"context_line":"                                                value\u003dload_balancer.flavor_id)"},{"line_number":375,"context_line":"            return flavor"},{"line_number":376,"context_line":"        return None"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    def _validate_and_return_az_dict(self, lock_session, driver, lb_dict):"},{"line_number":379,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"d9b19bfe_b096c070","line":376,"updated":"2021-07-14 16:55:21.000000000","message":"Implied, unless pep8 is failing because of it","commit_id":"783b682f6ade8cc94da6e25adf9db149434ccb1c"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"e188fbb40f30e0512f872ed8e46507a7248234b3","unresolved":true,"context_lines":[{"line_number":373,"context_line":"                raise exceptions.DisabledOption(option\u003d\u0027flavor\u0027,"},{"line_number":374,"context_line":"                                                value\u003dload_balancer.flavor_id)"},{"line_number":375,"context_line":"            return flavor"},{"line_number":376,"context_line":"        return None"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    def _validate_and_return_az_dict(self, lock_session, driver, lb_dict):"},{"line_number":379,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"b8305097_7be193d6","line":376,"in_reply_to":"d9b19bfe_b096c070","updated":"2021-09-17 04:58:06.000000000","message":"Yes, this is a pep8 requirement. Without it:\n\nR1710: Either all return statements in a function should return an expression, or none of them should. (inconsistent-return-statements)","commit_id":"783b682f6ade8cc94da6e25adf9db149434ccb1c"}],"octavia/common/constants.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9d91084113e53247d95aa92f7f500088e78f1642","unresolved":true,"context_lines":[{"line_number":807,"context_line":"LOADBALANCER_TOPOLOGY \u003d \u0027loadbalancer_topology\u0027"},{"line_number":808,"context_line":"COMPUTE_FLAVOR \u003d \u0027compute_flavor\u0027"},{"line_number":809,"context_line":"AMP_IMAGE_TAG \u003d \u0027amp_image_tag\u0027"},{"line_number":810,"context_line":"VALID_VIP_SUBNET_TAG \u003d \u0027vip_subnet_tag\u0027"},{"line_number":811,"context_line":""},{"line_number":812,"context_line":"# TODO(johnsom) move to octavia_lib"},{"line_number":813,"context_line":"# client certification authorization option"}],"source_content_type":"text/x-python","patch_set":2,"id":"0a03fe4f_890dbc10","line":810,"range":{"start_line":810,"start_character":24,"end_line":810,"end_character":38},"updated":"2021-04-27 13:50:20.000000000","message":"s/valid_vip_subnet_tag","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"ab7a5f5f2d5fe5d3957c864761e39c0cbb8ffbf9","unresolved":true,"context_lines":[{"line_number":807,"context_line":"LOADBALANCER_TOPOLOGY \u003d \u0027loadbalancer_topology\u0027"},{"line_number":808,"context_line":"COMPUTE_FLAVOR \u003d \u0027compute_flavor\u0027"},{"line_number":809,"context_line":"AMP_IMAGE_TAG \u003d \u0027amp_image_tag\u0027"},{"line_number":810,"context_line":"VALID_VIP_SUBNET_TAG \u003d \u0027vip_subnet_tag\u0027"},{"line_number":811,"context_line":""},{"line_number":812,"context_line":"# TODO(johnsom) move to octavia_lib"},{"line_number":813,"context_line":"# client certification authorization option"}],"source_content_type":"text/x-python","patch_set":2,"id":"48fbc00a_c3dcbfb2","line":810,"range":{"start_line":810,"start_character":24,"end_line":810,"end_character":38},"in_reply_to":"0a03fe4f_890dbc10","updated":"2021-04-27 18:13:29.000000000","message":"TECHNICALLY doesn\u0027t matter as the point of the constant is to point to the correct string for the data (doesn\u0027t have to exactly match the constant, it\u0027s just our convention AFAIU), but given that it\u0027s our convention... Done. :P","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"}],"octavia/common/utils.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"97ea007a24e4f6c291bb336b86b244a361c77dc0","unresolved":true,"context_lines":[{"line_number":193,"context_line":"        return call"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"# Copied from ovn-octavia-provider:"},{"line_number":197,"context_line":"# https://opendev.org/openstack/ovn-octavia-provider/src/commit/49dbf521d6573a7a71060303512afd3397fdfda7/ovn_octavia_provider/common/clients.py#L60-L67"},{"line_number":198,"context_line":"class Singleton(type):"},{"line_number":199,"context_line":"    \"\"\"Singleton metaclass type."}],"source_content_type":"text/x-python","patch_set":18,"id":"b13962bf_4ce76544","line":196,"updated":"2021-07-14 16:55:21.000000000","message":"Well that\u0027s a first :)","commit_id":"783b682f6ade8cc94da6e25adf9db149434ccb1c"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"e188fbb40f30e0512f872ed8e46507a7248234b3","unresolved":true,"context_lines":[{"line_number":193,"context_line":"        return call"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"# Copied from ovn-octavia-provider:"},{"line_number":197,"context_line":"# https://opendev.org/openstack/ovn-octavia-provider/src/commit/49dbf521d6573a7a71060303512afd3397fdfda7/ovn_octavia_provider/common/clients.py#L60-L67"},{"line_number":198,"context_line":"class Singleton(type):"},{"line_number":199,"context_line":"    \"\"\"Singleton metaclass type."}],"source_content_type":"text/x-python","patch_set":18,"id":"e9bdd6e1_61be4df2","line":196,"in_reply_to":"b13962bf_4ce76544","updated":"2021-09-17 04:58:06.000000000","message":"Lol yeah trust me, I looked HIGH AND LOW for another implementation I could just include, from oslo or somewhere, but none of them were quite what I needed and this one seemed ... clean. \u003e_\u003c","commit_id":"783b682f6ade8cc94da6e25adf9db149434ccb1c"}],"octavia/network/base.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9d0da6078ca3ad791181041fc46f1b1f2a6e5e7a","unresolved":true,"context_lines":[{"line_number":240,"context_line":"    def get_subnets(self, **filters):"},{"line_number":241,"context_line":"        \"\"\"Retrieves a list of subnets using the provided filters."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        :param **filters: key/value pairs of subnet filters"},{"line_number":244,"context_line":"        :return: [octavia.network.data_models.Subnet]"},{"line_number":245,"context_line":"        :raises: NetworkException, SubnetNotFound"},{"line_number":246,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"4adc5702_5a6c91da","line":243,"updated":"2021-04-30 14:59:36.000000000","message":"I think you need to drop the ** here to get past the doc job police","commit_id":"7e0e5fc9a3ac803545bd6e94c8de760cf789fd2a"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"3463d1056f0b026e3f36524e7fa0f5ce54dc29d0","unresolved":false,"context_lines":[{"line_number":240,"context_line":"    def get_subnets(self, **filters):"},{"line_number":241,"context_line":"        \"\"\"Retrieves a list of subnets using the provided filters."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        :param **filters: key/value pairs of subnet filters"},{"line_number":244,"context_line":"        :return: [octavia.network.data_models.Subnet]"},{"line_number":245,"context_line":"        :raises: NetworkException, SubnetNotFound"},{"line_number":246,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"b322cc5d_dc62bf88","line":243,"in_reply_to":"4adc5702_5a6c91da","updated":"2021-05-01 10:37:29.000000000","message":"Ack","commit_id":"7e0e5fc9a3ac803545bd6e94c8de760cf789fd2a"}],"octavia/network/drivers/noop_driver/driver.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"97ea007a24e4f6c291bb336b86b244a361c77dc0","unresolved":true,"context_lines":[{"line_number":152,"context_line":"                  self.__class__.__name__, network_id)"},{"line_number":153,"context_line":"        self.networkconfigconfig[network_id] \u003d (network_id, \u0027get_network\u0027)"},{"line_number":154,"context_line":"        if network_id in self._networks:"},{"line_number":155,"context_line":"            LOG.debug(\"Returning existing network: %s\", network_id)"},{"line_number":156,"context_line":"            network \u003d self._networks[network_id]"},{"line_number":157,"context_line":"        else:"},{"line_number":158,"context_line":"            LOG.debug(\"Generating new network: %s\", network_id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"799fe18d_76090673","line":155,"updated":"2021-07-14 16:55:21.000000000","message":"Guess you\u0027re still debugging things?  And below.","commit_id":"783b682f6ade8cc94da6e25adf9db149434ccb1c"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"e188fbb40f30e0512f872ed8e46507a7248234b3","unresolved":true,"context_lines":[{"line_number":152,"context_line":"                  self.__class__.__name__, network_id)"},{"line_number":153,"context_line":"        self.networkconfigconfig[network_id] \u003d (network_id, \u0027get_network\u0027)"},{"line_number":154,"context_line":"        if network_id in self._networks:"},{"line_number":155,"context_line":"            LOG.debug(\"Returning existing network: %s\", network_id)"},{"line_number":156,"context_line":"            network \u003d self._networks[network_id]"},{"line_number":157,"context_line":"        else:"},{"line_number":158,"context_line":"            LOG.debug(\"Generating new network: %s\", network_id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"b4f32298_615cc431","line":155,"in_reply_to":"799fe18d_76090673","updated":"2021-09-17 04:58:06.000000000","message":"Yes but this is pretty standard in the noop drivers, see above too -- we provide these because most of the time when running noop, we ARE debugging. I think this is fine to leave in as it follows the established pattern.","commit_id":"783b682f6ade8cc94da6e25adf9db149434ccb1c"}],"releasenotes/notes/tag-valid-subnets-for-selection-b638c6e1ba4356ad.yaml":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9d91084113e53247d95aa92f7f500088e78f1642","unresolved":true,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a configuration option ``valid_vip_subnet_tag`` in the ``networking``"},{"line_number":5,"context_line":"    section. Currently, when a user provides a network_id but no subnet_id,"},{"line_number":6,"context_line":"    the first ipv4 subnet found in the network will be used. If this config"},{"line_number":7,"context_line":"    variable is set, it will randomize between any subnets that have the"},{"line_number":8,"context_line":"    configured tag set. This variable is also added as an Amphora provider"},{"line_number":9,"context_line":"    capability, so it can be set on flavors to override the default config."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"1709b97c_76a985d8","line":6,"range":{"start_line":6,"start_character":14,"end_line":6,"end_character":18},"updated":"2021-04-27 13:50:20.000000000","message":"s/IPv4","commit_id":"2308ae93ab9754eaf826d52553c9c863c8632ee7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"971ad38113b4b0625fa622568a131c257b8d2a05","unresolved":true,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a config option ``vip_subnet_selection_tag`` in the ``networking``"},{"line_number":5,"context_line":"    section. Currently, when a user provides a network_id but no subnet_id,"},{"line_number":6,"context_line":"    the first ipv4 subnet found in the network will be used. If this config"},{"line_number":7,"context_line":"    variable is set, it will randomize between any subnets that have the"},{"line_number":8,"context_line":"    provided tag set. This variable is also added as an Amphora provider"},{"line_number":9,"context_line":"    capability, so it can be set on flavors to override the default config."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"514d0d7e_9a9170b0","line":6,"range":{"start_line":6,"start_character":14,"end_line":6,"end_character":18},"updated":"2021-04-30 00:49:50.000000000","message":"nit: IPv4","commit_id":"6f36a25a6e0eb818fb9531b6db9a9093453ac7e3"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"3fdb55690006e4bc11788cdf6fddfb6c897f71c8","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a config option ``vip_subnet_selection_tag`` in the ``networking``"},{"line_number":5,"context_line":"    section. Currently, when a user provides a network_id but no subnet_id,"},{"line_number":6,"context_line":"    the first ipv4 subnet found in the network will be used. If this config"},{"line_number":7,"context_line":"    variable is set, it will randomize between any subnets that have the"},{"line_number":8,"context_line":"    provided tag set. This variable is also added as an Amphora provider"},{"line_number":9,"context_line":"    capability, so it can be set on flavors to override the default config."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"90b9a834_26e11ece","line":6,"range":{"start_line":6,"start_character":14,"end_line":6,"end_character":18},"in_reply_to":"514d0d7e_9a9170b0","updated":"2021-04-30 09:46:02.000000000","message":"Done","commit_id":"6f36a25a6e0eb818fb9531b6db9a9093453ac7e3"}]}
