)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5a58d6941ab987fbe354d3cd1e80be50e888b61c","unresolved":false,"context_lines":[{"line_number":16,"context_line":"create/remove_attachment for now, and they\u0027ll just consolidate"},{"line_number":17,"context_line":"all of the calls we used to make."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"For example, instead of:"},{"line_number":20,"context_line":" 1. reserve"},{"line_number":21,"context_line":" 2. initialize"},{"line_number":22,"context_line":" 3. attach"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"We\u0027ll just call create_attachment(volume, connector,"},{"line_number":25,"context_line":"                                  instance_uuid, mountpoint)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"For now that will simply call the existing initialize_connection"},{"line_number":28,"context_line":"and attach methods, but the advantage here is it\u0027s a single call"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"7aa08908_e9ffd263","line":25,"range":{"start_line":19,"start_character":0,"end_line":25,"end_character":60},"updated":"2016-06-13 17:31:00.000000000","message":"I like this. The only thing I wonder about is today Nova calls them in different places:\n\n1. reserve is called in nova-api before casting off to the compute to attach the volume; this avoids blocking calls to cinder from nova-api but changes the state on the volume while doing this other work.\n2. initialize and attach are called from the compute on the reserved volume.\n\nWith this new API, would nova-api be calling the blocking create_attachment method or would nova-compute?\n\nI\u0027m thinking of this like the auto-allocated-topology API in neutron which creates a network and subnet for a tenant, but that\u0027s a bigger operation probably than making the connections for the storage and updating the database on the cinder.","commit_id":"6448ca899d3df42b7482627c5ce35fbb0c0c8584"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ad9e11a22dabfc7da06a6f0516e3bbc2a32b6593","unresolved":false,"context_lines":[{"line_number":16,"context_line":"create/remove_attachment for now, and they\u0027ll just consolidate"},{"line_number":17,"context_line":"all of the calls we used to make."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"For example, instead of:"},{"line_number":20,"context_line":" 1. reserve"},{"line_number":21,"context_line":" 2. initialize"},{"line_number":22,"context_line":" 3. attach"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"We\u0027ll just call create_attachment(volume, connector,"},{"line_number":25,"context_line":"                                  instance_uuid, mountpoint)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"For now that will simply call the existing initialize_connection"},{"line_number":28,"context_line":"and attach methods, but the advantage here is it\u0027s a single call"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"7aa08908_4940a6a5","line":25,"range":{"start_line":19,"start_character":0,"end_line":25,"end_character":60},"in_reply_to":"7aa08908_e9ffd263","updated":"2016-06-13 17:32:26.000000000","message":"I guess it would have to be nova-compute calling this since it\u0027s on the compute where we get the connector dict to pass in for initialize.","commit_id":"6448ca899d3df42b7482627c5ce35fbb0c0c8584"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"ed164dcdfe8d1eae66c57b0abaf85e769bfef2bb","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch aims to make the attach/detach process a bit"},{"line_number":10,"context_line":"simpler and less prone to race conditions and solve"},{"line_number":11,"context_line":"some confusion in it\u0027s usage."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"For the first step we aren\u0027t implementing much, just"},{"line_number":14,"context_line":"some new calls for attach and detach.  We\u0027ll call them"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"1ac06dbe_ab2d12ff","line":11,"range":{"start_line":11,"start_character":18,"end_line":11,"end_character":22},"updated":"2016-08-26 13:59:18.000000000","message":"its","commit_id":"1f0bac4fa313ccbd1bd2957e4b845c26d684f8cb"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"032b1018a335e6b20664719ba665a24312c12892","unresolved":false,"context_lines":[{"line_number":43,"context_line":"step we can have a stable, easy to use API to work off of that"},{"line_number":44,"context_line":"shouldn\u0027t have to change AND best of all we don\u0027t break any"},{"line_number":45,"context_line":"compatability."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Change-Id: I90d54257862e1815a03ca8750040f7e4e6f35c0b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"1a95cdbc_1399176f","line":46,"updated":"2016-10-04 18:05:11.000000000","message":"Shouldn\u0027t we track this as a very simple blueprint? I understand why there\u0027s no spec as we\u0027re working a little blindly, but a blueprint to track activities related to multiattach would be probably cool to have.\n\nIs this one fitting: https://blueprints.launchpad.net/cinder/+spec/update-attachment-api ?","commit_id":"1e47a0af983a0715307275f9d8ec4b354ced6d3d"}],"cinder/api/contrib/volume_actions.py":[{"author":{"_account_id":7173,"name":"Scott DAngelo","email":"scott.dangelo@gmail.com","username":"scottda"},"change_message_id":"c0719ceece11d26268cf112e7cbdf3898ddfe47f","unresolved":false,"context_lines":[{"line_number":367,"context_line":"            os_type - string"},{"line_number":368,"context_line":"            multipath - bool"},{"line_number":369,"context_line":"        :param instance_uuid: instance being detached from"},{"line_number":370,"context_line":"        :param mountpoint: mountpoint volume is mounted on Instance"},{"line_number":371,"context_line":"        :returns connection_info object:"},{"line_number":372,"context_line":"            attachment_id - UUID"},{"line_number":373,"context_line":"            volume_id - UUID"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ac371cc_0bb7283a","line":370,"updated":"2016-08-15 21:41:34.000000000","message":"We don\u0027t need this anymore. Since it\u0027s a new API we don\u0027t need to support it either.","commit_id":"1f0bac4fa313ccbd1bd2957e4b845c26d684f8cb"},{"author":{"_account_id":7173,"name":"Scott DAngelo","email":"scott.dangelo@gmail.com","username":"scottda"},"change_message_id":"c0719ceece11d26268cf112e7cbdf3898ddfe47f","unresolved":false,"context_lines":[{"line_number":400,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":401,"context_line":"                explanation\u003d_(\"Must specify \u0027instance_uuid\u0027\"))"},{"line_number":402,"context_line":"        try:"},{"line_number":403,"context_line":"            mountpoint \u003d body[\u0027os-create_attachment\u0027][\u0027mountpoint\u0027]"},{"line_number":404,"context_line":"        except KeyError:"},{"line_number":405,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":406,"context_line":"                explanation\u003d_(\"Must specify \u0027mountpoint\u0027\"))"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ac371cc_eb960c93","line":403,"updated":"2016-08-15 21:41:34.000000000","message":"We don\u0027t need this anymore. Since it\u0027s a new API we don\u0027t need to support it either.","commit_id":"1f0bac4fa313ccbd1bd2957e4b845c26d684f8cb"},{"author":{"_account_id":7173,"name":"Scott DAngelo","email":"scott.dangelo@gmail.com","username":"scottda"},"change_message_id":"c0719ceece11d26268cf112e7cbdf3898ddfe47f","unresolved":false,"context_lines":[{"line_number":410,"context_line":"                volume,"},{"line_number":411,"context_line":"                connector,"},{"line_number":412,"context_line":"                instance_uuid,"},{"line_number":413,"context_line":"                mountpoint)"},{"line_number":414,"context_line":"        except exception.InvalidInput as err:"},{"line_number":415,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":416,"context_line":"                explanation\u003derr)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ac371cc_2b91449a","line":413,"updated":"2016-08-15 21:41:34.000000000","message":"and here.","commit_id":"1f0bac4fa313ccbd1bd2957e4b845c26d684f8cb"},{"author":{"_account_id":7173,"name":"Scott DAngelo","email":"scott.dangelo@gmail.com","username":"scottda"},"change_message_id":"c0719ceece11d26268cf112e7cbdf3898ddfe47f","unresolved":false,"context_lines":[{"line_number":425,"context_line":""},{"line_number":426,"context_line":"        :param connector: os-brick connector object"},{"line_number":427,"context_line":"        :param instance_uuid: instance being detached from"},{"line_number":428,"context_line":"        :param mountpoint: mountpoint volume is mounted on Instance"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"        returns: a list of remaining attachment records for this volume"},{"line_number":431,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"3ac371cc_4bee4023","line":428,"updated":"2016-08-15 21:41:34.000000000","message":"and here.","commit_id":"1f0bac4fa313ccbd1bd2957e4b845c26d684f8cb"},{"author":{"_account_id":7173,"name":"Scott DAngelo","email":"scott.dangelo@gmail.com","username":"scottda"},"change_message_id":"c0719ceece11d26268cf112e7cbdf3898ddfe47f","unresolved":false,"context_lines":[{"line_number":451,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":452,"context_line":"                explanation\u003d_(\"Must specify \u0027instance_uuid\u0027\"))"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        # NOTE(jdg): We have mountpoint just incase some knuckle-head wants to"},{"line_number":455,"context_line":"        # attach the same volume to the same instance multiple times.  I don\u0027t"},{"line_number":456,"context_line":"        # see a good reason to allow this, but we either need to explicitly"},{"line_number":457,"context_line":"        # reject it or we need to support it"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ac371cc_2b94a4e0","line":454,"updated":"2016-08-15 21:41:34.000000000","message":"hmmmm...that is a good reason to keep mountpoint around. Which kind of sucks. Also, mountpoint is optional from Nova\u0027s standpoint, so we probably shouldn\u0027t just raise and fail, unless it\u0027s a multi-attach to the same instance (the knucklehead case), which means more checks for that case.\nI vote we just dis-allow that...","commit_id":"1f0bac4fa313ccbd1bd2957e4b845c26d684f8cb"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"eb5172e8aab31a66dd11acca84f4897ac62972bd","unresolved":false,"context_lines":[{"line_number":451,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":452,"context_line":"                explanation\u003d_(\"Must specify \u0027instance_uuid\u0027\"))"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        # NOTE(jdg): We have mountpoint just incase some knuckle-head wants to"},{"line_number":455,"context_line":"        # attach the same volume to the same instance multiple times.  I don\u0027t"},{"line_number":456,"context_line":"        # see a good reason to allow this, but we either need to explicitly"},{"line_number":457,"context_line":"        # reject it or we need to support it"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ac06dbe_694b2a2c","line":454,"in_reply_to":"3ac371cc_2b94a4e0","updated":"2016-08-25 13:36:29.000000000","message":"I agree. Block the knuckleheads!","commit_id":"1f0bac4fa313ccbd1bd2957e4b845c26d684f8cb"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"39baa3e1a14f04347b297d5ca1ef5b364ac20541","unresolved":false,"context_lines":[{"line_number":406,"context_line":"            instance_uuid \u003d body[\u0027os-create_attachment\u0027][\u0027instance_uuid\u0027]"},{"line_number":407,"context_line":"        except KeyError:"},{"line_number":408,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":409,"context_line":"                explanation\u003d_(\"Must specify \u0027instance_uuid\u0027\"))"},{"line_number":410,"context_line":"        try:"},{"line_number":411,"context_line":"            mountpoint \u003d body[\u0027os-create_attachment\u0027][\u0027mountpoint\u0027]"},{"line_number":412,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a98d1f4_5f87120f","line":409,"updated":"2016-09-28 20:17:01.000000000","message":"This prevents folks from using the API to attach a volume to a host directly.  The brick-cinderclient extension allows end users to attach a cinder volume to a bare metal host directly.  They won\u0027t have an instance_uuid at that point, but only a hostname to pass in.  The existing _attach() API allows either a hostname or an instance_uuid.","commit_id":"b18489c6ce281855878ddcd15ad400b3b24a16ab"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"3719f330e33a25b01df8ad464981a71a48c0d226","unresolved":false,"context_lines":[{"line_number":406,"context_line":"            instance_uuid \u003d body[\u0027os-create_attachment\u0027][\u0027instance_uuid\u0027]"},{"line_number":407,"context_line":"        except KeyError:"},{"line_number":408,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":409,"context_line":"                explanation\u003d_(\"Must specify \u0027instance_uuid\u0027\"))"},{"line_number":410,"context_line":"        try:"},{"line_number":411,"context_line":"            mountpoint \u003d body[\u0027os-create_attachment\u0027][\u0027mountpoint\u0027]"},{"line_number":412,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a98d1f4_a90e2132","line":409,"in_reply_to":"3a98d1f4_5f87120f","updated":"2016-09-28 22:29:32.000000000","message":"It works fine, you just pass in *something*, I do it currently with bare-metal, I also use the same method with the existing API\u0027s in the cinder-docker-driver.  \n\nBetter to pass a fake in than introduce crazy logic that has to guess things.  But if you have a real problem with it, I\u0027ll gladly remove the parameter altogether.  There\u0027s a ton of duplicate that has been introduced now with the connector, so I do plan to clean some of those things up.  Right now I\u0027m trying to keep compatability though until I can rip out the messy stuff.","commit_id":"b18489c6ce281855878ddcd15ad400b3b24a16ab"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"032b1018a335e6b20664719ba665a24312c12892","unresolved":false,"context_lines":[{"line_number":420,"context_line":"                    explanation\u003d_(\"Must specify \u0027connector\u0027 unless \""},{"line_number":421,"context_line":"                                  \"no_connect is specified\"))"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"        try:"},{"line_number":424,"context_line":"            instance_uuid \u003d body[\u0027os-create_attachment\u0027][\u0027instance_uuid\u0027]"},{"line_number":425,"context_line":"        except KeyError:"},{"line_number":426,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":427,"context_line":"                explanation\u003d_(\"Must specify \u0027instance_uuid\u0027\"))"},{"line_number":428,"context_line":"        try:"},{"line_number":429,"context_line":"            mountpoint \u003d body[\u0027os-create_attachment\u0027][\u0027mountpoint\u0027]"},{"line_number":430,"context_line":"        except KeyError:"},{"line_number":431,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":432,"context_line":"                explanation\u003d_(\"Must specify \u0027mountpoint\u0027\"))"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"        try:"},{"line_number":435,"context_line":"            completion_wait \u003d ("}],"source_content_type":"text/x-python","patch_set":19,"id":"1a95cdbc_b3a7834e","line":432,"range":{"start_line":423,"start_character":0,"end_line":432,"end_character":59},"updated":"2016-10-04 18:05:11.000000000","message":"I would probably refactor this to:\n\n        try:\n            instance_uuid, mountpoint \u003d (\n                body[\u0027os-create_attachment\u0027][key] for key in (\u0027instance_uuid\u0027,\n                                                              \u0027mountpoint\u0027))\n        except KeyError as e:\n            raise webob.exc.HTTPBadRequest(\n                explanation\u003d_(\"Must specify \u0027%s\u0027\", str(e)))\n\nBut maybe explicit is better than implicit applies here, dunno.","commit_id":"1e47a0af983a0715307275f9d8ec4b354ced6d3d"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"032b1018a335e6b20664719ba665a24312c12892","unresolved":false,"context_lines":[{"line_number":498,"context_line":"            connector \u003d body[\u0027os-update_attachment\u0027][\u0027connector\u0027]"},{"line_number":499,"context_line":"        except KeyError:"},{"line_number":500,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":501,"context_line":"                explanation\u003d_(\"Must specify \u0027connector\u0027 unless \""},{"line_number":502,"context_line":"                              \"no_connect is specified\"))"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"        try:"},{"line_number":505,"context_line":"            instance_uuid \u003d body[\u0027os-update_attachment\u0027][\u0027instance_uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a95cdbc_cefe2605","line":502,"range":{"start_line":501,"start_character":30,"end_line":502,"end_character":55},"updated":"2016-10-04 18:05:11.000000000","message":"Is there any no_connect there?","commit_id":"1e47a0af983a0715307275f9d8ec4b354ced6d3d"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"032b1018a335e6b20664719ba665a24312c12892","unresolved":false,"context_lines":[{"line_number":501,"context_line":"                explanation\u003d_(\"Must specify \u0027connector\u0027 unless \""},{"line_number":502,"context_line":"                              \"no_connect is specified\"))"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"        try:"},{"line_number":505,"context_line":"            instance_uuid \u003d body[\u0027os-update_attachment\u0027][\u0027instance_uuid\u0027]"},{"line_number":506,"context_line":"        except KeyError:"},{"line_number":507,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":508,"context_line":"                explanation\u003d_(\"Must specify \u0027instance_uuid\u0027\"))"},{"line_number":509,"context_line":"        try:"},{"line_number":510,"context_line":"            mountpoint \u003d body[\u0027os-update_attachment\u0027][\u0027mountpoint\u0027]"},{"line_number":511,"context_line":"        except KeyError:"},{"line_number":512,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":513,"context_line":"                explanation\u003d_(\"Must specify \u0027mountpoint\u0027\"))"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"        try:"},{"line_number":516,"context_line":"            connection_info \u003d self.volume_api.update_attachment("}],"source_content_type":"text/x-python","patch_set":19,"id":"1a95cdbc_530c7f42","line":513,"range":{"start_line":504,"start_character":0,"end_line":513,"end_character":59},"updated":"2016-10-04 18:05:11.000000000","message":"Same refactoring here I think.","commit_id":"1e47a0af983a0715307275f9d8ec4b354ced6d3d"}],"cinder/db/sqlalchemy/migrate_repo/versions/085_add_attachment_specs.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"032b1018a335e6b20664719ba665a24312c12892","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        Column(\u0027key\u0027, String(255)),"},{"line_number":35,"context_line":"        Column(\u0027value\u0027, String(255)),"},{"line_number":36,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":37,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":38,"context_line":"    )"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    attachment_specs.create()"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a95cdbc_493a10cf","line":37,"updated":"2016-10-04 18:05:11.000000000","message":"There should be trailing comma.","commit_id":"1e47a0af983a0715307275f9d8ec4b354ced6d3d"}],"cinder/db/sqlalchemy/models.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"032b1018a335e6b20664719ba665a24312c12892","unresolved":false,"context_lines":[{"line_number":872,"context_line":"    \"\"\"Represents attachment specs as k/v pairs for a volume_attachment.\"\"\""},{"line_number":873,"context_line":"    __tablename__ \u003d \u0027attachment_specs\u0027"},{"line_number":874,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":875,"context_line":"    key \u003d Column(String(255))"},{"line_number":876,"context_line":"    value \u003d Column(String(255))"},{"line_number":877,"context_line":"    attachment_id \u003d ("},{"line_number":878,"context_line":"        Column(String(36),"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a95cdbc_a91ab46c","line":875,"updated":"2016-10-04 18:05:11.000000000","message":"What\u0027s the point of having nullable key?","commit_id":"1e47a0af983a0715307275f9d8ec4b354ced6d3d"}],"cinder/tests/functional/test_attach.py":[{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"33d79ca8b4374776e5188cfd262891ca1aef917e","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def _get_flags(self):"},{"line_number":33,"context_line":"        f \u003d super(VolumesTest, self)._get_flags()"},{"line_number":34,"context_line":"        f[\u0027volume_driver\u0027] \u003d \\"},{"line_number":35,"context_line":"            \u0027cinder.tests.unit.fake_driver.LoggingVolumeDriver\u0027"},{"line_number":36,"context_line":"        f[\u0027default_volume_type\u0027] \u003d self._vol_type_name"},{"line_number":37,"context_line":"        return f"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_6812ea0a","line":35,"range":{"start_line":35,"start_character":13,"end_line":35,"end_character":62},"updated":"2016-08-04 14:48:59.000000000","message":"This should be \u0027cinder.tests.fake_driver.LoggingVolumeDriver\u0027.","commit_id":"23a7328d8150808e253652e9632346e4e658a2d8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"64a74d3a455e067488012061544b5cd921f4084a","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def _get_flags(self):"},{"line_number":33,"context_line":"        f \u003d super(VolumesTest, self)._get_flags()"},{"line_number":34,"context_line":"        f[\u0027volume_driver\u0027] \u003d \\"},{"line_number":35,"context_line":"            \u0027cinder.tests.unit.fake_driver.LoggingVolumeDriver\u0027"},{"line_number":36,"context_line":"        f[\u0027default_volume_type\u0027] \u003d self._vol_type_name"},{"line_number":37,"context_line":"        return f"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_c360a9d1","line":35,"range":{"start_line":35,"start_character":13,"end_line":35,"end_character":62},"in_reply_to":"bacf61ea_6812ea0a","updated":"2016-08-06 22:43:36.000000000","message":"Done","commit_id":"23a7328d8150808e253652e9632346e4e658a2d8"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"33d79ca8b4374776e5188cfd262891ca1aef917e","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                break"},{"line_number":58,"context_line":"        return found_volume"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @test.testtools.skip(\"bug 1606715\")"},{"line_number":61,"context_line":"    def test_create_attachment(self):"},{"line_number":62,"context_line":"        created_volume \u003d self.api.post_volume({\u0027volume\u0027: {"},{"line_number":63,"context_line":"            \u0027size\u0027: 1, \u0027name\u0027: \u0027vol1\u0027}})"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_cdb15991","line":60,"range":{"start_line":60,"start_character":26,"end_line":60,"end_character":37},"updated":"2016-08-04 14:48:59.000000000","message":"One of the problems here is that the path for the policy file is overwritten in test.py: https://github.com/openstack/cinder/blob/master/cinder/test.py#L225\n\nIf we define the file path as the original for VolumeTest or even all functional tests that will solve that particular part of the bug. But I would guess it would be better to rethink how the functional and unit tests are structured, although that might take more time.\n\nIs there any ongoing activity around this area?","commit_id":"23a7328d8150808e253652e9632346e4e658a2d8"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"15e3ee3e6fd9c615423ab75f3a196ff1dd7f4003","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                break"},{"line_number":58,"context_line":"        return found_volume"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @test.testtools.skip(\"bug 1606715\")"},{"line_number":61,"context_line":"    def test_create_attachment(self):"},{"line_number":62,"context_line":"        created_volume \u003d self.api.post_volume({\u0027volume\u0027: {"},{"line_number":63,"context_line":"            \u0027size\u0027: 1, \u0027name\u0027: \u0027vol1\u0027}})"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a95cdbc_02a47e05","line":60,"range":{"start_line":60,"start_character":4,"end_line":60,"end_character":39},"updated":"2016-10-10 16:40:50.000000000","message":"The patch to re-direct the tests to the real policy.json file got merged: https://review.openstack.org/383568\n\nYou can now run the test, you only need to add this \u0027POLICY_PATH \u003d \u0027etc/cinder/policy.json\u0027\u0027 under the line \u0027_vol_type_name\u003d....\u0027","commit_id":"29f3328360a27f568a4e78385686074f6268f239"}],"cinder/volume/api.py":[{"author":{"_account_id":16627,"name":"Chris Morrell","email":"gomeler@gmail.com","username":"Chris_Morrell"},"change_message_id":"90de180af04fa8f4bc9f5cce07e59e8ecfaf9999","unresolved":false,"context_lines":[{"line_number":1573,"context_line":""},{"line_number":1574,"context_line":"    def get_manageable_volumes(self, context, host, marker\u003dNone, limit\u003dNone,"},{"line_number":1575,"context_line":"                               offset\u003dNone, sort_keys\u003dNone, sort_dirs\u003dNone):"},{"line_number":1576,"context_line":"        self._get_service_by_host(context, host)"},{"line_number":1577,"context_line":"        return self.volume_rpcapi.get_manageable_volumes(context, host,"},{"line_number":1578,"context_line":"                                                         marker, limit,"},{"line_number":1579,"context_line":"                                                         offset, sort_keys,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_a1fc81b5","line":1576,"range":{"start_line":1576,"start_character":0,"end_line":1576,"end_character":48},"updated":"2016-06-14 18:10:22.000000000","message":"Is this just a check to verify c-vol is running on the expected host?","commit_id":"6448ca899d3df42b7482627c5ce35fbb0c0c8584"},{"author":{"_account_id":16627,"name":"Chris Morrell","email":"gomeler@gmail.com","username":"Chris_Morrell"},"change_message_id":"90de180af04fa8f4bc9f5cce07e59e8ecfaf9999","unresolved":false,"context_lines":[{"line_number":1784,"context_line":"    @wrap_check_policy"},{"line_number":1785,"context_line":"    def get_attachments_by_volume(self, context, volume_ref):"},{"line_number":1786,"context_line":"        return self.db.volume_attachment_get_all_by_volume_id("},{"line_number":1787,"context_line":"            context, volume_id)"},{"line_number":1788,"context_line":""},{"line_number":1789,"context_line":"    @wrap_check_policy"},{"line_number":1790,"context_line":"    def get_attachment(self, context, attachment_id):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_8f237104","line":1787,"range":{"start_line":1787,"start_character":28,"end_line":1787,"end_character":30},"updated":"2016-06-14 18:10:22.000000000","message":"Where does volume_id come from? I see that patch 1 changed the input to volume_id, not sure if I\u0027m missing some magic.","commit_id":"6448ca899d3df42b7482627c5ce35fbb0c0c8584"}],"cinder/volume/manager.py":[{"author":{"_account_id":16627,"name":"Chris Morrell","email":"gomeler@gmail.com","username":"Chris_Morrell"},"change_message_id":"563c965196d4c37f5b3d1aa4f6d9b9dc07893d36","unresolved":false,"context_lines":[{"line_number":331,"context_line":"            except Exception:"},{"line_number":332,"context_line":"                LOG.exception(_LE(\u0027Fetch volume pool name failed.\u0027),"},{"line_number":333,"context_line":"                              resource\u003dvolume)"},{"line_number":334,"context_line":"                return"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"            if pool:"},{"line_number":337,"context_line":"                new_host \u003d vol_utils.append_host(volume[\u0027host\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_8843246c","side":"PARENT","line":334,"range":{"start_line":334,"start_character":0,"end_line":334,"end_character":22},"updated":"2016-06-09 23:12:56.000000000","message":"Accidental removal? Seems like if you continue with pool\u003d\u003dNone, and line 346 continues along with setting pool\u003d\u003dNone, you\u0027ll end up throwing an error on line 359.","commit_id":"27fec2e8bbf8d495b7daed3f67458bcd70c52787"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"927a1d7d56379773170dca44709d832f3c281eac","unresolved":false,"context_lines":[{"line_number":157,"context_line":"class VolumeManager(manager.SchedulerDependentManager):"},{"line_number":158,"context_line":"    \"\"\"Manages attachable block storage devices.\"\"\""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    RPC_API_VERSION \u003d \u00272.3\u0027"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    target \u003d messaging.Target(version\u003dRPC_API_VERSION)"},{"line_number":163,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_5f3338f6","line":160,"range":{"start_line":160,"start_character":23,"end_line":160,"end_character":26},"updated":"2016-07-20 14:22:36.000000000","message":"You\u0027re bumping RPC API version to 2.4 in other file, so this should reflect that.","commit_id":"4d699d52cf1b5a7731fb4c7546097c45fabd8db0"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7d40b0214a9e4cde03f18e9e24d94b70c7879ab8","unresolved":false,"context_lines":[{"line_number":157,"context_line":"class VolumeManager(manager.SchedulerDependentManager):"},{"line_number":158,"context_line":"    \"\"\"Manages attachable block storage devices.\"\"\""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    RPC_API_VERSION \u003d \u00272.3\u0027"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    target \u003d messaging.Target(version\u003dRPC_API_VERSION)"},{"line_number":163,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_9304c87e","line":160,"range":{"start_line":160,"start_character":23,"end_line":160,"end_character":26},"in_reply_to":"dada55a8_5f3338f6","updated":"2016-07-26 00:52:48.000000000","message":"Oops :)  But now that we pull that in rebase should fix it up.  Thanks!!","commit_id":"4d699d52cf1b5a7731fb4c7546097c45fabd8db0"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"ed164dcdfe8d1eae66c57b0abaf85e769bfef2bb","unresolved":false,"context_lines":[{"line_number":3476,"context_line":"                                            mountpoint,"},{"line_number":3477,"context_line":"                                            results[\u0027data\u0027][\u0027access_mode\u0027])"},{"line_number":3478,"context_line":"        results[\u0027attachment_id\u0027] \u003d attach_results[\u0027id\u0027]"},{"line_number":3479,"context_line":"        return results"},{"line_number":3480,"context_line":""},{"line_number":3481,"context_line":"    def remove_attachment(self, context, volume_id, connector, instance_uuid,"},{"line_number":3482,"context_line":"                          mountpoint):"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa7ab95a_4c303902","line":3479,"range":{"start_line":3479,"start_character":0,"end_line":3479,"end_character":22},"updated":"2016-08-26 13:59:18.000000000","message":"Everything\u0027s fine until to this point. Can we make sure a VolumeAttachment versioned object will get returned instead of dictionary? If we\u0027ll happen to make incompatible changes in the object, then this will leave us open for doing compatibility checks and backports.","commit_id":"1f0bac4fa313ccbd1bd2957e4b845c26d684f8cb"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"eb5172e8aab31a66dd11acca84f4897ac62972bd","unresolved":false,"context_lines":[{"line_number":3491,"context_line":""},{"line_number":3492,"context_line":"        if not active_attachment:"},{"line_number":3493,"context_line":"            LOG.error(_LE(\"Failed to find attachment record for volume on\""},{"line_number":3494,"context_line":"                          \"%(host)s for instance %(instance)s\") %"},{"line_number":3495,"context_line":"                      {\"host\": connector[\u0027host\u0027],"},{"line_number":3496,"context_line":"                       \"instance\": instance_uuid},"},{"line_number":3497,"context_line":"                      resource\u003d{\u0027type\u0027: \u0027volume\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ac06dbe_e9b9daed","line":3494,"range":{"start_line":3494,"start_character":63,"end_line":3494,"end_character":65},"updated":"2016-08-25 13:36:29.000000000","message":"Please switch to ,","commit_id":"1f0bac4fa313ccbd1bd2957e4b845c26d684f8cb"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"ed164dcdfe8d1eae66c57b0abaf85e769bfef2bb","unresolved":false,"context_lines":[{"line_number":3505,"context_line":"            context, volume_id)"},{"line_number":3506,"context_line":"        # Return a list of remaining attachments so caller can determine if"},{"line_number":3507,"context_line":"        # it\u0027s safe to delete devices etc"},{"line_number":3508,"context_line":"        return attachments"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa7ab95a_6f324ff3","line":3508,"range":{"start_line":3508,"start_character":0,"end_line":3508,"end_character":26},"updated":"2016-08-26 13:59:18.000000000","message":"Same here, can we just make sure o.vo\u0027s are flying over RPC and not dicts?","commit_id":"1f0bac4fa313ccbd1bd2957e4b845c26d684f8cb"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"f111f5de56f0d65e3c18c1e99e63286e51aa1706","unresolved":false,"context_lines":[{"line_number":4348,"context_line":"                                            instance_uuid,"},{"line_number":4349,"context_line":"                                            connector[\u0027host\u0027],"},{"line_number":4350,"context_line":"                                            mountpoint,"},{"line_number":4351,"context_line":"                                            results[\u0027data\u0027][\u0027access_mode\u0027])"},{"line_number":4352,"context_line":"        attachment \u003d objects.VolumeAttachment.get_by_id(context,"},{"line_number":4353,"context_line":"                                                        attach_results[\u0027id\u0027])"},{"line_number":4354,"context_line":"        self.db.attach_specs_update_or_create("}],"source_content_type":"text/x-python","patch_set":16,"id":"5a8bc5a2_7ec35689","line":4351,"updated":"2016-09-26 17:23:40.000000000","message":"we should also be saving the connector in the attachment table.","commit_id":"e9a229bcf24865a40cfa22d3f7155f784f7cc08c"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"13487e0e7d311cb92c8b25301f11ca5dcfdfbd9f","unresolved":false,"context_lines":[{"line_number":4348,"context_line":"                                            instance_uuid,"},{"line_number":4349,"context_line":"                                            connector[\u0027host\u0027],"},{"line_number":4350,"context_line":"                                            mountpoint,"},{"line_number":4351,"context_line":"                                            results[\u0027data\u0027][\u0027access_mode\u0027])"},{"line_number":4352,"context_line":"        attachment \u003d objects.VolumeAttachment.get_by_id(context,"},{"line_number":4353,"context_line":"                                                        attach_results[\u0027id\u0027])"},{"line_number":4354,"context_line":"        self.db.attach_specs_update_or_create("}],"source_content_type":"text/x-python","patch_set":16,"id":"5a8bc5a2_c5eefcb3","line":4351,"in_reply_to":"5a8bc5a2_7ec35689","updated":"2016-09-28 04:00:48.000000000","message":"Please look at line #4357, that\u0027s what I\u0027m doing right there","commit_id":"e9a229bcf24865a40cfa22d3f7155f784f7cc08c"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"032b1018a335e6b20664719ba665a24312c12892","unresolved":false,"context_lines":[{"line_number":4527,"context_line":"    def secure_file_operations_enabled(self, ctxt, volume):"},{"line_number":4528,"context_line":"        return self.manager.secure_file_operations_enabled(ctxt, volume)"},{"line_number":4529,"context_line":""},{"line_number":4530,"context_line":"    def create_attachment(self, ctxt, volume_id, connector, instance_uuid,"},{"line_number":4531,"context_line":"                          mountpoint, no_connect\u003dFalse,"},{"line_number":4532,"context_line":"                          completion_wait\u003dFalse):"},{"line_number":4533,"context_line":"        return self.manager.create_attachment(ctxt, volume_id, connector,"},{"line_number":4534,"context_line":"                                              instance_uuid, mountpoint,"},{"line_number":4535,"context_line":"                                              no_connect\u003dno_connect,"},{"line_number":4536,"context_line":"                                              completion_wait\u003dcompletion_wait)"},{"line_number":4537,"context_line":""},{"line_number":4538,"context_line":"    def update_attachment(self, ctxt, volume_id, connector, instance_uuid,"},{"line_number":4539,"context_line":"                          mountpoint, attachment_id):"},{"line_number":4540,"context_line":"        return self.manager.update_attachment(ctxt, volume_id, connector,"},{"line_number":4541,"context_line":"                                              instance_uuid, mountpoint,"},{"line_number":4542,"context_line":"                                              attachment_id\u003dattachment_id)"},{"line_number":4543,"context_line":""},{"line_number":4544,"context_line":"    def remove_attachment(self, ctxt, volume_id, attachment_id):"},{"line_number":4545,"context_line":"        return self.manager.remove_attachment(ctxt, volume_id, attachment_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a95cdbc_09cac8a1","line":4545,"range":{"start_line":4530,"start_character":0,"end_line":4545,"end_character":77},"updated":"2016-10-04 18:05:11.000000000","message":"Yeah, sorry about that, cleanup patches [1], [2] are out there.\n\n[1] https://review.openstack.org/#/c/372405/\n[2] https://review.openstack.org/#/c/371447/","commit_id":"1e47a0af983a0715307275f9d8ec4b354ced6d3d"}],"cinder/volume/rpcapi.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"927a1d7d56379773170dca44709d832f3c281eac","unresolved":false,"context_lines":[{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def create_attachment(self, ctxt, volume, connector, instance_uuid,"},{"line_number":339,"context_line":"                          mountpoint):"},{"line_number":340,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":341,"context_line":"        return cctxt.call(ctxt, \u0027create_attachment\u0027,"},{"line_number":342,"context_line":"                          volume_id\u003dvolume[\u0027id\u0027],"},{"line_number":343,"context_line":"                          connector\u003dconnector,"}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_44024d0c","line":340,"range":{"start_line":340,"start_character":48,"end_line":340,"end_character":53},"updated":"2016-07-20 14:22:36.000000000","message":"It\u0027s 2.4 now.","commit_id":"4d699d52cf1b5a7731fb4c7546097c45fabd8db0"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7d40b0214a9e4cde03f18e9e24d94b70c7879ab8","unresolved":false,"context_lines":[{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def create_attachment(self, ctxt, volume, connector, instance_uuid,"},{"line_number":339,"context_line":"                          mountpoint):"},{"line_number":340,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":341,"context_line":"        return cctxt.call(ctxt, \u0027create_attachment\u0027,"},{"line_number":342,"context_line":"                          volume_id\u003dvolume[\u0027id\u0027],"},{"line_number":343,"context_line":"                          connector\u003dconnector,"}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_5321b0fa","line":340,"range":{"start_line":340,"start_character":48,"end_line":340,"end_character":53},"in_reply_to":"dada55a8_44024d0c","updated":"2016-07-26 00:52:48.000000000","message":"Done","commit_id":"4d699d52cf1b5a7731fb4c7546097c45fabd8db0"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"927a1d7d56379773170dca44709d832f3c281eac","unresolved":false,"context_lines":[{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def remove_attachment(self, ctxt, volume, connector, instance_uuid,"},{"line_number":348,"context_line":"                          mountpoint):"},{"line_number":349,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":350,"context_line":"        return cctxt.call(ctxt, \u0027remove_attachment\u0027,"},{"line_number":351,"context_line":"                          volume_id\u003dvolume[\u0027id\u0027],"},{"line_number":352,"context_line":"                          connector\u003dconnector,"}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_7f06fc1d","line":349,"range":{"start_line":349,"start_character":48,"end_line":349,"end_character":53},"updated":"2016-07-20 14:22:36.000000000","message":"ditto","commit_id":"4d699d52cf1b5a7731fb4c7546097c45fabd8db0"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7d40b0214a9e4cde03f18e9e24d94b70c7879ab8","unresolved":false,"context_lines":[{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def remove_attachment(self, ctxt, volume, connector, instance_uuid,"},{"line_number":348,"context_line":"                          mountpoint):"},{"line_number":349,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], \u00272.3\u0027)"},{"line_number":350,"context_line":"        return cctxt.call(ctxt, \u0027remove_attachment\u0027,"},{"line_number":351,"context_line":"                          volume_id\u003dvolume[\u0027id\u0027],"},{"line_number":352,"context_line":"                          connector\u003dconnector,"}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_331cfcc0","line":349,"range":{"start_line":349,"start_character":48,"end_line":349,"end_character":53},"in_reply_to":"dada55a8_7f06fc1d","updated":"2016-07-26 00:52:48.000000000","message":"Done","commit_id":"4d699d52cf1b5a7731fb4c7546097c45fabd8db0"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"032b1018a335e6b20664719ba665a24312c12892","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        2.1  - Add get_manageable_volumes() and get_manageable_snapshots()."},{"line_number":100,"context_line":"        2.2  - Adds support for sending objects over RPC in manage_existing()."},{"line_number":101,"context_line":"        2.3  - Adds support for sending objects over RPC in"},{"line_number":102,"context_line":"               initialize_connection()."},{"line_number":103,"context_line":"        2.4  - Sends request_spec as object in create_volume()."},{"line_number":104,"context_line":"        2.5  - Adds create_group, delete_group, and update_group"},{"line_number":105,"context_line":"        2.6  - Adds create_group_snapshot, delete_group_snapshot, and"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a95cdbc_e9303ca1","side":"PARENT","line":102,"range":{"start_line":102,"start_character":0,"end_line":102,"end_character":39},"updated":"2016-10-04 18:05:11.000000000","message":"I guess you\u0027re not rewriting history? ;)","commit_id":"3499070caa0001cf05beb57e5e9bfa460a27560c"}]}
