)]}'
{"nova/compute/api.py":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"c5e94f9227354f93aa61619eb6d2b9a55cbfcc5c","unresolved":false,"context_lines":[{"line_number":780,"context_line":""},{"line_number":781,"context_line":"        for bdm in block_device_mapping:"},{"line_number":782,"context_line":"            if \u0027tag\u0027 not in bdm:"},{"line_number":783,"context_line":"                bdm[\u0027tag\u0027] \u003d None"},{"line_number":784,"context_line":""},{"line_number":785,"context_line":"        return block_device_obj.block_device_make_list_from_dicts("},{"line_number":786,"context_line":"                context, block_device_mapping)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba0121b8_9414dc44","line":783,"updated":"2016-03-29 17:54:20.000000000","message":"I\u0027m unclear why we want this. Usually we aim to not set an object attribute at all, rather than setting it to None","commit_id":"3ed054f07375cf9a6a08068952937f346301be5b"}],"nova/compute/manager.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"0621389fe2e331ababa47d2133f4a601ac2a8768","unresolved":false,"context_lines":[{"line_number":1578,"context_line":""},{"line_number":1579,"context_line":"                if requested_networks is not None:"},{"line_number":1580,"context_line":"                    for req_net in requested_networks:"},{"line_number":1581,"context_line":"                        if hasattr(req_net, \u0027tag\u0027) and req_net.tag is not None:"},{"line_number":1582,"context_line":"                            for vif in nwinfo:"},{"line_number":1583,"context_line":"                                if vif[\u0027network\u0027][\u0027id\u0027] \u003d\u003d req_net.network_id:"},{"line_number":1584,"context_line":"                                    vif_tag \u003d objects.VirtualInterfaceTag("}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_4a906143","line":1581,"range":{"start_line":1581,"start_character":28,"end_line":1581,"end_character":35},"updated":"2016-01-11 15:42:52.000000000","message":"I think you want to use obj_attr_is_set here instead","commit_id":"db5be4d42bb514356e3947971e87db35437c8d7a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"216c7ed47b69a01de803dc34aee12eb89bcf28c0","unresolved":false,"context_lines":[{"line_number":1578,"context_line":""},{"line_number":1579,"context_line":"                if requested_networks is not None:"},{"line_number":1580,"context_line":"                    for req_net in requested_networks:"},{"line_number":1581,"context_line":"                        if hasattr(req_net, \u0027tag\u0027) and req_net.tag is not None:"},{"line_number":1582,"context_line":"                            for vif in nwinfo:"},{"line_number":1583,"context_line":"                                if vif[\u0027network\u0027][\u0027id\u0027] \u003d\u003d req_net.network_id:"},{"line_number":1584,"context_line":"                                    vif_tag \u003d objects.VirtualInterfaceTag("}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_df372afc","line":1581,"range":{"start_line":1581,"start_character":28,"end_line":1581,"end_character":35},"in_reply_to":"fa69d971_4a906143","updated":"2016-01-11 19:05:16.000000000","message":"Done","commit_id":"db5be4d42bb514356e3947971e87db35437c8d7a"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"0621389fe2e331ababa47d2133f4a601ac2a8768","unresolved":false,"context_lines":[{"line_number":1576,"context_line":"                # for this async greenthread to finish before calling"},{"line_number":1577,"context_line":"                # instance.save()."},{"line_number":1578,"context_line":""},{"line_number":1579,"context_line":"                if requested_networks is not None:"},{"line_number":1580,"context_line":"                    for req_net in requested_networks:"},{"line_number":1581,"context_line":"                        if hasattr(req_net, \u0027tag\u0027) and req_net.tag is not None:"},{"line_number":1582,"context_line":"                            for vif in nwinfo:"},{"line_number":1583,"context_line":"                                if vif[\u0027network\u0027][\u0027id\u0027] \u003d\u003d req_net.network_id:"},{"line_number":1584,"context_line":"                                    vif_tag \u003d objects.VirtualInterfaceTag("},{"line_number":1585,"context_line":"                                        context)"},{"line_number":1586,"context_line":"                                    vif_tag.address \u003d vif[\u0027address\u0027]"},{"line_number":1587,"context_line":"                                    vif_tag.instance_uuid \u003d instance.uuid"},{"line_number":1588,"context_line":"                                    vif_tag.tag \u003d req_net.tag"},{"line_number":1589,"context_line":"                                    vif_tag.create()"},{"line_number":1590,"context_line":""},{"line_number":1591,"context_line":"                return nwinfo"},{"line_number":1592,"context_line":"            except Exception:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_ca73f17e","line":1589,"range":{"start_line":1579,"start_character":16,"end_line":1589,"end_character":52},"updated":"2016-01-11 15:42:52.000000000","message":"this could be a separate function/method just for better code organization.","commit_id":"db5be4d42bb514356e3947971e87db35437c8d7a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"216c7ed47b69a01de803dc34aee12eb89bcf28c0","unresolved":false,"context_lines":[{"line_number":1576,"context_line":"                # for this async greenthread to finish before calling"},{"line_number":1577,"context_line":"                # instance.save()."},{"line_number":1578,"context_line":""},{"line_number":1579,"context_line":"                if requested_networks is not None:"},{"line_number":1580,"context_line":"                    for req_net in requested_networks:"},{"line_number":1581,"context_line":"                        if hasattr(req_net, \u0027tag\u0027) and req_net.tag is not None:"},{"line_number":1582,"context_line":"                            for vif in nwinfo:"},{"line_number":1583,"context_line":"                                if vif[\u0027network\u0027][\u0027id\u0027] \u003d\u003d req_net.network_id:"},{"line_number":1584,"context_line":"                                    vif_tag \u003d objects.VirtualInterfaceTag("},{"line_number":1585,"context_line":"                                        context)"},{"line_number":1586,"context_line":"                                    vif_tag.address \u003d vif[\u0027address\u0027]"},{"line_number":1587,"context_line":"                                    vif_tag.instance_uuid \u003d instance.uuid"},{"line_number":1588,"context_line":"                                    vif_tag.tag \u003d req_net.tag"},{"line_number":1589,"context_line":"                                    vif_tag.create()"},{"line_number":1590,"context_line":""},{"line_number":1591,"context_line":"                return nwinfo"},{"line_number":1592,"context_line":"            except Exception:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_ff3c6ee2","line":1589,"range":{"start_line":1579,"start_character":16,"end_line":1589,"end_character":52},"in_reply_to":"fa69d971_ca73f17e","updated":"2016-01-11 19:05:16.000000000","message":"Done","commit_id":"db5be4d42bb514356e3947971e87db35437c8d7a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"293452f96986af9aa484d21318392a1bf120b739","unresolved":false,"context_lines":[{"line_number":1544,"context_line":"        if self.driver.instance_exists(instance):"},{"line_number":1545,"context_line":"            raise exception.InstanceExists(name\u003dinstance.name)"},{"line_number":1546,"context_line":""},{"line_number":1547,"context_line":"    def _create_vif_tags(self, context, instance, requested_networks, nwinfo):"},{"line_number":1548,"context_line":"        for req_net in requested_networks:"},{"line_number":1549,"context_line":"            if req_net.obj_attr_is_set(\u0027tag\u0027):"},{"line_number":1550,"context_line":"                for vif in nwinfo:"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_e9d79521","line":1547,"updated":"2016-01-11 22:12:09.000000000","message":"Where are the tests for this net method?","commit_id":"1473e7692edd1ab9a341fff1fd076b1d43ea2348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"293452f96986af9aa484d21318392a1bf120b739","unresolved":false,"context_lines":[{"line_number":1554,"context_line":"                        vif_tag.address \u003d vif[\u0027address\u0027]"},{"line_number":1555,"context_line":"                        vif_tag.instance_uuid \u003d instance.uuid"},{"line_number":1556,"context_line":"                        vif_tag.tag \u003d req_net.tag"},{"line_number":1557,"context_line":"                        vif_tag.create()"},{"line_number":1558,"context_line":""},{"line_number":1559,"context_line":"    def _allocate_network_async(self, context, instance, requested_networks,"},{"line_number":1560,"context_line":"                                macs, security_groups, is_vpn, dhcp_options):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_c92bb132","line":1557,"updated":"2016-01-11 22:12:09.000000000","message":"Each one of these ends up being an RPC call to a database call. Assuming some NFVish things might have a lot of these, it seems like we should try to patch these. If we had a save_all() method then that would be a lot better. Of course, if we change to just using VirtualInterface for this (see my comment on the first patch) then that could go on the VirtualInterfaceList object with no real extra modeling work.","commit_id":"1473e7692edd1ab9a341fff1fd076b1d43ea2348"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"293452f96986af9aa484d21318392a1bf120b739","unresolved":false,"context_lines":[{"line_number":1590,"context_line":""},{"line_number":1591,"context_line":"                if requested_networks is not None:"},{"line_number":1592,"context_line":"                    self._create_vif_tags(context, instance,"},{"line_number":1593,"context_line":"                                          requested_networks, nwinfo)"},{"line_number":1594,"context_line":""},{"line_number":1595,"context_line":"                return nwinfo"},{"line_number":1596,"context_line":"            except Exception:"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_49e7c112","line":1593,"updated":"2016-01-11 22:12:09.000000000","message":"Need a test to make sure this gets run.","commit_id":"1473e7692edd1ab9a341fff1fd076b1d43ea2348"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"9127208771c6ebfb2b5e21a761eb9399cb32c883","unresolved":false,"context_lines":[{"line_number":667,"context_line":"class ComputeManager(manager.Manager):"},{"line_number":668,"context_line":"    \"\"\"Manages the running instances from creation to destruction.\"\"\""},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"    target \u003d messaging.Target(version\u003d\u00274.12\u0027)"},{"line_number":671,"context_line":""},{"line_number":672,"context_line":"    # How long to wait in seconds before re-issuing a shutdown"},{"line_number":673,"context_line":"    # signal to an instance during power off.  The overall"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a18252c_00655544","line":670,"updated":"2016-04-12 12:46:50.000000000","message":"No need of this if you remove 4200","commit_id":"201dacb9e5ccd2154853425279102f7f5d9148f8"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"9127208771c6ebfb2b5e21a761eb9399cb32c883","unresolved":false,"context_lines":[{"line_number":1533,"context_line":"        if self.driver.instance_exists(instance):"},{"line_number":1534,"context_line":"            raise exception.InstanceExists(name\u003dinstance.name)"},{"line_number":1535,"context_line":""},{"line_number":1536,"context_line":"    def _create_vif_tags(self, context, instance, requested_networks, nwinfo):"},{"line_number":1537,"context_line":"        for req_net in requested_networks:"},{"line_number":1538,"context_line":"            if req_net.obj_attr_is_set(\u0027tag\u0027):"},{"line_number":1539,"context_line":"                for vif in nwinfo:"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a18252c_85c7b744","line":1536,"updated":"2016-04-12 12:46:50.000000000","message":"This code should to live in network.manager.create_tags_from_requested_networks(), see comment line 1583","commit_id":"201dacb9e5ccd2154853425279102f7f5d9148f8"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"9127208771c6ebfb2b5e21a761eb9399cb32c883","unresolved":false,"context_lines":[{"line_number":1580,"context_line":"                # for this async greenthread to finish before calling"},{"line_number":1581,"context_line":"                # instance.save()."},{"line_number":1582,"context_line":""},{"line_number":1583,"context_line":"                if requested_networks is not None:"},{"line_number":1584,"context_line":"                    self._create_vif_tags(context, instance,"},{"line_number":1585,"context_line":"                                          requested_networks, nwinfo)"},{"line_number":1586,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"5a18252c_0030b555","line":1583,"updated":"2016-04-12 12:46:50.000000000","message":"I don\u0027t think is good design to follow, this code should not live here but in the network api.\n\nIn compute/api.py probably the method \u0027_validate_and_build_base_options\u0027 is a good option to call a method like network_api.create_tags_from_requested_networks(requested_networks)","commit_id":"201dacb9e5ccd2154853425279102f7f5d9148f8"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"9127208771c6ebfb2b5e21a761eb9399cb32c883","unresolved":false,"context_lines":[{"line_number":4197,"context_line":"                method\u003d\u0027get_diagnostics\u0027)"},{"line_number":4198,"context_line":""},{"line_number":4199,"context_line":"    @wrap_exception()"},{"line_number":4200,"context_line":"    def get_device_metadata(self, context, instance):"},{"line_number":4201,"context_line":"        \"\"\"Retrieve device metadata (including tags) for an intance on this"},{"line_number":4202,"context_line":"        host."},{"line_number":4203,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":24,"id":"5a18252c_4088ede7","line":4200,"updated":"2016-04-12 12:46:50.000000000","message":"This code should to live in an other patch","commit_id":"201dacb9e5ccd2154853425279102f7f5d9148f8"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"91ffc5bfa8d999c4488825d17741e4fef88bff83","unresolved":false,"context_lines":[{"line_number":4197,"context_line":"                method\u003d\u0027get_diagnostics\u0027)"},{"line_number":4198,"context_line":""},{"line_number":4199,"context_line":"    @wrap_exception()"},{"line_number":4200,"context_line":"    def get_device_metadata(self, context, instance):"},{"line_number":4201,"context_line":"        \"\"\"Retrieve device metadata (including tags) for an intance on this"},{"line_number":4202,"context_line":"        host."},{"line_number":4203,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":24,"id":"5a18252c_165631d2","line":4200,"in_reply_to":"5a18252c_4088ede7","updated":"2016-04-12 16:11:42.000000000","message":"Agreed, it\u0027s not cool to add an RPC API here without the client side and ability to test. However, see my comment on the next patch -- I think we should do away with this entirely.","commit_id":"201dacb9e5ccd2154853425279102f7f5d9148f8"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"03a77840ae226ccbf2a6bfdbb2c231d8a2cbee82","unresolved":false,"context_lines":[{"line_number":1351,"context_line":"    def _create_vif_tags(self, context, instance, requested_networks, nwinfo):"},{"line_number":1352,"context_line":"        for req_net in requested_networks:"},{"line_number":1353,"context_line":"            if req_net.obj_attr_is_set(\u0027tag\u0027):"},{"line_number":1354,"context_line":"                for vif in nwinfo:"},{"line_number":1355,"context_line":"                    if vif[\u0027network\u0027][\u0027id\u0027] \u003d\u003d req_net.network_id:"},{"line_number":1356,"context_line":"                        # If nova-network is in use it will have created the"},{"line_number":1357,"context_line":"                        # vif in the db at this point"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_aea53048","line":1354,"updated":"2016-06-28 14:05:09.000000000","message":"Can you break this loop into a _tag_network() helper or something? This gets waaay too deep in the lines to follow I think.","commit_id":"0d2d4012edebe569170d12a7db2c90463ee48cc1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"3659e15a9c2ecd463125f41c7d368892f68cb2c9","unresolved":false,"context_lines":[{"line_number":1351,"context_line":"    def _create_vif_tags(self, context, instance, requested_networks, nwinfo):"},{"line_number":1352,"context_line":"        for req_net in requested_networks:"},{"line_number":1353,"context_line":"            if req_net.obj_attr_is_set(\u0027tag\u0027):"},{"line_number":1354,"context_line":"                for vif in nwinfo:"},{"line_number":1355,"context_line":"                    if vif[\u0027network\u0027][\u0027id\u0027] \u003d\u003d req_net.network_id:"},{"line_number":1356,"context_line":"                        # If nova-network is in use it will have created the"},{"line_number":1357,"context_line":"                        # vif in the db at this point"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_bf1558e6","line":1354,"in_reply_to":"3aaa91ec_aea53048","updated":"2016-06-28 17:17:31.000000000","message":"Done","commit_id":"0d2d4012edebe569170d12a7db2c90463ee48cc1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"03a77840ae226ccbf2a6bfdbb2c231d8a2cbee82","unresolved":false,"context_lines":[{"line_number":1366,"context_line":"                            vif_tag.instance_uuid \u003d instance.uuid"},{"line_number":1367,"context_line":"                            vif_tag.tag \u003d req_net.tag"},{"line_number":1368,"context_line":"                            vif_tag.uuid \u003d str(uuid.uuid4())"},{"line_number":1369,"context_line":"                            vif_tag.create()"},{"line_number":1370,"context_line":""},{"line_number":1371,"context_line":"    def _allocate_network_async(self, context, instance, requested_networks,"},{"line_number":1372,"context_line":"                                macs, security_groups, is_vpn, dhcp_options):"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_0e31e40b","line":1369,"updated":"2016-06-28 14:05:09.000000000","message":"This is pretty painful as it generates an RPC round trip for every vif we have. I don\u0027t have a better option at the moment, but we should really follow up with a VIFList.save_all() method that will do them all in one go. After this merges I can work on that.","commit_id":"0d2d4012edebe569170d12a7db2c90463ee48cc1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"3659e15a9c2ecd463125f41c7d368892f68cb2c9","unresolved":false,"context_lines":[{"line_number":1366,"context_line":"                            vif_tag.instance_uuid \u003d instance.uuid"},{"line_number":1367,"context_line":"                            vif_tag.tag \u003d req_net.tag"},{"line_number":1368,"context_line":"                            vif_tag.uuid \u003d str(uuid.uuid4())"},{"line_number":1369,"context_line":"                            vif_tag.create()"},{"line_number":1370,"context_line":""},{"line_number":1371,"context_line":"    def _allocate_network_async(self, context, instance, requested_networks,"},{"line_number":1372,"context_line":"                                macs, security_groups, is_vpn, dhcp_options):"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_9f721c7b","line":1369,"in_reply_to":"3aaa91ec_0e31e40b","updated":"2016-06-28 17:17:31.000000000","message":"A save_all() method doesn\u0027t actually sound that complicated, but perhaps it\u0027s better to leave it after the FF, as you say :) We don\u0027t want surprises, and there\u0027s no precedent for a save_all() in a List class that I\u0027ve been able to find.","commit_id":"0d2d4012edebe569170d12a7db2c90463ee48cc1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"03a77840ae226ccbf2a6bfdbb2c231d8a2cbee82","unresolved":false,"context_lines":[{"line_number":1753,"context_line":"            requested_networks, security_groups, block_device_mapping,"},{"line_number":1754,"context_line":"            node\u003dNone, limits\u003dNone):"},{"line_number":1755,"context_line":""},{"line_number":1756,"context_line":"        self._check_device_tagging(requested_networks, block_device_mapping)"},{"line_number":1757,"context_line":""},{"line_number":1758,"context_line":"        try:"},{"line_number":1759,"context_line":"            LOG.debug(\u0027Starting instance...\u0027, context\u003dcontext,"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_01e9b51a","line":1756,"updated":"2016-06-28 14:05:09.000000000","message":"Hmm, I wonder if this should be a level deeper so we get a reschedule? That would give us a chance to be moved to another host that does support this. Also, everything at this level seems to be very careful not to raise, but to return a build_results.XXXX thing. Perhaps this should go into _build_and_run_instance() ?","commit_id":"0d2d4012edebe569170d12a7db2c90463ee48cc1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"3659e15a9c2ecd463125f41c7d368892f68cb2c9","unresolved":false,"context_lines":[{"line_number":1753,"context_line":"            requested_networks, security_groups, block_device_mapping,"},{"line_number":1754,"context_line":"            node\u003dNone, limits\u003dNone):"},{"line_number":1755,"context_line":""},{"line_number":1756,"context_line":"        self._check_device_tagging(requested_networks, block_device_mapping)"},{"line_number":1757,"context_line":""},{"line_number":1758,"context_line":"        try:"},{"line_number":1759,"context_line":"            LOG.debug(\u0027Starting instance...\u0027, context\u003dcontext,"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_5a6e02ca","line":1756,"in_reply_to":"3aaa91ec_01e9b51a","updated":"2016-06-28 17:17:31.000000000","message":"Done","commit_id":"0d2d4012edebe569170d12a7db2c90463ee48cc1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7447c520523e171d88a387b08df7d83cdc584303","unresolved":false,"context_lines":[{"line_number":1349,"context_line":"            raise exception.InstanceExists(name\u003dinstance.name)"},{"line_number":1350,"context_line":""},{"line_number":1351,"context_line":"    def _apply_vif_tag(self, context, instance, req_net, vif):"},{"line_number":1352,"context_line":"        if vif[\u0027network\u0027][\u0027id\u0027] \u003d\u003d req_net.network_id:"},{"line_number":1353,"context_line":"            # If nova-network is in use it will have created the"},{"line_number":1354,"context_line":"            # vif in the db at this point"},{"line_number":1355,"context_line":"            db_vif \u003d objects.VirtualInterface.get_by_address("}],"source_content_type":"text/x-python","patch_set":63,"id":"3aaa91ec_5277ed9e","line":1352,"updated":"2016-06-29 02:04:44.000000000","message":"I think there is an issue here. If you request a port in the API, we null out NetworkRequest.network_id:\n\nhttps://github.com/openstack/nova/blob/master/nova/api/openstack/compute/servers.py#L403\n\nSo a pre-created port isn\u0027t going to get tagged, only ports that nova creates when you pass in a specific network uuid (or fixed IP address I guess).","commit_id":"4214abe4a18956d006a213db1facafeddc58823f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"df655335f6c8612f4c2baa05b3c5035cdb41e2b9","unresolved":false,"context_lines":[{"line_number":1349,"context_line":"            raise exception.InstanceExists(name\u003dinstance.name)"},{"line_number":1350,"context_line":""},{"line_number":1351,"context_line":"    def _apply_vif_tag(self, context, instance, req_net, vif):"},{"line_number":1352,"context_line":"        if vif[\u0027network\u0027][\u0027id\u0027] \u003d\u003d req_net.network_id:"},{"line_number":1353,"context_line":"            # If nova-network is in use it will have created the"},{"line_number":1354,"context_line":"            # vif in the db at this point"},{"line_number":1355,"context_line":"            db_vif \u003d objects.VirtualInterface.get_by_address("}],"source_content_type":"text/x-python","patch_set":63,"id":"3aaa91ec_527c0deb","line":1352,"in_reply_to":"3aaa91ec_5277ed9e","updated":"2016-06-29 02:31:21.000000000","message":"So I guess we need to match against the network, port, or address like we do elsewhere.\n\nFor the case where they provide two nics on the same network, but only a tag for one.. I think we can handle that by making a copy of requested networks, iterating first over the vifs, and popping the requests out of the copy of the list when we \"use\" them so that if they only had one request with a tag, we only tag one of the nics. It shouldn\u0027t matter which one gets tagged, I think. It doesn\u0027t really matter, other than that  if you have two different tags on the same network, we will (I think) assign the same tag to both, instead of each getting one of the tags, right?","commit_id":"4214abe4a18956d006a213db1facafeddc58823f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c136139d55d54dfe5d55d8909c539ce53eb33d12","unresolved":false,"context_lines":[{"line_number":1349,"context_line":"            raise exception.InstanceExists(name\u003dinstance.name)"},{"line_number":1350,"context_line":""},{"line_number":1351,"context_line":"    def _apply_vif_tag(self, context, instance, req_net, vif):"},{"line_number":1352,"context_line":"        if vif[\u0027network\u0027][\u0027id\u0027] \u003d\u003d req_net.network_id:"},{"line_number":1353,"context_line":"            # If nova-network is in use it will have created the"},{"line_number":1354,"context_line":"            # vif in the db at this point"},{"line_number":1355,"context_line":"            db_vif \u003d objects.VirtualInterface.get_by_address("}],"source_content_type":"text/x-python","patch_set":63,"id":"3aaa91ec_0dec06f2","line":1352,"in_reply_to":"3aaa91ec_527c0deb","updated":"2016-06-29 15:40:07.000000000","message":"I\u0027m not totally sure I\u0027m following that. I dislike the network_id matching going on here, especially since if you request a pre-created port in the API and provide a tag with it, the tag isn\u0027t applied because we don\u0027t have a network_id in NetworkRequest.\n\nI think a better way to handle this would be by applying the tag in the vif model in the network API when we\u0027re in allocate_for_instance, since that\u0027s where we have requested_networks and are building the vifs. That should also fix the case of the pre-created port coming into nova without a network_id but it has a tag.","commit_id":"4214abe4a18956d006a213db1facafeddc58823f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"98e92dbf256bff7bc9dd5a2b0d445d06c1ba92f2","unresolved":false,"context_lines":[{"line_number":1362,"context_line":"                vif_tag.address \u003d vif[\u0027address\u0027]"},{"line_number":1363,"context_line":"                vif_tag.instance_uuid \u003d instance.uuid"},{"line_number":1364,"context_line":"                vif_tag.tag \u003d req_net.tag"},{"line_number":1365,"context_line":"                vif_tag.uuid \u003d str(uuid.uuid4())"},{"line_number":1366,"context_line":"                vif_tag.create()"},{"line_number":1367,"context_line":""},{"line_number":1368,"context_line":"    def _create_vif_tags(self, context, instance, requested_networks, nwinfo):"}],"source_content_type":"text/x-python","patch_set":63,"id":"3aaa91ec_1268c586","line":1365,"range":{"start_line":1365,"start_character":31,"end_line":1365,"end_character":48},"updated":"2016-06-29 02:13:04.000000000","message":"This should be the port id for neutron:\n\nhttps://github.com/openstack/nova/blob/master/nova/network/neutronv2/api.py#L1867","commit_id":"4214abe4a18956d006a213db1facafeddc58823f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"18701241f67332d31de6c7dc82894fb902608d82","unresolved":false,"context_lines":[{"line_number":1354,"context_line":"        # If nova-network is in use it will have created the"},{"line_number":1355,"context_line":"        # vif in the db at this point"},{"line_number":1356,"context_line":"        db_vif \u003d objects.VirtualInterface.get_by_address("},{"line_number":1357,"context_line":"            context, vif[\u0027address\u0027])"},{"line_number":1358,"context_line":"        if db_vif:"},{"line_number":1359,"context_line":"            db_vif.tag \u003d req_net.tag"},{"line_number":1360,"context_line":"            db_vif.save()"}],"source_content_type":"text/x-python","patch_set":65,"id":"3aaa91ec_8e90ed44","line":1357,"updated":"2016-06-29 16:10:53.000000000","message":"I think we can actually use is_neutron to avoid a dry DB hit in that case every time, right?","commit_id":"9f0ea710d3cfa308658e37de466c5a9a2a5d2fe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"41f290f64a694fb992025d75bf50d055b2aaece5","unresolved":false,"context_lines":[{"line_number":1354,"context_line":"        # If nova-network is in use it will have created the"},{"line_number":1355,"context_line":"        # vif in the db at this point"},{"line_number":1356,"context_line":"        db_vif \u003d objects.VirtualInterface.get_by_address("},{"line_number":1357,"context_line":"            context, vif[\u0027address\u0027])"},{"line_number":1358,"context_line":"        if db_vif:"},{"line_number":1359,"context_line":"            db_vif.tag \u003d req_net.tag"},{"line_number":1360,"context_line":"            db_vif.save()"}],"source_content_type":"text/x-python","patch_set":65,"id":"3aaa91ec_54f05291","line":1357,"in_reply_to":"3aaa91ec_8e90ed44","updated":"2016-06-29 16:55:00.000000000","message":"Yeah it\u0027s gross but it\u0027s better than hitting the database for each vif when we know it won\u0027t exist.","commit_id":"9f0ea710d3cfa308658e37de466c5a9a2a5d2fe7"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"18701241f67332d31de6c7dc82894fb902608d82","unresolved":false,"context_lines":[{"line_number":1363,"context_line":"            vif_tag.address \u003d vif[\u0027address\u0027]"},{"line_number":1364,"context_line":"            vif_tag.instance_uuid \u003d instance.uuid"},{"line_number":1365,"context_line":"            vif_tag.tag \u003d req_net.tag"},{"line_number":1366,"context_line":"            vif_tag.uuid \u003d str(uuid.uuid4())"},{"line_number":1367,"context_line":"            vif_tag.create()"},{"line_number":1368,"context_line":""},{"line_number":1369,"context_line":"    def _find_vif_by_port(self, nwinfo, port_id):"}],"source_content_type":"text/x-python","patch_set":65,"id":"3aaa91ec_eec89157","line":1366,"updated":"2016-06-29 16:10:53.000000000","message":"Matt said this should be the vif[\u0027port_id\u0027] or something I think.","commit_id":"9f0ea710d3cfa308658e37de466c5a9a2a5d2fe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"41f290f64a694fb992025d75bf50d055b2aaece5","unresolved":false,"context_lines":[{"line_number":1363,"context_line":"            vif_tag.address \u003d vif[\u0027address\u0027]"},{"line_number":1364,"context_line":"            vif_tag.instance_uuid \u003d instance.uuid"},{"line_number":1365,"context_line":"            vif_tag.tag \u003d req_net.tag"},{"line_number":1366,"context_line":"            vif_tag.uuid \u003d str(uuid.uuid4())"},{"line_number":1367,"context_line":"            vif_tag.create()"},{"line_number":1368,"context_line":""},{"line_number":1369,"context_line":"    def _find_vif_by_port(self, nwinfo, port_id):"}],"source_content_type":"text/x-python","patch_set":65,"id":"3aaa91ec_b40ed689","line":1366,"in_reply_to":"3aaa91ec_eec89157","updated":"2016-06-29 16:55:00.000000000","message":"vif[\u0027id\u0027] is the port id:\n\nhttps://github.com/openstack/nova/blob/master/nova/network/neutronv2/api.py#L1867\n\nAlso on L1371.","commit_id":"9f0ea710d3cfa308658e37de466c5a9a2a5d2fe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"41f290f64a694fb992025d75bf50d055b2aaece5","unresolved":false,"context_lines":[{"line_number":1373,"context_line":""},{"line_number":1374,"context_line":"    def _find_vif_by_address(self, nwinfo, address):"},{"line_number":1375,"context_line":"        for vif in nwinfo:"},{"line_number":1376,"context_line":"            for subnet in vif[\u0027subnets\u0027]:"},{"line_number":1377,"context_line":"                for ip in subnet[\u0027ips\u0027]:"},{"line_number":1378,"context_line":"                    if ip[\u0027address\u0027] \u003d\u003d address:"},{"line_number":1379,"context_line":"                        return vif"}],"source_content_type":"text/x-python","patch_set":65,"id":"3aaa91ec_14608a00","line":1376,"range":{"start_line":1376,"start_character":12,"end_line":1376,"end_character":41},"updated":"2016-06-29 16:55:00.000000000","message":"This is wrong, for neutron the subnets are stashed under vif[\u0027network\u0027]:\n\nhttps://github.com/openstack/nova/blob/master/nova/network/neutronv2/api.py#L1773","commit_id":"9f0ea710d3cfa308658e37de466c5a9a2a5d2fe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"41f290f64a694fb992025d75bf50d055b2aaece5","unresolved":false,"context_lines":[{"line_number":1375,"context_line":"        for vif in nwinfo:"},{"line_number":1376,"context_line":"            for subnet in vif[\u0027subnets\u0027]:"},{"line_number":1377,"context_line":"                for ip in subnet[\u0027ips\u0027]:"},{"line_number":1378,"context_line":"                    if ip[\u0027address\u0027] \u003d\u003d address:"},{"line_number":1379,"context_line":"                        return vif"},{"line_number":1380,"context_line":""},{"line_number":1381,"context_line":"    def _find_vif_by_network(self, nwinfo, network_id):"}],"source_content_type":"text/x-python","patch_set":65,"id":"3aaa91ec_d40f2237","line":1378,"range":{"start_line":1378,"start_character":23,"end_line":1378,"end_character":36},"updated":"2016-06-29 16:55:00.000000000","message":"For neutron is this an object or just the fixed IP address? Looks like it\u0027s a FixedIP object:\n\nhttps://github.com/openstack/nova/blob/master/nova/network/neutronv2/api.py#L1702\n\nI\u0027m not sure if you need to cast ip.address as a str either.","commit_id":"9f0ea710d3cfa308658e37de466c5a9a2a5d2fe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"41f290f64a694fb992025d75bf50d055b2aaece5","unresolved":false,"context_lines":[{"line_number":1384,"context_line":"                return vif"},{"line_number":1385,"context_line":""},{"line_number":1386,"context_line":"    def _create_vif_tags(self, context, instance, requested_networks, nwinfo):"},{"line_number":1387,"context_line":"        nwinfo \u003d copy.deepcopy(nwinfo)"},{"line_number":1388,"context_line":"        for req_net in requested_networks:"},{"line_number":1389,"context_line":"            if req_net.obj_attr_is_set(\u0027tag\u0027):"},{"line_number":1390,"context_line":"                if req_net.obj_attr_is_set(\u0027port_id\u0027):"}],"source_content_type":"text/x-python","patch_set":65,"id":"3aaa91ec_5749745f","line":1387,"updated":"2016-06-29 16:55:00.000000000","message":"Should probably have a comment about why we\u0027re copying the list (to mutate it). And explain why we\u0027re popping the items.","commit_id":"9f0ea710d3cfa308658e37de466c5a9a2a5d2fe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"41f290f64a694fb992025d75bf50d055b2aaece5","unresolved":false,"context_lines":[{"line_number":1396,"context_line":"                if req_net.obj_attr_is_set(\u0027network_id\u0027):"},{"line_number":1397,"context_line":"                    vif \u003d self._find_vif_by_network(nwinfo, req_net.network_id)"},{"line_number":1398,"context_line":"                self._apply_vif_tag(context, instance, req_net, vif)"},{"line_number":1399,"context_line":"                nwinfo.remove(vif)"},{"line_number":1400,"context_line":""},{"line_number":1401,"context_line":"    def _allocate_network_async(self, context, instance, requested_networks,"},{"line_number":1402,"context_line":"                                macs, security_groups, is_vpn, dhcp_options):"}],"source_content_type":"text/x-python","patch_set":65,"id":"3aaa91ec_d7a284fb","line":1399,"updated":"2016-06-29 16:55:00.000000000","message":"Do we have a chance that vif might be None?","commit_id":"9f0ea710d3cfa308658e37de466c5a9a2a5d2fe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a5ff69a3b6a21b73b8463ed7be557a6a9c0333a6","unresolved":false,"context_lines":[{"line_number":1762,"context_line":"        if requested_networks:"},{"line_number":1763,"context_line":"            for net in requested_networks:"},{"line_number":1764,"context_line":"                if net.obj_attr_is_set(\u0027tag\u0027):"},{"line_number":1765,"context_line":"                    tagging_requested \u003d True"},{"line_number":1766,"context_line":"        if block_device_mapping:"},{"line_number":1767,"context_line":"            for bdm in block_device_mapping:"},{"line_number":1768,"context_line":"                if bdm.get(\u0027tag\u0027, None):"}],"source_content_type":"text/x-python","patch_set":65,"id":"3aaa91ec_97d11c5a","line":1765,"updated":"2016-06-29 17:00:00.000000000","message":"break the loop","commit_id":"9f0ea710d3cfa308658e37de466c5a9a2a5d2fe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a5ff69a3b6a21b73b8463ed7be557a6a9c0333a6","unresolved":false,"context_lines":[{"line_number":1763,"context_line":"            for net in requested_networks:"},{"line_number":1764,"context_line":"                if net.obj_attr_is_set(\u0027tag\u0027):"},{"line_number":1765,"context_line":"                    tagging_requested \u003d True"},{"line_number":1766,"context_line":"        if block_device_mapping:"},{"line_number":1767,"context_line":"            for bdm in block_device_mapping:"},{"line_number":1768,"context_line":"                if bdm.get(\u0027tag\u0027, None):"},{"line_number":1769,"context_line":"                    tagging_requested \u003d True"}],"source_content_type":"text/x-python","patch_set":65,"id":"3aaa91ec_17c6cc99","line":1766,"updated":"2016-06-29 17:00:00.000000000","message":"and not tagging_requested","commit_id":"9f0ea710d3cfa308658e37de466c5a9a2a5d2fe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a5ff69a3b6a21b73b8463ed7be557a6a9c0333a6","unresolved":false,"context_lines":[{"line_number":1766,"context_line":"        if block_device_mapping:"},{"line_number":1767,"context_line":"            for bdm in block_device_mapping:"},{"line_number":1768,"context_line":"                if bdm.get(\u0027tag\u0027, None):"},{"line_number":1769,"context_line":"                    tagging_requested \u003d True"},{"line_number":1770,"context_line":"        if (tagging_requested and"},{"line_number":1771,"context_line":"            not self.driver.capabilities[\u0027supports_device_tagging\u0027]):"},{"line_number":1772,"context_line":"            raise exception.BuildAbortException(\u0027Attempt to boot guest with \u0027"}],"source_content_type":"text/x-python","patch_set":65,"id":"3aaa91ec_77d63050","line":1769,"updated":"2016-06-29 17:00:00.000000000","message":"break the loop","commit_id":"9f0ea710d3cfa308658e37de466c5a9a2a5d2fe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a5ff69a3b6a21b73b8463ed7be557a6a9c0333a6","unresolved":false,"context_lines":[{"line_number":1768,"context_line":"                if bdm.get(\u0027tag\u0027, None):"},{"line_number":1769,"context_line":"                    tagging_requested \u003d True"},{"line_number":1770,"context_line":"        if (tagging_requested and"},{"line_number":1771,"context_line":"            not self.driver.capabilities[\u0027supports_device_tagging\u0027]):"},{"line_number":1772,"context_line":"            raise exception.BuildAbortException(\u0027Attempt to boot guest with \u0027"},{"line_number":1773,"context_line":"                                                \u0027tagged devices on host that \u0027"},{"line_number":1774,"context_line":"                                                \u0027does not support tagging.\u0027)"}],"source_content_type":"text/x-python","patch_set":65,"id":"3aaa91ec_f7e50009","line":1771,"range":{"start_line":1771,"start_character":28,"end_line":1771,"end_character":67},"updated":"2016-06-29 17:00:00.000000000","message":"Maybe driver.capabilities.get(\u0027supports_device_tagging\u0027, False)? Then you don\u0027t need to explicitly define it in each driver https://review.openstack.org/#/c/335573/","commit_id":"9f0ea710d3cfa308658e37de466c5a9a2a5d2fe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a5ff69a3b6a21b73b8463ed7be557a6a9c0333a6","unresolved":false,"context_lines":[{"line_number":1769,"context_line":"                    tagging_requested \u003d True"},{"line_number":1770,"context_line":"        if (tagging_requested and"},{"line_number":1771,"context_line":"            not self.driver.capabilities[\u0027supports_device_tagging\u0027]):"},{"line_number":1772,"context_line":"            raise exception.BuildAbortException(\u0027Attempt to boot guest with \u0027"},{"line_number":1773,"context_line":"                                                \u0027tagged devices on host that \u0027"},{"line_number":1774,"context_line":"                                                \u0027does not support tagging.\u0027)"},{"line_number":1775,"context_line":""}],"source_content_type":"text/x-python","patch_set":65,"id":"3aaa91ec_d723a456","line":1772,"range":{"start_line":1772,"start_character":28,"end_line":1772,"end_character":47},"updated":"2016-06-29 17:00:00.000000000","message":"Wouldn\u0027t we want RescheduledException instead? We hit a compute that doesn\u0027t support this, but we could have mixed computes and could have a chance of hitting one that supports it, right? Otherwise if this is really just avoiding like xen/vmware/hyperv/ironic or whatever virt driver doesn\u0027t support it, maybe a better solution would be using a policy rule for disabling this from the API entirely.","commit_id":"9f0ea710d3cfa308658e37de466c5a9a2a5d2fe7"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"dd0dbd70f42aa8adacaefcf14575a59b52e59bb1","unresolved":false,"context_lines":[{"line_number":1769,"context_line":"                    tagging_requested \u003d True"},{"line_number":1770,"context_line":"        if (tagging_requested and"},{"line_number":1771,"context_line":"            not self.driver.capabilities[\u0027supports_device_tagging\u0027]):"},{"line_number":1772,"context_line":"            raise exception.BuildAbortException(\u0027Attempt to boot guest with \u0027"},{"line_number":1773,"context_line":"                                                \u0027tagged devices on host that \u0027"},{"line_number":1774,"context_line":"                                                \u0027does not support tagging.\u0027)"},{"line_number":1775,"context_line":""}],"source_content_type":"text/x-python","patch_set":65,"id":"3aaa91ec_4249b45f","line":1772,"range":{"start_line":1772,"start_character":28,"end_line":1772,"end_character":47},"in_reply_to":"3aaa91ec_d723a456","updated":"2016-06-29 17:12:35.000000000","message":"My thinking is that in the worst case, we keep rescheduling to hosts that don\u0027t support it, opening up a potential DoS vector. I can go either way though, so far there are good arguments for both.","commit_id":"9f0ea710d3cfa308658e37de466c5a9a2a5d2fe7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4e96222615e073d096b617d90c945b6b47de229","unresolved":false,"context_lines":[{"line_number":1708,"context_line":"        tagging_requested \u003d False"},{"line_number":1709,"context_line":"        if requested_networks:"},{"line_number":1710,"context_line":"            for net in requested_networks:"},{"line_number":1711,"context_line":"                if net.obj_attr_is_set(\u0027tag\u0027):"},{"line_number":1712,"context_line":"                    tagging_requested \u003d True"},{"line_number":1713,"context_line":"        if block_device_mapping:"},{"line_number":1714,"context_line":"            for bdm in block_device_mapping:"}],"source_content_type":"text/x-python","patch_set":71,"id":"3aaa91ec_9a001803","line":1711,"range":{"start_line":1711,"start_character":19,"end_line":1711,"end_character":45},"updated":"2016-06-29 21:20:57.000000000","message":"Just because the attribute is set doesn\u0027t mean it\u0027s not set to None, right? So this should be:\n\n  if \u0027tag\u0027 in net and net.tag is not None:","commit_id":"59a6f7424114879b91b3ff35401c3b2f4db2afc3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"87f189fa3d74ab44eabc794df171657352ae337c","unresolved":false,"context_lines":[{"line_number":1708,"context_line":"        tagging_requested \u003d False"},{"line_number":1709,"context_line":"        if requested_networks:"},{"line_number":1710,"context_line":"            for net in requested_networks:"},{"line_number":1711,"context_line":"                if net.obj_attr_is_set(\u0027tag\u0027):"},{"line_number":1712,"context_line":"                    tagging_requested \u003d True"},{"line_number":1713,"context_line":"        if block_device_mapping:"},{"line_number":1714,"context_line":"            for bdm in block_device_mapping:"}],"source_content_type":"text/x-python","patch_set":71,"id":"3aaa91ec_facf9c53","line":1711,"range":{"start_line":1711,"start_character":19,"end_line":1711,"end_character":45},"in_reply_to":"3aaa91ec_9a001803","updated":"2016-06-29 21:42:06.000000000","message":"Yeah and it\u0027s always set to None in the API if supported and not provided by the client, so..","commit_id":"59a6f7424114879b91b3ff35401c3b2f4db2afc3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4e96222615e073d096b617d90c945b6b47de229","unresolved":false,"context_lines":[{"line_number":1709,"context_line":"        if requested_networks:"},{"line_number":1710,"context_line":"            for net in requested_networks:"},{"line_number":1711,"context_line":"                if net.obj_attr_is_set(\u0027tag\u0027):"},{"line_number":1712,"context_line":"                    tagging_requested \u003d True"},{"line_number":1713,"context_line":"        if block_device_mapping:"},{"line_number":1714,"context_line":"            for bdm in block_device_mapping:"},{"line_number":1715,"context_line":"                if bdm.get(\u0027tag\u0027, None):"}],"source_content_type":"text/x-python","patch_set":71,"id":"3aaa91ec_7fc27eea","line":1712,"updated":"2016-06-29 21:20:57.000000000","message":"break the loop","commit_id":"59a6f7424114879b91b3ff35401c3b2f4db2afc3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4e96222615e073d096b617d90c945b6b47de229","unresolved":false,"context_lines":[{"line_number":1710,"context_line":"            for net in requested_networks:"},{"line_number":1711,"context_line":"                if net.obj_attr_is_set(\u0027tag\u0027):"},{"line_number":1712,"context_line":"                    tagging_requested \u003d True"},{"line_number":1713,"context_line":"        if block_device_mapping:"},{"line_number":1714,"context_line":"            for bdm in block_device_mapping:"},{"line_number":1715,"context_line":"                if bdm.get(\u0027tag\u0027, None):"},{"line_number":1716,"context_line":"                    tagging_requested \u003d True"}],"source_content_type":"text/x-python","patch_set":71,"id":"3aaa91ec_5fa86220","line":1713,"updated":"2016-06-29 21:20:57.000000000","message":"if block_device_mapping and not tagging_requested:","commit_id":"59a6f7424114879b91b3ff35401c3b2f4db2afc3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4e96222615e073d096b617d90c945b6b47de229","unresolved":false,"context_lines":[{"line_number":1712,"context_line":"                    tagging_requested \u003d True"},{"line_number":1713,"context_line":"        if block_device_mapping:"},{"line_number":1714,"context_line":"            for bdm in block_device_mapping:"},{"line_number":1715,"context_line":"                if bdm.get(\u0027tag\u0027, None):"},{"line_number":1716,"context_line":"                    tagging_requested \u003d True"},{"line_number":1717,"context_line":"        if (tagging_requested and"},{"line_number":1718,"context_line":"                not self.driver.capabilities.get(\u0027supports_device_tagging\u0027)):"}],"source_content_type":"text/x-python","patch_set":71,"id":"3aaa91ec_5f04e216","line":1715,"range":{"start_line":1715,"start_character":16,"end_line":1715,"end_character":40},"updated":"2016-06-29 21:20:57.000000000","message":"Same as above.","commit_id":"59a6f7424114879b91b3ff35401c3b2f4db2afc3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"87f189fa3d74ab44eabc794df171657352ae337c","unresolved":false,"context_lines":[{"line_number":1712,"context_line":"                    tagging_requested \u003d True"},{"line_number":1713,"context_line":"        if block_device_mapping:"},{"line_number":1714,"context_line":"            for bdm in block_device_mapping:"},{"line_number":1715,"context_line":"                if bdm.get(\u0027tag\u0027, None):"},{"line_number":1716,"context_line":"                    tagging_requested \u003d True"},{"line_number":1717,"context_line":"        if (tagging_requested and"},{"line_number":1718,"context_line":"                not self.driver.capabilities.get(\u0027supports_device_tagging\u0027)):"}],"source_content_type":"text/x-python","patch_set":71,"id":"3aaa91ec_da410065","line":1715,"range":{"start_line":1715,"start_character":16,"end_line":1715,"end_character":40},"in_reply_to":"3aaa91ec_5f04e216","updated":"2016-06-29 21:42:06.000000000","message":"This isn\u0027t a BDM object it\u0027s the other thing.","commit_id":"59a6f7424114879b91b3ff35401c3b2f4db2afc3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1c0f4564fc6ff1eb8f410f818a0964da1e3ac043","unresolved":false,"context_lines":[{"line_number":1712,"context_line":"                    tagging_requested \u003d True"},{"line_number":1713,"context_line":"        if block_device_mapping:"},{"line_number":1714,"context_line":"            for bdm in block_device_mapping:"},{"line_number":1715,"context_line":"                if bdm.get(\u0027tag\u0027, None):"},{"line_number":1716,"context_line":"                    tagging_requested \u003d True"},{"line_number":1717,"context_line":"        if (tagging_requested and"},{"line_number":1718,"context_line":"                not self.driver.capabilities.get(\u0027supports_device_tagging\u0027)):"}],"source_content_type":"text/x-python","patch_set":71,"id":"3aaa91ec_20c73699","line":1715,"range":{"start_line":1715,"start_character":16,"end_line":1715,"end_character":40},"in_reply_to":"3aaa91ec_da410065","updated":"2016-06-29 21:49:15.000000000","message":"I don\u0027t think so, I think it\u0027s a BDM object from a BlockDeviceMappingList, which gets converted to a list of DriverBlockDevice dicts (which wrap the BDM object) in _prep_block_device. The unit test is using fake dict things which is probably why this was passing unit tests.","commit_id":"59a6f7424114879b91b3ff35401c3b2f4db2afc3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4e96222615e073d096b617d90c945b6b47de229","unresolved":false,"context_lines":[{"line_number":1713,"context_line":"        if block_device_mapping:"},{"line_number":1714,"context_line":"            for bdm in block_device_mapping:"},{"line_number":1715,"context_line":"                if bdm.get(\u0027tag\u0027, None):"},{"line_number":1716,"context_line":"                    tagging_requested \u003d True"},{"line_number":1717,"context_line":"        if (tagging_requested and"},{"line_number":1718,"context_line":"                not self.driver.capabilities.get(\u0027supports_device_tagging\u0027)):"},{"line_number":1719,"context_line":"            raise exception.BuildAbortException(\u0027Attempt to boot guest with \u0027"}],"source_content_type":"text/x-python","patch_set":71,"id":"3aaa91ec_bf6fc6fa","line":1716,"updated":"2016-06-29 21:20:57.000000000","message":"break the loop","commit_id":"59a6f7424114879b91b3ff35401c3b2f4db2afc3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4e96222615e073d096b617d90c945b6b47de229","unresolved":false,"context_lines":[{"line_number":1715,"context_line":"                if bdm.get(\u0027tag\u0027, None):"},{"line_number":1716,"context_line":"                    tagging_requested \u003d True"},{"line_number":1717,"context_line":"        if (tagging_requested and"},{"line_number":1718,"context_line":"                not self.driver.capabilities.get(\u0027supports_device_tagging\u0027)):"},{"line_number":1719,"context_line":"            raise exception.BuildAbortException(\u0027Attempt to boot guest with \u0027"},{"line_number":1720,"context_line":"                                                \u0027tagged devices on host that \u0027"},{"line_number":1721,"context_line":"                                                \u0027does not support tagging.\u0027)"}],"source_content_type":"text/x-python","patch_set":71,"id":"3aaa91ec_7aa1ecf7","line":1718,"range":{"start_line":1718,"start_character":20,"end_line":1718,"end_character":75},"updated":"2016-06-29 21:20:57.000000000","message":"I\u0027d prefer that this defaults to return False but None will do the job as well.","commit_id":"59a6f7424114879b91b3ff35401c3b2f4db2afc3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9d845e7074aca9da2eed0477a1b7832dd97db075","unresolved":false,"context_lines":[{"line_number":1713,"context_line":"                    break"},{"line_number":1714,"context_line":"        if block_device_mapping and not tagging_requested:"},{"line_number":1715,"context_line":"            for bdm in block_device_mapping:"},{"line_number":1716,"context_line":"                if bdm.get(\u0027tag\u0027, None):"},{"line_number":1717,"context_line":"                    tagging_requested \u003d True"},{"line_number":1718,"context_line":"                    break"},{"line_number":1719,"context_line":"        if (tagging_requested and"}],"source_content_type":"text/x-python","patch_set":72,"id":"3aaa91ec_40f7e2d2","line":1716,"range":{"start_line":1716,"start_character":19,"end_line":1716,"end_character":22},"updated":"2016-06-29 21:51:23.000000000","message":"Same comments from previous patch set. This is a BlockDeviceMapping object, not the dict.","commit_id":"4d111d32173da36d6300bad287ac10df6f33e814"}],"nova/network/manager.py":[{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"9dae29f6489bcb76a838549fb311f756bfb6d1e1","unresolved":false,"context_lines":[{"line_number":671,"context_line":"            available_macs \u003d set(macs)"},{"line_number":672,"context_line":""},{"line_number":673,"context_line":"        if requested_networks:"},{"line_number":674,"context_line":"            tags_by_network \u003d {network.network_id: network.tag"},{"line_number":675,"context_line":"                               for network in requested_networks}"},{"line_number":676,"context_line":"        else:"},{"line_number":677,"context_line":"            tags_by_network \u003d {}"}],"source_content_type":"text/x-python","patch_set":67,"id":"3aaa91ec_9531115d","line":674,"updated":"2016-06-29 18:57:23.000000000","message":"I think tag may be unset completely here...","commit_id":"7c1c29b54f78482ae282c6dd2792f6a66dcbf1e6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"631910fef10dbd754e1dbed45b826ff5fafd7b99","unresolved":false,"context_lines":[{"line_number":672,"context_line":""},{"line_number":673,"context_line":"        if requested_networks:"},{"line_number":674,"context_line":"            tags_by_network \u003d {"},{"line_number":675,"context_line":"                network.network_id: network.tag if \u0027tag\u0027 in network else None"},{"line_number":676,"context_line":"                for network in requested_networks}"},{"line_number":677,"context_line":"        else:"},{"line_number":678,"context_line":"            tags_by_network \u003d {}"}],"source_content_type":"text/x-python","patch_set":71,"id":"3aaa91ec_ba6fd4fa","line":675,"range":{"start_line":675,"start_character":16,"end_line":675,"end_character":34},"updated":"2016-06-29 21:44:01.000000000","message":"At first I thought this might be None, but it won\u0027t be because for nova-network, you can\u0027t request a port, and if you don\u0027t request a port, you have to specify a network uuid, else you get a KeyError here:\n\nhttps://github.com/openstack/nova/blob/master/nova/api/openstack/compute/servers.py#L416\n\nWhich results in a 400.","commit_id":"59a6f7424114879b91b3ff35401c3b2f4db2afc3"}],"nova/network/neutronv2/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a2335c4325607df99849721cee6ebc3ffea2b2f","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        :param fixed_ip: Optional fixed IP to use from the given network."},{"line_number":193,"context_line":"        :param security_group_ids: Optional list of security group IDs to"},{"line_number":194,"context_line":"            apply to the port."},{"line_number":195,"context_line":"        :returns: ID of the created port."},{"line_number":196,"context_line":"        :raises PortLimitExceeded: If neutron fails with an OverQuota error."},{"line_number":197,"context_line":"        :raises NoMoreFixedIps: If neutron fails with"},{"line_number":198,"context_line":"            IpAddressGenerationFailure error."}],"source_content_type":"text/x-python","patch_set":72,"id":"3aaa91ec_40c88255","line":195,"range":{"start_line":195,"start_character":8,"end_line":195,"end_character":41},"updated":"2016-06-29 22:03:52.000000000","message":"This needs updating.","commit_id":"4d111d32173da36d6300bad287ac10df6f33e814"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a2335c4325607df99849721cee6ebc3ffea2b2f","unresolved":false,"context_lines":[{"line_number":282,"context_line":"                raise exception.PortNotFree("},{"line_number":283,"context_line":"                    instance\u003dinstance.uuid)"},{"line_number":284,"context_line":"            mac_address \u003d available_macs.pop()"},{"line_number":285,"context_line":"            port_req_body[\u0027port\u0027][\u0027mac_address\u0027] \u003d mac_address"},{"line_number":286,"context_line":"            return mac_address"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def _check_external_network_attach(self, context, nets):"}],"source_content_type":"text/x-python","patch_set":72,"id":"3aaa91ec_e0636e18","line":285,"range":{"start_line":285,"start_character":12,"end_line":285,"end_character":62},"updated":"2016-06-29 22:03:52.000000000","message":"the port\u0027s mac is updated here but it\u0027s reflected in the ports dict used to set in vif.address.","commit_id":"4d111d32173da36d6300bad287ac10df6f33e814"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a2335c4325607df99849721cee6ebc3ffea2b2f","unresolved":false,"context_lines":[{"line_number":669,"context_line":"                    bind_host_id\u003dbind_host_id)"},{"line_number":670,"context_line":"                self._populate_pci_mac_address(instance,"},{"line_number":671,"context_line":"                    request.pci_request_id, port_req_body)"},{"line_number":672,"context_line":"                self._populate_mac_address("},{"line_number":673,"context_line":"                    instance, port_req_body, available_macs)"},{"line_number":674,"context_line":"                if dhcp_opts is not None:"},{"line_number":675,"context_line":"                    port_req_body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027] \u003d dhcp_opts"},{"line_number":676,"context_line":""}],"source_content_type":"text/x-python","patch_set":72,"id":"3aaa91ec_20b3b69b","line":673,"range":{"start_line":672,"start_character":16,"end_line":673,"end_character":60},"updated":"2016-06-29 22:03:52.000000000","message":"We need to update ports[request.port_id][\u0027mac_address\u0027] to what this returns, or below, get the mac_address from the port_req_body because this method mutates it.","commit_id":"4d111d32173da36d6300bad287ac10df6f33e814"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a2335c4325607df99849721cee6ebc3ffea2b2f","unresolved":false,"context_lines":[{"line_number":690,"context_line":"                    preexisting_port_ids.append(request.port_id)"},{"line_number":691,"context_line":"                    ports_in_requested_order.append(request.port_id)"},{"line_number":692,"context_line":"                    vifobj.uuid \u003d request.port_id"},{"line_number":693,"context_line":"                    vifobj.address \u003d ports[request.port_id][\u0027mac_address\u0027]"},{"line_number":694,"context_line":""},{"line_number":695,"context_line":"                vifobj.create()"},{"line_number":696,"context_line":""}],"source_content_type":"text/x-python","patch_set":72,"id":"3aaa91ec_00b83a74","line":693,"range":{"start_line":693,"start_character":37,"end_line":693,"end_character":74},"updated":"2016-06-29 22:03:52.000000000","message":"This is potentially stale given _populate_mac_address above.","commit_id":"4d111d32173da36d6300bad287ac10df6f33e814"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"56a582e1296b9daa68bbe476da026904d2a6c52b","unresolved":false,"context_lines":[{"line_number":671,"context_line":"                    request.pci_request_id, port_req_body)"},{"line_number":672,"context_line":"                updated_mac \u003d self._populate_mac_address("},{"line_number":673,"context_line":"                    instance, port_req_body, available_macs)"},{"line_number":674,"context_line":"                print(\u0027Updated mac %s from %s\u0027 % (updated_mac, available_macs))"},{"line_number":675,"context_line":"                if dhcp_opts is not None:"},{"line_number":676,"context_line":"                    port_req_body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027] \u003d dhcp_opts"},{"line_number":677,"context_line":""}],"source_content_type":"text/x-python","patch_set":74,"id":"3aaa91ec_e92b59e9","line":674,"updated":"2016-06-29 23:44:46.000000000","message":"Forgot the print statement here.","commit_id":"4f07f8463ca3db1374258e454802d8ad82a6998d"}],"nova/tests/unit/compute/test_compute_mgr.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f16b28584a5eafb1a36ce045311369629b0cefc","unresolved":false,"context_lines":[{"line_number":272,"context_line":"            {\u0027source_type\u0027: \u0027volume\u0027,"},{"line_number":273,"context_line":"             \u0027destination_type\u0027: \u0027volume\u0027,"},{"line_number":274,"context_line":"             \u0027instance_uuid\u0027: uuids.instance})"},{"line_number":275,"context_line":"        net_req \u003d net_req_obj.NetworkRequest()"},{"line_number":276,"context_line":"        net_req_list \u003d net_req_obj.NetworkRequestList(objects\u003d[net_req])"},{"line_number":277,"context_line":"        with mock.patch.dict(self.compute.driver.capabilities,"},{"line_number":278,"context_line":"                             supports_device_tagging\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":71,"id":"3aaa91ec_ba435412","line":275,"updated":"2016-06-29 21:26:34.000000000","message":"Our API wouldn\u0027t actually allow this, requested_networks would be [] or None if nothing was requested, so we should throw a fake network_id or port_id in here.\n\nAlso, because of:\n\nhttps://review.openstack.org/#/c/304510/56/nova/api/openstack/compute/servers.py@410\n\nAny NetworkRequest object now is going to have a tag attribute set to None by default. So I think we need to test that because the code in the compute manager in this change is just checking that the attribute is set, but not that it has a value.","commit_id":"59a6f7424114879b91b3ff35401c3b2f4db2afc3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f16b28584a5eafb1a36ce045311369629b0cefc","unresolved":false,"context_lines":[{"line_number":283,"context_line":"            {\u0027source_type\u0027: \u0027volume\u0027,"},{"line_number":284,"context_line":"             \u0027destination_type\u0027: \u0027volume\u0027,"},{"line_number":285,"context_line":"             \u0027instance_uuid\u0027: uuids.instance})"},{"line_number":286,"context_line":"        net_req \u003d net_req_obj.NetworkRequest()"},{"line_number":287,"context_line":"        net_req.tag \u003d \u0027foo\u0027"},{"line_number":288,"context_line":"        net_req_list \u003d net_req_obj.NetworkRequestList(objects\u003d[net_req])"},{"line_number":289,"context_line":"        with mock.patch.dict(self.compute.driver.capabilities,"}],"source_content_type":"text/x-python","patch_set":71,"id":"3aaa91ec_1a742866","line":286,"range":{"start_line":286,"start_character":30,"end_line":286,"end_character":44},"updated":"2016-06-29 21:26:34.000000000","message":"nit: throw a fake network_id or port_id in here since that\u0027s what our API would provide (as noted above).","commit_id":"59a6f7424114879b91b3ff35401c3b2f4db2afc3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f16b28584a5eafb1a36ce045311369629b0cefc","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        net_req.tag \u003d \u0027foo\u0027"},{"line_number":288,"context_line":"        net_req_list \u003d net_req_obj.NetworkRequestList(objects\u003d[net_req])"},{"line_number":289,"context_line":"        with mock.patch.dict(self.compute.driver.capabilities,"},{"line_number":290,"context_line":"                             supports_device_tagging\u003dFalse):"},{"line_number":291,"context_line":"            self.assertRaises(exception.BuildAbortException,"},{"line_number":292,"context_line":"                              self.compute._check_device_tagging,"},{"line_number":293,"context_line":"                              net_req_list, [bdm])"}],"source_content_type":"text/x-python","patch_set":71,"id":"3aaa91ec_dab10003","line":290,"range":{"start_line":290,"start_character":29,"end_line":290,"end_character":58},"updated":"2016-06-29 21:26:34.000000000","message":"We should probably test that the virt driver capabilities dict doesn\u0027t have the key and we don\u0027t explode. That would be a nice wrinkle in this test.","commit_id":"59a6f7424114879b91b3ff35401c3b2f4db2afc3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f16b28584a5eafb1a36ce045311369629b0cefc","unresolved":false,"context_lines":[{"line_number":298,"context_line":"             \u0027destination_type\u0027: \u0027volume\u0027,"},{"line_number":299,"context_line":"             \u0027instance_uuid\u0027: uuids.instance,"},{"line_number":300,"context_line":"             \u0027tag\u0027: \u0027foo\u0027})"},{"line_number":301,"context_line":"        net_req \u003d net_req_obj.NetworkRequest()"},{"line_number":302,"context_line":"        net_req_list \u003d net_req_obj.NetworkRequestList(objects\u003d[net_req])"},{"line_number":303,"context_line":"        with mock.patch.dict(self.compute.driver.capabilities,"},{"line_number":304,"context_line":"                             supports_device_tagging\u003dFalse):"},{"line_number":305,"context_line":"            self.assertRaises(exception.BuildAbortException,"}],"source_content_type":"text/x-python","patch_set":71,"id":"3aaa91ec_9a2db848","line":302,"range":{"start_line":301,"start_character":8,"end_line":302,"end_character":72},"updated":"2016-06-29 21:26:34.000000000","message":"Just pass None for requested_networks.","commit_id":"59a6f7424114879b91b3ff35401c3b2f4db2afc3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9d845e7074aca9da2eed0477a1b7832dd97db075","unresolved":false,"context_lines":[{"line_number":268,"context_line":"            self.compute._delete_instance(self.context, instance, [], quotas)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    def test_check_device_tagging_no_tagging(self):"},{"line_number":271,"context_line":"        bdm \u003d fake_block_device.FakeDbBlockDeviceDict("},{"line_number":272,"context_line":"            {\u0027source_type\u0027: \u0027volume\u0027,"},{"line_number":273,"context_line":"             \u0027destination_type\u0027: \u0027volume\u0027,"},{"line_number":274,"context_line":"             \u0027instance_uuid\u0027: uuids.instance})"}],"source_content_type":"text/x-python","patch_set":72,"id":"3aaa91ec_c0d8f255","line":271,"range":{"start_line":271,"start_character":32,"end_line":271,"end_character":53},"updated":"2016-06-29 21:51:23.000000000","message":"We need to pass actual objects.BlockDeviceMapping to the method since that\u0027s what we actually use.","commit_id":"4d111d32173da36d6300bad287ac10df6f33e814"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bf9c0aa2981eb7bd522955485e70c9946110c5cc","unresolved":false,"context_lines":[{"line_number":307,"context_line":"             \u0027instance_uuid\u0027: uuids.instance,"},{"line_number":308,"context_line":"             \u0027tag\u0027: \u0027foo\u0027})"},{"line_number":309,"context_line":"        with mock.patch.dict(self.compute.driver.capabilities,"},{"line_number":310,"context_line":"                             supports_device_tagging\u003dFalse):"},{"line_number":311,"context_line":"            self.assertRaises(exception.BuildAbortException,"},{"line_number":312,"context_line":"                              self.compute._check_device_tagging,"},{"line_number":313,"context_line":"                              None, [bdm])"}],"source_content_type":"text/x-python","patch_set":72,"id":"3aaa91ec_e08fee20","line":310,"range":{"start_line":310,"start_character":29,"end_line":310,"end_character":58},"updated":"2016-06-29 21:53:44.000000000","message":"We need one of these tests to not set this key in the dict and make sure the code handles the default of None and not a KeyError.","commit_id":"4d111d32173da36d6300bad287ac10df6f33e814"}],"nova/tests/unit/network/test_neutronv2.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"56a582e1296b9daa68bbe476da026904d2a6c52b","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"                                                tag\u003d\u0027test\u0027)]))"},{"line_number":1043,"context_line":"        self.assertEqual(self.port_data1, result)"},{"line_number":1044,"context_line":"        self.assertEqual(1, len(self._vifs_created))"},{"line_number":1045,"context_line":"        self.assertEqual(\u0027test\u0027, self._vifs_created[0].tag)"},{"line_number":1046,"context_line":"        self.assertEqual(uuids.portid_1, self._vifs_created[0].uuid)"},{"line_number":1047,"context_line":"        self.assertEqual(self.port_data1[0][\u0027mac_address\u0027],"},{"line_number":1048,"context_line":"                         self._vifs_created[0].address)"}],"source_content_type":"text/x-python","patch_set":74,"id":"3aaa91ec_698ac9c0","line":1045,"updated":"2016-06-29 23:44:46.000000000","message":"Could also assert the self._vifs_created[0].instance_uuid in here.","commit_id":"4f07f8463ca3db1374258e454802d8ad82a6998d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a06d72ac8e3aebffcb529cd52c18bb9ddbf8fabe","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        return instance"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def _stub_allocate_for_instance(self, net_idx\u003d1, **kwargs):"},{"line_number":396,"context_line":"        self.instance \u003d self._fake_instance_object(self.instance)"},{"line_number":397,"context_line":"        self.instance2 \u003d self._fake_instance_object(self.instance2)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        api \u003d neutronapi.API()"}],"source_content_type":"text/x-python","patch_set":75,"id":"3aaa91ec_54db207c","line":396,"updated":"2016-06-29 23:57:36.000000000","message":"Yeah it\u0027s converted to an object here.","commit_id":"e2eb6659a426bae05a54b93ebf31ff3247125258"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b5f08dce0f9e3ffcbf2a94562311075dbdcb81dd","unresolved":false,"context_lines":[{"line_number":1043,"context_line":"        self.assertEqual(self.port_data1, result)"},{"line_number":1044,"context_line":"        self.assertEqual(1, len(self._vifs_created))"},{"line_number":1045,"context_line":"        self.assertEqual(\u0027test\u0027, self._vifs_created[0].tag)"},{"line_number":1046,"context_line":"        self.assertEqual(self.instance.uuid,"},{"line_number":1047,"context_line":"                         self._vifs_created[0].instance_uuid)"},{"line_number":1048,"context_line":"        self.assertEqual(uuids.portid_1, self._vifs_created[0].uuid)"},{"line_number":1049,"context_line":"        self.assertEqual(self.port_data1[0][\u0027mac_address\u0027],"}],"source_content_type":"text/x-python","patch_set":75,"id":"3aaa91ec_94b3c84c","line":1046,"range":{"start_line":1046,"start_character":25,"end_line":1046,"end_character":38},"updated":"2016-06-29 23:55:02.000000000","message":"Is this an instance object?","commit_id":"e2eb6659a426bae05a54b93ebf31ff3247125258"}]}
