)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"8e7a264748d3328f46f2ae4b7b188f045c309161","unresolved":false,"context_lines":[{"line_number":16,"context_line":"We only mark volumes as unsafe if they are already managed"},{"line_number":17,"context_line":"or connected to hosts. For snapshots it is only if they"},{"line_number":18,"context_line":"are already managed by cinder."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I91d808021995921fa51a9f99e3a1e9c7091af865"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3ac371cc_10a8f31e","line":19,"updated":"2016-08-15 21:12:04.000000000","message":"Does this need a DocImpact?","commit_id":"327e06af9841143d1b40de5d21c78a0f2f059e16"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"e595457290218a22bf4be756ea8c766441e14805","unresolved":false,"context_lines":[{"line_number":16,"context_line":"We only mark volumes as unsafe if they are already managed"},{"line_number":17,"context_line":"or connected to hosts. For snapshots it is only if they"},{"line_number":18,"context_line":"are already managed by cinder."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I91d808021995921fa51a9f99e3a1e9c7091af865"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3ac371cc_cbe4f00e","line":19,"in_reply_to":"3ac371cc_10a8f31e","updated":"2016-08-15 21:26:33.000000000","message":"I don\u0027t think so, its just implementing an existing cinder feature (that should already be documented... or have its own DocImpact bug around).\n\nI wasn\u0027t planning to update the upstream docs for this change.","commit_id":"327e06af9841143d1b40de5d21c78a0f2f059e16"}],"cinder/tests/unit/volume/drivers/test_pure.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2bc5361688bc25bd30d8e8a304924627bb7b043d","unresolved":false,"context_lines":[{"line_number":1740,"context_line":"    def test_get_manageable_snapshots(self):"},{"line_number":1741,"context_line":"        \"\"\"Default success case."},{"line_number":1742,"context_line":""},{"line_number":1743,"context_line":"        Given a list of pure volumes from the REST API, give back a list"},{"line_number":1744,"context_line":"        of volume references."},{"line_number":1745,"context_line":"        \"\"\""},{"line_number":1746,"context_line":"        self._test_get_manageable_things("}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_48d50241","line":1743,"updated":"2016-08-06 02:15:59.000000000","message":"s/volumes/snapshots","commit_id":"3d291bc0596575955999077585d220e5c59b486e"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2bc5361688bc25bd30d8e8a304924627bb7b043d","unresolved":false,"context_lines":[{"line_number":1741,"context_line":"        \"\"\"Default success case."},{"line_number":1742,"context_line":""},{"line_number":1743,"context_line":"        Given a list of pure volumes from the REST API, give back a list"},{"line_number":1744,"context_line":"        of volume references."},{"line_number":1745,"context_line":"        \"\"\""},{"line_number":1746,"context_line":"        self._test_get_manageable_things("},{"line_number":1747,"context_line":"            pure_objs\u003dMANAGEABLE_PURE_SNAPS,"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_88cb7aa3","line":1744,"updated":"2016-08-06 02:15:59.000000000","message":"snapshot","commit_id":"3d291bc0596575955999077585d220e5c59b486e"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2bc5361688bc25bd30d8e8a304924627bb7b043d","unresolved":false,"context_lines":[{"line_number":1779,"context_line":"        )"},{"line_number":1780,"context_line":""},{"line_number":1781,"context_line":"    def test_get_manageable_snapshots_no_pure_snapshots(self):"},{"line_number":1782,"context_line":"        \"\"\"Expect no refs to be found if no volumes are on Purity.\"\"\""},{"line_number":1783,"context_line":"        self._test_get_manageable_things(pure_objs\u003d[],"},{"line_number":1784,"context_line":"                                         expected_refs\u003d[],"},{"line_number":1785,"context_line":"                                         pure_hosts\u003d[PURE_HOST],"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_e874b668","line":1782,"updated":"2016-08-06 02:15:59.000000000","message":"snapshots","commit_id":"3d291bc0596575955999077585d220e5c59b486e"}],"cinder/volume/drivers/pure.py":[{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"86ae5fcb0c137717d6a544a62756ee6cd223e339","unresolved":false,"context_lines":[{"line_number":1002,"context_line":"        hosts_with_connections \u003d array.list_hosts(all\u003dTrue)"},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"        # Put together a map of volumes that are connected to hosts"},{"line_number":1005,"context_line":"        connected_vols \u003d {}"},{"line_number":1006,"context_line":"        for host in hosts_with_connections:"},{"line_number":1007,"context_line":"            vol \u003d host.get(\u0027vol\u0027, None)"},{"line_number":1008,"context_line":"            if vol:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ad45d7e_e37eed17","line":1005,"updated":"2016-08-10 12:35:22.000000000","message":"Can replace with something like:\n\nconnected_vols \u003d [host.get(\u0027vol\u0027) for host in hosts_with_connections if \u0027vol\u0027 in host]\n\n(Easy list comprehension since you don\u0027t use the values in the dict)","commit_id":"dfa5a11998cc0ffb0636d8559b90f8a011cfdc8b"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"60403c6e8467ca5cfe9f64c565fe98629d3c03b9","unresolved":false,"context_lines":[{"line_number":1002,"context_line":"        hosts_with_connections \u003d array.list_hosts(all\u003dTrue)"},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"        # Put together a map of volumes that are connected to hosts"},{"line_number":1005,"context_line":"        connected_vols \u003d {}"},{"line_number":1006,"context_line":"        for host in hosts_with_connections:"},{"line_number":1007,"context_line":"            vol \u003d host.get(\u0027vol\u0027, None)"},{"line_number":1008,"context_line":"            if vol:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ac371cc_bf9f60b3","line":1005,"in_reply_to":"9ad45d7e_e37eed17","updated":"2016-08-14 20:38:24.000000000","message":"I think I\u0027ll leave it as-is. We do use the values in the dictionary for the reason_not_safe message, and even though its not as pythonic I like the more explicit/verbose code. Mostly style preference there though.","commit_id":"dfa5a11998cc0ffb0636d8559b90f8a011cfdc8b"},{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"86ae5fcb0c137717d6a544a62756ee6cd223e339","unresolved":false,"context_lines":[{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":"        # Put together a map of existing cinder volumes on the array"},{"line_number":1012,"context_line":"        # so we can lookup cinder id\u0027s by purity volume names"},{"line_number":1013,"context_line":"        existing_vols \u003d {}"},{"line_number":1014,"context_line":"        for cinder_vol in cinder_volumes:"},{"line_number":1015,"context_line":"            existing_vols[self._get_vol_name(cinder_vol)] \u003d cinder_vol"},{"line_number":1016,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9ad45d7e_a37a3575","line":1013,"updated":"2016-08-10 12:35:22.000000000","message":"Can replace with something like:\n\nexisting_vols \u003d {self._get_vol_name(cinder_vol)]: cinder_vol.name_id for cinder_vol in cinder_volumes}","commit_id":"dfa5a11998cc0ffb0636d8559b90f8a011cfdc8b"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"60403c6e8467ca5cfe9f64c565fe98629d3c03b9","unresolved":false,"context_lines":[{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":"        # Put together a map of existing cinder volumes on the array"},{"line_number":1012,"context_line":"        # so we can lookup cinder id\u0027s by purity volume names"},{"line_number":1013,"context_line":"        existing_vols \u003d {}"},{"line_number":1014,"context_line":"        for cinder_vol in cinder_volumes:"},{"line_number":1015,"context_line":"            existing_vols[self._get_vol_name(cinder_vol)] \u003d cinder_vol"},{"line_number":1016,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3ac371cc_ffa9d8e0","line":1013,"in_reply_to":"9ad45d7e_a37a3575","updated":"2016-08-14 20:38:24.000000000","message":"Similar to above, I prefer the other style... we have to split that one-liner up anyway since its \u003e80 chars, so we don\u0027t gain much other than pythonic-ness.\n\nI will swap the dict value for the id though instead of the whole volume object, thats a nice improvement.","commit_id":"dfa5a11998cc0ffb0636d8559b90f8a011cfdc8b"},{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"86ae5fcb0c137717d6a544a62756ee6cd223e339","unresolved":false,"context_lines":[{"line_number":1017,"context_line":"        manageable_vols \u003d []"},{"line_number":1018,"context_line":"        for pure_vol in pure_vols:"},{"line_number":1019,"context_line":"            vol_name \u003d pure_vol[\u0027name\u0027]"},{"line_number":1020,"context_line":"            cinder_vol \u003d existing_vols.get(vol_name, None)"},{"line_number":1021,"context_line":"            cinder_id \u003d None"},{"line_number":1022,"context_line":"            is_safe \u003d True"},{"line_number":1023,"context_line":"            reason_not_safe \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ad45d7e_234da5c4","line":1020,"updated":"2016-08-10 12:35:22.000000000","message":"If you went with the above suggestion then you don\u0027t need cinder_vol anymore, just:\n\ncinder_id \u003d existing_vols.get(vol_name)\n\nAnd later \"if cinder_id\" instead of \"if cinder_vol\"","commit_id":"dfa5a11998cc0ffb0636d8559b90f8a011cfdc8b"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"60403c6e8467ca5cfe9f64c565fe98629d3c03b9","unresolved":false,"context_lines":[{"line_number":1017,"context_line":"        manageable_vols \u003d []"},{"line_number":1018,"context_line":"        for pure_vol in pure_vols:"},{"line_number":1019,"context_line":"            vol_name \u003d pure_vol[\u0027name\u0027]"},{"line_number":1020,"context_line":"            cinder_vol \u003d existing_vols.get(vol_name, None)"},{"line_number":1021,"context_line":"            cinder_id \u003d None"},{"line_number":1022,"context_line":"            is_safe \u003d True"},{"line_number":1023,"context_line":"            reason_not_safe \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ac371cc_9fb9c431","line":1020,"in_reply_to":"9ad45d7e_234da5c4","updated":"2016-08-14 20:38:24.000000000","message":"Done","commit_id":"dfa5a11998cc0ffb0636d8559b90f8a011cfdc8b"},{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"86ae5fcb0c137717d6a544a62756ee6cd223e339","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"                reason_not_safe \u003d _(\u0027Volume already managed.\u0027)"},{"line_number":1034,"context_line":""},{"line_number":1035,"context_line":"            manageable_vols.append({"},{"line_number":1036,"context_line":"                \u0027reference\u0027: vol_name,"},{"line_number":1037,"context_line":"                \u0027size\u0027: self._round_bytes_to_gib(pure_vol[\u0027size\u0027]),"},{"line_number":1038,"context_line":"                \u0027safe_to_manage\u0027: is_safe,"},{"line_number":1039,"context_line":"                \u0027reason_not_safe\u0027: reason_not_safe,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ad45d7e_4306d91d","line":1036,"updated":"2016-08-10 12:35:22.000000000","message":"It seems that in this driver manage_existing() expects a reference of the form {\u0027name\u0027: \u003cname\u003e}, so it should be returned here as such.","commit_id":"dfa5a11998cc0ffb0636d8559b90f8a011cfdc8b"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"60403c6e8467ca5cfe9f64c565fe98629d3c03b9","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"                reason_not_safe \u003d _(\u0027Volume already managed.\u0027)"},{"line_number":1034,"context_line":""},{"line_number":1035,"context_line":"            manageable_vols.append({"},{"line_number":1036,"context_line":"                \u0027reference\u0027: vol_name,"},{"line_number":1037,"context_line":"                \u0027size\u0027: self._round_bytes_to_gib(pure_vol[\u0027size\u0027]),"},{"line_number":1038,"context_line":"                \u0027safe_to_manage\u0027: is_safe,"},{"line_number":1039,"context_line":"                \u0027reason_not_safe\u0027: reason_not_safe,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ac371cc_3f9370a5","line":1036,"in_reply_to":"9ad45d7e_4306d91d","updated":"2016-08-14 20:38:24.000000000","message":"Done","commit_id":"dfa5a11998cc0ffb0636d8559b90f8a011cfdc8b"},{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"86ae5fcb0c137717d6a544a62756ee6cd223e339","unresolved":false,"context_lines":[{"line_number":1054,"context_line":"        # so we can lookup cinder id\u0027s by purity snapshot names"},{"line_number":1055,"context_line":"        existing_snapshots \u003d {}"},{"line_number":1056,"context_line":"        for cinder_snap in cinder_snapshots:"},{"line_number":1057,"context_line":"            existing_snapshots[self._get_snap_name(cinder_snap)] \u003d cinder_snap"},{"line_number":1058,"context_line":""},{"line_number":1059,"context_line":"        manageable_snaps \u003d []"},{"line_number":1060,"context_line":"        for pure_snap in pure_snapshots:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ad45d7e_439c190f","line":1057,"updated":"2016-08-10 12:35:22.000000000","message":"Again this can be a dict comprehension","commit_id":"dfa5a11998cc0ffb0636d8559b90f8a011cfdc8b"},{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"86ae5fcb0c137717d6a544a62756ee6cd223e339","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"        manageable_snaps \u003d []"},{"line_number":1060,"context_line":"        for pure_snap in pure_snapshots:"},{"line_number":1061,"context_line":"            snap_name \u003d pure_snap[\u0027name\u0027]"},{"line_number":1062,"context_line":"            cinder_snapshot \u003d existing_snapshots.get(snap_name, None)"},{"line_number":1063,"context_line":"            cinder_id \u003d None"},{"line_number":1064,"context_line":"            is_safe \u003d True"},{"line_number":1065,"context_line":"            reason_not_safe \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ad45d7e_83a29149","line":1062,"updated":"2016-08-10 12:35:22.000000000","message":"No need for \", None\" in get method (everywhere)","commit_id":"dfa5a11998cc0ffb0636d8559b90f8a011cfdc8b"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"60403c6e8467ca5cfe9f64c565fe98629d3c03b9","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"        manageable_snaps \u003d []"},{"line_number":1060,"context_line":"        for pure_snap in pure_snapshots:"},{"line_number":1061,"context_line":"            snap_name \u003d pure_snap[\u0027name\u0027]"},{"line_number":1062,"context_line":"            cinder_snapshot \u003d existing_snapshots.get(snap_name, None)"},{"line_number":1063,"context_line":"            cinder_id \u003d None"},{"line_number":1064,"context_line":"            is_safe \u003d True"},{"line_number":1065,"context_line":"            reason_not_safe \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ac371cc_7f8de87a","line":1062,"in_reply_to":"9ad45d7e_83a29149","updated":"2016-08-14 20:38:24.000000000","message":"Done","commit_id":"dfa5a11998cc0ffb0636d8559b90f8a011cfdc8b"},{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"86ae5fcb0c137717d6a544a62756ee6cd223e339","unresolved":false,"context_lines":[{"line_number":1070,"context_line":"                reason_not_safe \u003d _(\"Snapshot already managed.\")"},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"            manageable_snaps.append({"},{"line_number":1073,"context_line":"                \u0027reference\u0027: snap_name,"},{"line_number":1074,"context_line":"                \u0027size\u0027: self._round_bytes_to_gib(pure_snap[\u0027size\u0027]),"},{"line_number":1075,"context_line":"                \u0027safe_to_manage\u0027: is_safe,"},{"line_number":1076,"context_line":"                \u0027reason_not_safe\u0027: reason_not_safe,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ad45d7e_f646a94d","line":1073,"updated":"2016-08-10 12:35:22.000000000","message":"Same comment as above, should be {\u0027name\u0027: snap_name}","commit_id":"dfa5a11998cc0ffb0636d8559b90f8a011cfdc8b"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"60403c6e8467ca5cfe9f64c565fe98629d3c03b9","unresolved":false,"context_lines":[{"line_number":1070,"context_line":"                reason_not_safe \u003d _(\"Snapshot already managed.\")"},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"            manageable_snaps.append({"},{"line_number":1073,"context_line":"                \u0027reference\u0027: snap_name,"},{"line_number":1074,"context_line":"                \u0027size\u0027: self._round_bytes_to_gib(pure_snap[\u0027size\u0027]),"},{"line_number":1075,"context_line":"                \u0027safe_to_manage\u0027: is_safe,"},{"line_number":1076,"context_line":"                \u0027reason_not_safe\u0027: reason_not_safe,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ac371cc_dfe85c19","line":1073,"in_reply_to":"9ad45d7e_f646a94d","updated":"2016-08-14 20:38:24.000000000","message":"Done","commit_id":"dfa5a11998cc0ffb0636d8559b90f8a011cfdc8b"}],"releasenotes/notes/pure-list-mangeable-fed4a1b23212f545.yaml":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"210601c129cf9cec465ff4c5c0678f3bfb619d02","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Add get_manageable_volumes and get_manageable_snapshots implementations for"},{"line_number":4,"context_line":"    Pure Storage Volume Drivers."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"fa7ab95a_d68addbe","line":3,"range":{"start_line":3,"start_character":8,"end_line":3,"end_character":30},"updated":"2016-08-28 18:22:30.000000000","message":"The method names might not mean as much to end users reading the release notes as a description of the functionality it provides, but I think at least the method names are named well enough that they can likely figure it out if they care.","commit_id":"73d2b55352e5924fe4fa93548b549c00f63ad12e"}]}
