)]}'
{"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"5ff1df17af51982e6a5836743afc93a7cc2bc5c7","unresolved":false,"context_lines":[{"line_number":6009,"context_line":"    from nova.compute import flavors"},{"line_number":6010,"context_line":""},{"line_number":6011,"context_line":"    flavor_cache_by_id \u003d {flavor.id: flavor for flavor in flavor_cache.items()}"},{"line_number":6012,"context_line":"    if instance.instance_type_id in flavor_cache_by_id:"},{"line_number":6013,"context_line":"        instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]"},{"line_number":6014,"context_line":"    else:"},{"line_number":6015,"context_line":"        instance.flavor \u003d flavors.get_flavor(instance.instance_type_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_c2650ee1","line":6012,"updated":"2015-06-01 15:19:29.000000000","message":"Not knowing the object structure, I\u0027m guessing we are guaranteed to have the instance_type_id (being information from the instance_type table?), but not the flavor information (being the instance_type information from either the instance_system_metadata table or the instance_extra table?)?\n\nThat is to say, the instance_type table should always contain the original flavor information / id? However, the other two tables may contain no flavor information? The instance_id is coming from the former and the rest the later?","commit_id":"a35b58a04536ee931c95502e0cb71f593af52183"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"301a64a073d8515b05b5e9b94b96feeb140723b7","unresolved":false,"context_lines":[{"line_number":6009,"context_line":"    from nova.compute import flavors"},{"line_number":6010,"context_line":""},{"line_number":6011,"context_line":"    flavor_cache_by_id \u003d {flavor.id: flavor for flavor in flavor_cache.items()}"},{"line_number":6012,"context_line":"    if instance.instance_type_id in flavor_cache_by_id:"},{"line_number":6013,"context_line":"        instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]"},{"line_number":6014,"context_line":"    else:"},{"line_number":6015,"context_line":"        instance.flavor \u003d flavors.get_flavor(instance.instance_type_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5afe65bd_28b9432f","line":6012,"in_reply_to":"5afe65bd_25fcce3d","updated":"2015-06-01 15:55:13.000000000","message":"Are you saying you see instances in your DB with instance_type_id\u003dNULL? If so, can you determine how old they were (i.e. when they were created) and/or if they are special in any other way?\n\nWe have other places in the production code that seem to pretty much assume that instance_type_id is present for any non-ERROR instance, so I\u0027m not sure we need to do anything here. Perhaps a little more defense for just skipping it, but... I dunno.","commit_id":"a35b58a04536ee931c95502e0cb71f593af52183"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"713d03b78c753a99ee5181fe0d9ad65bdafa5a87","unresolved":false,"context_lines":[{"line_number":6009,"context_line":"    from nova.compute import flavors"},{"line_number":6010,"context_line":""},{"line_number":6011,"context_line":"    flavor_cache_by_id \u003d {flavor.id: flavor for flavor in flavor_cache.items()}"},{"line_number":6012,"context_line":"    if instance.instance_type_id in flavor_cache_by_id:"},{"line_number":6013,"context_line":"        instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]"},{"line_number":6014,"context_line":"    else:"},{"line_number":6015,"context_line":"        instance.flavor \u003d flavors.get_flavor(instance.instance_type_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5afe65bd_e8ed6b8f","line":6012,"in_reply_to":"5afe65bd_28b9432f","updated":"2015-06-01 16:13:06.000000000","message":"+1\n\nWe should get all these examples to turbo hipster as well, ideally.\n\nI am tempted by the idea of adding a non-null constraint on that column, similar to the uuid is unique one, but its probably too expensive or something.","commit_id":"a35b58a04536ee931c95502e0cb71f593af52183"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"a1de11aa3072059127b3fa496b668a0448ee5704","unresolved":false,"context_lines":[{"line_number":6009,"context_line":"    from nova.compute import flavors"},{"line_number":6010,"context_line":""},{"line_number":6011,"context_line":"    flavor_cache_by_id \u003d {flavor.id: flavor for flavor in flavor_cache.items()}"},{"line_number":6012,"context_line":"    if instance.instance_type_id in flavor_cache_by_id:"},{"line_number":6013,"context_line":"        instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]"},{"line_number":6014,"context_line":"    else:"},{"line_number":6015,"context_line":"        instance.flavor \u003d flavors.get_flavor(instance.instance_type_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5afe65bd_5910d34e","line":6012,"in_reply_to":"5afe65bd_e8ed6b8f","updated":"2015-06-01 16:58:46.000000000","message":"All of the examples we have were in a non-production environment and were instances created within a 16s window in June of last year. I could probably track down the code in play then, but I don\u0027t know the knowledge is worth the effort of investigation.","commit_id":"a35b58a04536ee931c95502e0cb71f593af52183"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"cf08ea9b50409b8b9223a1723734412483d9f29c","unresolved":false,"context_lines":[{"line_number":6009,"context_line":"    from nova.compute import flavors"},{"line_number":6010,"context_line":""},{"line_number":6011,"context_line":"    flavor_cache_by_id \u003d {flavor.id: flavor for flavor in flavor_cache.items()}"},{"line_number":6012,"context_line":"    if instance.instance_type_id in flavor_cache_by_id:"},{"line_number":6013,"context_line":"        instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]"},{"line_number":6014,"context_line":"    else:"},{"line_number":6015,"context_line":"        instance.flavor \u003d flavors.get_flavor(instance.instance_type_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5afe65bd_25fcce3d","line":6012,"in_reply_to":"7a016987_22106258","updated":"2015-06-01 15:48:15.000000000","message":"So, it turns out that you can have an instance without an instance_type_id. I suspect this is a result of something bad happening that we were able to observe such and I do not know that we should change our assumptions about this always being present. It seems like a reasonable precondtion for the contract to which this code complies.","commit_id":"a35b58a04536ee931c95502e0cb71f593af52183"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"cc69569c2d40ccf82d554b6db1be8a108883b709","unresolved":false,"context_lines":[{"line_number":6009,"context_line":"    from nova.compute import flavors"},{"line_number":6010,"context_line":""},{"line_number":6011,"context_line":"    flavor_cache_by_id \u003d {flavor.id: flavor for flavor in flavor_cache.items()}"},{"line_number":6012,"context_line":"    if instance.instance_type_id in flavor_cache_by_id:"},{"line_number":6013,"context_line":"        instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]"},{"line_number":6014,"context_line":"    else:"},{"line_number":6015,"context_line":"        instance.flavor \u003d flavors.get_flavor(instance.instance_type_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_22106258","line":6012,"in_reply_to":"7a016987_c2650ee1","updated":"2015-06-01 15:30:52.000000000","message":"Yeah, we\u0027ve always got an instance_type_id on the instance. Technically it\u0027s nullable, but it can\u0027t ever actually be NULL, AFAIK.","commit_id":"a35b58a04536ee931c95502e0cb71f593af52183"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"891703c38a9a1a60663d65c4f9a085581f492088","unresolved":false,"context_lines":[{"line_number":6012,"context_line":"    if instance.instance_type_id in flavor_cache_by_id:"},{"line_number":6013,"context_line":"        instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]"},{"line_number":6014,"context_line":"    else:"},{"line_number":6015,"context_line":"        instance.flavor \u003d flavors.get_flavor(instance.instance_type_id)"},{"line_number":6016,"context_line":"        flavor_cache[instance.flavor.flavorid] \u003d instance.flavor"},{"line_number":6017,"context_line":"    instance.old_flavor \u003d None"},{"line_number":6018,"context_line":"    instance.new_flavor \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_1dc70e97","line":6015,"updated":"2015-06-01 14:30:59.000000000","message":"I wonder if we should handle when its missing?\n\nNot really sure what to do, skip and log a warning is possibly the most sensible thing. Its such an edge case, and manual intervention is best at that point I think.","commit_id":"a35b58a04536ee931c95502e0cb71f593af52183"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"fcb3b9818845b80d483a4b8b0453a16a64d0d77a","unresolved":false,"context_lines":[{"line_number":6012,"context_line":"    if instance.instance_type_id in flavor_cache_by_id:"},{"line_number":6013,"context_line":"        instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]"},{"line_number":6014,"context_line":"    else:"},{"line_number":6015,"context_line":"        instance.flavor \u003d flavors.get_flavor(instance.instance_type_id)"},{"line_number":6016,"context_line":"        flavor_cache[instance.flavor.flavorid] \u003d instance.flavor"},{"line_number":6017,"context_line":"    instance.old_flavor \u003d None"},{"line_number":6018,"context_line":"    instance.new_flavor \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_5da9068f","line":6015,"in_reply_to":"7a016987_1dc70e97","updated":"2015-06-01 14:34:36.000000000","message":"Yeah, agreed. I\u0027ll add that and a test.","commit_id":"a35b58a04536ee931c95502e0cb71f593af52183"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"cc69569c2d40ccf82d554b6db1be8a108883b709","unresolved":false,"context_lines":[{"line_number":6012,"context_line":"    if instance.instance_type_id in flavor_cache_by_id:"},{"line_number":6013,"context_line":"        instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]"},{"line_number":6014,"context_line":"    else:"},{"line_number":6015,"context_line":"        instance.flavor \u003d flavors.get_flavor(instance.instance_type_id)"},{"line_number":6016,"context_line":"        flavor_cache[instance.flavor.flavorid] \u003d instance.flavor"},{"line_number":6017,"context_line":"    instance.old_flavor \u003d None"},{"line_number":6018,"context_line":"    instance.new_flavor \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_a2045217","line":6015,"in_reply_to":"7a016987_42bfdecf","updated":"2015-06-01 15:30:52.000000000","message":"Not IMHO. If the flavor info is missing, we should bail and require manual fixup before continuing.","commit_id":"a35b58a04536ee931c95502e0cb71f593af52183"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"5ff1df17af51982e6a5836743afc93a7cc2bc5c7","unresolved":false,"context_lines":[{"line_number":6012,"context_line":"    if instance.instance_type_id in flavor_cache_by_id:"},{"line_number":6013,"context_line":"        instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]"},{"line_number":6014,"context_line":"    else:"},{"line_number":6015,"context_line":"        instance.flavor \u003d flavors.get_flavor(instance.instance_type_id)"},{"line_number":6016,"context_line":"        flavor_cache[instance.flavor.flavorid] \u003d instance.flavor"},{"line_number":6017,"context_line":"    instance.old_flavor \u003d None"},{"line_number":6018,"context_line":"    instance.new_flavor \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_42bfdecf","line":6015,"in_reply_to":"7a016987_5da9068f","updated":"2015-06-01 15:19:29.000000000","message":"Would it be appropriate to set the flavor information in instance_extra to unknown?","commit_id":"a35b58a04536ee931c95502e0cb71f593af52183"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"5ff1df17af51982e6a5836743afc93a7cc2bc5c7","unresolved":false,"context_lines":[{"line_number":6058,"context_line":"        # old_ and new_flavor are None). No need to augment with extra_specs"},{"line_number":6059,"context_line":"        # since we\u0027re doing the lookup from scratch."},{"line_number":6060,"context_line":"        if not instance.obj_attr_is_set(\u0027flavor\u0027):"},{"line_number":6061,"context_line":"            LOG.warn(\u0027Doing raw load because %s\u0027 % instance.system_metadata)"},{"line_number":6062,"context_line":"            _load_missing_flavor(instance, flavor_cache)"},{"line_number":6063,"context_line":"        else:"},{"line_number":6064,"context_line":"            _augment_flavors_to_migrate(instance, flavor_cache)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_b8280898","line":6061,"updated":"2015-06-01 15:19:29.000000000","message":"Did you a word or is the \u0027because\u0027 clear from the instance.system_metadata? instance.system_metadata contains all of the system_metadata entries for the instance which would be missing the flavor information?","commit_id":"a35b58a04536ee931c95502e0cb71f593af52183"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"cc69569c2d40ccf82d554b6db1be8a108883b709","unresolved":false,"context_lines":[{"line_number":6058,"context_line":"        # old_ and new_flavor are None). No need to augment with extra_specs"},{"line_number":6059,"context_line":"        # since we\u0027re doing the lookup from scratch."},{"line_number":6060,"context_line":"        if not instance.obj_attr_is_set(\u0027flavor\u0027):"},{"line_number":6061,"context_line":"            LOG.warn(\u0027Doing raw load because %s\u0027 % instance.system_metadata)"},{"line_number":6062,"context_line":"            _load_missing_flavor(instance, flavor_cache)"},{"line_number":6063,"context_line":"        else:"},{"line_number":6064,"context_line":"            _augment_flavors_to_migrate(instance, flavor_cache)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_25074c19","line":6061,"in_reply_to":"7a016987_b8280898","updated":"2015-06-01 15:30:52.000000000","message":"This was debug and is removed now.","commit_id":"a35b58a04536ee931c95502e0cb71f593af52183"},{"author":{"_account_id":11069,"name":"Corey Wright","email":"undefined+launchpad@pobox.com","username":"coreywright"},"change_message_id":"c412d6cd87399e8fdca5680085e508d5ef52f9a1","unresolved":false,"context_lines":[{"line_number":6009,"context_line":"    if instance.instance_type_id in flavor_cache_by_id:"},{"line_number":6010,"context_line":"        instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]"},{"line_number":6011,"context_line":"    else:"},{"line_number":6012,"context_line":"        instance.flavor \u003d flavor_get(instance._context,"},{"line_number":6013,"context_line":"                                     instance.instance_type_id)"},{"line_number":6014,"context_line":"        flavor_cache[instance.flavor.flavorid] \u003d instance.flavor"},{"line_number":6015,"context_line":"    instance.old_flavor \u003d None"}],"source_content_type":"text/x-python","patch_set":4,"id":"5afe65bd_d157f7c8","line":6012,"updated":"2015-06-01 19:24:38.000000000","message":"ValueError: An object of type Flavor is required here\n\nI believe flavor_get() returns a dict but an Instance\u0027s flavor attribute must be a Flavor object.","commit_id":"e149d960c188514728cdbeddc7227235000194b6"},{"author":{"_account_id":11069,"name":"Corey Wright","email":"undefined+launchpad@pobox.com","username":"coreywright"},"change_message_id":"46aab24a32c03f5ca037d80ed2b5727fe384937c","unresolved":false,"context_lines":[{"line_number":6009,"context_line":"    if instance.instance_type_id in flavor_cache_by_id:"},{"line_number":6010,"context_line":"        instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]"},{"line_number":6011,"context_line":"    else:"},{"line_number":6012,"context_line":"        instance.flavor \u003d flavor_get(instance._context,"},{"line_number":6013,"context_line":"                                     instance.instance_type_id)"},{"line_number":6014,"context_line":"        flavor_cache[instance.flavor.flavorid] \u003d instance.flavor"},{"line_number":6015,"context_line":"    instance.old_flavor \u003d None"}],"source_content_type":"text/x-python","patch_set":4,"id":"5afe65bd_27c5e95a","line":6012,"in_reply_to":"5afe65bd_07d0ad52","updated":"2015-06-01 20:26:54.000000000","message":"my attempt: http://paste.openstack.org/show/253835/","commit_id":"e149d960c188514728cdbeddc7227235000194b6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"85193725eae600a4f00af5e2b2491eb21937bdd2","unresolved":false,"context_lines":[{"line_number":6009,"context_line":"    if instance.instance_type_id in flavor_cache_by_id:"},{"line_number":6010,"context_line":"        instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]"},{"line_number":6011,"context_line":"    else:"},{"line_number":6012,"context_line":"        instance.flavor \u003d flavor_get(instance._context,"},{"line_number":6013,"context_line":"                                     instance.instance_type_id)"},{"line_number":6014,"context_line":"        flavor_cache[instance.flavor.flavorid] \u003d instance.flavor"},{"line_number":6015,"context_line":"    instance.old_flavor \u003d None"}],"source_content_type":"text/x-python","patch_set":4,"id":"5afe65bd_07d0ad52","line":6012,"in_reply_to":"5afe65bd_d157f7c8","updated":"2015-06-01 20:20:17.000000000","message":"Yep, damn, I had this right in the first version and brain-farted my way into doing this to avoid the circular import of flavors.","commit_id":"e149d960c188514728cdbeddc7227235000194b6"},{"author":{"_account_id":11069,"name":"Corey Wright","email":"undefined+launchpad@pobox.com","username":"coreywright"},"change_message_id":"f0fc2e8e051a024ee10164e1c81a344783766d10","unresolved":false,"context_lines":[{"line_number":6010,"context_line":""},{"line_number":6011,"context_line":"    deleted_ctx \u003d instance._context.elevated(read_deleted\u003d\u0027yes\u0027)"},{"line_number":6012,"context_line":""},{"line_number":6013,"context_line":"    flavor_cache_by_id \u003d {flavor.id: flavor for flavor in flavor_cache.items()}"},{"line_number":6014,"context_line":"    if instance.instance_type_id in flavor_cache_by_id:"},{"line_number":6015,"context_line":"        instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]"},{"line_number":6016,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5afe65bd_73acc3ed","line":6013,"updated":"2015-06-01 22:17:17.000000000","message":"i believe the cache consists of both flavor objects and flavor dicts (as put into the cache below and in _augment_flavors_to_migrate(), respectively), so \"flavor.id\" will fail on a flavor dict.  \"flavor[\u0027id\u0027]\" works in both cases, but fails below on \"instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]\" because we can\u0027t assign a flavor dict to an instance\u0027s flavor attribute as it expects a flavor object.\n\na flavor dict and flavor object both work with \"db_flavor[\u0027extra_specs\u0027]\" in _augment_flavor_to_migrate(), but out of my ignorance of the implicit intricacies of nova objects i\u0027m afraid to make any claims beyond that (eg it\u0027s fine that we are assigning the same flavor object to multiple instances out of the cache).\n\nmy alternative implementation is http://paste.openstack.org/show/253924/ where i kept everything as dicts because i can reason about them better than objects (again, admittedly out of ignorance) and we only ever iterative over the items in the dict (eg in _augment_flavor_to_migrate() and objects.flavor.Flavor._from_db_object()) and not assign the dict wholesale.\n\nthough maybe it is better to change _augment_flavors_to_migrate() to put flavor objects into the cache, but i haven\u0027t fully thought through the ramifications of that.","commit_id":"aa6b6ad789e60cdbd255c00f3e54e92035b7e720"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"622e415d21dfdbefc6c979b5d487486b21e8075e","unresolved":false,"context_lines":[{"line_number":6010,"context_line":""},{"line_number":6011,"context_line":"    deleted_ctx \u003d instance._context.elevated(read_deleted\u003d\u0027yes\u0027)"},{"line_number":6012,"context_line":""},{"line_number":6013,"context_line":"    flavor_cache_by_id \u003d {flavor.id: flavor for flavor in flavor_cache.items()}"},{"line_number":6014,"context_line":"    if instance.instance_type_id in flavor_cache_by_id:"},{"line_number":6015,"context_line":"        instance.flavor \u003d flavor_cache_by_id[instance.instance_type_id]"},{"line_number":6016,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5afe65bd_f3f2f36e","line":6013,"in_reply_to":"5afe65bd_73acc3ed","updated":"2015-06-01 22:27:47.000000000","message":"Putting dicts in the cache doesn\u0027t help us as much because we need the actual flavor objects to set on the instance object. If we store dicts (assuming they\u0027re complete with extra_specs) then we have to convert the dict to an object every single time we use an item out of the cache, which defeats some of the performance advantage.\n\nThis doesn\u0027t matter for _augment* because it\u0027s just using extra_specs from the flavor. Converting it to stash the object is probably the best thing here since it saves us from the aforementioned conversion.\n\nI\u0027ll add a test to make sure that we test the with-and-without-sysmeta path which should trigger this failure I think.","commit_id":"aa6b6ad789e60cdbd255c00f3e54e92035b7e720"}],"nova/tests/unit/db/test_db_api.py":[{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"5ff1df17af51982e6a5836743afc93a7cc2bc5c7","unresolved":false,"context_lines":[{"line_number":7742,"context_line":"        flavor_cache \u003d {}"},{"line_number":7743,"context_line":"        db.migrate_flavor_data(ctxt, None, flavor_cache)"},{"line_number":7744,"context_line":"        mock_get_flavor.assert_called_once_with(123)"},{"line_number":7745,"context_line":"        self.assertIn(flavor.flavorid, flavor_cache)"},{"line_number":7746,"context_line":""},{"line_number":7747,"context_line":""},{"line_number":7748,"context_line":"class ArchiveTestCase(test.TestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_02ac469d","line":7745,"updated":"2015-06-01 15:19:29.000000000","message":"Should there be a check to verify the data is in instance_extra, or did I miss that bit?","commit_id":"a35b58a04536ee931c95502e0cb71f593af52183"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"cc69569c2d40ccf82d554b6db1be8a108883b709","unresolved":false,"context_lines":[{"line_number":7742,"context_line":"        flavor_cache \u003d {}"},{"line_number":7743,"context_line":"        db.migrate_flavor_data(ctxt, None, flavor_cache)"},{"line_number":7744,"context_line":"        mock_get_flavor.assert_called_once_with(123)"},{"line_number":7745,"context_line":"        self.assertIn(flavor.flavorid, flavor_cache)"},{"line_number":7746,"context_line":""},{"line_number":7747,"context_line":""},{"line_number":7748,"context_line":"class ArchiveTestCase(test.TestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_a5321cf0","line":7745,"in_reply_to":"7a016987_02ac469d","updated":"2015-06-01 15:30:52.000000000","message":"Nope, I guess I technically didn\u0027t verify that we set it on the instance, so I\u0027ll add that.","commit_id":"a35b58a04536ee931c95502e0cb71f593af52183"}]}
