)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"fb5d3713fff40fe95b17ddecad88d490518ec9f6","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch modifies the fields.ResourceClass field type from an"},{"line_number":10,"context_line":"EnumField to a StringField. This keeps the over-the-wire format of the"},{"line_number":11,"context_line":"field backwards-compatible while allowing us to add non-standardized,"},{"line_number":12,"context_line":"custom resource classes to the new resource_classes database table."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"We change all locations of fields.ResourceClass.index() and"},{"line_number":15,"context_line":"fields.ResourceClass.from_index() to use the ResourceClassCache object"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"fa6399be_bf957f41","line":12,"updated":"2016-10-11 13:16:59.000000000","message":"While I can see why you might want to allow arbitrary custom resources, I think that we should force them to be namespaced separately from standardized resources. This ensures we can add more standardized resources in the future, without risk of clashing with someone\u0027s custom resource name.\n\neg, force an X_ prefix on the name for non-standardized resource classes.","commit_id":"bb35bb43452830a858b43db9e9e0dd7688cca17c"}],"nova/api/openstack/placement/handlers/inventory.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a55fb0d546843932ad251f44c973289d56fa3be","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                                       **data)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    try:"},{"line_number":212,"context_line":"        resource_provider.add_inventory(inventory)"},{"line_number":213,"context_line":"    except (exception.ConcurrentUpdateDetected,"},{"line_number":214,"context_line":"            db_exc.DBDuplicateEntry) as exc:"},{"line_number":215,"context_line":"        raise webob.exc.HTTPConflict("}],"source_content_type":"text/x-python","patch_set":12,"id":"da6895a0_6c79962f","line":212,"updated":"2016-10-21 03:34:42.000000000","message":"Can\u0027t we get a ValueError from this now? It\u0027s nested pretty deep but I think it\u0027s possible.","commit_id":"5661f879b07ee61d3f22b15175e778c50e42ff2d"}],"nova/db/sqlalchemy/resource_class_cache.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"df5afb7d16632a9e868a7846c0987fd203ccfa94","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            raise ValueError"},{"line_number":32,"context_line":"    else:"},{"line_number":33,"context_line":"        try:"},{"line_number":34,"context_line":"            fields.ResourceClass.ALL[rc]"},{"line_number":35,"context_line":"        except IndexError:"},{"line_number":36,"context_line":"            raise ValueError"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa6399be_c3627cad","line":34,"updated":"2016-10-10 20:15:41.000000000","message":"So, this is not good enough I think. As you continue to add new fixed values, this will drift and allow us to sent those to the older nodes, which is not okay. The Enum-ness would have been our signal before in TestObjectVersions, but now you don\u0027t get that for free.\n\nSo, I think you need to define a \"enum as it was in v1\" list of values here and check against those specifically.","commit_id":"61222b3b4b33be985484ef049a18597beb1b93f8"}],"nova/objects/fields.py":[{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"0114cdf8dd75ed60bcc637e925f350bc2cf59791","unresolved":false,"context_lines":[{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    # The ordering here is relevant. If you must add a value, only"},{"line_number":273,"context_line":"    # append."},{"line_number":274,"context_line":"    ALL \u003d (VCPU, MEMORY_MB, DISK_GB, PCI_DEVICE, SRIOV_NET_VF, NUMA_SOCKET,"},{"line_number":275,"context_line":"           NUMA_CORE, NUMA_THREAD, NUMA_MEMORY_MB, IPV4_ADDRESS)"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a95cdbc_08936b50","line":274,"range":{"start_line":274,"start_character":4,"end_line":274,"end_character":7},"updated":"2016-10-05 17:37:34.000000000","message":"Minor quibble: since we now allow other resource classes, could this be changed to \u0027STANDARD\u0027 or the like?","commit_id":"8fc6bfd7e4597153d2aa88775839f4bbfc382e33"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d1cdd24ed316e45a01b9a9915f0702418991b963","unresolved":false,"context_lines":[{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    # The ordering here is relevant. If you must add a value, only"},{"line_number":273,"context_line":"    # append."},{"line_number":274,"context_line":"    ALL \u003d (VCPU, MEMORY_MB, DISK_GB, PCI_DEVICE, SRIOV_NET_VF, NUMA_SOCKET,"},{"line_number":275,"context_line":"           NUMA_CORE, NUMA_THREAD, NUMA_MEMORY_MB, IPV4_ADDRESS)"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a95cdbc_fc9520e4","line":274,"range":{"start_line":274,"start_character":4,"end_line":274,"end_character":7},"in_reply_to":"1a95cdbc_08936b50","updated":"2016-10-05 18:05:39.000000000","message":"Yeah, I thought about that and actually made that change in a previous not-pushed version of this patch. However, I wanted to minimize the lines of code changed so kept it at ALL here. Can always do a separate patch in the future...","commit_id":"8fc6bfd7e4597153d2aa88775839f4bbfc382e33"}],"nova/objects/resource_provider.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8c81e96706447728a0c35f8a252dc0285e472236","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    allocations \u003d conn.execute(allocation_query).fetchall()"},{"line_number":82,"context_line":"    if allocations:"},{"line_number":83,"context_line":"        resource_classes \u003d \u0027, \u0027.join([_RC_CACHE.string_from_id(alloc[0])"},{"line_number":84,"context_line":"                                      for alloc in allocations])"},{"line_number":85,"context_line":"        raise exception.InventoryInUse(resource_classes\u003dresource_classes,"},{"line_number":86,"context_line":"                                       resource_provider\u003drp.uuid)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a95cdbc_3d7b9e29","line":84,"updated":"2016-10-07 17:04:08.000000000","message":"To my point in the previous patch, this would generate N independent queries for the N allocations. For the standard ones, we short-circuit, but for anything else we\u0027d do really stupid things here.","commit_id":"8fc6bfd7e4597153d2aa88775839f4bbfc382e33"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6bddab32ffc40637ae327138ebf8ccc0690285af","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    allocations \u003d conn.execute(allocation_query).fetchall()"},{"line_number":82,"context_line":"    if allocations:"},{"line_number":83,"context_line":"        resource_classes \u003d \u0027, \u0027.join([_RC_CACHE.string_from_id(alloc[0])"},{"line_number":84,"context_line":"                                      for alloc in allocations])"},{"line_number":85,"context_line":"        raise exception.InventoryInUse(resource_classes\u003dresource_classes,"},{"line_number":86,"context_line":"                                       resource_provider\u003drp.uuid)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a95cdbc_bd508e33","line":84,"in_reply_to":"1a95cdbc_3d7b9e29","updated":"2016-10-07 17:12:10.000000000","message":"Only a single query per custom resource class and then it\u0027s in the cache, but yeah, there would be a single DB query per cache miss on a custom resource class.","commit_id":"8fc6bfd7e4597153d2aa88775839f4bbfc382e33"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8c81e96706447728a0c35f8a252dc0285e472236","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        res \u003d conn.execute(upd_stmt)"},{"line_number":160,"context_line":"        if not res.rowcount:"},{"line_number":161,"context_line":"            raise exception.NotFound("},{"line_number":162,"context_line":"                \u0027No inventory of class %s found for update\u0027 % rc_str)"},{"line_number":163,"context_line":"    return exceeded"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a95cdbc_dde47ae1","line":162,"updated":"2016-10-07 17:04:08.000000000","message":"This will say \"No inventory of class None\" if you provide an invalid class right?\n\nor, I guess you\u0027ve converted from string to id already, and this is just convenience going back so we\u0027re guaranteed to have resolved it already?","commit_id":"8fc6bfd7e4597153d2aa88775839f4bbfc382e33"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6bddab32ffc40637ae327138ebf8ccc0690285af","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        res \u003d conn.execute(upd_stmt)"},{"line_number":160,"context_line":"        if not res.rowcount:"},{"line_number":161,"context_line":"            raise exception.NotFound("},{"line_number":162,"context_line":"                \u0027No inventory of class %s found for update\u0027 % rc_str)"},{"line_number":163,"context_line":"    return exceeded"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a95cdbc_6123c4a7","line":162,"in_reply_to":"1a95cdbc_dde47ae1","updated":"2016-10-07 17:12:10.000000000","message":"the call on line 137 will raise ValueError if resource class is None. The ValueError is caught by the REST API handler for inventory/allocations.","commit_id":"8fc6bfd7e4597153d2aa88775839f4bbfc382e33"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"8e3e6206fe7c1ac8df6b1b1c064f64187a1b7e3a","unresolved":false,"context_lines":[{"line_number":29,"context_line":"_ALLOC_TBL \u003d models.Allocation.__table__"},{"line_number":30,"context_line":"_INV_TBL \u003d models.Inventory.__table__"},{"line_number":31,"context_line":"_RP_TBL \u003d models.ResourceProvider.__table__"},{"line_number":32,"context_line":"_RC_CACHE \u003d None"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a95cdbc_a924af0c","line":32,"range":{"start_line":32,"start_character":0,"end_line":32,"end_character":16},"updated":"2016-10-10 03:53:30.000000000","message":"nit:\nWhy not move  _RC_CACHE to resource_class_cache package, and initiate this cache singleton during import time or the first calling of `string_from_id` and `string_from_id`?\n\nIt is error-prone if forget to put \"_ensure_rc_cache\" in the correct places.","commit_id":"3eca78cf985f333fa70c3385d0a191f60d81c6a0"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"055db30416b7c22d467c6c7b5976a7d705e9d6e3","unresolved":false,"context_lines":[{"line_number":29,"context_line":"_ALLOC_TBL \u003d models.Allocation.__table__"},{"line_number":30,"context_line":"_INV_TBL \u003d models.Inventory.__table__"},{"line_number":31,"context_line":"_RP_TBL \u003d models.ResourceProvider.__table__"},{"line_number":32,"context_line":"_RC_CACHE \u003d None"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a95cdbc_643d57c3","line":32,"range":{"start_line":32,"start_character":0,"end_line":32,"end_character":16},"in_reply_to":"1a95cdbc_a924af0c","updated":"2016-10-10 14:21:19.000000000","message":"@Yingxin: because we don\u0027t have a context object at that time and thus have no database transaction context we can use...","commit_id":"3eca78cf985f333fa70c3385d0a191f60d81c6a0"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"8e3e6206fe7c1ac8df6b1b1c064f64187a1b7e3a","unresolved":false,"context_lines":[{"line_number":585,"context_line":"        \"\"\"Return the inventory record from the list of Inventory records that"},{"line_number":586,"context_line":"        matches the supplied resource class, or None."},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"        :param res_class: An integer or string representing a resource"},{"line_number":589,"context_line":"                          class. If the value is a string, the method first"},{"line_number":590,"context_line":"                          looks up the resource class identifier from the"},{"line_number":591,"context_line":"                          string."},{"line_number":592,"context_line":"        \"\"\""},{"line_number":593,"context_line":"        if not isinstance(res_class, six.string_types):"},{"line_number":594,"context_line":"            raise ValueError"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a95cdbc_290a5f8a","line":591,"range":{"start_line":588,"start_character":26,"end_line":591,"end_character":33},"updated":"2016-10-10 03:53:30.000000000","message":"need to rephrase this, integer is no longer an acceptable parameter.","commit_id":"3eca78cf985f333fa70c3385d0a191f60d81c6a0"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3ab83d56d462d2439016a7b9f4230d618edefa69","unresolved":false,"context_lines":[{"line_number":532,"context_line":"    fields \u003d {"},{"line_number":533,"context_line":"        \u0027id\u0027: fields.IntegerField(read_only\u003dTrue),"},{"line_number":534,"context_line":"        \u0027resource_provider\u0027: fields.ObjectField(\u0027ResourceProvider\u0027),"},{"line_number":535,"context_line":"        \u0027resource_class\u0027: fields.StringField(read_only\u003dTrue),"},{"line_number":536,"context_line":"        \u0027total\u0027: fields.NonNegativeIntegerField(),"},{"line_number":537,"context_line":"        \u0027reserved\u0027: fields.NonNegativeIntegerField(default\u003d0),"},{"line_number":538,"context_line":"        \u0027min_unit\u0027: fields.NonNegativeIntegerField(default\u003d1),"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa6399be_a0781efa","line":535,"updated":"2016-10-10 20:02:28.000000000","message":"Can we just do this and pretend we don\u0027t need to support old versions ? Unfortunately, we merged that in Newton so old N computes would give us a ResourceClassField here primitived.\n\nI thought during the spec review that the only possibility was to deprecate the original field and just create a new field, but maybe other alternatives can be there.","commit_id":"61222b3b4b33be985484ef049a18597beb1b93f8"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"df5afb7d16632a9e868a7846c0987fd203ccfa94","unresolved":false,"context_lines":[{"line_number":532,"context_line":"    fields \u003d {"},{"line_number":533,"context_line":"        \u0027id\u0027: fields.IntegerField(read_only\u003dTrue),"},{"line_number":534,"context_line":"        \u0027resource_provider\u0027: fields.ObjectField(\u0027ResourceProvider\u0027),"},{"line_number":535,"context_line":"        \u0027resource_class\u0027: fields.StringField(read_only\u003dTrue),"},{"line_number":536,"context_line":"        \u0027total\u0027: fields.NonNegativeIntegerField(),"},{"line_number":537,"context_line":"        \u0027reserved\u0027: fields.NonNegativeIntegerField(default\u003d0),"},{"line_number":538,"context_line":"        \u0027min_unit\u0027: fields.NonNegativeIntegerField(default\u003d1),"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa6399be_e3f22006","line":535,"in_reply_to":"fa6399be_a0781efa","updated":"2016-10-10 20:15:41.000000000","message":"No, I suggested on the spec that we just convert this. It\u0027s completely compatible with the existing format, so long as we don\u0027t put anything in here that wasn\u0027t allowed in an older version. That\u0027s why on L549 Jay throws an error during backport if it would generate an incompatible object.\n\nNote that the Enum field inherits from String. They\u0027re the same on the wire, except for being value-limited.","commit_id":"61222b3b4b33be985484ef049a18597beb1b93f8"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8678f0625a0a3217240f5a07bd5716df68c7d33e","unresolved":false,"context_lines":[{"line_number":546,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":547,"context_line":"        if target_version \u003c (1, 1) and \u0027resource_class\u0027 in primitive:"},{"line_number":548,"context_line":"            rc \u003d primitive[\u0027resource_class\u0027]"},{"line_number":549,"context_line":"            rc_cache.raise_if_custom_resource_class_pre_v1_1(rc)"},{"line_number":550,"context_line":""},{"line_number":551,"context_line":"    @property"},{"line_number":552,"context_line":"    def capacity(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa6399be_aefe4f03","line":549,"updated":"2016-10-10 20:41:06.000000000","message":"Explicit, I like it.","commit_id":"9a2b9726995b397f66641d70159f79f0f7c37259"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"dfa1763896e4b85d683fbf9327c4de66fad06e83","unresolved":false,"context_lines":[{"line_number":863,"context_line":"        # Short-circuit out if there are any allocations with string"},{"line_number":864,"context_line":"        # resource class names that don\u0027t exist."},{"line_number":865,"context_line":"        for alloc in allocs:"},{"line_number":866,"context_line":"            if _RC_CACHE.id_from_string(alloc.resource_class) is None:"},{"line_number":867,"context_line":"                raise exception.NotFound(\"No such resource class \u0027%s\u0027\" %"},{"line_number":868,"context_line":"                                         alloc.resource_class)"},{"line_number":869,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa6399be_ef73d04b","line":866,"range":{"start_line":866,"start_character":12,"end_line":866,"end_character":70},"updated":"2016-10-11 09:24:47.000000000","message":"So...if there is ResourceClass renamed, probably I can use the old name for while if there isn\u0027t any other chance to trigger the cache update","commit_id":"bb35bb43452830a858b43db9e9e0dd7688cca17c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7f29b1ee26091d0b60db64b705053dce0bcb9768","unresolved":false,"context_lines":[{"line_number":863,"context_line":"        # Short-circuit out if there are any allocations with string"},{"line_number":864,"context_line":"        # resource class names that don\u0027t exist."},{"line_number":865,"context_line":"        for alloc in allocs:"},{"line_number":866,"context_line":"            if _RC_CACHE.id_from_string(alloc.resource_class) is None:"},{"line_number":867,"context_line":"                raise exception.NotFound(\"No such resource class \u0027%s\u0027\" %"},{"line_number":868,"context_line":"                                         alloc.resource_class)"},{"line_number":869,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa6399be_4b7901fc","line":866,"range":{"start_line":866,"start_character":12,"end_line":866,"end_character":70},"in_reply_to":"fa6399be_3409972d","updated":"2016-10-11 14:30:54.000000000","message":"Even still, we would fail the capacity check later if we had no resources of that id anyway, right? This is just an optimization.","commit_id":"bb35bb43452830a858b43db9e9e0dd7688cca17c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"66afbb804c232a3196db2ccd945f3c6185e09911","unresolved":false,"context_lines":[{"line_number":863,"context_line":"        # Short-circuit out if there are any allocations with string"},{"line_number":864,"context_line":"        # resource class names that don\u0027t exist."},{"line_number":865,"context_line":"        for alloc in allocs:"},{"line_number":866,"context_line":"            if _RC_CACHE.id_from_string(alloc.resource_class) is None:"},{"line_number":867,"context_line":"                raise exception.NotFound(\"No such resource class \u0027%s\u0027\" %"},{"line_number":868,"context_line":"                                         alloc.resource_class)"},{"line_number":869,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa6399be_8b6e9d94","line":866,"range":{"start_line":866,"start_character":12,"end_line":866,"end_character":70},"in_reply_to":"fa6399be_4b7901fc","updated":"2016-10-12 05:19:50.000000000","message":"@Dan, if this is just rename, the id won\u0027t be changed, that means the id already existed, and the cache still have the mapping between the old name with the id\n\n@Jay I\u0027m ok we do that later. I also don\u0027t think that is a blocker","commit_id":"bb35bb43452830a858b43db9e9e0dd7688cca17c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"521644167c3b8e60e968fc6d7ab3c26a88bf51e6","unresolved":false,"context_lines":[{"line_number":863,"context_line":"        # Short-circuit out if there are any allocations with string"},{"line_number":864,"context_line":"        # resource class names that don\u0027t exist."},{"line_number":865,"context_line":"        for alloc in allocs:"},{"line_number":866,"context_line":"            if _RC_CACHE.id_from_string(alloc.resource_class) is None:"},{"line_number":867,"context_line":"                raise exception.NotFound(\"No such resource class \u0027%s\u0027\" %"},{"line_number":868,"context_line":"                                         alloc.resource_class)"},{"line_number":869,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa6399be_3409972d","line":866,"range":{"start_line":866,"start_character":12,"end_line":866,"end_character":70},"in_reply_to":"fa6399be_ef73d04b","updated":"2016-10-11 11:52:18.000000000","message":"We have not yet done any of the plumbing for adding new resource classes via the REST API, so I was leaving cache invalidation to the patch that adds that functionality.","commit_id":"bb35bb43452830a858b43db9e9e0dd7688cca17c"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"40374dd5777388c6c454637301c048d0c0c63bbb","unresolved":false,"context_lines":[{"line_number":532,"context_line":"    fields \u003d {"},{"line_number":533,"context_line":"        \u0027id\u0027: fields.IntegerField(read_only\u003dTrue),"},{"line_number":534,"context_line":"        \u0027resource_provider\u0027: fields.ObjectField(\u0027ResourceProvider\u0027),"},{"line_number":535,"context_line":"        \u0027resource_class\u0027: fields.StringField(read_only\u003dTrue),"},{"line_number":536,"context_line":"        \u0027total\u0027: fields.NonNegativeIntegerField(),"},{"line_number":537,"context_line":"        \u0027reserved\u0027: fields.NonNegativeIntegerField(default\u003d0),"},{"line_number":538,"context_line":"        \u0027min_unit\u0027: fields.NonNegativeIntegerField(default\u003d1),"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa6399be_ee739c13","line":535,"updated":"2016-10-12 11:15:46.000000000","message":"Why did we change this to StringField, given ResourceClassField is a string field now?\n\nTrying to work out why Usage is different, and stays as a ResourceClassField.","commit_id":"ac179a1403904ce80f8763cc7f2f86d8a869539c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"07f4fc53075ccc37cb6db33162d054ca215c7300","unresolved":false,"context_lines":[{"line_number":532,"context_line":"    fields \u003d {"},{"line_number":533,"context_line":"        \u0027id\u0027: fields.IntegerField(read_only\u003dTrue),"},{"line_number":534,"context_line":"        \u0027resource_provider\u0027: fields.ObjectField(\u0027ResourceProvider\u0027),"},{"line_number":535,"context_line":"        \u0027resource_class\u0027: fields.StringField(read_only\u003dTrue),"},{"line_number":536,"context_line":"        \u0027total\u0027: fields.NonNegativeIntegerField(),"},{"line_number":537,"context_line":"        \u0027reserved\u0027: fields.NonNegativeIntegerField(default\u003d0),"},{"line_number":538,"context_line":"        \u0027min_unit\u0027: fields.NonNegativeIntegerField(default\u003d1),"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa6399be_f077ef9c","line":535,"in_reply_to":"fa6399be_ee739c13","updated":"2016-10-12 14:34:00.000000000","message":"Presumably the goal was to move us back to a string field, but leave the ResourceClassField definition for short-term posterity and for the definition of what used to be in there that we use.\n\nNow that you call it out, we could potentially remove that entirely and fix up all the usage, or just comment above it that it\u0027s now useless.\n\nThat said.. Jay, I wonder if we want to actually keep it as slightly special (i.e. not a bare StringField) and enforce the same schema you use for the API? As a StringField, it can have \"foo/%$\" in it, but the API would never have allowed that. Perhaps we should keep these as ResourceClassFields, but not enums, and with coerce methods that ensure the schema matches?","commit_id":"ac179a1403904ce80f8763cc7f2f86d8a869539c"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"40374dd5777388c6c454637301c048d0c0c63bbb","unresolved":false,"context_lines":[{"line_number":932,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":933,"context_line":"class Usage(base.NovaObject):"},{"line_number":934,"context_line":"    # Version 1.0: Initial version"},{"line_number":935,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":936,"context_line":""},{"line_number":937,"context_line":"    fields \u003d {"},{"line_number":938,"context_line":"        \u0027resource_class\u0027: fields.ResourceClassField(read_only\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa6399be_4e83a804","line":935,"updated":"2016-10-12 11:15:46.000000000","message":"Don\u0027t we need to bump the version here, because the ResourceClassField has changed?\n\nI presume we should raise like we do for the Inventory?","commit_id":"ac179a1403904ce80f8763cc7f2f86d8a869539c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"07f4fc53075ccc37cb6db33162d054ca215c7300","unresolved":false,"context_lines":[{"line_number":932,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":933,"context_line":"class Usage(base.NovaObject):"},{"line_number":934,"context_line":"    # Version 1.0: Initial version"},{"line_number":935,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":936,"context_line":""},{"line_number":937,"context_line":"    fields \u003d {"},{"line_number":938,"context_line":"        \u0027resource_class\u0027: fields.ResourceClassField(read_only\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa6399be_ed98f81d","line":935,"in_reply_to":"fa6399be_4e83a804","updated":"2016-10-12 14:34:00.000000000","message":"Yes, good catch!","commit_id":"ac179a1403904ce80f8763cc7f2f86d8a869539c"},{"author":{"_account_id":16907,"name":"Diana Clarke","email":"diana.joan.clarke@gmail.com","username":"diana-clarke"},"change_message_id":"792b4287b756e494faa3354539ba8226891116bf","unresolved":false,"context_lines":[{"line_number":35,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"@db_api.api_context_manager.reader"},{"line_number":39,"context_line":"def _ensure_rc_cache(ctx):"},{"line_number":40,"context_line":"    \"\"\"Ensures that a singleton resource class cache has been created in the"},{"line_number":41,"context_line":"    module\u0027s scope."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    :param ctx: `nova.context.RequestContext` that may be used to grab a DB"},{"line_number":44,"context_line":"                connection."},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    global _RC_CACHE"},{"line_number":47,"context_line":"    if _RC_CACHE is not None:"},{"line_number":48,"context_line":"        return"},{"line_number":49,"context_line":"    _RC_CACHE \u003d rc_cache.ResourceClassCache(ctx)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def _get_current_inventory_resources(conn, rp):"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5da102_bb102c50","line":49,"range":{"start_line":38,"start_character":0,"end_line":49,"end_character":48},"updated":"2016-10-27 14:02:55.000000000","message":"FYI - when you have a chance: this resulted in 10 new database poison warnings.\n\n- http://paste.openstack.org/show/587184/","commit_id":"5661f879b07ee61d3f22b15175e778c50e42ff2d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"855d813d44be7e18d455f454dc1291d5c1e489ad","unresolved":false,"context_lines":[{"line_number":35,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"@db_api.api_context_manager.reader"},{"line_number":39,"context_line":"def _ensure_rc_cache(ctx):"},{"line_number":40,"context_line":"    \"\"\"Ensures that a singleton resource class cache has been created in the"},{"line_number":41,"context_line":"    module\u0027s scope."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    :param ctx: `nova.context.RequestContext` that may be used to grab a DB"},{"line_number":44,"context_line":"                connection."},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    global _RC_CACHE"},{"line_number":47,"context_line":"    if _RC_CACHE is not None:"},{"line_number":48,"context_line":"        return"},{"line_number":49,"context_line":"    _RC_CACHE \u003d rc_cache.ResourceClassCache(ctx)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def _get_current_inventory_resources(conn, rp):"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5da102_c0e8807f","line":49,"range":{"start_line":38,"start_character":0,"end_line":49,"end_character":48},"in_reply_to":"ba5da102_bb102c50","updated":"2016-10-28 07:38:10.000000000","message":"Thanks for the heads up Diana. I\u0027ll address those warnings in a follow up patch.\n\nCheers!\n\n-jay","commit_id":"5661f879b07ee61d3f22b15175e778c50e42ff2d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a55fb0d546843932ad251f44c973289d56fa3be","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        res \u003d conn.execute(upd_stmt)"},{"line_number":161,"context_line":"        if not res.rowcount:"},{"line_number":162,"context_line":"            raise exception.NotFound("},{"line_number":163,"context_line":"                \u0027No inventory of class %s found for update\u0027 % rc_str)"},{"line_number":164,"context_line":"    return exceeded"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da6895a0_ec3046a1","line":163,"updated":"2016-10-21 03:34:42.000000000","message":"nit: at some point we need to mark this error message for translation because it\u0027s used in the REST API here:\n\nhttps://review.openstack.org/#/c/379656/12/nova/api/openstack/placement/handlers/inventory.py@223","commit_id":"5661f879b07ee61d3f22b15175e778c50e42ff2d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a55fb0d546843932ad251f44c973289d56fa3be","unresolved":false,"context_lines":[{"line_number":195,"context_line":"    _ensure_rc_cache(context)"},{"line_number":196,"context_line":"    rc_id \u003d _RC_CACHE.id_from_string(inventory.resource_class)"},{"line_number":197,"context_line":"    if rc_id is None:"},{"line_number":198,"context_line":"        raise exception.NotFound(\"No such resource class \u0027%s\u0027\" %"},{"line_number":199,"context_line":"                                 inventory.resource_class)"},{"line_number":200,"context_line":"    inv_list \u003d InventoryList(objects\u003d[inventory])"},{"line_number":201,"context_line":"    conn \u003d context.session.connection()"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6895a0_8c1a6a16","line":198,"updated":"2016-10-21 03:34:42.000000000","message":"This should be marked for translation.","commit_id":"5661f879b07ee61d3f22b15175e778c50e42ff2d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a55fb0d546843932ad251f44c973289d56fa3be","unresolved":false,"context_lines":[{"line_number":211,"context_line":"    _ensure_rc_cache(context)"},{"line_number":212,"context_line":"    rc_id \u003d _RC_CACHE.id_from_string(inventory.resource_class)"},{"line_number":213,"context_line":"    if rc_id is None:"},{"line_number":214,"context_line":"        raise exception.NotFound(\"No such resource class \u0027%s\u0027\" %"},{"line_number":215,"context_line":"                                 inventory.resource_class)"},{"line_number":216,"context_line":"    inv_list \u003d InventoryList(objects\u003d[inventory])"},{"line_number":217,"context_line":"    conn \u003d context.session.connection()"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6895a0_ccd2a234","line":214,"updated":"2016-10-21 03:34:42.000000000","message":"ditto","commit_id":"5661f879b07ee61d3f22b15175e778c50e42ff2d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a55fb0d546843932ad251f44c973289d56fa3be","unresolved":false,"context_lines":[{"line_number":231,"context_line":"    with conn.begin():"},{"line_number":232,"context_line":"        if not _delete_inventory_from_provider(conn, rp, [rc_id]):"},{"line_number":233,"context_line":"            raise exception.NotFound("},{"line_number":234,"context_line":"                \u0027No inventory of class %s found for delete\u0027"},{"line_number":235,"context_line":"                % resource_class)"},{"line_number":236,"context_line":"        rp.generation \u003d _increment_provider_generation(conn, rp)"},{"line_number":237,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da6895a0_2ce23e04","line":234,"updated":"2016-10-21 03:34:42.000000000","message":"ditto","commit_id":"5661f879b07ee61d3f22b15175e778c50e42ff2d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a55fb0d546843932ad251f44c973289d56fa3be","unresolved":false,"context_lines":[{"line_number":252,"context_line":"            in between the time when this object was originally read"},{"line_number":253,"context_line":"            and the call to set the inventory."},{"line_number":254,"context_line":"    \"\"\""},{"line_number":255,"context_line":"    _ensure_rc_cache(context)"},{"line_number":256,"context_line":"    conn \u003d context.session.connection()"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    existing_resources \u003d _get_current_inventory_resources(conn, rp)"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6895a0_eca5a6b5","line":255,"range":{"start_line":255,"start_character":4,"end_line":255,"end_character":20},"updated":"2016-10-21 03:34:42.000000000","message":"Rather than calling this in every one of these methods, couldn\u0027t we just do it once when creating ResourceProvider?","commit_id":"5661f879b07ee61d3f22b15175e778c50e42ff2d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a55fb0d546843932ad251f44c973289d56fa3be","unresolved":false,"context_lines":[{"line_number":556,"context_line":"        if \u0027id\u0027 in self:"},{"line_number":557,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":558,"context_line":"                                              reason\u003d\u0027already created\u0027)"},{"line_number":559,"context_line":"        _ensure_rc_cache(self._context)"},{"line_number":560,"context_line":"        updates \u003d self._make_db(self.obj_get_changes())"},{"line_number":561,"context_line":"        db_inventory \u003d self._create_in_db(self._context, updates)"},{"line_number":562,"context_line":"        self._from_db_object(self._context, self, db_inventory)"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6895a0_4c95b23e","line":559,"updated":"2016-10-21 03:34:42.000000000","message":"move this into _make_db?","commit_id":"5661f879b07ee61d3f22b15175e778c50e42ff2d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a55fb0d546843932ad251f44c973289d56fa3be","unresolved":false,"context_lines":[{"line_number":666,"context_line":"        if \u0027id\u0027 in self:"},{"line_number":667,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":668,"context_line":"                                              reason\u003d\u0027already created\u0027)"},{"line_number":669,"context_line":"        _ensure_rc_cache(self._context)"},{"line_number":670,"context_line":"        updates \u003d self._make_db(self.obj_get_changes())"},{"line_number":671,"context_line":"        db_allocation \u003d self._create_in_db(self._context, updates)"},{"line_number":672,"context_line":"        self._from_db_object(self._context, self, db_allocation)"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6895a0_8c9fca5e","line":669,"updated":"2016-10-21 03:34:42.000000000","message":"move this into _make_db?","commit_id":"5661f879b07ee61d3f22b15175e778c50e42ff2d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a55fb0d546843932ad251f44c973289d56fa3be","unresolved":false,"context_lines":[{"line_number":861,"context_line":"        # resource class names that don\u0027t exist."},{"line_number":862,"context_line":"        for alloc in allocs:"},{"line_number":863,"context_line":"            if _RC_CACHE.id_from_string(alloc.resource_class) is None:"},{"line_number":864,"context_line":"                raise exception.NotFound(\"No such resource class \u0027%s\u0027\" %"},{"line_number":865,"context_line":"                                         alloc.resource_class)"},{"line_number":866,"context_line":""},{"line_number":867,"context_line":"        # Before writing any allocation records, we check that the submitted"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6895a0_acd80e1f","line":864,"updated":"2016-10-21 03:34:42.000000000","message":"mark for translation - should probably just have a custom ResourceClassNotFound exception at some point.","commit_id":"5661f879b07ee61d3f22b15175e778c50e42ff2d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a55fb0d546843932ad251f44c973289d56fa3be","unresolved":false,"context_lines":[{"line_number":933,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":934,"context_line":""},{"line_number":935,"context_line":"    fields \u003d {"},{"line_number":936,"context_line":"        \u0027resource_class\u0027: fields.ResourceClassField(read_only\u003dTrue),"},{"line_number":937,"context_line":"        \u0027usage\u0027: fields.NonNegativeIntegerField(),"},{"line_number":938,"context_line":"    }"},{"line_number":939,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da6895a0_6c519662","line":936,"range":{"start_line":936,"start_character":9,"end_line":936,"end_character":23},"updated":"2016-10-21 03:34:42.000000000","message":"Why don\u0027t you have the v1.0 obj_make_compatible check for this?","commit_id":"5661f879b07ee61d3f22b15175e778c50e42ff2d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"88ce69855b8a14d4b4ca9544af2545a188853eaf","unresolved":false,"context_lines":[{"line_number":933,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":934,"context_line":""},{"line_number":935,"context_line":"    fields \u003d {"},{"line_number":936,"context_line":"        \u0027resource_class\u0027: fields.ResourceClassField(read_only\u003dTrue),"},{"line_number":937,"context_line":"        \u0027usage\u0027: fields.NonNegativeIntegerField(),"},{"line_number":938,"context_line":"    }"},{"line_number":939,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da6895a0_80f3e172","line":936,"range":{"start_line":936,"start_character":9,"end_line":936,"end_character":23},"in_reply_to":"da6895a0_6c519662","updated":"2016-10-23 06:27:34.000000000","message":"We don\u0027t send this over RPC anywhere that I know of, which probably means I didn\u0027t need to make us bump the version. But yes, if we\u0027re going to be clean and bump the version just to be sure, we should have the backport routine as well:\n\nhttps://review.openstack.org/#/c/390043/","commit_id":"5661f879b07ee61d3f22b15175e778c50e42ff2d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a55fb0d546843932ad251f44c973289d56fa3be","unresolved":false,"context_lines":[{"line_number":955,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":956,"context_line":"class UsageList(base.ObjectListBase, base.NovaObject):"},{"line_number":957,"context_line":"    # Version 1.0: Initial version"},{"line_number":958,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":959,"context_line":""},{"line_number":960,"context_line":"    fields \u003d {"},{"line_number":961,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027Usage\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6895a0_ecc046e3","line":958,"updated":"2016-10-21 03:34:42.000000000","message":"I\u0027m probably dating my thinking on how these relationships are handled, but back in the day we used to have to bump the *List objects when one of their \u0027children\u0027 versions were bumped - that\u0027s no longer an issue? It was quite awhile back where I think that changed so I\u0027ve just forgotten.","commit_id":"5661f879b07ee61d3f22b15175e778c50e42ff2d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"88ce69855b8a14d4b4ca9544af2545a188853eaf","unresolved":false,"context_lines":[{"line_number":955,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":956,"context_line":"class UsageList(base.ObjectListBase, base.NovaObject):"},{"line_number":957,"context_line":"    # Version 1.0: Initial version"},{"line_number":958,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":959,"context_line":""},{"line_number":960,"context_line":"    fields \u003d {"},{"line_number":961,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027Usage\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6895a0_e0265d15","line":958,"in_reply_to":"da6895a0_ecc046e3","updated":"2016-10-23 06:27:34.000000000","message":"No, we don\u0027t need to do that stuff anymore. Since like Liberty :)","commit_id":"5661f879b07ee61d3f22b15175e778c50e42ff2d"}],"nova/tests/unit/objects/test_objects.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8c81e96706447728a0c35f8a252dc0285e472236","unresolved":false,"context_lines":[{"line_number":1099,"context_line":"    \u0027AgentList\u0027: \u00271.0-5a7380d02c3aaf2a32fc8115ae7ca98c\u0027,"},{"line_number":1100,"context_line":"    \u0027Aggregate\u0027: \u00271.3-f315cb68906307ca2d1cca84d4753585\u0027,"},{"line_number":1101,"context_line":"    \u0027AggregateList\u0027: \u00271.2-fb6e19f3c3a3186b04eceb98b5dadbfa\u0027,"},{"line_number":1102,"context_line":"    \u0027Allocation\u0027: \u00271.0-27814e4c0cf1fd5ffaa3bcbc8f9734e5\u0027,"},{"line_number":1103,"context_line":"    \u0027AllocationList\u0027: \u00271.1-e43fe4a9c9cbbda7438b0e48332f099e\u0027,"},{"line_number":1104,"context_line":"    \u0027BandwidthUsage\u0027: \u00271.2-c6e4c779c7f40f2407e3d70022e3cd1c\u0027,"},{"line_number":1105,"context_line":"    \u0027BandwidthUsageList\u0027: \u00271.2-5fe7475ada6fe62413cbfcc06ec70746\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a95cdbc_3d539e6c","line":1102,"updated":"2016-10-07 17:04:08.000000000","message":"You can\u0027t do this. You have to bump the version and be sure to handle the case where we tried to send a non-standard value for what used to be the enum. You\u0027ll just have to explode, but if you don\u0027t you will create this circular bouncing effect between the conductor and compute until you hit max recursion.\n\nEven though we _can_ make this change gracefully, we still need to fail if we were to try to send back something that wasn\u0027t in the enum in the older nodes.","commit_id":"8fc6bfd7e4597153d2aa88775839f4bbfc382e33"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6bddab32ffc40637ae327138ebf8ccc0690285af","unresolved":false,"context_lines":[{"line_number":1099,"context_line":"    \u0027AgentList\u0027: \u00271.0-5a7380d02c3aaf2a32fc8115ae7ca98c\u0027,"},{"line_number":1100,"context_line":"    \u0027Aggregate\u0027: \u00271.3-f315cb68906307ca2d1cca84d4753585\u0027,"},{"line_number":1101,"context_line":"    \u0027AggregateList\u0027: \u00271.2-fb6e19f3c3a3186b04eceb98b5dadbfa\u0027,"},{"line_number":1102,"context_line":"    \u0027Allocation\u0027: \u00271.0-27814e4c0cf1fd5ffaa3bcbc8f9734e5\u0027,"},{"line_number":1103,"context_line":"    \u0027AllocationList\u0027: \u00271.1-e43fe4a9c9cbbda7438b0e48332f099e\u0027,"},{"line_number":1104,"context_line":"    \u0027BandwidthUsage\u0027: \u00271.2-c6e4c779c7f40f2407e3d70022e3cd1c\u0027,"},{"line_number":1105,"context_line":"    \u0027BandwidthUsageList\u0027: \u00271.2-5fe7475ada6fe62413cbfcc06ec70746\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a95cdbc_017680a3","line":1102,"in_reply_to":"1a95cdbc_3d539e6c","updated":"2016-10-07 17:12:10.000000000","message":"Gotcha, OK, will fix up.","commit_id":"8fc6bfd7e4597153d2aa88775839f4bbfc382e33"}],"nova/tests/unit/objects/test_resource_provider.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"9cb961457e84f7bfaf4797b108a12f25137c7335","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        custom (non-standardized) resource class."},{"line_number":444,"context_line":"        \"\"\""},{"line_number":445,"context_line":"        rp \u003d objects.ResourceProvider(uuid\u003duuids.rp_uuid)"},{"line_number":446,"context_line":"        from_db \u003d {"},{"line_number":447,"context_line":"            \u0027resource_provider\u0027: rp, "},{"line_number":448,"context_line":"            \u0027resource_class\u0027: \u0027custom_resource\u0027,"},{"line_number":449,"context_line":"            \u0027total\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_4893055b","line":446,"range":{"start_line":446,"start_character":8,"end_line":446,"end_character":15},"updated":"2016-10-10 17:50:22.000000000","message":"This is not \"from the database\" if it has a novaobject in it :)\n\nShould probably just be \"values\" or something. Or just skip the dict entirely.","commit_id":"da805ac3bc80e72eb79225ef9e80aac140429cdf"}]}
