)]}'
{"nova/network/neutronv2/api.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"02be0cd477d50fe36cf40adea0765a4f8441f8ad","unresolved":false,"context_lines":[{"line_number":1018,"context_line":"            self._refresh_neutron_extensions_cache(context, neutron\u003dneutron)"},{"line_number":1019,"context_line":"        return constants.AUTO_ALLOCATE_TOPO_EXT in self.extensions"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"    def _has_multi_provider_extension(self, context, refresh_cache\u003dFalse,"},{"line_number":1022,"context_line":"                                    neutron\u003dNone):"},{"line_number":1023,"context_line":"        if refresh_cache:"},{"line_number":1024,"context_line":"            self._refresh_neutron_extensions_cache(context, neutron\u003dneutron)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a30ddce_8f4afeaa","line":1021,"range":{"start_line":1021,"start_character":53,"end_line":1021,"end_character":73},"updated":"2017-03-08 16:42:49.000000000","message":"Would this ever be true? I can only see one caller and it sets this to false? Looks like copy-paste from above","commit_id":"2670b11cf95643989a1df89c37e046850755cc99"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"2212e718b1e5d4c56f2f3f6894023ef0e8209363","unresolved":false,"context_lines":[{"line_number":1018,"context_line":"            self._refresh_neutron_extensions_cache(context, neutron\u003dneutron)"},{"line_number":1019,"context_line":"        return constants.AUTO_ALLOCATE_TOPO_EXT in self.extensions"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"    def _has_multi_provider_extension(self, context, refresh_cache\u003dFalse,"},{"line_number":1022,"context_line":"                                    neutron\u003dNone):"},{"line_number":1023,"context_line":"        if refresh_cache:"},{"line_number":1024,"context_line":"            self._refresh_neutron_extensions_cache(context, neutron\u003dneutron)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a30ddce_cbb4e9d2","line":1021,"range":{"start_line":1021,"start_character":53,"end_line":1021,"end_character":73},"in_reply_to":"9a30ddce_8f4afeaa","updated":"2017-03-08 16:57:16.000000000","message":"Did you mean \"Would this ever be false?\", because I do set it to true on 1412...\n\nIt\u0027s true. I just followed the pattern of the above 2 methods.\nHowever, I do this it\u0027s important to refresh here and this is being called in an early stage of the allocation and I didn\u0027t find any other method refreshing this.\nAlso, I\u0027ve seen the bind methods are not refreshing only if another method just refreshed it.\n\nSince there is only a single caller you are probably right, I should remove this parameter.\n\nThanks.","commit_id":"2670b11cf95643989a1df89c37e046850755cc99"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ab0fab209d84529cc9981531627033ea2151cffd","unresolved":false,"context_lines":[{"line_number":1415,"context_line":"                                           fields\u003d\u0027segments\u0027).get(\u0027network\u0027)"},{"line_number":1416,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"},{"line_number":1417,"context_line":"            for net in segments:"},{"line_number":1418,"context_line":"                # NOTE(vlaikr): As \"multi-segments\" network is a combination of"},{"line_number":1419,"context_line":"                # vxlan and vlan(s), only vlan network  will have a"},{"line_number":1420,"context_line":"                # physical_network specified."},{"line_number":1421,"context_line":"                phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"},{"line_number":1422,"context_line":"                if phynet_name:"},{"line_number":1423,"context_line":"                    break"},{"line_number":1424,"context_line":"        else:"},{"line_number":1425,"context_line":"            net \u003d neutron.show_network(net_id,"},{"line_number":1426,"context_line":"                fields\u003d\u0027provider:physical_network\u0027).get(\u0027network\u0027)"},{"line_number":1427,"context_line":"            phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a1ced50_eb225751","line":1424,"range":{"start_line":1418,"start_character":1,"end_line":1424,"end_character":1},"updated":"2017-03-21 13:33:06.000000000","message":"If the comment is valid then I think the following would be safer and more explicit:\n\nif net.get(\u0027provider:network_type\u0027) \u003d\u003d \u0027vlan\u0027:\n    phynet_name \u003d net.get(\u0027provider:physical_network\u0027)\n    break","commit_id":"2670b11cf95643989a1df89c37e046850755cc99"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9fb30f071e091aaaa51ca9f788a442c22e41293a","unresolved":false,"context_lines":[{"line_number":1415,"context_line":"                                           fields\u003d\u0027segments\u0027).get(\u0027network\u0027)"},{"line_number":1416,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"},{"line_number":1417,"context_line":"            for net in segments:"},{"line_number":1418,"context_line":"                # NOTE(vlaikr): As \"multi-segments\" network is a combination of"},{"line_number":1419,"context_line":"                # vxlan and vlan(s), only vlan network  will have a"},{"line_number":1420,"context_line":"                # physical_network specified."},{"line_number":1421,"context_line":"                phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"},{"line_number":1422,"context_line":"                if phynet_name:"},{"line_number":1423,"context_line":"                    break"},{"line_number":1424,"context_line":"        else:"},{"line_number":1425,"context_line":"            net \u003d neutron.show_network(net_id,"},{"line_number":1426,"context_line":"                fields\u003d\u0027provider:physical_network\u0027).get(\u0027network\u0027)"},{"line_number":1427,"context_line":"            phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_d886eeb9","line":1424,"range":{"start_line":1418,"start_character":1,"end_line":1424,"end_character":1},"in_reply_to":"1a1ced50_afb5997e","updated":"2017-03-28 14:59:56.000000000","message":"Wait - so we _can_ get a physical network from a VXLAN? If not, why is the idea above not a more correct one?","commit_id":"2670b11cf95643989a1df89c37e046850755cc99"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"065f9f2d84039cf33ee4118dbdcd31904bfcd06c","unresolved":false,"context_lines":[{"line_number":1415,"context_line":"                                           fields\u003d\u0027segments\u0027).get(\u0027network\u0027)"},{"line_number":1416,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"},{"line_number":1417,"context_line":"            for net in segments:"},{"line_number":1418,"context_line":"                # NOTE(vlaikr): As \"multi-segments\" network is a combination of"},{"line_number":1419,"context_line":"                # vxlan and vlan(s), only vlan network  will have a"},{"line_number":1420,"context_line":"                # physical_network specified."},{"line_number":1421,"context_line":"                phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"},{"line_number":1422,"context_line":"                if phynet_name:"},{"line_number":1423,"context_line":"                    break"},{"line_number":1424,"context_line":"        else:"},{"line_number":1425,"context_line":"            net \u003d neutron.show_network(net_id,"},{"line_number":1426,"context_line":"                fields\u003d\u0027provider:physical_network\u0027).get(\u0027network\u0027)"},{"line_number":1427,"context_line":"            phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a1ced50_afb5997e","line":1424,"range":{"start_line":1418,"start_character":1,"end_line":1424,"end_character":1},"in_reply_to":"1a1ced50_eb225751","updated":"2017-03-22 13:38:42.000000000","message":"Thanks. I think it makes sense, but the goal of this method is to select a segment that has a physical network, regardless if it\u0027s a vlan or anything else.","commit_id":"2670b11cf95643989a1df89c37e046850755cc99"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"55ad5595638fa5e8e52e59a90dc7e836ad6ff240","unresolved":false,"context_lines":[{"line_number":1415,"context_line":"                                           fields\u003d\u0027segments\u0027).get(\u0027network\u0027)"},{"line_number":1416,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"},{"line_number":1417,"context_line":"            for net in segments:"},{"line_number":1418,"context_line":"                # NOTE(vlaikr): As \"multi-segments\" network is a combination of"},{"line_number":1419,"context_line":"                # vxlan and vlan(s), only vlan network  will have a"},{"line_number":1420,"context_line":"                # physical_network specified."},{"line_number":1421,"context_line":"                phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"},{"line_number":1422,"context_line":"                if phynet_name:"},{"line_number":1423,"context_line":"                    break"},{"line_number":1424,"context_line":"        else:"},{"line_number":1425,"context_line":"            net \u003d neutron.show_network(net_id,"},{"line_number":1426,"context_line":"                fields\u003d\u0027provider:physical_network\u0027).get(\u0027network\u0027)"},{"line_number":1427,"context_line":"            phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_45a771be","line":1424,"range":{"start_line":1418,"start_character":1,"end_line":1424,"end_character":1},"in_reply_to":"ffe62b97_6ebdd8d6","updated":"2017-03-29 08:45:27.000000000","message":"Can we then make the comment more explicit about what is the generic case we are implementing against and what is the specific case that can only happen with today\u0027s implementation?","commit_id":"2670b11cf95643989a1df89c37e046850755cc99"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"52129e3af62aec6b150c1a36f38cfc2a30ad9ddc","unresolved":false,"context_lines":[{"line_number":1415,"context_line":"                                           fields\u003d\u0027segments\u0027).get(\u0027network\u0027)"},{"line_number":1416,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"},{"line_number":1417,"context_line":"            for net in segments:"},{"line_number":1418,"context_line":"                # NOTE(vlaikr): As \"multi-segments\" network is a combination of"},{"line_number":1419,"context_line":"                # vxlan and vlan(s), only vlan network  will have a"},{"line_number":1420,"context_line":"                # physical_network specified."},{"line_number":1421,"context_line":"                phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"},{"line_number":1422,"context_line":"                if phynet_name:"},{"line_number":1423,"context_line":"                    break"},{"line_number":1424,"context_line":"        else:"},{"line_number":1425,"context_line":"            net \u003d neutron.show_network(net_id,"},{"line_number":1426,"context_line":"                fields\u003d\u0027provider:physical_network\u0027).get(\u0027network\u0027)"},{"line_number":1427,"context_line":"            phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffe62b97_6ebdd8d6","line":1424,"range":{"start_line":1418,"start_character":1,"end_line":1424,"end_character":1},"in_reply_to":"ffe62b97_d886eeb9","updated":"2017-03-28 15:27:40.000000000","message":"No, we cannot get a physical network from a VXLAN.\nHowever, reading [1] my understanding is that in the general case, these multi-segment networks can be constructed of various L2 types. What\u0027s currently implemented is the combination of VXLAN and VLAN(s).\nI\u0027m not saying that this is a bad idea to try to retrieve the physical network only from vlan segments. I just prefer not to lock ourselves and hard code \"vlans\".\nFrom my point of view, the goal of this method is to find a segment that has a physical network, as this is what we essentially need.\nI\u0027m open to suggestions if you think otherwise.\n\n[1] https://specs.openstack.org/openstack/neutron-specs/specs/newton/routed-networks.html#overview","commit_id":"2670b11cf95643989a1df89c37e046850755cc99"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"3d29ad5f1b95a33468a91e5f94ad3e47367a1608","unresolved":false,"context_lines":[{"line_number":1006,"context_line":"            self.extensions.clear()"},{"line_number":1007,"context_line":"            self.extensions \u003d {ext[\u0027name\u0027]: ext for ext in extensions_list}"},{"line_number":1008,"context_line":""},{"line_number":1009,"context_line":"    def _has_port_binding_extension(self, context, refresh_cache\u003dFalse,"},{"line_number":1010,"context_line":"                                    neutron\u003dNone):"},{"line_number":1011,"context_line":"        if refresh_cache:"},{"line_number":1012,"context_line":"            self._refresh_neutron_extensions_cache(context, neutron\u003dneutron)"},{"line_number":1013,"context_line":"        return constants.PORTBINDING_EXT in self.extensions"},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"    def _has_auto_allocate_extension(self, context, refresh_cache\u003dFalse,"},{"line_number":1016,"context_line":"                                     neutron\u003dNone):"},{"line_number":1017,"context_line":"        if refresh_cache or not self.extensions:"},{"line_number":1018,"context_line":"            self._refresh_neutron_extensions_cache(context, neutron\u003dneutron)"},{"line_number":1019,"context_line":"        return constants.AUTO_ALLOCATE_TOPO_EXT in self.extensions"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"    def _has_multi_provider_extension(self, context, neutron\u003dNone):"},{"line_number":1022,"context_line":"        self._refresh_neutron_extensions_cache(context, neutron\u003dneutron)"},{"line_number":1023,"context_line":"        return constants.MULTI_NET_EXT in self.extensions"},{"line_number":1024,"context_line":""},{"line_number":1025,"context_line":"    def _get_pci_device_profile(self, pci_dev):"},{"line_number":1026,"context_line":"        dev_spec \u003d self.pci_whitelist.get_devspec(pci_dev)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffe62b97_f5a069f6","line":1023,"range":{"start_line":1009,"start_character":0,"end_line":1023,"end_character":57},"updated":"2017-03-29 13:22:49.000000000","message":"I just wonder why each of the extenstion check is written a bit diffrently. can we be more consistant here?","commit_id":"56a7e2ae0ad7f31e078b7e145c31bb3a45b541e5"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"51ece900d4c3b66305083844ba483fe63f080bef","unresolved":false,"context_lines":[{"line_number":1006,"context_line":"            self.extensions.clear()"},{"line_number":1007,"context_line":"            self.extensions \u003d {ext[\u0027name\u0027]: ext for ext in extensions_list}"},{"line_number":1008,"context_line":""},{"line_number":1009,"context_line":"    def _has_port_binding_extension(self, context, refresh_cache\u003dFalse,"},{"line_number":1010,"context_line":"                                    neutron\u003dNone):"},{"line_number":1011,"context_line":"        if refresh_cache:"},{"line_number":1012,"context_line":"            self._refresh_neutron_extensions_cache(context, neutron\u003dneutron)"},{"line_number":1013,"context_line":"        return constants.PORTBINDING_EXT in self.extensions"},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"    def _has_auto_allocate_extension(self, context, refresh_cache\u003dFalse,"},{"line_number":1016,"context_line":"                                     neutron\u003dNone):"},{"line_number":1017,"context_line":"        if refresh_cache or not self.extensions:"},{"line_number":1018,"context_line":"            self._refresh_neutron_extensions_cache(context, neutron\u003dneutron)"},{"line_number":1019,"context_line":"        return constants.AUTO_ALLOCATE_TOPO_EXT in self.extensions"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"    def _has_multi_provider_extension(self, context, neutron\u003dNone):"},{"line_number":1022,"context_line":"        self._refresh_neutron_extensions_cache(context, neutron\u003dneutron)"},{"line_number":1023,"context_line":"        return constants.MULTI_NET_EXT in self.extensions"},{"line_number":1024,"context_line":""},{"line_number":1025,"context_line":"    def _get_pci_device_profile(self, pci_dev):"},{"line_number":1026,"context_line":"        dev_spec \u003d self.pci_whitelist.get_devspec(pci_dev)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffe62b97_ba52b733","line":1023,"range":{"start_line":1009,"start_character":0,"end_line":1023,"end_character":57},"in_reply_to":"ffe62b97_f5a069f6","updated":"2017-04-01 02:28:03.000000000","message":"Agree, it was so prior to PS4 and I\u0027ve changed it due to Stephen\u0027s objection in PS3","commit_id":"56a7e2ae0ad7f31e078b7e145c31bb3a45b541e5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"50b38fed43419bef110056490c23d12ba67a8fe5","unresolved":false,"context_lines":[{"line_number":1412,"context_line":"                                           fields\u003d\u0027segments\u0027).get(\u0027network\u0027)"},{"line_number":1413,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"},{"line_number":1414,"context_line":"            for net in segments:"},{"line_number":1415,"context_line":"                # NOTE(vlaikr): As \"multi-segments\" network is a combination of"},{"line_number":1416,"context_line":"                # vxlan and vlan(s), only vlan network  will have a"},{"line_number":1417,"context_line":"                # physical_network specified."},{"line_number":1418,"context_line":"                phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffe62b97_2e6d90cb","line":1415,"range":{"start_line":1415,"start_character":23,"end_line":1415,"end_character":29},"updated":"2017-03-28 15:22:32.000000000","message":"vladikr? :)","commit_id":"56a7e2ae0ad7f31e078b7e145c31bb3a45b541e5"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"51ece900d4c3b66305083844ba483fe63f080bef","unresolved":false,"context_lines":[{"line_number":1412,"context_line":"                                           fields\u003d\u0027segments\u0027).get(\u0027network\u0027)"},{"line_number":1413,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"},{"line_number":1414,"context_line":"            for net in segments:"},{"line_number":1415,"context_line":"                # NOTE(vlaikr): As \"multi-segments\" network is a combination of"},{"line_number":1416,"context_line":"                # vxlan and vlan(s), only vlan network  will have a"},{"line_number":1417,"context_line":"                # physical_network specified."},{"line_number":1418,"context_line":"                phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffe62b97_82988f1b","line":1415,"range":{"start_line":1415,"start_character":23,"end_line":1415,"end_character":29},"in_reply_to":"ffe62b97_2e6d90cb","updated":"2017-04-01 02:28:03.000000000","message":":)","commit_id":"56a7e2ae0ad7f31e078b7e145c31bb3a45b541e5"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"3d29ad5f1b95a33468a91e5f94ad3e47367a1608","unresolved":false,"context_lines":[{"line_number":1417,"context_line":"                # physical_network specified."},{"line_number":1418,"context_line":"                phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"},{"line_number":1419,"context_line":"                if phynet_name:"},{"line_number":1420,"context_line":"                    break"},{"line_number":1421,"context_line":"        else:"},{"line_number":1422,"context_line":"            net \u003d neutron.show_network(net_id,"},{"line_number":1423,"context_line":"                fields\u003d\u0027provider:physical_network\u0027).get(\u0027network\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffe62b97_d50d65e8","line":1420,"range":{"start_line":1420,"start_character":0,"end_line":1420,"end_character":25},"updated":"2017-03-29 13:22:49.000000000","message":"you should raise an error if you don\u0027t find phynet_name in multi provider extension , right?","commit_id":"56a7e2ae0ad7f31e078b7e145c31bb3a45b541e5"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"51ece900d4c3b66305083844ba483fe63f080bef","unresolved":false,"context_lines":[{"line_number":1417,"context_line":"                # physical_network specified."},{"line_number":1418,"context_line":"                phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"},{"line_number":1419,"context_line":"                if phynet_name:"},{"line_number":1420,"context_line":"                    break"},{"line_number":1421,"context_line":"        else:"},{"line_number":1422,"context_line":"            net \u003d neutron.show_network(net_id,"},{"line_number":1423,"context_line":"                fields\u003d\u0027provider:physical_network\u0027).get(\u0027network\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffe62b97_82f3ef73","line":1420,"range":{"start_line":1420,"start_character":0,"end_line":1420,"end_character":25},"in_reply_to":"ffe62b97_d50d65e8","updated":"2017-04-01 02:28:03.000000000","message":"Good point, thanks.","commit_id":"56a7e2ae0ad7f31e078b7e145c31bb3a45b541e5"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3abd1fb0da8030e8c68165252cff564122f4f0cd","unresolved":false,"context_lines":[{"line_number":1407,"context_line":""},{"line_number":1408,"context_line":"    def _get_phynet_info(self, context, neutron, net_id):"},{"line_number":1409,"context_line":"        phynet_name \u003d None"},{"line_number":1410,"context_line":"        if self._has_multi_provider_extension(context, neutron\u003dneutron):"},{"line_number":1411,"context_line":"            network \u003d neutron.show_network(net_id,"},{"line_number":1412,"context_line":"                                           fields\u003d\u0027segments\u0027).get(\u0027network\u0027)"},{"line_number":1413,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"}],"source_content_type":"text/x-python","patch_set":5,"id":"7ffa3b31_6e22c6a6","line":1410,"updated":"2017-04-19 10:43:53.000000000","message":"Sorry, I am unclear here on when this is enabled and when its needed?\n\nI assume this is only enabled when we have this special kind of provider network, otherwise we do things in the normal way?\n\nOr is this more about all provider networks now doing things in this way, so eventually remove the other path?\n\nShould we really be checking the network we get back to ensure the type of that is multi, and use that to decide we check the segments instead?","commit_id":"5ae4f943d3d6b873210acbf2827d20d40b934164"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ea3a05899ecb750ab3a34c12011929d748759c1b","unresolved":false,"context_lines":[{"line_number":1407,"context_line":""},{"line_number":1408,"context_line":"    def _get_phynet_info(self, context, neutron, net_id):"},{"line_number":1409,"context_line":"        phynet_name \u003d None"},{"line_number":1410,"context_line":"        if self._has_multi_provider_extension(context, neutron\u003dneutron):"},{"line_number":1411,"context_line":"            network \u003d neutron.show_network(net_id,"},{"line_number":1412,"context_line":"                                           fields\u003d\u0027segments\u0027).get(\u0027network\u0027)"},{"line_number":1413,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_19219c4e","line":1410,"in_reply_to":"3f044301_3126b2b9","updated":"2017-05-04 03:03:04.000000000","message":"Cool, just want to make sure we\u0027re checking for the right thing here.","commit_id":"5ae4f943d3d6b873210acbf2827d20d40b934164"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"12bc4d316578fea4cd5859f5cd0bf5bdfcdec98f","unresolved":false,"context_lines":[{"line_number":1407,"context_line":""},{"line_number":1408,"context_line":"    def _get_phynet_info(self, context, neutron, net_id):"},{"line_number":1409,"context_line":"        phynet_name \u003d None"},{"line_number":1410,"context_line":"        if self._has_multi_provider_extension(context, neutron\u003dneutron):"},{"line_number":1411,"context_line":"            network \u003d neutron.show_network(net_id,"},{"line_number":1412,"context_line":"                                           fields\u003d\u0027segments\u0027).get(\u0027network\u0027)"},{"line_number":1413,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_3126b2b9","line":1410,"in_reply_to":"3f044301_d6be64fe","updated":"2017-05-03 23:58:15.000000000","message":"@dansmith: routed networks was built on top of the multi-provider networking API extension. A routed network is one which does not guarantee L2 connectivity to each node in the network (only L2 connectivity to nodes in a single segment is guaranteed). The multi-provider networks API extension allows more than one physical network tag to be associated with a network -- by associating one physical network tag to individual segments within that network.","commit_id":"5ae4f943d3d6b873210acbf2827d20d40b934164"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"4a215fcb9a13a408f384fb78daa65b53a645797b","unresolved":false,"context_lines":[{"line_number":1407,"context_line":""},{"line_number":1408,"context_line":"    def _get_phynet_info(self, context, neutron, net_id):"},{"line_number":1409,"context_line":"        phynet_name \u003d None"},{"line_number":1410,"context_line":"        if self._has_multi_provider_extension(context, neutron\u003dneutron):"},{"line_number":1411,"context_line":"            network \u003d neutron.show_network(net_id,"},{"line_number":1412,"context_line":"                                           fields\u003d\u0027segments\u0027).get(\u0027network\u0027)"},{"line_number":1413,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_919a26c3","line":1410,"in_reply_to":"3f044301_d6be64fe","updated":"2017-05-03 23:38:49.000000000","message":"The extension can be loaded but the user can use a network with or without segments.\nI mean, I can get rid of the extension check, but it seems to me that it\u0027s a faster way to distinguish between those networks that would use segments or not.","commit_id":"5ae4f943d3d6b873210acbf2827d20d40b934164"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"9af6f1728e8cebc91a5ad03fd963fb9610c18291","unresolved":false,"context_lines":[{"line_number":1407,"context_line":""},{"line_number":1408,"context_line":"    def _get_phynet_info(self, context, neutron, net_id):"},{"line_number":1409,"context_line":"        phynet_name \u003d None"},{"line_number":1410,"context_line":"        if self._has_multi_provider_extension(context, neutron\u003dneutron):"},{"line_number":1411,"context_line":"            network \u003d neutron.show_network(net_id,"},{"line_number":1412,"context_line":"                                           fields\u003d\u0027segments\u0027).get(\u0027network\u0027)"},{"line_number":1413,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_ebadfd31","line":1410,"in_reply_to":"7ffa3b31_6e22c6a6","updated":"2017-05-03 22:45:30.000000000","message":"In the case of the multi-segment network, the provider fields are held in each of the segments. As I wrote below, the goal is to find the physical network we should work with. We shouldn\u0027t start looking for segments in every network unless the multi-provider extension is loaded.","commit_id":"5ae4f943d3d6b873210acbf2827d20d40b934164"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"25ba515795db35194119b46e0da09ced7d2022a2","unresolved":false,"context_lines":[{"line_number":1407,"context_line":""},{"line_number":1408,"context_line":"    def _get_phynet_info(self, context, neutron, net_id):"},{"line_number":1409,"context_line":"        phynet_name \u003d None"},{"line_number":1410,"context_line":"        if self._has_multi_provider_extension(context, neutron\u003dneutron):"},{"line_number":1411,"context_line":"            network \u003d neutron.show_network(net_id,"},{"line_number":1412,"context_line":"                                           fields\u003d\u0027segments\u0027).get(\u0027network\u0027)"},{"line_number":1413,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_d6be64fe","line":1410,"in_reply_to":"7ffa3b31_6e22c6a6","updated":"2017-05-03 22:55:02.000000000","message":"My ignorance here, but is MULTI_NET_EXT equivalent to the use of segments? I would have expected the feature flag to be something that specifically referred to \"routed networks\" as I thought that was the name of the neutron feature. Do we need to check for both?","commit_id":"5ae4f943d3d6b873210acbf2827d20d40b934164"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"25ba515795db35194119b46e0da09ced7d2022a2","unresolved":false,"context_lines":[{"line_number":1412,"context_line":"                                           fields\u003d\u0027segments\u0027).get(\u0027network\u0027)"},{"line_number":1413,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"},{"line_number":1414,"context_line":"            for net in segments:"},{"line_number":1415,"context_line":"                # NOTE(vladikr): In geleral, \"multi-segments\" network is a"},{"line_number":1416,"context_line":"                # combination of L2 segments. The current implementation"},{"line_number":1417,"context_line":"                # contains a vxlan and vlan(s) segments, where only a vlan"},{"line_number":1418,"context_line":"                # network will have a physical_network specified, but may"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_769f90b4","line":1415,"range":{"start_line":1415,"start_character":36,"end_line":1415,"end_character":43},"updated":"2017-05-03 22:55:02.000000000","message":"Typo here.","commit_id":"5ae4f943d3d6b873210acbf2827d20d40b934164"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"12bc4d316578fea4cd5859f5cd0bf5bdfcdec98f","unresolved":false,"context_lines":[{"line_number":1420,"context_line":"                # is to find a segment that provides a physical network."},{"line_number":1421,"context_line":"                phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"},{"line_number":1422,"context_line":"                if phynet_name:"},{"line_number":1423,"context_line":"                    return phynet_name"},{"line_number":1424,"context_line":"            # Raising here as at least one segment should"},{"line_number":1425,"context_line":"            # have a physical network provided."},{"line_number":1426,"context_line":"            if segments:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_315b522f","line":1423,"updated":"2017-05-03 23:58:15.000000000","message":"So this will return the first physical network tag encountered. Is segments sorted? Can multiple segments have a physical network tag? If so, how do you determine which physical network should be returned?","commit_id":"5ae4f943d3d6b873210acbf2827d20d40b934164"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"50367fcbdc74e5f01c56329c36a7091d569994f8","unresolved":false,"context_lines":[{"line_number":1420,"context_line":"                # is to find a segment that provides a physical network."},{"line_number":1421,"context_line":"                phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"},{"line_number":1422,"context_line":"                if phynet_name:"},{"line_number":1423,"context_line":"                    return phynet_name"},{"line_number":1424,"context_line":"            # Raising here as at least one segment should"},{"line_number":1425,"context_line":"            # have a physical network provided."},{"line_number":1426,"context_line":"            if segments:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_c39a256d","line":1423,"in_reply_to":"3f044301_315b522f","updated":"2017-05-04 01:25:42.000000000","message":"Also, I can\u0027t find it written anywhere, besides[1][2], but I think multiple vlans would have the same physical network.\n\n[1] https://review.openstack.org/#/c/43569/6/neutron/tests/unit/ml2/test_ml2_plugin.py@142\n[2] https://docs.openstack.org/ocata/networking-guide/config-routed-networks.html\n\"A routed provider network enables a single provider network to represent multiple layer-2 networks...\"","commit_id":"5ae4f943d3d6b873210acbf2827d20d40b934164"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"2893cd25d46358178fcf49a1ff06f2fd7d98c926","unresolved":false,"context_lines":[{"line_number":1420,"context_line":"                # is to find a segment that provides a physical network."},{"line_number":1421,"context_line":"                phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"},{"line_number":1422,"context_line":"                if phynet_name:"},{"line_number":1423,"context_line":"                    return phynet_name"},{"line_number":1424,"context_line":"            # Raising here as at least one segment should"},{"line_number":1425,"context_line":"            # have a physical network provided."},{"line_number":1426,"context_line":"            if segments:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_911346b9","line":1423,"in_reply_to":"3f044301_315b522f","updated":"2017-05-04 00:13:02.000000000","message":"Right, it will return only the first physical network.  I\u0027ve asked the same and understood that a combination of vxlan and vlan is the supported use case. Otherwise, supporting multiple vlan networks will require a much larger work.","commit_id":"5ae4f943d3d6b873210acbf2827d20d40b934164"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"dcf6fcabe7adc73be3ef8443c22076eb0ebaa023","unresolved":false,"context_lines":[{"line_number":1421,"context_line":"                # is to find a first segment that provides a physical network."},{"line_number":1422,"context_line":"                # TODO(vladikr): Additional work will be required to handle the"},{"line_number":1423,"context_line":"                # case of multiple vlan segments associated with different"},{"line_number":1424,"context_line":"                # physical networks."},{"line_number":1425,"context_line":"                phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"},{"line_number":1426,"context_line":"                if phynet_name:"},{"line_number":1427,"context_line":"                    return phynet_name"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f044301_4674e399","line":1424,"updated":"2017-05-04 01:30:49.000000000","message":"cool, thanks for adding the above. makes future review much easier :)","commit_id":"b9d9d96a407db5a2adde3aed81e61cc9589c291a"}],"nova/tests/unit/network/test_neutronv2.py":[{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"3d29ad5f1b95a33468a91e5f94ad3e47367a1608","unresolved":false,"context_lines":[{"line_number":3151,"context_line":"                                    [{\u0027provider:physical_network\u0027: \u0027phynet10\u0027,"},{"line_number":3152,"context_line":"                                      \u0027provider:segmentation_id\u0027: 1000,"},{"line_number":3153,"context_line":"                                      \u0027provider:network_type\u0027: \u0027vlan\u0027},"},{"line_number":3154,"context_line":"                                     {\u0027provider:physical_network\u0027: \u0027\u0027,"},{"line_number":3155,"context_line":"                                      \u0027provider:segmentation_id\u0027: 153,"},{"line_number":3156,"context_line":"                                      \u0027provider:network_type\u0027: \u0027vxlan\u0027}]}}"},{"line_number":3157,"context_line":"        test_ext_list \u003d {\u0027extensions\u0027:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffe62b97_b5b781f5","line":3154,"range":{"start_line":3154,"start_character":67,"end_line":3154,"end_character":69},"updated":"2017-03-29 13:22:49.000000000","message":"is it empty string or null?  I rememeber null..\nbut it don\u0027t effect the test","commit_id":"56a7e2ae0ad7f31e078b7e145c31bb3a45b541e5"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"51ece900d4c3b66305083844ba483fe63f080bef","unresolved":false,"context_lines":[{"line_number":3151,"context_line":"                                    [{\u0027provider:physical_network\u0027: \u0027phynet10\u0027,"},{"line_number":3152,"context_line":"                                      \u0027provider:segmentation_id\u0027: 1000,"},{"line_number":3153,"context_line":"                                      \u0027provider:network_type\u0027: \u0027vlan\u0027},"},{"line_number":3154,"context_line":"                                     {\u0027provider:physical_network\u0027: \u0027\u0027,"},{"line_number":3155,"context_line":"                                      \u0027provider:segmentation_id\u0027: 153,"},{"line_number":3156,"context_line":"                                      \u0027provider:network_type\u0027: \u0027vxlan\u0027}]}}"},{"line_number":3157,"context_line":"        test_ext_list \u003d {\u0027extensions\u0027:"}],"source_content_type":"text/x-python","patch_set":4,"id":"dfeb2761_3f1f756d","line":3154,"range":{"start_line":3154,"start_character":67,"end_line":3154,"end_character":69},"in_reply_to":"ffe62b97_b5b781f5","updated":"2017-04-01 02:28:03.000000000","message":"Yep, it\u0027s None. Thanks.","commit_id":"56a7e2ae0ad7f31e078b7e145c31bb3a45b541e5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"25ba515795db35194119b46e0da09ced7d2022a2","unresolved":false,"context_lines":[{"line_number":3227,"context_line":"        mock_client.show_network.return_value \u003d test_net"},{"line_number":3228,"context_line":"        self.assertRaises(exception.NovaException,"},{"line_number":3229,"context_line":"                          api._get_port_vnic_info,"},{"line_number":3230,"context_line":"                          self.context, mock_client, test_port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":3231,"context_line":""},{"line_number":3232,"context_line":"    @mock.patch.object(neutronapi, \u0027get_client\u0027, return_value\u003dmock.MagicMock())"},{"line_number":3233,"context_line":"    def test_get_port_vnic_info_1(self, mock_get_client):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_365ea8e6","line":3230,"updated":"2017-05-03 22:55:02.000000000","message":"Where is the test for if the extension isn\u0027t present?","commit_id":"5ae4f943d3d6b873210acbf2827d20d40b934164"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"4a215fcb9a13a408f384fb78daa65b53a645797b","unresolved":false,"context_lines":[{"line_number":3227,"context_line":"        mock_client.show_network.return_value \u003d test_net"},{"line_number":3228,"context_line":"        self.assertRaises(exception.NovaException,"},{"line_number":3229,"context_line":"                          api._get_port_vnic_info,"},{"line_number":3230,"context_line":"                          self.context, mock_client, test_port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":3231,"context_line":""},{"line_number":3232,"context_line":"    @mock.patch.object(neutronapi, \u0027get_client\u0027, return_value\u003dmock.MagicMock())"},{"line_number":3233,"context_line":"    def test_get_port_vnic_info_1(self, mock_get_client):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_d6aae417","line":3230,"in_reply_to":"3f044301_365ea8e6","updated":"2017-05-03 23:38:49.000000000","message":"Do you mean the case when there is no extension with segments?\nI don\u0027t think it works this way.\nOtherwise, there are lots of tests without this extension:\ntest_get_port_vnic_info_*","commit_id":"5ae4f943d3d6b873210acbf2827d20d40b934164"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f5b5f5eb96c532f333b6c9adec721f65408e3103","unresolved":false,"context_lines":[{"line_number":3227,"context_line":"        mock_client.show_network.return_value \u003d test_net"},{"line_number":3228,"context_line":"        self.assertRaises(exception.NovaException,"},{"line_number":3229,"context_line":"                          api._get_port_vnic_info,"},{"line_number":3230,"context_line":"                          self.context, mock_client, test_port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":3231,"context_line":""},{"line_number":3232,"context_line":"    @mock.patch.object(neutronapi, \u0027get_client\u0027, return_value\u003dmock.MagicMock())"},{"line_number":3233,"context_line":"    def test_get_port_vnic_info_1(self, mock_get_client):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_59dcc445","line":3230,"in_reply_to":"3f044301_d6aae417","updated":"2017-05-04 03:05:03.000000000","message":"Heh, right, that was stupid of me :)","commit_id":"5ae4f943d3d6b873210acbf2827d20d40b934164"}],"releasenotes/notes/retrieve_physical_network_from_multi-segment-eec5a490c1ed8739.yaml":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f77767a33d08de9aef3e2490f9f41a62f8edd912","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - Physical network name will be retrieved from a multi-segement network."},{"line_number":4,"context_line":"    The current implementation will retrieve the physical network name for the"},{"line_number":5,"context_line":"    first segment that provides it. This is mostly intended to support a"},{"line_number":6,"context_line":"    combinatin of vxlan and vlan segments. Additional work will be required to"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"3f044301_ae6499ba","line":3,"range":{"start_line":3,"start_character":57,"end_line":3,"end_character":65},"updated":"2017-05-04 08:25:58.000000000","message":"nit: segment","commit_id":"b9d9d96a407db5a2adde3aed81e61cc9589c291a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f77767a33d08de9aef3e2490f9f41a62f8edd912","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - Physical network name will be retrieved from a multi-segement network."},{"line_number":4,"context_line":"    The current implementation will retrieve the physical network name for the"},{"line_number":5,"context_line":"    first segment that provides it. This is mostly intended to support a"},{"line_number":6,"context_line":"    combinatin of vxlan and vlan segments. Additional work will be required to"},{"line_number":7,"context_line":"    support a case of multiple vlan segments associated with different"},{"line_number":8,"context_line":"    physical networks."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"3f044301_4e73d581","line":6,"range":{"start_line":6,"start_character":4,"end_line":6,"end_character":14},"updated":"2017-05-04 08:25:58.000000000","message":"combination","commit_id":"b9d9d96a407db5a2adde3aed81e61cc9589c291a"}]}
