)]}'
{"run_tests.py":[{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"48333f376c759e72da435cace7559864662dbac9","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        from trove.tests.api.mgmt import instances_actions as mgmt_actions  # noqa"},{"line_number":186,"context_line":"        from trove.tests.api.mgmt import storage  # noqa"},{"line_number":187,"context_line":"        from trove.tests.api.mgmt import malformed_json  # noqa"},{"line_number":188,"context_line":"        from trove.tests.api import metadata  # noqa"},{"line_number":189,"context_line":"    except Exception as e:"},{"line_number":190,"context_line":"        print(\"Run tests failed: %s\" % e)"},{"line_number":191,"context_line":"        traceback.print_exc()"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_2af2889b","line":188,"updated":"2014-06-23 18:56:19.000000000","message":"I\u0027m curious why everyone here imports with #noqa","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"24418e935a2825826d829eb8e2b755befeda58cb","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        from trove.tests.api.mgmt import instances_actions as mgmt_actions  # noqa"},{"line_number":186,"context_line":"        from trove.tests.api.mgmt import storage  # noqa"},{"line_number":187,"context_line":"        from trove.tests.api.mgmt import malformed_json  # noqa"},{"line_number":188,"context_line":"        from trove.tests.api import metadata  # noqa"},{"line_number":189,"context_line":"    except Exception as e:"},{"line_number":190,"context_line":"        print(\"Run tests failed: %s\" % e)"},{"line_number":191,"context_line":"        traceback.print_exc()"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_0dca869f","line":188,"in_reply_to":"1ae5cdf2_2af2889b","updated":"2014-06-28 08:51:04.000000000","message":"this is because its a pep8 violation to import something that\u0027s not used in the file. but this is just importing all the tests so that they can be parsed through with proboscis.","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"}],"trove/common/api.py":[{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"af3e3eef1deabc45434e221377b28010eec276ae","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027POST\u0027]})"},{"line_number":113,"context_line":"        mapper.connect(\u0027/{tenant_id}/instances/{instance_id}/metadata/{key}\u0027,"},{"line_number":114,"context_line":"                       controller\u003dmetadata_resource,"},{"line_number":115,"context_line":"                       action\u003d\u0027replace\u0027,"},{"line_number":116,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027PATCH\u0027]})"},{"line_number":117,"context_line":"        mapper.connect(\u0027/{tenant_id}/instances/{instance_id}/metadata/{key}\u0027,"},{"line_number":118,"context_line":"                       controller\u003dmetadata_resource,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FX90%3D","line":115,"updated":"2014-04-15 03:11:29.000000000","message":"To be truly restful, PATCH should trigger and update, whereas a PUT should be a replace.","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"aa873a891a244238bd6677b961c5f6048201c091","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027POST\u0027]})"},{"line_number":113,"context_line":"        mapper.connect(\u0027/{tenant_id}/instances/{instance_id}/metadata/{key}\u0027,"},{"line_number":114,"context_line":"                       controller\u003dmetadata_resource,"},{"line_number":115,"context_line":"                       action\u003d\u0027replace\u0027,"},{"line_number":116,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027PATCH\u0027]})"},{"line_number":117,"context_line":"        mapper.connect(\u0027/{tenant_id}/instances/{instance_id}/metadata/{key}\u0027,"},{"line_number":118,"context_line":"                       controller\u003dmetadata_resource,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FRDs%3D","line":115,"in_reply_to":"AAAAW3%2F%2FTNk%3D","updated":"2014-04-15 17:09:10.000000000","message":"Yea i see what you mean.  How about we change this to \u0027edit\u0027 like we have done for config groups.  https://github.com/openstack/trove/blob/master/trove/common/api.py#L180","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"67d7fa02d5759d9c70dfaae9e219669f94898035","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027POST\u0027]})"},{"line_number":113,"context_line":"        mapper.connect(\u0027/{tenant_id}/instances/{instance_id}/metadata/{key}\u0027,"},{"line_number":114,"context_line":"                       controller\u003dmetadata_resource,"},{"line_number":115,"context_line":"                       action\u003d\u0027replace\u0027,"},{"line_number":116,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027PATCH\u0027]})"},{"line_number":117,"context_line":"        mapper.connect(\u0027/{tenant_id}/instances/{instance_id}/metadata/{key}\u0027,"},{"line_number":118,"context_line":"                       controller\u003dmetadata_resource,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FTNk%3D","line":115,"in_reply_to":"AAAAW3%2F%2FX90%3D","updated":"2014-04-15 13:55:45.000000000","message":"The naming threw me too.  If you look at the python client you will find that the _update call is a put so I made the patch call _replace.  This confused the crap out of me because I understood it the other way as well.  This is problematic though because if we change the client then we need to go through and change everything that uses the current _update to use _replace.  How do you want to handle this?","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"cc8c1aed0fc6822a17ddc7fdff0a63d90c6f42b0","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                       action\u003d\u0027show\u0027,"},{"line_number":108,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027GET\u0027]})"},{"line_number":109,"context_line":"        mapper.connect(\u0027/{tenant_id}/instances/{instance_id}/metadata/{key}\u0027,"},{"line_number":110,"context_line":"                       controller\u003dmetadata_resource,"},{"line_number":111,"context_line":"                       action\u003d\u0027create\u0027,"},{"line_number":112,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027POST\u0027]})"},{"line_number":113,"context_line":"        mapper.connect(\u0027/{tenant_id}/instances/{instance_id}/metadata/{key}\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_3c4f3b36","line":110,"updated":"2014-06-23 15:38:59.000000000","message":"so please feel to ignore my comments as I may lack context. But how I would view the instance metadata calls to be restful:\n(1) PUT /instances/{instance_id}/metadata\nand the body has a bunch of key value pairs, if they key exists, replace it, if doesnt add it, if a particular key is not present in the body then it is deleted from the database\n(2) PATCH /instances/{instance_id}/metadata\nbody has bunch of key  value pairs, and this only updates or adds","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"4f502423805ae6dc0032af69925f67977e718bbf","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                       action\u003d\u0027show\u0027,"},{"line_number":108,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027GET\u0027]})"},{"line_number":109,"context_line":"        mapper.connect(\u0027/{tenant_id}/instances/{instance_id}/metadata/{key}\u0027,"},{"line_number":110,"context_line":"                       controller\u003dmetadata_resource,"},{"line_number":111,"context_line":"                       action\u003d\u0027create\u0027,"},{"line_number":112,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027POST\u0027]})"},{"line_number":113,"context_line":"        mapper.connect(\u0027/{tenant_id}/instances/{instance_id}/metadata/{key}\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_87d2bc59","line":110,"in_reply_to":"1ae5cdf2_3c4f3b36","updated":"2014-06-23 16:00:13.000000000","message":"https://tools.ietf.org/html/rfc2616#section-9.6 or maybe this might be ok if follow PUT protocol and add the key if it doesnt exist:\n\n\"If the\nRequest-URI does not point to an existing resource, and that URI is\ncapable of being defined as a new resource by the requesting user\nagent, the origin server can create the resource with that URI.\"","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                       action\u003d\"configuration\","},{"line_number":97,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027GET\u0027]})"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    #FIXME check to see if RESTful"},{"line_number":100,"context_line":"    def _metadata_router(self, mapper):"},{"line_number":101,"context_line":"        metadata_resource \u003d MetadataController().create_resource()"},{"line_number":102,"context_line":"        mapper.connect(\u0027/{tenant_id}/instances/{instance_id}/metadata\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_aa5c5f4d","line":99,"updated":"2014-07-25 10:20:02.000000000","message":"is it? are you going to remove this comment before chkin?\n\nI don\u0027t know about RESTful but so far, this code is looking nice and the review is relaxing ;)","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"}],"trove/common/exception.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"4047529c29cfaf53f1fcd0d423ef1a8b0bea773c","unresolved":false,"context_lines":[{"line_number":412,"context_line":""},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"class MetadataLookupError(TroveError):"},{"line_number":415,"context_line":"    message \u003d _(\u0027Failed to lookup metadata from the database\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2Bko4%3D","line":415,"updated":"2014-03-25 20:15:34.000000000","message":"I think it would be more meaningful if parent class will be the ModelNotFound","commit_id":"bf0b782247da1dc2ac396fb9bc2b77a35a35c899"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"93f5ca0498fe2ecc112923c9be1f351ae1cfe35d","unresolved":false,"context_lines":[{"line_number":452,"context_line":""},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"class MetadataTypeError(TroveError):"},{"line_number":455,"context_line":"    message \u003d _(\u0027Metadata root must be a dict, got type %(metatype)s\u0027)"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"class MetadataLookupError(NotFound):"}],"source_content_type":"text/x-python","patch_set":16,"id":"baada198_7ca23140","line":455,"updated":"2014-07-24 15:57:53.000000000","message":"This is not used.","commit_id":"b877416d45000a294eb756dae3c58a65e71b373e"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"93f5ca0498fe2ecc112923c9be1f351ae1cfe35d","unresolved":false,"context_lines":[{"line_number":456,"context_line":""},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"class MetadataLookupError(NotFound):"},{"line_number":459,"context_line":"    message \u003d _(\u0027Failed to lookup metadata from the database\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"baada198_9c62a514","line":459,"updated":"2014-07-24 15:57:53.000000000","message":"This isn\u0027t used either.","commit_id":"b877416d45000a294eb756dae3c58a65e71b373e"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":448,"context_line":""},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"class MetadataCreationError(TroveError):"},{"line_number":451,"context_line":"    message \u003d _(\u0027Failed to create metadata entry for instance\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_8d09752d","line":451,"updated":"2014-07-25 10:20:02.000000000","message":"stick a period (.) at the end of this message please.\n\nThis exception also seems rather bare. Would you consider adding context and parameters to the message. The one place which uses this message logs (at .info) a message and then raises this bare exception. I\u0027d believe that merging the two and putting the context into the exception would be beneficial in diagnosis.","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":10295,"name":"mariam john","email":"mariamj@us.ibm.com","username":"mariamj"},"change_message_id":"87650933a2cc8b0c6bf3adb64e2c7a0845db67a9","unresolved":false,"context_lines":[{"line_number":508,"context_line":""},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"class MetadataEntryConflict(TroveError):"},{"line_number":511,"context_line":"    message \u003d _(\"Key %(key)s salready exists.\")"}],"source_content_type":"text/x-python","patch_set":26,"id":"baa201ad_55aef398","line":511,"updated":"2014-10-07 20:12:06.000000000","message":"\u0027salready\u0027 is this a typo?","commit_id":"7468c353159210a9fa4be65480473a43c5d02770"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"800e045667471bf6bf5e1a07b97ca7d759448805","unresolved":false,"context_lines":[{"line_number":508,"context_line":""},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"class MetadataEntryConflict(TroveError):"},{"line_number":511,"context_line":"    message \u003d _(\"Key %(key)s salready exists.\")"}],"source_content_type":"text/x-python","patch_set":26,"id":"baa201ad_24d77f4c","line":511,"in_reply_to":"baa201ad_55aef398","updated":"2014-10-07 20:32:14.000000000","message":"Sure. Will fix it.","commit_id":"7468c353159210a9fa4be65480473a43c5d02770"}],"trove/db/sqlalchemy/mappers.py":[{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"af3e3eef1deabc45434e221377b28010eec276ae","unresolved":false,"context_lines":[{"line_number":52,"context_line":"               Table(\u0027security_group_rules\u0027, meta, autoload\u003dTrue))"},{"line_number":53,"context_line":"    orm.mapper(models[\u0027security_group_instance_association\u0027],"},{"line_number":54,"context_line":"               Table(\u0027security_group_instance_associations\u0027, meta,"},{"line_number":55,"context_line":"                     autoload\u003dTrue)),"},{"line_number":56,"context_line":"    orm.mapper(models[\u0027configurations\u0027],"},{"line_number":57,"context_line":"               Table(\u0027configurations\u0027, meta, autoload\u003dTrue))"},{"line_number":58,"context_line":"    orm.mapper(models[\u0027configuration_parameters\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FX9Q%3D","line":55,"updated":"2014-04-15 03:11:29.000000000","message":"any reason for introducing a comma here?","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"67d7fa02d5759d9c70dfaae9e219669f94898035","unresolved":false,"context_lines":[{"line_number":52,"context_line":"               Table(\u0027security_group_rules\u0027, meta, autoload\u003dTrue))"},{"line_number":53,"context_line":"    orm.mapper(models[\u0027security_group_instance_association\u0027],"},{"line_number":54,"context_line":"               Table(\u0027security_group_instance_associations\u0027, meta,"},{"line_number":55,"context_line":"                     autoload\u003dTrue)),"},{"line_number":56,"context_line":"    orm.mapper(models[\u0027configurations\u0027],"},{"line_number":57,"context_line":"               Table(\u0027configurations\u0027, meta, autoload\u003dTrue))"},{"line_number":58,"context_line":"    orm.mapper(models[\u0027configuration_parameters\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FTMg%3D","line":55,"in_reply_to":"AAAAW3%2F%2FX9Q%3D","updated":"2014-04-15 13:55:45.000000000","message":"hmm... I didn\u0027t, or rather I didn\u0027t put them there but this could be something that was in master and carried over but was fixed in master.  I\u0027ll fix them up.","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"af3e3eef1deabc45434e221377b28010eec276ae","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    orm.mapper(models[\u0027configuration_parameters\u0027],"},{"line_number":59,"context_line":"               Table(\u0027configuration_parameters\u0027, meta, autoload\u003dTrue))"},{"line_number":60,"context_line":"    orm.mapper(models[\u0027conductor_lastseen\u0027],"},{"line_number":61,"context_line":"               Table(\u0027conductor_lastseen\u0027, meta, autoload\u003dTrue)),"},{"line_number":62,"context_line":"    orm.mapper(models[\u0027instance_metadata\u0027],"},{"line_number":63,"context_line":"               Table(\u0027instance_metadata\u0027, meta, autoload\u003dTrue))"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FX9I%3D","line":61,"updated":"2014-04-15 03:11:29.000000000","message":"any reason for introducing a comma here?","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"67d7fa02d5759d9c70dfaae9e219669f94898035","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    orm.mapper(models[\u0027configuration_parameters\u0027],"},{"line_number":59,"context_line":"               Table(\u0027configuration_parameters\u0027, meta, autoload\u003dTrue))"},{"line_number":60,"context_line":"    orm.mapper(models[\u0027conductor_lastseen\u0027],"},{"line_number":61,"context_line":"               Table(\u0027conductor_lastseen\u0027, meta, autoload\u003dTrue)),"},{"line_number":62,"context_line":"    orm.mapper(models[\u0027instance_metadata\u0027],"},{"line_number":63,"context_line":"               Table(\u0027instance_metadata\u0027, meta, autoload\u003dTrue))"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FTMY%3D","line":61,"in_reply_to":"AAAAW3%2F%2FX9I%3D","updated":"2014-04-15 13:55:45.000000000","message":"hmm... I didn\u0027t, or rather I didn\u0027t put them there but this could be something that was in master and carried over but was fixed in master.  I\u0027ll fix them up.","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":6268,"name":"Robert Myers","email":"myer0052@gmail.com","username":"rmyers"},"change_message_id":"c8b80306c299bafab0a989f59fde6fbfda29490b","unresolved":false,"context_lines":[{"line_number":52,"context_line":"               Table(\u0027security_group_rules\u0027, meta, autoload\u003dTrue))"},{"line_number":53,"context_line":"    orm.mapper(models[\u0027security_group_instance_association\u0027],"},{"line_number":54,"context_line":"               Table(\u0027security_group_instance_associations\u0027, meta,"},{"line_number":55,"context_line":"                     autoload\u003dTrue)),"},{"line_number":56,"context_line":"    orm.mapper(models[\u0027configurations\u0027],"},{"line_number":57,"context_line":"               Table(\u0027configurations\u0027, meta, autoload\u003dTrue))"},{"line_number":58,"context_line":"    orm.mapper(models[\u0027configuration_parameters\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAXH%2F%2FHmA%3D","line":55,"updated":"2014-04-23 21:32:12.000000000","message":"you don\u0027t want a \u0027,\u0027 here. It is valid python but what this does is create a tuple of (orm.mapper, None) same thing below","commit_id":"9c9963be78766b90efa448871d1a0baea0fafa01"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"d90fbd7c445bf6e9d4d12dfec7bd2ffa22147fb5","unresolved":false,"context_lines":[{"line_number":52,"context_line":"               Table(\u0027security_group_rules\u0027, meta, autoload\u003dTrue))"},{"line_number":53,"context_line":"    orm.mapper(models[\u0027security_group_instance_association\u0027],"},{"line_number":54,"context_line":"               Table(\u0027security_group_instance_associations\u0027, meta,"},{"line_number":55,"context_line":"                     autoload\u003dTrue)),"},{"line_number":56,"context_line":"    orm.mapper(models[\u0027configurations\u0027],"},{"line_number":57,"context_line":"               Table(\u0027configurations\u0027, meta, autoload\u003dTrue))"},{"line_number":58,"context_line":"    orm.mapper(models[\u0027configuration_parameters\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAXX%2F%2F%2FBQ%3D","line":55,"in_reply_to":"AAAAXH%2F%2FHmA%3D","updated":"2014-04-24 20:47:05.000000000","message":"Doh! I was supposed to remove those per vipul in my last patch but missed it.  thanks for the catch.","commit_id":"9c9963be78766b90efa448871d1a0baea0fafa01"}],"trove/db/sqlalchemy/migrate_repo/versions/026_add_instance_metadata.py":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"c81f023f2557ddb6c9d2f87f71b0f9360e7549e3","unresolved":false,"context_lines":[{"line_number":30,"context_line":"instance_metadata \u003d Table("},{"line_number":31,"context_line":"    \u0027instance_metadata\u0027,"},{"line_number":32,"context_line":"    meta,"},{"line_number":33,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":34,"context_line":"    Column(\u0027instance_uuid\u0027, String(36), ForeignKey(\u0027instances.id\u0027),"},{"line_number":35,"context_line":"           nullable\u003dFalse),"},{"line_number":36,"context_line":"    Column(\u0027key\u0027, String(255), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9k8c%3D","line":33,"updated":"2014-04-03 18:08:37.000000000","message":"Is the id necessary? Won\u0027t the instance_uuid and the key together make a unique id?","commit_id":"a746a641574fa7c3dc68fc59ec9be977afde82f9"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"af3e3eef1deabc45434e221377b28010eec276ae","unresolved":false,"context_lines":[{"line_number":30,"context_line":"instance_metadata \u003d Table("},{"line_number":31,"context_line":"    \u0027instance_metadata\u0027,"},{"line_number":32,"context_line":"    meta,"},{"line_number":33,"context_line":"    Column(\u0027instance_uuid\u0027, String(36), ForeignKey(\u0027instances.id\u0027),"},{"line_number":34,"context_line":"           nullable\u003dFalse),"},{"line_number":35,"context_line":"    Column(\u0027key\u0027, String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"    Column(\u0027value\u0027, Text(), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FX80%3D","line":33,"updated":"2014-04-15 03:11:29.000000000","message":"agree with denis, this should be instance_id","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"67d7fa02d5759d9c70dfaae9e219669f94898035","unresolved":false,"context_lines":[{"line_number":30,"context_line":"instance_metadata \u003d Table("},{"line_number":31,"context_line":"    \u0027instance_metadata\u0027,"},{"line_number":32,"context_line":"    meta,"},{"line_number":33,"context_line":"    Column(\u0027instance_uuid\u0027, String(36), ForeignKey(\u0027instances.id\u0027),"},{"line_number":34,"context_line":"           nullable\u003dFalse),"},{"line_number":35,"context_line":"    Column(\u0027key\u0027, String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"    Column(\u0027value\u0027, Text(), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FTMI%3D","line":33,"in_reply_to":"AAAAW3%2F%2FX80%3D","updated":"2014-04-15 13:55:45.000000000","message":"yeah I got it, I will change it.","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"49fbff505f591104b18aa66b5d24f70127e8de67","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    Column(\u0027updated\u0027, DateTime()),"},{"line_number":39,"context_line":"    Column(\u0027deleted\u0027, Boolean(), default\u003d0),"},{"line_number":40,"context_line":"    Column(\u0027deleted_at\u0027, DateTime()),"},{"line_number":41,"context_line":"    PrimaryKeyConstraint(\u0027instance_uuid\u0027, \u0027key\u0027, name\u003d\u0027pk_id_key\u0027)"},{"line_number":42,"context_line":")"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FZas%3D","line":41,"updated":"2014-04-14 21:34:03.000000000","message":"i guess it better to name column like \"instance id\" ?","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"67d7fa02d5759d9c70dfaae9e219669f94898035","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    Column(\u0027updated\u0027, DateTime()),"},{"line_number":39,"context_line":"    Column(\u0027deleted\u0027, Boolean(), default\u003d0),"},{"line_number":40,"context_line":"    Column(\u0027deleted_at\u0027, DateTime()),"},{"line_number":41,"context_line":"    PrimaryKeyConstraint(\u0027instance_uuid\u0027, \u0027key\u0027, name\u003d\u0027pk_id_key\u0027)"},{"line_number":42,"context_line":")"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FTMA%3D","line":41,"in_reply_to":"AAAAW3%2F%2FZas%3D","updated":"2014-04-15 13:55:45.000000000","message":"As discussed, change forthcoming.","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"}],"trove/db/sqlalchemy/migrate_repo/versions/027_add_instance_metadata.py":[{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"d9cd92141c273c857b7df1412fb86105e8e73630","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    Column(\u0027value\u0027, Text(), nullable\u003dFalse),"},{"line_number":37,"context_line":"    Column(\u0027created\u0027, DateTime()),"},{"line_number":38,"context_line":"    Column(\u0027updated\u0027, DateTime()),"},{"line_number":39,"context_line":"    Column(\u0027deleted\u0027, Boolean(), default\u003d0),"},{"line_number":40,"context_line":"    Column(\u0027deleted_at\u0027, DateTime()),"},{"line_number":41,"context_line":"    PrimaryKeyConstraint(\u0027instance_id\u0027, \u0027key\u0027, name\u003d\u0027pk_id_key\u0027)"},{"line_number":42,"context_line":")"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_6af43d87","line":39,"updated":"2014-05-29 19:56:07.000000000","message":"so i heard from amcrn its not a good idea to set a default here but it should have nullable\u003dFalse.","commit_id":"7e74e38c024637da776fb2bce7b2040082f9dd16"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"9bb32c885487860e26fd733dd80731b6ae2f5e88","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    Column(\u0027value\u0027, Text(), nullable\u003dFalse),"},{"line_number":37,"context_line":"    Column(\u0027created\u0027, DateTime()),"},{"line_number":38,"context_line":"    Column(\u0027updated\u0027, DateTime()),"},{"line_number":39,"context_line":"    Column(\u0027deleted\u0027, Boolean(), default\u003d0),"},{"line_number":40,"context_line":"    Column(\u0027deleted_at\u0027, DateTime()),"},{"line_number":41,"context_line":"    PrimaryKeyConstraint(\u0027instance_id\u0027, \u0027key\u0027, name\u003d\u0027pk_id_key\u0027)"},{"line_number":42,"context_line":")"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_31de216e","line":39,"in_reply_to":"3ae8d1ca_6af43d87","updated":"2014-05-29 20:15:47.000000000","message":"Done","commit_id":"7e74e38c024637da776fb2bce7b2040082f9dd16"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"48333f376c759e72da435cace7559864662dbac9","unresolved":false,"context_lines":[{"line_number":34,"context_line":"           nullable\u003dFalse),"},{"line_number":35,"context_line":"    Column(\u0027key\u0027, String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"    Column(\u0027value\u0027, Text(), nullable\u003dFalse),"},{"line_number":37,"context_line":"    Column(\u0027created\u0027, DateTime()),"},{"line_number":38,"context_line":"    Column(\u0027updated\u0027, DateTime()),"},{"line_number":39,"context_line":"    Column(\u0027deleted\u0027, Boolean(), nullable\u003dFalse),"},{"line_number":40,"context_line":"    Column(\u0027deleted_at\u0027, DateTime()),"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_6af6505f","line":37,"updated":"2014-06-23 18:56:19.000000000","message":"as a matter of convention, it would be good to have the timestamps be _at. i.e. created_at and updated_at.\n\nis the default to be nullable\u003dtrue?","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"14351e0703ec6ebb4ab9509b10e4a4fc7cd6339b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"           nullable\u003dFalse),"},{"line_number":35,"context_line":"    Column(\u0027key\u0027, String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"    Column(\u0027value\u0027, Text(), nullable\u003dFalse),"},{"line_number":37,"context_line":"    Column(\u0027created\u0027, DateTime()),"},{"line_number":38,"context_line":"    Column(\u0027updated\u0027, DateTime()),"},{"line_number":39,"context_line":"    Column(\u0027deleted\u0027, Boolean(), nullable\u003dFalse),"},{"line_number":40,"context_line":"    Column(\u0027deleted_at\u0027, DateTime()),"}],"source_content_type":"text/x-python","patch_set":13,"id":"dab895d6_bcfe0d37","line":37,"in_reply_to":"1ae5cdf2_0d41a609","updated":"2014-06-28 20:01:24.000000000","message":"do you have a link or reference. It appears to be fine for deleted_at.","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"24418e935a2825826d829eb8e2b755befeda58cb","unresolved":false,"context_lines":[{"line_number":34,"context_line":"           nullable\u003dFalse),"},{"line_number":35,"context_line":"    Column(\u0027key\u0027, String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"    Column(\u0027value\u0027, Text(), nullable\u003dFalse),"},{"line_number":37,"context_line":"    Column(\u0027created\u0027, DateTime()),"},{"line_number":38,"context_line":"    Column(\u0027updated\u0027, DateTime()),"},{"line_number":39,"context_line":"    Column(\u0027deleted\u0027, Boolean(), nullable\u003dFalse),"},{"line_number":40,"context_line":"    Column(\u0027deleted_at\u0027, DateTime()),"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_0d41a609","line":37,"in_reply_to":"1ae5cdf2_6af6505f","updated":"2014-06-28 08:51:04.000000000","message":"no that\u0027s a bad idea because of sqlite i believe. It was an issue for Theron when we did that.","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"48333f376c759e72da435cace7559864662dbac9","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    Column(\u0027updated\u0027, DateTime()),"},{"line_number":39,"context_line":"    Column(\u0027deleted\u0027, Boolean(), nullable\u003dFalse),"},{"line_number":40,"context_line":"    Column(\u0027deleted_at\u0027, DateTime()),"},{"line_number":41,"context_line":"    PrimaryKeyConstraint(\u0027instance_id\u0027, \u0027key\u0027, name\u003d\u0027pk_id_key\u0027)"},{"line_number":42,"context_line":")"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_8571cfad","line":41,"updated":"2014-06-23 18:56:19.000000000","message":"for the operations you are performing on this, it would be advisable not to have key in the PK and just have instance_id.","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"}],"trove/db/sqlalchemy/migrate_repo/versions/032_add_instance_metadata.py":[{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"93bd1ce9253baa95e677149296d131819a4236c1","unresolved":false,"context_lines":[{"line_number":34,"context_line":"           nullable\u003dFalse),"},{"line_number":35,"context_line":"    Column(\u0027key\u0027, String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"    Column(\u0027value\u0027, Text(), nullable\u003dFalse),"},{"line_number":37,"context_line":"    Column(\u0027created\u0027, DateTime()),"},{"line_number":38,"context_line":"    Column(\u0027updated\u0027, DateTime()),"},{"line_number":39,"context_line":"    Column(\u0027deleted\u0027, Boolean(), nullable\u003dFalse),"},{"line_number":40,"context_line":"    Column(\u0027deleted_at\u0027, DateTime()),"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_d8be9063","line":37,"updated":"2014-08-04 14:44:13.000000000","message":"Not a show stopper in my mind but shouldn\u0027t created be nullable\u003dFalse?","commit_id":"bb4107d8f0fb05c4bad3e31f85ef0bf2956e55b1"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"57dc878f2324ea88469663d1790ec6f1f7ae33eb","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def upgrade(migrate_engine):"},{"line_number":46,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":47,"context_line":"    Table(\u0027instances\u0027, meta, autoload\u003dTrue)"},{"line_number":48,"context_line":"    create_tables([instance_metadata])"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_5efab775","line":47,"updated":"2014-08-21 21:05:51.000000000","message":"This doesn\u0027t appear to be used.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"07895599e5b91e3bf60ec7a4ed4b4d52ef489e62","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def upgrade(migrate_engine):"},{"line_number":46,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":47,"context_line":"    Table(\u0027instances\u0027, meta, autoload\u003dTrue)"},{"line_number":48,"context_line":"    create_tables([instance_metadata])"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da9df570_de288488","line":47,"in_reply_to":"1abeadc6_5efab775","updated":"2014-10-07 12:54:43.000000000","message":"+1","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def upgrade(migrate_engine):"},{"line_number":46,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":47,"context_line":"    Table(\u0027instances\u0027, meta, autoload\u003dTrue)"},{"line_number":48,"context_line":"    create_tables([instance_metadata])"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_7ba13393","line":47,"in_reply_to":"1abeadc6_5efab775","updated":"2014-10-07 13:51:35.000000000","message":"Done","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"}],"trove/db/sqlalchemy/migrate_repo/versions/036_add_instance_metadata.py":[{"author":{"_account_id":10295,"name":"mariam john","email":"mariamj@us.ibm.com","username":"mariamj"},"change_message_id":"7909b31dd15afd4932b31617a38c23060525afd5","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from sqlalchemy.schema import Column"},{"line_number":16,"context_line":"from sqlalchemy.schema import MetaData"},{"line_number":17,"context_line":"from sqlalchemy.schema import PrimaryKeyConstraint"},{"line_number":18,"context_line":"from sqlalchemy.schema import ForeignKey"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from trove.db.sqlalchemy.migrate_repo.schema import Boolean"}],"source_content_type":"text/x-python","patch_set":30,"id":"1ab14d0d_414e96c2","line":17,"updated":"2015-04-18 02:12:33.000000000","message":"pep8 is failing because of this import (complains of not being used)","commit_id":"f76926a32f7d1e93ba2430cce5c079ef87d20c4c"}],"trove/instance/models.py":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"c81f023f2557ddb6c9d2f87f71b0f9360e7549e3","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            self.ds \u003d (datastore_models.Datastore."},{"line_number":168,"context_line":"                       load(self.ds_version.datastore_id))"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        if context and db_info.id:"},{"line_number":171,"context_line":"            self.metadata \u003d Metadata(context, self.db_info.id)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9k7Y%3D","line":170,"updated":"2014-04-03 18:08:37.000000000","message":"In what context will \"context\" be None?","commit_id":"a746a641574fa7c3dc68fc59ec9be977afde82f9"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"7cd79bc54ca4ae73fab4799bd5702a290c3ed37c","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            self.ds \u003d (datastore_models.Datastore."},{"line_number":168,"context_line":"                       load(self.ds_version.datastore_id))"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        if context and db_info.id:"},{"line_number":171,"context_line":"            self.metadata \u003d Metadata(context, self.db_info.id)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9jUg%3D","line":170,"in_reply_to":"AAAAWH%2F9k7Y%3D","updated":"2014-04-03 18:45:32.000000000","message":"There were some tests for taskmanager and instance that had None passed in and this caused the metadata model to be very angry so I put this in there as a safeguard.","commit_id":"a746a641574fa7c3dc68fc59ec9be977afde82f9"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"c81f023f2557ddb6c9d2f87f71b0f9360e7549e3","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                       load(self.ds_version.datastore_id))"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        if context and db_info.id:"},{"line_number":171,"context_line":"            self.metadata \u003d Metadata(context, self.db_info.id)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    @property"},{"line_number":174,"context_line":"    def addresses(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9kds%3D","line":171,"updated":"2014-04-03 18:08:37.000000000","message":"The SimpleInstance is used for everything, even the list calls which we might expect to be light-weight. However, Metadata could cause it to take much longer as it doesn\u0027t lazy load.\n\nI think Metadata should change to lazy load or the SimpleInstance metadata field should be changed to _metadata and get returned by a smart property which instantiates the Metadata only when it\u0027s requested.","commit_id":"a746a641574fa7c3dc68fc59ec9be977afde82f9"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"7cd79bc54ca4ae73fab4799bd5702a290c3ed37c","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                       load(self.ds_version.datastore_id))"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        if context and db_info.id:"},{"line_number":171,"context_line":"            self.metadata \u003d Metadata(context, self.db_info.id)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    @property"},{"line_number":174,"context_line":"    def addresses(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9jUU%3D","line":171,"in_reply_to":"AAAAWH%2F9kds%3D","updated":"2014-04-03 18:45:32.000000000","message":"I think the lazy load is definitely doable.","commit_id":"a746a641574fa7c3dc68fc59ec9be977afde82f9"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"c2845a889175987e3e040de00e4c1ef2e867d543","unresolved":false,"context_lines":[{"line_number":352,"context_line":"    @property"},{"line_number":353,"context_line":"    def metadata(self):"},{"line_number":354,"context_line":"        if self.context and self.db_info.id:"},{"line_number":355,"context_line":"            return Metadata(self.context, self.db_info.id)"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"class DetailInstance(SimpleInstance):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAW3%2F%2F60U%3D","line":355,"updated":"2014-04-09 13:58:01.000000000","message":"I\u0027d rather raise an exception here if context is None as in the production code paths it would likely be a bug and letting it be None could hide it.\n\nI know the check for context was done because of the tests passing in None. However, will those same tests expect a working metadata? Would it be possible to whip up a context these tests could pass in?","commit_id":"e3a11e5326843371832efc0a80382ee2a0d44b2c"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"93bd1ce9253baa95e677149296d131819a4236c1","unresolved":false,"context_lines":[{"line_number":348,"context_line":"    @property"},{"line_number":349,"context_line":"    def metadata(self):"},{"line_number":350,"context_line":"        # There may be issues where tests pass in a context of None, this"},{"line_number":351,"context_line":"        # is unacceptable."},{"line_number":352,"context_line":"        if self.context is None:"},{"line_number":353,"context_line":"            raise exception.TroveError(_(\"Context passed to instance is None\"))"},{"line_number":354,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_3876acd8","line":351,"updated":"2014-08-04 14:44:13.000000000","message":"is this comment adding value?","commit_id":"bb4107d8f0fb05c4bad3e31f85ef0bf2956e55b1"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"93bd1ce9253baa95e677149296d131819a4236c1","unresolved":false,"context_lines":[{"line_number":520,"context_line":"                           configuration_id\u003dNone)"},{"line_number":521,"context_line":"            task_api.API(self.context).delete_instance(self.id)"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"            # Clean up the metadata if there is some"},{"line_number":524,"context_line":"            metadata \u003d self.metadata"},{"line_number":525,"context_line":"            if metadata:"},{"line_number":526,"context_line":"                metadata.clear()"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_787ca4b6","line":523,"updated":"2014-08-04 14:44:13.000000000","message":"Is this comment adding value?","commit_id":"bb4107d8f0fb05c4bad3e31f85ef0bf2956e55b1"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"93bd1ce9253baa95e677149296d131819a4236c1","unresolved":false,"context_lines":[{"line_number":523,"context_line":"            # Clean up the metadata if there is some"},{"line_number":524,"context_line":"            metadata \u003d self.metadata"},{"line_number":525,"context_line":"            if metadata:"},{"line_number":526,"context_line":"                metadata.clear()"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"        deltas \u003d {\u0027instances\u0027: -1}"},{"line_number":529,"context_line":"        if CONF.trove_volume_support:"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_b849dc8f","line":526,"updated":"2014-08-04 14:44:13.000000000","message":"Is this equivalent to \n\nif self.metadata:\n    self.metadata.clear()","commit_id":"bb4107d8f0fb05c4bad3e31f85ef0bf2956e55b1"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"be262d0ee9511529ea1e86672571f16b32f4b2f5","unresolved":false,"context_lines":[{"line_number":518,"context_line":"                           configuration_id\u003dNone)"},{"line_number":519,"context_line":"            task_api.API(self.context).delete_instance(self.id)"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"            if self.metadata:"},{"line_number":522,"context_line":"                metadata.clear()"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":"        deltas \u003d {\u0027instances\u0027: -1}"}],"source_content_type":"text/x-python","patch_set":21,"id":"baada198_16ab09d8","line":521,"updated":"2014-08-07 00:11:55.000000000","message":"unless i\u0027m missing something, this if-check should be in delete_async, otherwise it\u0027s quite possible you end up clearing the metadata, but the delete itself (via task_api) failed.","commit_id":"abf12e60fa5bf47191f750c7d825e47a7aa7e55a"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":555,"context_line":"            SecurityGroup.delete_for_instance(self.db_info.id,"},{"line_number":556,"context_line":"                                              self.context)"},{"line_number":557,"context_line":"        if self.metadata:"},{"line_number":558,"context_line":"            metadata.clear()"},{"line_number":559,"context_line":""},{"line_number":560,"context_line":"    @property"},{"line_number":561,"context_line":"    def guest(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_fbbc43bd","line":558,"updated":"2014-10-07 13:51:35.000000000","message":"self.metedata.clear()","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"}],"trove/instance/service.py":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"c81f023f2557ddb6c9d2f87f71b0f9360e7549e3","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        instance.delete()"},{"line_number":176,"context_line":"        # Clean up metadata for instance"},{"line_number":177,"context_line":"        metadata \u003d Metadata(context, id)"},{"line_number":178,"context_line":"        metadata.clear()"},{"line_number":179,"context_line":"        # TODO(cp16net): need to set the return code correctly"},{"line_number":180,"context_line":"        return wsgi.Result(None, 202)"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9kjg%3D","line":178,"updated":"2014-04-03 18:08:37.000000000","message":"This should be moved to the instance models.","commit_id":"a746a641574fa7c3dc68fc59ec9be977afde82f9"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"7cd79bc54ca4ae73fab4799bd5702a290c3ed37c","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        instance.delete()"},{"line_number":176,"context_line":"        # Clean up metadata for instance"},{"line_number":177,"context_line":"        metadata \u003d Metadata(context, id)"},{"line_number":178,"context_line":"        metadata.clear()"},{"line_number":179,"context_line":"        # TODO(cp16net): need to set the return code correctly"},{"line_number":180,"context_line":"        return wsgi.Result(None, 202)"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9jUI%3D","line":178,"in_reply_to":"AAAAWH%2F9kjg%3D","updated":"2014-04-03 18:45:32.000000000","message":"Good point.","commit_id":"a746a641574fa7c3dc68fc59ec9be977afde82f9"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"c2845a889175987e3e040de00e4c1ef2e867d543","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from trove.datastore import models as datastore_models"},{"line_number":27,"context_line":"from trove.backup.models import Backup as backup_model"},{"line_number":28,"context_line":"from trove.backup import views as backup_views"},{"line_number":29,"context_line":"from trove.metadata.models import Metadata"},{"line_number":30,"context_line":"from trove.openstack.common import log as logging"},{"line_number":31,"context_line":"from trove.openstack.common.gettextutils import _"},{"line_number":32,"context_line":"import trove.common.apischema as apischema"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAW3%2F%2F60M%3D","line":29,"updated":"2014-04-09 13:58:01.000000000","message":"This can be deleted.","commit_id":"e3a11e5326843371832efc0a80382ee2a0d44b2c"}],"trove/instance/views.py":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"c81f023f2557ddb6c9d2f87f71b0f9360e7549e3","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        if self.instance.metadata:"},{"line_number":100,"context_line":"            result[\u0027instance\u0027][\u0027metadata\u0027] \u003d dict()"},{"line_number":101,"context_line":"            for k in self.instance.metadata:"},{"line_number":102,"context_line":"                result[\u0027instance\u0027][\u0027metadata\u0027][k] \u003d self.instance.metadata[k]"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        return result"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9khA%3D","line":102,"updated":"2014-04-03 18:08:37.000000000","message":"The copy function of the Metadata class should work, which would make this:\n\nresult[\u0027instance\u0027][\u0027metadata\u0027] \u003d self.instance.metadata.copy()","commit_id":"a746a641574fa7c3dc68fc59ec9be977afde82f9"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"7cd79bc54ca4ae73fab4799bd5702a290c3ed37c","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        if self.instance.metadata:"},{"line_number":100,"context_line":"            result[\u0027instance\u0027][\u0027metadata\u0027] \u003d dict()"},{"line_number":101,"context_line":"            for k in self.instance.metadata:"},{"line_number":102,"context_line":"                result[\u0027instance\u0027][\u0027metadata\u0027][k] \u003d self.instance.metadata[k]"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        return result"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9jUA%3D","line":102,"in_reply_to":"AAAAWH%2F9khA%3D","updated":"2014-04-03 18:45:32.000000000","message":"oh duh...","commit_id":"a746a641574fa7c3dc68fc59ec9be977afde82f9"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"93bd1ce9253baa95e677149296d131819a4236c1","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        if self.instance.root_password:"},{"line_number":98,"context_line":"            result[\u0027instance\u0027][\u0027password\u0027] \u003d self.instance.root_password"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        metadata \u003d self.instance.metadata"},{"line_number":101,"context_line":"        if metadata:"},{"line_number":102,"context_line":"            result[\u0027instance\u0027][\u0027metadata\u0027] \u003d metadata.copy()"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_5858c056","line":100,"updated":"2014-08-04 14:44:13.000000000","message":"can this be simplified to\n\nif self.instance.metadata:\n    result ...","commit_id":"bb4107d8f0fb05c4bad3e31f85ef0bf2956e55b1"}],"trove/metadata/__init__.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"0dc8965ea2efdf7fe247a3acaf2b47e011556d2e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Rackspace Hosting"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2Bw2M%3D","line":1,"updated":"2014-03-24 15:01:30.000000000","message":"this file should be empty","commit_id":"bae7cb2bed431544df99e3848781d52707339f3a"}],"trove/metadata/models.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"4047529c29cfaf53f1fcd0d423ef1a8b0bea773c","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    _table_name \u003d \u0027instance_metadata\u0027"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class MetadataEntry(object):"},{"line_number":41,"context_line":"    def __init__(self, context, metadata\u003dNone, metadata_id\u003dNone, **kwargs):"},{"line_number":42,"context_line":"        if metadata:"},{"line_number":43,"context_line":"            # Favor a preinstantiated DBMetadata object"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2Bkno%3D","line":40,"updated":"2014-03-25 20:15:34.000000000","message":"please add more doc strings","commit_id":"bf0b782247da1dc2ac396fb9bc2b77a35a35c899"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"8d2dd6fb4b46b8fb4a3109147d902400c5990bd2","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    _table_name \u003d \u0027instance_metadata\u0027"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class MetadataEntry(object):"},{"line_number":41,"context_line":"    def __init__(self, context, metadata\u003dNone, metadata_id\u003dNone, **kwargs):"},{"line_number":42,"context_line":"        if metadata:"},{"line_number":43,"context_line":"            # Favor a preinstantiated DBMetadata object"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F93vU%3D","line":40,"in_reply_to":"AAAAWH%2F%2Bkno%3D","updated":"2014-04-01 14:32:06.000000000","message":"I can see where a couple more doc strings could be added but most of the models just reimplement the dictionary interface so they don\u0027t really need docstrings.","commit_id":"bf0b782247da1dc2ac396fb9bc2b77a35a35c899"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"c81f023f2557ddb6c9d2f87f71b0f9360e7549e3","unresolved":false,"context_lines":[{"line_number":276,"context_line":""},{"line_number":277,"context_line":"        return value"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def clear(self):"},{"line_number":280,"context_line":"        for metadata in self.metadata:"},{"line_number":281,"context_line":"            metadata.delete()"},{"line_number":282,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9kmM%3D","line":279,"updated":"2014-04-03 18:08:37.000000000","message":"Why not just call this \"delete?\" IMO the word clear doesn\u0027t do enough to advertise how far this goes.","commit_id":"a746a641574fa7c3dc68fc59ec9be977afde82f9"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"7cd79bc54ca4ae73fab4799bd5702a290c3ed37c","unresolved":false,"context_lines":[{"line_number":276,"context_line":""},{"line_number":277,"context_line":"        return value"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def clear(self):"},{"line_number":280,"context_line":"        for metadata in self.metadata:"},{"line_number":281,"context_line":"            metadata.delete()"},{"line_number":282,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9jTs%3D","line":279,"in_reply_to":"AAAAWH%2F9kmM%3D","updated":"2014-04-03 18:45:32.000000000","message":"This is from the dictionary interface so even if I named it delete I\u0027d need to implement a copy that calls delete otherwise sticking to the dictionary interface starts to fall apart.   I feel like this interface really fit well for metadata in particular so I\u0027d prefer to stick with it if thats ok.","commit_id":"a746a641574fa7c3dc68fc59ec9be977afde82f9"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"49fbff505f591104b18aa66b5d24f70127e8de67","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Rackspace Hosting"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FZZ4%3D","line":1,"updated":"2014-04-14 21:34:03.000000000","message":"different header, please use common","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"67d7fa02d5759d9c70dfaae9e219669f94898035","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Rackspace Hosting"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FTK8%3D","line":1,"in_reply_to":"AAAAW3%2F%2FZZ4%3D","updated":"2014-04-15 13:55:45.000000000","message":"headers will be updated.","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"49fbff505f591104b18aa66b5d24f70127e8de67","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        }"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"class Metadata(object):"},{"line_number":127,"context_line":"    \"\"\""},{"line_number":128,"context_line":"    Instance metadata.  This object should always satisfy the dictionary"},{"line_number":129,"context_line":"    interface to keep usage simple."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FZaE%3D","line":126,"updated":"2014-04-14 21:34:03.000000000","message":"i think better to inherit Metada class for the dict class, instead of the object.","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"67d7fa02d5759d9c70dfaae9e219669f94898035","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        }"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"class Metadata(object):"},{"line_number":127,"context_line":"    \"\"\""},{"line_number":128,"context_line":"    Instance metadata.  This object should always satisfy the dictionary"},{"line_number":129,"context_line":"    interface to keep usage simple."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FTLE%3D","line":126,"in_reply_to":"AAAAW3%2F%2FZaE%3D","updated":"2014-04-15 13:55:45.000000000","message":"I disagree with this completely.  I feel like having a docstring that says it *acts* like a dict is clear enough and as I understand it, it is bad form to inherit and extend builtins in python.","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"e8ad0c73281f0503ee54e924f6800f70e17ae18e","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class DBMetadata(models.DatabaseModelBase):"},{"line_number":35,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027instance_id\u0027, \u0027key\u0027, \u0027value\u0027, \u0027created\u0027,"},{"line_number":36,"context_line":"                    \u0027updated\u0027, \u0027deleted\u0027, \u0027deleted_at\u0027]"},{"line_number":37,"context_line":"    preserve_on_delete \u003d False"},{"line_number":38,"context_line":"    _table_name \u003d \u0027instance_metadata\u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_51686188","line":35,"updated":"2014-07-29 15:08:50.000000000","message":"is this aiming to be a generic metadata table? if so should it have instance_id and and instance_metadata?\n\nshould we have a separate InstanceMetadata table inheriting from the DBMetadata?","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"5cb450a90d91805fa7f6b343bf348e196b95789d","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class DBMetadata(models.DatabaseModelBase):"},{"line_number":35,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027instance_id\u0027, \u0027key\u0027, \u0027value\u0027, \u0027created\u0027,"},{"line_number":36,"context_line":"                    \u0027updated\u0027, \u0027deleted\u0027, \u0027deleted_at\u0027]"},{"line_number":37,"context_line":"    preserve_on_delete \u003d False"},{"line_number":38,"context_line":"    _table_name \u003d \u0027instance_metadata\u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_d5444049","line":35,"in_reply_to":"baada198_51686188","updated":"2014-07-30 05:55:14.000000000","message":"this blueprint was addressing instance metadata. i think the idea of generic metadata was something that we thought about well after this we drawn up.","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":41,"context_line":"class MetadataEntry(object):"},{"line_number":42,"context_line":"    def __init__(self, context, metadata\u003dNone, metadata_key\u003dNone, **kwargs):"},{"line_number":43,"context_line":"        \"\"\""},{"line_number":44,"context_line":"        Returns an instance of MetadataEntry.  This represents a row in the"},{"line_number":45,"context_line":"        database but wraps it in a way that allows the Metadata class to"},{"line_number":46,"context_line":"        satisfy a dictionary interface."},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_4dbe7dd5","line":44,"updated":"2014-07-25 10:20:02.000000000","message":"since you are using kwargs, it would help to know what the possible args are that you support. I\u0027ve discovered instance_id, key and value. Also it appears that either\n\n(a) metadata must be provided or,\n(b) metadata_key and instance_id must be provided, or\n(c) a key and a value must be provided.\n\nBut there\u0027s more ...\n\nI\u0027m curious why you chose kwargs for these three while you have named args for metadata and metadata_key which are both defaulted to None.\n\nWhy not (this may be a dumb suggestion, so my apologies if it is) make the signature just \n\n__init__ (self, context, **kwargs)\n\nand glean the rest as you go?","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        database but wraps it in a way that allows the Metadata class to"},{"line_number":46,"context_line":"        satisfy a dictionary interface."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        One should never operate directly on a MetadataEntry instance but"},{"line_number":49,"context_line":"        rather use Metadata and operate on it as you would a dictionary."},{"line_number":50,"context_line":"        \"\"\""},{"line_number":51,"context_line":"        instance_id \u003d kwargs.get(\u0027instance_id\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_8df33508","line":48,"updated":"2014-07-25 10:20:02.000000000","message":"Would you update his string and explain in a sentence or two why that is the case?","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        instance_id \u003d kwargs.get(\u0027instance_id\u0027)"},{"line_number":52,"context_line":"        if metadata:"},{"line_number":53,"context_line":"            # Favor a preinstantiated DBMetadata object"},{"line_number":54,"context_line":"            LOG.info(_(\u0027Got preinstantiated metadataentry instance\u0027))"},{"line_number":55,"context_line":"            self.metadata \u003d metadata"},{"line_number":56,"context_line":"        elif metadata_key and instance_id:"},{"line_number":57,"context_line":"            # Otherwise try to find one"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_edb3d14b","line":54,"updated":"2014-07-25 10:20:02.000000000","message":"is this really an INFO message? I\u0027d suggest making this debug, stick a period at the end of the message, and maybe provide the metadata object in the debug message. \n\nJust knowing that one was provided; does it provide sufficient value? That\u0027s for you to decide, I\u0027ve not run this code and I don\u0027t know.\n\nAlso, the comment doesn\u0027t and the one in the else don\u0027t provide that much more that the \u0027if metadata:\u0027 don\u0027t already provide.","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            self.metadata \u003d metadata"},{"line_number":56,"context_line":"        elif metadata_key and instance_id:"},{"line_number":57,"context_line":"            # Otherwise try to find one"},{"line_number":58,"context_line":"            LOG.info(_(\u0027Got metadata_key %s fetching from the db\u0027) %"},{"line_number":59,"context_line":"                     metadata_key)"},{"line_number":60,"context_line":"            self.metadata \u003d DBMetadata.find_by(context, key\u003dmetadata_key,"},{"line_number":61,"context_line":"                                               instance_id\u003dinstance_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_8dca559e","line":58,"updated":"2014-07-25 10:20:02.000000000","message":"Is this INFO, maybe debug. Please add a \u0027.\u0027 at the end of the message.","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            # Otherwise try to find one"},{"line_number":58,"context_line":"            LOG.info(_(\u0027Got metadata_key %s fetching from the db\u0027) %"},{"line_number":59,"context_line":"                     metadata_key)"},{"line_number":60,"context_line":"            self.metadata \u003d DBMetadata.find_by(context, key\u003dmetadata_key,"},{"line_number":61,"context_line":"                                               instance_id\u003dinstance_id)"},{"line_number":62,"context_line":"        else:"},{"line_number":63,"context_line":"            LOG.info("}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_8dfed568","line":60,"updated":"2014-07-25 10:20:02.000000000","message":"Don\u0027t you need a check here that verifies that you did in fact get something? if you didn\u0027t that\u0027s an error, right?","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        else:"},{"line_number":63,"context_line":"            LOG.info("},{"line_number":64,"context_line":"                _(\u0027Did not receive a metadata: %(metadata)s\u0027) %"},{"line_number":65,"context_line":"                {\u0027metadata\u0027: metadata})"},{"line_number":66,"context_line":"            key \u003d kwargs.get(\u0027key\u0027)"},{"line_number":67,"context_line":"            value \u003d kwargs.get(\u0027value\u0027)"},{"line_number":68,"context_line":"            if key and value and instance_id:"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_adf719d3","line":65,"updated":"2014-07-25 10:20:02.000000000","message":"I wonder what this message will print. After all, metadata is None, presumably. Also same comment about info vs. debug and punctuation.","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                           \u0027metadata: %(metadata)s, metadata_id: \u0027"},{"line_number":81,"context_line":"                           \u0027kwargs: %(kwargs)s\u0027) %"},{"line_number":82,"context_line":"                         {\u0027metadata\u0027: metadata, \u0027kwargs\u0027: kwargs})"},{"line_number":83,"context_line":"                raise exception.MetadataCreationError()"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def __repr__(self):"},{"line_number":86,"context_line":"        return (\u0027\u003ctrove.metadata.models.MetadataEntry object, %s: %s\u003e\u0027 %"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_18b12144","line":83,"updated":"2014-07-25 10:20:02.000000000","message":"please relate this comment to the one on exception.py. it would be better to make the string which you are using in LOG.info part of the exception and add that contextual information into the exception.","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        # is no way to do an operation on nested objects."},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        # If new metadata is created we will want to reload all metadata from"},{"line_number":199,"context_line":"        # the db after successful creation"},{"line_number":200,"context_line":"        force_reload \u003d False"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        metadata \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_0d41e5a5","line":199,"updated":"2014-07-25 10:20:02.000000000","message":"Why all metadata and not just the one that was created?","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"57dc878f2324ea88469663d1790ec6f1f7ae33eb","unresolved":false,"context_lines":[{"line_number":31,"context_line":"class DBInstanceMetadata(models.DatabaseModelBase):"},{"line_number":32,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027instance_id\u0027, \u0027key\u0027, \u0027value\u0027, \u0027created\u0027,"},{"line_number":33,"context_line":"                    \u0027updated\u0027, \u0027deleted\u0027, \u0027deleted_at\u0027]"},{"line_number":34,"context_line":"    preserve_on_delete \u003d False"},{"line_number":35,"context_line":"    _table_name \u003d \u0027instance_metadata\u0027"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_1e82ffc7","line":34,"updated":"2014-08-21 21:05:51.000000000","message":"preserve_on_delete doesn\u0027t appear to be used by superclass or any DB code.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":31,"context_line":"class DBInstanceMetadata(models.DatabaseModelBase):"},{"line_number":32,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027instance_id\u0027, \u0027key\u0027, \u0027value\u0027, \u0027created\u0027,"},{"line_number":33,"context_line":"                    \u0027updated\u0027, \u0027deleted\u0027, \u0027deleted_at\u0027]"},{"line_number":34,"context_line":"    preserve_on_delete \u003d False"},{"line_number":35,"context_line":"    _table_name \u003d \u0027instance_metadata\u0027"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_9bc33737","line":34,"in_reply_to":"1abeadc6_1e82ffc7","updated":"2014-10-07 13:51:35.000000000","message":"Done","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"57dc878f2324ea88469663d1790ec6f1f7ae33eb","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027instance_id\u0027, \u0027key\u0027, \u0027value\u0027, \u0027created\u0027,"},{"line_number":33,"context_line":"                    \u0027updated\u0027, \u0027deleted\u0027, \u0027deleted_at\u0027]"},{"line_number":34,"context_line":"    preserve_on_delete \u003d False"},{"line_number":35,"context_line":"    _table_name \u003d \u0027instance_metadata\u0027"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class InstanceMetadataEntry(object):"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_3e87bbd8","line":35,"updated":"2014-08-21 21:05:51.000000000","message":"_table_name doesn\u0027t appear to be used by superclass or any DB code.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027instance_id\u0027, \u0027key\u0027, \u0027value\u0027, \u0027created\u0027,"},{"line_number":33,"context_line":"                    \u0027updated\u0027, \u0027deleted\u0027, \u0027deleted_at\u0027]"},{"line_number":34,"context_line":"    preserve_on_delete \u003d False"},{"line_number":35,"context_line":"    _table_name \u003d \u0027instance_metadata\u0027"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class InstanceMetadataEntry(object):"}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_bbbe3bac","line":35,"in_reply_to":"1abeadc6_3e87bbd8","updated":"2014-10-07 13:51:35.000000000","message":"Done","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.metadata \u003d db_instance_metadata_entry"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __repr__(self):"},{"line_number":50,"context_line":"        return (\u0027\u003ctrove.metadata.models.InstanceMetadataEntry object, %s: %s\u003e\u0027"},{"line_number":51,"context_line":"                % (self.metadata.key, self.metadata.value))"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def set_value(self, new_value):"}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_48c42b42","line":50,"updated":"2014-08-13 10:31:01.000000000","message":"that\u0027s interesting; that you provide the whole path here.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"c83c936d677cba471ed7c7ae2330113365ed1b0b","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.metadata \u003d db_instance_metadata_entry"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __repr__(self):"},{"line_number":50,"context_line":"        return (\u0027\u003ctrove.metadata.models.InstanceMetadataEntry object, %s: %s\u003e\u0027"},{"line_number":51,"context_line":"                % (self.metadata.key, self.metadata.value))"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def set_value(self, new_value):"}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_5eecdebc","line":50,"in_reply_to":"baada198_48c42b42","updated":"2014-08-13 12:20:51.000000000","message":"why can\u0027t we just use __class__ ?","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.metadata \u003d db_instance_metadata_entry"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __repr__(self):"},{"line_number":50,"context_line":"        return (\u0027\u003ctrove.metadata.models.InstanceMetadataEntry object, %s: %s\u003e\u0027"},{"line_number":51,"context_line":"                % (self.metadata.key, self.metadata.value))"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def set_value(self, new_value):"}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_3b016b6a","line":50,"in_reply_to":"baada198_5eecdebc","updated":"2014-10-07 13:51:35.000000000","message":"Done","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"57dc878f2324ea88469663d1790ec6f1f7ae33eb","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def id(self):"},{"line_number":84,"context_line":"        return self.metadata.id"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def copy(self):"},{"line_number":87,"context_line":"        return {"},{"line_number":88,"context_line":"            self.key: self.value"},{"line_number":89,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_d385be07","line":86,"updated":"2014-08-21 21:05:51.000000000","message":"Why \"copy\"? Why not \"to_dict\" or \"as_dict\"?","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            self.instance_id \u003d instance_id"},{"line_number":110,"context_line":"        else:"},{"line_number":111,"context_line":"            raise exception.NotFound("},{"line_number":112,"context_line":"                _(\u0027Not enough given to find metadata\u0027))"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        self._load_metadata()"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_397a12f0","line":112,"updated":"2014-08-13 10:31:01.000000000","message":"It isn\u0027t entirely clear why this would happen but if you get a chance, please consider rewording the message.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            self.instance_id \u003d instance_id"},{"line_number":110,"context_line":"        else:"},{"line_number":111,"context_line":"            raise exception.NotFound("},{"line_number":112,"context_line":"                _(\u0027Not enough given to find metadata\u0027))"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        self._load_metadata()"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_3b708bdb","line":112,"in_reply_to":"baada198_397a12f0","updated":"2014-10-07 13:51:35.000000000","message":"Done","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"c83c936d677cba471ed7c7ae2330113365ed1b0b","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            self.instance_id \u003d instance_id"},{"line_number":110,"context_line":"        else:"},{"line_number":111,"context_line":"            raise exception.NotFound("},{"line_number":112,"context_line":"                _(\u0027Not enough given to find metadata\u0027))"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        self._load_metadata()"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_5e43feaf","line":112,"in_reply_to":"baada198_397a12f0","updated":"2014-08-13 12:20:51.000000000","message":"this seems weired to me, do we really need this validation here?","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        self._load_metadata()"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _load_metadata(self):"},{"line_number":117,"context_line":"        \"\"\""},{"line_number":118,"context_line":"        Helper method for refreshing metadata from the database.  This is"},{"line_number":119,"context_line":"        called at instantiation and anytime metadata is added to the instance."}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_79e56aa1","line":116,"updated":"2014-08-13 10:31:01.000000000","message":"is it not possible that this finds no metadata? and if that\u0027s the case, what happens?","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        self._load_metadata()"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _load_metadata(self):"},{"line_number":117,"context_line":"        \"\"\""},{"line_number":118,"context_line":"        Helper method for refreshing metadata from the database.  This is"},{"line_number":119,"context_line":"        called at instantiation and anytime metadata is added to the instance."}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_5b61cf03","line":116,"in_reply_to":"baada198_79e56aa1","updated":"2014-10-07 13:51:35.000000000","message":"I would say that if there\u0027s no metadata for instance we should raise NotFound that will be represented as HTTP 404 for user.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        # is no way to do an operation on nested objects."},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        metadata \u003d None"},{"line_number":163,"context_line":"        for meta in self.metadata:"},{"line_number":164,"context_line":"            if meta.key \u003d\u003d key:"},{"line_number":165,"context_line":"                # The key already exists so this an update operation"},{"line_number":166,"context_line":"                metadata \u003d meta"}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_547ceb21","line":163,"updated":"2014-08-13 10:31:01.000000000","message":"This block of code should be simplifiable, no? \n\nshouldn\u0027t this be just self.metadata[key]","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        # is no way to do an operation on nested objects."},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        metadata \u003d None"},{"line_number":163,"context_line":"        for meta in self.metadata:"},{"line_number":164,"context_line":"            if meta.key \u003d\u003d key:"},{"line_number":165,"context_line":"                # The key already exists so this an update operation"},{"line_number":166,"context_line":"                metadata \u003d meta"}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_1e20159a","line":163,"in_reply_to":"1abeadc6_2ce20c2f","updated":"2014-10-07 13:51:35.000000000","message":"Agreed.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"57dc878f2324ea88469663d1790ec6f1f7ae33eb","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        # is no way to do an operation on nested objects."},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        metadata \u003d None"},{"line_number":163,"context_line":"        for meta in self.metadata:"},{"line_number":164,"context_line":"            if meta.key \u003d\u003d key:"},{"line_number":165,"context_line":"                # The key already exists so this an update operation"},{"line_number":166,"context_line":"                metadata \u003d meta"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_2ce20c2f","line":163,"in_reply_to":"baada198_547ceb21","updated":"2014-08-21 21:05:51.000000000","message":"I believe this cannot be done because self.metadata is a list and not a dict.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":224,"context_line":"    def get(self, key, default\u003dNone):"},{"line_number":225,"context_line":"        value \u003d default"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        for metadata in self.metadata:"},{"line_number":228,"context_line":"            if metadata.key \u003d\u003d key:"},{"line_number":229,"context_line":"                value \u003d metadata.value"},{"line_number":230,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_68380fcc","line":227,"updated":"2014-08-13 10:31:01.000000000","message":"here too","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            yield key"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def pop(self, key):"},{"line_number":244,"context_line":"        for metadata in self.metadata:"},{"line_number":245,"context_line":"            if metadata.key \u003d\u003d key:"},{"line_number":246,"context_line":"                return metadata.value"},{"line_number":247,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_2857f702","line":244,"updated":"2014-08-13 10:31:01.000000000","message":"this code is repeated ;)","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"c83c936d677cba471ed7c7ae2330113365ed1b0b","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            yield key"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def pop(self, key):"},{"line_number":244,"context_line":"        for metadata in self.metadata:"},{"line_number":245,"context_line":"            if metadata.key \u003d\u003d key:"},{"line_number":246,"context_line":"                return metadata.value"},{"line_number":247,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_5edf7ed7","line":244,"in_reply_to":"baada198_2857f702","updated":"2014-08-13 12:20:51.000000000","message":"+1","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"57dc878f2324ea88469663d1790ec6f1f7ae33eb","unresolved":false,"context_lines":[{"line_number":255,"context_line":"        for item in self.items():"},{"line_number":256,"context_line":"            yield item"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    def copy(self):"},{"line_number":259,"context_line":"        result \u003d {}"},{"line_number":260,"context_line":"        for metadata in self.metadata:"},{"line_number":261,"context_line":"            result[metadata.key] \u003d metadata.value"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_9e47efbb","line":258,"updated":"2014-08-21 21:05:51.000000000","message":"Why \"copy\"? Why not \"to_dict\" or \"as_dict\"?","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        :param key: Key for which we need a InstanceMetadataEntry object"},{"line_number":271,"context_line":"        \"\"\""},{"line_number":272,"context_line":"        for metadata in self.metadata:"},{"line_number":273,"context_line":"            if metadata.key \u003d\u003d key:"},{"line_number":274,"context_line":"                return metadata"},{"line_number":275,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_08523312","line":272,"updated":"2014-08-13 10:31:01.000000000","message":"There seem to be any number of methods doing this particular iteration ;)","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"c83c936d677cba471ed7c7ae2330113365ed1b0b","unresolved":false,"context_lines":[{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        :param key: Key for which we need a InstanceMetadataEntry object"},{"line_number":271,"context_line":"        \"\"\""},{"line_number":272,"context_line":"        for metadata in self.metadata:"},{"line_number":273,"context_line":"            if metadata.key \u003d\u003d key:"},{"line_number":274,"context_line":"                return metadata"},{"line_number":275,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_be941ae8","line":272,"in_reply_to":"baada198_08523312","updated":"2014-08-13 12:20:51.000000000","message":"agreed, should be refactored.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        :param key: Key for which we need a InstanceMetadataEntry object"},{"line_number":271,"context_line":"        \"\"\""},{"line_number":272,"context_line":"        for metadata in self.metadata:"},{"line_number":273,"context_line":"            if metadata.key \u003d\u003d key:"},{"line_number":274,"context_line":"                return metadata"},{"line_number":275,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_de9e8db8","line":272,"in_reply_to":"baada198_be941ae8","updated":"2014-10-07 13:51:35.000000000","message":"Ammending my previous comment. It does only initial iteration, but the additional logic is always different.\n\nThe only refactoring that i can see here is to use pop method instead of writing it again","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":10295,"name":"mariam john","email":"mariamj@us.ibm.com","username":"mariamj"},"change_message_id":"87650933a2cc8b0c6bf3adb64e2c7a0845db67a9","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        self.metadata \u003d db_instance_metadata_entry"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def __repr__(self):"},{"line_number":46,"context_line":"        return (\u0027\u003c%s object, %s: %s\u003e\u0027"},{"line_number":47,"context_line":"                % (self.__class__, self.metadata.key, self.metadata.value))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def set_value(self, new_value):"}],"source_content_type":"text/x-python","patch_set":26,"id":"baa201ad_f8299e8a","line":46,"updated":"2014-10-07 20:12:06.000000000","message":"Doesnt this need to be translated? Thanks","commit_id":"7468c353159210a9fa4be65480473a43c5d02770"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"800e045667471bf6bf5e1a07b97ca7d759448805","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        self.metadata \u003d db_instance_metadata_entry"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def __repr__(self):"},{"line_number":46,"context_line":"        return (\u0027\u003c%s object, %s: %s\u003e\u0027"},{"line_number":47,"context_line":"                % (self.__class__, self.metadata.key, self.metadata.value))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def set_value(self, new_value):"}],"source_content_type":"text/x-python","patch_set":26,"id":"baa201ad_04627bad","line":46,"in_reply_to":"baa201ad_f8299e8a","updated":"2014-10-07 20:32:14.000000000","message":"it might be, but it\u0027s not strictly required.","commit_id":"7468c353159210a9fa4be65480473a43c5d02770"}],"trove/metadata/service.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"0dc8965ea2efdf7fe247a3acaf2b47e011556d2e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Rackspace"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2Bwy4%3D","line":1,"updated":"2014-03-24 15:01:30.000000000","message":"please use the same header for all files","commit_id":"bae7cb2bed431544df99e3848781d52707339f3a"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"49fbff505f591104b18aa66b5d24f70127e8de67","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Rackspace Hosting"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FZZk%3D","line":1,"updated":"2014-04-14 21:34:03.000000000","message":"different header","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"67d7fa02d5759d9c70dfaae9e219669f94898035","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Rackspace Hosting"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FTK4%3D","line":1,"in_reply_to":"AAAAW3%2F%2FZZk%3D","updated":"2014-04-15 13:55:45.000000000","message":"headers will be updated in next pull.","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"af3e3eef1deabc45434e221377b28010eec276ae","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        :rtype: wsgi.Result"},{"line_number":40,"context_line":"        \"\"\""},{"line_number":41,"context_line":"        LOG.info("},{"line_number":42,"context_line":"            _(\u0027Beginning list of instance metadata for %s\u0027) % instance_id)"},{"line_number":43,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":44,"context_line":"        dbmeta \u003d Metadata(context, instance_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FX7g%3D","line":41,"updated":"2014-04-15 03:11:29.000000000","message":"This and most of the LOG lines below should be emitted at the \u0027debug\u0027 level.","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"67d7fa02d5759d9c70dfaae9e219669f94898035","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        :rtype: wsgi.Result"},{"line_number":40,"context_line":"        \"\"\""},{"line_number":41,"context_line":"        LOG.info("},{"line_number":42,"context_line":"            _(\u0027Beginning list of instance metadata for %s\u0027) % instance_id)"},{"line_number":43,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":44,"context_line":"        dbmeta \u003d Metadata(context, instance_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FTJ8%3D","line":41,"in_reply_to":"AAAAW3%2F%2FX7g%3D","updated":"2014-04-15 13:55:45.000000000","message":"I thought so too but looking back at the configurations work it seemed like what looked like debug lines were emitted using info so I figured this was something we\u0027d decided on.  I\u0027ll fix.  Sadly they were debug before and I changed them all.","commit_id":"14b6487d600ef4cc3980c8482b72b64a8dc39db2"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"d9cd92141c273c857b7df1412fb86105e8e73630","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                views.MetadataKeyValueView(metadata, req\u003dreq).data(), 200)"},{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            LOG.info(_(\u0027No metadata found for metadata key %s\u0027) % key)"},{"line_number":72,"context_line":"            return wsgi.Result(None, 404)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    @staticmethod"},{"line_number":75,"context_line":"    def create(req, body, tenant_id, instance_id, key):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_7fc5d53a","line":72,"updated":"2014-05-29 19:56:07.000000000","message":"same as below","commit_id":"7e74e38c024637da776fb2bce7b2040082f9dd16"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"9bb32c885487860e26fd733dd80731b6ae2f5e88","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                views.MetadataKeyValueView(metadata, req\u003dreq).data(), 200)"},{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            LOG.info(_(\u0027No metadata found for metadata key %s\u0027) % key)"},{"line_number":72,"context_line":"            return wsgi.Result(None, 404)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    @staticmethod"},{"line_number":75,"context_line":"    def create(req, body, tenant_id, instance_id, key):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_b1ea310d","line":72,"in_reply_to":"3ae8d1ca_7fc5d53a","updated":"2014-05-29 20:15:47.000000000","message":"Done","commit_id":"7e74e38c024637da776fb2bce7b2040082f9dd16"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"d9cd92141c273c857b7df1412fb86105e8e73630","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                                     instance_id\u003dinstance_id)"},{"line_number":129,"context_line":"            LOG.info(_(\u0027Returned result from metadata lookup: %s\u0027) % metadata)"},{"line_number":130,"context_line":"            return wsgi.Result("},{"line_number":131,"context_line":"                views.MetadataKeyValueView(metadata, req).data(), 400)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    @staticmethod"},{"line_number":134,"context_line":"    def edit(req, body, tenant_id, instance_id, key):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_7fa0759f","line":131,"updated":"2014-05-29 19:56:07.000000000","message":"create the same key twice results in an error thats not useful. Make the error message a bit more clear. just raise exception.BadRequest(\"some useful message\")\n\n\n    $ trove metadata-create 8896e675-8ffb-4d33-b273-09ad6a62b0cf foo ba\n    +----------+-------+\n    | Property | Value |\n    +----------+-------+\n    | foo      | ba    |\n    +----------+-------+\n    $ trove metadata-create 8896e675-8ffb-4d33-b273-09ad6a62b0cf foo ba\n    ERROR: Bad Request (HTTP 400)\n\nthat should make this better","commit_id":"7e74e38c024637da776fb2bce7b2040082f9dd16"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"9bb32c885487860e26fd733dd80731b6ae2f5e88","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                                     instance_id\u003dinstance_id)"},{"line_number":129,"context_line":"            LOG.info(_(\u0027Returned result from metadata lookup: %s\u0027) % metadata)"},{"line_number":130,"context_line":"            return wsgi.Result("},{"line_number":131,"context_line":"                views.MetadataKeyValueView(metadata, req).data(), 400)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    @staticmethod"},{"line_number":134,"context_line":"    def edit(req, body, tenant_id, instance_id, key):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_7f94f5e1","line":131,"in_reply_to":"3ae8d1ca_7fa0759f","updated":"2014-05-29 20:15:47.000000000","message":"Done","commit_id":"7e74e38c024637da776fb2bce7b2040082f9dd16"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"d9cd92141c273c857b7df1412fb86105e8e73630","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            return wsgi.Result(None, 200)"},{"line_number":168,"context_line":"        else:"},{"line_number":169,"context_line":"            LOG.info(_(\u0027Key: %s not found in database, edit impossible\u0027))"},{"line_number":170,"context_line":"            return wsgi.Result(None, 404)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    @staticmethod"},{"line_number":173,"context_line":"    def update(req, body, tenant_id, instance_id, key):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_3fa42da5","line":170,"updated":"2014-05-29 19:56:07.000000000","message":"raise an exception here as well. exception.NotFound","commit_id":"7e74e38c024637da776fb2bce7b2040082f9dd16"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"9bb32c885487860e26fd733dd80731b6ae2f5e88","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            return wsgi.Result(None, 200)"},{"line_number":168,"context_line":"        else:"},{"line_number":169,"context_line":"            LOG.info(_(\u0027Key: %s not found in database, edit impossible\u0027))"},{"line_number":170,"context_line":"            return wsgi.Result(None, 404)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    @staticmethod"},{"line_number":173,"context_line":"    def update(req, body, tenant_id, instance_id, key):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_d1edfd26","line":170,"in_reply_to":"3ae8d1ca_3fa42da5","updated":"2014-05-29 20:15:47.000000000","message":"Done","commit_id":"7e74e38c024637da776fb2bce7b2040082f9dd16"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"d9cd92141c273c857b7df1412fb86105e8e73630","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        else:"},{"line_number":214,"context_line":"            LOG.info(_(\u0027Metadata key: %s could not be found in the database\u0027) %"},{"line_number":215,"context_line":"                     key)"},{"line_number":216,"context_line":"            return wsgi.Result(None, 404)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    @staticmethod"},{"line_number":219,"context_line":"    def delete(req, tenant_id, instance_id, key):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_1fb5b1cc","line":216,"updated":"2014-05-29 19:56:07.000000000","message":"same","commit_id":"7e74e38c024637da776fb2bce7b2040082f9dd16"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"9bb32c885487860e26fd733dd80731b6ae2f5e88","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        else:"},{"line_number":214,"context_line":"            LOG.info(_(\u0027Metadata key: %s could not be found in the database\u0027) %"},{"line_number":215,"context_line":"                     key)"},{"line_number":216,"context_line":"            return wsgi.Result(None, 404)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    @staticmethod"},{"line_number":219,"context_line":"    def delete(req, tenant_id, instance_id, key):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_f1f4b9f3","line":216,"in_reply_to":"3ae8d1ca_1fb5b1cc","updated":"2014-05-29 20:15:47.000000000","message":"Done","commit_id":"7e74e38c024637da776fb2bce7b2040082f9dd16"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"d9cd92141c273c857b7df1412fb86105e8e73630","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        else:"},{"line_number":244,"context_line":"            LOG.info(_(\u0027Metadata key: %s not present in the database\u0027) %"},{"line_number":245,"context_line":"                     key)"},{"line_number":246,"context_line":"            return wsgi.Result(None, 404)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_3fcb4d54","line":246,"updated":"2014-05-29 19:56:07.000000000","message":"same","commit_id":"7e74e38c024637da776fb2bce7b2040082f9dd16"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"9bb32c885487860e26fd733dd80731b6ae2f5e88","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        else:"},{"line_number":244,"context_line":"            LOG.info(_(\u0027Metadata key: %s not present in the database\u0027) %"},{"line_number":245,"context_line":"                     key)"},{"line_number":246,"context_line":"            return wsgi.Result(None, 404)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_11f845e4","line":246,"in_reply_to":"3ae8d1ca_3fcb4d54","updated":"2014-05-29 20:15:47.000000000","message":"Done","commit_id":"7e74e38c024637da776fb2bce7b2040082f9dd16"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"342b02d59d0c3610515259f3b3a885ba8fd253eb","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        LOG.info("},{"line_number":43,"context_line":"            _(\u0027Beginning list of instance metadata for %s\u0027) % instance_id)"},{"line_number":44,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":45,"context_line":"        dbmeta \u003d Metadata(context, instance_id)"},{"line_number":46,"context_line":"        LOG.info(_(\u0027Finished list of instance metadata for %s\u0027) % instance_id)"},{"line_number":47,"context_line":"        return wsgi.Result(views.MetadataView(dbmeta, req\u003dreq).data(), 200)"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_3d63c21b","line":45,"updated":"2014-05-30 04:52:47.000000000","message":"I think this should return an exception if the instance_id doesn\u0027t exist.\n\n    $ trove metadata-list foo-bar\n    +----------+-------+\n    | Property | Value |\n    +----------+-------+\n    +----------+-------+\n\nsomething like a badrequest that the instance doesnt exist.","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"43c9b9fcebbc31fc4597a49dffb6e8f7ef9200ed","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        LOG.info("},{"line_number":43,"context_line":"            _(\u0027Beginning list of instance metadata for %s\u0027) % instance_id)"},{"line_number":44,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":45,"context_line":"        dbmeta \u003d Metadata(context, instance_id)"},{"line_number":46,"context_line":"        LOG.info(_(\u0027Finished list of instance metadata for %s\u0027) % instance_id)"},{"line_number":47,"context_line":"        return wsgi.Result(views.MetadataView(dbmeta, req\u003dreq).data(), 200)"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_bae4bde1","line":45,"in_reply_to":"1ae5cdf2_3d63c21b","updated":"2014-06-03 14:20:18.000000000","message":"patch forthcoming","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"342b02d59d0c3610515259f3b3a885ba8fd253eb","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                   \u0027instance %(instance_id)s\u0027) %"},{"line_number":63,"context_line":"                 {\u0027key\u0027: key, \u0027instance_id\u0027: instance_id})"},{"line_number":64,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":65,"context_line":"        dbmeta \u003d Metadata(context, instance_id)"},{"line_number":66,"context_line":"        if dbmeta.get(key):"},{"line_number":67,"context_line":"            LOG.info(_(\u0027Showing metadata key %s\u0027) % key)"},{"line_number":68,"context_line":"            metadata \u003d dbmeta.entity_for_key(key)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_bd76f2d6","line":65,"updated":"2014-05-30 04:52:47.000000000","message":"if the instance doesn\u0027t exist then this should raise an error saying that not that there is no metadata data for the key.","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"43c9b9fcebbc31fc4597a49dffb6e8f7ef9200ed","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                   \u0027instance %(instance_id)s\u0027) %"},{"line_number":63,"context_line":"                 {\u0027key\u0027: key, \u0027instance_id\u0027: instance_id})"},{"line_number":64,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":65,"context_line":"        dbmeta \u003d Metadata(context, instance_id)"},{"line_number":66,"context_line":"        if dbmeta.get(key):"},{"line_number":67,"context_line":"            LOG.info(_(\u0027Showing metadata key %s\u0027) % key)"},{"line_number":68,"context_line":"            metadata \u003d dbmeta.entity_for_key(key)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_dae509dd","line":65,"in_reply_to":"1ae5cdf2_bd76f2d6","updated":"2014-06-03 14:20:18.000000000","message":"patch forthcoming","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"cc8c1aed0fc6822a17ddc7fdff0a63d90c6f42b0","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            return wsgi.Result("},{"line_number":70,"context_line":"                views.MetadataKeyValueView(metadata, req\u003dreq).data(), 200)"},{"line_number":71,"context_line":"        else:"},{"line_number":72,"context_line":"            msg \u003d _(\u0027No metadata found for metadata key %s\u0027) % key"},{"line_number":73,"context_line":"            LOG.info(msg)"},{"line_number":74,"context_line":"            raise exception.NotFound(msg)"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_c184b40d","line":72,"updated":"2014-06-23 15:38:59.000000000","message":"can you add in the instance id in the msg as well?","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"2085733de95b10e92a8fe7423302386bea4298aa","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        :rtype: wsgi.Result"},{"line_number":95,"context_line":"        \"\"\""},{"line_number":96,"context_line":"        LOG.info("},{"line_number":97,"context_line":"            _(\u0027Beginning creating metadata for instance: %s\u0027) % instance_id)"},{"line_number":98,"context_line":"        value \u003d body[\u0027metadata\u0027][\u0027value\u0027]"},{"line_number":99,"context_line":"        LOG.info(_(\u0027req: %(req)s, body: %(body)s, tenant_id: %(tenant_id)s, \u0027"},{"line_number":100,"context_line":"                   \u0027instance_id: %(instance_id)s, key: %(key)s, \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_af286a86","line":97,"updated":"2014-06-23 18:11:46.000000000","message":"this seems like excessive logging for info level. maybe should be debug?","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"e5a965b0ff44e6fe86504c73f94f509e5efd0814","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                     instance_id)"},{"line_number":168,"context_line":"            return wsgi.Result(None, 200)"},{"line_number":169,"context_line":"        else:"},{"line_number":170,"context_line":"            msg \u003d _(\u0027Key: %s not found in database, edit impossible\u0027) % key"},{"line_number":171,"context_line":"            LOG.info(msg)"},{"line_number":172,"context_line":"            raise exception.NotFound(msg)"},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_dd3d7ebd","line":170,"updated":"2014-05-30 03:56:38.000000000","message":"impossible you say?","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"43c9b9fcebbc31fc4597a49dffb6e8f7ef9200ed","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                     instance_id)"},{"line_number":168,"context_line":"            return wsgi.Result(None, 200)"},{"line_number":169,"context_line":"        else:"},{"line_number":170,"context_line":"            msg \u003d _(\u0027Key: %s not found in database, edit impossible\u0027) % key"},{"line_number":171,"context_line":"            LOG.info(msg)"},{"line_number":172,"context_line":"            raise exception.NotFound(msg)"},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_9adf010d","line":170,"in_reply_to":"1ae5cdf2_dd3d7ebd","updated":"2014-06-03 14:20:18.000000000","message":"indeed if the key isn\u0027t found, one cannot edit it\u0027s value.","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"4f502423805ae6dc0032af69925f67977e718bbf","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            raise exception.NotFound(msg)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    @staticmethod"},{"line_number":175,"context_line":"    def update(req, body, tenant_id, instance_id, key):"},{"line_number":176,"context_line":"        \"\"\""},{"line_number":177,"context_line":"        Update metadata for instance {id}.  This will remove any key from"},{"line_number":178,"context_line":"        the database that are present in the database but are not submitted in"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_c7f5a4ee","line":175,"updated":"2014-06-23 16:00:13.000000000","message":"https://tools.ietf.org/html/rfc2616#section-9.6\nor maybe this might be ok if follow PUT protocol and add the key if it doesnt exist:\n\n\"If the\n   Request-URI does not point to an existing resource, and that URI is\n   capable of being defined as a new resource by the requesting user\n   agent, the origin server can create the resource with that URI.\"","commit_id":"b312f2870ff454d6af8f079041bd4ed8642397aa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"b9058a383f3d9ed46f42ceb5d6d4c8b46d273ba2","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    schemas \u003d apischema.metadata.copy()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @staticmethod"},{"line_number":32,"context_line":"    def list(req, tenant_id, instance_id):"},{"line_number":33,"context_line":"        \"\"\""},{"line_number":34,"context_line":"        Show all metadata for instance {instance_id}"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"baada198_2fc1e4e3","line":32,"updated":"2014-07-15 15:26:02.000000000","message":"All static methods should have \u0027cls\u0027 as initial parameter","commit_id":"7e7ac90236596c65335e64116df32f9d9cecc80b"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        :rtype: wsgi.Result"},{"line_number":42,"context_line":"        \"\"\""},{"line_number":43,"context_line":"        LOG.info("},{"line_number":44,"context_line":"            _(\u0027Beginning list of instance metadata for %s\u0027) % instance_id)"},{"line_number":45,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":46,"context_line":"        try:"},{"line_number":47,"context_line":"            instances_models.get_db_info(context, instance_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_6d7ee1e4","line":44,"updated":"2014-07-25 10:20:02.000000000","message":"general comment on logging, please put a punctuation at the end. Like you have on line 49 below.\n\nShould this be debug? I notice that *all* your logging is at INFO level and this seems wrong.","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        try:"},{"line_number":47,"context_line":"            instances_models.get_db_info(context, instance_id)"},{"line_number":48,"context_line":"        except exception.NotFound:"},{"line_number":49,"context_line":"            LOG.info(_(\u0027Instance id %s for metadata does not exist.\u0027) %"},{"line_number":50,"context_line":"                     instance_id)"},{"line_number":51,"context_line":"            raise exception.BadRequest(_(\u0027Instance ID: %s does not exist.\u0027) %"},{"line_number":52,"context_line":"                                       instance_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_ed4831b6","line":49,"updated":"2014-07-25 10:20:02.000000000","message":"this message sounds odd. Isn\u0027t it metadata for instance id not found? also, is this INFO? after all, you are about to raise an exception.","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            raise exception.BadRequest(_(\u0027Instance ID: %s does not exist.\u0027) %"},{"line_number":52,"context_line":"                                       instance_id)"},{"line_number":53,"context_line":"        dbmeta \u003d Metadata(context, instance_id)"},{"line_number":54,"context_line":"        LOG.info(_(\u0027Finished list of instance metadata for %s\u0027) % instance_id)"},{"line_number":55,"context_line":"        return wsgi.Result(views.MetadataView(dbmeta, req\u003dreq).data(), 200)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_add9d9f5","line":54,"updated":"2014-07-25 10:20:02.000000000","message":"debug?","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        try:"},{"line_number":74,"context_line":"            instances_models.get_db_info(context, instance_id)"},{"line_number":75,"context_line":"        except exception.NotFound:"},{"line_number":76,"context_line":"            LOG.info(_(\u0027Instance id %s for metadata does not exist.\u0027) %"},{"line_number":77,"context_line":"                     instance_id)"},{"line_number":78,"context_line":"            raise exception.BadRequest(_(\u0027Instance ID: %s does not exist.\u0027) %"},{"line_number":79,"context_line":"                                       instance_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_4df2fd6f","line":76,"updated":"2014-07-25 10:20:02.000000000","message":"Is this message right?","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        :rtype: wsgi.Result"},{"line_number":111,"context_line":"        \"\"\""},{"line_number":112,"context_line":"        LOG.debug("},{"line_number":113,"context_line":"            _(\u0027Beginning creating metadata for instance: %s\u0027) % instance_id)"},{"line_number":114,"context_line":"        value \u003d body[\u0027metadata\u0027][\u0027value\u0027]"},{"line_number":115,"context_line":"        LOG.info(_(\u0027req: %(req)s, body: %(body)s, tenant_id: %(tenant_id)s, \u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_cd728de2","line":112,"updated":"2014-07-25 10:20:02.000000000","message":"I was wrong in earlier comment where I said *ALL* your logging was INFO. THis is, and should be DEBUG. Please add a punctuation at the end.","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            return wsgi.Result("},{"line_number":149,"context_line":"                views.MetadataKeyValueView(metadata, req).data(), 200)"},{"line_number":150,"context_line":"        else:"},{"line_number":151,"context_line":"            LOG.info("},{"line_number":152,"context_line":"                _(\u0027Key: %s already exists in the database, cannot create\u0027) %"},{"line_number":153,"context_line":"                key)"},{"line_number":154,"context_line":"            metadata \u003d MetadataEntry(context, metadata_key\u003dkey,"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_2d306906","line":151,"updated":"2014-07-25 10:20:02.000000000","message":"not INFO","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        :rtype: wsgi.Result"},{"line_number":230,"context_line":"        \"\"\""},{"line_number":231,"context_line":"        LOG.info("},{"line_number":232,"context_line":"            _(\u0027Beginning updating metadata for instance: %s\u0027) % instance_id)"},{"line_number":233,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_0d2725c8","line":232,"updated":"2014-07-25 10:20:02.000000000","message":"would be good to add key here?","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":241,"context_line":"                                       instance_id)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        value \u003d body[\u0027metadata\u0027][\u0027value\u0027]"},{"line_number":244,"context_line":"        new_key \u003d body[\u0027metadata\u0027][\u0027key\u0027]"},{"line_number":245,"context_line":"        dbmeta \u003d Metadata(context, instance_id)"},{"line_number":246,"context_line":"        old_key \u003d dbmeta.get(key)"},{"line_number":247,"context_line":"        if old_key:"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_5803990c","line":244,"updated":"2014-07-25 10:20:02.000000000","message":"isn\u0027t this just \u0027key\u0027?","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"5cb450a90d91805fa7f6b343bf348e196b95789d","unresolved":false,"context_lines":[{"line_number":241,"context_line":"                                       instance_id)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        value \u003d body[\u0027metadata\u0027][\u0027value\u0027]"},{"line_number":244,"context_line":"        new_key \u003d body[\u0027metadata\u0027][\u0027key\u0027]"},{"line_number":245,"context_line":"        dbmeta \u003d Metadata(context, instance_id)"},{"line_number":246,"context_line":"        old_key \u003d dbmeta.get(key)"},{"line_number":247,"context_line":"        if old_key:"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_9a38373d","line":244,"in_reply_to":"baada198_5803990c","updated":"2014-07-30 05:55:14.000000000","message":"the body is in the example. this should make this clear.","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"52a4dad0fbc8d3610448c84f28167dc22ef36e3a","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        value \u003d body[\u0027metadata\u0027][\u0027value\u0027]"},{"line_number":244,"context_line":"        new_key \u003d body[\u0027metadata\u0027][\u0027key\u0027]"},{"line_number":245,"context_line":"        dbmeta \u003d Metadata(context, instance_id)"},{"line_number":246,"context_line":"        old_key \u003d dbmeta.get(key)"},{"line_number":247,"context_line":"        if old_key:"},{"line_number":248,"context_line":"            LOG.info(_(\u0027Updating %(old_key)s: %(old_value)s \u0027"},{"line_number":249,"context_line":"                       \u0027with %(new_key)s: %(new_value)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_d80ec931","line":246,"updated":"2014-07-25 10:20:02.000000000","message":"I\u0027m a little lost now.","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"5cb450a90d91805fa7f6b343bf348e196b95789d","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        value \u003d body[\u0027metadata\u0027][\u0027value\u0027]"},{"line_number":244,"context_line":"        new_key \u003d body[\u0027metadata\u0027][\u0027key\u0027]"},{"line_number":245,"context_line":"        dbmeta \u003d Metadata(context, instance_id)"},{"line_number":246,"context_line":"        old_key \u003d dbmeta.get(key)"},{"line_number":247,"context_line":"        if old_key:"},{"line_number":248,"context_line":"            LOG.info(_(\u0027Updating %(old_key)s: %(old_value)s \u0027"},{"line_number":249,"context_line":"                       \u0027with %(new_key)s: %(new_value)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":17,"id":"baada198_9a1f57b8","line":246,"in_reply_to":"baada198_d80ec931","updated":"2014-07-30 05:55:14.000000000","message":"this is getting the key from the db object.","commit_id":"068a140d8340e220d11ebc5bbd49e2765c72e609"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"2dcc04b3fe7fed6298f461b12c4bfaf9a1af235c","unresolved":false,"context_lines":[{"line_number":179,"context_line":"                     {\u0027old_value\u0027: dbmeta[key], \u0027new_value\u0027: value,"},{"line_number":180,"context_line":"                      \u0027key\u0027: key})"},{"line_number":181,"context_line":"            dbmeta[key] \u003d value"},{"line_number":182,"context_line":"            return wsgi.Result(None, 200)"},{"line_number":183,"context_line":"        else:"},{"line_number":184,"context_line":"            msg \u003d _(\u0027Key: %s not found in database, edit impossible\u0027) % key"},{"line_number":185,"context_line":"            raise exception.NotFound(msg)"}],"source_content_type":"text/x-python","patch_set":18,"id":"baada198_83b6d23c","line":182,"updated":"2014-07-31 15:41:42.000000000","message":"Same here","commit_id":"20ecbb8e4e0210b4bf36c79410ce7a62c2bc3609"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"2dcc04b3fe7fed6298f461b12c4bfaf9a1af235c","unresolved":false,"context_lines":[{"line_number":230,"context_line":"                      \u0027new_key\u0027: key, \u0027new_value\u0027: value})"},{"line_number":231,"context_line":"            del(dbmeta[key])"},{"line_number":232,"context_line":"            dbmeta[new_key] \u003d value"},{"line_number":233,"context_line":"            return wsgi.Result(None, 200)"},{"line_number":234,"context_line":"        else:"},{"line_number":235,"context_line":"            msg \u003d (_(\u0027Metadata key: %s could not be found in the database.\u0027) %"},{"line_number":236,"context_line":"                   key)"}],"source_content_type":"text/x-python","patch_set":18,"id":"baada198_43acbaee","line":233,"updated":"2014-07-31 15:41:42.000000000","message":"The 204 response code should be used because the response does not carry a message body (which a response with the 200 code would have).\n\nsee http://tools.ietf.org/html/rfc5789","commit_id":"20ecbb8e4e0210b4bf36c79410ce7a62c2bc3609"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"2dcc04b3fe7fed6298f461b12c4bfaf9a1af235c","unresolved":false,"context_lines":[{"line_number":266,"context_line":"                       \u0027%(instance_id)s.\u0027) %"},{"line_number":267,"context_line":"                     {\u0027key\u0027: key, \u0027instance_id\u0027: instance_id})"},{"line_number":268,"context_line":"            del(dbmeta[key])"},{"line_number":269,"context_line":"            return wsgi.Result(None, 200)"},{"line_number":270,"context_line":"        else:"},{"line_number":271,"context_line":"            msg \u003d _(\u0027Metadata key: %s not present in the database.\u0027) % key"},{"line_number":272,"context_line":"            raise exception.NotFound(msg)"}],"source_content_type":"text/x-python","patch_set":18,"id":"baada198_2358a630","line":269,"updated":"2014-07-31 15:41:42.000000000","message":"Shouldn\u0027t we use 204 instead of 200 if return response doesn\u0027t contain any data.","commit_id":"20ecbb8e4e0210b4bf36c79410ce7a62c2bc3609"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"a7289a6e59b4fe777da306d61e723331f85444ba","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        :rtype: wsgi.Result"},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":"        LOG.debug("},{"line_number":43,"context_line":"            _(\u0027Beginning list of instance metadata for %s.\u0027) % instance_id)"},{"line_number":44,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":45,"context_line":"        # see if instance id being used is valid"},{"line_number":46,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_f35375db","line":43,"updated":"2014-08-04 14:07:12.000000000","message":"shouldn\u0027t be wrapped","commit_id":"bb4107d8f0fb05c4bad3e31f85ef0bf2956e55b1"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"a7289a6e59b4fe777da306d61e723331f85444ba","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            raise exception.BadRequest(_(\u0027Instance ID: %s not valid.\u0027) %"},{"line_number":50,"context_line":"                                       instance_id)"},{"line_number":51,"context_line":"        dbmeta \u003d InstanceMetadata(context, instance_id)"},{"line_number":52,"context_line":"        LOG.debug(_(\u0027Finished list of instance metadata for %s.\u0027) %"},{"line_number":53,"context_line":"                  instance_id)"},{"line_number":54,"context_line":"        return wsgi.Result(views.MetadataView(dbmeta, req\u003dreq).data(), 200)"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_135709ca","line":52,"updated":"2014-08-04 14:07:12.000000000","message":"shouldn\u0027t be wrapped","commit_id":"bb4107d8f0fb05c4bad3e31f85ef0bf2956e55b1"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"a7289a6e59b4fe777da306d61e723331f85444ba","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        :rtype: wsgi.Result"},{"line_number":67,"context_line":"        \"\"\""},{"line_number":68,"context_line":"        LOG.debug(_(\u0027Beginning show metadata key %(key)s for \u0027"},{"line_number":69,"context_line":"                  \u0027instance %(instance_id)s.\u0027) %"},{"line_number":70,"context_line":"                  {\u0027key\u0027: key, \u0027instance_id\u0027: instance_id})"},{"line_number":71,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_33716d77","line":68,"updated":"2014-08-04 14:07:12.000000000","message":"shouldn\u0027t be wrapped","commit_id":"bb4107d8f0fb05c4bad3e31f85ef0bf2956e55b1"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"a7289a6e59b4fe777da306d61e723331f85444ba","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        :rtype: wsgi.Result"},{"line_number":108,"context_line":"        \"\"\""},{"line_number":109,"context_line":"        LOG.debug(_(\u0027Beginning create metadata key %(key)s \u0027"},{"line_number":110,"context_line":"                  \u0027for instance: %(instance_id)s.\u0027) %"},{"line_number":111,"context_line":"                  {\u0027key\u0027: key, \u0027instance_id\u0027: instance_id})"},{"line_number":112,"context_line":"        value \u003d body[\u0027metadata\u0027][\u0027value\u0027]"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_536c219d","line":109,"updated":"2014-08-04 14:07:12.000000000","message":"shouldn\u0027t be wrapped","commit_id":"bb4107d8f0fb05c4bad3e31f85ef0bf2956e55b1"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"a7289a6e59b4fe777da306d61e723331f85444ba","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                     {\u0027key\u0027: key, \u0027value\u0027: value})"},{"line_number":129,"context_line":"            dbmeta[key] \u003d value"},{"line_number":130,"context_line":"            metadata \u003d dbmeta.entity_for_key(key)"},{"line_number":131,"context_line":"            LOG.debug(_(\u0027Returned result from metadata lookup: %s.\u0027) %"},{"line_number":132,"context_line":"                      metadata)"},{"line_number":133,"context_line":"            return wsgi.Result("},{"line_number":134,"context_line":"                views.MetadataKeyValueView(metadata, req).data(), 200)"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_736765b8","line":131,"updated":"2014-08-04 14:07:12.000000000","message":"shouldn\u0027t be wrapped","commit_id":"bb4107d8f0fb05c4bad3e31f85ef0bf2956e55b1"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"b965b545ac99a4f147bf07590b06b957ccbba078","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        :rtype: wsgi.Result"},{"line_number":161,"context_line":"        \"\"\""},{"line_number":162,"context_line":"        LOG.debug(_(\u0027Beginning edit metadata key %(key)s \u0027"},{"line_number":163,"context_line":"                  \u0027for instance: %(instance_id)s.\u0027) %"},{"line_number":164,"context_line":"                  {\u0027key\u0027: key, \u0027instance_id\u0027: instance_id})"},{"line_number":165,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_1890e5f2","line":162,"updated":"2014-08-05 09:16:29.000000000","message":"don\u0027t wrap","commit_id":"bb4107d8f0fb05c4bad3e31f85ef0bf2956e55b1"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"a7289a6e59b4fe777da306d61e723331f85444ba","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        :rtype: wsgi.Result"},{"line_number":211,"context_line":"        \"\"\""},{"line_number":212,"context_line":"        LOG.debug(_(\u0027Beginning update metadata key %(key)s \u0027"},{"line_number":213,"context_line":"                  \u0027for instance: %(instance_id)s.\u0027) %"},{"line_number":214,"context_line":"                  {\u0027key\u0027: key, \u0027instance_id\u0027: instance_id})"},{"line_number":215,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_b3049dc6","line":212,"updated":"2014-08-04 14:07:12.000000000","message":"shouldn\u0027t be wrapped","commit_id":"bb4107d8f0fb05c4bad3e31f85ef0bf2956e55b1"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"a7289a6e59b4fe777da306d61e723331f85444ba","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":"        :rtype: wsgi.Result"},{"line_number":254,"context_line":"        \"\"\""},{"line_number":255,"context_line":"        LOG.debug(_(\u0027Beginning deletion of metadata key %(key)s for \u0027"},{"line_number":256,"context_line":"                  \u0027instance: %(instance_id)s.\u0027) %"},{"line_number":257,"context_line":"                  {\u0027key\u0027: key, \u0027instance_id\u0027: instance_id})"},{"line_number":258,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_d30751c7","line":255,"updated":"2014-08-04 14:07:12.000000000","message":"shouldn\u0027t be wrapped","commit_id":"bb4107d8f0fb05c4bad3e31f85ef0bf2956e55b1"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"57dc878f2324ea88469663d1790ec6f1f7ae33eb","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":"        LOG.debug(\u0027Beginning list of instance metadata for %s.\u0027 % instance_id)"},{"line_number":43,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":44,"context_line":"        # see if instance id being used is valid"},{"line_number":45,"context_line":"        try:"},{"line_number":46,"context_line":"            instances_models.get_db_info(context, instance_id)"},{"line_number":47,"context_line":"        except exception.NotFound:"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_b30a0277","line":44,"updated":"2014-08-21 21:05:51.000000000","message":"This comment could be extended to include the fact that the tenant_id in the context verifies that the caller owns the referenced instance. Same for other such comments in this file.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        return wsgi.Result(views.MetadataView(dbmeta, req\u003dreq).data(), 200)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @staticmethod"},{"line_number":55,"context_line":"    def show(req, tenant_id, instance_id, key):"},{"line_number":56,"context_line":"        \"\"\""},{"line_number":57,"context_line":"        Show metadata for instance {instance_id}"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_e3cfe0b0","line":55,"updated":"2014-08-13 10:31:01.000000000","message":"key is, I assume a single key; no collections allowed? A collection would be nice, no?","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"57dc878f2324ea88469663d1790ec6f1f7ae33eb","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        return wsgi.Result(views.MetadataView(dbmeta, req\u003dreq).data(), 200)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @staticmethod"},{"line_number":55,"context_line":"    def show(req, tenant_id, instance_id, key):"},{"line_number":56,"context_line":"        \"\"\""},{"line_number":57,"context_line":"        Show metadata for instance {instance_id}"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_1e983f69","line":55,"in_reply_to":"baada198_e3cfe0b0","updated":"2014-08-21 21:05:51.000000000","message":"Looking at the blueprint, it seems that /key was the only call in scope. However, now that you mention it, it seems that a group of keys should have been able to be batch-updated/deleted/added from the beginning.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                                       instance_id)"},{"line_number":76,"context_line":"        dbmeta \u003d InstanceMetadata(context, instance_id)"},{"line_number":77,"context_line":"        if dbmeta.get(key):"},{"line_number":78,"context_line":"            LOG.info(\u0027Showing metadata key %s.\u0027 % key)"},{"line_number":79,"context_line":"            metadata \u003d dbmeta.entity_for_key(key)"},{"line_number":80,"context_line":"            return wsgi.Result("},{"line_number":81,"context_line":"                views.MetadataKeyValueView(metadata, req\u003dreq).data(), 200)"}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_28445772","line":78,"updated":"2014-08-13 10:31:01.000000000","message":"wrap with _()","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                                       instance_id)"},{"line_number":76,"context_line":"        dbmeta \u003d InstanceMetadata(context, instance_id)"},{"line_number":77,"context_line":"        if dbmeta.get(key):"},{"line_number":78,"context_line":"            LOG.info(\u0027Showing metadata key %s.\u0027 % key)"},{"line_number":79,"context_line":"            metadata \u003d dbmeta.entity_for_key(key)"},{"line_number":80,"context_line":"            return wsgi.Result("},{"line_number":81,"context_line":"                views.MetadataKeyValueView(metadata, req\u003dreq).data(), 200)"}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_fe3271a5","line":78,"in_reply_to":"baada198_28445772","updated":"2014-10-07 13:51:35.000000000","message":"Done","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            raise exception.NotFound(msg)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    @staticmethod"},{"line_number":88,"context_line":"    def create(req, body, tenant_id, instance_id, key):"},{"line_number":89,"context_line":"        \"\"\""},{"line_number":90,"context_line":"        Create new metadata for instance {instance_id}"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_c3e3bc38","line":88,"updated":"2014-08-13 10:31:01.000000000","message":"interesting that the body has the value but the key is a parameter.\n\nthis question (from ignorance) says, why? why not have the key and value in the body? that way you could add a number of metadata elements all at once?","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                views.MetadataKeyValueView(metadata, req).data(), 200)"},{"line_number":133,"context_line":"        else:"},{"line_number":134,"context_line":"            metadata \u003d dbmeta.entity_for_key(key)"},{"line_number":135,"context_line":"            LOG.error(\u0027Returned result from metadata lookup: %s.\u0027 %"},{"line_number":136,"context_line":"                      metadata)"},{"line_number":137,"context_line":"            raise exception.BadRequest(_(\u0027Key: %s already exists.\u0027) % key)"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_a87867c2","line":135,"updated":"2014-08-13 10:31:01.000000000","message":"must be wrapped with _()","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                views.MetadataKeyValueView(metadata, req).data(), 200)"},{"line_number":133,"context_line":"        else:"},{"line_number":134,"context_line":"            metadata \u003d dbmeta.entity_for_key(key)"},{"line_number":135,"context_line":"            LOG.error(\u0027Returned result from metadata lookup: %s.\u0027 %"},{"line_number":136,"context_line":"                      metadata)"},{"line_number":137,"context_line":"            raise exception.BadRequest(_(\u0027Key: %s already exists.\u0027) % key)"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_3ee079f9","line":135,"in_reply_to":"baada198_a87867c2","updated":"2014-10-07 13:51:35.000000000","message":"Done","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        value \u003d body[\u0027metadata\u0027][\u0027value\u0027]"},{"line_number":173,"context_line":"        dbmeta \u003d InstanceMetadata(context, instance_id)"},{"line_number":174,"context_line":"        if key in dbmeta:"},{"line_number":175,"context_line":"            LOG.info(\u0027Editing value: %(old_value)s with \u0027"},{"line_number":176,"context_line":"                     \u0027value: %(new_value)s for key: %(key)s.\u0027 %"},{"line_number":177,"context_line":"                     {\u0027old_value\u0027: dbmeta[key], \u0027new_value\u0027: value,"},{"line_number":178,"context_line":"                      \u0027key\u0027: key})"}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_a84f878b","line":175,"updated":"2014-08-13 10:31:01.000000000","message":"wrap _()","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    @staticmethod"},{"line_number":188,"context_line":"    def update(req, body, tenant_id, instance_id, key):"},{"line_number":189,"context_line":"        \"\"\""},{"line_number":190,"context_line":"        Update metadata for instance {id}.  This will remove any key from"},{"line_number":191,"context_line":"        the database that are present in the database but are not submitted in"},{"line_number":192,"context_line":"        the body of the request.  This will also update the values of keys that"},{"line_number":193,"context_line":"        were present."}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_c37c9c77","line":190,"updated":"2014-08-13 10:31:01.000000000","message":"so, this doc string confuses me. first you don\u0027t define what key is; is it a single key or a collection of some kind.\n\nSecond, can the body only provide a single metadata key value pair or can I provide multiple?\n\nThe doc string says \"This will remove ANY key ... that are present but not submitted in the body request\". The ANY leads me to believe that there\u0027s a list. Yet the code shows no evidence of such.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"57dc878f2324ea88469663d1790ec6f1f7ae33eb","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    @staticmethod"},{"line_number":188,"context_line":"    def update(req, body, tenant_id, instance_id, key):"},{"line_number":189,"context_line":"        \"\"\""},{"line_number":190,"context_line":"        Update metadata for instance {id}.  This will remove any key from"},{"line_number":191,"context_line":"        the database that are present in the database but are not submitted in"},{"line_number":192,"context_line":"        the body of the request.  This will also update the values of keys that"},{"line_number":193,"context_line":"        were present."}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_d6f92781","line":190,"in_reply_to":"baada198_c37c9c77","updated":"2014-08-21 21:05:51.000000000","message":"Agreed that the comment is somewhat confusing. This is really a \"set or rename-and-set\" operation. Just the use of the plural \"keys\" for me lead to confusion.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    @staticmethod"},{"line_number":188,"context_line":"    def update(req, body, tenant_id, instance_id, key):"},{"line_number":189,"context_line":"        \"\"\""},{"line_number":190,"context_line":"        Update metadata for instance {id}.  This will remove any key from"},{"line_number":191,"context_line":"        the database that are present in the database but are not submitted in"},{"line_number":192,"context_line":"        the body of the request.  This will also update the values of keys that"},{"line_number":193,"context_line":"        were present."}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_be4389ad","line":190,"in_reply_to":"baada198_c37c9c77","updated":"2014-10-07 13:51:35.000000000","message":"Done","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        :rtype: wsgi.Result"},{"line_number":209,"context_line":"        \"\"\""},{"line_number":210,"context_line":"        LOG.debug(\u0027Beginning update metadata key %(key)s \u0027"},{"line_number":211,"context_line":"                  \u0027for instance: %(instance_id)s.\u0027 %"},{"line_number":212,"context_line":"                  {\u0027key\u0027: key, \u0027instance_id\u0027: instance_id})"},{"line_number":213,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_88000305","line":210,"updated":"2014-08-13 10:31:01.000000000","message":"would it help to emit body as well?","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        :rtype: wsgi.Result"},{"line_number":209,"context_line":"        \"\"\""},{"line_number":210,"context_line":"        LOG.debug(\u0027Beginning update metadata key %(key)s \u0027"},{"line_number":211,"context_line":"                  \u0027for instance: %(instance_id)s.\u0027 %"},{"line_number":212,"context_line":"                  {\u0027key\u0027: key, \u0027instance_id\u0027: instance_id})"},{"line_number":213,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_fe7fd1dd","line":210,"in_reply_to":"baada198_88000305","updated":"2014-10-07 13:51:35.000000000","message":"Done","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        dbmeta \u003d InstanceMetadata(context, instance_id)"},{"line_number":225,"context_line":"        old_key \u003d dbmeta.get(key)"},{"line_number":226,"context_line":"        if old_key:"},{"line_number":227,"context_line":"            LOG.info(\u0027Updating %(old_key)s: %(old_value)s \u0027"},{"line_number":228,"context_line":"                     \u0027with %(new_key)s: %(new_value)s.\u0027 %"},{"line_number":229,"context_line":"                     {\u0027old_key\u0027: old_key, \u0027old_value\u0027: dbmeta[old_key],"},{"line_number":230,"context_line":"                      \u0027new_key\u0027: key, \u0027new_value\u0027: value})"}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_83fd44b5","line":227,"updated":"2014-08-13 10:31:01.000000000","message":"wrap _()","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            raise exception.NotFound(msg)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    @staticmethod"},{"line_number":242,"context_line":"    def delete(req, tenant_id, instance_id, key):"},{"line_number":243,"context_line":"        \"\"\""},{"line_number":244,"context_line":"        Delete all metadata for instance {id}"},{"line_number":245,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_23263868","line":242,"updated":"2014-08-13 10:31:01.000000000","message":"a key, a collection?","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"57dc878f2324ea88469663d1790ec6f1f7ae33eb","unresolved":false,"context_lines":[{"line_number":241,"context_line":"    @staticmethod"},{"line_number":242,"context_line":"    def delete(req, tenant_id, instance_id, key):"},{"line_number":243,"context_line":"        \"\"\""},{"line_number":244,"context_line":"        Delete all metadata for instance {id}"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        :param req: wsgi.Request object"},{"line_number":247,"context_line":"        :param tenant_id: Id of the tenant"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_b6474b76","line":244,"updated":"2014-08-21 21:05:51.000000000","message":"If amrith\u0027s comment is in relation to line 244 then I agree that \"all metadata\" seems confusing given a single key. I read \"all metadata\" as \"all keys.\"","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        dbmeta \u003d InstanceMetadata(context, instance_id)"},{"line_number":266,"context_line":"        if dbmeta.get(key):"},{"line_number":267,"context_line":"            LOG.info(\u0027Deleting metadata key: %(key)s for instance \u0027"},{"line_number":268,"context_line":"                     \u0027%(instance_id)s.\u0027 %"},{"line_number":269,"context_line":"                     {\u0027key\u0027: key, \u0027instance_id\u0027: instance_id})"},{"line_number":270,"context_line":"            del(dbmeta[key])"}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_a3b5e81a","line":267,"updated":"2014-08-13 10:31:01.000000000","message":"wrap _()","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"}],"trove/metadata/views.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"bb50aa481b6e4e9d17a8405af49175e19d971443","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        LOG.info(_(\u0027Creating MetadataKeyValueView object\u0027))"},{"line_number":33,"context_line":"        self.metadata \u003d metadata"},{"line_number":34,"context_line":"        self.req \u003d req"},{"line_number":35,"context_line":"        LOG.info(_(\u0027Created MetadataKeyValueView object\u0027))"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def data(self):"},{"line_number":38,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9S6E%3D","line":35,"updated":"2014-04-07 10:13:09.000000000","message":"Are this logging calls are required? Since they are wrapping too simple logic, that would not fail, i think they are not needed.","commit_id":"f1000a06b18dadbec45b3aa293eae2edd7fb85fe"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"bb50aa481b6e4e9d17a8405af49175e19d971443","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        LOG.info(_(\u0027Creating MetadataView object\u0027))"},{"line_number":65,"context_line":"        self.metadata \u003d metadata"},{"line_number":66,"context_line":"        self.req \u003d req"},{"line_number":67,"context_line":"        LOG.info(_(\u0027Created MetadataView object\u0027))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def data(self):"},{"line_number":70,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9S5o%3D","line":67,"updated":"2014-04-07 10:13:09.000000000","message":"same","commit_id":"f1000a06b18dadbec45b3aa293eae2edd7fb85fe"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"bb50aa481b6e4e9d17a8405af49175e19d971443","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        :rtype: dict"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":"        LOG.info(_(\u0027Metadata for instance: %s\u0027) % self.metadata)"},{"line_number":80,"context_line":"        data \u003d {\u0027metadata\u0027: self.metadata.copy()}"},{"line_number":81,"context_line":"        LOG.info(_(\u0027MetadataView returning data: %s\u0027) % data)"},{"line_number":82,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9S5k%3D","line":79,"updated":"2014-04-07 10:13:09.000000000","message":"same","commit_id":"f1000a06b18dadbec45b3aa293eae2edd7fb85fe"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"b965b545ac99a4f147bf07590b06b957ccbba078","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        LOG.info(_(\u0027MetadataKeyValue %(key)s: %(value)s\u0027) %"},{"line_number":46,"context_line":"                 {\u0027key\u0027: self.metadata.key, \u0027value\u0027: self.metadata.value})"},{"line_number":47,"context_line":"        data \u003d {\u0027metadata\u0027: {self.metadata.key: self.metadata.value}}"},{"line_number":48,"context_line":"        LOG.info(_(\u0027MetadataKeyValueView returning data: %s\u0027) % data)"},{"line_number":49,"context_line":"        return data"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_b8a7f950","line":48,"updated":"2014-08-05 09:16:29.000000000","message":"are these both INFO?","commit_id":"bb4107d8f0fb05c4bad3e31f85ef0bf2956e55b1"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"b965b545ac99a4f147bf07590b06b957ccbba078","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        \"\"\""},{"line_number":75,"context_line":"        LOG.info(_(\u0027Metadata for instance: %s\u0027) % self.metadata)"},{"line_number":76,"context_line":"        data \u003d {\u0027metadata\u0027: self.metadata.copy()}"},{"line_number":77,"context_line":"        LOG.info(_(\u0027MetadataView returning data: %s\u0027) % data)"},{"line_number":78,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_18b7058a","line":77,"updated":"2014-08-05 09:16:29.000000000","message":"should this be debug?","commit_id":"bb4107d8f0fb05c4bad3e31f85ef0bf2956e55b1"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        :rtype: dict"},{"line_number":43,"context_line":"        \"\"\""},{"line_number":44,"context_line":"        data \u003d {\u0027metadata\u0027: {self.metadata.key: self.metadata.value}}"},{"line_number":45,"context_line":"        return data"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_c39bbc77","line":44,"updated":"2014-08-13 10:31:01.000000000","message":"this may be a dumb question but ... shouldn\u0027t this be:\n\n{\u0027metadata\u0027: {\n\u0027key\u0027: self.metadata.key, \n\u0027value\u0027: self.metadata.value}}","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"57dc878f2324ea88469663d1790ec6f1f7ae33eb","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        :rtype: dict"},{"line_number":43,"context_line":"        \"\"\""},{"line_number":44,"context_line":"        data \u003d {\u0027metadata\u0027: {self.metadata.key: self.metadata.value}}"},{"line_number":45,"context_line":"        return data"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_5128c185","line":44,"in_reply_to":"baada198_be497a8f","updated":"2014-08-21 21:05:51.000000000","message":"According to blueprint https://wiki.openstack.org/wiki/Trove-Instance-Metadata#Show the code looks correct.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"c83c936d677cba471ed7c7ae2330113365ed1b0b","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        :rtype: dict"},{"line_number":43,"context_line":"        \"\"\""},{"line_number":44,"context_line":"        data \u003d {\u0027metadata\u0027: {self.metadata.key: self.metadata.value}}"},{"line_number":45,"context_line":"        return data"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_be497a8f","line":44,"in_reply_to":"baada198_c39bbc77","updated":"2014-08-13 12:20:51.000000000","message":"+1","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"49adf69c1ccc86da69c0fd33d96ac5846a190ea4","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        :rtype: dict"},{"line_number":70,"context_line":"        \"\"\""},{"line_number":71,"context_line":"        data \u003d {\u0027metadata\u0027: self.metadata.copy()}"},{"line_number":72,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_c389fc1f","line":71,"updated":"2014-08-13 10:31:01.000000000","message":"makes me think my previous question is in fact a dumb question.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"}],"trove/tests/api/metadata.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"4047529c29cfaf53f1fcd0d423ef1a8b0bea773c","unresolved":false,"context_lines":[{"line_number":41,"context_line":"FAKE \u003d test_config.values[\u0027fake_mode\u0027]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"@test(groups\u003d[GROUP])"},{"line_number":45,"context_line":"class TestMetadata(object):"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @before_class"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2Bkms%3D","line":44,"updated":"2014-03-25 20:15:34.000000000","message":"IMHO, this test suid should be depend on instance provisioning test.\nhttps://github.com/openstack/trove/blob/master/trove/tests/api/instances.py#L736","commit_id":"bf0b782247da1dc2ac396fb9bc2b77a35a35c899"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"8d2dd6fb4b46b8fb4a3109147d902400c5990bd2","unresolved":false,"context_lines":[{"line_number":41,"context_line":"FAKE \u003d test_config.values[\u0027fake_mode\u0027]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"@test(groups\u003d[GROUP])"},{"line_number":45,"context_line":"class TestMetadata(object):"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @before_class"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F93uo%3D","line":44,"in_reply_to":"AAAAWH%2F%2Bkms%3D","updated":"2014-04-01 14:32:06.000000000","message":"Why would it depend on those tests when they don\u0027t use any resources from those tests?  I feel like that is an artificial dependency.","commit_id":"bf0b782247da1dc2ac396fb9bc2b77a35a35c899"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"c81f023f2557ddb6c9d2f87f71b0f9360e7549e3","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        if FAKE:"},{"line_number":63,"context_line":"            # Gross but necessary for fake mode to work"},{"line_number":64,"context_line":"            time.sleep(10)"},{"line_number":65,"context_line":"        else:"},{"line_number":66,"context_line":"            poll_until(lambda: self.dbaas.instances.get(response.id),"},{"line_number":67,"context_line":"                       lambda instance: instance.status \u003d\u003d \u0027RUNNING\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9kaY%3D","line":64,"updated":"2014-04-03 18:08:37.000000000","message":"I don\u0027t get why this is necessary. The instance should exist in both real and fake modes the moment the create call finishes. Then the poll_until call will ask for the instance, see it isn\u0027t running, and sleep for 10 seconds, just like line 64.","commit_id":"a746a641574fa7c3dc68fc59ec9be977afde82f9"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"7cd79bc54ca4ae73fab4799bd5702a290c3ed37c","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        if FAKE:"},{"line_number":63,"context_line":"            # Gross but necessary for fake mode to work"},{"line_number":64,"context_line":"            time.sleep(10)"},{"line_number":65,"context_line":"        else:"},{"line_number":66,"context_line":"            poll_until(lambda: self.dbaas.instances.get(response.id),"},{"line_number":67,"context_line":"                       lambda instance: instance.status \u003d\u003d \u0027RUNNING\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9jS4%3D","line":64,"in_reply_to":"AAAAWH%2F9kaY%3D","updated":"2014-04-03 18:45:32.000000000","message":"Yeah I forgot to put the poll_until back in after I got done testing.  This was put in to debug the tests so that the tracebacks bubbled up correctly in fake mode.  I\u0027ll put that back the way it was before you helped me figure this part out.","commit_id":"a746a641574fa7c3dc68fc59ec9be977afde82f9"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"c81f023f2557ddb6c9d2f87f71b0f9360e7549e3","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                      self.instance.id, self.meta_key,"},{"line_number":90,"context_line":"                      \u0027this is an ambiguous value\u0027)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @test(groups\u003d[GROUP, GROUP_LIST], runs_after_groups\u003d[GROUP_CREATE])"},{"line_number":93,"context_line":"    def test_metadata_list(self):"},{"line_number":94,"context_line":"        resp \u003d self.dbaas.metadata.list(self.instance.id)"},{"line_number":95,"context_line":"        assert_equal(resp[self.meta_key], self.meta_value,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9kYc%3D","line":92,"updated":"2014-04-03 18:08:37.000000000","message":"Since this test will fail if the create call doesn\u0027t work on line 79, you should change \"runs_after_groups\" to \"depends_on_groups\" so it will be skipped. Probably all of these should use depends_on rather than runs_after.\n\n\"runs_after_groups\" is useful if you have a test which is going to delete or change some condition or resource used by other tests but doesn\u0027t need to be skipped if one of those other tests fails. Here though it would probably be better to skip them.","commit_id":"a746a641574fa7c3dc68fc59ec9be977afde82f9"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"7cd79bc54ca4ae73fab4799bd5702a290c3ed37c","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                      self.instance.id, self.meta_key,"},{"line_number":90,"context_line":"                      \u0027this is an ambiguous value\u0027)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @test(groups\u003d[GROUP, GROUP_LIST], runs_after_groups\u003d[GROUP_CREATE])"},{"line_number":93,"context_line":"    def test_metadata_list(self):"},{"line_number":94,"context_line":"        resp \u003d self.dbaas.metadata.list(self.instance.id)"},{"line_number":95,"context_line":"        assert_equal(resp[self.meta_key], self.meta_value,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9jSs%3D","line":92,"in_reply_to":"AAAAWH%2F9kYc%3D","updated":"2014-04-03 18:45:32.000000000","message":"good to know, I\u0027ll fix that up.","commit_id":"a746a641574fa7c3dc68fc59ec9be977afde82f9"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"b9058a383f3d9ed46f42ceb5d6d4c8b46d273ba2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Copyright 2014 Rackspace Hosting"},{"line_number":2,"context_line":"#    All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":14,"id":"baada198_6a6f4ac4","line":1,"updated":"2014-07-15 15:26:02.000000000","message":"Tests dependencies and ordering can be simplified.","commit_id":"7e7ac90236596c65335e64116df32f9d9cecc80b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"b9058a383f3d9ed46f42ceb5d6d4c8b46d273ba2","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"GROUP \u003d \u0027dbaas.api.instances.metadata\u0027"},{"line_number":18,"context_line":"GROUP_CREATE \u003d \u0027dbaas.api.instances.metadata.create\u0027"},{"line_number":19,"context_line":"GROUP_UPDATE \u003d \u0027dbaas.api.instances.metadata.update\u0027"},{"line_number":20,"context_line":"GROUP_REPLACE \u003d \u0027dbaas.api.instances.metadata.replace\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"baada198_4f429868","line":17,"updated":"2014-07-15 15:26:02.000000000","message":"Actually, i don\u0027t see any value-add with populating test groups, so, i\u0027d suggest to have only one.","commit_id":"7e7ac90236596c65335e64116df32f9d9cecc80b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"b9058a383f3d9ed46f42ceb5d6d4c8b46d273ba2","unresolved":false,"context_lines":[{"line_number":33,"context_line":"from trove.tests.config import CONFIG"},{"line_number":34,"context_line":"from trove.tests.util import create_dbaas_client"},{"line_number":35,"context_line":"from trove.tests.util.users import Requirements"},{"line_number":36,"context_line":"from trove.tests.util import test_config"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"from troveclient.compat import exceptions as client_exception"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"baada198_8a149e44","line":36,"updated":"2014-07-15 15:26:02.000000000","message":"this import unneeded","commit_id":"7e7ac90236596c65335e64116df32f9d9cecc80b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"b9058a383f3d9ed46f42ceb5d6d4c8b46d273ba2","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"from troveclient.compat import exceptions as client_exception"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"FAKE \u003d test_config.values[\u0027fake_mode\u0027]"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"@test(groups\u003d[GROUP])"}],"source_content_type":"text/x-python","patch_set":14,"id":"baada198_af08942d","line":40,"updated":"2014-07-15 15:26:02.000000000","message":"no need to do this, just use CONFIG.fake_mode","commit_id":"7e7ac90236596c65335e64116df32f9d9cecc80b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Copyright 2014 Rackspace Hosting"},{"line_number":2,"context_line":"#    All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_c145d043","line":1,"updated":"2014-10-07 13:51:35.000000000","message":"Added minor fixes to tests","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"57dc878f2324ea88469663d1790ec6f1f7ae33eb","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"GROUP \u003d \u0027dbaas.api.instances.metadata\u0027"},{"line_number":18,"context_line":"GROUP_CREATE \u003d \u0027dbaas.api.instances.metadata.create\u0027"},{"line_number":19,"context_line":"GROUP_UPDATE \u003d \u0027dbaas.api.instances.metadata.update\u0027"},{"line_number":20,"context_line":"GROUP_REPLACE \u003d \u0027dbaas.api.instances.metadata.replace\u0027"},{"line_number":21,"context_line":"GROUP_DELETE \u003d \u0027dbaas.api.instances.metadata.delete\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_91f17903","line":18,"updated":"2014-08-21 21:05:51.000000000","message":"For these fine-grained groups, do we really need them? Perhaps I don\u0027t understand their purpose.","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"GROUP \u003d \u0027dbaas.api.instances.metadata\u0027"},{"line_number":18,"context_line":"GROUP_CREATE \u003d \u0027dbaas.api.instances.metadata.create\u0027"},{"line_number":19,"context_line":"GROUP_UPDATE \u003d \u0027dbaas.api.instances.metadata.update\u0027"},{"line_number":20,"context_line":"GROUP_REPLACE \u003d \u0027dbaas.api.instances.metadata.replace\u0027"},{"line_number":21,"context_line":"GROUP_DELETE \u003d \u0027dbaas.api.instances.metadata.delete\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_fe37d1fc","line":18,"in_reply_to":"1abeadc6_91f17903","updated":"2014-10-07 13:51:35.000000000","message":"If you would take a look at test cases you\u0027ll see that they are dependen, dependency was oranized thorugh test groups","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"c83c936d677cba471ed7c7ae2330113365ed1b0b","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"from troveclient.compat import exceptions as client_exception"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"FAKE \u003d test_config.values[\u0027fake_mode\u0027]"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"@test(groups\u003d[GROUP])"}],"source_content_type":"text/x-python","patch_set":23,"id":"baada198_be17ba52","line":40,"updated":"2014-08-13 12:20:51.000000000","message":"no need to define new global variable, just use CONFIG.fake_mode","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"57dc878f2324ea88469663d1790ec6f1f7ae33eb","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                      self.instance.id, self.meta_key,"},{"line_number":85,"context_line":"                      \u0027this is an ambiguous value\u0027)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def test_metadata_create_invalid_instance_id(self):"},{"line_number":88,"context_line":"        bad_instance_id \u003d \"999\""},{"line_number":89,"context_line":"        assert_raises(client_exception.BadRequest, self.dbaas.metadata.create,"},{"line_number":90,"context_line":"                      bad_instance_id, self.meta_key,"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_d1fa11bc","line":87,"updated":"2014-08-21 21:05:51.000000000","message":"Does this need an @test decorator?","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"bcec7e1c82e791e3d6ffc1ce21f73b33928168ab","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                      self.instance.id, self.meta_key,"},{"line_number":85,"context_line":"                      \u0027this is an ambiguous value\u0027)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def test_metadata_create_invalid_instance_id(self):"},{"line_number":88,"context_line":"        bad_instance_id \u003d \"999\""},{"line_number":89,"context_line":"        assert_raises(client_exception.BadRequest, self.dbaas.metadata.create,"},{"line_number":90,"context_line":"                      bad_instance_id, self.meta_key,"}],"source_content_type":"text/x-python","patch_set":23,"id":"da9df570_23d5f9b8","line":87,"in_reply_to":"1abeadc6_d1fa11bc","updated":"2014-09-25 15:37:46.000000000","message":"+1","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"}],"trove/tests/unittests/instance/test_instance_views.py":[{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"57dc878f2324ea88469663d1790ec6f1f7ae33eb","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        # Since the instance_metadata model looks and acts just like a"},{"line_number":65,"context_line":"        # dict there\u0027s no need to test that model here as it\u0027s already"},{"line_number":66,"context_line":"        # being tested in it\u0027s own unittests.  This should simply allow"},{"line_number":67,"context_line":"        # the instance view tests to verify that metadata is being"},{"line_number":68,"context_line":"        # presented back to the user when it is present in the database."},{"line_number":69,"context_line":"        self.instance.metadata \u003d {"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_d14051a7","line":66,"updated":"2014-08-21 21:05:51.000000000","message":"it\u0027s \u003d\u003e its :)","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e3363f633773b602e4602892e313294c84894b3f","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        # Since the instance_metadata model looks and acts just like a"},{"line_number":65,"context_line":"        # dict there\u0027s no need to test that model here as it\u0027s already"},{"line_number":66,"context_line":"        # being tested in it\u0027s own unittests.  This should simply allow"},{"line_number":67,"context_line":"        # the instance view tests to verify that metadata is being"},{"line_number":68,"context_line":"        # presented back to the user when it is present in the database."},{"line_number":69,"context_line":"        self.instance.metadata \u003d {"}],"source_content_type":"text/x-python","patch_set":23,"id":"baa201ad_41a800db","line":66,"in_reply_to":"1abeadc6_d14051a7","updated":"2014-10-07 13:51:35.000000000","message":"Done","commit_id":"3dad451b4612eabd74b55acae7ea363e103157a2"}],"trove/tests/unittests/metadata/__init__.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"0dc8965ea2efdf7fe247a3acaf2b47e011556d2e","unresolved":false,"context_lines":[{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":5,"context_line":"#    a copy of the License at"},{"line_number":6,"context_line":"#"},{"line_number":7,"context_line":"#         http://www.apache.org/licenses/LICENSE-2.0"},{"line_number":8,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BwwQ%3D","line":5,"updated":"2014-03-24 15:01:30.000000000","message":"file should be empty","commit_id":"bae7cb2bed431544df99e3848781d52707339f3a"}],"trove/tests/unittests/metadata/base.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"0dc8965ea2efdf7fe247a3acaf2b47e011556d2e","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def tearDown(self):"},{"line_number":107,"context_line":"        super(TestMetadataBase, self).tearDown()"},{"line_number":108,"context_line":"        # self.dbmetadata \u003d Metadata(self.context, self.instance_uuid)"},{"line_number":109,"context_line":"        #self.dbmetadata.save()"},{"line_number":110,"context_line":"        #self.dbmetadata.clear()"},{"line_number":111,"context_line":"        # self.second_dbmetadata \u003d Metadata(self.context,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2Bwvc%3D","line":108,"updated":"2014-03-24 15:01:30.000000000","message":"i guess this lines are not required anymore","commit_id":"bae7cb2bed431544df99e3848781d52707339f3a"}],"trove/tests/unittests/metadata/test_metadata_controller.py":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"93f5ca0498fe2ecc112923c9be1f351ae1cfe35d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def test_get_schema_create(self):"},{"line_number":30,"context_line":"        schema \u003d self.controller.get_schema(\u0027create\u0027, self.metadata_view)"},{"line_number":31,"context_line":"        self.assertIsNotNone(schema)"},{"line_number":32,"context_line":"        self.assertTrue(\u0027metadata\u0027 in schema[\u0027properties\u0027])"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def test_get_schema_update(self):"},{"line_number":35,"context_line":"        schema \u003d self.controller.get_schema(\u0027update\u0027, self.metadata_view)"}],"source_content_type":"text/x-python","patch_set":16,"id":"baada198_7c1231fe","line":32,"updated":"2014-07-24 15:57:53.000000000","message":"What is the point of asserting that \"metadata\" is in the schema properties? \n\nA test should prove something worth knowing, such as \"when I call the API without a key and value, I\u0027ll get an exception.\" This is just testing that the schema has a thing in it, which by itself is incidental. \n\nThis test, along with \"test_get_schema_update\", \"test_get_schema_edit\" should be removed.","commit_id":"b877416d45000a294eb756dae3c58a65e71b373e"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"93f5ca0498fe2ecc112923c9be1f351ae1cfe35d","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        body \u003d self.replace_body"},{"line_number":58,"context_line":"        schema \u003d self.controller.get_schema(\u0027metadata:edit\u0027, body)"},{"line_number":59,"context_line":"        validator \u003d jsonschema.Draft4Validator(schema)"},{"line_number":60,"context_line":"        self.assertTrue(validator.is_valid(body))"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def test_show(self):"},{"line_number":63,"context_line":"        result \u003d self.controller.show("}],"source_content_type":"text/x-python","patch_set":16,"id":"baada198_5c9acd6f","line":60,"updated":"2014-07-24 15:57:53.000000000","message":"Again, why does it matter if the jsonschema validator doesn\u0027t like the \"replace_body\" string literal? We shouldn\u0027t be unit testing jsonschema.Draft4Validator. \n\nIf the concern is the replace_body string literal (which should probably be in this file to make it easier to read) should work when passed to the API, then this should be in the integration tests.","commit_id":"b877416d45000a294eb756dae3c58a65e71b373e"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"93f5ca0498fe2ecc112923c9be1f351ae1cfe35d","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            result.data("},{"line_number":67,"context_line":"                self.serialization_type)[\u0027metadata\u0027][self.metadata_key],"},{"line_number":68,"context_line":"            self.metadata_view[\u0027metadata\u0027][self.metadata_key])"},{"line_number":69,"context_line":"        self.assertEqual(200, result.status)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_show_noexist(self):"},{"line_number":72,"context_line":"        self.assertRaises(NotFound, self.controller.show, self.req,"}],"source_content_type":"text/x-python","patch_set":16,"id":"baada198_3ccd195e","line":69,"updated":"2014-07-24 15:57:53.000000000","message":"I won\u0027t ask you to remove this- but it looks all this is doing is passing a request through the Service into the models and then out through the view. That\u0027s exactly what the integration tests are for which run in Tox. If this test was only targetting the service code (say by mocking out the model) it would have some unique value (though I don\u0027t think its worth it to test the API marshaling layer). I won\u0027t -2 the pull request for this bit of code but I think it should be removed.","commit_id":"b877416d45000a294eb756dae3c58a65e71b373e"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"93f5ca0498fe2ecc112923c9be1f351ae1cfe35d","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    def test_show_noexist(self):"},{"line_number":72,"context_line":"        self.assertRaises(NotFound, self.controller.show, self.req,"},{"line_number":73,"context_line":"                          self.tenant_id, self.instance_id,"},{"line_number":74,"context_line":"                          \u0027this_key_doesnt_exist\u0027)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def test_create(self):"},{"line_number":77,"context_line":"        key \u003d \u0027testCreateKey\u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"baada198_9c2aa5e5","line":74,"updated":"2014-07-24 15:57:53.000000000","message":"Ditto to what I said above. The integration test already looks for this.\n\nIf the Model was tested directly it would make more sense to me what this added.","commit_id":"b877416d45000a294eb756dae3c58a65e71b373e"}],"trove/tests/unittests/metadata/test_metadata_model.py":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"93f5ca0498fe2ecc112923c9be1f351ae1cfe35d","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def test_metadata_entity_for_key_noexist(self):"},{"line_number":143,"context_line":"        self.assertIsNone("},{"line_number":144,"context_line":"            self.dbmetadata.entity_for_key(\u0027this_key_doesnt_exist\u0027))"}],"source_content_type":"text/x-python","patch_set":16,"id":"baada198_9c5f0575","line":144,"updated":"2014-07-24 15:57:53.000000000","message":"This is all good stuff as it\u0027s testing the model layer directly. Just wanted to note that.","commit_id":"b877416d45000a294eb756dae3c58a65e71b373e"}]}
