)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP - Replication V2 for Pure Storage"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implementing replication V2 for Pure Storage driver."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Implements: bp pure-v2-replication"},{"line_number":12,"context_line":"Change-Id: I69e567143b65e92f89969ff5036c4f242c17a1dd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"fa1b9901_ca051a14","line":9,"updated":"2015-08-21 03:21:12.000000000","message":"We should flesh this out a bit with some description of what we are doing and any config options needed.","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":17444,"name":"Jay.Shen","email":"shenhong09@huawei.com","username":"Jay.Shen"},"change_message_id":"b15e2683898922eae3ce0fef5d80e4b54b9a71da","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"The above settings will cause a protection group to be created between"},{"line_number":27,"context_line":"the two flash arrays. It will replicate any volumes placed in it with"},{"line_number":28,"context_line":"settings that cause a volume to replicated every 15 mins (900s).  All"},{"line_number":29,"context_line":"snapshots will be kept for 4 hours (14400s).  Then 3 snapshots per day"},{"line_number":30,"context_line":"will be kept for 7 days."},{"line_number":31,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"fa1b9901_c936c150","line":28,"updated":"2015-08-26 03:03:34.000000000","message":"to be replicated ?","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"a1f7d10d8623b3515072f40de6b4e2676a650ac2","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"The above settings will cause a protection group to be created between"},{"line_number":27,"context_line":"the two flash arrays. It will replicate any volumes placed in it with"},{"line_number":28,"context_line":"settings that cause a volume to replicated every 15 mins (900s).  All"},{"line_number":29,"context_line":"snapshots will be kept for 4 hours (14400s).  Then 3 snapshots per day"},{"line_number":30,"context_line":"will be kept for 7 days."},{"line_number":31,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"da20952f_be4af8aa","line":28,"in_reply_to":"fa1b9901_c936c150","updated":"2015-08-27 20:06:23.000000000","message":"Done","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"ef21dc535ccabd25e62c7ad270797d8e455293da","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Mudassir Latif \u003cmudassir.latif@purestorage.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-09-04 11:48:10 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Replication V2 for Pure Storage"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This implementation utilizes Pure Storage Protection Groups to"},{"line_number":10,"context_line":"replicate volumes natively between Pure Storage backends."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"9a1a9d01_867aa6bb","line":7,"updated":"2015-10-01 05:50:37.000000000","message":"The patch also touches things other than Pure driver. Please update the commit accordingly. Thanks","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"fe2e46d4f808508b630a5dbef1875ee023b61812","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Mudassir Latif \u003cmudassir.latif@purestorage.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-09-04 11:48:10 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Replication V2 for Pure Storage"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This implementation utilizes Pure Storage Protection Groups to"},{"line_number":10,"context_line":"replicate volumes natively between Pure Storage backends."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"7a740942_6525afc0","line":7,"in_reply_to":"9a1a9d01_867aa6bb","updated":"2015-12-22 18:28:37.000000000","message":"added the other review as dependency ( https://review.openstack.org/#/c/219900/ )","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"515a80025f357f1b8f292c20230343ce56fa5610","unresolved":false,"context_lines":[{"line_number":16,"context_line":"[puredriver-1]"},{"line_number":17,"context_line":"volume_backend_name \u003d puredriver-1"},{"line_number":18,"context_line":"..."},{"line_number":19,"context_line":"managed_replication_target\u003dFalse"},{"line_number":20,"context_line":"replication_devices\u003d{san_ip\u003d\u003cip-address\u003e api_token\u003d\u003ctoken\u003e}"},{"line_number":21,"context_line":"pure_replica_interval_default \u003d 900"},{"line_number":22,"context_line":"pure_replica_retention_short_term_default \u003d 14400"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"1a7b0d38_323c1493","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":32},"updated":"2015-12-23 01:09:14.000000000","message":"This is no longer applicable for a single backend","commit_id":"e62a5564bfb783b411db9d1890ab80f5bf7a05a0"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"8fa698cd14799e1e7b36f6537bb0a89ee97a4c1b","unresolved":false,"context_lines":[{"line_number":16,"context_line":"[puredriver-1]"},{"line_number":17,"context_line":"volume_backend_name \u003d puredriver-1"},{"line_number":18,"context_line":"..."},{"line_number":19,"context_line":"managed_replication_target\u003dFalse"},{"line_number":20,"context_line":"replication_devices\u003d{san_ip\u003d\u003cip-address\u003e api_token\u003d\u003ctoken\u003e}"},{"line_number":21,"context_line":"pure_replica_interval_default \u003d 900"},{"line_number":22,"context_line":"pure_replica_retention_short_term_default \u003d 14400"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"fa69d971_6a2e48a6","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":32},"in_reply_to":"1a7b0d38_323c1493","updated":"2016-01-07 19:18:01.000000000","message":"Done","commit_id":"e62a5564bfb783b411db9d1890ab80f5bf7a05a0"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"4e306a0835df0744f85d9717c26ca797738b76b4","unresolved":false,"context_lines":[{"line_number":16,"context_line":"[puredriver-1]"},{"line_number":17,"context_line":"volume_backend_name \u003d puredriver-1"},{"line_number":18,"context_line":"..."},{"line_number":19,"context_line":"replication_device \u003d device_target_id:\u003carray_name\u003e,"},{"line_number":20,"context_line":"                     managed_backend_name:pure-driver2,"},{"line_number":21,"context_line":"                     san_ip:\u003cip_address\u003e,"},{"line_number":22,"context_line":"                     api_token:\u003cauthentication_token\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"fa69d971_a03bca9b","line":19,"range":{"start_line":19,"start_character":21,"end_line":19,"end_character":37},"updated":"2016-01-08 00:38:04.000000000","message":"target_device_id","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"b7c4cd1f3b500846d0744a05ef6f11c6a50b44f7","unresolved":false,"context_lines":[{"line_number":16,"context_line":"[puredriver-1]"},{"line_number":17,"context_line":"volume_backend_name \u003d puredriver-1"},{"line_number":18,"context_line":"..."},{"line_number":19,"context_line":"replication_device \u003d device_target_id:\u003carray_name\u003e,"},{"line_number":20,"context_line":"                     managed_backend_name:pure-driver2,"},{"line_number":21,"context_line":"                     san_ip:\u003cip_address\u003e,"},{"line_number":22,"context_line":"                     api_token:\u003cauthentication_token\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"da6ed579_4bed3124","line":19,"range":{"start_line":19,"start_character":21,"end_line":19,"end_character":37},"in_reply_to":"fa69d971_a03bca9b","updated":"2016-01-14 21:52:34.000000000","message":"Done.","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d3863814b58dce0fa62ee2e3a047367488377ca7","unresolved":false,"context_lines":[{"line_number":16,"context_line":"[puredriver-1]"},{"line_number":17,"context_line":"volume_backend_name \u003d puredriver-1"},{"line_number":18,"context_line":"..."},{"line_number":19,"context_line":"replication_device \u003d target_device_id:\u003cunique_array_id\u003e,"},{"line_number":20,"context_line":"                     managed_backend_name:puredriver-2,"},{"line_number":21,"context_line":"                     san_ip:\u003cip_address\u003e,"},{"line_number":22,"context_line":"                     api_token:\u003cauthentication_token\u003e"},{"line_number":23,"context_line":"pure_replica_interval_default \u003d 900"},{"line_number":24,"context_line":"pure_replica_retention_short_term_default \u003d 14400"},{"line_number":25,"context_line":"pure_replica_retention_long_term_per_day_default \u003d 3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"da6ed579_3e7e6f6a","line":22,"range":{"start_line":19,"start_character":0,"end_line":22,"end_character":53},"updated":"2016-01-15 06:07:57.000000000","message":"To avoid any confusion later on lets add a note here that this target device can be another managed cinder backend, you just have to specify this information again anyway, we don\u0027t read the config from the other backend definition (yet)","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"1ddf4a749d7c01af4c19c8a019958ad7c977d2dd","unresolved":false,"context_lines":[{"line_number":16,"context_line":"[puredriver-1]"},{"line_number":17,"context_line":"volume_backend_name \u003d puredriver-1"},{"line_number":18,"context_line":"..."},{"line_number":19,"context_line":"replication_device \u003d target_device_id:\u003cunique_array_id\u003e,"},{"line_number":20,"context_line":"                     managed_backend_name:puredriver-2,"},{"line_number":21,"context_line":"                     san_ip:\u003cip_address\u003e,"},{"line_number":22,"context_line":"                     api_token:\u003cauthentication_token\u003e"},{"line_number":23,"context_line":"pure_replica_interval_default \u003d 900"},{"line_number":24,"context_line":"pure_replica_retention_short_term_default \u003d 14400"},{"line_number":25,"context_line":"pure_replica_retention_long_term_per_day_default \u003d 3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"da6ed579_484572b1","line":22,"range":{"start_line":19,"start_character":0,"end_line":22,"end_character":53},"in_reply_to":"da6ed579_3e7e6f6a","updated":"2016-01-21 04:12:06.000000000","message":"Done","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":11224,"name":"Swami Reddy","email":"swamireddy@gmail.com","username":"swamireddy"},"change_message_id":"17bbc61be6694eb2b096255dd9733dc0ce4f80d4","unresolved":false,"context_lines":[{"line_number":37,"context_line":"Note that replication-failover is supported from primary to any of"},{"line_number":38,"context_line":"multiple secondary arrays, but subsequent replication-failover is"},{"line_number":39,"context_line":"only supported back to the original primary."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Implements: bp pure-v2-replication"},{"line_number":42,"context_line":"Change-Id: I69e567143b65e92f89969ff5036c4f242c17a1dd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"9a68dd71_9dfc2ab9","line":40,"updated":"2016-01-25 18:11:47.000000000","message":"Add \"DocImpact\" flag, as this is a new functionality where doc changes required.","commit_id":"767e8c8de09b56d10c680f858b379de9f6ae93ea"}],"cinder/tests/unit/test_pure.py":[{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"251cda06a0bc9ee2c131704c3710b7f9ccfa4672","unresolved":false,"context_lines":[{"line_number":1826,"context_line":""},{"line_number":1827,"context_line":"    @mock.patch(\u0027cinder.volume.volume_types.get_volume_type\u0027)"},{"line_number":1828,"context_line":"    @mock.patch(BASE_DRIVER_OBJ + \u0027._get_current_array\u0027)"},{"line_number":1829,"context_line":"    def test_replication_disable_not_replicated_type(self,"},{"line_number":1830,"context_line":"                                                     mock_get_array,"},{"line_number":1831,"context_line":"                                                     mock_get_volume_type):"},{"line_number":1832,"context_line":"        mock_get_volume_type.return_value \u003d NON_REPLICATED_VOL_TYPE"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_36b4667e","line":1829,"range":{"start_line":1829,"start_character":8,"end_line":1829,"end_character":52},"updated":"2016-01-14 22:22:38.000000000","message":"Since the check is done in the volume API, I don\u0027t think there is a need to test for non replicated type.","commit_id":"9ba16ec0b7799ae2052506d3078af9839a6c1421"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"59b60097b0d2956ce82f40ce5e3ee10db26da035","unresolved":false,"context_lines":[{"line_number":1826,"context_line":""},{"line_number":1827,"context_line":"    @mock.patch(\u0027cinder.volume.volume_types.get_volume_type\u0027)"},{"line_number":1828,"context_line":"    @mock.patch(BASE_DRIVER_OBJ + \u0027._get_current_array\u0027)"},{"line_number":1829,"context_line":"    def test_replication_disable_not_replicated_type(self,"},{"line_number":1830,"context_line":"                                                     mock_get_array,"},{"line_number":1831,"context_line":"                                                     mock_get_volume_type):"},{"line_number":1832,"context_line":"        mock_get_volume_type.return_value \u003d NON_REPLICATED_VOL_TYPE"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_40ceeb63","line":1829,"range":{"start_line":1829,"start_character":8,"end_line":1829,"end_character":52},"in_reply_to":"da6ed579_36b4667e","updated":"2016-01-15 03:08:23.000000000","message":"makes sense. Removing this test","commit_id":"9ba16ec0b7799ae2052506d3078af9839a6c1421"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d3863814b58dce0fa62ee2e3a047367488377ca7","unresolved":false,"context_lines":[{"line_number":1485,"context_line":"        mock_replication_disable.assert_called_with(context, volume)"},{"line_number":1486,"context_line":""},{"line_number":1487,"context_line":"    def test_get_arrays(self):"},{"line_number":1488,"context_line":"        volume \u003d deepcopy(VOLUME)"},{"line_number":1489,"context_line":"        # Test case where only single array, it\u0027s the one we\u0027re looking for"},{"line_number":1490,"context_line":"        volume[\"provider_location\"] \u003d GET_ARRAY_PRIMARY[\"id\"]"},{"line_number":1491,"context_line":"        rslt_primary, rslt_secondary \u003d self.driver._get_arrays(volume)"},{"line_number":1492,"context_line":"        self.assertEqual(self.array, rslt_primary)"},{"line_number":1493,"context_line":"        self.assertEqual(0, len(rslt_secondary))"},{"line_number":1494,"context_line":""},{"line_number":1495,"context_line":"        # Test case where only single array, it\u0027s not the one we\u0027re looking for"},{"line_number":1496,"context_line":"        volume[\"provider_location\"] \u003d \"won\u0027t find me\""},{"line_number":1497,"context_line":"        rslt_primary, rslt_secondary \u003d self.driver._get_arrays(volume)"},{"line_number":1498,"context_line":"        self.assertEqual(self.array, rslt_primary)"},{"line_number":1499,"context_line":"        self.assertEqual(0, len(rslt_secondary))"},{"line_number":1500,"context_line":""},{"line_number":1501,"context_line":"        # Test case where no primary is configured,"},{"line_number":1502,"context_line":"        del volume[\"provider_location\"]"},{"line_number":1503,"context_line":"        rslt_primary, rslt_secondary \u003d self.driver._get_arrays(volume)"},{"line_number":1504,"context_line":"        self.assertEqual(self.array, rslt_primary)"},{"line_number":1505,"context_line":"        self.assertEqual(0, len(rslt_secondary))"},{"line_number":1506,"context_line":""},{"line_number":1507,"context_line":"        # Test case where 2 arrays, volume is failed over to secondary"},{"line_number":1508,"context_line":"        volume[\"provider_location\"] \u003d GET_ARRAY_SECONDARY[\"id\"]"},{"line_number":1509,"context_line":"        self.array.array_name \u003d GET_ARRAY_PRIMARY[\"array_name\"]"},{"line_number":1510,"context_line":"        self.driver._replication_target_arrays \u003d [self.array2]"},{"line_number":1511,"context_line":"        rslt_primary, rslt_secondary \u003d self.driver._get_arrays(volume)"},{"line_number":1512,"context_line":"        self.assertEqual(self.array2, rslt_primary)"},{"line_number":1513,"context_line":"        self.assertListEqual([self.array], rslt_secondary)"},{"line_number":1514,"context_line":""},{"line_number":1515,"context_line":"        # Test case where 2 arrays, provider_location is primary"},{"line_number":1516,"context_line":"        volume[\"provider_location\"] \u003d GET_ARRAY_PRIMARY[\"id\"]"},{"line_number":1517,"context_line":"        self.driver._replication_target_arrays \u003d [self.array2]"},{"line_number":1518,"context_line":"        rslt_primary, rslt_secondary \u003d self.driver._get_arrays(volume)"},{"line_number":1519,"context_line":"        self.assertEqual(self.array, rslt_primary)"},{"line_number":1520,"context_line":"        self.assertListEqual([self.array2], rslt_secondary)"},{"line_number":1521,"context_line":""},{"line_number":1522,"context_line":"    @mock.patch(\u0027cinder.volume.volume_types.get_volume_type\u0027)"},{"line_number":1523,"context_line":"    def test_is_vol_replicated_no_extra_specs(self, mock_get_vol_type):"}],"source_content_type":"text/x-python","patch_set":18,"id":"da6ed579_83506433","line":1520,"range":{"start_line":1488,"start_character":8,"end_line":1520,"end_character":59},"updated":"2016-01-15 06:07:57.000000000","message":"can you split these up into separate test methods?","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"1ddf4a749d7c01af4c19c8a019958ad7c977d2dd","unresolved":false,"context_lines":[{"line_number":1485,"context_line":"        mock_replication_disable.assert_called_with(context, volume)"},{"line_number":1486,"context_line":""},{"line_number":1487,"context_line":"    def test_get_arrays(self):"},{"line_number":1488,"context_line":"        volume \u003d deepcopy(VOLUME)"},{"line_number":1489,"context_line":"        # Test case where only single array, it\u0027s the one we\u0027re looking for"},{"line_number":1490,"context_line":"        volume[\"provider_location\"] \u003d GET_ARRAY_PRIMARY[\"id\"]"},{"line_number":1491,"context_line":"        rslt_primary, rslt_secondary \u003d self.driver._get_arrays(volume)"},{"line_number":1492,"context_line":"        self.assertEqual(self.array, rslt_primary)"},{"line_number":1493,"context_line":"        self.assertEqual(0, len(rslt_secondary))"},{"line_number":1494,"context_line":""},{"line_number":1495,"context_line":"        # Test case where only single array, it\u0027s not the one we\u0027re looking for"},{"line_number":1496,"context_line":"        volume[\"provider_location\"] \u003d \"won\u0027t find me\""},{"line_number":1497,"context_line":"        rslt_primary, rslt_secondary \u003d self.driver._get_arrays(volume)"},{"line_number":1498,"context_line":"        self.assertEqual(self.array, rslt_primary)"},{"line_number":1499,"context_line":"        self.assertEqual(0, len(rslt_secondary))"},{"line_number":1500,"context_line":""},{"line_number":1501,"context_line":"        # Test case where no primary is configured,"},{"line_number":1502,"context_line":"        del volume[\"provider_location\"]"},{"line_number":1503,"context_line":"        rslt_primary, rslt_secondary \u003d self.driver._get_arrays(volume)"},{"line_number":1504,"context_line":"        self.assertEqual(self.array, rslt_primary)"},{"line_number":1505,"context_line":"        self.assertEqual(0, len(rslt_secondary))"},{"line_number":1506,"context_line":""},{"line_number":1507,"context_line":"        # Test case where 2 arrays, volume is failed over to secondary"},{"line_number":1508,"context_line":"        volume[\"provider_location\"] \u003d GET_ARRAY_SECONDARY[\"id\"]"},{"line_number":1509,"context_line":"        self.array.array_name \u003d GET_ARRAY_PRIMARY[\"array_name\"]"},{"line_number":1510,"context_line":"        self.driver._replication_target_arrays \u003d [self.array2]"},{"line_number":1511,"context_line":"        rslt_primary, rslt_secondary \u003d self.driver._get_arrays(volume)"},{"line_number":1512,"context_line":"        self.assertEqual(self.array2, rslt_primary)"},{"line_number":1513,"context_line":"        self.assertListEqual([self.array], rslt_secondary)"},{"line_number":1514,"context_line":""},{"line_number":1515,"context_line":"        # Test case where 2 arrays, provider_location is primary"},{"line_number":1516,"context_line":"        volume[\"provider_location\"] \u003d GET_ARRAY_PRIMARY[\"id\"]"},{"line_number":1517,"context_line":"        self.driver._replication_target_arrays \u003d [self.array2]"},{"line_number":1518,"context_line":"        rslt_primary, rslt_secondary \u003d self.driver._get_arrays(volume)"},{"line_number":1519,"context_line":"        self.assertEqual(self.array, rslt_primary)"},{"line_number":1520,"context_line":"        self.assertListEqual([self.array2], rslt_secondary)"},{"line_number":1521,"context_line":""},{"line_number":1522,"context_line":"    @mock.patch(\u0027cinder.volume.volume_types.get_volume_type\u0027)"},{"line_number":1523,"context_line":"    def test_is_vol_replicated_no_extra_specs(self, mock_get_vol_type):"}],"source_content_type":"text/x-python","patch_set":18,"id":"da6ed579_6853966d","line":1520,"range":{"start_line":1488,"start_character":8,"end_line":1520,"end_character":59},"in_reply_to":"da6ed579_83506433","updated":"2016-01-21 04:12:06.000000000","message":"Done","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"}],"cinder/volume/api.py":[{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"9d667b84d376d7f7389e1acb19e7695fbf5843de","unresolved":false,"context_lines":[{"line_number":1616,"context_line":"        # call to driver regardless of replication_status, most likely"},{"line_number":1617,"context_line":"        # this indicates an issue with the driver, but might be useful"},{"line_number":1618,"context_line":"        # cases to  consider modifying this for in the future."},{"line_number":1619,"context_line":"        valid_rep_status \u003d [\u0027disabled\u0027, \u0027failed-over\u0027, \u0027error\u0027]"},{"line_number":1620,"context_line":"        rep_status \u003d volume.get(\u0027replication_status\u0027, valid_rep_status[0])"},{"line_number":1621,"context_line":""},{"line_number":1622,"context_line":"        if rep_status not in valid_rep_status:"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_b6cf1c7e","line":1619,"updated":"2015-09-04 19:01:38.000000000","message":"shouldn\u0027t this be posted as it\u0027s own fix?","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"7cb9fc75c85ee4398203d2466c3ab05e321f4fe8","unresolved":false,"context_lines":[{"line_number":1616,"context_line":"        # call to driver regardless of replication_status, most likely"},{"line_number":1617,"context_line":"        # this indicates an issue with the driver, but might be useful"},{"line_number":1618,"context_line":"        # cases to  consider modifying this for in the future."},{"line_number":1619,"context_line":"        valid_rep_status \u003d [\u0027disabled\u0027, \u0027failed-over\u0027, \u0027error\u0027]"},{"line_number":1620,"context_line":"        rep_status \u003d volume.get(\u0027replication_status\u0027, valid_rep_status[0])"},{"line_number":1621,"context_line":""},{"line_number":1622,"context_line":"        if rep_status not in valid_rep_status:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a1a9d01_e6a6020e","line":1619,"in_reply_to":"da20952f_b6cf1c7e","updated":"2015-10-01 05:46:28.000000000","message":"+1 Alex: Should go in as a separate patch","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"fe2e46d4f808508b630a5dbef1875ee023b61812","unresolved":false,"context_lines":[{"line_number":1616,"context_line":"        # call to driver regardless of replication_status, most likely"},{"line_number":1617,"context_line":"        # this indicates an issue with the driver, but might be useful"},{"line_number":1618,"context_line":"        # cases to  consider modifying this for in the future."},{"line_number":1619,"context_line":"        valid_rep_status \u003d [\u0027disabled\u0027, \u0027failed-over\u0027, \u0027error\u0027]"},{"line_number":1620,"context_line":"        rep_status \u003d volume.get(\u0027replication_status\u0027, valid_rep_status[0])"},{"line_number":1621,"context_line":""},{"line_number":1622,"context_line":"        if rep_status not in valid_rep_status:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_650ccf42","line":1619,"in_reply_to":"da20952f_b6cf1c7e","updated":"2015-12-22 18:28:37.000000000","message":"Done","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"}],"cinder/volume/drivers/pure.py":[{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    cfg.StrOpt(\"pure_api_token\","},{"line_number":51,"context_line":"               default\u003dNone,"},{"line_number":52,"context_line":"               help\u003d\"REST API authorization token.\"),"},{"line_number":53,"context_line":"    # Temp option for Replication, will be moved to common code"},{"line_number":54,"context_line":"    cfg.StrOpt(\"replica_san_ip\", default\u003dNone,"},{"line_number":55,"context_line":"               help\u003d\"Address of replication target array\"),"},{"line_number":56,"context_line":"    # Temp option for Replication, will be moved to common code"},{"line_number":57,"context_line":"    cfg.StrOpt(\"pure_replica_api_token\", default\u003dNone,"},{"line_number":58,"context_line":"               help\u003d\"REST API token for replication target array\"),"},{"line_number":59,"context_line":"    cfg.StrOpt(\"pure_replica_pgroup_name\", default\u003d\"cinder-repl-pg\","},{"line_number":60,"context_line":"               help\u003d\"Name of protection group that is replicated\"),"},{"line_number":61,"context_line":"    cfg.IntOpt(\"pure_replica_interval\", default\u003d900,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_5d0b1624","line":58,"range":{"start_line":53,"start_character":4,"end_line":58,"end_character":67},"updated":"2015-08-21 03:21:12.000000000","message":"Looks like these can be removed now","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":58,"context_line":"               help\u003d\"REST API token for replication target array\"),"},{"line_number":59,"context_line":"    cfg.StrOpt(\"pure_replica_pgroup_name\", default\u003d\"cinder-repl-pg\","},{"line_number":60,"context_line":"               help\u003d\"Name of protection group that is replicated\"),"},{"line_number":61,"context_line":"    cfg.IntOpt(\"pure_replica_interval\", default\u003d900,"},{"line_number":62,"context_line":"               help\u003d\"Snapshot replication interval in seconds\"),"},{"line_number":63,"context_line":"    cfg.IntOpt(\"pure_replica_retention_short_term\", default\u003d14400,"},{"line_number":64,"context_line":"               help\u003d\"Retain all snapshots on target for this \""},{"line_number":65,"context_line":"                    \"time (in seconds)\"),"},{"line_number":66,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_per_day\", default\u003d3,"},{"line_number":67,"context_line":"               help\u003d\"Retain how many snapshots for each day\"),"},{"line_number":68,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term\", default\u003d7,"},{"line_number":69,"context_line":"               help\u003d\"Retain pure_replication_retention_long_term_per_day\""},{"line_number":70,"context_line":"                    \" snapshots per day on target for this time (in days)\"),"},{"line_number":71,"context_line":"]"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_20dcf571","line":70,"range":{"start_line":61,"start_character":4,"end_line":70,"end_character":76},"updated":"2015-08-21 03:21:12.000000000","message":"We should switch these to be more like \u0027\u003cthing\u003e_default\u0027 because the expectation (I think) is that someone would be able to specify them in a volume type.\n\nEven if we don\u0027t actually support that for the first iteration it would be easier if they are \u0027default\u0027s so we don\u0027t have to deprecate them and add in new ones later.\n\nWe might consider putting the replication_internal on the base driver... surely others with async replication would have some periodicity that is configurable?","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":67,"context_line":"               help\u003d\"Retain how many snapshots for each day\"),"},{"line_number":68,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term\", default\u003d7,"},{"line_number":69,"context_line":"               help\u003d\"Retain pure_replication_retention_long_term_per_day\""},{"line_number":70,"context_line":"                    \" snapshots per day on target for this time (in days)\"),"},{"line_number":71,"context_line":"]"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_2164cd47","line":70,"in_reply_to":"fa1b9901_20dcf571","updated":"2015-08-21 22:56:44.000000000","message":"Done.  Putting replication_interval on base driver sounds good. Maybe as a future enhancement.","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        # Get current array in case we have failed over via replication."},{"line_number":304,"context_line":"        current_array \u003d self._get_current_array(snapshot)"},{"line_number":305,"context_line":"        vol_name, snap_suff \u003d self._get_snap_name(snapshot).split(\".\")"},{"line_number":306,"context_line":"        current_array.create_snapshot(vol_name, suffix\u003dsnap_suff)"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    @log_debug_trace"},{"line_number":309,"context_line":"    def delete_snapshot(self, snapshot):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_c0f099cb","line":306,"updated":"2015-08-21 03:21:12.000000000","message":"I think we need to set the provider location for this snapshot, right? Otherwise later when we use it for something we don\u0027t know which array it is on.\n\nWe probably need to do the same thing for all of the cinder snapshots that are created by a cg snapshot being taken.","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        # Get current array in case we have failed over via replication."},{"line_number":304,"context_line":"        current_array \u003d self._get_current_array(snapshot)"},{"line_number":305,"context_line":"        vol_name, snap_suff \u003d self._get_snap_name(snapshot).split(\".\")"},{"line_number":306,"context_line":"        current_array.create_snapshot(vol_name, suffix\u003dsnap_suff)"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    @log_debug_trace"},{"line_number":309,"context_line":"    def delete_snapshot(self, snapshot):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_0d1c6868","line":306,"in_reply_to":"fa1b9901_c0f099cb","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":739,"context_line":""},{"line_number":740,"context_line":"        return connection"},{"line_number":741,"context_line":""},{"line_number":742,"context_line":"    def retype(self, context, volume, new_type, diff, host):"},{"line_number":743,"context_line":"        \"\"\"Retype from one volume type to another on the same backend."},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"        For a Pure Array there is currently no differentiation between types"},{"line_number":746,"context_line":"        of volumes. This means that changing from one type to another on the"},{"line_number":747,"context_line":"        same array should be a no-op."},{"line_number":748,"context_line":"        \"\"\""},{"line_number":749,"context_line":"        return True, None"},{"line_number":750,"context_line":""},{"line_number":751,"context_line":"    # Replication v2"},{"line_number":752,"context_line":"    @log_debug_trace"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_e0459d42","line":749,"range":{"start_line":742,"start_character":4,"end_line":749,"end_character":25},"updated":"2015-08-21 03:21:12.000000000","message":"We are going to need to make retype aware of replicated types now and add/remove them from the pgroups as needed.","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"75fc5a17aeb36a4680d07c556fdeb6da18e58ddc","unresolved":false,"context_lines":[{"line_number":750,"context_line":""},{"line_number":751,"context_line":"    # Replication v2"},{"line_number":752,"context_line":"    @log_debug_trace"},{"line_number":753,"context_line":"    def replication_enable(self, context, volume, asynch, replica_count):"},{"line_number":754,"context_line":"        # Enable replication on the given volume"},{"line_number":755,"context_line":""},{"line_number":756,"context_line":"        # Get current array in case we have failed over via replication"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_14257e5a","line":753,"updated":"2015-08-20 23:22:25.000000000","message":"it looks like John removed asynch and replica_count from replcation_enable in his newest patch set.","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":750,"context_line":""},{"line_number":751,"context_line":"    # Replication v2"},{"line_number":752,"context_line":"    @log_debug_trace"},{"line_number":753,"context_line":"    def replication_enable(self, context, volume, asynch, replica_count):"},{"line_number":754,"context_line":"        # Enable replication on the given volume"},{"line_number":755,"context_line":""},{"line_number":756,"context_line":"        # Get current array in case we have failed over via replication"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_ad58dc31","line":753,"in_reply_to":"fa1b9901_14257e5a","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":793,"context_line":"                        return {\u0027replication_status\u0027: \u0027disable_failed\u0027}"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"    @log_debug_trace"},{"line_number":796,"context_line":"    def replication_failover(self, context, volume, secondary):"},{"line_number":797,"context_line":"        # failover the volume to the secondary"},{"line_number":798,"context_line":""},{"line_number":799,"context_line":"        if not volume[\"replication_status\"] \u003d\u003d \"active\":"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_802f013e","line":796,"updated":"2015-08-21 03:21:12.000000000","message":"Lets add some documentation here that explains that the original volume is left behind on the old array and is potentially going to be re-used if failed back again.","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":793,"context_line":"                        return {\u0027replication_status\u0027: \u0027disable_failed\u0027}"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"    @log_debug_trace"},{"line_number":796,"context_line":"    def replication_failover(self, context, volume, secondary):"},{"line_number":797,"context_line":"        # failover the volume to the secondary"},{"line_number":798,"context_line":""},{"line_number":799,"context_line":"        if not volume[\"replication_status\"] \u003d\u003d \"active\":"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_edd57442","line":796,"in_reply_to":"fa1b9901_802f013e","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":796,"context_line":"    def replication_failover(self, context, volume, secondary):"},{"line_number":797,"context_line":"        # failover the volume to the secondary"},{"line_number":798,"context_line":""},{"line_number":799,"context_line":"        if not volume[\"replication_status\"] \u003d\u003d \"active\":"},{"line_number":800,"context_line":"            raise exception.PureDriverException("},{"line_number":801,"context_line":"                reason\u003d\"Unable to promote replica when replication is not \""},{"line_number":802,"context_line":"                       \"active. Current replication status: %s\""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_e066fdb9","line":799,"updated":"2015-08-21 03:21:12.000000000","message":"I don\u0027t think we need to check for that, iirc it is checked before the driver is called.","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":796,"context_line":"    def replication_failover(self, context, volume, secondary):"},{"line_number":797,"context_line":"        # failover the volume to the secondary"},{"line_number":798,"context_line":""},{"line_number":799,"context_line":"        if not volume[\"replication_status\"] \u003d\u003d \"active\":"},{"line_number":800,"context_line":"            raise exception.PureDriverException("},{"line_number":801,"context_line":"                reason\u003d\"Unable to promote replica when replication is not \""},{"line_number":802,"context_line":"                       \"active. Current replication status: %s\""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_8dc878a9","line":799,"in_reply_to":"fa1b9901_e066fdb9","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":841,"context_line":"        return primary_array, secondary_array"},{"line_number":842,"context_line":""},{"line_number":843,"context_line":"    @log_debug_trace"},{"line_number":844,"context_line":"    def create_replica_test_volume(self, volume, secondary):"},{"line_number":845,"context_line":"        \"\"\"Creates a new volume from the replica.\"\"\""},{"line_number":846,"context_line":"        vol_name \u003d self._get_vol_name(volume)"},{"line_number":847,"context_line":"        # Get the latest replicated snapshot for src_name volume"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_9def6e1d","line":844,"updated":"2015-08-21 03:21:12.000000000","message":"can we just call this failover_volume or something? create_replica_test_volume is kind of confusing","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":841,"context_line":"        return primary_array, secondary_array"},{"line_number":842,"context_line":""},{"line_number":843,"context_line":"    @log_debug_trace"},{"line_number":844,"context_line":"    def create_replica_test_volume(self, volume, secondary):"},{"line_number":845,"context_line":"        \"\"\"Creates a new volume from the replica.\"\"\""},{"line_number":846,"context_line":"        vol_name \u003d self._get_vol_name(volume)"},{"line_number":847,"context_line":"        # Get the latest replicated snapshot for src_name volume"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_7a6cae36","line":844,"in_reply_to":"fa1b9901_9def6e1d","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":874,"context_line":"            return True"},{"line_number":875,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":876,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":877,"context_line":"                if err.code \u003d\u003d 400 and \"does not exist\" in err.text:"},{"line_number":878,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":879,"context_line":"                    return False"},{"line_number":880,"context_line":"            # Any unexpected exception to be handled by caller"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_7d3a9a9a","line":877,"updated":"2015-08-21 03:21:12.000000000","message":"use the ERR_MSG_* constant for this","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":874,"context_line":"            return True"},{"line_number":875,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":876,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":877,"context_line":"                if err.code \u003d\u003d 400 and \"does not exist\" in err.text:"},{"line_number":878,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":879,"context_line":"                    return False"},{"line_number":880,"context_line":"            # Any unexpected exception to be handled by caller"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_ad10dc00","line":877,"in_reply_to":"fa1b9901_7d3a9a9a","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":879,"context_line":"                    return False"},{"line_number":880,"context_line":"            # Any unexpected exception to be handled by caller"},{"line_number":881,"context_line":""},{"line_number":882,"context_line":"    def _retry_a_function_until_success(self,"},{"line_number":883,"context_line":"                                        function,"},{"line_number":884,"context_line":"                                        test_function,"},{"line_number":885,"context_line":"                                        timeout_exception,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_bd54b2c9","line":882,"updated":"2015-08-21 03:21:12.000000000","message":"I think there is one of these in the cinder utils.py module, we should switch to using that one.","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":879,"context_line":"                    return False"},{"line_number":880,"context_line":"            # Any unexpected exception to be handled by caller"},{"line_number":881,"context_line":""},{"line_number":882,"context_line":"    def _retry_a_function_until_success(self,"},{"line_number":883,"context_line":"                                        function,"},{"line_number":884,"context_line":"                                        test_function,"},{"line_number":885,"context_line":"                                        timeout_exception,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_5d71af76","line":882,"in_reply_to":"fa1b9901_bd54b2c9","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":951,"context_line":"        self._create_protection_group_if_not_exist("},{"line_number":952,"context_line":"            source_array, self._replication_pg_name)"},{"line_number":953,"context_line":""},{"line_number":954,"context_line":"        \"\"\"Apply retention policies to a protection group"},{"line_number":955,"context_line":"        These retention policies will be applied on the replicated snapshots"},{"line_number":956,"context_line":"        on the target array\"\"\""},{"line_number":957,"context_line":"        retention_policy \u003d self._generate_replication_retention()"},{"line_number":958,"context_line":"        source_array.set_pgroup(self._replication_pg_name,"},{"line_number":959,"context_line":"                                **retention_policy)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_5d28f632","line":956,"range":{"start_line":954,"start_character":8,"end_line":956,"end_character":30},"updated":"2015-08-21 03:21:12.000000000","message":"style nit, can you switch this to use the # comments? I think everywhere else we only use the \"\"\" kind for like method/class docs","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":953,"context_line":""},{"line_number":954,"context_line":"        \"\"\"Apply retention policies to a protection group"},{"line_number":955,"context_line":"        These retention policies will be applied on the replicated snapshots"},{"line_number":956,"context_line":"        on the target array\"\"\""},{"line_number":957,"context_line":"        retention_policy \u003d self._generate_replication_retention()"},{"line_number":958,"context_line":"        source_array.set_pgroup(self._replication_pg_name,"},{"line_number":959,"context_line":"                                **retention_policy)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_ddd13f31","line":956,"in_reply_to":"fa1b9901_5d28f632","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":958,"context_line":"        source_array.set_pgroup(self._replication_pg_name,"},{"line_number":959,"context_line":"                                **retention_policy)"},{"line_number":960,"context_line":""},{"line_number":961,"context_line":"        \"\"\"Configure replication propagation frequency on a protection group"},{"line_number":962,"context_line":"        replicate_interval maps to replicate_frequency in Purity REST API\"\"\""},{"line_number":963,"context_line":"        source_array.set_pgroup(self._replication_pg_name,"},{"line_number":964,"context_line":"                                replicate_frequency\u003dself._replication_interval)"},{"line_number":965,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_dd1406ea","line":962,"range":{"start_line":961,"start_character":8,"end_line":962,"end_character":76},"updated":"2015-08-21 03:21:12.000000000","message":"here too","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":959,"context_line":"                                **retention_policy)"},{"line_number":960,"context_line":""},{"line_number":961,"context_line":"        \"\"\"Configure replication propagation frequency on a protection group"},{"line_number":962,"context_line":"        replicate_interval maps to replicate_frequency in Purity REST API\"\"\""},{"line_number":963,"context_line":"        source_array.set_pgroup(self._replication_pg_name,"},{"line_number":964,"context_line":"                                replicate_frequency\u003dself._replication_interval)"},{"line_number":965,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_3deddbef","line":962,"in_reply_to":"fa1b9901_dd1406ea","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":968,"context_line":"                                    addtargetlist\u003d[target_array.array_name])"},{"line_number":969,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":970,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":971,"context_line":"                if err.code \u003d\u003d 400 and \\"},{"line_number":972,"context_line":"                        \"Protection group already includes target\" in err.text:"},{"line_number":973,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":974,"context_line":"                    LOG.info(_LI(\"skipping add target %(target_array)s to \""},{"line_number":975,"context_line":"                                 \"PG %(pgname)s since it\u0027s already added\"),"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_3db3c20b","line":972,"range":{"start_line":971,"start_character":16,"end_line":972,"end_character":79},"updated":"2015-08-21 03:21:12.000000000","message":"Looks like the general trend is to use () instead of \\ for multiline stuff like this","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":969,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":970,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":971,"context_line":"                if err.code \u003d\u003d 400 and \\"},{"line_number":972,"context_line":"                        \"Protection group already includes target\" in err.text:"},{"line_number":973,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":974,"context_line":"                    LOG.info(_LI(\"skipping add target %(target_array)s to \""},{"line_number":975,"context_line":"                                 \"PG %(pgname)s since it\u0027s already added\"),"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_1d757731","line":972,"in_reply_to":"fa1b9901_3db3c20b","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":986,"context_line":"            target_array.set_pgroup(pgroup_name_on_target, allowed\u003dTrue)"},{"line_number":987,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":988,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":989,"context_line":"                if err.code \u003d\u003d 400 and \\"},{"line_number":990,"context_line":"                        \"Protection group is already allowed on this \" \\"},{"line_number":991,"context_line":"                        \"target\" in err.text:"},{"line_number":992,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":993,"context_line":"                    LOG.info(_LI(\"skipping allow pgroup %(pgname)s on \""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_1d94be40","line":990,"range":{"start_line":989,"start_character":16,"end_line":990,"end_character":72},"updated":"2015-08-21 03:21:12.000000000","message":"same here","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":987,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":988,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":989,"context_line":"                if err.code \u003d\u003d 400 and \\"},{"line_number":990,"context_line":"                        \"Protection group is already allowed on this \" \\"},{"line_number":991,"context_line":"                        \"target\" in err.text:"},{"line_number":992,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":993,"context_line":"                    LOG.info(_LI(\"skipping allow pgroup %(pgname)s on \""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_dddb7f20","line":990,"in_reply_to":"fa1b9901_1d94be40","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b718d689b6a328fbb0ca5ad799d6f3dae0f62a1b","unresolved":false,"context_lines":[{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"        :return: a dictionary representing replication retention settings"},{"line_number":1021,"context_line":"        \"\"\""},{"line_number":1022,"context_line":"        LOG.debug(\"Enter PureISCSIDriver._generate_replication_retention.\")"},{"line_number":1023,"context_line":"        replication_retention \u003d dict("},{"line_number":1024,"context_line":"            target_all_for\u003dself._replication_retention_short_term,"},{"line_number":1025,"context_line":"            target_per_day\u003dself._replication_retention_long_term_per_day,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_a3f01aca","line":1022,"updated":"2015-08-20 21:38:07.000000000","message":"Need to make this non driver specific, or discover the driver you are using - what if it is the FC driver?","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"        :return: a dictionary representing replication retention settings"},{"line_number":1021,"context_line":"        \"\"\""},{"line_number":1022,"context_line":"        LOG.debug(\"Enter PureISCSIDriver._generate_replication_retention.\")"},{"line_number":1023,"context_line":"        replication_retention \u003d dict("},{"line_number":1024,"context_line":"            target_all_for\u003dself._replication_retention_short_term,"},{"line_number":1025,"context_line":"            target_per_day\u003dself._replication_retention_long_term_per_day,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_fd7f8a12","line":1022,"in_reply_to":"fa1b9901_a3f01aca","updated":"2015-08-21 03:21:12.000000000","message":"We should remove these and just use the @log_debug_trace helper we put in","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"        :return: a dictionary representing replication retention settings"},{"line_number":1021,"context_line":"        \"\"\""},{"line_number":1022,"context_line":"        LOG.debug(\"Enter PureISCSIDriver._generate_replication_retention.\")"},{"line_number":1023,"context_line":"        replication_retention \u003d dict("},{"line_number":1024,"context_line":"            target_all_for\u003dself._replication_retention_short_term,"},{"line_number":1025,"context_line":"            target_per_day\u003dself._replication_retention_long_term_per_day,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_dd029f72","line":1022,"in_reply_to":"fa1b9901_fd7f8a12","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b718d689b6a328fbb0ca5ad799d6f3dae0f62a1b","unresolved":false,"context_lines":[{"line_number":1025,"context_line":"            target_per_day\u003dself._replication_retention_long_term_per_day,"},{"line_number":1026,"context_line":"            target_days\u003dself._replication_retention_long_term"},{"line_number":1027,"context_line":"        )"},{"line_number":1028,"context_line":"        LOG.debug(\"Leave PureISCSIDriver._generate_replication_retention.\")"},{"line_number":1029,"context_line":"        return replication_retention"},{"line_number":1030,"context_line":""},{"line_number":1031,"context_line":"    @log_debug_trace"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_63bd22d7","line":1028,"updated":"2015-08-20 21:38:07.000000000","message":"Same as above","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":1025,"context_line":"            target_per_day\u003dself._replication_retention_long_term_per_day,"},{"line_number":1026,"context_line":"            target_days\u003dself._replication_retention_long_term"},{"line_number":1027,"context_line":"        )"},{"line_number":1028,"context_line":"        LOG.debug(\"Leave PureISCSIDriver._generate_replication_retention.\")"},{"line_number":1029,"context_line":"        return replication_retention"},{"line_number":1030,"context_line":""},{"line_number":1031,"context_line":"    @log_debug_trace"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_9dfc2774","line":1028,"in_reply_to":"fa1b9901_63bd22d7","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":1044,"context_line":"        pg_snaps_filtered.sort(key\u003dlambda x: x[\"created\"], reverse\u003dTrue)"},{"line_number":1045,"context_line":"        volume_snap \u003d None"},{"line_number":1046,"context_line":"        vol_snap_source_to_find \u003d \"%s:%s\" % (source_array_name, vol_name)"},{"line_number":1047,"context_line":"        LOG.debug(\"looking for volume %s\", vol_snap_source_to_find)"},{"line_number":1048,"context_line":"        for pg_snap in pg_snaps:"},{"line_number":1049,"context_line":"            LOG.debug(\"looking inside snap %s\", pg_snap[\"name\"])"},{"line_number":1050,"context_line":"            # Get volume snapshots inside the replicated PG snapshot"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_bd1fd2b5","line":1047,"updated":"2015-08-21 03:21:12.000000000","message":"We should add some more info here, just a debug log saying \u0027looking for volume volume-123456789-cinder\u0027 doesn\u0027t really explain what is happening right then, maybe something more like \u0027Searching for snapshot of volume \"volume-123456789-cinder\" in replicated protection group snapshots on array \"foo\"\u0027","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":1034,"context_line":"                                        source_array_name,"},{"line_number":1035,"context_line":"                                        pgroup_name,"},{"line_number":1036,"context_line":"                                        vol_name):"},{"line_number":1037,"context_line":"        # Get all protection group snapshots"},{"line_number":1038,"context_line":"        snap_name \u003d \"%s:%s\" % (source_array_name, pgroup_name)"},{"line_number":1039,"context_line":"        pg_snaps \u003d array.get_pgroup(snap_name, snap\u003dTrue, transfer\u003dTrue)"},{"line_number":1040,"context_line":"        # Only use snapshots that are replicated completely"},{"line_number":1041,"context_line":"        pg_snaps_filtered \u003d [s for s in pg_snaps if s[\"progress\"] \u003d\u003d 1]"},{"line_number":1042,"context_line":"        # Go through the protection group snapshots, latest first ...."},{"line_number":1043,"context_line":"        #   stop when we find required volume snapshot"},{"line_number":1044,"context_line":"        pg_snaps_filtered.sort(key\u003dlambda x: x[\"created\"], reverse\u003dTrue)"},{"line_number":1045,"context_line":"        volume_snap \u003d None"},{"line_number":1046,"context_line":"        vol_snap_source_to_find \u003d \"%s:%s\" % (source_array_name, vol_name)"},{"line_number":1047,"context_line":"        LOG.debug(\"looking for volume %s\", vol_snap_source_to_find)"},{"line_number":1048,"context_line":"        for pg_snap in pg_snaps:"},{"line_number":1049,"context_line":"            LOG.debug(\"looking inside snap %s\", pg_snap[\"name\"])"},{"line_number":1050,"context_line":"            # Get volume snapshots inside the replicated PG snapshot"},{"line_number":1051,"context_line":"            volume_snaps \u003d array._request(\"GET\","}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_3daf427e","line":1048,"range":{"start_line":1037,"start_character":8,"end_line":1048,"end_character":32},"updated":"2015-08-21 03:21:12.000000000","message":"style nit, can we add some line breaks to this block above maybe like before each comment","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":1045,"context_line":"        volume_snap \u003d None"},{"line_number":1046,"context_line":"        vol_snap_source_to_find \u003d \"%s:%s\" % (source_array_name, vol_name)"},{"line_number":1047,"context_line":"        LOG.debug(\"looking for volume %s\", vol_snap_source_to_find)"},{"line_number":1048,"context_line":"        for pg_snap in pg_snaps:"},{"line_number":1049,"context_line":"            LOG.debug(\"looking inside snap %s\", pg_snap[\"name\"])"},{"line_number":1050,"context_line":"            # Get volume snapshots inside the replicated PG snapshot"},{"line_number":1051,"context_line":"            volume_snaps \u003d array._request(\"GET\","}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_5d3e8f2a","line":1048,"in_reply_to":"fa1b9901_3daf427e","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":1046,"context_line":"        vol_snap_source_to_find \u003d \"%s:%s\" % (source_array_name, vol_name)"},{"line_number":1047,"context_line":"        LOG.debug(\"looking for volume %s\", vol_snap_source_to_find)"},{"line_number":1048,"context_line":"        for pg_snap in pg_snaps:"},{"line_number":1049,"context_line":"            LOG.debug(\"looking inside snap %s\", pg_snap[\"name\"])"},{"line_number":1050,"context_line":"            # Get volume snapshots inside the replicated PG snapshot"},{"line_number":1051,"context_line":"            volume_snaps \u003d array._request(\"GET\","},{"line_number":1052,"context_line":"                                          \"volume/%s?snap\u003dtrue\u0026pgroup\u003dtrue\""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_dda4064c","line":1049,"updated":"2015-08-21 03:21:12.000000000","message":"Same deal for this log message, by itself it doesn\u0027t really tell much about what is happening.","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"        for pg_snap in pg_snaps:"},{"line_number":1049,"context_line":"            LOG.debug(\"looking inside snap %s\", pg_snap[\"name\"])"},{"line_number":1050,"context_line":"            # Get volume snapshots inside the replicated PG snapshot"},{"line_number":1051,"context_line":"            volume_snaps \u003d array._request(\"GET\","},{"line_number":1052,"context_line":"                                          \"volume/%s?snap\u003dtrue\u0026pgroup\u003dtrue\""},{"line_number":1053,"context_line":"                                          % pg_snap[\"name\"])"},{"line_number":1054,"context_line":"            for snap in volume_snaps:"},{"line_number":1055,"context_line":"                if snap[\"source\"] \u003d\u003d vol_snap_source_to_find:"},{"line_number":1056,"context_line":"                    volume_snap \u003d snap"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_9d50ce33","line":1053,"range":{"start_line":1051,"start_character":12,"end_line":1053,"end_character":60},"updated":"2015-08-21 03:21:12.000000000","message":"Use the python module... iirc you can do something like array.get_volume(pg_snap[\"name\"], snap\u003dTrue, pgroup\u003dTrue)","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":1050,"context_line":"            # Get volume snapshots inside the replicated PG snapshot"},{"line_number":1051,"context_line":"            volume_snaps \u003d array._request(\"GET\","},{"line_number":1052,"context_line":"                                          \"volume/%s?snap\u003dtrue\u0026pgroup\u003dtrue\""},{"line_number":1053,"context_line":"                                          % pg_snap[\"name\"])"},{"line_number":1054,"context_line":"            for snap in volume_snaps:"},{"line_number":1055,"context_line":"                if snap[\"source\"] \u003d\u003d vol_snap_source_to_find:"},{"line_number":1056,"context_line":"                    volume_snap \u003d snap"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_fdf1a36b","line":1053,"in_reply_to":"fa1b9901_9d50ce33","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":1072,"context_line":"                    # We assume PG has already been setup with correct"},{"line_number":1073,"context_line":"                    # replication settings."},{"line_number":1074,"context_line":"                    return"},{"line_number":1075,"context_line":"                if err.code \u003d\u003d 400 \\"},{"line_number":1076,"context_line":"                        and ERR_MSG_PENDING_ERADICATION in err.text:"},{"line_number":1077,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":1078,"context_line":"                    LOG.warning(_LW(\"PG %s is deleted but not eradicated \""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_bd059214","line":1075,"updated":"2015-08-21 03:21:12.000000000","message":"Switch to ()","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":1072,"context_line":"                    # We assume PG has already been setup with correct"},{"line_number":1073,"context_line":"                    # replication settings."},{"line_number":1074,"context_line":"                    return"},{"line_number":1075,"context_line":"                if err.code \u003d\u003d 400 \\"},{"line_number":1076,"context_line":"                        and ERR_MSG_PENDING_ERADICATION in err.text:"},{"line_number":1077,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":1078,"context_line":"                    LOG.warning(_LW(\"PG %s is deleted but not eradicated \""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_603966d8","line":1075,"in_reply_to":"fa1b9901_bd059214","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a84f5855906774297ec6763666247b723324c163","unresolved":false,"context_lines":[{"line_number":1075,"context_line":"                if err.code \u003d\u003d 400 \\"},{"line_number":1076,"context_line":"                        and ERR_MSG_PENDING_ERADICATION in err.text:"},{"line_number":1077,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":1078,"context_line":"                    LOG.warning(_LW(\"PG %s is deleted but not eradicated \""},{"line_number":1079,"context_line":"                                    \"- will recreate\"), pgname)"},{"line_number":1080,"context_line":"                    source_array.eradicate_pgroup(pgname)"},{"line_number":1081,"context_line":"                    source_array.create_pgroup(pgname)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_a02c8599","line":1078,"updated":"2015-08-21 03:21:12.000000000","message":"We should probably switch from \u0027PG\u0027 to \u0027Protection Group\u0027 to make some of these log messages easier to understand.","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"6f0a92cfe6e469ed422f2ad37d6abed461561fdc","unresolved":false,"context_lines":[{"line_number":1075,"context_line":"                if err.code \u003d\u003d 400 \\"},{"line_number":1076,"context_line":"                        and ERR_MSG_PENDING_ERADICATION in err.text:"},{"line_number":1077,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":1078,"context_line":"                    LOG.warning(_LW(\"PG %s is deleted but not eradicated \""},{"line_number":1079,"context_line":"                                    \"- will recreate\"), pgname)"},{"line_number":1080,"context_line":"                    source_array.eradicate_pgroup(pgname)"},{"line_number":1081,"context_line":"                    source_array.create_pgroup(pgname)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_8036fae5","line":1078,"in_reply_to":"fa1b9901_a02c8599","updated":"2015-08-21 22:56:44.000000000","message":"Done","commit_id":"22f2d918ec7f6720cf4f94abdfb2531c78974f19"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"5b27bc32b843063d05b28d860f6c8031b993e926","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        self._array.array_id \u003d array_info[\"id\"]"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        # Get replication target array info and create pgroup if needed"},{"line_number":141,"context_line":"        if self.configuration.managed_replication_devices is not None:"},{"line_number":142,"context_line":"            # Make list of replication targets"},{"line_number":143,"context_line":"            # TODO(Danny) parse managed targets"},{"line_number":144,"context_line":"            target_array \u003d purestorage.FlashArray()"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_dd1e095f","line":141,"updated":"2015-08-22 04:02:16.000000000","message":"iirc there are helpers for getting config values like self.configuration.safe_get(\u0027managed_replication_devices\u0027, None)","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"81ed8843e156251229cef58ed0aba179cf9c77fe","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        self._array.array_id \u003d array_info[\"id\"]"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        # Get replication target array info and create pgroup if needed"},{"line_number":141,"context_line":"        if self.configuration.managed_replication_devices is not None:"},{"line_number":142,"context_line":"            # Make list of replication targets"},{"line_number":143,"context_line":"            # TODO(Danny) parse managed targets"},{"line_number":144,"context_line":"            target_array \u003d purestorage.FlashArray()"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_16c9adac","line":141,"in_reply_to":"fa1b9901_dd1e095f","updated":"2015-08-24 00:32:35.000000000","message":"Done","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"5b27bc32b843063d05b28d860f6c8031b993e926","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                array.array_name \u003d target_array_info[\"array_name\"]"},{"line_number":171,"context_line":"                array.array_id \u003d target_array_info[\"id\"]"},{"line_number":172,"context_line":"                self._setup_replicated_pgroups()"},{"line_number":173,"context_line":"                # as long as one of these worked then enable replication"},{"line_number":174,"context_line":"                self._is_replication_enabled \u003d True"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def check_for_setup_error(self):"},{"line_number":177,"context_line":"        # Avoid inheriting check_for_setup_error from SanDriver, which checks"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_3d51450f","line":174,"range":{"start_line":173,"start_character":16,"end_line":174,"end_character":51},"updated":"2015-08-22 04:02:16.000000000","message":"Could probably just move this out of the for loop since if they failed it raises an exception and exits the method anyway","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"81ed8843e156251229cef58ed0aba179cf9c77fe","unresolved":false,"context_lines":[{"line_number":171,"context_line":"                array.array_id \u003d target_array_info[\"id\"]"},{"line_number":172,"context_line":"                self._setup_replicated_pgroups()"},{"line_number":173,"context_line":"                # as long as one of these worked then enable replication"},{"line_number":174,"context_line":"                self._is_replication_enabled \u003d True"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def check_for_setup_error(self):"},{"line_number":177,"context_line":"        # Avoid inheriting check_for_setup_error from SanDriver, which checks"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_36ce31b5","line":174,"in_reply_to":"fa1b9901_3d51450f","updated":"2015-08-24 00:32:35.000000000","message":"Done","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"5b27bc32b843063d05b28d860f6c8031b993e926","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                                               replicate_now\u003dTrue,"},{"line_number":199,"context_line":"                                               apply_retention\u003dTrue)"},{"line_number":200,"context_line":"            model_update \u003d {\u0027replication_status\u0027: \u0027active\u0027,"},{"line_number":201,"context_line":"                            \u0027provider_location\u0027: self._array.array_id}"},{"line_number":202,"context_line":"            return model_update"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    @log_debug_trace"},{"line_number":205,"context_line":"    def create_volume_from_snapshot(self, volume, snapshot):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_7d47bd4b","line":202,"range":{"start_line":201,"start_character":0,"end_line":202,"end_character":31},"updated":"2015-08-22 04:02:16.000000000","message":"We probably always want to set the provider location even if it isn\u0027t a replicated type, right?","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"81ed8843e156251229cef58ed0aba179cf9c77fe","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                                               apply_retention\u003dTrue)"},{"line_number":200,"context_line":"            model_update \u003d {\u0027replication_status\u0027: \u0027active\u0027,"},{"line_number":201,"context_line":"                            \u0027provider_location\u0027: self._array.array_id}"},{"line_number":202,"context_line":"            return model_update"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    @log_debug_trace"},{"line_number":205,"context_line":"    def create_volume_from_snapshot(self, volume, snapshot):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_b6ba4109","line":202,"in_reply_to":"fa1b9901_7d47bd4b","updated":"2015-08-24 00:32:35.000000000","message":"Done","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"5b27bc32b843063d05b28d860f6c8031b993e926","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                vol_name"},{"line_number":264,"context_line":"            )"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        model_update \u003d {\"provider_location\": current_array.array_id}"},{"line_number":267,"context_line":"        if self._is_volume_replicated_type(volume):"},{"line_number":268,"context_line":"            current_array.set_pgroup(self._replication_pg_name,"},{"line_number":269,"context_line":"                                     addvollist\u003d[self._get_vol_name(volume)])"},{"line_number":270,"context_line":"            current_array.create_pgroup_snapshot(self._replication_pg_name,"},{"line_number":271,"context_line":"                                                 replicate_now\u003dTrue,"},{"line_number":272,"context_line":"                                                 apply_retention\u003dTrue)"},{"line_number":273,"context_line":"            model_update[\u0027replication_status\u0027] \u003d \u0027active\u0027"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        return model_update"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def _extend_if_needed(self, array, vol_name, src_size, vol_size):"},{"line_number":278,"context_line":"        \"\"\"Extend the volume from size src_size to size vol_size.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_bd6475e5","line":275,"range":{"start_line":266,"start_character":8,"end_line":275,"end_character":27},"updated":"2015-08-22 04:02:16.000000000","message":"This same code snippet is used a few times, please move it to a helper method","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"81ed8843e156251229cef58ed0aba179cf9c77fe","unresolved":false,"context_lines":[{"line_number":272,"context_line":"                                                 apply_retention\u003dTrue)"},{"line_number":273,"context_line":"            model_update[\u0027replication_status\u0027] \u003d \u0027active\u0027"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        return model_update"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def _extend_if_needed(self, array, vol_name, src_size, vol_size):"},{"line_number":278,"context_line":"        \"\"\"Extend the volume from size src_size to size vol_size.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_f16763e8","line":275,"in_reply_to":"fa1b9901_bd6475e5","updated":"2015-08-24 00:32:35.000000000","message":"Done","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"5b27bc32b843063d05b28d860f6c8031b993e926","unresolved":false,"context_lines":[{"line_number":805,"context_line":"    # Replication v2"},{"line_number":806,"context_line":"    @log_debug_trace"},{"line_number":807,"context_line":"    def replication_enable(self, context, volume):"},{"line_number":808,"context_line":"        # Enable replication on the given volume"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"        # Get current array in case we have failed over"},{"line_number":811,"context_line":"        current_array \u003d self._get_current_array(volume)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_fda8addd","line":808,"updated":"2015-08-22 04:02:16.000000000","message":"the very first comment for the method should follow the docstring style stuff, http://docs.openstack.org/developer/hacking/#docstrings\n\nsorry if i caused confusion on this, i meant to use # just for comments that are in the middle of methods","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"81ed8843e156251229cef58ed0aba179cf9c77fe","unresolved":false,"context_lines":[{"line_number":805,"context_line":"    # Replication v2"},{"line_number":806,"context_line":"    @log_debug_trace"},{"line_number":807,"context_line":"    def replication_enable(self, context, volume):"},{"line_number":808,"context_line":"        # Enable replication on the given volume"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"        # Get current array in case we have failed over"},{"line_number":811,"context_line":"        current_array \u003d self._get_current_array(volume)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_7104b3c5","line":808,"in_reply_to":"fa1b9901_fda8addd","updated":"2015-08-24 00:32:35.000000000","message":"Done","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"5b27bc32b843063d05b28d860f6c8031b993e926","unresolved":false,"context_lines":[{"line_number":858,"context_line":"    def get_replication_targets(self, context):"},{"line_number":859,"context_line":"        # return all connected arrays that are active"},{"line_number":860,"context_line":""},{"line_number":861,"context_line":"        data \u003d [{\"remote_targets\": [{\"san_ip\": self.configuration.san_ip,"},{"line_number":862,"context_line":"                                     \"san_token\":"},{"line_number":863,"context_line":"                                     self.configuration.pure_api_token,"},{"line_number":864,"context_line":"                                     \"status\": self._is_replication_enabled}]},"},{"line_number":865,"context_line":"                {\"cinder_hosts\": [self._array.array_name]},"},{"line_number":866,"context_line":"                ]"},{"line_number":867,"context_line":"        return data"},{"line_number":868,"context_line":""},{"line_number":869,"context_line":"    def _get_current_array(self, volume):"},{"line_number":870,"context_line":"        current_array, _ \u003d self._get_arrays(volume)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_1dcfa1b4","line":867,"range":{"start_line":861,"start_character":8,"end_line":867,"end_character":19},"updated":"2015-08-22 04:02:16.000000000","message":"This doesn\u0027t quite look right, isn\u0027t it supposed to be returning all of the connected arrays that are setup as replication targets? Looks like this is just returning info for the current backend.\n\nI think now the method signature changed to have a volume ref passed in as well.","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"81ed8843e156251229cef58ed0aba179cf9c77fe","unresolved":false,"context_lines":[{"line_number":864,"context_line":"                                     \"status\": self._is_replication_enabled}]},"},{"line_number":865,"context_line":"                {\"cinder_hosts\": [self._array.array_name]},"},{"line_number":866,"context_line":"                ]"},{"line_number":867,"context_line":"        return data"},{"line_number":868,"context_line":""},{"line_number":869,"context_line":"    def _get_current_array(self, volume):"},{"line_number":870,"context_line":"        current_array, _ \u003d self._get_arrays(volume)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_910947e0","line":867,"in_reply_to":"fa1b9901_1dcfa1b4","updated":"2015-08-24 00:32:35.000000000","message":"Done","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"5b27bc32b843063d05b28d860f6c8031b993e926","unresolved":false,"context_lines":[{"line_number":870,"context_line":"        current_array, _ \u003d self._get_arrays(volume)"},{"line_number":871,"context_line":"        return current_array"},{"line_number":872,"context_line":""},{"line_number":873,"context_line":"    def _get_secondary(self, volume):"},{"line_number":874,"context_line":"        _, secondary \u003d self._get_arrays(volume)"},{"line_number":875,"context_line":"        return secondary"},{"line_number":876,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_bd92359e","line":873,"updated":"2015-08-22 04:02:16.000000000","message":"doesnt look like this is used anymore, we can probably remove it","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"81ed8843e156251229cef58ed0aba179cf9c77fe","unresolved":false,"context_lines":[{"line_number":870,"context_line":"        current_array, _ \u003d self._get_arrays(volume)"},{"line_number":871,"context_line":"        return current_array"},{"line_number":872,"context_line":""},{"line_number":873,"context_line":"    def _get_secondary(self, volume):"},{"line_number":874,"context_line":"        _, secondary \u003d self._get_arrays(volume)"},{"line_number":875,"context_line":"        return secondary"},{"line_number":876,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_116537e0","line":873,"in_reply_to":"fa1b9901_bd92359e","updated":"2015-08-24 00:32:35.000000000","message":"Done","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"5b27bc32b843063d05b28d860f6c8031b993e926","unresolved":false,"context_lines":[{"line_number":875,"context_line":"        return secondary"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    def _get_arrays(self, volume):"},{"line_number":878,"context_line":"        \"\"\"Returns the current and secondary array for a volume or snapshot"},{"line_number":879,"context_line":""},{"line_number":880,"context_line":"        :param volume: dictionary describing the volume or snapshot"},{"line_number":881,"context_line":"        :return: the (current_array, secondary) array for the volume"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_fd12ed08","line":878,"updated":"2015-08-22 04:02:16.000000000","message":"Shouldn\u0027t this return the primary array and an array of secondaries?","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"81ed8843e156251229cef58ed0aba179cf9c77fe","unresolved":false,"context_lines":[{"line_number":875,"context_line":"        return secondary"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    def _get_arrays(self, volume):"},{"line_number":878,"context_line":"        \"\"\"Returns the current and secondary array for a volume or snapshot"},{"line_number":879,"context_line":""},{"line_number":880,"context_line":"        :param volume: dictionary describing the volume or snapshot"},{"line_number":881,"context_line":"        :return: the (current_array, secondary) array for the volume"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_719a73c7","line":878,"in_reply_to":"fa1b9901_fd12ed08","updated":"2015-08-24 00:32:35.000000000","message":"Done","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"5b27bc32b843063d05b28d860f6c8031b993e926","unresolved":false,"context_lines":[{"line_number":877,"context_line":"    def _get_arrays(self, volume):"},{"line_number":878,"context_line":"        \"\"\"Returns the current and secondary array for a volume or snapshot"},{"line_number":879,"context_line":""},{"line_number":880,"context_line":"        :param volume: dictionary describing the volume or snapshot"},{"line_number":881,"context_line":"        :return: the (current_array, secondary) array for the volume"},{"line_number":882,"context_line":"        \"\"\""},{"line_number":883,"context_line":"        current_array_id \u003d volume.get(\"provider_location\", None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_3dd4e545","line":880,"updated":"2015-08-22 04:02:16.000000000","message":"The param now is a volume object","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"81ed8843e156251229cef58ed0aba179cf9c77fe","unresolved":false,"context_lines":[{"line_number":877,"context_line":"    def _get_arrays(self, volume):"},{"line_number":878,"context_line":"        \"\"\"Returns the current and secondary array for a volume or snapshot"},{"line_number":879,"context_line":""},{"line_number":880,"context_line":"        :param volume: dictionary describing the volume or snapshot"},{"line_number":881,"context_line":"        :return: the (current_array, secondary) array for the volume"},{"line_number":882,"context_line":"        \"\"\""},{"line_number":883,"context_line":"        current_array_id \u003d volume.get(\"provider_location\", None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_d15edf11","line":880,"in_reply_to":"fa1b9901_3dd4e545","updated":"2015-08-24 00:32:35.000000000","message":"Done","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"5b27bc32b843063d05b28d860f6c8031b993e926","unresolved":false,"context_lines":[{"line_number":904,"context_line":"        vol_name \u003d self._get_vol_name(volume)"},{"line_number":905,"context_line":"        # Get the latest replicated snapshot for src_name volume"},{"line_number":906,"context_line":"        # Look for \"source\": \"\u003csource_array\u003e:\u003cvol_name\u003e\" in snapshot attributes"},{"line_number":907,"context_line":"        current_array, secondary_array \u003d self._get_arrays(volume)"},{"line_number":908,"context_line":"        vol_source_name_to_find \u003d \"%s:%s\" % (current_array.array_name,"},{"line_number":909,"context_line":"                                             vol_name)"},{"line_number":910,"context_line":"        volume_snap \u003d self._get_latest_replicated_vol_snap("}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_bdf555cc","line":907,"updated":"2015-08-22 04:02:16.000000000","message":"We should look for the secondary array which matches the one passed into this method, only if it doesn\u0027t match up with one should we just pick one arbitrarily","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"81ed8843e156251229cef58ed0aba179cf9c77fe","unresolved":false,"context_lines":[{"line_number":904,"context_line":"        vol_name \u003d self._get_vol_name(volume)"},{"line_number":905,"context_line":"        # Get the latest replicated snapshot for src_name volume"},{"line_number":906,"context_line":"        # Look for \"source\": \"\u003csource_array\u003e:\u003cvol_name\u003e\" in snapshot attributes"},{"line_number":907,"context_line":"        current_array, secondary_array \u003d self._get_arrays(volume)"},{"line_number":908,"context_line":"        vol_source_name_to_find \u003d \"%s:%s\" % (current_array.array_name,"},{"line_number":909,"context_line":"                                             vol_name)"},{"line_number":910,"context_line":"        volume_snap \u003d self._get_latest_replicated_vol_snap("}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_111d370f","line":907,"in_reply_to":"fa1b9901_bdf555cc","updated":"2015-08-24 00:32:35.000000000","message":"Done","commit_id":"7b1cca2fd484d65018874598878ad89ed331aa66"},{"author":{"_account_id":17718,"name":"Lallana","email":"gaozhiqiang2@huawei.com","username":"Lallana"},"change_message_id":"44917aa4da955b7314b0a32ae12d794c8640aaa4","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        method_name \u003d \"%(cls_name)s.%(method)s\" % {\"cls_name\": cls_name,"},{"line_number":88,"context_line":"                                                   \"method\": f.func_name}"},{"line_number":89,"context_line":"        LOG.debug(\"Enter \" + method_name)"},{"line_number":90,"context_line":"        result \u003d f(*args, **kwargs)"},{"line_number":91,"context_line":"        LOG.debug(\"Leave \" + method_name)"},{"line_number":92,"context_line":"        return result"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_23a751a8","line":90,"updated":"2015-08-26 07:45:08.000000000","message":"The function name should be related to the actual functionality,\nchange \"f\" to another name.","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"4c059c7d965db54b236b02157d12e47e50e78945","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        method_name \u003d \"%(cls_name)s.%(method)s\" % {\"cls_name\": cls_name,"},{"line_number":88,"context_line":"                                                   \"method\": f.func_name}"},{"line_number":89,"context_line":"        LOG.debug(\"Enter \" + method_name)"},{"line_number":90,"context_line":"        result \u003d f(*args, **kwargs)"},{"line_number":91,"context_line":"        LOG.debug(\"Leave \" + method_name)"},{"line_number":92,"context_line":"        return result"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_9ba30fb2","line":90,"in_reply_to":"fa1b9901_23a751a8","updated":"2015-08-26 15:30:40.000000000","message":"That\u0027s a pretty standard convention for wrappers. And it\u0027s not part of any change for this patch, so is not relevant.","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"a1f7d10d8623b3515072f40de6b4e2676a650ac2","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        method_name \u003d \"%(cls_name)s.%(method)s\" % {\"cls_name\": cls_name,"},{"line_number":88,"context_line":"                                                   \"method\": f.func_name}"},{"line_number":89,"context_line":"        LOG.debug(\"Enter \" + method_name)"},{"line_number":90,"context_line":"        result \u003d f(*args, **kwargs)"},{"line_number":91,"context_line":"        LOG.debug(\"Leave \" + method_name)"},{"line_number":92,"context_line":"        return result"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_bbe7aaab","line":90,"in_reply_to":"fa1b9901_9ba30fb2","updated":"2015-08-27 20:06:23.000000000","message":"I agree with Sean, not going to change this.","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"822d2fb6a1244a85077aae1c5c6b3432a81b69c1","unresolved":false,"context_lines":[{"line_number":983,"context_line":"            vol_name)"},{"line_number":984,"context_line":"        if not volume_snap:"},{"line_number":985,"context_line":"            raise exception.PureDriverException("},{"line_number":986,"context_line":"                reason\u003d\"Unable to find volume snapshot for %s\""},{"line_number":987,"context_line":"                       % vol_source_name_to_find)"},{"line_number":988,"context_line":"        # Create volume from snapshot"},{"line_number":989,"context_line":"        secondary_array.copy_volume(volume_snap[\"name\"],"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_52cee62d","line":986,"updated":"2015-08-25 21:01:23.000000000","message":"\".\" at EOL","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"a1f7d10d8623b3515072f40de6b4e2676a650ac2","unresolved":false,"context_lines":[{"line_number":983,"context_line":"            vol_name)"},{"line_number":984,"context_line":"        if not volume_snap:"},{"line_number":985,"context_line":"            raise exception.PureDriverException("},{"line_number":986,"context_line":"                reason\u003d\"Unable to find volume snapshot for %s\""},{"line_number":987,"context_line":"                       % vol_source_name_to_find)"},{"line_number":988,"context_line":"        # Create volume from snapshot"},{"line_number":989,"context_line":"        secondary_array.copy_volume(volume_snap[\"name\"],"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_3b495ad1","line":986,"in_reply_to":"fa1b9901_52cee62d","updated":"2015-08-27 20:06:23.000000000","message":"Done.","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"822d2fb6a1244a85077aae1c5c6b3432a81b69c1","unresolved":false,"context_lines":[{"line_number":1026,"context_line":"            return"},{"line_number":1027,"context_line":"        else:"},{"line_number":1028,"context_line":"            raise exception.PureDriverException(message\u003d_(\u0027Replication not \u0027"},{"line_number":1029,"context_line":"                                                          \u0027allowed yet\u0027))"},{"line_number":1030,"context_line":""},{"line_number":1031,"context_line":"    def _get_pgroup_name_on_target(self, source_array_name, pgroup_name):"},{"line_number":1032,"context_line":"        return \"%s:%s\" % (source_array_name, pgroup_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_d27436ff","line":1029,"updated":"2015-08-25 21:01:23.000000000","message":"\".\" at EOL","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"a1f7d10d8623b3515072f40de6b4e2676a650ac2","unresolved":false,"context_lines":[{"line_number":1026,"context_line":"            return"},{"line_number":1027,"context_line":"        else:"},{"line_number":1028,"context_line":"            raise exception.PureDriverException(message\u003d_(\u0027Replication not \u0027"},{"line_number":1029,"context_line":"                                                          \u0027allowed yet\u0027))"},{"line_number":1030,"context_line":""},{"line_number":1031,"context_line":"    def _get_pgroup_name_on_target(self, source_array_name, pgroup_name):"},{"line_number":1032,"context_line":"        return \"%s:%s\" % (source_array_name, pgroup_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_fb11a2b0","line":1029,"in_reply_to":"fa1b9901_d27436ff","updated":"2015-08-27 20:06:23.000000000","message":"Done","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"822d2fb6a1244a85077aae1c5c6b3432a81b69c1","unresolved":false,"context_lines":[{"line_number":1061,"context_line":"                            \"Protection group already includes target\""},{"line_number":1062,"context_line":"                            in err.text):"},{"line_number":1063,"context_line":"                        ctxt.reraise \u003d False"},{"line_number":1064,"context_line":"                        LOG.info(_LI(\"skipping add target %(target_array)s to \""},{"line_number":1065,"context_line":"                                     \"protection group %(pgname)s since it\u0027s \""},{"line_number":1066,"context_line":"                                     \"already added\"),"},{"line_number":1067,"context_line":"                                 {\"target_array\": target_array.array_name,"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_72144a4c","line":1064,"updated":"2015-08-25 21:01:23.000000000","message":"Suggest: \"Skipping add target %(target_array)s to protection group %(pgname)s since it\u0027s already added to the group.\"","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"a1f7d10d8623b3515072f40de6b4e2676a650ac2","unresolved":false,"context_lines":[{"line_number":1061,"context_line":"                            \"Protection group already includes target\""},{"line_number":1062,"context_line":"                            in err.text):"},{"line_number":1063,"context_line":"                        ctxt.reraise \u003d False"},{"line_number":1064,"context_line":"                        LOG.info(_LI(\"skipping add target %(target_array)s to \""},{"line_number":1065,"context_line":"                                     \"protection group %(pgname)s since it\u0027s \""},{"line_number":1066,"context_line":"                                     \"already added\"),"},{"line_number":1067,"context_line":"                                 {\"target_array\": target_array.array_name,"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_7b26f217","line":1064,"in_reply_to":"fa1b9901_72144a4c","updated":"2015-08-27 20:06:23.000000000","message":"Done","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"822d2fb6a1244a85077aae1c5c6b3432a81b69c1","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"                except purestorage.PureHTTPError as err:"},{"line_number":1084,"context_line":"                    with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":1085,"context_line":"                        if err.code \u003d\u003d 400 and (\"Protection group is already\""},{"line_number":1086,"context_line":"                                                \" allowed on this target\""},{"line_number":1087,"context_line":"                                                in err.text):"},{"line_number":1088,"context_line":"                            ctxt.reraise \u003d False"},{"line_number":1089,"context_line":"                            LOG.info(_LI(\"skipping allow pgroup %(pgname)s on \""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_f2005a04","line":1086,"updated":"2015-08-25 21:01:23.000000000","message":"\".\" at EOL","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"a1f7d10d8623b3515072f40de6b4e2676a650ac2","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"                except purestorage.PureHTTPError as err:"},{"line_number":1084,"context_line":"                    with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":1085,"context_line":"                        if err.code \u003d\u003d 400 and (\"Protection group is already\""},{"line_number":1086,"context_line":"                                                \" allowed on this target\""},{"line_number":1087,"context_line":"                                                in err.text):"},{"line_number":1088,"context_line":"                            ctxt.reraise \u003d False"},{"line_number":1089,"context_line":"                            LOG.info(_LI(\"skipping allow pgroup %(pgname)s on \""}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_5b1d2ebc","line":1086,"in_reply_to":"fa1b9901_f2005a04","updated":"2015-08-27 20:06:23.000000000","message":"Done","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"822d2fb6a1244a85077aae1c5c6b3432a81b69c1","unresolved":false,"context_lines":[{"line_number":1086,"context_line":"                                                \" allowed on this target\""},{"line_number":1087,"context_line":"                                                in err.text):"},{"line_number":1088,"context_line":"                            ctxt.reraise \u003d False"},{"line_number":1089,"context_line":"                            LOG.info(_LI(\"skipping allow pgroup %(pgname)s on \""},{"line_number":1090,"context_line":"                                         \"target array %(target_array)s since\""},{"line_number":1091,"context_line":"                                         \" it is already allowed\"),"},{"line_number":1092,"context_line":"                                     {\"pgname\": self._replication_pg_name,"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_0d6a8fb3","line":1089,"updated":"2015-08-25 21:01:23.000000000","message":"Suggest: \"Skipping allow pgroup %(pgname)s on target array %(target_array)s since it is already allowed.\"","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"a1f7d10d8623b3515072f40de6b4e2676a650ac2","unresolved":false,"context_lines":[{"line_number":1086,"context_line":"                                                \" allowed on this target\""},{"line_number":1087,"context_line":"                                                in err.text):"},{"line_number":1088,"context_line":"                            ctxt.reraise \u003d False"},{"line_number":1089,"context_line":"                            LOG.info(_LI(\"skipping allow pgroup %(pgname)s on \""},{"line_number":1090,"context_line":"                                         \"target array %(target_array)s since\""},{"line_number":1091,"context_line":"                                         \" it is already allowed\"),"},{"line_number":1092,"context_line":"                                     {\"pgname\": self._replication_pg_name,"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_7b6d9231","line":1089,"in_reply_to":"fa1b9901_0d6a8fb3","updated":"2015-08-27 20:06:23.000000000","message":"Done","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"822d2fb6a1244a85077aae1c5c6b3432a81b69c1","unresolved":false,"context_lines":[{"line_number":1154,"context_line":"                    break"},{"line_number":1155,"context_line":"            if volume_snap:  # Found the volume snapshot we needed"},{"line_number":1156,"context_line":"                    LOG.debug(\"found snapshot for volume %(vol)s in \""},{"line_number":1157,"context_line":"                              \"snap %(snap)s\","},{"line_number":1158,"context_line":"                              {snap: pg_snap[\"name\"],"},{"line_number":1159,"context_line":"                               \"vol\": vol_snap_source_to_find})"},{"line_number":1160,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_2dae73e6","line":1157,"updated":"2015-08-25 21:01:23.000000000","message":"Suggest: \"\"found snapshot for volume %(vol)s in snap %(snap)s.\"","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"a1f7d10d8623b3515072f40de6b4e2676a650ac2","unresolved":false,"context_lines":[{"line_number":1154,"context_line":"                    break"},{"line_number":1155,"context_line":"            if volume_snap:  # Found the volume snapshot we needed"},{"line_number":1156,"context_line":"                    LOG.debug(\"found snapshot for volume %(vol)s in \""},{"line_number":1157,"context_line":"                              \"snap %(snap)s\","},{"line_number":1158,"context_line":"                              {snap: pg_snap[\"name\"],"},{"line_number":1159,"context_line":"                               \"vol\": vol_snap_source_to_find})"},{"line_number":1160,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_bb9eca05","line":1157,"in_reply_to":"fa1b9901_2dae73e6","updated":"2015-08-27 20:06:23.000000000","message":"Done","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"822d2fb6a1244a85077aae1c5c6b3432a81b69c1","unresolved":false,"context_lines":[{"line_number":1170,"context_line":"                    # Happens if the PG already exists"},{"line_number":1171,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":1172,"context_line":"                    LOG.warning(_LW(\"Skipping creation of PG %s since it \""},{"line_number":1173,"context_line":"                                    \"already exists\"), pgname)"},{"line_number":1174,"context_line":"                    # We assume PG has already been setup with correct"},{"line_number":1175,"context_line":"                    # replication settings."},{"line_number":1176,"context_line":"                    return"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_0d984fbf","line":1173,"updated":"2015-08-25 21:01:23.000000000","message":"\".\" at EOL","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"a1f7d10d8623b3515072f40de6b4e2676a650ac2","unresolved":false,"context_lines":[{"line_number":1170,"context_line":"                    # Happens if the PG already exists"},{"line_number":1171,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":1172,"context_line":"                    LOG.warning(_LW(\"Skipping creation of PG %s since it \""},{"line_number":1173,"context_line":"                                    \"already exists\"), pgname)"},{"line_number":1174,"context_line":"                    # We assume PG has already been setup with correct"},{"line_number":1175,"context_line":"                    # replication settings."},{"line_number":1176,"context_line":"                    return"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_db5e1e76","line":1173,"in_reply_to":"fa1b9901_0d984fbf","updated":"2015-08-27 20:06:23.000000000","message":"Done","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"822d2fb6a1244a85077aae1c5c6b3432a81b69c1","unresolved":false,"context_lines":[{"line_number":1178,"context_line":"                        ERR_MSG_PENDING_ERADICATION in err.text):"},{"line_number":1179,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":1180,"context_line":"                    LOG.warning(_LW(\"Protection group %s is deleted but not\""},{"line_number":1181,"context_line":"                                    \" eradicated - will recreate\"), pgname)"},{"line_number":1182,"context_line":"                    source_array.eradicate_pgroup(pgname)"},{"line_number":1183,"context_line":"                    source_array.create_pgroup(pgname)"},{"line_number":1184,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_2d951386","line":1181,"updated":"2015-08-25 21:01:23.000000000","message":"\".\" at EOL","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":13868,"name":"Danny Wilson","email":"daniel.wilson@purestorage.com","username":"dannywilson"},"change_message_id":"a1f7d10d8623b3515072f40de6b4e2676a650ac2","unresolved":false,"context_lines":[{"line_number":1178,"context_line":"                        ERR_MSG_PENDING_ERADICATION in err.text):"},{"line_number":1179,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":1180,"context_line":"                    LOG.warning(_LW(\"Protection group %s is deleted but not\""},{"line_number":1181,"context_line":"                                    \" eradicated - will recreate\"), pgname)"},{"line_number":1182,"context_line":"                    source_array.eradicate_pgroup(pgname)"},{"line_number":1183,"context_line":"                    source_array.create_pgroup(pgname)"},{"line_number":1184,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_7b54b253","line":1181,"in_reply_to":"fa1b9901_2d951386","updated":"2015-08-27 20:06:23.000000000","message":"Done","commit_id":"8d449d04154b19206319e5238f36547651df3f1b"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"c72c20aa1fb5c58c2ea1d895bc2fe9e476bf6aba","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        self._backend_name \u003d (self.configuration.volume_backend_name or"},{"line_number":112,"context_line":"                              self.__class__.__name__)"},{"line_number":113,"context_line":"        self._replication_target_arrays \u003d []"},{"line_number":114,"context_line":"        self._replication_pg_name \u003d \"cinder-group\""},{"line_number":115,"context_line":"        self._replication_interval \u003d None"},{"line_number":116,"context_line":"        self._replication_retention_short_term \u003d None"},{"line_number":117,"context_line":"        self._replication_retention_long_term \u003d None"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_b86e87c7","line":114,"updated":"2015-08-27 23:43:49.000000000","message":"_replication_pg_name is a constant instead of being loaded from config. Does that mean we cannot have multiple replications configured on the same array?\neg. if a volume on Array A needs to replicate to Array B, and another volume on Array A needs to replicate to Array C, it can\u0027t because there is only a single PG controlling replication","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"aeec0ed18e82a3ebecc092d8890ee143688215f3","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        self._backend_name \u003d (self.configuration.volume_backend_name or"},{"line_number":112,"context_line":"                              self.__class__.__name__)"},{"line_number":113,"context_line":"        self._replication_target_arrays \u003d []"},{"line_number":114,"context_line":"        self._replication_pg_name \u003d \"cinder-group\""},{"line_number":115,"context_line":"        self._replication_interval \u003d None"},{"line_number":116,"context_line":"        self._replication_retention_short_term \u003d None"},{"line_number":117,"context_line":"        self._replication_retention_long_term \u003d None"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_d8dd7643","line":114,"in_reply_to":"da20952f_b86e87c7","updated":"2015-08-28 01:53:41.000000000","message":"For now the implementation is that we replicate the volume to all configured replication_devices. As a future enhancement we will probably need multiple groups and can allow for specifying more flexibility in replication settings on a volume type basis.","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"c72c20aa1fb5c58c2ea1d895bc2fe9e476bf6aba","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                target_array_info \u003d array.get()"},{"line_number":177,"context_line":"                array.array_name \u003d target_array_info[\"array_name\"]"},{"line_number":178,"context_line":"                array.array_id \u003d target_array_info[\"id\"]"},{"line_number":179,"context_line":"                self._setup_replicated_pgroups()"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"            self._is_replication_enabled \u003d True"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_438c1c7f","line":179,"updated":"2015-08-27 23:43:49.000000000","message":"it seems that we don\u0027t need to call _setup_replicated_pgroups for every target array","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"aeec0ed18e82a3ebecc092d8890ee143688215f3","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                target_array_info \u003d array.get()"},{"line_number":177,"context_line":"                array.array_name \u003d target_array_info[\"array_name\"]"},{"line_number":178,"context_line":"                array.array_id \u003d target_array_info[\"id\"]"},{"line_number":179,"context_line":"                self._setup_replicated_pgroups()"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"            self._is_replication_enabled \u003d True"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_042f0af7","line":179,"in_reply_to":"da20952f_438c1c7f","updated":"2015-08-28 01:53:41.000000000","message":"Done","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"c72c20aa1fb5c58c2ea1d895bc2fe9e476bf6aba","unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        # TODO(dwilson): figure out if we need to mirror consisgroup on"},{"line_number":233,"context_line":"        # target array if failover has occurred."},{"line_number":234,"context_line":"        if volume[\u0027consistencygroup_id\u0027]:"},{"line_number":235,"context_line":"            self._add_volume_to_consistency_group("},{"line_number":236,"context_line":"                volume[\u0027consistencygroup_id\u0027],"},{"line_number":237,"context_line":"                vol_name"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_2356c8d2","line":234,"updated":"2015-08-27 23:43:49.000000000","message":"in case volume is failed over, _add_volume_to_consistency_group will cause purity to throw an exception (volume not found)","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"aeec0ed18e82a3ebecc092d8890ee143688215f3","unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        # TODO(dwilson): figure out if we need to mirror consisgroup on"},{"line_number":233,"context_line":"        # target array if failover has occurred."},{"line_number":234,"context_line":"        if volume[\u0027consistencygroup_id\u0027]:"},{"line_number":235,"context_line":"            self._add_volume_to_consistency_group("},{"line_number":236,"context_line":"                volume[\u0027consistencygroup_id\u0027],"},{"line_number":237,"context_line":"                vol_name"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_04e14ad0","line":234,"in_reply_to":"da20952f_2356c8d2","updated":"2015-08-28 01:53:41.000000000","message":"Good point, for now lets just not try and add to the consistency group if the volume has failed over.","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"c72c20aa1fb5c58c2ea1d895bc2fe9e476bf6aba","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        # TODO(dwilson): figure out if we need to mirror consisgroup on"},{"line_number":274,"context_line":"        # target array if failover has occurred."},{"line_number":275,"context_line":"        if volume[\u0027consistencygroup_id\u0027]:"},{"line_number":276,"context_line":"            self._add_volume_to_consistency_group("},{"line_number":277,"context_line":"                volume[\u0027consistencygroup_id\u0027],"},{"line_number":278,"context_line":"                vol_name"},{"line_number":279,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_deffa3ff","line":276,"updated":"2015-08-27 23:43:49.000000000","message":"save as above, purity will throw volume not found exception in case we\u0027re failed over.\n\nI guess _add_volume_to_consistency_group should take a FlashArray parameter","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"aeec0ed18e82a3ebecc092d8890ee143688215f3","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        # TODO(dwilson): figure out if we need to mirror consisgroup on"},{"line_number":274,"context_line":"        # target array if failover has occurred."},{"line_number":275,"context_line":"        if volume[\u0027consistencygroup_id\u0027]:"},{"line_number":276,"context_line":"            self._add_volume_to_consistency_group("},{"line_number":277,"context_line":"                volume[\u0027consistencygroup_id\u0027],"},{"line_number":278,"context_line":"                vol_name"},{"line_number":279,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_58f2c6d3","line":276,"in_reply_to":"da20952f_deffa3ff","updated":"2015-08-28 01:53:41.000000000","message":"Done","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"c72c20aa1fb5c58c2ea1d895bc2fe9e476bf6aba","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        current_array \u003d self._get_current_array(volume)"},{"line_number":298,"context_line":"        try:"},{"line_number":299,"context_line":"            connected_hosts \u003d \\"},{"line_number":300,"context_line":"                current_array.list_volume_private_connections(vol_name)"},{"line_number":301,"context_line":"            for host_info in connected_hosts:"},{"line_number":302,"context_line":"                host_name \u003d host_info[\"host\"]"},{"line_number":303,"context_line":"                self._disconnect_host(current_array, host_name, vol_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_3e301fe8","line":300,"updated":"2015-08-27 23:43:49.000000000","message":"are we using ( instead of \\ for continuation now?","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"aeec0ed18e82a3ebecc092d8890ee143688215f3","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        current_array \u003d self._get_current_array(volume)"},{"line_number":298,"context_line":"        try:"},{"line_number":299,"context_line":"            connected_hosts \u003d \\"},{"line_number":300,"context_line":"                current_array.list_volume_private_connections(vol_name)"},{"line_number":301,"context_line":"            for host_info in connected_hosts:"},{"line_number":302,"context_line":"                host_name \u003d host_info[\"host\"]"},{"line_number":303,"context_line":"                self._disconnect_host(current_array, host_name, vol_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_e40536c2","line":300,"in_reply_to":"da20952f_3e301fe8","updated":"2015-08-28 01:53:41.000000000","message":"Done","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"c72c20aa1fb5c58c2ea1d895bc2fe9e476bf6aba","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        try:"},{"line_number":299,"context_line":"            connected_hosts \u003d \\"},{"line_number":300,"context_line":"                current_array.list_volume_private_connections(vol_name)"},{"line_number":301,"context_line":"            for host_info in connected_hosts:"},{"line_number":302,"context_line":"                host_name \u003d host_info[\"host\"]"},{"line_number":303,"context_line":"                self._disconnect_host(current_array, host_name, vol_name)"},{"line_number":304,"context_line":"            current_array.destroy_volume(vol_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_fe9e27b7","line":301,"updated":"2015-08-27 23:43:49.000000000","message":"I think we also need to do list_volume_shared_connections and disconnect from host groups","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"aeec0ed18e82a3ebecc092d8890ee143688215f3","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        try:"},{"line_number":299,"context_line":"            connected_hosts \u003d \\"},{"line_number":300,"context_line":"                current_array.list_volume_private_connections(vol_name)"},{"line_number":301,"context_line":"            for host_info in connected_hosts:"},{"line_number":302,"context_line":"                host_name \u003d host_info[\"host\"]"},{"line_number":303,"context_line":"                self._disconnect_host(current_array, host_name, vol_name)"},{"line_number":304,"context_line":"            current_array.destroy_volume(vol_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_4468a287","line":301,"in_reply_to":"da20952f_fe9e27b7","updated":"2015-08-28 01:53:41.000000000","message":"We should file that file as a separate bug, but definitely should be fixed.","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"c72c20aa1fb5c58c2ea1d895bc2fe9e476bf6aba","unresolved":false,"context_lines":[{"line_number":301,"context_line":"            for host_info in connected_hosts:"},{"line_number":302,"context_line":"                host_name \u003d host_info[\"host\"]"},{"line_number":303,"context_line":"                self._disconnect_host(current_array, host_name, vol_name)"},{"line_number":304,"context_line":"            current_array.destroy_volume(vol_name)"},{"line_number":305,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":306,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":307,"context_line":"                if err.code \u003d\u003d 400 and \\"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_fe85c758","line":304,"updated":"2015-08-27 23:43:49.000000000","message":"do we also need to eradicate?","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"aeec0ed18e82a3ebecc092d8890ee143688215f3","unresolved":false,"context_lines":[{"line_number":301,"context_line":"            for host_info in connected_hosts:"},{"line_number":302,"context_line":"                host_name \u003d host_info[\"host\"]"},{"line_number":303,"context_line":"                self._disconnect_host(current_array, host_name, vol_name)"},{"line_number":304,"context_line":"            current_array.destroy_volume(vol_name)"},{"line_number":305,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":306,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":307,"context_line":"                if err.code \u003d\u003d 400 and \\"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_e43776ae","line":304,"in_reply_to":"da20952f_fe85c758","updated":"2015-08-28 01:53:41.000000000","message":"Nope, we only destroy them. The assumption being that its safer to allow an admin to come back and recover on the array if they needed to.","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"c72c20aa1fb5c58c2ea1d895bc2fe9e476bf6aba","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":335,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":336,"context_line":"                if err.code \u003d\u003d 400:"},{"line_number":337,"context_line":"                    # Happens if the snapshot does not exist."},{"line_number":338,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":339,"context_line":"                    LOG.error(_LE(\"Snapshot deletion failed with message:\""},{"line_number":340,"context_line":"                                  \" %s\"), err.text)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_9ef36b0a","line":337,"updated":"2015-08-27 23:43:49.000000000","message":"do we need to check ERR_MSG_NOT_EXIST?","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"aeec0ed18e82a3ebecc092d8890ee143688215f3","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":335,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":336,"context_line":"                if err.code \u003d\u003d 400:"},{"line_number":337,"context_line":"                    # Happens if the snapshot does not exist."},{"line_number":338,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":339,"context_line":"                    LOG.error(_LE(\"Snapshot deletion failed with message:\""},{"line_number":340,"context_line":"                                  \" %s\"), err.text)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_64de066f","line":337,"in_reply_to":"da20952f_9ef36b0a","updated":"2015-08-28 01:53:41.000000000","message":"This is being fixed in another change, https://review.openstack.org/#/c/217940/","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"c72c20aa1fb5c58c2ea1d895bc2fe9e476bf6aba","unresolved":false,"context_lines":[{"line_number":360,"context_line":"            host_name \u003d host[\"name\"]"},{"line_number":361,"context_line":"            result \u003d self._disconnect_host(array, host_name, vol_name)"},{"line_number":362,"context_line":"        else:"},{"line_number":363,"context_line":"            LOG.error(_LE(\"Unable to disconnect host from volume.\"))"},{"line_number":364,"context_line":"            result \u003d False"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        return result"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_be12ef07","line":363,"updated":"2015-08-27 23:43:49.000000000","message":"error message should indicate \"unable to determine host\" etc ... this seems misleading.\n\nThis message might be more appropriate inside the catch section of a try catch block around _disconnect_host","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"aeec0ed18e82a3ebecc092d8890ee143688215f3","unresolved":false,"context_lines":[{"line_number":360,"context_line":"            host_name \u003d host[\"name\"]"},{"line_number":361,"context_line":"            result \u003d self._disconnect_host(array, host_name, vol_name)"},{"line_number":362,"context_line":"        else:"},{"line_number":363,"context_line":"            LOG.error(_LE(\"Unable to disconnect host from volume.\"))"},{"line_number":364,"context_line":"            result \u003d False"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        return result"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_04edca24","line":363,"in_reply_to":"da20952f_be12ef07","updated":"2015-08-28 01:53:41.000000000","message":"Done","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"c72c20aa1fb5c58c2ea1d895bc2fe9e476bf6aba","unresolved":false,"context_lines":[{"line_number":380,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":381,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":382,"context_line":"                if err.code \u003d\u003d 400:"},{"line_number":383,"context_line":"                    # Happens if the host and volume are not connected."},{"line_number":384,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":385,"context_line":"                    LOG.error(_LE(\"Disconnection failed with message: \""},{"line_number":386,"context_line":"                                  \"%(msg)s.\"), {\"msg\": err.text})"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_be298f39","line":383,"updated":"2015-08-27 23:43:49.000000000","message":"do we need to check error message?","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"aeec0ed18e82a3ebecc092d8890ee143688215f3","unresolved":false,"context_lines":[{"line_number":380,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":381,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":382,"context_line":"                if err.code \u003d\u003d 400:"},{"line_number":383,"context_line":"                    # Happens if the host and volume are not connected."},{"line_number":384,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":385,"context_line":"                    LOG.error(_LE(\"Disconnection failed with message: \""},{"line_number":386,"context_line":"                                  \"%(msg)s.\"), {\"msg\": err.text})"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_64cfe67f","line":383,"in_reply_to":"da20952f_be298f39","updated":"2015-08-28 01:53:41.000000000","message":"Done","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"c72c20aa1fb5c58c2ea1d895bc2fe9e476bf6aba","unresolved":false,"context_lines":[{"line_number":793,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":794,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":795,"context_line":"                if (err.code \u003d\u003d 400 and"},{"line_number":796,"context_line":"                        \"Connection already exists\" in err.text):"},{"line_number":797,"context_line":"                    # Happens if the volume is already connected to the host."},{"line_number":798,"context_line":"                    # Treat this as a success."},{"line_number":799,"context_line":"                    ctxt.reraise \u003d False"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_beae6f96","line":796,"updated":"2015-08-27 23:43:49.000000000","message":"let\u0027s make this message a const","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"aeec0ed18e82a3ebecc092d8890ee143688215f3","unresolved":false,"context_lines":[{"line_number":793,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":794,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":795,"context_line":"                if (err.code \u003d\u003d 400 and"},{"line_number":796,"context_line":"                        \"Connection already exists\" in err.text):"},{"line_number":797,"context_line":"                    # Happens if the volume is already connected to the host."},{"line_number":798,"context_line":"                    # Treat this as a success."},{"line_number":799,"context_line":"                    ctxt.reraise \u003d False"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_e9318f0c","line":796,"in_reply_to":"da20952f_beae6f96","updated":"2015-08-28 01:53:41.000000000","message":"Done","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"c72c20aa1fb5c58c2ea1d895bc2fe9e476bf6aba","unresolved":false,"context_lines":[{"line_number":1063,"context_line":"                    self._array.set_pgroup("},{"line_number":1064,"context_line":"                        self._replication_pg_name,"},{"line_number":1065,"context_line":"                        addtargetlist\u003d[target_array.array_name])"},{"line_number":1066,"context_line":"            except purestorage.PureHTTPError as err:"},{"line_number":1067,"context_line":"                with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":1068,"context_line":"                    if err.code \u003d\u003d 400 and ("},{"line_number":1069,"context_line":"                            \"Protection group already includes target\""}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_58ff2baa","line":1066,"updated":"2015-08-27 23:43:49.000000000","message":"the try catch should be around adding each target array to PG.\nfor target_array in ...\n     try:\n          self._array.set_pgroup(.....\n\netc","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"aeec0ed18e82a3ebecc092d8890ee143688215f3","unresolved":false,"context_lines":[{"line_number":1063,"context_line":"                    self._array.set_pgroup("},{"line_number":1064,"context_line":"                        self._replication_pg_name,"},{"line_number":1065,"context_line":"                        addtargetlist\u003d[target_array.array_name])"},{"line_number":1066,"context_line":"            except purestorage.PureHTTPError as err:"},{"line_number":1067,"context_line":"                with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":1068,"context_line":"                    if err.code \u003d\u003d 400 and ("},{"line_number":1069,"context_line":"                            \"Protection group already includes target\""}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_04038a0e","line":1066,"in_reply_to":"da20952f_58ff2baa","updated":"2015-08-28 01:53:41.000000000","message":"Done","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"c72c20aa1fb5c58c2ea1d895bc2fe9e476bf6aba","unresolved":false,"context_lines":[{"line_number":1066,"context_line":"            except purestorage.PureHTTPError as err:"},{"line_number":1067,"context_line":"                with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":1068,"context_line":"                    if err.code \u003d\u003d 400 and ("},{"line_number":1069,"context_line":"                            \"Protection group already includes target\""},{"line_number":1070,"context_line":"                            in err.text):"},{"line_number":1071,"context_line":"                        ctxt.reraise \u003d False"},{"line_number":1072,"context_line":"                        LOG.info(_LI(\"Skipping add target %(target_array)s to \""}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_58bacb0b","line":1069,"updated":"2015-08-27 23:43:49.000000000","message":"let\u0027s make this string a const","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"aeec0ed18e82a3ebecc092d8890ee143688215f3","unresolved":false,"context_lines":[{"line_number":1066,"context_line":"            except purestorage.PureHTTPError as err:"},{"line_number":1067,"context_line":"                with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":1068,"context_line":"                    if err.code \u003d\u003d 400 and ("},{"line_number":1069,"context_line":"                            \"Protection group already includes target\""},{"line_number":1070,"context_line":"                            in err.text):"},{"line_number":1071,"context_line":"                        ctxt.reraise \u003d False"},{"line_number":1072,"context_line":"                        LOG.info(_LI(\"Skipping add target %(target_array)s to \""}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_042aaa7e","line":1069,"in_reply_to":"da20952f_58bacb0b","updated":"2015-08-28 01:53:41.000000000","message":"Done","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"c72c20aa1fb5c58c2ea1d895bc2fe9e476bf6aba","unresolved":false,"context_lines":[{"line_number":1090,"context_line":"                                            allowed\u003dTrue)"},{"line_number":1091,"context_line":"                except purestorage.PureHTTPError as err:"},{"line_number":1092,"context_line":"                    with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":1093,"context_line":"                        if err.code \u003d\u003d 400 and (\"Protection group is already \""},{"line_number":1094,"context_line":"                                                \"allowed on this target.\""},{"line_number":1095,"context_line":"                                                in err.text):"},{"line_number":1096,"context_line":"                            ctxt.reraise \u003d False"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_d8857b07","line":1093,"updated":"2015-08-27 23:43:49.000000000","message":"let\u0027s make this a const like other error messages","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"aeec0ed18e82a3ebecc092d8890ee143688215f3","unresolved":false,"context_lines":[{"line_number":1090,"context_line":"                                            allowed\u003dTrue)"},{"line_number":1091,"context_line":"                except purestorage.PureHTTPError as err:"},{"line_number":1092,"context_line":"                    with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":1093,"context_line":"                        if err.code \u003d\u003d 400 and (\"Protection group is already \""},{"line_number":1094,"context_line":"                                                \"allowed on this target.\""},{"line_number":1095,"context_line":"                                                in err.text):"},{"line_number":1096,"context_line":"                            ctxt.reraise \u003d False"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_c42352a6","line":1093,"in_reply_to":"da20952f_d8857b07","updated":"2015-08-28 01:53:41.000000000","message":"Done","commit_id":"fa8f21a942bf2199e2a69e8d1afc97e96c30cbb9"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"c826f837516695f03a99f019cf294d71d7bfcc27","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        if managed_parsing is True and replication_targets:"},{"line_number":149,"context_line":"            # Make list of managed replication targets"},{"line_number":150,"context_line":"            for target in replication_targets:"},{"line_number":151,"context_line":"                mgr \u003d self.volume_managers[target]"},{"line_number":152,"context_line":"                target_array \u003d purestorage.FlashArray("},{"line_number":153,"context_line":"                    mgr.safe_get(\"san_ip\"),"},{"line_number":154,"context_line":"                    api_token\u003dmgr.safe_get(\"pure_api_token\"))"}],"source_content_type":"text/x-python","patch_set":10,"id":"da20952f_3b615ad4","line":151,"updated":"2015-09-01 17:30:00.000000000","message":"I don\u0027t think you have volume_managers defined. Or is it pulled in from somewhere?","commit_id":"045ef7cbf53bf016de13af1d644c8cd10bb626ef"},{"author":{"_account_id":17718,"name":"Lallana","email":"gaozhiqiang2@huawei.com","username":"Lallana"},"change_message_id":"61b930c1f5f14e7c53d15bd58b57182167369d2f","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        \"\"\"Ensure that an existing_ref is valid and return volume info"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"        If the ref is not valid throw a ManageExistingInvalidReference"},{"line_number":653,"context_line":"        exception with an appropriate error."},{"line_number":654,"context_line":"        \"\"\""},{"line_number":655,"context_line":"        if \"name\" not in existing_ref or not existing_ref[\"name\"]:"},{"line_number":656,"context_line":"            raise exception.ManageExistingInvalidReference("}],"source_content_type":"text/x-python","patch_set":10,"id":"da20952f_a62733b5","line":653,"updated":"2015-08-28 09:05:31.000000000","message":"Maybe you can add a new line after the docstrings","commit_id":"045ef7cbf53bf016de13af1d644c8cd10bb626ef"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"c96fa7f815620d9fc48d1d9a50fffea237e434bf","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        \"\"\"Ensure that an existing_ref is valid and return volume info"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"        If the ref is not valid throw a ManageExistingInvalidReference"},{"line_number":653,"context_line":"        exception with an appropriate error."},{"line_number":654,"context_line":"        \"\"\""},{"line_number":655,"context_line":"        if \"name\" not in existing_ref or not existing_ref[\"name\"]:"},{"line_number":656,"context_line":"            raise exception.ManageExistingInvalidReference("}],"source_content_type":"text/x-python","patch_set":10,"id":"da20952f_ead2bcff","line":653,"in_reply_to":"da20952f_a62733b5","updated":"2015-08-28 15:03:22.000000000","message":"Please don\u0027t downvote for questions and for code that is not part of the code being modified by the patch.\n\nAlso, no, there should not be a newline after the docstring.","commit_id":"045ef7cbf53bf016de13af1d644c8cd10bb626ef"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"82aa33db118c56b78b4bb69873e8e8f2ef24a2dd","unresolved":false,"context_lines":[{"line_number":982,"context_line":"                                   \u0027status\u0027: replication_status})"},{"line_number":983,"context_line":""},{"line_number":984,"context_line":"        data[\"targets\"] \u003d remote_targets"},{"line_number":985,"context_line":"        return data"},{"line_number":986,"context_line":""},{"line_number":987,"context_line":"    @log_debug_trace"},{"line_number":988,"context_line":"    def get_replication_updates(self, context):"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_f5d293ff","line":985,"updated":"2015-09-03 22:01:03.000000000","message":"The driver manager suggests: \"In the case of a volume that isn\u0027t being replicated, the driver should return an empty list.\" \n\nThis looks like it will always return something. data will always contain \u0027volume_id\u0027 at the very least.","commit_id":"261bceb48ed13b166d9cdf4a9d15079ba5eba043"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"1f29a0537e0f95753207f85d80fb96ebf54dca8a","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    # These are used as default settings.  In future these can be overridden"},{"line_number":53,"context_line":"    # by settings in volume-type."},{"line_number":54,"context_line":"    cfg.IntOpt(\"pure_replica_interval_default\", default\u003d900,"},{"line_number":55,"context_line":"               help\u003d\"Snapshot replication interval in seconds\"),"},{"line_number":56,"context_line":"    cfg.IntOpt(\"pure_replica_retention_short_term_default\", default\u003d14400,"},{"line_number":57,"context_line":"               help\u003d\"Retain all snapshots on target for this \""},{"line_number":58,"context_line":"                    \"time (in seconds)\"),"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_1c7e276a","line":55,"updated":"2015-09-04 19:53:30.000000000","message":"Dot at EOT","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"fe2e46d4f808508b630a5dbef1875ee023b61812","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    # These are used as default settings.  In future these can be overridden"},{"line_number":53,"context_line":"    # by settings in volume-type."},{"line_number":54,"context_line":"    cfg.IntOpt(\"pure_replica_interval_default\", default\u003d900,"},{"line_number":55,"context_line":"               help\u003d\"Snapshot replication interval in seconds\"),"},{"line_number":56,"context_line":"    cfg.IntOpt(\"pure_replica_retention_short_term_default\", default\u003d14400,"},{"line_number":57,"context_line":"               help\u003d\"Retain all snapshots on target for this \""},{"line_number":58,"context_line":"                    \"time (in seconds)\"),"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_60b03d8c","line":55,"in_reply_to":"da20952f_1c7e276a","updated":"2015-12-22 18:28:37.000000000","message":"Done","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"1f29a0537e0f95753207f85d80fb96ebf54dca8a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"               help\u003d\"Snapshot replication interval in seconds\"),"},{"line_number":56,"context_line":"    cfg.IntOpt(\"pure_replica_retention_short_term_default\", default\u003d14400,"},{"line_number":57,"context_line":"               help\u003d\"Retain all snapshots on target for this \""},{"line_number":58,"context_line":"                    \"time (in seconds)\"),"},{"line_number":59,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_per_day_default\", default\u003d3,"},{"line_number":60,"context_line":"               help\u003d\"Retain how many snapshots for each day\"),"},{"line_number":61,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_default\", default\u003d7,"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_dc942f8c","line":58,"updated":"2015-09-04 19:53:30.000000000","message":"same","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"fe2e46d4f808508b630a5dbef1875ee023b61812","unresolved":false,"context_lines":[{"line_number":55,"context_line":"               help\u003d\"Snapshot replication interval in seconds\"),"},{"line_number":56,"context_line":"    cfg.IntOpt(\"pure_replica_retention_short_term_default\", default\u003d14400,"},{"line_number":57,"context_line":"               help\u003d\"Retain all snapshots on target for this \""},{"line_number":58,"context_line":"                    \"time (in seconds)\"),"},{"line_number":59,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_per_day_default\", default\u003d3,"},{"line_number":60,"context_line":"               help\u003d\"Retain how many snapshots for each day\"),"},{"line_number":61,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_default\", default\u003d7,"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_40a50145","line":58,"in_reply_to":"da20952f_dc942f8c","updated":"2015-12-22 18:28:37.000000000","message":"Done","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"1f29a0537e0f95753207f85d80fb96ebf54dca8a","unresolved":false,"context_lines":[{"line_number":57,"context_line":"               help\u003d\"Retain all snapshots on target for this \""},{"line_number":58,"context_line":"                    \"time (in seconds)\"),"},{"line_number":59,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_per_day_default\", default\u003d3,"},{"line_number":60,"context_line":"               help\u003d\"Retain how many snapshots for each day\"),"},{"line_number":61,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_default\", default\u003d7,"},{"line_number":62,"context_line":"               help\u003d\"Retain pure_replication_retention_long_term_per_day\""},{"line_number":63,"context_line":"                    \" snapshots per day on target for this time (in days)\"),"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_9c8a3763","line":60,"updated":"2015-09-04 19:53:30.000000000","message":"same","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"fe2e46d4f808508b630a5dbef1875ee023b61812","unresolved":false,"context_lines":[{"line_number":57,"context_line":"               help\u003d\"Retain all snapshots on target for this \""},{"line_number":58,"context_line":"                    \"time (in seconds)\"),"},{"line_number":59,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_per_day_default\", default\u003d3,"},{"line_number":60,"context_line":"               help\u003d\"Retain how many snapshots for each day\"),"},{"line_number":61,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_default\", default\u003d7,"},{"line_number":62,"context_line":"               help\u003d\"Retain pure_replication_retention_long_term_per_day\""},{"line_number":63,"context_line":"                    \" snapshots per day on target for this time (in days)\"),"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_e062ed15","line":60,"in_reply_to":"da20952f_9c8a3763","updated":"2015-12-22 18:28:37.000000000","message":"Done","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"7cb9fc75c85ee4398203d2466c3ab05e321f4fe8","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_per_day_default\", default\u003d3,"},{"line_number":60,"context_line":"               help\u003d\"Retain how many snapshots for each day\"),"},{"line_number":61,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_default\", default\u003d7,"},{"line_number":62,"context_line":"               help\u003d\"Retain pure_replication_retention_long_term_per_day\""},{"line_number":63,"context_line":"                    \" snapshots per day on target for this time (in days)\"),"},{"line_number":64,"context_line":"]"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a1a9d01_66b3d24d","line":62,"updated":"2015-10-01 05:46:28.000000000","message":"Where is pure_replication_retention_long_term_per_day defined?","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"fe2e46d4f808508b630a5dbef1875ee023b61812","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_per_day_default\", default\u003d3,"},{"line_number":60,"context_line":"               help\u003d\"Retain how many snapshots for each day\"),"},{"line_number":61,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_default\", default\u003d7,"},{"line_number":62,"context_line":"               help\u003d\"Retain pure_replication_retention_long_term_per_day\""},{"line_number":63,"context_line":"                    \" snapshots per day on target for this time (in days)\"),"},{"line_number":64,"context_line":"]"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_a0b5c57e","line":62,"in_reply_to":"9a1a9d01_66b3d24d","updated":"2015-12-22 18:28:37.000000000","message":"typo: should be _replication_retention_long_term_per_day\nfixed","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"1f29a0537e0f95753207f85d80fb96ebf54dca8a","unresolved":false,"context_lines":[{"line_number":60,"context_line":"               help\u003d\"Retain how many snapshots for each day\"),"},{"line_number":61,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_default\", default\u003d7,"},{"line_number":62,"context_line":"               help\u003d\"Retain pure_replication_retention_long_term_per_day\""},{"line_number":63,"context_line":"                    \" snapshots per day on target for this time (in days)\"),"},{"line_number":64,"context_line":"]"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_5cefbf1d","line":63,"updated":"2015-09-04 19:53:30.000000000","message":"same","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"fe2e46d4f808508b630a5dbef1875ee023b61812","unresolved":false,"context_lines":[{"line_number":60,"context_line":"               help\u003d\"Retain how many snapshots for each day\"),"},{"line_number":61,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_default\", default\u003d7,"},{"line_number":62,"context_line":"               help\u003d\"Retain pure_replication_retention_long_term_per_day\""},{"line_number":63,"context_line":"                    \" snapshots per day on target for this time (in days)\"),"},{"line_number":64,"context_line":"]"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_c06fb1fa","line":63,"in_reply_to":"da20952f_5cefbf1d","updated":"2015-12-22 18:28:37.000000000","message":"Done","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"7cb9fc75c85ee4398203d2466c3ab05e321f4fe8","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            self.configuration.san_ip,"},{"line_number":144,"context_line":"            api_token\u003dself.configuration.pure_api_token)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        LOG.debug(\"primary array name: %s\", self._array.array_name)"},{"line_number":147,"context_line":"        LOG.debug(\"primary array id: %s\", self._array.array_id)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        managed_parsing \u003d self.configuration.safe_get("}],"source_content_type":"text/x-python","patch_set":12,"id":"9a1a9d01_06ec5628","line":146,"updated":"2015-10-01 05:46:28.000000000","message":"s/primary/Primary","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"fe2e46d4f808508b630a5dbef1875ee023b61812","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            self.configuration.san_ip,"},{"line_number":144,"context_line":"            api_token\u003dself.configuration.pure_api_token)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        LOG.debug(\"primary array name: %s\", self._array.array_name)"},{"line_number":147,"context_line":"        LOG.debug(\"primary array id: %s\", self._array.array_id)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        managed_parsing \u003d self.configuration.safe_get("}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_004db998","line":146,"in_reply_to":"9a1a9d01_06ec5628","updated":"2015-12-22 18:28:37.000000000","message":"Done","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"7cb9fc75c85ee4398203d2466c3ab05e321f4fe8","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            api_token\u003dself.configuration.pure_api_token)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        LOG.debug(\"primary array name: %s\", self._array.array_name)"},{"line_number":147,"context_line":"        LOG.debug(\"primary array id: %s\", self._array.array_id)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        managed_parsing \u003d self.configuration.safe_get("},{"line_number":150,"context_line":"            \u0027managed_replication_target\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a1a9d01_c6f17e02","line":147,"updated":"2015-10-01 05:46:28.000000000","message":"ditto","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"fe2e46d4f808508b630a5dbef1875ee023b61812","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            api_token\u003dself.configuration.pure_api_token)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        LOG.debug(\"primary array name: %s\", self._array.array_name)"},{"line_number":147,"context_line":"        LOG.debug(\"primary array id: %s\", self._array.array_id)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        managed_parsing \u003d self.configuration.safe_get("},{"line_number":150,"context_line":"            \u0027managed_replication_target\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_a043856b","line":147,"in_reply_to":"9a1a9d01_c6f17e02","updated":"2015-12-22 18:28:37.000000000","message":"Done","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"1f29a0537e0f95753207f85d80fb96ebf54dca8a","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                target_array \u003d self._get_flasharray("},{"line_number":165,"context_line":"                    array_info[\"san_ip\"],"},{"line_number":166,"context_line":"                    api_token\u003darray_info[\"api_token\"])"},{"line_number":167,"context_line":"                LOG.debug(\"Adding san_ip %(san_ip)s to replication_targets\","},{"line_number":168,"context_line":"                          {\"san_ip\": array_info[\"san_ip\"]})"},{"line_number":169,"context_line":"                self._replication_target_arrays.append(target_array)"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_bce85be3","line":167,"updated":"2015-09-04 19:53:30.000000000","message":"dot at end of message","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"fe2e46d4f808508b630a5dbef1875ee023b61812","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                target_array \u003d self._get_flasharray("},{"line_number":165,"context_line":"                    array_info[\"san_ip\"],"},{"line_number":166,"context_line":"                    api_token\u003darray_info[\"api_token\"])"},{"line_number":167,"context_line":"                LOG.debug(\"Adding san_ip %(san_ip)s to replication_targets\","},{"line_number":168,"context_line":"                          {\"san_ip\": array_info[\"san_ip\"]})"},{"line_number":169,"context_line":"                self._replication_target_arrays.append(target_array)"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_ca610faa","line":167,"in_reply_to":"da20952f_bce85be3","updated":"2015-12-22 18:28:37.000000000","message":"Done","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"1f29a0537e0f95753207f85d80fb96ebf54dca8a","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                          {\"san_ip\": array_info[\"san_ip\"]})"},{"line_number":169,"context_line":"                self._replication_target_arrays.append(target_array)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        # Get replication target array info and create pgroup if needed"},{"line_number":172,"context_line":"        if self._replication_target_arrays:"},{"line_number":173,"context_line":"            self._replication_interval \u003d ("},{"line_number":174,"context_line":"                self.configuration.pure_replica_interval_default)"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_bccb7b52","line":171,"updated":"2015-09-04 19:53:30.000000000","message":"there are dots in some # comments, so please make it consistent","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"fe2e46d4f808508b630a5dbef1875ee023b61812","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                          {\"san_ip\": array_info[\"san_ip\"]})"},{"line_number":169,"context_line":"                self._replication_target_arrays.append(target_array)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        # Get replication target array info and create pgroup if needed"},{"line_number":172,"context_line":"        if self._replication_target_arrays:"},{"line_number":173,"context_line":"            self._replication_interval \u003d ("},{"line_number":174,"context_line":"                self.configuration.pure_replica_interval_default)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_ed90a597","line":171,"in_reply_to":"da20952f_bccb7b52","updated":"2015-12-22 18:28:37.000000000","message":"Done","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"7cb9fc75c85ee4398203d2466c3ab05e321f4fe8","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                target_array_info \u003d array.get()"},{"line_number":196,"context_line":"                array.array_name \u003d target_array_info[\"array_name\"]"},{"line_number":197,"context_line":"                array.array_id \u003d target_array_info[\"id\"]"},{"line_number":198,"context_line":"                LOG.debug(\"secondary array name: %s\", self._array.array_name)"},{"line_number":199,"context_line":"                LOG.debug(\"secondary array id: %s\", self._array.array_id)"},{"line_number":200,"context_line":"                self._setup_replicated_pgroups(array, [self._array],"},{"line_number":201,"context_line":"                                               self._replication_pg_name,"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a1a9d01_e6cb62a2","line":198,"updated":"2015-10-01 05:46:28.000000000","message":"s/secondary/Secondary","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"1f29a0537e0f95753207f85d80fb96ebf54dca8a","unresolved":false,"context_lines":[{"line_number":402,"context_line":"            result \u003d self._disconnect_host(array, host_name, vol_name)"},{"line_number":403,"context_line":"        else:"},{"line_number":404,"context_line":"            LOG.error(_LE(\"Unable to disconnect host from volume, could not \""},{"line_number":405,"context_line":"                          \"determine Purity host\"))"},{"line_number":406,"context_line":"            result \u003d False"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"        return result"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_5c957f30","line":405,"updated":"2015-09-04 19:53:30.000000000","message":"dot at EOT\nplease check it it other places too","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"7cb9fc75c85ee4398203d2466c3ab05e321f4fe8","unresolved":false,"context_lines":[{"line_number":981,"context_line":"                context,"},{"line_number":982,"context_line":"                volume[\"volume_type_id\"])"},{"line_number":983,"context_line":"            raise exception.PureDriverException("},{"line_number":984,"context_line":"                reason\u003d\"volume %(name)s of type %(type)s is not a replicated \""},{"line_number":985,"context_line":"                       \"type \" % {\"name\": volume[\"name\"], \"type\": volume_type})"},{"line_number":986,"context_line":"        # Get current array in case we have failed over"},{"line_number":987,"context_line":"        current_array \u003d self._get_current_array(volume)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a1a9d01_e627e260","line":984,"updated":"2015-10-01 05:46:28.000000000","message":"s/volume/Volume","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"7cb9fc75c85ee4398203d2466c3ab05e321f4fe8","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"                            ERR_MSG_COULD_NOT_BE_FOUND not in err.text):"},{"line_number":1012,"context_line":"                        LOG.debug(\"Disable replication on volume failed with \""},{"line_number":1013,"context_line":"                                  \"message: %s\", err.text)"},{"line_number":1014,"context_line":"                        return {\u0027replication_status\u0027: \u0027disable_failed\u0027}"},{"line_number":1015,"context_line":"        return {\u0027replication_status\u0027: \u0027disabled\u0027}"},{"line_number":1016,"context_line":""},{"line_number":1017,"context_line":"    @log_debug_trace"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a1a9d01_6648b2b3","line":1014,"updated":"2015-10-01 05:46:28.000000000","message":"Valid disable status could be one of the following \nvalid_disable_status \u003d [\u0027disabled\u0027, \u0027enabled\u0027]\n\nShould you raise an exception so that manger would not falsely update status as \"disabled\" ?","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"7cb9fc75c85ee4398203d2466c3ab05e321f4fe8","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"        if secondary:"},{"line_number":1039,"context_line":"            for array in secondary_arrays:"},{"line_number":1040,"context_line":"                if array._target \u003d\u003d secondary:"},{"line_number":1041,"context_line":"                    secondary_array \u003d array"},{"line_number":1042,"context_line":"        if not secondary_array:"},{"line_number":1043,"context_line":"            raise exception.PureDriverException("},{"line_number":1044,"context_line":"                reason\u003d_(\"Unable to determine secondary_array from supplied \""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a1a9d01_e6b122e1","line":1041,"updated":"2015-10-01 05:46:28.000000000","message":"\"break\" from the loop after this assignment?","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"9d667b84d376d7f7389e1acb19e7695fbf5843de","unresolved":false,"context_lines":[{"line_number":1077,"context_line":"        return model_update"},{"line_number":1078,"context_line":""},{"line_number":1079,"context_line":"    @log_debug_trace"},{"line_number":1080,"context_line":"    def get_replication_targets(self, context, vref):"},{"line_number":1081,"context_line":"        \"\"\"Return all connected arrays that are active.\"\"\""},{"line_number":1082,"context_line":"        data \u003d {\u0027volume_id\u0027: vref[\u0027id\u0027]}"},{"line_number":1083,"context_line":"        status \u003d {}"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_36deac11","line":1080,"updated":"2015-09-04 19:01:38.000000000","message":"why is this changed to get?","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"9d667b84d376d7f7389e1acb19e7695fbf5843de","unresolved":false,"context_lines":[{"line_number":1100,"context_line":"                                   \u0027status\u0027: replication_status})"},{"line_number":1101,"context_line":""},{"line_number":1102,"context_line":"        data[\"targets\"] \u003d remote_targets"},{"line_number":1103,"context_line":"        return data"},{"line_number":1104,"context_line":""},{"line_number":1105,"context_line":"    @log_debug_trace"},{"line_number":1106,"context_line":"    def get_replication_updates(self, context):"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_b6d2bcfe","line":1103,"updated":"2015-09-04 19:01:38.000000000","message":"Same as last patch:\n\nThe driver manager suggests: \"In the case of a volume that isn\u0027t being replicated, the driver should return an empty list.\"\n\nThis looks like it will always return something. data will always contain \u0027volume_id\u0027 at the very least.","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"be46375071ea33ddd6962b94e383aa1cdf725f29","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"UNMANAGED_SUFFIX \u003d \u0027-unmanaged\u0027"},{"line_number":88,"context_line":"MANAGE_SNAP_REQUIRED_API_VERSIONS \u003d [\u00271.4\u0027]"},{"line_number":89,"context_line":"REPLICATION_REQUIRED_API_VERSIONS \u003d [\u00271.3\u0027, \u00271.4\u0027]"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"RETRY_INTERVAL \u003d 5  # 5 seconds"},{"line_number":92,"context_line":"MAX_RETRIES \u003d 12  # 12 * 5 \u003d 60 seconds"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a7b0d38_c3c14c82","line":89,"range":{"start_line":89,"start_character":0,"end_line":89,"end_character":33},"updated":"2015-12-22 21:30:12.000000000","message":"Need to add 1.5 in here as a supported API version since the release of Purity 4.6.0 - see https://review.openstack.org/#/c/255417/","commit_id":"403effd22c55e3a9adda6f2a4676d34708a7a6c4"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"195a89e1a20cba47886211eb201a5e8038ea0a5c","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_per_day_default\", default\u003d3,"},{"line_number":59,"context_line":"               help\u003d\"Retain how many snapshots for each day.\"),"},{"line_number":60,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_default\", default\u003d7,"},{"line_number":61,"context_line":"               help\u003d\"Retain _replication_retention_long_term_per_day\""},{"line_number":62,"context_line":"                    \" snapshots per day on target for this time (in days.)\"),"},{"line_number":63,"context_line":"]"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1a7b0d38_3cd06653","line":61,"updated":"2015-12-23 02:56:28.000000000","message":"Should you remove \"_replication_retention_long_term_per_day\" from the help message?  It doesn\u0027t help in this message.","commit_id":"e62a5564bfb783b411db9d1890ab80f5bf7a05a0"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"8fa698cd14799e1e7b36f6537bb0a89ee97a4c1b","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_per_day_default\", default\u003d3,"},{"line_number":59,"context_line":"               help\u003d\"Retain how many snapshots for each day.\"),"},{"line_number":60,"context_line":"    cfg.IntOpt(\"pure_replica_retention_long_term_default\", default\u003d7,"},{"line_number":61,"context_line":"               help\u003d\"Retain _replication_retention_long_term_per_day\""},{"line_number":62,"context_line":"                    \" snapshots per day on target for this time (in days.)\"),"},{"line_number":63,"context_line":"]"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_27d4e245","line":61,"in_reply_to":"1a7b0d38_3cd06653","updated":"2016-01-07 19:18:01.000000000","message":"Done","commit_id":"e62a5564bfb783b411db9d1890ab80f5bf7a05a0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"195a89e1a20cba47886211eb201a5e8038ea0a5c","unresolved":false,"context_lines":[{"line_number":573,"context_line":"        elif source_cg:"},{"line_number":574,"context_line":"            self._create_cg_from_cg(group, source_cg, volumes, source_vols)"},{"line_number":575,"context_line":""},{"line_number":576,"context_line":"        for volume in volumes:"},{"line_number":577,"context_line":"            volume.status \u003d \u0027available\u0027"},{"line_number":578,"context_line":"            volume.provider_location \u003d self._array.array_id"},{"line_number":579,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1a7b0d38_dce4c20e","line":576,"range":{"start_line":576,"start_character":29,"end_line":576,"end_character":30},"updated":"2015-12-23 02:56:28.000000000","message":"volume (in volumes which is returned at the end) should be a dictionary instead of directly changing the passed in volumes which are objects.  Each volume model update should be in the following format:\n\n{\u0027id\u0027: xxx, \u0027status\u0027: \u0027available\u0027, \u0027provider_location\u0027: xxx}","commit_id":"e62a5564bfb783b411db9d1890ab80f5bf7a05a0"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"8fa698cd14799e1e7b36f6537bb0a89ee97a4c1b","unresolved":false,"context_lines":[{"line_number":573,"context_line":"        elif source_cg:"},{"line_number":574,"context_line":"            self._create_cg_from_cg(group, source_cg, volumes, source_vols)"},{"line_number":575,"context_line":""},{"line_number":576,"context_line":"        for volume in volumes:"},{"line_number":577,"context_line":"            volume.status \u003d \u0027available\u0027"},{"line_number":578,"context_line":"            volume.provider_location \u003d self._array.array_id"},{"line_number":579,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_479eb664","line":576,"range":{"start_line":576,"start_character":29,"end_line":576,"end_character":30},"in_reply_to":"1a7b0d38_dce4c20e","updated":"2016-01-07 19:18:01.000000000","message":"Done","commit_id":"e62a5564bfb783b411db9d1890ab80f5bf7a05a0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"195a89e1a20cba47886211eb201a5e8038ea0a5c","unresolved":false,"context_lines":[{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        for snapshot in snapshots:"},{"line_number":643,"context_line":"            snapshot.status \u003d \u0027available\u0027"},{"line_number":644,"context_line":"            snapshot.provider_location \u003d self._array.array_id"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"        model_update \u003d {\u0027status\u0027: \u0027available\u0027}"},{"line_number":647,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1a7b0d38_fcfdfe6e","line":644,"updated":"2015-12-23 02:56:28.000000000","message":"Same here.  \"snapshots\" which is passed in should not be directly modified.  Please create a new dictionary for each snapshot model update entry, add to a list and return the list of dicts.\n\n{\u0027id\u0027: xxx, \u0027status\u0027: xxx, \u0027provider_location\u0027: xxx}","commit_id":"e62a5564bfb783b411db9d1890ab80f5bf7a05a0"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"8fa698cd14799e1e7b36f6537bb0a89ee97a4c1b","unresolved":false,"context_lines":[{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        for snapshot in snapshots:"},{"line_number":643,"context_line":"            snapshot.status \u003d \u0027available\u0027"},{"line_number":644,"context_line":"            snapshot.provider_location \u003d self._array.array_id"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"        model_update \u003d {\u0027status\u0027: \u0027available\u0027}"},{"line_number":647,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_32d42246","line":644,"in_reply_to":"1a7b0d38_fcfdfe6e","updated":"2016-01-07 19:18:01.000000000","message":"Done","commit_id":"e62a5564bfb783b411db9d1890ab80f5bf7a05a0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"195a89e1a20cba47886211eb201a5e8038ea0a5c","unresolved":false,"context_lines":[{"line_number":984,"context_line":"                context,"},{"line_number":985,"context_line":"                volume[\"volume_type_id\"])"},{"line_number":986,"context_line":"            raise exception.PureDriverException("},{"line_number":987,"context_line":"                reason\u003d\"volume %(name)s of type %(type)s is not a replicated \""},{"line_number":988,"context_line":"                       \"type \" % {\"name\": volume[\"name\"], \"type\": volume_type})"},{"line_number":989,"context_line":"        # Get current array in case we have failed over."},{"line_number":990,"context_line":"        current_array \u003d self._get_current_array(volume)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a7b0d38_dc928257","line":987,"range":{"start_line":987,"start_character":77,"end_line":987,"end_character":78},"updated":"2015-12-23 02:56:28.000000000","message":"The message should be wrapped in _(\"xxx\")","commit_id":"e62a5564bfb783b411db9d1890ab80f5bf7a05a0"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"8fa698cd14799e1e7b36f6537bb0a89ee97a4c1b","unresolved":false,"context_lines":[{"line_number":984,"context_line":"                context,"},{"line_number":985,"context_line":"                volume[\"volume_type_id\"])"},{"line_number":986,"context_line":"            raise exception.PureDriverException("},{"line_number":987,"context_line":"                reason\u003d\"volume %(name)s of type %(type)s is not a replicated \""},{"line_number":988,"context_line":"                       \"type \" % {\"name\": volume[\"name\"], \"type\": volume_type})"},{"line_number":989,"context_line":"        # Get current array in case we have failed over."},{"line_number":990,"context_line":"        current_array \u003d self._get_current_array(volume)"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_72c05a2b","line":987,"range":{"start_line":987,"start_character":77,"end_line":987,"end_character":78},"in_reply_to":"1a7b0d38_dc928257","updated":"2016-01-07 19:18:01.000000000","message":"Done","commit_id":"e62a5564bfb783b411db9d1890ab80f5bf7a05a0"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"4e306a0835df0744f85d9717c26ca797738b76b4","unresolved":false,"context_lines":[{"line_number":527,"context_line":"        data[\u0027queue_depth\u0027] \u003d perf_info[\u0027queue_depth\u0027]"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"        data[\"replication_enabled\"] \u003d self._is_replication_enabled"},{"line_number":530,"context_line":"        data[\"replication_type\"] \u003d \"async\""},{"line_number":531,"context_line":"        data[\"replication_count\"] \u003d len(self._replication_target_arrays)"},{"line_number":532,"context_line":"        self._stats \u003d data"},{"line_number":533,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"fa69d971_c054becb","line":530,"range":{"start_line":530,"start_character":35,"end_line":530,"end_character":42},"updated":"2016-01-08 00:38:04.000000000","message":"This should be a list of replication types. [\u0027async\u0027]","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"b7c4cd1f3b500846d0744a05ef6f11c6a50b44f7","unresolved":false,"context_lines":[{"line_number":527,"context_line":"        data[\u0027queue_depth\u0027] \u003d perf_info[\u0027queue_depth\u0027]"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"        data[\"replication_enabled\"] \u003d self._is_replication_enabled"},{"line_number":530,"context_line":"        data[\"replication_type\"] \u003d \"async\""},{"line_number":531,"context_line":"        data[\"replication_count\"] \u003d len(self._replication_target_arrays)"},{"line_number":532,"context_line":"        self._stats \u003d data"},{"line_number":533,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"da6ed579_4b99b11e","line":530,"range":{"start_line":530,"start_character":35,"end_line":530,"end_character":42},"in_reply_to":"fa69d971_c054becb","updated":"2016-01-14 21:52:34.000000000","message":"Done","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"4e306a0835df0744f85d9717c26ca797738b76b4","unresolved":false,"context_lines":[{"line_number":1045,"context_line":"    def replication_enable(self, context, volume):"},{"line_number":1046,"context_line":"        \"\"\"Enable replication on the given volume.\"\"\""},{"line_number":1047,"context_line":""},{"line_number":1048,"context_line":"        if not self._is_volume_replicated_type(volume):"},{"line_number":1049,"context_line":"            volume_type \u003d volume_types.get_volume_type("},{"line_number":1050,"context_line":"                context,"},{"line_number":1051,"context_line":"                volume[\"volume_type_id\"])"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa69d971_800486c6","line":1048,"range":{"start_line":1048,"start_character":8,"end_line":1048,"end_character":55},"updated":"2016-01-08 00:38:04.000000000","message":"This can now be replaced with @valid_replication_volume in the volume api: https://github.com/openstack/cinder/blob/master/cinder/volume/api.py#L120","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"b7c4cd1f3b500846d0744a05ef6f11c6a50b44f7","unresolved":false,"context_lines":[{"line_number":1045,"context_line":"    def replication_enable(self, context, volume):"},{"line_number":1046,"context_line":"        \"\"\"Enable replication on the given volume.\"\"\""},{"line_number":1047,"context_line":""},{"line_number":1048,"context_line":"        if not self._is_volume_replicated_type(volume):"},{"line_number":1049,"context_line":"            volume_type \u003d volume_types.get_volume_type("},{"line_number":1050,"context_line":"                context,"},{"line_number":1051,"context_line":"                volume[\"volume_type_id\"])"}],"source_content_type":"text/x-python","patch_set":16,"id":"da6ed579_8b2b2994","line":1048,"range":{"start_line":1048,"start_character":8,"end_line":1048,"end_character":55},"in_reply_to":"fa69d971_800486c6","updated":"2016-01-14 21:52:34.000000000","message":"Nice! Didn\u0027t know about that. Will use that","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"4e306a0835df0744f85d9717c26ca797738b76b4","unresolved":false,"context_lines":[{"line_number":1069,"context_line":"        # Get current array in case we have failed over via replication."},{"line_number":1070,"context_line":"        current_array \u003d self._get_current_array(volume)"},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"        if self._is_volume_replicated_type(volume):"},{"line_number":1073,"context_line":"            try:"},{"line_number":1074,"context_line":"                current_array.set_pgroup(self._replication_pg_name,"},{"line_number":1075,"context_line":"                                         remvollist\u003d("}],"source_content_type":"text/x-python","patch_set":16,"id":"fa69d971_a0098adf","line":1072,"range":{"start_line":1072,"start_character":8,"end_line":1072,"end_character":51},"updated":"2016-01-08 00:38:04.000000000","message":"Same as above","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"b7c4cd1f3b500846d0744a05ef6f11c6a50b44f7","unresolved":false,"context_lines":[{"line_number":1069,"context_line":"        # Get current array in case we have failed over via replication."},{"line_number":1070,"context_line":"        current_array \u003d self._get_current_array(volume)"},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"        if self._is_volume_replicated_type(volume):"},{"line_number":1073,"context_line":"            try:"},{"line_number":1074,"context_line":"                current_array.set_pgroup(self._replication_pg_name,"},{"line_number":1075,"context_line":"                                         remvollist\u003d("}],"source_content_type":"text/x-python","patch_set":16,"id":"da6ed579_c636f8e6","line":1072,"range":{"start_line":1072,"start_character":8,"end_line":1072,"end_character":51},"in_reply_to":"fa69d971_a0098adf","updated":"2016-01-14 21:52:34.000000000","message":"Done","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"4e306a0835df0744f85d9717c26ca797738b76b4","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"        return {\u0027replication_status\u0027: \u0027disabled\u0027}"},{"line_number":1086,"context_line":""},{"line_number":1087,"context_line":"    @log_debug_trace"},{"line_number":1088,"context_line":"    def replication_failover(self, context, volume, secondary):"},{"line_number":1089,"context_line":"        \"\"\"Failover volume to the secondary array"},{"line_number":1090,"context_line":""},{"line_number":1091,"context_line":"        This action will not affect the original volume in any"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa69d971_c0027eb4","line":1088,"range":{"start_line":1088,"start_character":4,"end_line":1088,"end_character":63},"updated":"2016-01-08 00:38:04.000000000","message":"May want to add the @valid_replication_volume decorator here as well","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"b7c4cd1f3b500846d0744a05ef6f11c6a50b44f7","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"        return {\u0027replication_status\u0027: \u0027disabled\u0027}"},{"line_number":1086,"context_line":""},{"line_number":1087,"context_line":"    @log_debug_trace"},{"line_number":1088,"context_line":"    def replication_failover(self, context, volume, secondary):"},{"line_number":1089,"context_line":"        \"\"\"Failover volume to the secondary array"},{"line_number":1090,"context_line":""},{"line_number":1091,"context_line":"        This action will not affect the original volume in any"}],"source_content_type":"text/x-python","patch_set":16,"id":"da6ed579_6635ccd8","line":1088,"range":{"start_line":1088,"start_character":4,"end_line":1088,"end_character":63},"in_reply_to":"fa69d971_c0027eb4","updated":"2016-01-14 21:52:34.000000000","message":"Done","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"4e306a0835df0744f85d9717c26ca797738b76b4","unresolved":false,"context_lines":[{"line_number":1146,"context_line":"                        \"replication_status\": \"failed-over\"}"},{"line_number":1147,"context_line":"        return model_update"},{"line_number":1148,"context_line":""},{"line_number":1149,"context_line":"    @log_debug_trace"},{"line_number":1150,"context_line":"    def list_replication_targets(self, context, vref):"},{"line_number":1151,"context_line":"        \"\"\"Return all connected arrays that are active.\"\"\""},{"line_number":1152,"context_line":"        data \u003d {\u0027volume_id\u0027: vref[\u0027id\u0027]}"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa69d971_e0ff82a8","line":1149,"range":{"start_line":1149,"start_character":4,"end_line":1149,"end_character":20},"updated":"2016-01-08 00:38:04.000000000","message":"May want to add the @valid_replication_volume decorator here as well","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"b7c4cd1f3b500846d0744a05ef6f11c6a50b44f7","unresolved":false,"context_lines":[{"line_number":1146,"context_line":"                        \"replication_status\": \"failed-over\"}"},{"line_number":1147,"context_line":"        return model_update"},{"line_number":1148,"context_line":""},{"line_number":1149,"context_line":"    @log_debug_trace"},{"line_number":1150,"context_line":"    def list_replication_targets(self, context, vref):"},{"line_number":1151,"context_line":"        \"\"\"Return all connected arrays that are active.\"\"\""},{"line_number":1152,"context_line":"        data \u003d {\u0027volume_id\u0027: vref[\u0027id\u0027]}"}],"source_content_type":"text/x-python","patch_set":16,"id":"da6ed579_8647a04a","line":1149,"range":{"start_line":1149,"start_character":4,"end_line":1149,"end_character":20},"in_reply_to":"fa69d971_e0ff82a8","updated":"2016-01-14 21:52:34.000000000","message":"Done","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"4e306a0835df0744f85d9717c26ca797738b76b4","unresolved":false,"context_lines":[{"line_number":1147,"context_line":"        return model_update"},{"line_number":1148,"context_line":""},{"line_number":1149,"context_line":"    @log_debug_trace"},{"line_number":1150,"context_line":"    def list_replication_targets(self, context, vref):"},{"line_number":1151,"context_line":"        \"\"\"Return all connected arrays that are active.\"\"\""},{"line_number":1152,"context_line":"        data \u003d {\u0027volume_id\u0027: vref[\u0027id\u0027]}"},{"line_number":1153,"context_line":"        status \u003d {}"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa69d971_80cfa6b2","line":1150,"range":{"start_line":1150,"start_character":4,"end_line":1150,"end_character":54},"updated":"2016-01-08 00:38:04.000000000","message":"target_device_id is the only thing that will be printed out by the python-3parclient. target_device_id will be the unique identifier for the array that is passed into replication-failover.","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"b7c4cd1f3b500846d0744a05ef6f11c6a50b44f7","unresolved":false,"context_lines":[{"line_number":1147,"context_line":"        return model_update"},{"line_number":1148,"context_line":""},{"line_number":1149,"context_line":"    @log_debug_trace"},{"line_number":1150,"context_line":"    def list_replication_targets(self, context, vref):"},{"line_number":1151,"context_line":"        \"\"\"Return all connected arrays that are active.\"\"\""},{"line_number":1152,"context_line":"        data \u003d {\u0027volume_id\u0027: vref[\u0027id\u0027]}"},{"line_number":1153,"context_line":"        status \u003d {}"}],"source_content_type":"text/x-python","patch_set":16,"id":"da6ed579_823e708a","line":1150,"range":{"start_line":1150,"start_character":4,"end_line":1150,"end_character":54},"in_reply_to":"fa69d971_80cfa6b2","updated":"2016-01-14 21:52:34.000000000","message":"will make the change to only expose target_device_id.\n\nThe spec seems to leaves it up to the driver on how to identify the array for replication-failover. We were using the \"san_ip\" value ...target_device_id seems to make more sense.\nWill make that change","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"4e306a0835df0744f85d9717c26ca797738b76b4","unresolved":false,"context_lines":[{"line_number":1165,"context_line":"            replication_status \u003d False"},{"line_number":1166,"context_line":"            if flash_array.array_name in status:"},{"line_number":1167,"context_line":"                replication_status \u003d status[flash_array.array_name]"},{"line_number":1168,"context_line":"            remote_targets.append({\u0027san_ip\u0027: flash_array._target,"},{"line_number":1169,"context_line":"                                   \u0027san_token\u0027: flash_array._api_token,"},{"line_number":1170,"context_line":"                                   \u0027status\u0027: replication_status})"},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"        data[\"targets\"] \u003d remote_targets"},{"line_number":1173,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa69d971_20c11a81","line":1170,"range":{"start_line":1168,"start_character":34,"end_line":1170,"end_character":65},"updated":"2016-01-08 00:38:04.000000000","message":"These 3 will not get printed by cinder replication-list-targets","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"b7c4cd1f3b500846d0744a05ef6f11c6a50b44f7","unresolved":false,"context_lines":[{"line_number":1165,"context_line":"            replication_status \u003d False"},{"line_number":1166,"context_line":"            if flash_array.array_name in status:"},{"line_number":1167,"context_line":"                replication_status \u003d status[flash_array.array_name]"},{"line_number":1168,"context_line":"            remote_targets.append({\u0027san_ip\u0027: flash_array._target,"},{"line_number":1169,"context_line":"                                   \u0027san_token\u0027: flash_array._api_token,"},{"line_number":1170,"context_line":"                                   \u0027status\u0027: replication_status})"},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"        data[\"targets\"] \u003d remote_targets"},{"line_number":1173,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":16,"id":"da6ed579_024b602b","line":1170,"range":{"start_line":1168,"start_character":34,"end_line":1170,"end_character":65},"in_reply_to":"fa69d971_20c11a81","updated":"2016-01-14 21:52:34.000000000","message":"will remove","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"4e306a0835df0744f85d9717c26ca797738b76b4","unresolved":false,"context_lines":[{"line_number":1173,"context_line":"        return data"},{"line_number":1174,"context_line":""},{"line_number":1175,"context_line":"    @log_debug_trace"},{"line_number":1176,"context_line":"    def get_replication_updates(self, context):"},{"line_number":1177,"context_line":"        \"\"\"Return status of backends\"\"\""},{"line_number":1178,"context_line":"        errors \u003d []"},{"line_number":1179,"context_line":"        pgroup \u003d self._array.get_pgroup(self._replication_pg_name)"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa69d971_40252e5a","line":1176,"range":{"start_line":1176,"start_character":4,"end_line":1176,"end_character":47},"updated":"2016-01-08 00:38:04.000000000","message":"The manager does not do anything with these updates. I am curious though, what are you intentions here with these updates?","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"b7c4cd1f3b500846d0744a05ef6f11c6a50b44f7","unresolved":false,"context_lines":[{"line_number":1173,"context_line":"        return data"},{"line_number":1174,"context_line":""},{"line_number":1175,"context_line":"    @log_debug_trace"},{"line_number":1176,"context_line":"    def get_replication_updates(self, context):"},{"line_number":1177,"context_line":"        \"\"\"Return status of backends\"\"\""},{"line_number":1178,"context_line":"        errors \u003d []"},{"line_number":1179,"context_line":"        pgroup \u003d self._array.get_pgroup(self._replication_pg_name)"}],"source_content_type":"text/x-python","patch_set":16,"id":"da6ed579_8d8f8129","line":1176,"range":{"start_line":1176,"start_character":4,"end_line":1176,"end_character":47},"in_reply_to":"fa69d971_40252e5a","updated":"2016-01-14 21:52:34.000000000","message":"This is probably leftover from last revision of replication - this was supposed to return the status of the replicated arrays (replication in error etc). I will remove this","commit_id":"779cde1d45afe82424f4e23383bfbccf65916b55"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"251cda06a0bc9ee2c131704c3710b7f9ccfa4672","unresolved":false,"context_lines":[{"line_number":1048,"context_line":""},{"line_number":1049,"context_line":"    # Replication v2"},{"line_number":1050,"context_line":"    @log_debug_trace"},{"line_number":1051,"context_line":"    @valid_replication_volume"},{"line_number":1052,"context_line":"    def replication_enable(self, context, volume):"},{"line_number":1053,"context_line":"        \"\"\"Enable replication on the given volume.\"\"\""},{"line_number":1054,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_16bfe2aa","line":1051,"range":{"start_line":1051,"start_character":5,"end_line":1051,"end_character":29},"updated":"2016-01-14 22:22:38.000000000","message":"These checks are already done in the API itself. The API will not even call the driver if the volume is not of replicated type. It can be removed from the driver safely.","commit_id":"9ba16ec0b7799ae2052506d3078af9839a6c1421"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"59b60097b0d2956ce82f40ce5e3ee10db26da035","unresolved":false,"context_lines":[{"line_number":1048,"context_line":""},{"line_number":1049,"context_line":"    # Replication v2"},{"line_number":1050,"context_line":"    @log_debug_trace"},{"line_number":1051,"context_line":"    @valid_replication_volume"},{"line_number":1052,"context_line":"    def replication_enable(self, context, volume):"},{"line_number":1053,"context_line":"        \"\"\"Enable replication on the given volume.\"\"\""},{"line_number":1054,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_4db4e47e","line":1051,"range":{"start_line":1051,"start_character":5,"end_line":1051,"end_character":29},"in_reply_to":"da6ed579_16bfe2aa","updated":"2016-01-15 03:08:23.000000000","message":"makes sense. Done","commit_id":"9ba16ec0b7799ae2052506d3078af9839a6c1421"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"251cda06a0bc9ee2c131704c3710b7f9ccfa4672","unresolved":false,"context_lines":[{"line_number":1062,"context_line":"        return model_update"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"    @log_debug_trace"},{"line_number":1065,"context_line":"    @valid_replication_volume"},{"line_number":1066,"context_line":"    def replication_disable(self, context, volume):"},{"line_number":1067,"context_line":"        \"\"\"Disable replication on the given volume.\"\"\""},{"line_number":1068,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_b6e056ce","line":1065,"range":{"start_line":1065,"start_character":4,"end_line":1065,"end_character":29},"updated":"2016-01-14 22:22:38.000000000","message":"Same","commit_id":"9ba16ec0b7799ae2052506d3078af9839a6c1421"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"59b60097b0d2956ce82f40ce5e3ee10db26da035","unresolved":false,"context_lines":[{"line_number":1062,"context_line":"        return model_update"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"    @log_debug_trace"},{"line_number":1065,"context_line":"    @valid_replication_volume"},{"line_number":1066,"context_line":"    def replication_disable(self, context, volume):"},{"line_number":1067,"context_line":"        \"\"\"Disable replication on the given volume.\"\"\""},{"line_number":1068,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_2da5f045","line":1065,"range":{"start_line":1065,"start_character":4,"end_line":1065,"end_character":29},"in_reply_to":"da6ed579_b6e056ce","updated":"2016-01-15 03:08:23.000000000","message":"Done","commit_id":"9ba16ec0b7799ae2052506d3078af9839a6c1421"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"251cda06a0bc9ee2c131704c3710b7f9ccfa4672","unresolved":false,"context_lines":[{"line_number":1084,"context_line":"        return {\u0027replication_status\u0027: \u0027disabled\u0027}"},{"line_number":1085,"context_line":""},{"line_number":1086,"context_line":"    @log_debug_trace"},{"line_number":1087,"context_line":"    @valid_replication_volume"},{"line_number":1088,"context_line":"    def replication_failover(self, context, volume, secondary):"},{"line_number":1089,"context_line":"        \"\"\"Failover volume to the secondary array"},{"line_number":1090,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_96e992b9","line":1087,"range":{"start_line":1087,"start_character":4,"end_line":1087,"end_character":29},"updated":"2016-01-14 22:22:38.000000000","message":"Same","commit_id":"9ba16ec0b7799ae2052506d3078af9839a6c1421"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"59b60097b0d2956ce82f40ce5e3ee10db26da035","unresolved":false,"context_lines":[{"line_number":1084,"context_line":"        return {\u0027replication_status\u0027: \u0027disabled\u0027}"},{"line_number":1085,"context_line":""},{"line_number":1086,"context_line":"    @log_debug_trace"},{"line_number":1087,"context_line":"    @valid_replication_volume"},{"line_number":1088,"context_line":"    def replication_failover(self, context, volume, secondary):"},{"line_number":1089,"context_line":"        \"\"\"Failover volume to the secondary array"},{"line_number":1090,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_cd669429","line":1087,"range":{"start_line":1087,"start_character":4,"end_line":1087,"end_character":29},"in_reply_to":"da6ed579_96e992b9","updated":"2016-01-15 03:08:23.000000000","message":"Done","commit_id":"9ba16ec0b7799ae2052506d3078af9839a6c1421"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"251cda06a0bc9ee2c131704c3710b7f9ccfa4672","unresolved":false,"context_lines":[{"line_number":1104,"context_line":"                if array._target_device_id \u003d\u003d secondary:"},{"line_number":1105,"context_line":"                    secondary_array \u003d array"},{"line_number":1106,"context_line":"        if not secondary_array:"},{"line_number":1107,"context_line":"            raise exception.PureDriverException("},{"line_number":1108,"context_line":"                reason\u003d_(\"Unable to determine secondary_array from supplied \""},{"line_number":1109,"context_line":"                         \"secondary: %(secondary)s\") % {\"secondary\": secondary}"},{"line_number":1110,"context_line":"            )"},{"line_number":1111,"context_line":"        LOG.debug(\"Starting failover from %(primary)s to %(secondary)s\","},{"line_number":1112,"context_line":"                  {\"primary\": current_array.array_name,"},{"line_number":1113,"context_line":"                   \"secondary\": secondary_array.array_name})"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_b6f1366d","line":1110,"range":{"start_line":1107,"start_character":12,"end_line":1110,"end_character":13},"updated":"2016-01-14 22:22:38.000000000","message":"Might not want to raise the exception here if you want to default the secondary_array like you are below.","commit_id":"9ba16ec0b7799ae2052506d3078af9839a6c1421"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"59b60097b0d2956ce82f40ce5e3ee10db26da035","unresolved":false,"context_lines":[{"line_number":1104,"context_line":"                if array._target_device_id \u003d\u003d secondary:"},{"line_number":1105,"context_line":"                    secondary_array \u003d array"},{"line_number":1106,"context_line":"        if not secondary_array:"},{"line_number":1107,"context_line":"            raise exception.PureDriverException("},{"line_number":1108,"context_line":"                reason\u003d_(\"Unable to determine secondary_array from supplied \""},{"line_number":1109,"context_line":"                         \"secondary: %(secondary)s\") % {\"secondary\": secondary}"},{"line_number":1110,"context_line":"            )"},{"line_number":1111,"context_line":"        LOG.debug(\"Starting failover from %(primary)s to %(secondary)s\","},{"line_number":1112,"context_line":"                  {\"primary\": current_array.array_name,"},{"line_number":1113,"context_line":"                   \"secondary\": secondary_array.array_name})"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_80f2a304","line":1110,"range":{"start_line":1107,"start_character":12,"end_line":1110,"end_character":13},"in_reply_to":"da6ed579_b6f1366d","updated":"2016-01-15 03:08:23.000000000","message":"We do want to raise an exception here if the user doesn\u0027t specify a correct failover target. I have removed the code that defaults the secondary_array","commit_id":"9ba16ec0b7799ae2052506d3078af9839a6c1421"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"251cda06a0bc9ee2c131704c3710b7f9ccfa4672","unresolved":false,"context_lines":[{"line_number":1111,"context_line":"        LOG.debug(\"Starting failover from %(primary)s to %(secondary)s\","},{"line_number":1112,"context_line":"                  {\"primary\": current_array.array_name,"},{"line_number":1113,"context_line":"                   \"secondary\": secondary_array.array_name})"},{"line_number":1114,"context_line":"        if secondary_array is None:"},{"line_number":1115,"context_line":"            if not secondary_arrays:"},{"line_number":1116,"context_line":"                raise exception.PureDriverException("},{"line_number":1117,"context_line":"                    reason\u003d_(\"Unable to failover volume %(volume)s, no \""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_b6ca9619","line":1114,"range":{"start_line":1114,"start_character":8,"end_line":1114,"end_character":35},"updated":"2016-01-14 22:22:38.000000000","message":"If secondary_array is None, the exception above will be raised.","commit_id":"9ba16ec0b7799ae2052506d3078af9839a6c1421"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"59b60097b0d2956ce82f40ce5e3ee10db26da035","unresolved":false,"context_lines":[{"line_number":1111,"context_line":"        LOG.debug(\"Starting failover from %(primary)s to %(secondary)s\","},{"line_number":1112,"context_line":"                  {\"primary\": current_array.array_name,"},{"line_number":1113,"context_line":"                   \"secondary\": secondary_array.array_name})"},{"line_number":1114,"context_line":"        if secondary_array is None:"},{"line_number":1115,"context_line":"            if not secondary_arrays:"},{"line_number":1116,"context_line":"                raise exception.PureDriverException("},{"line_number":1117,"context_line":"                    reason\u003d_(\"Unable to failover volume %(volume)s, no \""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_a0f567ed","line":1114,"range":{"start_line":1114,"start_character":8,"end_line":1114,"end_character":35},"in_reply_to":"da6ed579_b6ca9619","updated":"2016-01-15 03:08:23.000000000","message":"Done","commit_id":"9ba16ec0b7799ae2052506d3078af9839a6c1421"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"251cda06a0bc9ee2c131704c3710b7f9ccfa4672","unresolved":false,"context_lines":[{"line_number":1141,"context_line":"        return model_update"},{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"    @log_debug_trace"},{"line_number":1144,"context_line":"    @valid_replication_volume"},{"line_number":1145,"context_line":"    def list_replication_targets(self, context, vref):"},{"line_number":1146,"context_line":"        \"\"\"Return all connected arrays that are active.\"\"\""},{"line_number":1147,"context_line":"        data \u003d {\u0027volume_id\u0027: vref[\u0027id\u0027]}"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_f6da4e16","line":1144,"range":{"start_line":1144,"start_character":4,"end_line":1144,"end_character":29},"updated":"2016-01-14 22:22:38.000000000","message":"Same","commit_id":"9ba16ec0b7799ae2052506d3078af9839a6c1421"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"59b60097b0d2956ce82f40ce5e3ee10db26da035","unresolved":false,"context_lines":[{"line_number":1141,"context_line":"        return model_update"},{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"    @log_debug_trace"},{"line_number":1144,"context_line":"    @valid_replication_volume"},{"line_number":1145,"context_line":"    def list_replication_targets(self, context, vref):"},{"line_number":1146,"context_line":"        \"\"\"Return all connected arrays that are active.\"\"\""},{"line_number":1147,"context_line":"        data \u003d {\u0027volume_id\u0027: vref[\u0027id\u0027]}"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_60c3ef89","line":1144,"range":{"start_line":1144,"start_character":4,"end_line":1144,"end_character":29},"in_reply_to":"da6ed579_f6da4e16","updated":"2016-01-15 03:08:23.000000000","message":"Done","commit_id":"9ba16ec0b7799ae2052506d3078af9839a6c1421"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d3863814b58dce0fa62ee2e3a047367488377ca7","unresolved":false,"context_lines":[{"line_number":85,"context_line":"ERR_MSG_COULD_NOT_BE_FOUND \u003d \"could not be found\""},{"line_number":86,"context_line":"ERR_MSG_ALREADY_INCLUDES \u003d \"already includes\""},{"line_number":87,"context_line":"ERR_MSG_ALREADY_ALLOWED \u003d \"already allowed on\""},{"line_number":88,"context_line":"ERR_MSG_NO_CONNECTED \u003d \"is not connected\""},{"line_number":89,"context_line":"ERR_MSG_ALREADY_BELONGS \u003d \"already belongs to\""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"EXTRA_SPECS_REPL_ENABLED \u003d \"replication_enabled\""}],"source_content_type":"text/x-python","patch_set":18,"id":"da6ed579_983773fe","line":88,"updated":"2016-01-15 06:07:57.000000000","message":"should this be \"NOT_CONNECTED\"?","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"1ddf4a749d7c01af4c19c8a019958ad7c977d2dd","unresolved":false,"context_lines":[{"line_number":85,"context_line":"ERR_MSG_COULD_NOT_BE_FOUND \u003d \"could not be found\""},{"line_number":86,"context_line":"ERR_MSG_ALREADY_INCLUDES \u003d \"already includes\""},{"line_number":87,"context_line":"ERR_MSG_ALREADY_ALLOWED \u003d \"already allowed on\""},{"line_number":88,"context_line":"ERR_MSG_NO_CONNECTED \u003d \"is not connected\""},{"line_number":89,"context_line":"ERR_MSG_ALREADY_BELONGS \u003d \"already belongs to\""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"EXTRA_SPECS_REPL_ENABLED \u003d \"replication_enabled\""}],"source_content_type":"text/x-python","patch_set":18,"id":"da6ed579_86c35b8a","line":88,"in_reply_to":"da6ed579_983773fe","updated":"2016-01-21 04:12:06.000000000","message":"Done","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d3863814b58dce0fa62ee2e3a047367488377ca7","unresolved":false,"context_lines":[{"line_number":97,"context_line":"MANAGE_SNAP_REQUIRED_API_VERSIONS \u003d [\u00271.4\u0027, \u00271.5\u0027]"},{"line_number":98,"context_line":"REPLICATION_REQUIRED_API_VERSIONS \u003d [\u00271.3\u0027, \u00271.4\u0027, \u00271.5\u0027]"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"RETRY_INTERVAL \u003d 5  # 5 seconds"},{"line_number":101,"context_line":"MAX_RETRIES \u003d 12  # 12 * 5 \u003d 60 seconds"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"def log_debug_trace(f):"}],"source_content_type":"text/x-python","patch_set":18,"id":"da6ed579_1e560b06","line":101,"range":{"start_line":100,"start_character":0,"end_line":101,"end_character":39},"updated":"2016-01-15 06:07:57.000000000","message":"Lets make these configurable, I would hate to have to give someone a patched driver because for whatever reason it took too long for them to become available. While we are at it lets name them more specific to what they are for (eg, what retry interval, and what are we going to retry max times)","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"1ddf4a749d7c01af4c19c8a019958ad7c977d2dd","unresolved":false,"context_lines":[{"line_number":97,"context_line":"MANAGE_SNAP_REQUIRED_API_VERSIONS \u003d [\u00271.4\u0027, \u00271.5\u0027]"},{"line_number":98,"context_line":"REPLICATION_REQUIRED_API_VERSIONS \u003d [\u00271.3\u0027, \u00271.4\u0027, \u00271.5\u0027]"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"RETRY_INTERVAL \u003d 5  # 5 seconds"},{"line_number":101,"context_line":"MAX_RETRIES \u003d 12  # 12 * 5 \u003d 60 seconds"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"def log_debug_trace(f):"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a68dd71_7fe265a1","line":101,"range":{"start_line":100,"start_character":0,"end_line":101,"end_character":39},"in_reply_to":"da6ed579_1e560b06","updated":"2016-01-21 04:12:06.000000000","message":"I\u0027ve increased the timeout to 3 minutes\n\nSince these are used passed to the utils.retry, they have to be available during initialization of the driver. I couldn\u0027t find a clean way to read these from the config.","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d3863814b58dce0fa62ee2e3a047367488377ca7","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        self.parse_replication_configs()"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        # Get replication target array info and create pgroup if needed."},{"line_number":173,"context_line":"        if self._replication_target_arrays:"},{"line_number":174,"context_line":"            self._replication_interval \u003d ("},{"line_number":175,"context_line":"                self.configuration.pure_replica_interval_default)"},{"line_number":176,"context_line":"            self._replication_retention_short_term \u003d ("},{"line_number":177,"context_line":"                self.configuration.pure_replica_retention_short_term_default)"},{"line_number":178,"context_line":"            self._replication_retention_long_term \u003d ("},{"line_number":179,"context_line":"                self.configuration.pure_replica_retention_long_term_default)"},{"line_number":180,"context_line":"            self._replication_retention_long_term_per_day \u003d ("},{"line_number":181,"context_line":"                self.configuration."},{"line_number":182,"context_line":"                pure_replica_retention_long_term_per_day_default)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"            retention_policy \u003d self._generate_replication_retention()"},{"line_number":185,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"da6ed579_3859a78e","line":182,"range":{"start_line":173,"start_character":8,"end_line":182,"end_character":65},"updated":"2016-01-15 06:07:57.000000000","message":"should this go into the parse_replication_configs method? maybe i\u0027m misunderstanding but it looks like we are also parsing replication configs here","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"1ddf4a749d7c01af4c19c8a019958ad7c977d2dd","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        self.parse_replication_configs()"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        # Get replication target array info and create pgroup if needed."},{"line_number":173,"context_line":"        if self._replication_target_arrays:"},{"line_number":174,"context_line":"            self._replication_interval \u003d ("},{"line_number":175,"context_line":"                self.configuration.pure_replica_interval_default)"},{"line_number":176,"context_line":"            self._replication_retention_short_term \u003d ("},{"line_number":177,"context_line":"                self.configuration.pure_replica_retention_short_term_default)"},{"line_number":178,"context_line":"            self._replication_retention_long_term \u003d ("},{"line_number":179,"context_line":"                self.configuration.pure_replica_retention_long_term_default)"},{"line_number":180,"context_line":"            self._replication_retention_long_term_per_day \u003d ("},{"line_number":181,"context_line":"                self.configuration."},{"line_number":182,"context_line":"                pure_replica_retention_long_term_per_day_default)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"            retention_policy \u003d self._generate_replication_retention()"},{"line_number":185,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"ba63e191_0545e815","line":182,"range":{"start_line":173,"start_character":8,"end_line":182,"end_character":65},"in_reply_to":"da6ed579_3859a78e","updated":"2016-01-21 04:12:06.000000000","message":"Done","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d3863814b58dce0fa62ee2e3a047367488377ca7","unresolved":false,"context_lines":[{"line_number":183,"context_line":""},{"line_number":184,"context_line":"            retention_policy \u003d self._generate_replication_retention()"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"            for array in self._replication_target_arrays:"},{"line_number":187,"context_line":"                api_version \u003d array.get_rest_version()"},{"line_number":188,"context_line":"                if api_version not in REPLICATION_REQUIRED_API_VERSIONS:"},{"line_number":189,"context_line":"                    msg \u003d _(\u0027Unable to do replication with Purity REST \u0027"},{"line_number":190,"context_line":"                            \u0027API version %(api_version)s, requires one of \u0027"},{"line_number":191,"context_line":"                            \u0027%(required_versions)s.\u0027) % {"},{"line_number":192,"context_line":"                        \u0027api_version\u0027: api_version,"},{"line_number":193,"context_line":"                        \u0027required_versions\u0027: REPLICATION_REQUIRED_API_VERSIONS"},{"line_number":194,"context_line":"                    }"},{"line_number":195,"context_line":"                    raise exception.PureDriverException(reason\u003dmsg)"},{"line_number":196,"context_line":"                target_array_info \u003d array.get()"},{"line_number":197,"context_line":"                array.array_name \u003d target_array_info[\"array_name\"]"},{"line_number":198,"context_line":"                array.array_id \u003d target_array_info[\"id\"]"},{"line_number":199,"context_line":"                LOG.debug(\"secondary array name: %s\", self._array.array_name)"},{"line_number":200,"context_line":"                LOG.debug(\"secondary array id: %s\", self._array.array_id)"},{"line_number":201,"context_line":"                self._setup_replicated_pgroups(array, [self._array],"},{"line_number":202,"context_line":"                                               self._replication_pg_name,"},{"line_number":203,"context_line":"                                               self._replication_interval,"},{"line_number":204,"context_line":"                                               retention_policy)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"            self._setup_replicated_pgroups(self._array,"},{"line_number":207,"context_line":"                                           self._replication_target_arrays,"}],"source_content_type":"text/x-python","patch_set":18,"id":"da6ed579_987f73df","line":204,"range":{"start_line":186,"start_character":12,"end_line":204,"end_character":64},"updated":"2016-01-15 06:07:57.000000000","message":"Can we combine this loop and the one in parse_replication_configs()?","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"1ddf4a749d7c01af4c19c8a019958ad7c977d2dd","unresolved":false,"context_lines":[{"line_number":183,"context_line":""},{"line_number":184,"context_line":"            retention_policy \u003d self._generate_replication_retention()"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"            for array in self._replication_target_arrays:"},{"line_number":187,"context_line":"                api_version \u003d array.get_rest_version()"},{"line_number":188,"context_line":"                if api_version not in REPLICATION_REQUIRED_API_VERSIONS:"},{"line_number":189,"context_line":"                    msg \u003d _(\u0027Unable to do replication with Purity REST \u0027"},{"line_number":190,"context_line":"                            \u0027API version %(api_version)s, requires one of \u0027"},{"line_number":191,"context_line":"                            \u0027%(required_versions)s.\u0027) % {"},{"line_number":192,"context_line":"                        \u0027api_version\u0027: api_version,"},{"line_number":193,"context_line":"                        \u0027required_versions\u0027: REPLICATION_REQUIRED_API_VERSIONS"},{"line_number":194,"context_line":"                    }"},{"line_number":195,"context_line":"                    raise exception.PureDriverException(reason\u003dmsg)"},{"line_number":196,"context_line":"                target_array_info \u003d array.get()"},{"line_number":197,"context_line":"                array.array_name \u003d target_array_info[\"array_name\"]"},{"line_number":198,"context_line":"                array.array_id \u003d target_array_info[\"id\"]"},{"line_number":199,"context_line":"                LOG.debug(\"secondary array name: %s\", self._array.array_name)"},{"line_number":200,"context_line":"                LOG.debug(\"secondary array id: %s\", self._array.array_id)"},{"line_number":201,"context_line":"                self._setup_replicated_pgroups(array, [self._array],"},{"line_number":202,"context_line":"                                               self._replication_pg_name,"},{"line_number":203,"context_line":"                                               self._replication_interval,"},{"line_number":204,"context_line":"                                               retention_policy)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"            self._setup_replicated_pgroups(self._array,"},{"line_number":207,"context_line":"                                           self._replication_target_arrays,"}],"source_content_type":"text/x-python","patch_set":18,"id":"ba63e191_18a538b4","line":204,"range":{"start_line":186,"start_character":12,"end_line":204,"end_character":64},"in_reply_to":"da6ed579_987f73df","updated":"2016-01-21 04:12:06.000000000","message":"Done","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d3863814b58dce0fa62ee2e3a047367488377ca7","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        # TODO(dwilson): figure out if we need to mirror consisgroup on"},{"line_number":264,"context_line":"        # target array if failover has occurred."},{"line_number":265,"context_line":"        if (volume[\u0027consistencygroup_id\u0027] and"},{"line_number":266,"context_line":"                current_array.array_id \u003d\u003d self._array.array_id):"},{"line_number":267,"context_line":"            self._add_volume_to_consistency_group("},{"line_number":268,"context_line":"                volume[\u0027consistencygroup_id\u0027],"},{"line_number":269,"context_line":"                vol_name"}],"source_content_type":"text/x-python","patch_set":18,"id":"da6ed579_d8df2bd4","line":266,"updated":"2016-01-15 06:07:57.000000000","message":"We should log a warning or something here when we are stopping the volume from being added to the group.","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"1ddf4a749d7c01af4c19c8a019958ad7c977d2dd","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        # TODO(dwilson): figure out if we need to mirror consisgroup on"},{"line_number":264,"context_line":"        # target array if failover has occurred."},{"line_number":265,"context_line":"        if (volume[\u0027consistencygroup_id\u0027] and"},{"line_number":266,"context_line":"                current_array.array_id \u003d\u003d self._array.array_id):"},{"line_number":267,"context_line":"            self._add_volume_to_consistency_group("},{"line_number":268,"context_line":"                volume[\u0027consistencygroup_id\u0027],"},{"line_number":269,"context_line":"                vol_name"}],"source_content_type":"text/x-python","patch_set":18,"id":"ba63e191_785f9441","line":266,"in_reply_to":"da6ed579_d8df2bd4","updated":"2016-01-21 04:12:06.000000000","message":"Done","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d3863814b58dce0fa62ee2e3a047367488377ca7","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":286,"context_line":"                    if (err.code \u003d\u003d 400 and"},{"line_number":287,"context_line":"                            ERR_MSG_ALREADY_BELONGS in err.text):"},{"line_number":288,"context_line":"                        # Happens if the volume does not exist."},{"line_number":289,"context_line":"                        ctxt.reraise \u003d False"},{"line_number":290,"context_line":"                        LOG.warning(_LW(\"Adding Volume to Protection Group \""},{"line_number":291,"context_line":"                                        \"failed with message: %s\"), err.text)"}],"source_content_type":"text/x-python","patch_set":18,"id":"da6ed579_58ea5b75","line":288,"updated":"2016-01-15 06:07:57.000000000","message":"if it doesnt exist? or already belongs to the group?","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"1ddf4a749d7c01af4c19c8a019958ad7c977d2dd","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":286,"context_line":"                    if (err.code \u003d\u003d 400 and"},{"line_number":287,"context_line":"                            ERR_MSG_ALREADY_BELONGS in err.text):"},{"line_number":288,"context_line":"                        # Happens if the volume does not exist."},{"line_number":289,"context_line":"                        ctxt.reraise \u003d False"},{"line_number":290,"context_line":"                        LOG.warning(_LW(\"Adding Volume to Protection Group \""},{"line_number":291,"context_line":"                                        \"failed with message: %s\"), err.text)"}],"source_content_type":"text/x-python","patch_set":18,"id":"ba63e191_d8156049","line":288,"in_reply_to":"da6ed579_58ea5b75","updated":"2016-01-21 04:12:06.000000000","message":"already belongs to group. Fixed","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d3863814b58dce0fa62ee2e3a047367488377ca7","unresolved":false,"context_lines":[{"line_number":313,"context_line":""},{"line_number":314,"context_line":"        # TODO(dwilson): figure out if we need to mirror consisgroup on"},{"line_number":315,"context_line":"        # target array if failover has occurred."},{"line_number":316,"context_line":"        if (volume[\u0027consistencygroup_id\u0027] and"},{"line_number":317,"context_line":"                current_array.array_id \u003d\u003d self._array.array_id):"},{"line_number":318,"context_line":"            self._add_volume_to_consistency_group("},{"line_number":319,"context_line":"                volume[\u0027consistencygroup_id\u0027],"},{"line_number":320,"context_line":"                vol_name"}],"source_content_type":"text/x-python","patch_set":18,"id":"da6ed579_b89277f4","line":317,"range":{"start_line":316,"start_character":8,"end_line":317,"end_character":64},"updated":"2016-01-15 06:07:57.000000000","message":"same here, we should log a warning if it has a cg id and fails the check for being on the primary array\n\nI\u0027m wondering if maybe when we fail over we should just remove it from the consistency group... that might simplify things a little bit, but is a different behavior from other drivers. Guess a topic to bring up at the mid-cycle and we can adjust later if needed.","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"1ddf4a749d7c01af4c19c8a019958ad7c977d2dd","unresolved":false,"context_lines":[{"line_number":313,"context_line":""},{"line_number":314,"context_line":"        # TODO(dwilson): figure out if we need to mirror consisgroup on"},{"line_number":315,"context_line":"        # target array if failover has occurred."},{"line_number":316,"context_line":"        if (volume[\u0027consistencygroup_id\u0027] and"},{"line_number":317,"context_line":"                current_array.array_id \u003d\u003d self._array.array_id):"},{"line_number":318,"context_line":"            self._add_volume_to_consistency_group("},{"line_number":319,"context_line":"                volume[\u0027consistencygroup_id\u0027],"},{"line_number":320,"context_line":"                vol_name"}],"source_content_type":"text/x-python","patch_set":18,"id":"ba63e191_73425540","line":317,"range":{"start_line":316,"start_character":8,"end_line":317,"end_character":64},"in_reply_to":"da6ed579_b89277f4","updated":"2016-01-21 04:12:06.000000000","message":"I\u0027ve edited this to log a warning.\nAgreed, resolving the interaction between volume replication and Consistency Groups is an interesting topic for the mid-cycle.","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d3863814b58dce0fa62ee2e3a047367488377ca7","unresolved":false,"context_lines":[{"line_number":1071,"context_line":"                                     remvollist\u003d("},{"line_number":1072,"context_line":"                                         [self._get_vol_name(volume)]))"},{"line_number":1073,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":1074,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":1075,"context_line":"                ctxt.reraise \u003d False"},{"line_number":1076,"context_line":"                if (err.code !\u003d 400 or"},{"line_number":1077,"context_line":"                        ERR_MSG_COULD_NOT_BE_FOUND not in err.text):"},{"line_number":1078,"context_line":"                    LOG.debug(\"Disable replication on volume failed with \""}],"source_content_type":"text/x-python","patch_set":18,"id":"da6ed579_83ef041d","line":1075,"range":{"start_line":1074,"start_character":12,"end_line":1075,"end_character":36},"updated":"2016-01-15 06:07:57.000000000","message":"since we immediately say reraise \u003d False I don\u0027t think we need to use this save_and_reraise_exception helper, can just do the if statement below and eat the exception","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"1ddf4a749d7c01af4c19c8a019958ad7c977d2dd","unresolved":false,"context_lines":[{"line_number":1071,"context_line":"                                     remvollist\u003d("},{"line_number":1072,"context_line":"                                         [self._get_vol_name(volume)]))"},{"line_number":1073,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":1074,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":1075,"context_line":"                ctxt.reraise \u003d False"},{"line_number":1076,"context_line":"                if (err.code !\u003d 400 or"},{"line_number":1077,"context_line":"                        ERR_MSG_COULD_NOT_BE_FOUND not in err.text):"},{"line_number":1078,"context_line":"                    LOG.debug(\"Disable replication on volume failed with \""}],"source_content_type":"text/x-python","patch_set":18,"id":"ba63e191_01793cf6","line":1075,"range":{"start_line":1074,"start_character":12,"end_line":1075,"end_character":36},"in_reply_to":"da6ed579_83ef041d","updated":"2016-01-21 04:12:06.000000000","message":"I think the bug here is that we *do* want to raise an exception if we get an unrecognized error (\"could not be found\" is a \"recognized error\" which means replication is already disabled)\nI\u0027ve reformatted to make it easier to parse","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d3863814b58dce0fa62ee2e3a047367488377ca7","unresolved":false,"context_lines":[{"line_number":1100,"context_line":"                             \"secondary targets configured.\") %"},{"line_number":1101,"context_line":"                    {\u0027volume\u0027: vol_name})"},{"line_number":1102,"context_line":""},{"line_number":1103,"context_line":"        if secondary:"},{"line_number":1104,"context_line":"            for array in failover_candidate_arrays:"},{"line_number":1105,"context_line":"                if array._target_device_id \u003d\u003d secondary:"},{"line_number":1106,"context_line":"                    secondary_array \u003d array"},{"line_number":1107,"context_line":"        if not secondary_array:"},{"line_number":1108,"context_line":"            raise exception.PureDriverException("},{"line_number":1109,"context_line":"                reason\u003d_(\"Unable to determine secondary_array from supplied \""},{"line_number":1110,"context_line":"                         \"secondary: %(secondary)s\") % {\"secondary\": secondary}"},{"line_number":1111,"context_line":"            )"},{"line_number":1112,"context_line":"        LOG.debug(\"Starting failover from %(primary)s to %(secondary)s\","},{"line_number":1113,"context_line":"                  {\"primary\": current_array.array_name,"},{"line_number":1114,"context_line":"                   \"secondary\": secondary_array.array_name})"}],"source_content_type":"text/x-python","patch_set":18,"id":"da6ed579_833dc490","line":1111,"range":{"start_line":1103,"start_character":8,"end_line":1111,"end_character":13},"updated":"2016-01-15 06:07:57.000000000","message":"In testing I found it kind of a harsh user experience where if you send in the wrong string we end up setting the replication status to error. We probably want to just log an error and leave the status as-is.","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"1ddf4a749d7c01af4c19c8a019958ad7c977d2dd","unresolved":false,"context_lines":[{"line_number":1100,"context_line":"                             \"secondary targets configured.\") %"},{"line_number":1101,"context_line":"                    {\u0027volume\u0027: vol_name})"},{"line_number":1102,"context_line":""},{"line_number":1103,"context_line":"        if secondary:"},{"line_number":1104,"context_line":"            for array in failover_candidate_arrays:"},{"line_number":1105,"context_line":"                if array._target_device_id \u003d\u003d secondary:"},{"line_number":1106,"context_line":"                    secondary_array \u003d array"},{"line_number":1107,"context_line":"        if not secondary_array:"},{"line_number":1108,"context_line":"            raise exception.PureDriverException("},{"line_number":1109,"context_line":"                reason\u003d_(\"Unable to determine secondary_array from supplied \""},{"line_number":1110,"context_line":"                         \"secondary: %(secondary)s\") % {\"secondary\": secondary}"},{"line_number":1111,"context_line":"            )"},{"line_number":1112,"context_line":"        LOG.debug(\"Starting failover from %(primary)s to %(secondary)s\","},{"line_number":1113,"context_line":"                  {\"primary\": current_array.array_name,"},{"line_number":1114,"context_line":"                   \"secondary\": secondary_array.array_name})"}],"source_content_type":"text/x-python","patch_set":18,"id":"ba63e191_13cbd91f","line":1111,"range":{"start_line":1103,"start_character":8,"end_line":1111,"end_character":13},"in_reply_to":"da6ed579_833dc490","updated":"2016-01-21 04:12:06.000000000","message":"That makes sense. I\u0027ve made the change","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d3863814b58dce0fa62ee2e3a047367488377ca7","unresolved":false,"context_lines":[{"line_number":1161,"context_line":"        return current_array"},{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":"    def _get_arrays(self, volume):"},{"line_number":1164,"context_line":"        \"\"\"Returns the current and secondary array for a volume or snapshot"},{"line_number":1165,"context_line":""},{"line_number":1166,"context_line":"        :param volume: volume or snapshot object"},{"line_number":1167,"context_line":"        :return: the current_array, list of secondary_arrays for the volume"}],"source_content_type":"text/x-python","patch_set":18,"id":"da6ed579_03f8f4c1","line":1164,"range":{"start_line":1164,"start_character":45,"end_line":1164,"end_character":50},"updated":"2016-01-15 06:07:57.000000000","message":"array -\u003e arrays right?","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"1ddf4a749d7c01af4c19c8a019958ad7c977d2dd","unresolved":false,"context_lines":[{"line_number":1161,"context_line":"        return current_array"},{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":"    def _get_arrays(self, volume):"},{"line_number":1164,"context_line":"        \"\"\"Returns the current and secondary array for a volume or snapshot"},{"line_number":1165,"context_line":""},{"line_number":1166,"context_line":"        :param volume: volume or snapshot object"},{"line_number":1167,"context_line":"        :return: the current_array, list of secondary_arrays for the volume"}],"source_content_type":"text/x-python","patch_set":18,"id":"ba63e191_73c5758c","line":1164,"range":{"start_line":1164,"start_character":45,"end_line":1164,"end_character":50},"in_reply_to":"da6ed579_03f8f4c1","updated":"2016-01-21 04:12:06.000000000","message":"typo fixed","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d3863814b58dce0fa62ee2e3a047367488377ca7","unresolved":false,"context_lines":[{"line_number":1179,"context_line":"            for flash_array in self._replication_target_arrays:"},{"line_number":1180,"context_line":"                if flash_array.array_id \u003d\u003d current_array_id:"},{"line_number":1181,"context_line":"                    primary_array \u003d flash_array"},{"line_number":1182,"context_line":"                    secondary_arrays \u003d [self._array]"},{"line_number":1183,"context_line":"                    break"},{"line_number":1184,"context_line":""},{"line_number":1185,"context_line":"        return primary_array, secondary_arrays"}],"source_content_type":"text/x-python","patch_set":18,"id":"da6ed579_43dfcc39","line":1182,"updated":"2016-01-15 06:07:57.000000000","message":"We should document somewhere the limitation we are imposing here where you can only jump from the primary array to one of the secondaries, and then back to the primary, never secondary to secondary.\n\nWe may want to put something on the backlog to allow for it.","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"1ddf4a749d7c01af4c19c8a019958ad7c977d2dd","unresolved":false,"context_lines":[{"line_number":1179,"context_line":"            for flash_array in self._replication_target_arrays:"},{"line_number":1180,"context_line":"                if flash_array.array_id \u003d\u003d current_array_id:"},{"line_number":1181,"context_line":"                    primary_array \u003d flash_array"},{"line_number":1182,"context_line":"                    secondary_arrays \u003d [self._array]"},{"line_number":1183,"context_line":"                    break"},{"line_number":1184,"context_line":""},{"line_number":1185,"context_line":"        return primary_array, secondary_arrays"}],"source_content_type":"text/x-python","patch_set":18,"id":"ba63e191_8e6482e5","line":1182,"in_reply_to":"da6ed579_43dfcc39","updated":"2016-01-21 04:12:06.000000000","message":"I\u0027ve edited the commit message. I\u0027ve also added a note so that we add this to our driver documentation (for Mitaka)","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d3863814b58dce0fa62ee2e3a047367488377ca7","unresolved":false,"context_lines":[{"line_number":1361,"context_line":"                              \"snap %(snap)s.\","},{"line_number":1362,"context_line":"                              {\"snap\": pg_snap[\"name\"],"},{"line_number":1363,"context_line":"                               \"vol\": vol_snap_source_to_find})"},{"line_number":1364,"context_line":"                    LOG.debug(\"Snapshot details: %(snap)s\","},{"line_number":1365,"context_line":"                              {\"snap\": volume_snap})"},{"line_number":1366,"context_line":"                    break"},{"line_number":1367,"context_line":"        return volume_snap"},{"line_number":1368,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"da6ed579_0353146c","line":1365,"range":{"start_line":1364,"start_character":20,"end_line":1365,"end_character":52},"updated":"2016-01-15 06:07:57.000000000","message":"wont this be duplicated with what was logged out up on line 1355 as the last volume we examined? We will have like \n\n\u003csnap info\u003e\n\"Found the snapshot...\"\n\u003cthe same snap info\u003e\n\nimo we probably don\u0027t need it","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"1ddf4a749d7c01af4c19c8a019958ad7c977d2dd","unresolved":false,"context_lines":[{"line_number":1361,"context_line":"                              \"snap %(snap)s.\","},{"line_number":1362,"context_line":"                              {\"snap\": pg_snap[\"name\"],"},{"line_number":1363,"context_line":"                               \"vol\": vol_snap_source_to_find})"},{"line_number":1364,"context_line":"                    LOG.debug(\"Snapshot details: %(snap)s\","},{"line_number":1365,"context_line":"                              {\"snap\": volume_snap})"},{"line_number":1366,"context_line":"                    break"},{"line_number":1367,"context_line":"        return volume_snap"},{"line_number":1368,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"ba63e191_d3122109","line":1365,"range":{"start_line":1364,"start_character":20,"end_line":1365,"end_character":52},"in_reply_to":"da6ed579_0353146c","updated":"2016-01-21 04:12:06.000000000","message":"Yes, I\u0027ll remove this","commit_id":"670ffd12d5713c3547e386c09ea267965197df81"}],"cinder/volume/manager.py":[{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"51cc40b9eb9ca7947382da1b4e15a618ccdbf7b3","unresolved":false,"context_lines":[{"line_number":3162,"context_line":"        \"\"\""},{"line_number":3163,"context_line":""},{"line_number":3164,"context_line":"        try:"},{"line_number":3165,"context_line":"            volume \u003d self.db.volume_get(context, volume[\u0027id\u0027])"},{"line_number":3166,"context_line":"            replication_targets \u003d self.driver.list_replication_targets(context,"},{"line_number":3167,"context_line":"                                                                       volume)"},{"line_number":3168,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_afed0927","line":3165,"updated":"2015-09-02 04:17:18.000000000","message":"why are we refetching the volume object here, when it\u0027s passed in?","commit_id":"261bceb48ed13b166d9cdf4a9d15079ba5eba043"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"1f8523e6df77b4e186b8b3cead5f1dedc301ad92","unresolved":false,"context_lines":[{"line_number":3162,"context_line":"        \"\"\""},{"line_number":3163,"context_line":""},{"line_number":3164,"context_line":"        try:"},{"line_number":3165,"context_line":"            volume \u003d self.db.volume_get(context, volume[\u0027id\u0027])"},{"line_number":3166,"context_line":"            replication_targets \u003d self.driver.list_replication_targets(context,"},{"line_number":3167,"context_line":"                                                                       volume)"},{"line_number":3168,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_cfdabd17","line":3165,"in_reply_to":"da20952f_afed0927","updated":"2015-09-02 04:32:14.000000000","message":"Heh yea that\u0027s a strange one, the volume passed in is not actually one of the volume db models so it doesn\u0027t have the \u0027name\u0027 property on it. This is because the one passed in comes from the api level get which queries the db and then creates a dict out if it. Until we have the versions object stuff we have to do something like this or do a better job serializing it at the api layer.","commit_id":"261bceb48ed13b166d9cdf4a9d15079ba5eba043"},{"author":{"_account_id":1207,"name":"Duncan Thomas","email":"duncan.thomas@gmail.com","username":"duncan-thomas"},"change_message_id":"6a79f4222934964fd45a22eec7b758b07e430751","unresolved":false,"context_lines":[{"line_number":3162,"context_line":"        \"\"\""},{"line_number":3163,"context_line":""},{"line_number":3164,"context_line":"        try:"},{"line_number":3165,"context_line":"            volume \u003d self.db.volume_get(context, volume[\u0027id\u0027])"},{"line_number":3166,"context_line":"            replication_targets \u003d self.driver.list_replication_targets(context,"},{"line_number":3167,"context_line":"                                                                       volume)"},{"line_number":3168,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_27ba66e2","line":3165,"in_reply_to":"da20952f_cfdabd17","updated":"2015-09-02 15:53:56.000000000","message":"Can you file a bug about this please, Patrick? The object layer should certainly have this property added","commit_id":"261bceb48ed13b166d9cdf4a9d15079ba5eba043"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"9d667b84d376d7f7389e1acb19e7695fbf5843de","unresolved":false,"context_lines":[{"line_number":3065,"context_line":"            err_msg \u003d (_(\"Enable replication for volume failed.\"))"},{"line_number":3066,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":3067,"context_line":"            self.db.volume_update(context,"},{"line_number":3068,"context_line":"                                  volume[\u0027id\u0027],"},{"line_number":3069,"context_line":"                                  {\u0027replication_status\u0027: \u0027error\u0027})"},{"line_number":3070,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":3071,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_568ec02e","line":3068,"updated":"2015-09-04 19:01:38.000000000","message":"same with all this stuff? This should be it\u0027s own patch and make this dependent on them.","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"fe2e46d4f808508b630a5dbef1875ee023b61812","unresolved":false,"context_lines":[{"line_number":3065,"context_line":"            err_msg \u003d (_(\"Enable replication for volume failed.\"))"},{"line_number":3066,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":3067,"context_line":"            self.db.volume_update(context,"},{"line_number":3068,"context_line":"                                  volume[\u0027id\u0027],"},{"line_number":3069,"context_line":"                                  {\u0027replication_status\u0027: \u0027error\u0027})"},{"line_number":3070,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":3071,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_cdecc92b","line":3068,"in_reply_to":"da20952f_568ec02e","updated":"2015-12-22 18:28:37.000000000","message":"Done","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"1f29a0537e0f95753207f85d80fb96ebf54dca8a","unresolved":false,"context_lines":[{"line_number":3070,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":3071,"context_line":""},{"line_number":3072,"context_line":"        except Exception:"},{"line_number":3073,"context_line":"            msg \u003d _LE(\u0027enable_replication caused exception in driver\u0027)"},{"line_number":3074,"context_line":"            LOG.exception(msg, resource\u003dvolume)"},{"line_number":3075,"context_line":"            self.db.volume_update(context,"},{"line_number":3076,"context_line":"                                  volume[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_7c3163ec","line":3073,"updated":"2015-09-04 19:53:30.000000000","message":"we are using same variable msg in \"raise exception.CinderException(msg)\" and \u0027LOG.exception\u0027 so do we have to use _LE in msg?","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"fe2e46d4f808508b630a5dbef1875ee023b61812","unresolved":false,"context_lines":[{"line_number":3070,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":3071,"context_line":""},{"line_number":3072,"context_line":"        except Exception:"},{"line_number":3073,"context_line":"            msg \u003d _LE(\u0027enable_replication caused exception in driver\u0027)"},{"line_number":3074,"context_line":"            LOG.exception(msg, resource\u003dvolume)"},{"line_number":3075,"context_line":"            self.db.volume_update(context,"},{"line_number":3076,"context_line":"                                  volume[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_ad37fdae","line":3073,"in_reply_to":"da20952f_7c3163ec","updated":"2015-12-22 18:28:37.000000000","message":"Done","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"1f29a0537e0f95753207f85d80fb96ebf54dca8a","unresolved":false,"context_lines":[{"line_number":3121,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":3122,"context_line":""},{"line_number":3123,"context_line":"        except Exception:"},{"line_number":3124,"context_line":"            msg \u003d _LE(\u0027disable_replication caused exception in driver\u0027)"},{"line_number":3125,"context_line":"            LOG.exception(msg, resource\u003dvolume)"},{"line_number":3126,"context_line":"            self.db.volume_update(context,"},{"line_number":3127,"context_line":"                                  volume[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_9c455744","line":3124,"updated":"2015-09-04 19:53:30.000000000","message":"same","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"fe2e46d4f808508b630a5dbef1875ee023b61812","unresolved":false,"context_lines":[{"line_number":3121,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":3122,"context_line":""},{"line_number":3123,"context_line":"        except Exception:"},{"line_number":3124,"context_line":"            msg \u003d _LE(\u0027disable_replication caused exception in driver\u0027)"},{"line_number":3125,"context_line":"            LOG.exception(msg, resource\u003dvolume)"},{"line_number":3126,"context_line":"            self.db.volume_update(context,"},{"line_number":3127,"context_line":"                                  volume[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_8d44811b","line":3124,"in_reply_to":"da20952f_9c455744","updated":"2015-12-22 18:28:37.000000000","message":"Done","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"1f29a0537e0f95753207f85d80fb96ebf54dca8a","unresolved":false,"context_lines":[{"line_number":3197,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":3198,"context_line":""},{"line_number":3199,"context_line":"        except Exception:"},{"line_number":3200,"context_line":"            msg \u003d _LE(\u0027replication_failover caused exception in driver\u0027)"},{"line_number":3201,"context_line":"            LOG.exception(msg, resource\u003dvolume)"},{"line_number":3202,"context_line":"            self.db.volume_update(context,"},{"line_number":3203,"context_line":"                                  volume[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_fc6a53b4","line":3200,"updated":"2015-09-04 19:53:30.000000000","message":"same","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"fe2e46d4f808508b630a5dbef1875ee023b61812","unresolved":false,"context_lines":[{"line_number":3197,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":3198,"context_line":""},{"line_number":3199,"context_line":"        except Exception:"},{"line_number":3200,"context_line":"            msg \u003d _LE(\u0027replication_failover caused exception in driver\u0027)"},{"line_number":3201,"context_line":"            LOG.exception(msg, resource\u003dvolume)"},{"line_number":3202,"context_line":"            self.db.volume_update(context,"},{"line_number":3203,"context_line":"                                  volume[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a740942_cd6129aa","line":3200,"in_reply_to":"da20952f_fc6a53b4","updated":"2015-12-22 18:28:37.000000000","message":"Done","commit_id":"52ffd3bde898f06cfa095afa3774bf9ff6e0b001"}],"releasenotes/notes/pure-v2-replication-0246223caaa8a9b5.yaml":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"e3fdec2d91c6cea2c455f32cd2677343c90571a8","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Added v2 replication support to the Pure Volume driver."},{"line_number":4,"context_line":"issues:"},{"line_number":5,"context_line":"  - replication-failover is supported from primary to any of multiple secondary arrays, but subsequent replication-failover is only supported back to the original primary."}],"source_content_type":"text/x-yaml","patch_set":20,"id":"7a5de9d1_889b3372","line":5,"updated":"2016-01-28 13:25:02.000000000","message":"This may or may not be the case for every driver that supports replication. Probably something better captured in the documentation than the release notes. Please remove this issues section.","commit_id":"7728a8287e3f6b9c5b4c0570ab5ca74d49aff151"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"10505fe6c9c93f2cae0c0a6de6273777d9f86060","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Added v2 replication support to the Pure Volume driver."},{"line_number":4,"context_line":"issues:"},{"line_number":5,"context_line":"  - replication-failover is supported from primary to any of multiple secondary arrays, but subsequent replication-failover is only supported back to the original primary."}],"source_content_type":"text/x-yaml","patch_set":20,"id":"7a5de9d1_f812b661","line":5,"in_reply_to":"7a5de9d1_889b3372","updated":"2016-01-28 14:16:24.000000000","message":"Done","commit_id":"7728a8287e3f6b9c5b4c0570ab5ca74d49aff151"}]}
