)]}'
{"run_tests.py":[{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"33a2a77c8437ba70ba71f368af1fc17e2ae6a8d5","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    rpc.init(CONF)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    taskman_service \u003d rpc_service.RpcService("},{"line_number":79,"context_line":"        CONF.tm_rpc_encr_key, topic\u003dtopic,"},{"line_number":80,"context_line":"        rpc_api_version\u003drpc_version.RPC_API_VERSION,"},{"line_number":81,"context_line":"        manager\u003d\u0027trove.taskmanager.manager.Manager\u0027)"},{"line_number":82,"context_line":"    taskman_service.start()"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_851a326d","line":79,"updated":"2016-12-21 21:05:27.000000000","message":"At least spell out \"taskmanager\" - \"tm\" is ambiguous.  I know it\u0027s annoyingly long, but we\u0027ve just generally accepted longer names.","commit_id":"5e90e4058d1937ce2f6e744e91b152861aa93118"}],"trove/common/cfg.py":[{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":444,"context_line":"               help\u003d\u0027Maximum size of a chunk saved in guest log container.\u0027),"},{"line_number":445,"context_line":"    cfg.IntOpt(\u0027guest_log_expiry\u0027, default\u003d2592000,"},{"line_number":446,"context_line":"               help\u003d\u0027Expiry (in seconds) of objects in guest log container.\u0027),"},{"line_number":447,"context_line":"    cfg.StrOpt(\u0027taskmanager_aes_cbc_key\u0027, default\u003d\u0027taskmanager_aes_cbc_key\u0027,"},{"line_number":448,"context_line":"               help\u003d\u0027OpenSSL aes_cbc key for taskmanager RPC encryption.\u0027),"},{"line_number":449,"context_line":"    cfg.StrOpt(\u0027instance_key_aes_cbc_key\u0027, default\u003d\u0027instance_key_aes_cbc_key\u0027,"},{"line_number":450,"context_line":"               help\u003d\u0027OpenSSL aes_cbc key to encrypt instance keys in DB.\u0027),"},{"line_number":451,"context_line":"    cfg.StrOpt(\u0027instance_aes_cbc_key\u0027,"},{"line_number":452,"context_line":"               help\u003d\u0027OpenSSL aes_cbc key for instance RPC encryption.\u0027),"},{"line_number":453,"context_line":"]"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_14e604b4","line":452,"range":{"start_line":447,"start_character":4,"end_line":452,"end_character":72},"updated":"2016-12-20 18:56:56.000000000","message":"These are really misnomers as the keys aren\u0027t encrypting taskmanagers or instances.  Suggest taskmanager_rpc_key, instance_rpc_key etc.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":444,"context_line":"               help\u003d\u0027Maximum size of a chunk saved in guest log container.\u0027),"},{"line_number":445,"context_line":"    cfg.IntOpt(\u0027guest_log_expiry\u0027, default\u003d2592000,"},{"line_number":446,"context_line":"               help\u003d\u0027Expiry (in seconds) of objects in guest log container.\u0027),"},{"line_number":447,"context_line":"    cfg.StrOpt(\u0027taskmanager_aes_cbc_key\u0027, default\u003d\u0027taskmanager_aes_cbc_key\u0027,"},{"line_number":448,"context_line":"               help\u003d\u0027OpenSSL aes_cbc key for taskmanager RPC encryption.\u0027),"},{"line_number":449,"context_line":"    cfg.StrOpt(\u0027instance_key_aes_cbc_key\u0027, default\u003d\u0027instance_key_aes_cbc_key\u0027,"},{"line_number":450,"context_line":"               help\u003d\u0027OpenSSL aes_cbc key to encrypt instance keys in DB.\u0027),"},{"line_number":451,"context_line":"    cfg.StrOpt(\u0027instance_aes_cbc_key\u0027,"},{"line_number":452,"context_line":"               help\u003d\u0027OpenSSL aes_cbc key for instance RPC encryption.\u0027),"},{"line_number":453,"context_line":"]"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_5b6e42ca","line":452,"range":{"start_line":447,"start_character":4,"end_line":452,"end_character":72},"in_reply_to":"1a6eadb0_14e604b4","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"aff297138a0bb9345f9bad22feed7e248257fff3","unresolved":false,"context_lines":[{"line_number":444,"context_line":"               help\u003d\u0027Maximum size of a chunk saved in guest log container.\u0027),"},{"line_number":445,"context_line":"    cfg.IntOpt(\u0027guest_log_expiry\u0027, default\u003d2592000,"},{"line_number":446,"context_line":"               help\u003d\u0027Expiry (in seconds) of objects in guest log container.\u0027),"},{"line_number":447,"context_line":"    cfg.StrOpt(\u0027taskmanager_aes_cbc_key\u0027, default\u003d\u0027taskmanager_aes_cbc_key\u0027,"},{"line_number":448,"context_line":"               help\u003d\u0027OpenSSL aes_cbc key for taskmanager RPC encryption.\u0027),"},{"line_number":449,"context_line":"    cfg.StrOpt(\u0027instance_key_aes_cbc_key\u0027, default\u003d\u0027instance_key_aes_cbc_key\u0027,"},{"line_number":450,"context_line":"               help\u003d\u0027OpenSSL aes_cbc key to encrypt instance keys in DB.\u0027),"},{"line_number":451,"context_line":"    cfg.StrOpt(\u0027instance_aes_cbc_key\u0027,"},{"line_number":452,"context_line":"               help\u003d\u0027OpenSSL aes_cbc key for instance RPC encryption.\u0027),"},{"line_number":453,"context_line":"]"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_77773a9f","line":452,"range":{"start_line":447,"start_character":4,"end_line":452,"end_character":72},"in_reply_to":"1a6eadb0_14e604b4","updated":"2016-12-20 19:15:43.000000000","message":"see next change which is more in line with this suggestion.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"}],"trove/common/rpc/conductor_guest_serializer.py":[{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":23,"context_line":"CONF \u003d cfg.CONF"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# ConductorGuestSerializer is a serializer that will encrypt and decrypt"},{"line_number":27,"context_line":"# data that it is provided. It does this using an instance-id that is"},{"line_number":28,"context_line":"# stored in the context. The ConductorGuestSerializer is very much like the"},{"line_number":29,"context_line":"# SecureSerializer above except that it does not have a key provided"},{"line_number":30,"context_line":"# at instantiation time, and it is only intended to run in the guest."},{"line_number":31,"context_line":"#"},{"line_number":32,"context_line":"# BUG(1650518): Cleanup in the Pike release"},{"line_number":33,"context_line":"class ConductorGuestSerializer(messaging.Serializer):"},{"line_number":34,"context_line":"    def __init__(self, base, key):"},{"line_number":35,"context_line":"        self._base \u003d base"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_d7157349","line":32,"range":{"start_line":26,"start_character":0,"end_line":32,"end_character":43},"updated":"2016-12-20 18:56:56.000000000","message":"This should be a class comment.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":23,"context_line":"CONF \u003d cfg.CONF"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# ConductorGuestSerializer is a serializer that will encrypt and decrypt"},{"line_number":27,"context_line":"# data that it is provided. It does this using an instance-id that is"},{"line_number":28,"context_line":"# stored in the context. The ConductorGuestSerializer is very much like the"},{"line_number":29,"context_line":"# SecureSerializer above except that it does not have a key provided"},{"line_number":30,"context_line":"# at instantiation time, and it is only intended to run in the guest."},{"line_number":31,"context_line":"#"},{"line_number":32,"context_line":"# BUG(1650518): Cleanup in the Pike release"},{"line_number":33,"context_line":"class ConductorGuestSerializer(messaging.Serializer):"},{"line_number":34,"context_line":"    def __init__(self, base, key):"},{"line_number":35,"context_line":"        self._base \u003d base"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_5ba56202","line":32,"range":{"start_line":26,"start_character":0,"end_line":32,"end_character":43},"in_reply_to":"1a6eadb0_d7157349","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":30,"context_line":"# at instantiation time, and it is only intended to run in the guest."},{"line_number":31,"context_line":"#"},{"line_number":32,"context_line":"# BUG(1650518): Cleanup in the Pike release"},{"line_number":33,"context_line":"class ConductorGuestSerializer(messaging.Serializer):"},{"line_number":34,"context_line":"    def __init__(self, base, key):"},{"line_number":35,"context_line":"        self._base \u003d base"},{"line_number":36,"context_line":"        self._key \u003d key"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_971bfb7f","line":33,"updated":"2016-12-20 18:56:56.000000000","message":"I would rather see ConductorGuestSerializer inherit from rpc.Serializer and call common methods to do the actual encrypt/decrypt so that the logic isn\u0027t duplicated in each class.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":30,"context_line":"# at instantiation time, and it is only intended to run in the guest."},{"line_number":31,"context_line":"#"},{"line_number":32,"context_line":"# BUG(1650518): Cleanup in the Pike release"},{"line_number":33,"context_line":"class ConductorGuestSerializer(messaging.Serializer):"},{"line_number":34,"context_line":"    def __init__(self, base, key):"},{"line_number":35,"context_line":"        self._base \u003d base"},{"line_number":36,"context_line":"        self._key \u003d key"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_7baa26d6","line":33,"in_reply_to":"1a6eadb0_971bfb7f","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        raise Exception(msg)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def serialize_context(self, ctxt):"},{"line_number":61,"context_line":"        # serialize context shall return a dictionary."},{"line_number":62,"context_line":"        if self._base:"},{"line_number":63,"context_line":"            ctxt \u003d self._base.serialize_context(ctxt)"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_72ff4d01","line":61,"updated":"2016-12-20 18:56:56.000000000","message":"superfluous","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        raise Exception(msg)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def serialize_context(self, ctxt):"},{"line_number":61,"context_line":"        # serialize context shall return a dictionary."},{"line_number":62,"context_line":"        if self._base:"},{"line_number":63,"context_line":"            ctxt \u003d self._base.serialize_context(ctxt)"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_9bafcae2","line":61,"in_reply_to":"1a6eadb0_72ff4d01","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        if self._base:"},{"line_number":63,"context_line":"            ctxt \u003d self._base.serialize_context(ctxt)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        # as with serialize_entity above, we handle the upgrade case"},{"line_number":66,"context_line":"        # of not having a key."},{"line_number":67,"context_line":"        if self._key is None:"},{"line_number":68,"context_line":"            return ctxt"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_b209e52e","line":65,"updated":"2016-12-20 18:56:56.000000000","message":"ditto","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        if self._base:"},{"line_number":63,"context_line":"            ctxt \u003d self._base.serialize_context(ctxt)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        # as with serialize_entity above, we handle the upgrade case"},{"line_number":66,"context_line":"        # of not having a key."},{"line_number":67,"context_line":"        if self._key is None:"},{"line_number":68,"context_line":"            return ctxt"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_bbac8eee","line":65,"in_reply_to":"1a6eadb0_b209e52e","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            return ctxt"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        cstr \u003d jsonutils.dumps(ctxt)"},{"line_number":71,"context_line":"        # add the instance-id to the envelope, the deserialize method"},{"line_number":72,"context_line":"        # on the control plane will stuff it in the context."},{"line_number":73,"context_line":"        return {\u0027context\u0027:"},{"line_number":74,"context_line":"                base64.b64encode("},{"line_number":75,"context_line":"                    crypto.encrypt_data(cstr, self._key)),"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_d25ae129","line":72,"range":{"start_line":71,"start_character":8,"end_line":72,"end_character":60},"updated":"2016-12-20 18:56:56.000000000","message":"obvious","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            return ctxt"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        cstr \u003d jsonutils.dumps(ctxt)"},{"line_number":71,"context_line":"        # add the instance-id to the envelope, the deserialize method"},{"line_number":72,"context_line":"        # on the control plane will stuff it in the context."},{"line_number":73,"context_line":"        return {\u0027context\u0027:"},{"line_number":74,"context_line":"                base64.b64encode("},{"line_number":75,"context_line":"                    crypto.encrypt_data(cstr, self._key)),"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_fbb6163c","line":72,"range":{"start_line":71,"start_character":8,"end_line":72,"end_character":60},"in_reply_to":"1a6eadb0_d25ae129","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"}],"trove/common/rpc/conductor_host_serializer.py":[{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":23,"context_line":"CONF \u003d cfg.CONF"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# ConductorHostSerializer is a serializer that will encrypt and decrypt"},{"line_number":27,"context_line":"# data that it is provided. It does this using an instance-id that is"},{"line_number":28,"context_line":"# stored in the context. The ConductorHostSerializer is very much like"},{"line_number":29,"context_line":"# the SecureSerializer above except that it does not have a key"},{"line_number":30,"context_line":"# provided at instantiation time and is only intended to run in the"},{"line_number":31,"context_line":"# conductor (on the control plane)."},{"line_number":32,"context_line":"#"},{"line_number":33,"context_line":"# BUG(1650518): Cleanup in the Pike release"},{"line_number":34,"context_line":"class ConductorHostSerializer(messaging.Serializer):"},{"line_number":35,"context_line":"    # serializers are chained not by object inheritence but rather by"},{"line_number":36,"context_line":"    # being specified in parameter list when creating the serializer"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_f268bdbc","line":33,"range":{"start_line":26,"start_character":0,"end_line":33,"end_character":43},"updated":"2016-12-20 18:56:56.000000000","message":"should be class comment","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":23,"context_line":"CONF \u003d cfg.CONF"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# ConductorHostSerializer is a serializer that will encrypt and decrypt"},{"line_number":27,"context_line":"# data that it is provided. It does this using an instance-id that is"},{"line_number":28,"context_line":"# stored in the context. The ConductorHostSerializer is very much like"},{"line_number":29,"context_line":"# the SecureSerializer above except that it does not have a key"},{"line_number":30,"context_line":"# provided at instantiation time and is only intended to run in the"},{"line_number":31,"context_line":"# conductor (on the control plane)."},{"line_number":32,"context_line":"#"},{"line_number":33,"context_line":"# BUG(1650518): Cleanup in the Pike release"},{"line_number":34,"context_line":"class ConductorHostSerializer(messaging.Serializer):"},{"line_number":35,"context_line":"    # serializers are chained not by object inheritence but rather by"},{"line_number":36,"context_line":"    # being specified in parameter list when creating the serializer"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_9b96ea92","line":33,"range":{"start_line":26,"start_character":0,"end_line":33,"end_character":43},"in_reply_to":"1a6eadb0_f268bdbc","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    # id. This is done so the creation of the serializer can always"},{"line_number":41,"context_line":"    # pass a key parameter, it makes the code in get_client() and"},{"line_number":42,"context_line":"    # get_server() much cleaner."},{"line_number":43,"context_line":"    def __init__(self, base, *_):"},{"line_number":44,"context_line":"        self._base \u003d base"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def serialize_entity(self, ctxt, entity):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_3291559a","line":43,"updated":"2016-12-20 18:56:56.000000000","message":"Then have an explict \"key\" parameter and ignore it.  An ignored \"*_\" is a dangerous convenience and I\u0027d rather not se a precedent that others will follow elsewhere in the code.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    # id. This is done so the creation of the serializer can always"},{"line_number":41,"context_line":"    # pass a key parameter, it makes the code in get_client() and"},{"line_number":42,"context_line":"    # get_server() much cleaner."},{"line_number":43,"context_line":"    def __init__(self, base, *_):"},{"line_number":44,"context_line":"        self._base \u003d base"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def serialize_entity(self, ctxt, entity):"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_db907298","line":43,"in_reply_to":"1a6eadb0_3291559a","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            entity \u003d self._base.serialize_entity(ctxt, entity)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        if ctxt.instance_id is None:"},{"line_number":51,"context_line":"            # yes, this and serialize_context below are the only"},{"line_number":52,"context_line":"            # reason why deserialize_context (below) stuffs the"},{"line_number":53,"context_line":"            # instance_id into the context."},{"line_number":54,"context_line":"            return entity"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        ik \u003d DBInstanceKey.get_by(instance_id\u003dctxt.instance_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_12d9b983","line":53,"range":{"start_line":51,"start_character":12,"end_line":53,"end_character":43},"updated":"2016-12-20 18:56:56.000000000","message":"obvious","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            entity \u003d self._base.serialize_entity(ctxt, entity)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        if ctxt.instance_id is None:"},{"line_number":51,"context_line":"            # yes, this and serialize_context below are the only"},{"line_number":52,"context_line":"            # reason why deserialize_context (below) stuffs the"},{"line_number":53,"context_line":"            # instance_id into the context."},{"line_number":54,"context_line":"            return entity"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        ik \u003d DBInstanceKey.get_by(instance_id\u003dctxt.instance_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_3beede22","line":53,"range":{"start_line":51,"start_character":12,"end_line":53,"end_character":43},"in_reply_to":"1a6eadb0_12d9b983","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        return entity"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def serialize_context(self, ctxt):"},{"line_number":77,"context_line":"        # serialize context shall return a dictionary"},{"line_number":78,"context_line":"        if self._base:"},{"line_number":79,"context_line":"            ctxt \u003d self._base.serialize_context(ctxt)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_32e87510","line":77,"updated":"2016-12-20 18:56:56.000000000","message":"superfluous","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        return entity"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def serialize_context(self, ctxt):"},{"line_number":77,"context_line":"        # serialize context shall return a dictionary"},{"line_number":78,"context_line":"        if self._base:"},{"line_number":79,"context_line":"            ctxt \u003d self._base.serialize_context(ctxt)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_5bf3a20a","line":77,"in_reply_to":"1a6eadb0_32e87510","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        return {\u0027context\u0027: base64.b64encode(crypto.encrypt_data(cstr, ik.key))}"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def deserialize_context(self, ctxt):"},{"line_number":92,"context_line":"        # hang on to your hats, this is weird stuff."},{"line_number":93,"context_line":"        #"},{"line_number":94,"context_line":"        # deserialize_context is only run on the control plane and the"},{"line_number":95,"context_line":"        # conductor needs to figure out where this message came from"},{"line_number":96,"context_line":"        # to figure out what key to use."}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_d2cd81b8","line":93,"range":{"start_line":92,"start_character":8,"end_line":93,"end_character":9},"updated":"2016-12-20 18:56:56.000000000","message":"unnecessary","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        return {\u0027context\u0027: base64.b64encode(crypto.encrypt_data(cstr, ik.key))}"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def deserialize_context(self, ctxt):"},{"line_number":92,"context_line":"        # hang on to your hats, this is weird stuff."},{"line_number":93,"context_line":"        #"},{"line_number":94,"context_line":"        # deserialize_context is only run on the control plane and the"},{"line_number":95,"context_line":"        # conductor needs to figure out where this message came from"},{"line_number":96,"context_line":"        # to figure out what key to use."}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_7bf866e6","line":93,"range":{"start_line":92,"start_character":8,"end_line":93,"end_character":9},"in_reply_to":"1a6eadb0_d2cd81b8","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        # the context so serialize_entity (which will be used to"},{"line_number":108,"context_line":"        # generate a response, ack or reply) will be able to figure"},{"line_number":109,"context_line":"        # out how to encrypt the response."},{"line_number":110,"context_line":"        iid \u003d ctxt.get(\u0027csz-instance-id\u0027, None)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        if iid is not None:"},{"line_number":113,"context_line":"            ik \u003d DBInstanceKey.get_by(instance_id\u003diid)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_b241e50d","line":110,"range":{"start_line":110,"start_character":8,"end_line":110,"end_character":11},"updated":"2016-12-20 18:56:56.000000000","message":"We have been trying to adopt a standard of non-cryptic variable names.  Please use instance_id etc.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        # the context so serialize_entity (which will be used to"},{"line_number":108,"context_line":"        # generate a response, ack or reply) will be able to figure"},{"line_number":109,"context_line":"        # out how to encrypt the response."},{"line_number":110,"context_line":"        iid \u003d ctxt.get(\u0027csz-instance-id\u0027, None)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        if iid is not None:"},{"line_number":113,"context_line":"            ik \u003d DBInstanceKey.get_by(instance_id\u003diid)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_9bdd0a73","line":110,"range":{"start_line":110,"start_character":8,"end_line":110,"end_character":11},"in_reply_to":"1a6eadb0_b241e50d","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                                       ik.key)"},{"line_number":117,"context_line":"            ctxt \u003d jsonutils.loads(cstr)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"            # now push the instance id into the context"},{"line_number":120,"context_line":"            ctxt[\u0027instance_id\u0027] \u003d iid"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        if self._base:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_1247f91d","line":119,"range":{"start_line":119,"start_character":0,"end_line":119,"end_character":55},"updated":"2016-12-20 18:56:56.000000000","message":"superfluous","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                                       ik.key)"},{"line_number":117,"context_line":"            ctxt \u003d jsonutils.loads(cstr)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"            # now push the instance id into the context"},{"line_number":120,"context_line":"            ctxt[\u0027instance_id\u0027] \u003d iid"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        if self._base:"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_dbe7923e","line":119,"range":{"start_line":119,"start_character":0,"end_line":119,"end_character":55},"in_reply_to":"1a6eadb0_1247f91d","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"}],"trove/common/rpc/serializer.py":[{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from trove.common import crypto_utils as crypto"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# SecureSerializer is a serializer that will optionally encrypt and"},{"line_number":25,"context_line":"# decrypt data that it is provided. It does this using a symmetric key"},{"line_number":26,"context_line":"# that is provided to the constructor. If the key provided is None,"},{"line_number":27,"context_line":"# the SecureSerializer adds nothing to the underlying serializer that"},{"line_number":28,"context_line":"# it encapsulates (base)."},{"line_number":29,"context_line":"#"},{"line_number":30,"context_line":"# A note about None as an encryption key."},{"line_number":31,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_f41b481a","line":28,"range":{"start_line":24,"start_character":0,"end_line":28,"end_character":25},"updated":"2016-12-20 18:56:56.000000000","message":"Could be a class comment string.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from trove.common import crypto_utils as crypto"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# SecureSerializer is a serializer that will optionally encrypt and"},{"line_number":25,"context_line":"# decrypt data that it is provided. It does this using a symmetric key"},{"line_number":26,"context_line":"# that is provided to the constructor. If the key provided is None,"},{"line_number":27,"context_line":"# the SecureSerializer adds nothing to the underlying serializer that"},{"line_number":28,"context_line":"# it encapsulates (base)."},{"line_number":29,"context_line":"#"},{"line_number":30,"context_line":"# A note about None as an encryption key."},{"line_number":31,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_fbe4563c","line":28,"range":{"start_line":24,"start_character":0,"end_line":28,"end_character":25},"in_reply_to":"1a6eadb0_f41b481a","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self._key \u003d key"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def serialize_entity(self, ctxt, entity):"},{"line_number":55,"context_line":"        # serialize entity can return any datatype, we choose to"},{"line_number":56,"context_line":"        # return base64 encoded."},{"line_number":57,"context_line":"        if self._base:"},{"line_number":58,"context_line":"            entity \u003d self._base.serialize_entity(ctxt, entity)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_3416a0f1","line":55,"updated":"2016-12-20 18:56:56.000000000","message":"obvious from code","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self._key \u003d key"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def serialize_entity(self, ctxt, entity):"},{"line_number":55,"context_line":"        # serialize entity can return any datatype, we choose to"},{"line_number":56,"context_line":"        # return base64 encoded."},{"line_number":57,"context_line":"        if self._base:"},{"line_number":58,"context_line":"            entity \u003d self._base.serialize_entity(ctxt, entity)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_1bd03a53","line":55,"in_reply_to":"1a6eadb0_3416a0f1","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        return entity"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def serialize_context(self, ctxt):"},{"line_number":77,"context_line":"        # serialize context shall return a dictionary"},{"line_number":78,"context_line":"        if self._base:"},{"line_number":79,"context_line":"            ctxt \u003d self._base.serialize_context(ctxt)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_54d31c38","line":77,"updated":"2016-12-20 18:56:56.000000000","message":"superfluous","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        return entity"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def serialize_context(self, ctxt):"},{"line_number":77,"context_line":"        # serialize context shall return a dictionary"},{"line_number":78,"context_line":"        if self._base:"},{"line_number":79,"context_line":"            ctxt \u003d self._base.serialize_context(ctxt)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_3bd5fe42","line":77,"in_reply_to":"1a6eadb0_54d31c38","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"85bcde905e5cba1acbaed41f24060030221ff7a6","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def serialize_entity(self, context, entity):"},{"line_number":32,"context_line":"        if self._base:"},{"line_number":33,"context_line":"            entity \u003d self._base.serialize_entity(context, entity)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        return self._serialize_entity(context, entity)"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"da4df55a_9982e3c6","line":33,"updated":"2016-12-28 19:15:34.000000000","message":"Guess I didn\u0027t explain what I had in mind very well - you did the opposite of what I had in mind.  Oh, well, doesn\u0027t really matter :-)","commit_id":"1ce931c803fc1f0da3b725f7ea4556bb57798802"}],"trove/db/sqlalchemy/migrate_repo/versions/040_instance_keys.py":[{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":29,"context_line":"meta \u003d MetaData()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"instance_keys \u003d Table("},{"line_number":32,"context_line":"    \u0027instance_keys\u0027,"},{"line_number":33,"context_line":"    meta,"},{"line_number":34,"context_line":"    Column(\u0027id\u0027, String(length\u003d64), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":35,"context_line":"    Column(\u0027instance_id\u0027, String(length\u003d64),"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_7492d84c","line":32,"updated":"2016-12-20 18:56:56.000000000","message":"I still don\u0027t see the point of having a table that is a 1-1 correspondence with Instances.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":29,"context_line":"meta \u003d MetaData()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"instance_keys \u003d Table("},{"line_number":32,"context_line":"    \u0027instance_keys\u0027,"},{"line_number":33,"context_line":"    meta,"},{"line_number":34,"context_line":"    Column(\u0027id\u0027, String(length\u003d64), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":35,"context_line":"    Column(\u0027instance_id\u0027, String(length\u003d64),"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_9bc42a93","line":32,"in_reply_to":"1a6eadb0_7492d84c","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"}],"trove/guestagent/api.py":[{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        self.client \u003d self.get_client(target, version_cap)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def get_client(self, target, version_cap, serializer\u003dNone):"},{"line_number":78,"context_line":"        from trove.instance.models import DBInstanceKey"},{"line_number":79,"context_line":"        ik \u003d DBInstanceKey.get_by(instance_id\u003dself.id)"},{"line_number":80,"context_line":"        return rpc.get_client(target, key\u003dik.key,"},{"line_number":81,"context_line":"                              version_cap\u003dversion_cap,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_34c0602a","line":78,"updated":"2016-12-20 18:56:56.000000000","message":"Is there a problem with importing DBInstanceKey at the top?","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"aff297138a0bb9345f9bad22feed7e248257fff3","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        self.client \u003d self.get_client(target, version_cap)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def get_client(self, target, version_cap, serializer\u003dNone):"},{"line_number":78,"context_line":"        from trove.instance.models import DBInstanceKey"},{"line_number":79,"context_line":"        ik \u003d DBInstanceKey.get_by(instance_id\u003dself.id)"},{"line_number":80,"context_line":"        return rpc.get_client(target, key\u003dik.key,"},{"line_number":81,"context_line":"                              version_cap\u003dversion_cap,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_578f9e22","line":78,"in_reply_to":"1a6eadb0_34c0602a","updated":"2016-12-20 19:15:43.000000000","message":"yes, because of the way guestagent/api is imported (on the guest to get api version) this becomes an issue.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def get_client(self, target, version_cap, serializer\u003dNone):"},{"line_number":78,"context_line":"        from trove.instance.models import DBInstanceKey"},{"line_number":79,"context_line":"        ik \u003d DBInstanceKey.get_by(instance_id\u003dself.id)"},{"line_number":80,"context_line":"        return rpc.get_client(target, key\u003dik.key,"},{"line_number":81,"context_line":"                              version_cap\u003dversion_cap,"},{"line_number":82,"context_line":"                              serializer\u003dserializer)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_34d780ee","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":10},"updated":"2016-12-20 18:56:56.000000000","message":"Spell out the variable names, please.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def get_client(self, target, version_cap, serializer\u003dNone):"},{"line_number":78,"context_line":"        from trove.instance.models import DBInstanceKey"},{"line_number":79,"context_line":"        ik \u003d DBInstanceKey.get_by(instance_id\u003dself.id)"},{"line_number":80,"context_line":"        return rpc.get_client(target, key\u003dik.key,"},{"line_number":81,"context_line":"                              version_cap\u003dversion_cap,"},{"line_number":82,"context_line":"                              serializer\u003dserializer)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_fbbb760c","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":10},"in_reply_to":"1a6eadb0_34d780ee","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":336,"context_line":"                                  server\u003dself.id,"},{"line_number":337,"context_line":"                                  version\u003dself.API_BASE_VERSION)"},{"line_number":338,"context_line":"        try:"},{"line_number":339,"context_line":"            server \u003d rpc.get_server(target, [], key\u003dDBInstanceKey.get_by("},{"line_number":340,"context_line":"                instance_id\u003dself.id).key)"},{"line_number":341,"context_line":"            server.start()"},{"line_number":342,"context_line":"        finally:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_144a84c5","line":339,"range":{"start_line":339,"start_character":52,"end_line":339,"end_character":65},"updated":"2016-12-20 18:56:56.000000000","message":"I think we try not to inline functions like this as it makes the code easier to read and easier to follow in the debugger.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":336,"context_line":"                                  server\u003dself.id,"},{"line_number":337,"context_line":"                                  version\u003dself.API_BASE_VERSION)"},{"line_number":338,"context_line":"        try:"},{"line_number":339,"context_line":"            server \u003d rpc.get_server(target, [], key\u003dDBInstanceKey.get_by("},{"line_number":340,"context_line":"                instance_id\u003dself.id).key)"},{"line_number":341,"context_line":"            server.start()"},{"line_number":342,"context_line":"        finally:"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_1b375ab1","line":339,"range":{"start_line":339,"start_character":52,"end_line":339,"end_character":65},"in_reply_to":"1a6eadb0_144a84c5","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"}],"trove/instance/models.py":[{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from trove.backup.models import Backup"},{"line_number":29,"context_line":"from trove.common import cfg"},{"line_number":30,"context_line":"from trove.common import crypto_utils as cu"},{"line_number":31,"context_line":"from trove.common import exception"},{"line_number":32,"context_line":"from trove.common.glance_remote import create_glance_client"},{"line_number":33,"context_line":"from trove.common.i18n import _, _LE, _LI, _LW"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_940cd495","line":30,"range":{"start_line":30,"start_character":41,"end_line":30,"end_character":43},"updated":"2016-12-20 18:56:56.000000000","message":"spell this out, please","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":694,"context_line":""},{"line_number":695,"context_line":"    def set_instance_key_deleted(self):"},{"line_number":696,"context_line":"        try:"},{"line_number":697,"context_line":"            ik \u003d DBInstanceKey.find_by(instance_id\u003dself.id)"},{"line_number":698,"context_line":"            ik.deleted \u003d True"},{"line_number":699,"context_line":"            ik.deleted_at \u003d datetime.utcnow()"},{"line_number":700,"context_line":"            ik.save()"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_1421a4fb","line":697,"range":{"start_line":697,"start_character":12,"end_line":697,"end_character":14},"updated":"2016-12-20 18:56:56.000000000","message":"ditto","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":694,"context_line":""},{"line_number":695,"context_line":"    def set_instance_key_deleted(self):"},{"line_number":696,"context_line":"        try:"},{"line_number":697,"context_line":"            ik \u003d DBInstanceKey.find_by(instance_id\u003dself.id)"},{"line_number":698,"context_line":"            ik.deleted \u003d True"},{"line_number":699,"context_line":"            ik.deleted_at \u003d datetime.utcnow()"},{"line_number":700,"context_line":"            ik.save()"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_bb480e2f","line":697,"range":{"start_line":697,"start_character":12,"end_line":697,"end_character":14},"in_reply_to":"1a6eadb0_1421a4fb","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":1643,"context_line":"        return super(DBInstanceKey, cls).create(**kwargs)"},{"line_number":1644,"context_line":""},{"line_number":1645,"context_line":"    def get_instance_rpc_key(self, iid):"},{"line_number":1646,"context_line":"        # given an instance id, return the decrypted rpc key"},{"line_number":1647,"context_line":"        LOG.debug(\"Fetching instance RPC key for instance \u003d %s\", iid)"},{"line_number":1648,"context_line":"        ik \u003d DBInstanceKey.get_by(instance_id\u003diid)"},{"line_number":1649,"context_line":"        return ik.key"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_f468a823","line":1646,"updated":"2016-12-20 18:56:56.000000000","message":"Obvious, but it could make a suitable method help string.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"072757e1f55254526a03d0436b6e1a0805dc3ece","unresolved":false,"context_lines":[{"line_number":1643,"context_line":"        return super(DBInstanceKey, cls).create(**kwargs)"},{"line_number":1644,"context_line":""},{"line_number":1645,"context_line":"    def get_instance_rpc_key(self, iid):"},{"line_number":1646,"context_line":"        # given an instance id, return the decrypted rpc key"},{"line_number":1647,"context_line":"        LOG.debug(\"Fetching instance RPC key for instance \u003d %s\", iid)"},{"line_number":1648,"context_line":"        ik \u003d DBInstanceKey.get_by(instance_id\u003diid)"},{"line_number":1649,"context_line":"        return ik.key"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_7b5dc6e8","line":1646,"in_reply_to":"1a6eadb0_f468a823","updated":"2016-12-22 16:48:06.000000000","message":"Done","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":10215,"name":"Peter Stachowski","email":"peter@tesora.com","username":"peterstac"},"change_message_id":"6cf7ed381f86bda857d94eeeaa761740dc24e4e9","unresolved":false,"context_lines":[{"line_number":1515,"context_line":""},{"line_number":1516,"context_line":"    @property"},{"line_number":1517,"context_line":"    def key(self):"},{"line_number":1518,"context_line":"        return cu.decrypt_data(base64.b64decode(self.encrypted_key),"},{"line_number":1519,"context_line":"                               CONF.inst_rpc_key_encr_key)"},{"line_number":1520,"context_line":""},{"line_number":1521,"context_line":"    def _validate(self, errors):"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba5201f7_c2180021","line":1518,"range":{"start_line":1518,"start_character":31,"end_line":1518,"end_character":67},"updated":"2017-01-05 20:43:04.000000000","message":"You should probably use decode_data from crypto_utils here, so it\u0027s py3 compatible...","commit_id":"1ce931c803fc1f0da3b725f7ea4556bb57798802"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"d96877edf3ea3fd264a31b34925ba0bad0893ceb","unresolved":false,"context_lines":[{"line_number":1515,"context_line":""},{"line_number":1516,"context_line":"    @property"},{"line_number":1517,"context_line":"    def key(self):"},{"line_number":1518,"context_line":"        return cu.decrypt_data(base64.b64decode(self.encrypted_key),"},{"line_number":1519,"context_line":"                               CONF.inst_rpc_key_encr_key)"},{"line_number":1520,"context_line":""},{"line_number":1521,"context_line":"    def _validate(self, errors):"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba5201f7_a2769cd4","line":1518,"range":{"start_line":1518,"start_character":31,"end_line":1518,"end_character":67},"in_reply_to":"ba5201f7_c2180021","updated":"2017-01-05 20:55:12.000000000","message":"could we do that as a follow on after getting this merged please.","commit_id":"1ce931c803fc1f0da3b725f7ea4556bb57798802"}],"trove/rpc.py":[{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":34,"context_line":"import oslo_messaging as messaging"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"import trove.common.exception"},{"line_number":37,"context_line":"from trove.common.rpc import serializer as sz"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"CONF \u003d cfg.CONF"},{"line_number":40,"context_line":"TRANSPORT \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_54607c35","line":37,"range":{"start_line":37,"start_character":43,"end_line":37,"end_character":45},"updated":"2016-12-20 18:56:56.000000000","message":"spell out, please","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    return messaging.TransportURL.parse(CONF, url_str, TRANSPORT_ALIASES)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def get_client(target, key, version_cap\u003dNone, serializer\u003dNone,"},{"line_number":100,"context_line":"               secure_serializer\u003dsz.SecureSerializer):"},{"line_number":101,"context_line":"    assert TRANSPORT is not None"},{"line_number":102,"context_line":"    # BUG(1650518): Cleanup in the Pike release"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_97bf7b5f","line":99,"updated":"2016-12-20 18:56:56.000000000","message":"get_client and get_server are our functions, and AFAIK serializer is never set.  I suggest getting rid of the key and secure_serializer arguments and just have the serializer argument take an instantiated class.  Like \"get_client(target, version_cap\u003dversion_cap, serializer\u003dConductorClientSerializer(key))\"","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"aff297138a0bb9345f9bad22feed7e248257fff3","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    return messaging.TransportURL.parse(CONF, url_str, TRANSPORT_ALIASES)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def get_client(target, key, version_cap\u003dNone, serializer\u003dNone,"},{"line_number":100,"context_line":"               secure_serializer\u003dsz.SecureSerializer):"},{"line_number":101,"context_line":"    assert TRANSPORT is not None"},{"line_number":102,"context_line":"    # BUG(1650518): Cleanup in the Pike release"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_9735b647","line":99,"in_reply_to":"1a6eadb0_97bf7b5f","updated":"2016-12-20 19:15:43.000000000","message":"yeah, no. can\u0027t do that because of the stupid way of doing inheritence and calling underlying class functions in serializers.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"}],"trove/taskmanager/models.py":[{"author":{"_account_id":10215,"name":"Peter Stachowski","email":"peter@tesora.com","username":"peterstac"},"change_message_id":"6cf7ed381f86bda857d94eeeaa761740dc24e4e9","unresolved":false,"context_lines":[{"line_number":1431,"context_line":"            # encrypt messages to a guest which potentially doesn\u0027t"},{"line_number":1432,"context_line":"            # have the code to handle it."},{"line_number":1433,"context_line":"            if self.db_info.encrypted_key is None:"},{"line_number":1434,"context_line":"                encrypted_key \u003d base64.b64encode(cu.encrypt_data("},{"line_number":1435,"context_line":"                    cu.generate_random_key(),"},{"line_number":1436,"context_line":"                    CONF.inst_rpc_key_encr_key))"},{"line_number":1437,"context_line":"                self.update_db(encrypted_key\u003dencrypted_key)"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba5201f7_a2cdbc86","line":1434,"range":{"start_line":1434,"start_character":32,"end_line":1434,"end_character":48},"updated":"2017-01-05 20:43:04.000000000","message":"ditto (but with encode_)","commit_id":"1ce931c803fc1f0da3b725f7ea4556bb57798802"}],"trove/tests/unittests/guestagent/test_api.py":[{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class ApiTest(trove_testtools.TestCase):"},{"line_number":52,"context_line":"    @mock.patch.object(rpc, \u0027get_client\u0027)"},{"line_number":53,"context_line":"    @mock.patch(\u0027trove.instance.models.DBInstanceKey.get_by\u0027)"},{"line_number":54,"context_line":"    def setUp(self, *args):"},{"line_number":55,"context_line":"        super(ApiTest, self).setUp()"},{"line_number":56,"context_line":"        self.context \u003d context.TroveContext()"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_7498181c","line":53,"updated":"2016-12-20 18:56:56.000000000","message":"Would it be better to do this in setup?","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"aff297138a0bb9345f9bad22feed7e248257fff3","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class ApiTest(trove_testtools.TestCase):"},{"line_number":52,"context_line":"    @mock.patch.object(rpc, \u0027get_client\u0027)"},{"line_number":53,"context_line":"    @mock.patch(\u0027trove.instance.models.DBInstanceKey.get_by\u0027)"},{"line_number":54,"context_line":"    def setUp(self, *args):"},{"line_number":55,"context_line":"        super(ApiTest, self).setUp()"},{"line_number":56,"context_line":"        self.context \u003d context.TroveContext()"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_b70f1287","line":53,"in_reply_to":"1a6eadb0_7498181c","updated":"2016-12-20 19:15:43.000000000","message":"this is setup.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"e0a12d7e81ba9420790243fa173c55eecba73561","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class ApiTest(trove_testtools.TestCase):"},{"line_number":52,"context_line":"    @mock.patch.object(rpc, \u0027get_client\u0027)"},{"line_number":53,"context_line":"    @mock.patch(\u0027trove.instance.models.DBInstanceKey.get_by\u0027)"},{"line_number":54,"context_line":"    def setUp(self, *args):"},{"line_number":55,"context_line":"        super(ApiTest, self).setUp()"},{"line_number":56,"context_line":"        self.context \u003d context.TroveContext()"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_ba1cb578","line":53,"in_reply_to":"1a6eadb0_b70f1287","updated":"2016-12-21 21:02:49.000000000","message":"I meant that if you created the patch in the setUp method, you wouldn\u0027t have to do it on every test in the class.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"}],"trove/tests/unittests/taskmanager/test_models.py":[{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"f7806a9351239ca3b2512938d4117f9befc92276","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            None, None, None, datastore_manager, None, None, None)"},{"line_number":247,"context_line":"        self.assertEqual(server.userdata, self.userdata)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    @patch.object(DBInstanceKey, \u0027get_by\u0027)"},{"line_number":250,"context_line":"    def test_create_instance_guestconfig(self, patch_get_by):"},{"line_number":251,"context_line":"        def fake_conf_getter(*args, **kwargs):"},{"line_number":252,"context_line":"            if args[0] \u003d\u003d \u0027guest_config\u0027:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_54631c1a","line":249,"updated":"2016-12-20 18:56:56.000000000","message":"Again, this should probably be in setUp","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"aff297138a0bb9345f9bad22feed7e248257fff3","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            None, None, None, datastore_manager, None, None, None)"},{"line_number":247,"context_line":"        self.assertEqual(server.userdata, self.userdata)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    @patch.object(DBInstanceKey, \u0027get_by\u0027)"},{"line_number":250,"context_line":"    def test_create_instance_guestconfig(self, patch_get_by):"},{"line_number":251,"context_line":"        def fake_conf_getter(*args, **kwargs):"},{"line_number":252,"context_line":"            if args[0] \u003d\u003d \u0027guest_config\u0027:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_7763ba41","line":249,"in_reply_to":"1a6eadb0_54631c1a","updated":"2016-12-20 19:15:43.000000000","message":"I did it this way because it isn\u0027t needed in the other tests.","commit_id":"fdded8ee959f03083bf1840e181162b86e6d5443"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"7bab85383fd540638d79830bd67ee1610f77ab41","unresolved":false,"context_lines":[{"line_number":245,"context_line":"            None, None, None, datastore_manager, None, None, None)"},{"line_number":246,"context_line":"        self.assertEqual(server.userdata, self.userdata)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    @patch.object(DBInstance, \u0027get_by\u0027)"},{"line_number":249,"context_line":"    def test_create_instance_guestconfig(self, patch_get_by):"},{"line_number":250,"context_line":"        def fake_conf_getter(*args, **kwargs):"},{"line_number":251,"context_line":"            if args[0] \u003d\u003d \u0027guest_config\u0027:"}],"source_content_type":"text/x-python","patch_set":14,"id":"da4df55a_c5489130","line":248,"updated":"2016-12-22 16:08:29.000000000","message":"FYI: You could @patch.object(DBInstance, \u0027get_by\u0027, Mock()) then you wouldn\u0027t have to pass the mock in as a parameter (since you aren\u0027t going to use it).","commit_id":"f84f3e2737be2ecdf78e0cc653003a7d0c78a1e8"}]}
