)]}'
{"nova/api/metadata/base.py":[{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"ccefb071f15189947d682f2306746cc89146cb4f","unresolved":false,"context_lines":[{"line_number":322,"context_line":"            else:"},{"line_number":323,"context_line":"                keypair \u003d self.instance.keypairs[0]"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"            metadata[\u0027public_keys\u0027] \u003d {"},{"line_number":326,"context_line":"                keypair.name: keypair.public_key,"},{"line_number":327,"context_line":"            }"},{"line_number":328,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"dab17558_b9ac3536","line":325,"updated":"2016-05-09 21:09:02.000000000","message":"bleh. Why do we do things like this where we use a plural name and then don\u0027t pass in a list?\n\nTotally unrelated to this patch, it\u0027s just going to complicate things if we do want to move towards passing in multiple keypairs.","commit_id":"4773338ced3fc3a423bde96072fc8972c311b9d0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ce89796f65784b2e3c3552448bbe4cdfd5882866","unresolved":false,"context_lines":[{"line_number":322,"context_line":"            else:"},{"line_number":323,"context_line":"                keypair \u003d self.instance.keypairs[0]"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"            metadata[\u0027public_keys\u0027] \u003d {"},{"line_number":326,"context_line":"                keypair.name: keypair.public_key,"},{"line_number":327,"context_line":"            }"},{"line_number":328,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"dab17558_4738c0a0","line":325,"in_reply_to":"dab17558_b9ac3536","updated":"2016-05-09 21:31:16.000000000","message":"Yeah.\n\nI include a KeyPairList in the object instead of just one, in case of $future, but it only ever has one thing in it now to match $present.","commit_id":"4773338ced3fc3a423bde96072fc8972c311b9d0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4f30ea96eaeca3982b70a8563e35c6a4f15e111c","unresolved":false,"context_lines":[{"line_number":530,"context_line":"def get_metadata_by_instance_id(instance_id, address, ctxt\u003dNone):"},{"line_number":531,"context_line":"    ctxt \u003d ctxt or context.get_admin_context()"},{"line_number":532,"context_line":"    instance \u003d objects.Instance.get_by_uuid("},{"line_number":533,"context_line":"        ctxt, instance_id, expected_attrs\u003d[\u0027ec2_ids\u0027, \u0027flavor\u0027, \u0027info_cache\u0027,"},{"line_number":534,"context_line":"                                           \u0027metadata\u0027, \u0027system_metadata\u0027,"},{"line_number":535,"context_line":"                                           \u0027security_groups\u0027])"},{"line_number":536,"context_line":"    return InstanceMetadata(instance, address)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"dab17558_94a701a6","line":535,"range":{"start_line":533,"start_character":27,"end_line":535,"end_character":61},"updated":"2016-05-11 18:15:43.000000000","message":"Shouldn\u0027t this have keypairs in it now?","commit_id":"e83842b80b73c451f78a4bb9e7bd5dfcebdefcab"}],"nova/objects/instance.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c758ffa65f3155b27082da8f9ebd30a96eac38b0","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        super(Instance, self).obj_make_compatible(primitive, target_version)"},{"line_number":202,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":203,"context_line":"        if target_version \u003c (2, 1) and \u0027services\u0027 in primitive:"},{"line_number":204,"context_line":"            del primitive[\u0027services\u0027]"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":207,"context_line":"        super(Instance, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_1cbc0b6b","line":204,"updated":"2016-05-05 17:36:06.000000000","message":"I believe you will want to remove \u0027keypairs\u0027 from any primitive less than 2.2 target version (and add a unit test for that).","commit_id":"543526375f1e73b920a0cb4335276f9233d6c069"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"ccefb071f15189947d682f2306746cc89146cb4f","unresolved":false,"context_lines":[{"line_number":861,"context_line":"                                                expected_attrs\u003d[\u0027keypairs\u0027])"},{"line_number":862,"context_line":"            if \u0027keypairs\u0027 in inst:"},{"line_number":863,"context_line":"                self.keypairs \u003d inst.keypairs"},{"line_number":864,"context_line":"                self.keypairs.obj_reset_changes(recursive\u003dTrue)"},{"line_number":865,"context_line":"                self.obj_reset_changes([\u0027keypairs\u0027])"},{"line_number":866,"context_line":"                return"},{"line_number":867,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"dab17558_7cebdbb0","line":864,"range":{"start_line":864,"start_character":16,"end_line":864,"end_character":63},"updated":"2016-05-09 21:09:02.000000000","message":"Wouldn\u0027t line 865 take care of this if \u0027recursive\u003dTrue\u0027 were passed there?","commit_id":"4773338ced3fc3a423bde96072fc8972c311b9d0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ce89796f65784b2e3c3552448bbe4cdfd5882866","unresolved":false,"context_lines":[{"line_number":861,"context_line":"                                                expected_attrs\u003d[\u0027keypairs\u0027])"},{"line_number":862,"context_line":"            if \u0027keypairs\u0027 in inst:"},{"line_number":863,"context_line":"                self.keypairs \u003d inst.keypairs"},{"line_number":864,"context_line":"                self.keypairs.obj_reset_changes(recursive\u003dTrue)"},{"line_number":865,"context_line":"                self.obj_reset_changes([\u0027keypairs\u0027])"},{"line_number":866,"context_line":"                return"},{"line_number":867,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"dab17558_a7788c2c","line":864,"range":{"start_line":864,"start_character":16,"end_line":864,"end_character":63},"in_reply_to":"dab17558_7cebdbb0","updated":"2016-05-09 21:31:16.000000000","message":"It\u0027s complicated why this is, but partially because the Instance object does some of its own tracking, whether we propagate down to the child object when recursive\u003dTrue can depend on whether we\u0027re checking the child object for changed-ness. The loop when fields are provided iterates over the list of changes, and only runs them if that field is in the provided list. If the changed-ness doesn\u0027t already appear at the top level object, then it\u0027ll get skipped. It\u0027s not awesome.","commit_id":"4773338ced3fc3a423bde96072fc8972c311b9d0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"53c9bca1e3d090dec3a607bfee168dfaa0a2687c","unresolved":false,"context_lines":[{"line_number":467,"context_line":"            updates[\u0027extra\u0027][\u0027flavor\u0027] \u003d jsonutils.dumps(flavor_info)"},{"line_number":468,"context_line":"        keypairs \u003d updates.pop(\u0027keypairs\u0027, None)"},{"line_number":469,"context_line":"        if keypairs:"},{"line_number":470,"context_line":"            expected_attrs.append(\u0027keypairs\u0027)"},{"line_number":471,"context_line":"            updates[\u0027extra\u0027][\u0027keypairs\u0027] \u003d jsonutils.dumps("},{"line_number":472,"context_line":"                keypairs.obj_to_primitive())"},{"line_number":473,"context_line":"        vcpu_model \u003d updates.pop(\u0027vcpu_model\u0027, None)"}],"source_content_type":"text/x-python","patch_set":5,"id":"dab17558_9cd096f9","line":470,"range":{"start_line":470,"start_character":12,"end_line":470,"end_character":45},"updated":"2016-05-12 14:59:14.000000000","message":"For everything else like this in here, like numa/pci/vcpu_model, we add to expected_attrs outside the conditional block from the result of updates.pop, so why are we doing this differently here?","commit_id":"e83842b80b73c451f78a4bb9e7bd5dfcebdefcab"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"117d9cd1cd93ca1df110acf20157a14c2c943656","unresolved":false,"context_lines":[{"line_number":467,"context_line":"            updates[\u0027extra\u0027][\u0027flavor\u0027] \u003d jsonutils.dumps(flavor_info)"},{"line_number":468,"context_line":"        keypairs \u003d updates.pop(\u0027keypairs\u0027, None)"},{"line_number":469,"context_line":"        if keypairs:"},{"line_number":470,"context_line":"            expected_attrs.append(\u0027keypairs\u0027)"},{"line_number":471,"context_line":"            updates[\u0027extra\u0027][\u0027keypairs\u0027] \u003d jsonutils.dumps("},{"line_number":472,"context_line":"                keypairs.obj_to_primitive())"},{"line_number":473,"context_line":"        vcpu_model \u003d updates.pop(\u0027vcpu_model\u0027, None)"}],"source_content_type":"text/x-python","patch_set":5,"id":"dab17558_7736ade8","line":470,"range":{"start_line":470,"start_character":12,"end_line":470,"end_character":45},"in_reply_to":"dab17558_9cd096f9","updated":"2016-05-12 15:08:11.000000000","message":"Because they\u0027re nullable?\n\nThe other ones are going to load None in if nothing was specified. Flavor and keypairs are not, and thus something needs to happen later if those fields are referenced without having been loaded (and created in the db in this step).","commit_id":"e83842b80b73c451f78a4bb9e7bd5dfcebdefcab"}]}
