)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14274,"name":"XinXiaohui","email":"xiaohui.xin@intel.com","username":"XinXiaohui"},"change_message_id":"69f316cab2a0e3386683ffd8fb49a3768909580f","unresolved":false,"context_lines":[{"line_number":11,"context_line":"able to do changes in request_spec structure while maintaining backward"},{"line_number":12,"context_line":"compatibilty (and rolling upgrades)."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Implements: blueprint cinder-objects"},{"line_number":15,"context_line":"Closes-Bug: 1529636"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I72e736b77187ecf616e4ca1d14604d6d57228aa2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"da6ed579_5d49adcf","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":10},"updated":"2016-01-12 08:32:02.000000000","message":"nit: Maybe a Partial-Implements will be better.","commit_id":"d95ce5156d398919f684f0d08618b7a4ffe7ca94"}],"cinder/objects/request_spec.py":[{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"a08f8658da030017d798786e47dbf9f52274a855","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027CG_backend\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027ref\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027quota_reservations\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027old_reservations\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":51,"context_line":"        \u0027migration_policy\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":52,"context_line":"    }"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_2556c55c","line":50,"updated":"2016-01-13 15:50:41.000000000","message":"We should probably make migration_policy an enum class (\u0027never\u0027, \u0027on-demand\u0027)","commit_id":"35326bdd0f63b6a4383a3011001c6eb3b397c447"}],"cinder/objects/volume_type.py":[{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"94fc61f06a53c0ae82077f75a3a3af427ab9be13","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            expected_attrs \u003d []"},{"line_number":51,"context_line":"        for name, field in type.fields.items():"},{"line_number":52,"context_line":"            if name in OPTIONAL_FIELDS:"},{"line_number":53,"context_line":"                continue"},{"line_number":54,"context_line":"            value \u003d db_type.get(name)"},{"line_number":55,"context_line":"            if isinstance(field, fields.IntegerField):"},{"line_number":56,"context_line":"                value \u003d value or 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_f1b4fb35","line":53,"updated":"2015-12-10 22:36:56.000000000","message":"Is this change required for this patch?  Seems like a reasonable change, more curious than anything else","commit_id":"c16e3606eb90c9faead9998c2989b8274e9c47c6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"bb14e40ccc82e7b84eb8fa30f180b400c1e5ff9c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            expected_attrs \u003d []"},{"line_number":51,"context_line":"        for name, field in type.fields.items():"},{"line_number":52,"context_line":"            if name in OPTIONAL_FIELDS:"},{"line_number":53,"context_line":"                continue"},{"line_number":54,"context_line":"            value \u003d db_type.get(name)"},{"line_number":55,"context_line":"            if isinstance(field, fields.IntegerField):"},{"line_number":56,"context_line":"                value \u003d value or 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_4b9dac08","line":53,"in_reply_to":"7a740942_f1b4fb35","updated":"2015-12-14 13:36:40.000000000","message":"We\u0027re doing _from_db_object this way in other ovo\u0027s. In general in unit tests we\u0027re sometimes mocking DB objects as incomplete dicts which would make this fail. I don\u0027t see a point in refactoring unit tests in order to do this patch.","commit_id":"c16e3606eb90c9faead9998c2989b8274e9c47c6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8c859226fcfd5547c4c62fa7111adce6bf452b80","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        for name, field in type.fields.items():"},{"line_number":53,"context_line":"            if name in OPTIONAL_FIELDS:"},{"line_number":54,"context_line":"                continue"},{"line_number":55,"context_line":"            value \u003d db_type.get(name)"},{"line_number":56,"context_line":"            if isinstance(field, fields.IntegerField):"},{"line_number":57,"context_line":"                value \u003d value or 0"},{"line_number":58,"context_line":"            type[name] \u003d value"}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_0b4e466f","line":55,"range":{"start_line":55,"start_character":12,"end_line":55,"end_character":37},"updated":"2016-01-13 09:57:16.000000000","message":"On your comment below - this is changed to make model work correctly with tests - sometimes we mock volume type with simplified dicts. Something like:\n\n {\u0027id\u0027: \u0027volume_type_id\u0027, \u0027name\u0027: \u0027fake\u0027}\n\nWorry not, because in other o.vo in Cinder we already implement this method using \u0027get\u0027.","commit_id":"35326bdd0f63b6a4383a3011001c6eb3b397c447"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"8ea3c8284e5b51b47ccc4b13acb3b8a1a0db5bfe","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    def destroy(self):"},{"line_number":98,"context_line":"        with self.obj_as_admin():"},{"line_number":99,"context_line":"            volume_types.destroy(self._context, self.id)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @base.remotable_classmethod"},{"line_number":102,"context_line":"    def get_by_name(cls, context, name):"},{"line_number":103,"context_line":"        db_vt \u003d volume_types.get_volume_type_by_name(context, name)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_5283b3cc","line":100,"updated":"2016-01-12 19:26:04.000000000","message":"Is there a reason to lump these VolumeType changes in with the RequestSpec updates?","commit_id":"35326bdd0f63b6a4383a3011001c6eb3b397c447"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8c859226fcfd5547c4c62fa7111adce6bf452b80","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    def destroy(self):"},{"line_number":98,"context_line":"        with self.obj_as_admin():"},{"line_number":99,"context_line":"            volume_types.destroy(self._context, self.id)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @base.remotable_classmethod"},{"line_number":102,"context_line":"    def get_by_name(cls, context, name):"},{"line_number":103,"context_line":"        db_vt \u003d volume_types.get_volume_type_by_name(context, name)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_f9663128","line":100,"in_reply_to":"da6ed579_5283b3cc","updated":"2016-01-13 09:57:16.000000000","message":"This is kind of a tradeoff. I\u0027ve could either convert SQLA VolumeType models to o.vo in volume.api\u0027s manage or fetch them directly as o.vo in api.contrib.volume_manage and pass o.vo to volume.api. I\u0027ve chosen the latter as we should rather use o.vo in the code.\n\nTo make that possible I\u0027ve needed to expose these two additional DB methods in VolumeType o.vo.\n\nIt\u0027s possible to split this additions into another patch, but I\u0027m always a little reluctant to merge orphaned method that aren\u0027t used besides unit tests.","commit_id":"35326bdd0f63b6a4383a3011001c6eb3b397c447"}],"cinder/scheduler/filter_scheduler.py":[{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"94fc61f06a53c0ae82077f75a3a3af427ab9be13","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        Can be overridden in a subclass to add more data."},{"line_number":56,"context_line":"        \"\"\""},{"line_number":57,"context_line":"        vol \u003d request_spec[\u0027volume_properties\u0027]"},{"line_number":58,"context_line":"        filter_properties[\u0027size\u0027] \u003d vol[\u0027size\u0027]"},{"line_number":59,"context_line":"        filter_properties[\u0027availability_zone\u0027] \u003d vol.get(\u0027availability_zone\u0027,"},{"line_number":60,"context_line":"                                                         None)"},{"line_number":61,"context_line":"        filter_properties[\u0027user_id\u0027] \u003d vol.get(\u0027user_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_b1d3d35e","line":58,"updated":"2015-12-10 22:36:56.000000000","message":"Don\u0027t think these changes any functionality since .get() defaults to None","commit_id":"c16e3606eb90c9faead9998c2989b8274e9c47c6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"4a40b208195d7fdcb23f97085510ab1f62d4c70c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        Can be overridden in a subclass to add more data."},{"line_number":56,"context_line":"        \"\"\""},{"line_number":57,"context_line":"        vol \u003d request_spec[\u0027volume_properties\u0027]"},{"line_number":58,"context_line":"        filter_properties[\u0027size\u0027] \u003d vol[\u0027size\u0027]"},{"line_number":59,"context_line":"        filter_properties[\u0027availability_zone\u0027] \u003d vol.get(\u0027availability_zone\u0027,"},{"line_number":60,"context_line":"                                                         None)"},{"line_number":61,"context_line":"        filter_properties[\u0027user_id\u0027] \u003d vol.get(\u0027user_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a710552_46daef79","line":58,"in_reply_to":"5a710552_0603950e","updated":"2015-12-16 10:13:15.000000000","message":"Yeah, I\u0027ve thought about it a few times and always ended with \"there probably was a reason, let\u0027s code around it\". Maybe you\u0027re right, I\u0027ve asked thangp for opinion on your patch.","commit_id":"c16e3606eb90c9faead9998c2989b8274e9c47c6"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"49248f10c789b5ec2b4f405f97a8ee67e00973c3","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        Can be overridden in a subclass to add more data."},{"line_number":56,"context_line":"        \"\"\""},{"line_number":57,"context_line":"        vol \u003d request_spec[\u0027volume_properties\u0027]"},{"line_number":58,"context_line":"        filter_properties[\u0027size\u0027] \u003d vol[\u0027size\u0027]"},{"line_number":59,"context_line":"        filter_properties[\u0027availability_zone\u0027] \u003d vol.get(\u0027availability_zone\u0027,"},{"line_number":60,"context_line":"                                                         None)"},{"line_number":61,"context_line":"        filter_properties[\u0027user_id\u0027] \u003d vol.get(\u0027user_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a710552_0603950e","line":58,"in_reply_to":"5a710552_7d823a96","updated":"2015-12-16 04:38:39.000000000","message":"Fair enough about the default :) but I\u0027d rather see the behavior fixed so that we get None even if a field is not initialized, since this would be more consistent with the dictionary format.  I through up patch https://review.openstack.org/#/c/258249/ to update the underlying behavior","commit_id":"c16e3606eb90c9faead9998c2989b8274e9c47c6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e898984012fa6f5b05cbbb8f9d8c132c67f3fb39","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        Can be overridden in a subclass to add more data."},{"line_number":56,"context_line":"        \"\"\""},{"line_number":57,"context_line":"        vol \u003d request_spec[\u0027volume_properties\u0027]"},{"line_number":58,"context_line":"        filter_properties[\u0027size\u0027] \u003d vol[\u0027size\u0027]"},{"line_number":59,"context_line":"        filter_properties[\u0027availability_zone\u0027] \u003d vol.get(\u0027availability_zone\u0027,"},{"line_number":60,"context_line":"                                                         None)"},{"line_number":61,"context_line":"        filter_properties[\u0027user_id\u0027] \u003d vol.get(\u0027user_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a710552_7d823a96","line":58,"in_reply_to":"5a710552_afa42808","updated":"2015-12-15 20:40:50.000000000","message":"Bootable property has a default - that wasn\u0027t a good choice. :) Try \u0027availability_zone\u0027 there: http://paste.openstack.org/show/482008/","commit_id":"c16e3606eb90c9faead9998c2989b8274e9c47c6"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"061720ab637427e99e7c226199564a1f3a3a7087","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        Can be overridden in a subclass to add more data."},{"line_number":56,"context_line":"        \"\"\""},{"line_number":57,"context_line":"        vol \u003d request_spec[\u0027volume_properties\u0027]"},{"line_number":58,"context_line":"        filter_properties[\u0027size\u0027] \u003d vol[\u0027size\u0027]"},{"line_number":59,"context_line":"        filter_properties[\u0027availability_zone\u0027] \u003d vol.get(\u0027availability_zone\u0027,"},{"line_number":60,"context_line":"                                                         None)"},{"line_number":61,"context_line":"        filter_properties[\u0027user_id\u0027] \u003d vol.get(\u0027user_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a710552_afa42808","line":58,"in_reply_to":"7a740942_6b6e6801","updated":"2015-12-14 20:42:56.000000000","message":"It looks like we do returning \u0027None\u0027 by default if key is not in object with CinderObjectDictCompat: http://paste.openstack.org/show/481875/ \n\nThat logic is at https://github.com/openstack/cinder/blob/master/cinder/objects/base.py#L226-L236","commit_id":"c16e3606eb90c9faead9998c2989b8274e9c47c6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"bb14e40ccc82e7b84eb8fa30f180b400c1e5ff9c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        Can be overridden in a subclass to add more data."},{"line_number":56,"context_line":"        \"\"\""},{"line_number":57,"context_line":"        vol \u003d request_spec[\u0027volume_properties\u0027]"},{"line_number":58,"context_line":"        filter_properties[\u0027size\u0027] \u003d vol[\u0027size\u0027]"},{"line_number":59,"context_line":"        filter_properties[\u0027availability_zone\u0027] \u003d vol.get(\u0027availability_zone\u0027,"},{"line_number":60,"context_line":"                                                         None)"},{"line_number":61,"context_line":"        filter_properties[\u0027user_id\u0027] \u003d vol.get(\u0027user_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_6b6e6801","line":58,"in_reply_to":"7a740942_b1d3d35e","updated":"2015-12-14 13:36:40.000000000","message":"Not in case of CinderObjectDictCompat [1].\n\n[1] https://github.com/openstack/cinder/blob/master/cinder/objects/base.py#L237-L241","commit_id":"c16e3606eb90c9faead9998c2989b8274e9c47c6"}],"cinder/scheduler/manager.py":[{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"94fc61f06a53c0ae82077f75a3a3af427ab9be13","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            volume_state \u003d {\u0027volume_state\u0027: {\u0027status\u0027: previous_status}}"},{"line_number":229,"context_line":"            self._set_volume_state_and_notify(\u0027retype\u0027, volume_state,"},{"line_number":230,"context_line":"                                              context, ex, request_spec, msg)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        reservations \u003d request_spec.get(\u0027quota_reservations\u0027, None)"},{"line_number":233,"context_line":"        new_type \u003d request_spec.get(\u0027volume_type\u0027, None)"},{"line_number":234,"context_line":"        if new_type is None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_f1507bd6","line":231,"updated":"2015-12-10 22:36:56.000000000","message":"Same question about if this changes any functionality","commit_id":"c16e3606eb90c9faead9998c2989b8274e9c47c6"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"a08f8658da030017d798786e47dbf9f52274a855","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            _retype_volume_set_error(self, context, ex, request_spec,"},{"line_number":240,"context_line":"                                     volume, msg, reservations)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        # Default migration policy is \u0027never\u0027"},{"line_number":243,"context_line":"        migration_policy \u003d request_spec.get(\u0027migration_policy\u0027, \u0027never\u0027)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_e5fd0d3b","line":242,"updated":"2016-01-13 15:50:41.000000000","message":"We can set default to be \u0027never\u0027 once we change migration_policy to enum","commit_id":"35326bdd0f63b6a4383a3011001c6eb3b397c447"}],"cinder/scheduler/rpcapi.py":[{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"8c6df7f53b076b121e209ebae22777c0cc429631","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        1.11 - Adds support for sending objects over RPC in"},{"line_number":48,"context_line":"               migrate_volume_to_host()"},{"line_number":49,"context_line":"        1.12 - Sends request_spec as object in create_volume()"},{"line_number":50,"context_line":"        1.13 - Sends request_spec as object in migrate_volume_to_host, retype"},{"line_number":51,"context_line":"               and manage_existing calls."},{"line_number":52,"context_line":"    \"\"\""},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_7dae5ce7","line":50,"range":{"start_line":50,"start_character":69,"end_line":50,"end_character":70},"updated":"2016-01-05 16:40:39.000000000","message":"Suggest: \"Sends request_spec as object in migrate_volume_to_host(), retype(), and manage_existing() calls\"","commit_id":"39db35dc87e6841ae5b8d2a9d5959caaf27dfe3e"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"323aa0410005300b5107a618640374d8dcf88c10","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        version \u003d \u00271.13\u0027"},{"line_number":103,"context_line":"        if not self.client.can_send_version(\u00271.13\u0027):"},{"line_number":104,"context_line":"            version \u003d \u00271.11\u0027"},{"line_number":105,"context_line":"            msg_args.pop(\u0027volume\u0027)"},{"line_number":106,"context_line":"        if not self.client.can_send_version(\u00271.11\u0027):"},{"line_number":107,"context_line":"            # Send request_spec as dict"},{"line_number":108,"context_line":"            version \u003d \u00271.3\u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"dae33548_865628cc","line":105,"updated":"2016-02-17 06:56:18.000000000","message":"This is inconsistent with old version.\n\nI seems should be:\n\nif not self.client.can_send_version(\u00271.13\u0027):\n\n    version \u003d \u00271.11\u0027\n\n     msg_args[\u0027request_spec\u0027] \u003d jsonutils.to_primitive(request_spec)\n\n\nif not self.client.can_send_version(\u00271.11\u0027):\n\n     version \u003d \u00271.3\u0027\n\n     msg_args.pop(\u0027volume\u0027)","commit_id":"543ddb1d7393cd918b27b2099f373916d39d3fa2"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c3bef63b11cf4448167feb239fbab496f08bf81e","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        version \u003d \u00271.13\u0027"},{"line_number":103,"context_line":"        if not self.client.can_send_version(\u00271.13\u0027):"},{"line_number":104,"context_line":"            version \u003d \u00271.11\u0027"},{"line_number":105,"context_line":"            msg_args.pop(\u0027volume\u0027)"},{"line_number":106,"context_line":"        if not self.client.can_send_version(\u00271.11\u0027):"},{"line_number":107,"context_line":"            # Send request_spec as dict"},{"line_number":108,"context_line":"            version \u003d \u00271.3\u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"dae33548_1c424d68","line":105,"in_reply_to":"dae33548_865628cc","updated":"2016-02-17 15:28:54.000000000","message":"Done","commit_id":"543ddb1d7393cd918b27b2099f373916d39d3fa2"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"90534fbe30287d56e0536427c7725da48bf415b1","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                    \u0027host\u0027: host, \u0027force_host_copy\u0027: force_host_copy,"},{"line_number":107,"context_line":"                    \u0027request_spec\u0027: request_spec,"},{"line_number":108,"context_line":"                    \u0027filter_properties\u0027: filter_properties, \u0027volume\u0027: volume}"},{"line_number":109,"context_line":"        version \u003d \u00272.3\u0027"},{"line_number":110,"context_line":"        if not self.client.can_send_version(\u00272.3\u0027):"},{"line_number":111,"context_line":"            # Send request_spec as dict"},{"line_number":112,"context_line":"            version \u003d \u00272.0\u0027"},{"line_number":113,"context_line":"            msg_args[\u0027request_spec\u0027] \u003d jsonutils.to_primitive(request_spec)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        cctxt \u003d self.client.prepare(version\u003dversion)"},{"line_number":116,"context_line":"        return cctxt.cast(ctxt, \u0027migrate_volume_to_host\u0027, **msg_args)"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_8af17e98","line":113,"range":{"start_line":109,"start_character":1,"end_line":113,"end_character":75},"updated":"2016-07-08 02:39:58.000000000","message":"I think this part can be deleted in O release. Yes? \n\nNeed to add comments?","commit_id":"61ed26ad6b2291997bec66151c28ba521f7b4ce1"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c877789f86ab02ee11676e5b402a23dacab206da","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                    \u0027host\u0027: host, \u0027force_host_copy\u0027: force_host_copy,"},{"line_number":107,"context_line":"                    \u0027request_spec\u0027: request_spec,"},{"line_number":108,"context_line":"                    \u0027filter_properties\u0027: filter_properties, \u0027volume\u0027: volume}"},{"line_number":109,"context_line":"        version \u003d \u00272.3\u0027"},{"line_number":110,"context_line":"        if not self.client.can_send_version(\u00272.3\u0027):"},{"line_number":111,"context_line":"            # Send request_spec as dict"},{"line_number":112,"context_line":"            version \u003d \u00272.0\u0027"},{"line_number":113,"context_line":"            msg_args[\u0027request_spec\u0027] \u003d jsonutils.to_primitive(request_spec)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        cctxt \u003d self.client.prepare(version\u003dversion)"},{"line_number":116,"context_line":"        return cctxt.cast(ctxt, \u0027migrate_volume_to_host\u0027, **msg_args)"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_f79f3e63","line":113,"range":{"start_line":109,"start_character":1,"end_line":113,"end_character":75},"in_reply_to":"1aa78d24_8af17e98","updated":"2016-07-11 13:33:46.000000000","message":"With any major RPC bump we will be cleaning that up anyway, so I don\u0027t see reason to add a new comment. Also it may happen that we decide not to bump the version in O.","commit_id":"61ed26ad6b2291997bec66151c28ba521f7b4ce1"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"3a396a9708eae01b5ac38fe5b813dd73d4bdaeec","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            \u0027request_spec\u0027: request_spec_p,"},{"line_number":140,"context_line":"            \u0027filter_properties\u0027: filter_properties, \u0027volume\u0027: volume,"},{"line_number":141,"context_line":"        }"},{"line_number":142,"context_line":"        version \u003d \u00272.3\u0027"},{"line_number":143,"context_line":"        if not self.client.can_send_version(\u00272.3\u0027):"},{"line_number":144,"context_line":"            # Send request_spec as dict"},{"line_number":145,"context_line":"            version \u003d \u00272.1\u0027"},{"line_number":146,"context_line":"            msg_args[\u0027request_spec\u0027] \u003d jsonutils.to_primitive(request_spec)"},{"line_number":147,"context_line":"        if not self.client.can_send_version(\u00272.1\u0027):"},{"line_number":148,"context_line":"            version \u003d \u00272.0\u0027"},{"line_number":149,"context_line":"            msg_args.pop(\u0027volume\u0027)"},{"line_number":150,"context_line":"        cctxt \u003d self.client.prepare(version\u003dversion)"},{"line_number":151,"context_line":"        return cctxt.cast(ctxt, \u0027manage_existing\u0027, **msg_args)"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_22ac218b","line":149,"range":{"start_line":142,"start_character":0,"end_line":149,"end_character":34},"updated":"2016-07-13 07:27:24.000000000","message":"May you want to do like this: \n\n        version \u003d \u00272.3\u0027\n\n        if not self.client.can_send_version(\u00272.3\u0027):\n\n            # Send request_spec as dict\n\n            version \u003d \u00272.1\u0027\n\n            msg_args[\u0027request_spec\u0027] \u003d jsonutils.to_primitive(request_spec)\n\n            if not self.client.can_send_version(\u00272.1\u0027):\n\n                version \u003d \u00272.0\u0027\n\n                msg_args.pop(\u0027volume\u0027)","commit_id":"61ed26ad6b2291997bec66151c28ba521f7b4ce1"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"2a0f7d45040872e1e23723fabca447d22dd50af4","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            \u0027request_spec\u0027: request_spec_p,"},{"line_number":140,"context_line":"            \u0027filter_properties\u0027: filter_properties, \u0027volume\u0027: volume,"},{"line_number":141,"context_line":"        }"},{"line_number":142,"context_line":"        version \u003d \u00272.3\u0027"},{"line_number":143,"context_line":"        if not self.client.can_send_version(\u00272.3\u0027):"},{"line_number":144,"context_line":"            # Send request_spec as dict"},{"line_number":145,"context_line":"            version \u003d \u00272.1\u0027"},{"line_number":146,"context_line":"            msg_args[\u0027request_spec\u0027] \u003d jsonutils.to_primitive(request_spec)"},{"line_number":147,"context_line":"        if not self.client.can_send_version(\u00272.1\u0027):"},{"line_number":148,"context_line":"            version \u003d \u00272.0\u0027"},{"line_number":149,"context_line":"            msg_args.pop(\u0027volume\u0027)"},{"line_number":150,"context_line":"        cctxt \u003d self.client.prepare(version\u003dversion)"},{"line_number":151,"context_line":"        return cctxt.cast(ctxt, \u0027manage_existing\u0027, **msg_args)"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_8ddb2a21","line":149,"range":{"start_line":142,"start_character":0,"end_line":149,"end_character":34},"in_reply_to":"1aa78d24_22ac218b","updated":"2016-07-14 16:52:20.000000000","message":"With that notation I would be afraid it can quickly get to:\n\n        version \u003d \u00272.5\u0027\n        if not self.client.can_send_version(\u00272.5\u0027):\n            # Send request_spec as dict\n            version \u003d \u00272.4\u0027\n            msg_args[\u0027request_spec\u0027] \u003d jsonutils.to_primitive(request_spec)\n            if not self.client.can_send_version(\u00272.4\u0027):\n                version \u003d \u00272.3\u0027\n                msg_args.pop(\u0027volume\u0027)\n                if not self.client.can_send_version(\u00272.3\u0027):\n                    version \u003d \u00272.2\u0027\n                    msg_args.pop(\u0027volume\u0027)\n                    if not self.client.can_send_version(\u00272.2\u0027):\n                        version \u003d \u00272.1\u0027\n                        msg_args.pop(\u0027volume\u0027)\n                        if not self.client.can_send_version(\u00272.1\u0027):\n                            version \u003d \u00272.0\u0027\n                            msg_args.pop(\u0027volume\u0027)\n\nWhich is a lot less readable.","commit_id":"61ed26ad6b2291997bec66151c28ba521f7b4ce1"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"35fabe7bc9dfe7ab3d00bf90d527501f529d383c","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            \u0027request_spec\u0027: request_spec_p,"},{"line_number":140,"context_line":"            \u0027filter_properties\u0027: filter_properties, \u0027volume\u0027: volume,"},{"line_number":141,"context_line":"        }"},{"line_number":142,"context_line":"        version \u003d \u00272.3\u0027"},{"line_number":143,"context_line":"        if not self.client.can_send_version(\u00272.3\u0027):"},{"line_number":144,"context_line":"            # Send request_spec as dict"},{"line_number":145,"context_line":"            version \u003d \u00272.1\u0027"},{"line_number":146,"context_line":"            msg_args[\u0027request_spec\u0027] \u003d jsonutils.to_primitive(request_spec)"},{"line_number":147,"context_line":"        if not self.client.can_send_version(\u00272.1\u0027):"},{"line_number":148,"context_line":"            version \u003d \u00272.0\u0027"},{"line_number":149,"context_line":"            msg_args.pop(\u0027volume\u0027)"},{"line_number":150,"context_line":"        cctxt \u003d self.client.prepare(version\u003dversion)"},{"line_number":151,"context_line":"        return cctxt.cast(ctxt, \u0027manage_existing\u0027, **msg_args)"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_6a1fa5b7","line":149,"range":{"start_line":142,"start_character":0,"end_line":149,"end_character":34},"in_reply_to":"1aa78d24_8ddb2a21","updated":"2016-07-15 07:25:25.000000000","message":"I agree, the current way is better.","commit_id":"61ed26ad6b2291997bec66151c28ba521f7b4ce1"}],"cinder/tests/unit/scheduler/test_rpcapi.py":[{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"90534fbe30287d56e0536427c7725da48bf415b1","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        can_send_version.assert_has_calls([mock.call(\u00272.3\u0027)])"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027, return_value\u003dTrue)"},{"line_number":149,"context_line":"    def test_retype(self, can_send_version):"},{"line_number":150,"context_line":"        self._test_scheduler_api(\u0027retype\u0027,"},{"line_number":151,"context_line":"                                 rpc_method\u003d\u0027cast\u0027,"},{"line_number":152,"context_line":"                                 topic\u003d\u0027topic\u0027,"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_aaf1da6c","line":149,"updated":"2016-07-08 02:39:58.000000000","message":"Seems that for test_retype and test_retype_old, you can use similar ddt method like test_manage_existing.","commit_id":"61ed26ad6b2291997bec66151c28ba521f7b4ce1"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c877789f86ab02ee11676e5b402a23dacab206da","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        can_send_version.assert_has_calls([mock.call(\u00272.3\u0027)])"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027, return_value\u003dTrue)"},{"line_number":149,"context_line":"    def test_retype(self, can_send_version):"},{"line_number":150,"context_line":"        self._test_scheduler_api(\u0027retype\u0027,"},{"line_number":151,"context_line":"                                 rpc_method\u003d\u0027cast\u0027,"},{"line_number":152,"context_line":"                                 topic\u003d\u0027topic\u0027,"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_370b867f","line":149,"in_reply_to":"1aa78d24_aaf1da6c","updated":"2016-07-11 13:33:46.000000000","message":"Hm, suuure.","commit_id":"61ed26ad6b2291997bec66151c28ba521f7b4ce1"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"90534fbe30287d56e0536427c7725da48bf415b1","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                                 filter_properties\u003d\u0027filter_properties\u0027,"},{"line_number":185,"context_line":"                                 volume\u003d\u0027volume\u0027,"},{"line_number":186,"context_line":"                                 version\u003dversion)"},{"line_number":187,"context_line":"        can_send_version.assert_has_calls([mock.call(\u00272.3\u0027)])"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def test_get_pools(self):"},{"line_number":190,"context_line":"        self._test_scheduler_api(\u0027get_pools\u0027,"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_aa98ba1c","line":187,"updated":"2016-07-08 02:39:58.000000000","message":"Better to check also has_calls([mock.call(\u00272,3\u0027), mock.call(\u00272.1\u0027)])","commit_id":"61ed26ad6b2291997bec66151c28ba521f7b4ce1"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"3a396a9708eae01b5ac38fe5b813dd73d4bdaeec","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                                 filter_properties\u003d\u0027filter_properties\u0027,"},{"line_number":185,"context_line":"                                 volume\u003d\u0027volume\u0027,"},{"line_number":186,"context_line":"                                 version\u003dversion)"},{"line_number":187,"context_line":"        can_send_version.assert_has_calls([mock.call(\u00272.3\u0027)])"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def test_get_pools(self):"},{"line_number":190,"context_line":"        self._test_scheduler_api(\u0027get_pools\u0027,"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_e24df93e","line":187,"in_reply_to":"1aa78d24_974a3aab","updated":"2016-07-13 07:27:24.000000000","message":"In your current codes in cinder/scheduler/rpcapi.py, no matter the version is 2.0, 2.1 or 2.3, the two check will be called.","commit_id":"61ed26ad6b2291997bec66151c28ba521f7b4ce1"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c877789f86ab02ee11676e5b402a23dacab206da","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                                 filter_properties\u003d\u0027filter_properties\u0027,"},{"line_number":185,"context_line":"                                 volume\u003d\u0027volume\u0027,"},{"line_number":186,"context_line":"                                 version\u003dversion)"},{"line_number":187,"context_line":"        can_send_version.assert_has_calls([mock.call(\u00272.3\u0027)])"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def test_get_pools(self):"},{"line_number":190,"context_line":"        self._test_scheduler_api(\u0027get_pools\u0027,"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_974a3aab","line":187,"in_reply_to":"1aa78d24_aa98ba1c","updated":"2016-07-11 13:33:46.000000000","message":"I would love to, but I don\u0027t really have an idea how to do that neatly in test multiplexed by ddt. Propositions are welcomed. :)","commit_id":"61ed26ad6b2291997bec66151c28ba521f7b4ce1"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"2a0f7d45040872e1e23723fabca447d22dd50af4","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                                 filter_properties\u003d\u0027filter_properties\u0027,"},{"line_number":185,"context_line":"                                 volume\u003d\u0027volume\u0027,"},{"line_number":186,"context_line":"                                 version\u003dversion)"},{"line_number":187,"context_line":"        can_send_version.assert_has_calls([mock.call(\u00272.3\u0027)])"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def test_get_pools(self):"},{"line_number":190,"context_line":"        self._test_scheduler_api(\u0027get_pools\u0027,"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_4d75c230","line":187,"in_reply_to":"1aa78d24_e24df93e","updated":"2016-07-14 16:52:20.000000000","message":"Oh, you\u0027re… right!","commit_id":"61ed26ad6b2291997bec66151c28ba521f7b4ce1"}],"cinder/volume/api.py":[{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"94fc61f06a53c0ae82077f75a3a3af427ab9be13","unresolved":false,"context_lines":[{"line_number":1345,"context_line":"        self.update(context, volume, updates)"},{"line_number":1346,"context_line":""},{"line_number":1347,"context_line":"        # Call the scheduler to ensure that the host exists and that it can"},{"line_number":1348,"context_line":"        # accept the volume"},{"line_number":1349,"context_line":"        volume_type \u003d volume.volume_type if volume.volume_type_id else None"},{"line_number":1350,"context_line":"        qos_specs \u003d None"},{"line_number":1351,"context_line":"        if volume_type:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_1fc4335d","line":1348,"updated":"2015-12-10 22:36:56.000000000","message":"Do we still need this ternary now that https://review.openstack.org/#/c/254414/ landed?","commit_id":"c16e3606eb90c9faead9998c2989b8274e9c47c6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"bb14e40ccc82e7b84eb8fa30f180b400c1e5ff9c","unresolved":false,"context_lines":[{"line_number":1345,"context_line":"        self.update(context, volume, updates)"},{"line_number":1346,"context_line":""},{"line_number":1347,"context_line":"        # Call the scheduler to ensure that the host exists and that it can"},{"line_number":1348,"context_line":"        # accept the volume"},{"line_number":1349,"context_line":"        volume_type \u003d volume.volume_type if volume.volume_type_id else None"},{"line_number":1350,"context_line":"        qos_specs \u003d None"},{"line_number":1351,"context_line":"        if volume_type:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_8b1ab47b","line":1348,"in_reply_to":"7a740942_1fc4335d","updated":"2015-12-14 13:36:40.000000000","message":"Yeah, we don\u0027t need that. :)","commit_id":"c16e3606eb90c9faead9998c2989b8274e9c47c6"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"323aa0410005300b5107a618640374d8dcf88c10","unresolved":false,"context_lines":[{"line_number":1332,"context_line":"        request_spec \u003d objects.RequestSpec()"},{"line_number":1333,"context_line":"        request_spec.volume_properties \u003d volume_properties"},{"line_number":1334,"context_line":"        request_spec.volume_type \u003d volume_type"},{"line_number":1335,"context_line":"        request_spec.volume_id \u003d volume[\u0027id\u0027]"},{"line_number":1336,"context_line":"        self.scheduler_rpcapi.migrate_volume_to_host(context,"},{"line_number":1337,"context_line":"                                                     CONF.volume_topic,"},{"line_number":1338,"context_line":"                                                     volume.id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"dae33548_e6c3b455","line":1335,"updated":"2016-02-17 06:56:18.000000000","message":"Why don\u0027t use volume.id here?","commit_id":"543ddb1d7393cd918b27b2099f373916d39d3fa2"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"90534fbe30287d56e0536427c7725da48bf415b1","unresolved":false,"context_lines":[{"line_number":1399,"context_line":"        # Support specifying volume type by ID or name"},{"line_number":1400,"context_line":"        try:"},{"line_number":1401,"context_line":"            if uuidutils.is_uuid_like(new_type):"},{"line_number":1402,"context_line":"                vol_type \u003d volume_types.get_volume_type(context.elevated(),"},{"line_number":1403,"context_line":"                                                        new_type)"},{"line_number":1404,"context_line":"            else:"},{"line_number":1405,"context_line":"                vol_type \u003d volume_types.get_volume_type_by_name("},{"line_number":1406,"context_line":"                    context.elevated(), new_type)"},{"line_number":1407,"context_line":"        except exception.InvalidVolumeType:"},{"line_number":1408,"context_line":"            msg \u003d _(\u0027Invalid volume_type passed: %s.\u0027) % new_type"},{"line_number":1409,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_2dd98484","line":1406,"range":{"start_line":1402,"start_character":0,"end_line":1406,"end_character":49},"updated":"2016-07-08 02:39:58.000000000","message":"Why not just use objects.VolumType.get_by_id, or get_by_name to get object? So that no need to change db type to object ype in Line 1471.","commit_id":"61ed26ad6b2291997bec66151c28ba521f7b4ce1"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c877789f86ab02ee11676e5b402a23dacab206da","unresolved":false,"context_lines":[{"line_number":1399,"context_line":"        # Support specifying volume type by ID or name"},{"line_number":1400,"context_line":"        try:"},{"line_number":1401,"context_line":"            if uuidutils.is_uuid_like(new_type):"},{"line_number":1402,"context_line":"                vol_type \u003d volume_types.get_volume_type(context.elevated(),"},{"line_number":1403,"context_line":"                                                        new_type)"},{"line_number":1404,"context_line":"            else:"},{"line_number":1405,"context_line":"                vol_type \u003d volume_types.get_volume_type_by_name("},{"line_number":1406,"context_line":"                    context.elevated(), new_type)"},{"line_number":1407,"context_line":"        except exception.InvalidVolumeType:"},{"line_number":1408,"context_line":"            msg \u003d _(\u0027Invalid volume_type passed: %s.\u0027) % new_type"},{"line_number":1409,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_923088ea","line":1406,"range":{"start_line":1402,"start_character":0,"end_line":1406,"end_character":49},"in_reply_to":"1aa78d24_2dd98484","updated":"2016-07-11 13:33:46.000000000","message":"I was reluctant because VolumeType object don\u0027t have qos_specs relationship yet. In this case however this looks safe, will do.","commit_id":"61ed26ad6b2291997bec66151c28ba521f7b4ce1"}],"cinder/volume/flows/api/manage_existing.py":[{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"94fc61f06a53c0ae82077f75a3a3af427ab9be13","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        volume_type \u003d kwargs.pop(\u0027volume_type\u0027)"},{"line_number":54,"context_line":"        volume_type_id \u003d volume_type[\u0027id\u0027] if volume_type else None"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        # FIXME(dulek): Change this to use objects?"},{"line_number":57,"context_line":"        vol_props \u003d objects.VolumePeoperties()"},{"line_number":58,"context_line":"        vol_props.size \u003d 0"},{"line_number":59,"context_line":"        vol_props.user_id \u003d context.user_id"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_ff2047f9","line":56,"updated":"2015-12-10 22:36:56.000000000","message":"Typo \u0027VolumePeoperties\u0027","commit_id":"c16e3606eb90c9faead9998c2989b8274e9c47c6"}]}
