)]}'
{"cinder/volume/drivers/datera.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        # If we can\u0027t authenticate through the old and new method, just fail"},{"line_number":152,"context_line":"        # now."},{"line_number":153,"context_line":"        if not all([self.username, self.password]):"},{"line_number":154,"context_line":"            msg \u003d _LE(\"san_login and/or san_password is not set for Datera \""},{"line_number":155,"context_line":"                      \"driver in the cinder.conf. Set this information and \""},{"line_number":156,"context_line":"                      \"start the cinder-volume service again.\")"},{"line_number":157,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_ab6362db","line":154,"updated":"2016-02-26 22:29:29.000000000","message":"This was actually correct before. If a message is being used for both logging and an exception message then it should just use the _() translation marker.","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        else:"},{"line_number":185,"context_line":"            # Handle updating QOS Policies"},{"line_number":186,"context_line":"            if resource_type \u003d\u003d \u0027app_instances\u0027:"},{"line_number":187,"context_line":"                url \u003d \u0027app_instances/{}/storage_instances/{}/volumes/{\u0027 + \\"},{"line_number":188,"context_line":"                      \u0027}/performance_policy\u0027"},{"line_number":189,"context_line":"                url \u003d url.format("},{"line_number":190,"context_line":"                    resource[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_cb85065a","line":187,"updated":"2016-02-26 22:29:29.000000000","message":"Wrap the string assignment in () to avoid using \\ for line continuation.","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        # Generate App Instance, Storage Instance and Volume"},{"line_number":205,"context_line":"        # Volume ID will be used as the App Instance Name"},{"line_number":206,"context_line":"        # Storage Instance and Volumes will have standard names"},{"line_number":207,"context_line":"        app_params \u003d \\"},{"line_number":208,"context_line":"            {"},{"line_number":209,"context_line":"                \u0027create_mode\u0027: \"openstack\","},{"line_number":210,"context_line":"                \u0027uuid\u0027: str(volume[\u0027id\u0027]),"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_8b8c9e80","line":207,"updated":"2016-02-26 22:29:29.000000000","message":"Refactor to remove \\","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":250,"context_line":"            self.create_export(None, volume)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    def create_cloned_volume(self, volume, src_vref):"},{"line_number":253,"context_line":"        clone_src_template \u003d \"/app_instances/{}/storage_instances/{\" + \\"},{"line_number":254,"context_line":"                             \"}/volumes/{}\""},{"line_number":255,"context_line":"        src \u003d clone_src_template.format(src_vref[\u0027id\u0027], DEFAULT_STORAGE_NAME,"},{"line_number":256,"context_line":"                                        DEFAULT_VOLUME_NAME)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_6bde7a6e","line":253,"updated":"2016-02-26 22:29:29.000000000","message":"Same.","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":308,"context_line":"            LOG.info(msg, volume[\u0027id\u0027])"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def create_snapshot(self, snapshot):"},{"line_number":311,"context_line":"        url_template \u003d \u0027app_instances/{}/storage_instances/{}/volumes/{\u0027 \\"},{"line_number":312,"context_line":"                       \u0027}/snapshots\u0027"},{"line_number":313,"context_line":"        url \u003d url_template.format(snapshot[\u0027volume_id\u0027],"},{"line_number":314,"context_line":"                                  DEFAULT_STORAGE_NAME,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_cbd3465e","line":311,"updated":"2016-02-26 22:29:29.000000000","message":"Same.","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        self._issue_api_request(url, method\u003d\u0027post\u0027, body\u003dsnap_params)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def delete_snapshot(self, snapshot):"},{"line_number":323,"context_line":"        snap_temp \u003d \u0027app_instances/{}/storage_instances/{}/volumes/{\u0027 \\"},{"line_number":324,"context_line":"                    \u0027}/snapshots\u0027"},{"line_number":325,"context_line":"        snapu \u003d snap_temp.format(snapshot[\u0027volume_id\u0027],"},{"line_number":326,"context_line":"                                 DEFAULT_STORAGE_NAME,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_0bceceb3","line":323,"updated":"2016-02-26 22:29:29.000000000","message":"Same.","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            LOG.info(msg, snapshot[\u0027id\u0027])"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    def create_volume_from_snapshot(self, volume, snapshot):"},{"line_number":346,"context_line":"        snap_temp \u003d \u0027app_instances/{}/storage_instances/{}/volumes/{\u0027 \\"},{"line_number":347,"context_line":"                    \u0027}/snapshots\u0027"},{"line_number":348,"context_line":"        snapu \u003d snap_temp.format(snapshot[\u0027volume_id\u0027],"},{"line_number":349,"context_line":"                                 DEFAULT_STORAGE_NAME,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_8bbade08","line":346,"updated":"2016-02-26 22:29:29.000000000","message":"Same.","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        else:"},{"line_number":358,"context_line":"            raise exception.NotFound"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        src \u003d \u0027/app_instances/{}/storage_instances/{}/volumes/{\u0027 \\"},{"line_number":361,"context_line":"            \u0027}/snapshots/{}\u0027.format("},{"line_number":362,"context_line":"                snapshot[\u0027volume_id\u0027],"},{"line_number":363,"context_line":"                DEFAULT_STORAGE_NAME,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_eb372aae","line":360,"updated":"2016-02-26 22:29:29.000000000","message":"Same.","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":363,"context_line":"                DEFAULT_STORAGE_NAME,"},{"line_number":364,"context_line":"                DEFAULT_VOLUME_NAME,"},{"line_number":365,"context_line":"                found_ts)"},{"line_number":366,"context_line":"        app_params \u003d \\"},{"line_number":367,"context_line":"            {"},{"line_number":368,"context_line":"                \u0027create_mode\u0027: \u0027openstack\u0027,"},{"line_number":369,"context_line":"                \u0027uuid\u0027: str(volume[\u0027id\u0027]),"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_0b452e16","line":366,"updated":"2016-02-26 22:29:29.000000000","message":"Same.","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        return self.cluster_stats"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def _update_cluster_stats(self):"},{"line_number":396,"context_line":"        LOG.debug(_LI(\"Updating cluster stats info.\"))"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"        results \u003d self._issue_api_request(\u0027system\u0027)"},{"line_number":399,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_eb5e0ae8","line":396,"updated":"2016-02-26 22:29:29.000000000","message":"Debug log messages should not have translation.","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":458,"context_line":"        payload.encode(\u0027utf-8\u0027)"},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"        if not sensitive:"},{"line_number":461,"context_line":"            LOG.debug(\"Payload for Datera API call: {}\".format(payload))"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"        header \u003d {\u0027Content-Type\u0027: \u0027application/json; charset\u003dutf-8\u0027}"},{"line_number":464,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_0b136e0e","line":461,"updated":"2016-02-26 22:29:29.000000000","message":"Just for convention and consistency sake, it would have been better to keep this as it was.","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":487,"context_line":"        if action is not None:"},{"line_number":488,"context_line":"            connection_string +\u003d \u0027/%s\u0027 % action"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        LOG.debug(\"Endpoint for Datera API call: {\""},{"line_number":491,"context_line":"                  \"}\".format(connection_string))"},{"line_number":492,"context_line":"        try:"},{"line_number":493,"context_line":"            response \u003d getattr(requests, method)(connection_string,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_cb2fc63c","line":490,"updated":"2016-02-26 22:29:29.000000000","message":"Same. If debug logging isn\u0027t enabled, no string formatting will be performed with the previous format. In this case the string will be formatted and thrown away.","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":494,"context_line":"                                                 data\u003dpayload, headers\u003dheader,"},{"line_number":495,"context_line":"                                                 verify\u003dFalse, cert\u003dcert_data)"},{"line_number":496,"context_line":"        except requests.exceptions.RequestException as ex:"},{"line_number":497,"context_line":"            msg \u003d _LE("},{"line_number":498,"context_line":"                \u0027Failed to make a request to Datera cluster endpoint due \u0027"},{"line_number":499,"context_line":"                \u0027to the following reason: %s\u0027) % six.text_type("},{"line_number":500,"context_line":"                ex.message)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_ab1b621a","line":497,"updated":"2016-02-26 22:29:29.000000000","message":"This was correct before since it\u0027s also used in an exception.","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":503,"context_line":""},{"line_number":504,"context_line":"        data \u003d response.json()"},{"line_number":505,"context_line":"        if not sensitive:"},{"line_number":506,"context_line":"            LOG.debug(\"Results of Datera API call: {}\".format(data))"},{"line_number":507,"context_line":""},{"line_number":508,"context_line":"        if not response.ok:"},{"line_number":509,"context_line":"            LOG.debug(response.url)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_ebd3aa36","line":506,"updated":"2016-02-26 22:29:29.000000000","message":"Please change back.","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":506,"context_line":"            LOG.debug(\"Results of Datera API call: {}\".format(data))"},{"line_number":507,"context_line":""},{"line_number":508,"context_line":"        if not response.ok:"},{"line_number":509,"context_line":"            LOG.debug(response.url)"},{"line_number":510,"context_line":"            LOG.debug(payload)"},{"line_number":511,"context_line":"            LOG.debug(vars(response))"},{"line_number":512,"context_line":"            if response.status_code \u003d\u003d 404:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_0bb88ee4","line":509,"updated":"2016-02-26 22:29:29.000000000","message":"Might be better to have all three of these in a single call with a better message.","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3afb4ece64598106abd7e044439c9241e080a7b2","unresolved":false,"context_lines":[{"line_number":520,"context_line":"                            \u0027message\u0027: data[\u0027message\u0027]}"},{"line_number":521,"context_line":"                raise exception.Invalid(msg)"},{"line_number":522,"context_line":"            else:"},{"line_number":523,"context_line":"                msg \u003d _LE(\u0027Request to Datera cluster returned bad status:\u0027"},{"line_number":524,"context_line":"                          \u0027 %(status)s | %(reason)s\u0027) % {"},{"line_number":525,"context_line":"                              \u0027status\u0027: response.status_code,"},{"line_number":526,"context_line":"                              \u0027reason\u0027: response.reason}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_4bca966f","line":523,"updated":"2016-02-26 22:29:29.000000000","message":"Was correct before.","commit_id":"7619aac50de6f6a93194bb834cc81f0db05b7f6c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"8299b9ffd3f7799205a3432e80f7aac186046df2","unresolved":false,"context_lines":[{"line_number":36,"context_line":"d_opts \u003d ["},{"line_number":37,"context_line":"    cfg.StrOpt(\u0027datera_api_token\u0027,"},{"line_number":38,"context_line":"               default\u003dNone,"},{"line_number":39,"context_line":"               help\u003d\u0027DEPRECATED: This will be removed in the Liberty release. \u0027"},{"line_number":40,"context_line":"                    \u0027Use san_login and san_password instead. This directly \u0027"},{"line_number":41,"context_line":"                    \u0027sets the Datera API token.\u0027),"},{"line_number":42,"context_line":"    cfg.StrOpt(\u0027datera_api_port\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_cf184d78","line":39,"range":{"start_line":39,"start_character":61,"end_line":39,"end_character":68},"updated":"2016-02-28 23:32:34.000000000","message":"This should probably just be removed at this point.","commit_id":"b62f3a0d12b7d3d5236a1a852cb6725088edfd42"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"8299b9ffd3f7799205a3432e80f7aac186046df2","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":126,"context_line":"                LOG.error(_LE(\u0027Logging into the Datera cluster failed. Please \u0027"},{"line_number":127,"context_line":"                              \u0027check your username and password set in the \u0027"},{"line_number":128,"context_line":"                              \u0027cinder.conf and start the cinder-volume\u0027"},{"line_number":129,"context_line":"                              \u0027service again.\u0027))"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _get_lunid(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_6f1e6160","line":128,"updated":"2016-02-28 23:32:34.000000000","message":"Missing space at the end here to cinder-volume doesn\u0027t run together with service in the resulting string.","commit_id":"b62f3a0d12b7d3d5236a1a852cb6725088edfd42"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"8299b9ffd3f7799205a3432e80f7aac186046df2","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        try:"},{"line_number":304,"context_line":"            self._issue_api_request(url, method\u003d\u0027put\u0027, body\u003ddata)"},{"line_number":305,"context_line":"        except exception.NotFound:"},{"line_number":306,"context_line":"            msg \u003d _(\"Tried to detach volume %s, but it was not found in the \""},{"line_number":307,"context_line":"                    \"Datera cluster. Continuing with detach.\")"},{"line_number":308,"context_line":"            LOG.info(msg, volume[\u0027id\u0027])"},{"line_number":309,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_4f5a7d2b","line":306,"updated":"2016-02-28 23:32:34.000000000","message":"This needs to be _LI() since it is just used with LOG.info.","commit_id":"b62f3a0d12b7d3d5236a1a852cb6725088edfd42"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"905f4546b41b303209901657e7144d6344231fff","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            LOG.debug(\u0027Getting Datera auth token.\u0027)"},{"line_number":116,"context_line":"            results \u003d self._issue_api_request(\u0027login\u0027, \u0027put\u0027, body\u003dbody,"},{"line_number":117,"context_line":"                                              sensitive\u003dTrue)"},{"line_number":118,"context_line":"            self.auth_token \u003d results[\u0027key\u0027]"},{"line_number":119,"context_line":"            self.datera_api_token \u003d results[\u0027key\u0027]"},{"line_number":120,"context_line":"        except exception.NotAuthorized:"},{"line_number":121,"context_line":"            with excutils.save_and_reraise_exception():"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aed3d3a_f2534015","line":118,"updated":"2016-02-29 20:45:46.000000000","message":"Do you need to store this in both self.auth_token and self.datera_api_token? I don\u0027t see auth_token being used anywhere.","commit_id":"06d49b845e9455ca341862e9d290a12dc0e0c4c8"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"905f4546b41b303209901657e7144d6344231fff","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        ]"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        if any(DEPRECATED_OPTS):"},{"line_number":139,"context_line":"            msg \u003d _LW(\"Client cert verification and datera_api_token are \""},{"line_number":140,"context_line":"                      \"deprecated in the Datera driver, and will be removed \""},{"line_number":141,"context_line":"                      \"in the Liberty release. Please set the san_login and \""},{"line_number":142,"context_line":"                      \"san_password in your cinder.conf instead.\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aed3d3a_1284e45b","line":139,"updated":"2016-02-29 20:45:46.000000000","message":"This can be updated now too.","commit_id":"06d49b845e9455ca341862e9d290a12dc0e0c4c8"}],"releasenotes/notes/datera-driver-v2-update-930468e8259c8e86.yaml":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"8299b9ffd3f7799205a3432e80f7aac186046df2","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - All Datera DataFabric backed volume-types will now use"},{"line_number":4,"context_line":"    API version 2 with Datera DataFabric"},{"line_number":5,"context_line":"upgrade:"},{"line_number":6,"context_line":"  - This update is required to use the Datera DataFabric"},{"line_number":7,"context_line":"    versions 1.0+ as a volume driver in OpenStack.  Versions"},{"line_number":8,"context_line":"    before 1.0 will not be able to utilize this new driver"},{"line_number":9,"context_line":"    since they still function on v1 of the Datera DataFabric"},{"line_number":10,"context_line":"    API"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9aed3d3a_6f6ca1d0","line":7,"range":{"start_line":6,"start_character":4,"end_line":7,"end_character":49},"updated":"2016-02-28 23:32:34.000000000","message":"Can you change this to something like:\n\nUsers of the Datera backend driver are now required to user DataFabric 1.0+.","commit_id":"b62f3a0d12b7d3d5236a1a852cb6725088edfd42"}]}
