)]}'
{"cinder/objects/cluster.py":[{"author":{"_account_id":7173,"name":"Scott DAngelo","email":"scott.dangelo@gmail.com","username":"scottda"},"change_message_id":"1a08823e2e7d114e1b2a39d2139cca076f426046","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        :param get_services: If we want to load all services from this cluster."},{"line_number":136,"context_line":"        :param services_summary: If we want to load num_nodes and"},{"line_number":137,"context_line":"                                 num_down_nodes fields."},{"line_number":138,"context_line":"        :param is_up: Boolean value to filter based on the cluster\u0027s up status."},{"line_number":139,"context_line":"        :param read_deleted: Filtering based on delete status. Default value is"},{"line_number":140,"context_line":"                             \"no\"."},{"line_number":141,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_f08386ca","line":138,"updated":"2016-06-22 22:09:26.000000000","message":"Are is_up and read_deleted params or filter options? Should it be in the optional param list?","commit_id":"0552038d2dcc57352785a2fdbc7289a82fa25b2f"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"730c86965af4a8200d02d2e5a8c4d2fcf25eac9b","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        :param get_services: If we want to load all services from this cluster."},{"line_number":136,"context_line":"        :param services_summary: If we want to load num_nodes and"},{"line_number":137,"context_line":"                                 num_down_nodes fields."},{"line_number":138,"context_line":"        :param is_up: Boolean value to filter based on the cluster\u0027s up status."},{"line_number":139,"context_line":"        :param read_deleted: Filtering based on delete status. Default value is"},{"line_number":140,"context_line":"                             \"no\"."},{"line_number":141,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_5e30969e","line":138,"in_reply_to":"3aaa91ec_f08386ca","updated":"2016-06-23 11:14:38.000000000","message":"They are filters, but I wanted to highlight that those non DB field filters existed, and this comes from me being really lazy in the previous patch and accepting everything (parameters and filters) in **filters.\n\nI\u0027ll change it in previous patch and here to properly differentiate between DB field filters and parameters.","commit_id":"0552038d2dcc57352785a2fdbc7289a82fa25b2f"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5b4839fc77da06d492d31b8d9ef95514284d8814","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":103,"context_line":"        \"\"\"Lazy load services attribute.\"\"\""},{"line_number":104,"context_line":"        # We only allow lazy loading services"},{"line_number":105,"context_line":"        if attrname !\u003d \u0027services\u0027:"},{"line_number":106,"context_line":"            raise exception.ObjectActionError("},{"line_number":107,"context_line":"                action\u003d\u0027obj_load_attr\u0027,"},{"line_number":108,"context_line":"                reason\u003d_(\u0027attribute %s not lazy-loadable\u0027) % attrname)"},{"line_number":109,"context_line":"        if not self._context:"},{"line_number":110,"context_line":"            raise exception.OrphanedObjectError(method\u003d\u0027obj_load_attr\u0027,"},{"line_number":111,"context_line":"                                                objtype\u003dself.obj_name())"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_1093dd50","line":108,"range":{"start_line":105,"start_character":1,"end_line":108,"end_character":70},"updated":"2016-06-28 03:59:38.000000000","message":"-1\nI think it is not reasonable to just allow services lazy loaded.\n\nThe attribute in OPTIONAL_FIELDS should be allowed to lazy loaded. As it is allowed to not load summary_fields in _get_expected_attrs(). \n\nFor example, if a dev calls get_by_id without services_summary, later he wants to use cluster.num_hosts, error \"attribute num_down_hosts not lazy-loadable\" is raised. \nYou can\u0027t ask the dev to understand such details clearly. \n\nIf it allows some attributes not load at beginning, it should also allow such attributes to load later. \n\nOr alway return summary fields(num_hosts, num_down_hosts) in _get_expected_attrs().","commit_id":"39f5c990dd5be30ecd20a4aaf2d3906fa91d53a6"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"dde97f8678f69881d69d65d293e33f2a4d08f32c","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":103,"context_line":"        \"\"\"Lazy load services attribute.\"\"\""},{"line_number":104,"context_line":"        # We only allow lazy loading services"},{"line_number":105,"context_line":"        if attrname !\u003d \u0027services\u0027:"},{"line_number":106,"context_line":"            raise exception.ObjectActionError("},{"line_number":107,"context_line":"                action\u003d\u0027obj_load_attr\u0027,"},{"line_number":108,"context_line":"                reason\u003d_(\u0027attribute %s not lazy-loadable\u0027) % attrname)"},{"line_number":109,"context_line":"        if not self._context:"},{"line_number":110,"context_line":"            raise exception.OrphanedObjectError(method\u003d\u0027obj_load_attr\u0027,"},{"line_number":111,"context_line":"                                                objtype\u003dself.obj_name())"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_acd54aba","line":108,"range":{"start_line":105,"start_character":1,"end_line":108,"end_character":70},"in_reply_to":"3aaa91ec_1093dd50","updated":"2016-06-28 10:07:08.000000000","message":"This is done on purpose, because I want people to know what they are doing when working with this code and not blindly rely on our DB abstraction to lazy load expensive fields.\n\nIf they want to use those fields they will have to request them knowingly and be aware that those operations are not cheap.\n\nThis should also help reviewers realize that.\n\nAlthough it makes sense to add a note explaining why only services is allowed to lazy load so people can understand it looking at the code.  I\u0027ll add a note.","commit_id":"39f5c990dd5be30ecd20a4aaf2d3906fa91d53a6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"96b48e9846e553262549e00e7a6d3b257049a76b","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from cinder import utils"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"CONF \u003d cfg.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"@base.CinderObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":22,"id":"dada55a8_c5cfa4b1","line":27,"range":{"start_line":27,"start_character":0,"end_line":27,"end_character":15},"updated":"2016-07-25 09:29:29.000000000","message":"Looks like CONF is unused.","commit_id":"625cab15b05339fbdb1d71250ba62ab30c1294b5"}],"cinder/objects/consistencygroup.py":[{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5b4839fc77da06d492d31b8d9ef95514284d8814","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    # Version 1.2: Changed \u0027status\u0027 field to use ConsistencyGroupStatusField"},{"line_number":34,"context_line":"    # Version 1.3: Added cluster fields"},{"line_number":35,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":36,"context_line":"    OPTIONAL_FIELDS \u003d (\u0027cluster\u0027,)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    fields \u003d {"},{"line_number":39,"context_line":"        \u0027id\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_c6407f38","line":36,"updated":"2016-06-28 03:59:38.000000000","message":"-1, should combine L25. \n\nOPTIONAL_FIELDS \u003d [\u0027cgsnapshots\u0027, \u0027volumes\u0027]","commit_id":"39f5c990dd5be30ecd20a4aaf2d3906fa91d53a6"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"dde97f8678f69881d69d65d293e33f2a4d08f32c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    # Version 1.2: Changed \u0027status\u0027 field to use ConsistencyGroupStatusField"},{"line_number":34,"context_line":"    # Version 1.3: Added cluster fields"},{"line_number":35,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":36,"context_line":"    OPTIONAL_FIELDS \u003d (\u0027cluster\u0027,)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    fields \u003d {"},{"line_number":39,"context_line":"        \u0027id\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_acec2a90","line":36,"in_reply_to":"3aaa91ec_c6407f38","updated":"2016-06-28 10:07:08.000000000","message":"You are totally right!!!","commit_id":"39f5c990dd5be30ecd20a4aaf2d3906fa91d53a6"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5b4839fc77da06d492d31b8d9ef95514284d8814","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        \u0027user_id\u0027: fields.StringField(),"},{"line_number":41,"context_line":"        \u0027project_id\u0027: fields.StringField(),"},{"line_number":42,"context_line":"        \u0027cluster_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027cluster\u0027: fields.ObjectField(\u0027Cluster\u0027, nullable\u003dTrue,"},{"line_number":44,"context_line":"                                      read_only\u003dTrue),"},{"line_number":45,"context_line":"        \u0027host\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027availability_zone\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_4be81a17","line":43,"updated":"2016-06-28 03:59:38.000000000","message":"I have concerns to set cluster as read_only.\n\nIn your later patch cinder-manager, it can rename cluster. If refreshing, it is possible that cluster is set different value.","commit_id":"39f5c990dd5be30ecd20a4aaf2d3906fa91d53a6"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"dde97f8678f69881d69d65d293e33f2a4d08f32c","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        \u0027user_id\u0027: fields.StringField(),"},{"line_number":41,"context_line":"        \u0027project_id\u0027: fields.StringField(),"},{"line_number":42,"context_line":"        \u0027cluster_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027cluster\u0027: fields.ObjectField(\u0027Cluster\u0027, nullable\u003dTrue,"},{"line_number":44,"context_line":"                                      read_only\u003dTrue),"},{"line_number":45,"context_line":"        \u0027host\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027availability_zone\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_0c5e1e45","line":43,"in_reply_to":"3aaa91ec_4be81a17","updated":"2016-06-28 10:07:08.000000000","message":"I understand your concern, but I believe that\u0027s a problem of the refresh method.  I will post a path to fix that in the base class.","commit_id":"39f5c990dd5be30ecd20a4aaf2d3906fa91d53a6"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5b4839fc77da06d492d31b8d9ef95514284d8814","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        \u0027volumes\u0027: fields.ObjectField(\u0027VolumeList\u0027, nullable\u003dTrue),"},{"line_number":55,"context_line":"    }"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":58,"context_line":"        \"\"\"Make a CG representation compatible with a target version.\"\"\""},{"line_number":59,"context_line":"        # Convert all related objects"},{"line_number":60,"context_line":"        super(ConsistencyGroup, self).obj_make_compatible(primitive,"},{"line_number":61,"context_line":"                                                          target_version)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":64,"context_line":"        # Before v1.3 we didn\u0027t have cluster fields so we have to remove them."},{"line_number":65,"context_line":"        if target_version \u003c (1, 3):"},{"line_number":66,"context_line":"            for obj_field in (\u0027cluster\u0027, \u0027cluster_name\u0027):"},{"line_number":67,"context_line":"                primitive.pop(obj_field, None)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @staticmethod"},{"line_number":70,"context_line":"    def _from_db_object(context, consistencygroup, db_consistencygroup,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_6b16b656","line":67,"range":{"start_line":57,"start_character":0,"end_line":67,"end_character":46},"updated":"2016-06-28 03:59:38.000000000","message":"Do we need to remove the two fields?\n\nIt seems that the default obj_make_compatible can do it.\n\nhttps://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/base.py#L478-L488","commit_id":"39f5c990dd5be30ecd20a4aaf2d3906fa91d53a6"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"f85193b7401ba920d4d9d20f5fe039ddc46140cd","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        \u0027volumes\u0027: fields.ObjectField(\u0027VolumeList\u0027, nullable\u003dTrue),"},{"line_number":55,"context_line":"    }"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":58,"context_line":"        \"\"\"Make a CG representation compatible with a target version.\"\"\""},{"line_number":59,"context_line":"        # Convert all related objects"},{"line_number":60,"context_line":"        super(ConsistencyGroup, self).obj_make_compatible(primitive,"},{"line_number":61,"context_line":"                                                          target_version)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":64,"context_line":"        # Before v1.3 we didn\u0027t have cluster fields so we have to remove them."},{"line_number":65,"context_line":"        if target_version \u003c (1, 3):"},{"line_number":66,"context_line":"            for obj_field in (\u0027cluster\u0027, \u0027cluster_name\u0027):"},{"line_number":67,"context_line":"                primitive.pop(obj_field, None)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @staticmethod"},{"line_number":70,"context_line":"    def _from_db_object(context, consistencygroup, db_consistencygroup,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_fc026ab3","line":67,"range":{"start_line":57,"start_character":0,"end_line":67,"end_character":46},"in_reply_to":"3aaa91ec_6b16b656","updated":"2016-06-28 05:42:52.000000000","message":"Please ignore this comments. I noticed that removing added field is not done by default.","commit_id":"39f5c990dd5be30ecd20a4aaf2d3906fa91d53a6"},{"author":{"_account_id":7173,"name":"Scott DAngelo","email":"scott.dangelo@gmail.com","username":"scottda"},"change_message_id":"ac9b798a52219e6bdf4acf4fbb2d9f701001cbfc","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":34,"context_line":"    OPTIONAL_FIELDS \u003d (\u0027cgsnapshots\u0027, \u0027volumes\u0027, \u0027cluster\u0027,)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    OPTIONAL_FIELDS \u003d [\u0027cgsnapshots\u0027, \u0027volumes\u0027]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    fields \u003d {"},{"line_number":39,"context_line":"        \u0027id\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":21,"id":"dada55a8_d412e657","line":36,"updated":"2016-07-22 17:47:13.000000000","message":"Is this being redefined here?","commit_id":"bedfd6f3af043e224673e2e76c35c12b23534191"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"65338d1088273fc40ba185731cac090825ad9743","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":34,"context_line":"    OPTIONAL_FIELDS \u003d (\u0027cgsnapshots\u0027, \u0027volumes\u0027, \u0027cluster\u0027,)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    OPTIONAL_FIELDS \u003d [\u0027cgsnapshots\u0027, \u0027volumes\u0027]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    fields \u003d {"},{"line_number":39,"context_line":"        \u0027id\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":21,"id":"dada55a8_f468ca89","line":36,"in_reply_to":"dada55a8_d412e657","updated":"2016-07-22 17:55:48.000000000","message":"Yea, looks like this just overwrites OPTIONAL_FIELDS, we probably only want the new one with \u0027cluster\u0027 added in.","commit_id":"bedfd6f3af043e224673e2e76c35c12b23534191"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"33d324092a58086dc76907e641258f1e1a7094b1","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":34,"context_line":"    OPTIONAL_FIELDS \u003d (\u0027cgsnapshots\u0027, \u0027volumes\u0027, \u0027cluster\u0027,)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    OPTIONAL_FIELDS \u003d [\u0027cgsnapshots\u0027, \u0027volumes\u0027]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    fields \u003d {"},{"line_number":39,"context_line":"        \u0027id\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":21,"id":"dada55a8_d41f8607","line":36,"in_reply_to":"dada55a8_d412e657","updated":"2016-07-22 17:57:06.000000000","message":"Yeah, this looks like a copy paste error.","commit_id":"bedfd6f3af043e224673e2e76c35c12b23534191"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"011312817645ddc844739a488f47622f6ed05aaf","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":34,"context_line":"    OPTIONAL_FIELDS \u003d (\u0027cgsnapshots\u0027, \u0027volumes\u0027, \u0027cluster\u0027,)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    OPTIONAL_FIELDS \u003d [\u0027cgsnapshots\u0027, \u0027volumes\u0027]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    fields \u003d {"},{"line_number":39,"context_line":"        \u0027id\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":21,"id":"dada55a8_da3e8d28","line":36,"in_reply_to":"dada55a8_d41f8607","updated":"2016-07-22 18:50:04.000000000","message":"This was a rebase problem when I removed either the previous patch or the 2 that we agreed to remove on Tuesday\u0027s session.  Will fix it right away.","commit_id":"bedfd6f3af043e224673e2e76c35c12b23534191"}],"cinder/objects/service.py":[{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"f85193b7401ba920d4d9d20f5fe039ddc46140cd","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        \u0027host\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027binary\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027cluster_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027cluster\u0027: fields.ObjectField(\u0027Cluster\u0027, nullable\u003dTrue,"},{"line_number":45,"context_line":"                                      read_only\u003dTrue),"},{"line_number":46,"context_line":"        \u0027topic\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027report_count\u0027: fields.IntegerField(default\u003d0),"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_81114160","line":44,"updated":"2016-06-28 05:42:52.000000000","message":"Same concern about whether it should be set as read_only.","commit_id":"39f5c990dd5be30ecd20a4aaf2d3906fa91d53a6"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"dde97f8678f69881d69d65d293e33f2a4d08f32c","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        \u0027host\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027binary\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027cluster_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027cluster\u0027: fields.ObjectField(\u0027Cluster\u0027, nullable\u003dTrue,"},{"line_number":45,"context_line":"                                      read_only\u003dTrue),"},{"line_number":46,"context_line":"        \u0027topic\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027report_count\u0027: fields.IntegerField(default\u003d0),"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_3f769a3e","line":44,"in_reply_to":"3aaa91ec_81114160","updated":"2016-06-28 10:07:08.000000000","message":"ditto, I think that is a bug in the refresh method.","commit_id":"39f5c990dd5be30ecd20a4aaf2d3906fa91d53a6"}],"cinder/objects/snapshot.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"96b48e9846e553262549e00e7a6d3b257049a76b","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        if \u0027cgsnapshot\u0027 in updates:"},{"line_number":156,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":157,"context_line":"                                              reason\u003d_(\u0027cgsnapshot assigned\u0027))"},{"line_number":158,"context_line":"        if \u0027cluster\u0027 in updates:"},{"line_number":159,"context_line":"            raise exception.ObjectActionError("},{"line_number":160,"context_line":"                action\u003d\u0027create\u0027, reason\u003d_(\u0027cluster assigned\u0027))"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        db_snapshot \u003d db.snapshot_create(self._context, updates)"},{"line_number":163,"context_line":"        self._from_db_object(self._context, self, db_snapshot)"}],"source_content_type":"text/x-python","patch_set":22,"id":"dada55a8_88f141d0","line":160,"range":{"start_line":158,"start_character":0,"end_line":160,"end_character":62},"updated":"2016-07-25 09:29:29.000000000","message":"This doesn\u0027t really have cluster in fields?","commit_id":"625cab15b05339fbdb1d71250ba62ab30c1294b5"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"96b48e9846e553262549e00e7a6d3b257049a76b","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                raise exception.ObjectActionError("},{"line_number":173,"context_line":"                    action\u003d\u0027save\u0027, reason\u003d_(\u0027cgsnapshot changed\u0027))"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"            if \u0027cluster\u0027 in updates:"},{"line_number":176,"context_line":"                raise exception.ObjectActionError("},{"line_number":177,"context_line":"                    action\u003d\u0027save\u0027, reason\u003d_(\u0027cluster changed\u0027))"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"            if \u0027metadata\u0027 in updates:"},{"line_number":180,"context_line":"                # Metadata items that are not specified in the"}],"source_content_type":"text/x-python","patch_set":22,"id":"dada55a8_c8b979ee","line":177,"range":{"start_line":175,"start_character":0,"end_line":177,"end_character":63},"updated":"2016-07-25 09:29:29.000000000","message":"ditto","commit_id":"625cab15b05339fbdb1d71250ba62ab30c1294b5"}]}
