)]}'
{"nova/compute/manager.py":[{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"b9a31a5af02d68c81e5db41f95d2f16cd4ed8b9b","unresolved":false,"context_lines":[{"line_number":1567,"context_line":"                        macs\u003dmacs,"},{"line_number":1568,"context_line":"                        security_groups\u003dsecurity_groups,"},{"line_number":1569,"context_line":"                        dhcp_options\u003ddhcp_options,"},{"line_number":1570,"context_line":"                        bind_host_id\u003dbind_host_id)"},{"line_number":1571,"context_line":"                LOG.debug(\u0027Instance network_info: |%s|\u0027, nwinfo,"},{"line_number":1572,"context_line":"                          instance\u003dinstance)"},{"line_number":1573,"context_line":"                instance.system_metadata[\u0027network_allocated\u0027] \u003d \u0027True\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_c1698afa","line":1570,"updated":"2016-01-14 19:44:38.000000000","message":"IIUC this is going to affect how we handle networks during a reschedule.  Currently they are left allocated, except for Ironic, and just used by the new host.  This change means we either need to deallocate/reallocate on a reschedule or update the bound host if that\u0027s possible.","commit_id":"0e6e28aed74e8029e394bb16298436a239c7192e"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"e84a8833e8a2916b784fe1334b8fdeee9cc84091","unresolved":false,"context_lines":[{"line_number":1567,"context_line":"                        macs\u003dmacs,"},{"line_number":1568,"context_line":"                        security_groups\u003dsecurity_groups,"},{"line_number":1569,"context_line":"                        dhcp_options\u003ddhcp_options,"},{"line_number":1570,"context_line":"                        bind_host_id\u003dbind_host_id)"},{"line_number":1571,"context_line":"                LOG.debug(\u0027Instance network_info: |%s|\u0027, nwinfo,"},{"line_number":1572,"context_line":"                          instance\u003dinstance)"},{"line_number":1573,"context_line":"                instance.system_metadata[\u0027network_allocated\u0027] \u003d \u0027True\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_74714c0b","line":1570,"in_reply_to":"da6ed579_ad37a04b","updated":"2016-01-15 15:54:20.000000000","message":"I see.  So this will only be sent if the port binding extension is active.  I don\u0027t know if that\u0027s generally true in practice, but this isn\u0027t changing that behavior so this seems fine to me.","commit_id":"0e6e28aed74e8029e394bb16298436a239c7192e"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"d56ac8dea6fd8db74ef45e0072e444ca7f379fda","unresolved":false,"context_lines":[{"line_number":1567,"context_line":"                        macs\u003dmacs,"},{"line_number":1568,"context_line":"                        security_groups\u003dsecurity_groups,"},{"line_number":1569,"context_line":"                        dhcp_options\u003ddhcp_options,"},{"line_number":1570,"context_line":"                        bind_host_id\u003dbind_host_id)"},{"line_number":1571,"context_line":"                LOG.debug(\u0027Instance network_info: |%s|\u0027, nwinfo,"},{"line_number":1572,"context_line":"                          instance\u003dinstance)"},{"line_number":1573,"context_line":"                instance.system_metadata[\u0027network_allocated\u0027] \u003d \u0027True\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_ad37a04b","line":1570,"in_reply_to":"da6ed579_c1698afa","updated":"2016-01-14 22:58:06.000000000","message":"I feel like you\u0027re right, but I don\u0027t understand why this wasn\u0027t a problem before. If we look at line 711 here: https://review.openstack.org/#/c/194413/12/nova/network/neutronv2/api.py\n\nThe host id was sent with the port before this change too.","commit_id":"0e6e28aed74e8029e394bb16298436a239c7192e"}],"nova/network/neutronv2/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4dc3dbfe7b6933ba8bf83541c4fc41c808971cdf","unresolved":false,"context_lines":[{"line_number":629,"context_line":"                reason\u003dmsg % instance.uuid)"},{"line_number":630,"context_line":"        requested_networks \u003d kwargs.get(\u0027requested_networks\u0027)"},{"line_number":631,"context_line":"        dhcp_opts \u003d kwargs.get(\u0027dhcp_options\u0027, None)"},{"line_number":632,"context_line":"        bind_host_id \u003d kwargs.get(\u0027bind_host_id\u0027, None)"},{"line_number":633,"context_line":"        ports, net_ids, ordered_networks, available_macs \u003d ("},{"line_number":634,"context_line":"            self._process_requested_networks(context,"},{"line_number":635,"context_line":"                instance, neutron, requested_networks, hypervisor_macs))"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_8d760605","line":632,"updated":"2015-11-30 20:43:39.000000000","message":"The None default is redundant here.","commit_id":"249fe0f04d6c6e72f1dc21917c4071c72f6fd4b7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"534f152e989071f6fac2dd5122710dfde136719e","unresolved":false,"context_lines":[{"line_number":629,"context_line":"                reason\u003dmsg % instance.uuid)"},{"line_number":630,"context_line":"        requested_networks \u003d kwargs.get(\u0027requested_networks\u0027)"},{"line_number":631,"context_line":"        dhcp_opts \u003d kwargs.get(\u0027dhcp_options\u0027, None)"},{"line_number":632,"context_line":"        bind_host_id \u003d kwargs.get(\u0027bind_host_id\u0027, None)"},{"line_number":633,"context_line":"        ports, net_ids, ordered_networks, available_macs \u003d ("},{"line_number":634,"context_line":"            self._process_requested_networks(context,"},{"line_number":635,"context_line":"                instance, neutron, requested_networks, hypervisor_macs))"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a740942_ffa692ac","line":632,"in_reply_to":"9a8ffd7b_8d760605","updated":"2015-12-08 19:29:16.000000000","message":"Done","commit_id":"249fe0f04d6c6e72f1dc21917c4071c72f6fd4b7"}],"nova/tests/unit/virt/ironic/test_driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4dc3dbfe7b6933ba8bf83541c4fc41c808971cdf","unresolved":false,"context_lines":[{"line_number":1602,"context_line":"        mock_get.return_value \u003d node"},{"line_number":1603,"context_line":""},{"line_number":1604,"context_line":"        host_id \u003d self.driver.network_binding_host_id(self.ctx, instance)"},{"line_number":1605,"context_line":"        self.assertEqual(host_id, expected)"},{"line_number":1606,"context_line":""},{"line_number":1607,"context_line":"    def test_network_binding_host_id_neutron(self):"},{"line_number":1608,"context_line":"        self._test_network_binding_host_id(True)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_404c6576","line":1605,"updated":"2015-11-30 20:43:39.000000000","message":"Args should be switched (expected, observed). It impacts the output message in the case of a failure.","commit_id":"249fe0f04d6c6e72f1dc21917c4071c72f6fd4b7"}],"nova/tests/unit/virt/test_virt_drivers.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4dc3dbfe7b6933ba8bf83541c4fc41c808971cdf","unresolved":false,"context_lines":[{"line_number":788,"context_line":"        self.connection.get_device_name_for_instance("},{"line_number":789,"context_line":"            instance, [], mock.Mock(spec\u003dobjects.BlockDeviceMapping))"},{"line_number":790,"context_line":""},{"line_number":791,"context_line":"    @catch_notimplementederror"},{"line_number":792,"context_line":"    def test_network_binding_host_id(self):"},{"line_number":793,"context_line":"        instance, _ \u003d self._get_running_instance()"},{"line_number":794,"context_line":"        self.assertEqual(instance.host,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_a019917b","line":791,"updated":"2015-11-30 20:43:39.000000000","message":"You shouldn\u0027t have a NotImplementedError from this since the base class returns a default value.","commit_id":"249fe0f04d6c6e72f1dc21917c4071c72f6fd4b7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"534f152e989071f6fac2dd5122710dfde136719e","unresolved":false,"context_lines":[{"line_number":788,"context_line":"        self.connection.get_device_name_for_instance("},{"line_number":789,"context_line":"            instance, [], mock.Mock(spec\u003dobjects.BlockDeviceMapping))"},{"line_number":790,"context_line":""},{"line_number":791,"context_line":"    @catch_notimplementederror"},{"line_number":792,"context_line":"    def test_network_binding_host_id(self):"},{"line_number":793,"context_line":"        instance, _ \u003d self._get_running_instance()"},{"line_number":794,"context_line":"        self.assertEqual(instance.host,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a740942_1fe6fe14","line":791,"in_reply_to":"9a8ffd7b_a019917b","updated":"2015-12-08 19:29:16.000000000","message":"Done","commit_id":"249fe0f04d6c6e72f1dc21917c4071c72f6fd4b7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7236025f7c87d70443c10c723df46e3e95a1c4a7","unresolved":false,"context_lines":[{"line_number":792,"context_line":"        # NOTE(jroll) self._get_running_instance calls spawn(), so we can\u0027t"},{"line_number":793,"context_line":"        # use it to test this method. Make a simple dict instead; we just"},{"line_number":794,"context_line":"        # need instance.get(\u0027host\u0027)."},{"line_number":795,"context_line":"        instance \u003d {\u0027host\u0027: \u0027somehost\u0027}"},{"line_number":796,"context_line":"        self.assertEqual(instance[\u0027host\u0027],"},{"line_number":797,"context_line":"            self.connection.network_binding_host_id(self.ctxt, instance))"},{"line_number":798,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1a7b0d38_5777243a","line":795,"updated":"2015-12-24 02:31:02.000000000","message":"This should probably at least be an instance object. So:\n\ninstance \u003d objects.Instance(self.ctxt, host\u003d\u0027somehost\u0027)\n\nAnd then:\n\nself.assertEqual(instance.host, ...)","commit_id":"83bdb69aaefffe840f6c5d449d5a80e0e4f3bda2"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"f2dba0fe6baf19de5f07e6d41c50a58fdfa67f7c","unresolved":false,"context_lines":[{"line_number":792,"context_line":"        # NOTE(jroll) self._get_running_instance calls spawn(), so we can\u0027t"},{"line_number":793,"context_line":"        # use it to test this method. Make a simple dict instead; we just"},{"line_number":794,"context_line":"        # need instance.get(\u0027host\u0027)."},{"line_number":795,"context_line":"        instance \u003d {\u0027host\u0027: \u0027somehost\u0027}"},{"line_number":796,"context_line":"        self.assertEqual(instance[\u0027host\u0027],"},{"line_number":797,"context_line":"            self.connection.network_binding_host_id(self.ctxt, instance))"},{"line_number":798,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1a7b0d38_f96a70ed","line":795,"in_reply_to":"1a7b0d38_5777243a","updated":"2015-12-28 19:20:31.000000000","message":"Good point, thanks.","commit_id":"83bdb69aaefffe840f6c5d449d5a80e0e4f3bda2"}],"nova/virt/ironic/driver.py":[{"author":{"_account_id":6558,"name":"Sukhdev Kapur","email":"sukhdevkapur@gmail.com","username":"sukhdev-8"},"change_message_id":"af3ed687c99cedad1d5f3b71ca55c58eb562cfb2","unresolved":false,"context_lines":[{"line_number":1173,"context_line":"    def network_bind_host_id(self, context, instance):"},{"line_number":1174,"context_line":"        node_uuid \u003d instance.node"},{"line_number":1175,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", node_uuid)"},{"line_number":1176,"context_line":"        if node.get(\u0027network_provider\u0027, \u0027none\u0027) \u003d\u003d \u0027none\u0027:"},{"line_number":1177,"context_line":"            # use old behavior"},{"line_number":1178,"context_line":"            super(IronicDriver, self).network_bind_host_id(context, instance)"},{"line_number":1179,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_7dd886ef","line":1176,"updated":"2015-09-11 21:40:01.000000000","message":"This fails because of wrong number of parameter - see details at the following paste -http://paste.openstack.org/show/457291/","commit_id":"6490dbe33c9c6377978d0b55d7c02441ccbb7403"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7b36d1239eceac085015126b42045732701cf4eb","unresolved":false,"context_lines":[{"line_number":1205,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", node_uuid)"},{"line_number":1206,"context_line":"        if getattr(node, \u0027network_provider\u0027, \u0027none\u0027) \u003d\u003d \u0027none\u0027:"},{"line_number":1207,"context_line":"            # use old behavior"},{"line_number":1208,"context_line":"            super(IronicDriver, self).network_bind_host_id(context, instance)"},{"line_number":1209,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_1166a8ed","line":1208,"updated":"2015-11-24 19:59:15.000000000","message":"I\u0027m assuming you mean to return here...","commit_id":"c043d7dbbb99a07ae65f58e433a6540c50c09e54"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4dc3dbfe7b6933ba8bf83541c4fc41c808971cdf","unresolved":false,"context_lines":[{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":"    def network_binding_host_id(self, context, instance):"},{"line_number":1204,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1205,"context_line":"        if getattr(node, \u0027network_provider\u0027, \u0027none\u0027) \u003d\u003d \u0027none\u0027:"},{"line_number":1206,"context_line":"            # use old behavior"},{"line_number":1207,"context_line":"            return super(IronicDriver, self).network_binding_host_id("},{"line_number":1208,"context_line":"                context, instance)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_6d35e2f5","line":1205,"updated":"2015-11-30 20:43:39.000000000","message":"Is \u0027none\u0027 something that older versions of Ironic would actually return or are you just using it as a flag here?  I\u0027m just wondering if None would be cleaner.","commit_id":"249fe0f04d6c6e72f1dc21917c4071c72f6fd4b7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"534f152e989071f6fac2dd5122710dfde136719e","unresolved":false,"context_lines":[{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":"    def network_binding_host_id(self, context, instance):"},{"line_number":1204,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1205,"context_line":"        if getattr(node, \u0027network_provider\u0027, \u0027none\u0027) \u003d\u003d \u0027none\u0027:"},{"line_number":1206,"context_line":"            # use old behavior"},{"line_number":1207,"context_line":"            return super(IronicDriver, self).network_binding_host_id("},{"line_number":1208,"context_line":"                context, instance)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a740942_df99567a","line":1205,"in_reply_to":"9a8ffd7b_6d35e2f5","updated":"2015-12-08 19:29:16.000000000","message":"\u0027none\u0027 is the name of the driver for the old flat network behavior, unfortunately.","commit_id":"249fe0f04d6c6e72f1dc21917c4071c72f6fd4b7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4dc3dbfe7b6933ba8bf83541c4fc41c808971cdf","unresolved":false,"context_lines":[{"line_number":1206,"context_line":"            # use old behavior"},{"line_number":1207,"context_line":"            return super(IronicDriver, self).network_binding_host_id("},{"line_number":1208,"context_line":"                context, instance)"},{"line_number":1209,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_0d11b65d","line":1209,"updated":"2015-11-30 20:43:39.000000000","message":"Should probably add a comment here on what None means or how it\u0027s used.","commit_id":"249fe0f04d6c6e72f1dc21917c4071c72f6fd4b7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"534f152e989071f6fac2dd5122710dfde136719e","unresolved":false,"context_lines":[{"line_number":1206,"context_line":"            # use old behavior"},{"line_number":1207,"context_line":"            return super(IronicDriver, self).network_binding_host_id("},{"line_number":1208,"context_line":"                context, instance)"},{"line_number":1209,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a740942_dfa716a5","line":1209,"in_reply_to":"9a8ffd7b_0d11b65d","updated":"2015-12-08 19:29:16.000000000","message":"Done","commit_id":"249fe0f04d6c6e72f1dc21917c4071c72f6fd4b7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"e6c2a16b957a083e42dd59817de34eabc40446c8","unresolved":false,"context_lines":[{"line_number":1217,"context_line":"        \"\"\""},{"line_number":1218,"context_line":""},{"line_number":1219,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1220,"context_line":"        if getattr(node, \u0027network_provider\u0027, \u0027none\u0027) \u003d\u003d \u0027none\u0027:"},{"line_number":1221,"context_line":"            # flat network, go ahead and allow the port to be bound"},{"line_number":1222,"context_line":"            return super(IronicDriver, self).network_binding_host_id("},{"line_number":1223,"context_line":"                context, instance)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a7b0d38_223eaab8","line":1220,"updated":"2015-12-25 16:22:13.000000000","message":"Here https://review.openstack.org/#/c/139687/40/ironic/networks/neutron_plugin.py if network_provider is not set, we use the CONF.network_provider value, so It appears that we should change something either in ironic patches or here?","commit_id":"83bdb69aaefffe840f6c5d449d5a80e0e4f3bda2"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"f2dba0fe6baf19de5f07e6d41c50a58fdfa67f7c","unresolved":false,"context_lines":[{"line_number":1217,"context_line":"        \"\"\""},{"line_number":1218,"context_line":""},{"line_number":1219,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1220,"context_line":"        if getattr(node, \u0027network_provider\u0027, \u0027none\u0027) \u003d\u003d \u0027none\u0027:"},{"line_number":1221,"context_line":"            # flat network, go ahead and allow the port to be bound"},{"line_number":1222,"context_line":"            return super(IronicDriver, self).network_binding_host_id("},{"line_number":1223,"context_line":"                context, instance)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a7b0d38_ac0ca83b","line":1220,"in_reply_to":"1a7b0d38_223eaab8","updated":"2015-12-28 19:20:31.000000000","message":"Right, I think the API should return `node.network_provider or CONF.network_provider`, so any API client can know which network provider is in use.","commit_id":"83bdb69aaefffe840f6c5d449d5a80e0e4f3bda2"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"f23bb8f200657ce059d6ede546acc592c25e7f17","unresolved":false,"context_lines":[{"line_number":1219,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1220,"context_line":"        if getattr(node, \u0027network_provider\u0027, \u0027none\u0027) \u003d\u003d \u0027none\u0027:"},{"line_number":1221,"context_line":"            # flat network, go ahead and allow the port to be bound"},{"line_number":1222,"context_line":"            return super(IronicDriver, self).network_binding_host_id("},{"line_number":1223,"context_line":"                context, instance)"},{"line_number":1224,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a740942_4eb29a07","line":1222,"updated":"2015-12-14 12:14:30.000000000","message":"my initial testing suggests that, even in flat provider network case, everything is working fine if ports are never bound for ironic-specific compute (always returning None from this method).\n\nHence the question - why do we have to bind ports to ironic-specific computes even in the flat network case at all? what is going to break if we do not? I naturally might have overlooked something in my testing...","commit_id":"83bdb69aaefffe840f6c5d449d5a80e0e4f3bda2"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"17baad6bda86ef86765ee876c246cebc2e693c46","unresolved":false,"context_lines":[{"line_number":1219,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1220,"context_line":"        if getattr(node, \u0027network_provider\u0027, \u0027none\u0027) \u003d\u003d \u0027none\u0027:"},{"line_number":1221,"context_line":"            # flat network, go ahead and allow the port to be bound"},{"line_number":1222,"context_line":"            return super(IronicDriver, self).network_binding_host_id("},{"line_number":1223,"context_line":"                context, instance)"},{"line_number":1224,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a740942_7ae5cd35","line":1222,"in_reply_to":"7a740942_4eb29a07","updated":"2015-12-14 14:15:51.000000000","message":"The code for ML2 mechanisms to bind the port (i.e. configure networking) isn\u0027t called if host_id is unset, meaning the port should not have connectivity if host_id is unset. Ironic doesn\u0027t set the host_id later, so there will never be connectivity for that port if we don\u0027t set it here.\n\nCurious what your test environment looks like - if it\u0027s devstack, it may just be a quirk where the port can always talk on the bridge.","commit_id":"83bdb69aaefffe840f6c5d449d5a80e0e4f3bda2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7236025f7c87d70443c10c723df46e3e95a1c4a7","unresolved":false,"context_lines":[{"line_number":1221,"context_line":"            # flat network, go ahead and allow the port to be bound"},{"line_number":1222,"context_line":"            return super(IronicDriver, self).network_binding_host_id("},{"line_number":1223,"context_line":"                context, instance)"},{"line_number":1224,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a7b0d38_b7ac4836","line":1224,"updated":"2015-12-24 02:31:02.000000000","message":"I know I asked this in the spec review, but can\u0027t find mention of it or discussion - but now that we\u0027d have async port attach to the instance, while ironic does the port-update, nova is going to continue going and say the instance is active, but it may not actually have a port attached by the time the instance is booted.\n\nFor the libvirt driver we have the port assignment but we wait for the vif plugging event back from neutron. It seems like we\u0027d want something like that here too now if this is more asynchronous.","commit_id":"83bdb69aaefffe840f6c5d449d5a80e0e4f3bda2"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"f2dba0fe6baf19de5f07e6d41c50a58fdfa67f7c","unresolved":false,"context_lines":[{"line_number":1221,"context_line":"            # flat network, go ahead and allow the port to be bound"},{"line_number":1222,"context_line":"            return super(IronicDriver, self).network_binding_host_id("},{"line_number":1223,"context_line":"                context, instance)"},{"line_number":1224,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a7b0d38_8c076c17","line":1224,"in_reply_to":"1a7b0d38_b7ac4836","updated":"2015-12-28 19:20:31.000000000","message":"So, the Nova-\u003eIronic \"deploy\" API is async, so this is async from Nova\u0027s perspective. However, the Ironic-\u003eNeutron port-update API is syncronous. So, Ironic won\u0027t put the node into ACTIVE state until the port-update is complete, which is what Nova waits for to decide if the instance is active.\n\nThat\u0027s wordy, but tl;dr we\u0027re guaranteed to have the port attached by the time Ironic tells Nova the instance is active.","commit_id":"83bdb69aaefffe840f6c5d449d5a80e0e4f3bda2"}]}
