)]}'
{"nova/virt/ironic/driver.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"7be357724dc4439ff6589b026698c15f4a5e79aa","unresolved":false,"context_lines":[{"line_number":1323,"context_line":"        :raise nova.exception.NovaException: If the attach fails."},{"line_number":1324,"context_line":"        :return: None"},{"line_number":1325,"context_line":"        \"\"\""},{"line_number":1326,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1327,"context_line":""},{"line_number":1328,"context_line":"    def detach_interface(self, context, instance, vif):"},{"line_number":1329,"context_line":"        \"\"\"Use hotunplug to remove a network interface from a running instance."}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_8e7b7979","line":1326,"updated":"2017-05-23 16:52:22.000000000","message":"This patch looks good to me, although IIRC we were discussing at some point that we can\u0027t push the information about a new vif to instance, I suppose it\u0027s not the case for libvirt, but for ironic virt driver I\u0027m not sure if we have another option, maybe update network info and if metadata service is used, tell the user to retrigger cloud-init? If we use configdrive only, dunno if we have any options here.","commit_id":"8c4ed358a455ccac8645822f2871ed033e941779"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"20a1ae648a91ecb71a5e27416829a8dcc2ff1072","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1327,"context_line":"        # If we have attached the VIF to a port group, ironic might have"},{"line_number":1328,"context_line":"        # updated the VIF address, need to check this in neutron"},{"line_number":1329,"context_line":"        instance_info_cache \u003d objects.InstanceInfoCache.get_by_instance_uuid("},{"line_number":1330,"context_line":"            context, instance.uuid)"},{"line_number":1331,"context_line":"        nw_cache \u003d instance_info_cache.network_info"},{"line_number":1332,"context_line":"        for cached_vif in nw_cache:"},{"line_number":1333,"context_line":"            if cached_vif[\u0027id\u0027] \u003d\u003d vif[\u0027id\u0027]:"},{"line_number":1334,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f231b9d_65791092","line":1331,"range":{"start_line":1329,"start_character":8,"end_line":1331,"end_character":51},"updated":"2017-06-19 20:57:44.000000000","message":"Use instance.get_network_info() here instead.","commit_id":"fb0bdc1a9ddd3f08cfc12bb494fd1dd51cce3383"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"3be93ca663695966cd17748202a786946ac80f50","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1327,"context_line":"        # If we have attached the VIF to a port group, ironic might have"},{"line_number":1328,"context_line":"        # updated the VIF address, need to check this in neutron"},{"line_number":1329,"context_line":"        instance_info_cache \u003d objects.InstanceInfoCache.get_by_instance_uuid("},{"line_number":1330,"context_line":"            context, instance.uuid)"},{"line_number":1331,"context_line":"        nw_cache \u003d instance_info_cache.network_info"},{"line_number":1332,"context_line":"        for cached_vif in nw_cache:"},{"line_number":1333,"context_line":"            if cached_vif[\u0027id\u0027] \u003d\u003d vif[\u0027id\u0027]:"},{"line_number":1334,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f201791_7f698323","line":1331,"range":{"start_line":1329,"start_character":8,"end_line":1331,"end_character":51},"in_reply_to":"5f201791_1fbccfda","updated":"2017-06-21 11:57:46.000000000","message":"Ah, I guess you meant just\n\n network_info \u003d instance.info_cache.network_info\n\nthanks!","commit_id":"fb0bdc1a9ddd3f08cfc12bb494fd1dd51cce3383"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"d0342bd5a57d1a2bfbfd04bdc16bf3ef415ededd","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1327,"context_line":"        # If we have attached the VIF to a port group, ironic might have"},{"line_number":1328,"context_line":"        # updated the VIF address, need to check this in neutron"},{"line_number":1329,"context_line":"        instance_info_cache \u003d objects.InstanceInfoCache.get_by_instance_uuid("},{"line_number":1330,"context_line":"            context, instance.uuid)"},{"line_number":1331,"context_line":"        nw_cache \u003d instance_info_cache.network_info"},{"line_number":1332,"context_line":"        for cached_vif in nw_cache:"},{"line_number":1333,"context_line":"            if cached_vif[\u0027id\u0027] \u003d\u003d vif[\u0027id\u0027]:"},{"line_number":1334,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f201791_1fbccfda","line":1331,"range":{"start_line":1329,"start_character":8,"end_line":1331,"end_character":51},"in_reply_to":"7f231b9d_65791092","updated":"2017-06-21 11:56:05.000000000","message":"Do you mean doing network_api.get_instance_nw_info? Can\u0027t find get_network_info method for the instance. My concern with that was, it updates all the info, while we can do only one request as we know exactly what change to look for.","commit_id":"fb0bdc1a9ddd3f08cfc12bb494fd1dd51cce3383"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"ddb642d21eb0bba546bb781ea5e695cb681255dc","unresolved":false,"context_lines":[{"line_number":1337,"context_line":"                except exception.NovaException as e:"},{"line_number":1338,"context_line":"                    LOG.warning(\u0027Could not fetch VIF information from \u0027"},{"line_number":1339,"context_line":"                                \u0027neutron to update network info cache, error \u0027"},{"line_number":1340,"context_line":"                                \u0027was: %s\u0027, e)"},{"line_number":1341,"context_line":"                else:"},{"line_number":1342,"context_line":"                    if cached_vif[\u0027address\u0027] !\u003d up_to_date_port[\u0027address\u0027]:"},{"line_number":1343,"context_line":"                        cached_vif[\u0027address\u0027] \u003d up_to_date_port[\u0027address\u0027]"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f231b9d_0b5ffc0e","line":1340,"updated":"2017-06-20 10:24:41.000000000","message":"It\u0027s not fully clear the logic here for me.\nWe are trying to get port info, but if it fails we just give up and if it\u0027s success we check the conditions and save cache.\n\nSo if network api fails we are ending up with the wrong cache?\nA warning is about the things that operators could change what they can do in this situation, LOG.exception maybe?","commit_id":"fb0bdc1a9ddd3f08cfc12bb494fd1dd51cce3383"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"d0342bd5a57d1a2bfbfd04bdc16bf3ef415ededd","unresolved":false,"context_lines":[{"line_number":1337,"context_line":"                except exception.NovaException as e:"},{"line_number":1338,"context_line":"                    LOG.warning(\u0027Could not fetch VIF information from \u0027"},{"line_number":1339,"context_line":"                                \u0027neutron to update network info cache, error \u0027"},{"line_number":1340,"context_line":"                                \u0027was: %s\u0027, e)"},{"line_number":1341,"context_line":"                else:"},{"line_number":1342,"context_line":"                    if cached_vif[\u0027address\u0027] !\u003d up_to_date_port[\u0027address\u0027]:"},{"line_number":1343,"context_line":"                        cached_vif[\u0027address\u0027] \u003d up_to_date_port[\u0027address\u0027]"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f201791_df98976b","line":1340,"in_reply_to":"7f231b9d_0b5ffc0e","updated":"2017-06-21 11:56:05.000000000","message":"Correct. Most of the deployments use config drive, and if they were using metadata, a user would still have to do actions manually to say cloud-init to re-read the info from the metadata service. So I thought it would be not worth to fail the attachment if the get request here failed. Can switch to LOG.error though.","commit_id":"fb0bdc1a9ddd3f08cfc12bb494fd1dd51cce3383"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"20a1ae648a91ecb71a5e27416829a8dcc2ff1072","unresolved":false,"context_lines":[{"line_number":1342,"context_line":"                    if cached_vif[\u0027address\u0027] !\u003d up_to_date_port[\u0027address\u0027]:"},{"line_number":1343,"context_line":"                        cached_vif[\u0027address\u0027] \u003d up_to_date_port[\u0027address\u0027]"},{"line_number":1344,"context_line":"                        instance_info_cache.network_info \u003d nw_cache"},{"line_number":1345,"context_line":"                        instance_info_cache.save()"},{"line_number":1346,"context_line":"                break"},{"line_number":1347,"context_line":""},{"line_number":1348,"context_line":"    def detach_interface(self, context, instance, vif):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f231b9d_05f7fcd6","line":1345,"updated":"2017-06-19 20:57:44.000000000","message":"We generally refresh the cache with a lock held using:\n\nhttps://github.com/openstack/nova/blob/ac41395f11002c09e7cd1c4a26632e73bc1bc952/nova/network/base_api.py#L56\n\nOr inline:\n\nhttps://github.com/openstack/nova/blob/ac41395f11002c09e7cd1c4a26632e73bc1bc952/nova/network/neutronv2/api.py#L2047\n\nOf course we\u0027re not very good about being consistent - this updates the cache without the lock held:\n\nhttps://github.com/openstack/nova/blob/ac41395f11002c09e7cd1c4a26632e73bc1bc952/nova/compute/manager.py#L6816","commit_id":"fb0bdc1a9ddd3f08cfc12bb494fd1dd51cce3383"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"d0342bd5a57d1a2bfbfd04bdc16bf3ef415ededd","unresolved":false,"context_lines":[{"line_number":1342,"context_line":"                    if cached_vif[\u0027address\u0027] !\u003d up_to_date_port[\u0027address\u0027]:"},{"line_number":1343,"context_line":"                        cached_vif[\u0027address\u0027] \u003d up_to_date_port[\u0027address\u0027]"},{"line_number":1344,"context_line":"                        instance_info_cache.network_info \u003d nw_cache"},{"line_number":1345,"context_line":"                        instance_info_cache.save()"},{"line_number":1346,"context_line":"                break"},{"line_number":1347,"context_line":""},{"line_number":1348,"context_line":"    def detach_interface(self, context, instance, vif):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f201791_3ff0ab90","line":1345,"in_reply_to":"7f231b9d_05f7fcd6","updated":"2017-06-21 11:56:05.000000000","message":"Good point, will do.","commit_id":"fb0bdc1a9ddd3f08cfc12bb494fd1dd51cce3383"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5304b7f86326d5a768727d223b1cf1e19bec82a5","unresolved":false,"context_lines":[{"line_number":1307,"context_line":""},{"line_number":1308,"context_line":"    def attach_interface(self, context, instance, image_meta, vif):"},{"line_number":1309,"context_line":"        \"\"\"Use hotplug to add a network interface to a running instance."},{"line_number":1310,"context_line":"        The counter action to this is :func:`detach_interface`."},{"line_number":1311,"context_line":"        :param context: The request context."},{"line_number":1312,"context_line":"        :param nova.objects.instance.Instance instance:"},{"line_number":1313,"context_line":"            The instance which will get an additional network interface."}],"source_content_type":"text/x-python","patch_set":15,"id":"5f201791_bc066551","line":1310,"updated":"2017-06-27 14:23:33.000000000","message":"nit, don\u0027t we tend to add a blank line after L1309?","commit_id":"ff5046e36103ff14d3cebe3dd9f2ce81a5568203"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5304b7f86326d5a768727d223b1cf1e19bec82a5","unresolved":false,"context_lines":[{"line_number":1313,"context_line":"            The instance which will get an additional network interface."},{"line_number":1314,"context_line":"        :param nova.objects.ImageMeta image_meta:"},{"line_number":1315,"context_line":"            The metadata of the image of the instance."},{"line_number":1316,"context_line":"        :param nova.network.model.NetworkInfo vif:"},{"line_number":1317,"context_line":"            The object which has the information about the interface to attach."},{"line_number":1318,"context_line":"        :raise nova.exception.NovaException: If the attach fails."},{"line_number":1319,"context_line":"        :return: None"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f201791_07e622e9","line":1316,"updated":"2017-06-27 14:23:33.000000000","message":"this should be s/NetworkInfo/VIF/","commit_id":"ff5046e36103ff14d3cebe3dd9f2ce81a5568203"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"09f92188d474f1002be752cd362c543c2b01bdd2","unresolved":false,"context_lines":[{"line_number":1313,"context_line":"            The instance which will get an additional network interface."},{"line_number":1314,"context_line":"        :param nova.objects.ImageMeta image_meta:"},{"line_number":1315,"context_line":"            The metadata of the image of the instance."},{"line_number":1316,"context_line":"        :param nova.network.model.NetworkInfo vif:"},{"line_number":1317,"context_line":"            The object which has the information about the interface to attach."},{"line_number":1318,"context_line":"        :raise nova.exception.NovaException: If the attach fails."},{"line_number":1319,"context_line":"        :return: None"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_29e839b2","line":1316,"in_reply_to":"5f201791_07e622e9","updated":"2017-07-03 12:20:15.000000000","message":"Yeah, tho it says nova.network.model.NetworkInfo vif :) will change if there are more things to fix, or in a followup","commit_id":"ff5046e36103ff14d3cebe3dd9f2ce81a5568203"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5304b7f86326d5a768727d223b1cf1e19bec82a5","unresolved":false,"context_lines":[{"line_number":1334,"context_line":"                    except exception.NovaException as e:"},{"line_number":1335,"context_line":"                        LOG.error(\u0027Could not fetch VIF information from \u0027"},{"line_number":1336,"context_line":"                                  \u0027neutron to update network info cache, \u0027"},{"line_number":1337,"context_line":"                                  \u0027error was: %s\u0027, e)"},{"line_number":1338,"context_line":"                    else:"},{"line_number":1339,"context_line":"                        if cached_vif[\u0027address\u0027] !\u003d up_to_date_port[\u0027address\u0027]:"},{"line_number":1340,"context_line":"                            cached_vif[\u0027address\u0027] \u003d up_to_date_port[\u0027address\u0027]"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f201791_0245f06f","line":1337,"updated":"2017-06-27 14:23:33.000000000","message":"do we know if the error will always have the VIF ID in it? If not, maybe we should explicitly mention it. (It may, I\u0027m just too lazy to look.)","commit_id":"ff5046e36103ff14d3cebe3dd9f2ce81a5568203"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"09f92188d474f1002be752cd362c543c2b01bdd2","unresolved":false,"context_lines":[{"line_number":1334,"context_line":"                    except exception.NovaException as e:"},{"line_number":1335,"context_line":"                        LOG.error(\u0027Could not fetch VIF information from \u0027"},{"line_number":1336,"context_line":"                                  \u0027neutron to update network info cache, \u0027"},{"line_number":1337,"context_line":"                                  \u0027error was: %s\u0027, e)"},{"line_number":1338,"context_line":"                    else:"},{"line_number":1339,"context_line":"                        if cached_vif[\u0027address\u0027] !\u003d up_to_date_port[\u0027address\u0027]:"},{"line_number":1340,"context_line":"                            cached_vif[\u0027address\u0027] \u003d up_to_date_port[\u0027address\u0027]"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_299a7962","line":1337,"in_reply_to":"5f201791_0245f06f","updated":"2017-07-03 12:20:15.000000000","message":"Yes, it is printed.","commit_id":"ff5046e36103ff14d3cebe3dd9f2ce81a5568203"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5304b7f86326d5a768727d223b1cf1e19bec82a5","unresolved":false,"context_lines":[{"line_number":1345,"context_line":""},{"line_number":1346,"context_line":"    def detach_interface(self, context, instance, vif):"},{"line_number":1347,"context_line":"        \"\"\"Use hotunplug to remove a network interface from a running instance."},{"line_number":1348,"context_line":"        The counter action to this is :func:`attach_interface`."},{"line_number":1349,"context_line":"        :param context: The request context."},{"line_number":1350,"context_line":"        :param nova.objects.instance.Instance instance:"},{"line_number":1351,"context_line":"            The instance which gets a network interface removed."}],"source_content_type":"text/x-python","patch_set":15,"id":"5f201791_675dd613","line":1348,"updated":"2017-06-27 14:23:33.000000000","message":"ditto about blank line","commit_id":"ff5046e36103ff14d3cebe3dd9f2ce81a5568203"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5304b7f86326d5a768727d223b1cf1e19bec82a5","unresolved":false,"context_lines":[{"line_number":1349,"context_line":"        :param context: The request context."},{"line_number":1350,"context_line":"        :param nova.objects.instance.Instance instance:"},{"line_number":1351,"context_line":"            The instance which gets a network interface removed."},{"line_number":1352,"context_line":"        :param nova.network.model.NetworkInfo vif:"},{"line_number":1353,"context_line":"            The object which has the information about the interface to detach."},{"line_number":1354,"context_line":"        :raise nova.exception.NovaException: If the detach fails."},{"line_number":1355,"context_line":"        :return: None"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f201791_07ff4267","line":1352,"updated":"2017-06-27 14:23:33.000000000","message":"s/NetworkInfo/VIF/","commit_id":"ff5046e36103ff14d3cebe3dd9f2ce81a5568203"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a6c99db8da1f13f4f6fb7374cf34bca6f0ff4b67","unresolved":false,"context_lines":[{"line_number":1321,"context_line":"        \"\"\""},{"line_number":1322,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"        # If we have attached the VIF, ironic have updated some fields in"},{"line_number":1325,"context_line":"        # neutron, make corresponding changes to network info cache"},{"line_number":1326,"context_line":"        @base_network_api.refresh_cache"},{"line_number":1327,"context_line":"        def _update_cache(self, context, instance, vif):"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_1ff2cb9a","line":1324,"updated":"2017-07-06 19:39:12.000000000","message":"nit s/ironic have/ironic has/","commit_id":"1aeabc8ca19ae50e547f52123c6088afd8aefdf7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a04cbe2fa3631ab0b076585dca8693d731195945","unresolved":false,"context_lines":[{"line_number":1321,"context_line":"        \"\"\""},{"line_number":1322,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"        # If we have attached the VIF, ironic have updated some fields in"},{"line_number":1325,"context_line":"        # neutron, make corresponding changes to network info cache"},{"line_number":1326,"context_line":"        @base_network_api.refresh_cache"},{"line_number":1327,"context_line":"        def _update_cache(self, context, instance, vif):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1f1a1f67_57da7a77","line":1324,"in_reply_to":"1f1a1f67_17440246","updated":"2017-07-19 02:39:22.000000000","message":"\u003e So why isn\u0027t this sufficient?\n\nI guess because of the comment above this code, that when plugging the VIFs, Ironic is updating something in Neutron and now we need to get that information back into the instance nw info cache in Nova.\n\nSo it goes like:\n\nNova \u003e Ironic \u003e Neutron \u003e Nova\n\nAnd I would expect the last part to be the network-vif-plugged event or network-changed event in Neutron notifying Nova to refresh the cache.\n\nNow if we got a network-vif-plugged event and weren\u0027t waiting for it, then we probably go here:\n\nhttps://github.com/openstack/nova/blob/776df5c759f1fc0ceb80fa7294b1c891817bb504/nova/compute/manager.py#L6925\n\nAnd then we don\u0027t refresh the cache...maybe that\u0027s the issue. Do you see that warning show up when you test this?","commit_id":"1aeabc8ca19ae50e547f52123c6088afd8aefdf7"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2198b96db9bd7ba5bd0d8fa308f82185710d6815","unresolved":false,"context_lines":[{"line_number":1321,"context_line":"        \"\"\""},{"line_number":1322,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"        # If we have attached the VIF, ironic have updated some fields in"},{"line_number":1325,"context_line":"        # neutron, make corresponding changes to network info cache"},{"line_number":1326,"context_line":"        @base_network_api.refresh_cache"},{"line_number":1327,"context_line":"        def _update_cache(self, context, instance, vif):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1f1a1f67_b82f9a3d","line":1324,"in_reply_to":"1f1a1f67_533d0ec2","updated":"2017-07-18 12:20:08.000000000","message":"I suspect it is okay to rely upon the task. I doubt the cache will be needed immediately by any user or automated driven operation.","commit_id":"1aeabc8ca19ae50e547f52123c6088afd8aefdf7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"e8e1c4c1b16aff35c8e52ba202077ebbd4b2446f","unresolved":false,"context_lines":[{"line_number":1321,"context_line":"        \"\"\""},{"line_number":1322,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"        # If we have attached the VIF, ironic have updated some fields in"},{"line_number":1325,"context_line":"        # neutron, make corresponding changes to network info cache"},{"line_number":1326,"context_line":"        @base_network_api.refresh_cache"},{"line_number":1327,"context_line":"        def _update_cache(self, context, instance, vif):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1f1a1f67_7206a454","line":1324,"in_reply_to":"1f1a1f67_57da7a77","updated":"2017-07-19 03:53:37.000000000","message":"yup, that\u0027s what\u0027s happening if I remember correctly, the update that ironic does after allocate ports for instance does not get handled by that logic as we don\u0027t wait for any event for that instance. but the heal info cache task seems to do the proper update afterwards.\n\nI\u0027m out for vacation for today and tomorrow, so will only be able to give the answers for sure on Friday, unless Vasyl picks it up until then.","commit_id":"1aeabc8ca19ae50e547f52123c6088afd8aefdf7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"3c91fafa4293d439a15760062933118731831120","unresolved":false,"context_lines":[{"line_number":1321,"context_line":"        \"\"\""},{"line_number":1322,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"        # If we have attached the VIF, ironic have updated some fields in"},{"line_number":1325,"context_line":"        # neutron, make corresponding changes to network info cache"},{"line_number":1326,"context_line":"        @base_network_api.refresh_cache"},{"line_number":1327,"context_line":"        def _update_cache(self, context, instance, vif):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1f1a1f67_533d0ec2","line":1324,"in_reply_to":"1f1a1f67_6ddf0b3a","updated":"2017-07-18 09:55:14.000000000","message":"Doh, seems like I was testing it with instance cache healing disabled (or it was hanging?). when it is enabled, all the info that comes from neutron is added during the periodic task run. Same for detach interface. Is it OK to rely on this periodic task and not update the cache here?","commit_id":"1aeabc8ca19ae50e547f52123c6088afd8aefdf7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"55676e07bf323990b383e3a9e719cacb7cb06f16","unresolved":false,"context_lines":[{"line_number":1321,"context_line":"        \"\"\""},{"line_number":1322,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"        # If we have attached the VIF, ironic have updated some fields in"},{"line_number":1325,"context_line":"        # neutron, make corresponding changes to network info cache"},{"line_number":1326,"context_line":"        @base_network_api.refresh_cache"},{"line_number":1327,"context_line":"        def _update_cache(self, context, instance, vif):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1f1a1f67_87944838","line":1324,"in_reply_to":"1f1a1f67_7206a454","updated":"2017-07-19 17:47:57.000000000","message":"OK, so how about we remove this code and leave a TODO to wait for the network-vif-plugged event and tighten that up in Queens, with something in the support matrix providing a note that for now the cache is refreshed on the timer.\n\nNote that for whatever reason, the attach_interface API is a blocking RPC call from nova-api to nova-compute, so if we did wait for the neutron-vif-plugged event, it would have to be on a separate thread so we don\u0027t block the API and hit a MessagingTimeout exception.","commit_id":"1aeabc8ca19ae50e547f52123c6088afd8aefdf7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"56641b221e4d4db74573df3500a2e2627e3cf777","unresolved":false,"context_lines":[{"line_number":1321,"context_line":"        \"\"\""},{"line_number":1322,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"        # If we have attached the VIF, ironic have updated some fields in"},{"line_number":1325,"context_line":"        # neutron, make corresponding changes to network info cache"},{"line_number":1326,"context_line":"        @base_network_api.refresh_cache"},{"line_number":1327,"context_line":"        def _update_cache(self, context, instance, vif):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1f1a1f67_28edfc24","line":1324,"in_reply_to":"1f1a1f67_87944838","updated":"2017-07-21 12:44:05.000000000","message":"Having checked this, the network-vif-plugged event gets ignored, but the network-changed event does not, and it does update the cache. Sorry for all this noise :( The reason I thought the cache does not get updated was the fact that network-changed event sometimes takes a bit of time to arrive, but that might be because of the networking-generic-switch.\n\nRegarding the vif-plugged/unplugged events, not sure we should be waiting for them in nova, ironic triggers neutron to do this, so might be better to wait for them on ironic side. There is a spec about that, but it\u0027s not yet implemented.","commit_id":"1aeabc8ca19ae50e547f52123c6088afd8aefdf7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a6565bda99dc9ca19fe907bad5212c7975f39c38","unresolved":false,"context_lines":[{"line_number":1321,"context_line":"        \"\"\""},{"line_number":1322,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"        # If we have attached the VIF, ironic have updated some fields in"},{"line_number":1325,"context_line":"        # neutron, make corresponding changes to network info cache"},{"line_number":1326,"context_line":"        @base_network_api.refresh_cache"},{"line_number":1327,"context_line":"        def _update_cache(self, context, instance, vif):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1f1a1f67_17440246","line":1324,"in_reply_to":"1f1a1f67_98317e5d","updated":"2017-07-19 02:36:03.000000000","message":"\u003e Right, but I don\u0027t see that we actually start waiting for events in the attach_interface flow, will check this once again.\n\nYeah, we don\u0027t explicitly wait for any event. When attaching an interface, the compute manager calls the nova.network.neutronv2.api.API.allocate_port_for_instance method which calls the allocate_for_instance method which at the very end should refresh the cache.\n\nThat all starts here:\n\nhttps://github.com/openstack/nova/blob/776df5c759f1fc0ceb80fa7294b1c891817bb504/nova/compute/manager.py#L5267\n\nAnd the refresh should happen here:\n\nhttps://github.com/openstack/nova/blob/776df5c759f1fc0ceb80fa7294b1c891817bb504/nova/network/neutronv2/api.py#L881\n\nvia\n\nhttps://github.com/openstack/nova/blob/776df5c759f1fc0ceb80fa7294b1c891817bb504/nova/network/base_api.py#L247\n\nSo why isn\u0027t this sufficient?\n\n\u003e Just a thought, unsure if this would effect the existing nova logic that is used to refresh/invalidate the cache, but ironic neutron ports aren\u0027t bound with the host_id \u003d\u003d nova compute host ID, so the neutron nova event notifier wouldn\u0027t send an event to the nova event notifier telling it that the port has been bound. So if the existing logic relies on that event then we need to handle it manually here.\n\nI don\u0027t know enough about the internal logic if when neutron decides to send an event or not, but I thought it was tied more to the port.device_id being set, since neutron doesn\u0027t send anything about the host in the event to the os-server-external-events API, it just sends the instance uuid, port id and event name. Nova API looks up the instance from the DB and determines the compute to RPC cast to for the refresh based on the instance.host value.","commit_id":"1aeabc8ca19ae50e547f52123c6088afd8aefdf7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8490e6d446b61cd8846adc8009b96d81a14a0a9","unresolved":false,"context_lines":[{"line_number":1321,"context_line":"        \"\"\""},{"line_number":1322,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"        # If we have attached the VIF, ironic have updated some fields in"},{"line_number":1325,"context_line":"        # neutron, make corresponding changes to network info cache"},{"line_number":1326,"context_line":"        @base_network_api.refresh_cache"},{"line_number":1327,"context_line":"        def _update_cache(self, context, instance, vif):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1f1a1f67_6ddf0b3a","line":1324,"in_reply_to":"1f1a1f67_9ceaa50c","updated":"2017-07-18 09:10:33.000000000","message":"Right, but I don\u0027t see that we actually start waiting for events in the attach_interface flow, will check this once again.","commit_id":"1aeabc8ca19ae50e547f52123c6088afd8aefdf7"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"c0244a46152c38f53e79b2d9773b28bc76556d98","unresolved":false,"context_lines":[{"line_number":1321,"context_line":"        \"\"\""},{"line_number":1322,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"        # If we have attached the VIF, ironic have updated some fields in"},{"line_number":1325,"context_line":"        # neutron, make corresponding changes to network info cache"},{"line_number":1326,"context_line":"        @base_network_api.refresh_cache"},{"line_number":1327,"context_line":"        def _update_cache(self, context, instance, vif):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1f1a1f67_98317e5d","line":1324,"in_reply_to":"1f1a1f67_b82f9a3d","updated":"2017-07-18 12:30:51.000000000","message":"Just a thought, unsure if this would effect the existing nova logic that is used to refresh/invalidate the cache, but ironic neutron ports aren\u0027t bound with the host_id \u003d\u003d nova compute host ID, so the neutron nova event notifier wouldn\u0027t send an event to the nova event notifier telling it that the port has been bound. So if the existing logic relies on that event then we need to handle it manually here.","commit_id":"1aeabc8ca19ae50e547f52123c6088afd8aefdf7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f8322d8ddc6c775ee8414a345f444fbc27b4ff01","unresolved":false,"context_lines":[{"line_number":1321,"context_line":"        \"\"\""},{"line_number":1322,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"        # If we have attached the VIF, ironic have updated some fields in"},{"line_number":1325,"context_line":"        # neutron, make corresponding changes to network info cache"},{"line_number":1326,"context_line":"        @base_network_api.refresh_cache"},{"line_number":1327,"context_line":"        def _update_cache(self, context, instance, vif):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1f1a1f67_9ceaa50c","line":1324,"in_reply_to":"3f1d235d_1ff2cb9a","updated":"2017-07-17 23:47:40.000000000","message":"So, I should have thought about this earlier, but when port details change on a port associated with a server instance via the port.device_id field, or it\u0027s plugged, neutron should sent a network-changed or network-vif-plugged event to the nova os-server-external-events API, which eventually goes down to the compute manager and should refresh the nw info cache accordingly. Does that not happen with Ironic for some reason? Or do people just not know?\n\nI\u0027d very much rather rely on that existing plumbing to handle this rather than do this weird thing within the virt driver that we don\u0027t have in any other virt driver.\n\nIf for whatever reason the nova\u003c\u003eneutron event callback stuff isn\u0027t working once we plug the VIFs, I\u0027d rather see us do this in the compute manager\u0027s attach_interface method so it\u0027s more generic to all drivers, or we could have this method return a boolean to tell the compute manager if it should refresh the cache, and by default that would be False/None but for Ironic it would be True. I\u0027d rather we *don\u0027t* have to resort to that, because I think the nova/neutron events should be handling this.","commit_id":"1aeabc8ca19ae50e547f52123c6088afd8aefdf7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f8322d8ddc6c775ee8414a345f444fbc27b4ff01","unresolved":false,"context_lines":[{"line_number":1351,"context_line":""},{"line_number":1352,"context_line":"        _update_cache(self, context, instance, vif)"},{"line_number":1353,"context_line":""},{"line_number":1354,"context_line":"    def detach_interface(self, context, instance, vif):"},{"line_number":1355,"context_line":"        \"\"\"Use hotunplug to remove a network interface from a running instance."},{"line_number":1356,"context_line":"        The counter action to this is :func:`attach_interface`."},{"line_number":1357,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1f1a1f67_7cefc91d","line":1354,"updated":"2017-07-17 23:47:40.000000000","message":"Why wouldn\u0027t we have to update the nw info cache for this? But again, the nova\u003c\u003eneutron external events stuff should cover this if that\u0027s working as expected.","commit_id":"1aeabc8ca19ae50e547f52123c6088afd8aefdf7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8490e6d446b61cd8846adc8009b96d81a14a0a9","unresolved":false,"context_lines":[{"line_number":1351,"context_line":""},{"line_number":1352,"context_line":"        _update_cache(self, context, instance, vif)"},{"line_number":1353,"context_line":""},{"line_number":1354,"context_line":"    def detach_interface(self, context, instance, vif):"},{"line_number":1355,"context_line":"        \"\"\"Use hotunplug to remove a network interface from a running instance."},{"line_number":1356,"context_line":"        The counter action to this is :func:`attach_interface`."},{"line_number":1357,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1f1a1f67_cda29fae","line":1354,"in_reply_to":"1f1a1f67_7cefc91d","updated":"2017-07-18 09:10:33.000000000","message":"I don\u0027t think we need to do this, when the device is detached, nova itself should be removing it from instance_info_cache, but again, just like in case of attach it does add it to cache. After removal we don\u0027t care about the interface anymore I suppose :) Will check this to be sure.","commit_id":"1aeabc8ca19ae50e547f52123c6088afd8aefdf7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"92a2525c3a364e252323b9dba59b00022014701c","unresolved":false,"context_lines":[{"line_number":1316,"context_line":"        :raise nova.exception.NovaException: If the attach fails."},{"line_number":1317,"context_line":"        :returns: None"},{"line_number":1318,"context_line":"        \"\"\""},{"line_number":1319,"context_line":"        self.plug_vifs(instance, [vif])"},{"line_number":1320,"context_line":""},{"line_number":1321,"context_line":"    def detach_interface(self, context, instance, vif):"},{"line_number":1322,"context_line":"        \"\"\"Use hotunplug to remove a network interface from a running instance."}],"source_content_type":"text/x-python","patch_set":18,"id":"1f1a1f67_263bed9c","line":1319,"updated":"2017-07-21 13:23:18.000000000","message":"Let\u0027s leave a comment in here explaining that the instance network info cache gets updated asynchronously via the network-changed event from neutron and/or the _heal_instance_info_cache periodic task in the compute service.","commit_id":"150a1bc0afbc0680f3b0fb1c39710cd25fb82343"}],"releasenotes/notes/add-interface-attach-detach-support-in-ironic-cb2bf11f3875350a.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d14a663693b4c0fd0e02e6bab9fe3246c6cd3cb6","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds interface attach/detach support to baremetal nodes using"},{"line_number":5,"context_line":"    ironic virt driver."}],"source_content_type":"text/x-yaml","patch_set":9,"id":"bff0334d_94819892","line":5,"updated":"2017-04-07 11:21:25.000000000","message":"should we mention Ironic version requirements here?","commit_id":"8c4ed358a455ccac8645822f2871ed033e941779"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"274efa99ff6df44cb1929aa3b583c97b14cffd01","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds interface attach/detach support to baremetal nodes using"},{"line_number":5,"context_line":"    ironic virt driver."}],"source_content_type":"text/x-yaml","patch_set":9,"id":"bf091321_c03b0036","line":5,"in_reply_to":"7ffa3b31_c6d8487c","updated":"2017-06-09 03:50:25.000000000","message":"I\u0027m not totally sure I understand why there wasn\u0027t an API version change on the Ironic side either as at least an indication that you could now do something which you couldn\u0027t before. I saw in the Ironic change that there was talk of backporting that change? That seems wrong as it\u0027s a new feature.","commit_id":"8c4ed358a455ccac8645822f2871ed033e941779"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"537145210eb8a83082cce6e6dedf31f0bbea1c03","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds interface attach/detach support to baremetal nodes using"},{"line_number":5,"context_line":"    ironic virt driver."}],"source_content_type":"text/x-yaml","patch_set":9,"id":"7ffa3b31_c6d8487c","line":5,"in_reply_to":"bff0334d_94819892","updated":"2017-04-20 19:33:41.000000000","message":"We didn\u0027t bump ironic api version, as it was allowed previously to attach VIFs to active nodes, we just ensured that ports are bound in this case. So not sure that we should mention here Ironic version. Do we expect that someone will have Pike nova and Ocata Ironic? This combination shouldn\u0027t work, as we have pre-requirement that ironic is upgraded before nova.","commit_id":"8c4ed358a455ccac8645822f2871ed033e941779"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1f256bea28c72057a03c08ae603c0a14a92bcf81","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds interface attach/detach support to baremetal nodes using"},{"line_number":5,"context_line":"    ironic virt driver."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"7f231b9d_07001934","line":4,"updated":"2017-06-10 11:48:02.000000000","message":"Which version of Ironic is needed at a minimum for this to work?\n\nWhy wasn\u0027t there a microversion bump on the Ironic side to signal this capability is available?\n\nDoes the attached interface show up in the network_info metadata via the metadata service API?","commit_id":"f47335cd127fbcf26f47306f137abd56003af9d5"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d6346a0a2725017f887f19dd1f66c24fe7a5380a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds interface attach/detach support to baremetal nodes using"},{"line_number":5,"context_line":"    ironic virt driver."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"7f231b9d_41e4a5ac","line":4,"in_reply_to":"7f231b9d_07001934","updated":"2017-06-12 11:00:47.000000000","message":"Microversion bump 1.28 added the vif attach and detach APIs to Ironic, so the API to do this was put in place (although it was bugged) by that change. Should we have added a microversion to indicate that it was fixed?\n\nRegarding the metadata, from what I can see in the code I believe that if a port is attached using the nova interface attach API, then when you make a request to the metadata service it *should* give you the latest information that nova knows about including the attached neutron port. However the way that the metadata works for baremetal I am unsure if it\u0027ll be in the right format or have the right MAC addresses :/","commit_id":"f47335cd127fbcf26f47306f137abd56003af9d5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eda8f14dabe3d4d6bffa9126c03ea1f8260947a5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds interface attach/detach support to baremetal nodes using"},{"line_number":5,"context_line":"    ironic virt driver."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"7f231b9d_88add5ea","line":4,"in_reply_to":"7f231b9d_41e4a5ac","updated":"2017-06-15 01:03:08.000000000","message":"So here is the issue with the microversion. Nova currently requires Ironic API \u003e\u003d 1.29. Great. The 1.28 API was added in Ocata according to this:\n\nhttps://docs.openstack.org/developer/ironic/dev/webapi-version-history.html\n\nHowever, the depends-on says that this code/feature doesn\u0027t work without https://review.openstack.org/#/c/424723/ which is in Pike. So just saying this works with the 1.28 API doesn\u0027t work if you only have an Ocata Ironic installation. That\u0027s why I thought there would be a version bump to indicate to the client (nova in this case) that the Ironic server it\u0027s talking to is new enough to be able to handle this type of request. Otherwise how does the client know? It could be talking to 1.28 from Ocata or 1.28 from Pike. The release note here says nothing about that either.\n\nSo I think either there needs to be a microversion bump in Ironic to indicate this is fixed and working in the API (that\u0027s the ideal scenario I think), or you\u0027re going to have to backport https://review.openstack.org/#/c/424723/ to Ocata and hope that people deploy it before upgrading Nova to Pike and exposing this feature to their users.\n\nRegardless, the dependency needs to be called out in the release notes either way we go.","commit_id":"f47335cd127fbcf26f47306f137abd56003af9d5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2f06363fe13b76037741431d271c893a5bb8e5ce","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds interface attach/detach support to baremetal nodes using"},{"line_number":5,"context_line":"    ironic virt driver."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"7f231b9d_fedf6037","line":4,"in_reply_to":"7f231b9d_88add5ea","updated":"2017-06-15 05:53:39.000000000","message":"This highlights a limitation of microversions actually. The change was in a driver, and we don\u0027t version changes in drivers. There may be a network driver in Ocata that already implements this feature. I\u0027d vote for a release note only.","commit_id":"f47335cd127fbcf26f47306f137abd56003af9d5"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"5cbc49a97071867618d90469cbd859ecf48dfa93","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds interface attach/detach support to baremetal nodes using"},{"line_number":5,"context_line":"    ironic virt driver."},{"line_number":6,"context_line":"upgrade:"},{"line_number":7,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"3f1d235d_3dfe936b","line":4,"range":{"start_line":4,"start_character":9,"end_line":4,"end_character":18},"updated":"2017-07-07 13:40:39.000000000","message":"nit: Perhaps s/interface/network interface/","commit_id":"1aeabc8ca19ae50e547f52123c6088afd8aefdf7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"92a2525c3a364e252323b9dba59b00022014701c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds interface attach/detach support to baremetal nodes using"},{"line_number":5,"context_line":"    ironic virt driver."},{"line_number":6,"context_line":"upgrade:"},{"line_number":7,"context_line":"  - |"},{"line_number":8,"context_line":"    Interface attachment/detachment for ironic virt driver was implemented in"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"1f1a1f67_e6f615fa","line":5,"range":{"start_line":4,"start_character":4,"end_line":5,"end_character":23},"updated":"2017-07-21 13:23:18.000000000","message":"I feel like we should mention the thing about the asynchronous network-changed event which will refresh the instance network info cache and/or the heal_instance_info_cache periodic task in the compute. In other words, we could mention something to the effect that the attached network changes will not show up immediately in the compute or metadata API after the request is complete, but the changes will be picked up asynchronously. Unless that\u0027s just more confusing than not saying anything at all.","commit_id":"150a1bc0afbc0680f3b0fb1c39710cd25fb82343"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c0cec2d4201a7258a8a17d6dcd4d0545df3b4b7e","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds interface attach/detach support to baremetal nodes using ironic virt"},{"line_number":5,"context_line":"    driver. Note that the instance info cache update relies on getting of a"},{"line_number":6,"context_line":"    ``network-changed`` event from neutron, or on the periodic task healing"},{"line_number":7,"context_line":"    the instance info cache, both of which are asynchronous. This means that"},{"line_number":8,"context_line":"    nova\u0027s cached network information (which is what is sent e.g. in the"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"1f1a1f67_97230906","line":5,"range":{"start_line":5,"start_character":71,"end_line":5,"end_character":73},"updated":"2017-07-21 14:51:03.000000000","message":"s/of//","commit_id":"bb34b55beff7e208eca072f26715a28157256926"}]}
