)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"53cfc23a500efb5a16ae06b03c1f83702d5daca2","unresolved":false,"context_lines":[{"line_number":19,"context_line":"GET /V2/{tenant_id}/os-services"},{"line_number":20,"context_line":"will return the list of services with disable reason information"},{"line_number":21,"context_line":"if that exists."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I885e43132b0e49b63f7858abd3fcffe1b78d3fd8"},{"line_number":24,"context_line":"Implements bp record-reason-for-disabling-service"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAATn%2F9D3s%3D","line":22,"updated":"2013-12-17 07:02:07.000000000","message":"need a DocImpact tag here.","commit_id":"a14029983d834cd166c347bd03b69dfe6bcfb8fc"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"eb2b7cfb23d16c3802d68b5d4793e29a3117fa40","unresolved":false,"context_lines":[{"line_number":19,"context_line":"GET /V2/{tenant_id}/os-services"},{"line_number":20,"context_line":"will return the list of services with disable reason information"},{"line_number":21,"context_line":"if that exists."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I885e43132b0e49b63f7858abd3fcffe1b78d3fd8"},{"line_number":24,"context_line":"Implements bp record-reason-for-disabling-service"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAATn%2F9DkQ%3D","line":22,"in_reply_to":"AAAATn%2F9D3s%3D","updated":"2013-12-17 08:23:52.000000000","message":"Done","commit_id":"a14029983d834cd166c347bd03b69dfe6bcfb8fc"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"d57f9e260a250e62ad18dc97ab6a2d9ea4a9b727","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Give a way to save why a service has been disabled"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Port from nova I87a4affc45160796ff11c7b03e591e6aba73d62a"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"We added a field to the table of service to log a reason when a"},{"line_number":12,"context_line":"service has been disabled."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAAUX%2F%2F%2FYo%3D","line":9,"updated":"2014-02-07 22:03:45.000000000","message":"The link generated by this doesn\u0027t work.","commit_id":"3db5fb2709934e6641d861fa6be4321da3c91057"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"2e5967085e8a73ebd661c9319d917c3c3ae7b3a8","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Give a way to save why a service has been disabled"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Port from nova I87a4affc45160796ff11c7b03e591e6aba73d62a"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"We added a field to the table of service to log a reason when a"},{"line_number":12,"context_line":"service has been disabled."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAAUX%2F%2F%2BtM%3D","line":9,"in_reply_to":"AAAAUX%2F%2F%2FYo%3D","updated":"2014-02-08 00:45:30.000000000","message":"Seems the change id does not work, I will use gerrit review link instead.","commit_id":"3db5fb2709934e6641d861fa6be4321da3c91057"}],"cinder/api/contrib/extended_services.py":[{"author":{"_account_id":7236,"name":"Kiyohiro Adachi","email":"kiy-adachi@vx.jp.nec.com","username":"kadachi"},"change_message_id":"4dbbe053c9059ed122ea75bbef802654801fca02","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 IBM Corp."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FqFo%3D","line":1,"updated":"2014-01-10 01:15:15.000000000","message":"Is this necessary?","commit_id":"a1ac9374f40535fbf1ead2b3cfda22ab13f906d6"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"7e6b65cb27e9df95b4c46b71d79cc1ae66328a15","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 IBM Corp."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2Fpwc%3D","line":1,"in_reply_to":"AAAAUH%2F%2FqFo%3D","updated":"2014-01-10 02:53:13.000000000","message":"Done","commit_id":"a1ac9374f40535fbf1ead2b3cfda22ab13f906d6"}],"cinder/api/contrib/services.py":[{"author":{"_account_id":8574,"name":"Qin Zhao","username":"zhaoqin","inactive":true},"change_message_id":"aecd2506c2f0340efbda160549e8c9b814d07206","unresolved":false,"context_lines":[{"line_number":123,"context_line":"            utils.check_string_length(reason.strip(), \u0027Disabled reason\u0027,"},{"line_number":124,"context_line":"                                      min_length\u003d1, max_length\u003d255)"},{"line_number":125,"context_line":"        except exception.InvalidInput:"},{"line_number":126,"context_line":"            return False"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        return True"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9Knk%3D","line":126,"updated":"2013-12-16 03:30:46.000000000","message":"Is it necessary to log or forwarding out the exception message? I see you construct several types of message, why not log them?","commit_id":"97bd20d167ea324cf683c98b6f1aadbb0b0deea9"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"d75cc92bcf491a779a637baca4585e11ea9ffc65","unresolved":false,"context_lines":[{"line_number":123,"context_line":"            utils.check_string_length(reason.strip(), \u0027Disabled reason\u0027,"},{"line_number":124,"context_line":"                                      min_length\u003d1, max_length\u003d255)"},{"line_number":125,"context_line":"        except exception.InvalidInput:"},{"line_number":126,"context_line":"            return False"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        return True"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9Kcg%3D","line":126,"in_reply_to":"AAAATn%2F9Knk%3D","updated":"2013-12-16 05:19:18.000000000","message":"The function check_string_length in utils.py already log the exception message.","commit_id":"97bd20d167ea324cf683c98b6f1aadbb0b0deea9"},{"author":{"_account_id":8574,"name":"Qin Zhao","username":"zhaoqin","inactive":true},"change_message_id":"aecd2506c2f0340efbda160549e8c9b814d07206","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            reason \u003d body.get(\u0027disabled_reason\u0027)"},{"line_number":156,"context_line":"            if not self._is_valid_as_reason(reason):"},{"line_number":157,"context_line":"                msg \u003d _(\u0027Disabled reason contains invalid characters \u0027"},{"line_number":158,"context_line":"                        \u0027or is too long\u0027)"},{"line_number":159,"context_line":"                raise webob.exc.HTTPUnprocessableEntity(detail\u003dmsg)"},{"line_number":160,"context_line":"            status_detail[\u0027disabled_reason\u0027] \u003d reason"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9KmM%3D","line":158,"updated":"2013-12-16 03:30:46.000000000","message":"If the detail message is very long, is it better to cut it into adequate size, and continue to input the detail reason?","commit_id":"97bd20d167ea324cf683c98b6f1aadbb0b0deea9"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"d75cc92bcf491a779a637baca4585e11ea9ffc65","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            reason \u003d body.get(\u0027disabled_reason\u0027)"},{"line_number":156,"context_line":"            if not self._is_valid_as_reason(reason):"},{"line_number":157,"context_line":"                msg \u003d _(\u0027Disabled reason contains invalid characters \u0027"},{"line_number":158,"context_line":"                        \u0027or is too long\u0027)"},{"line_number":159,"context_line":"                raise webob.exc.HTTPUnprocessableEntity(detail\u003dmsg)"},{"line_number":160,"context_line":"            status_detail[\u0027disabled_reason\u0027] \u003d reason"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9Kes%3D","line":158,"in_reply_to":"AAAATn%2F9KmM%3D","updated":"2013-12-16 05:19:18.000000000","message":"it is better log exception here as we need to log an \"detailed\" reason","commit_id":"97bd20d167ea324cf683c98b6f1aadbb0b0deea9"},{"author":{"_account_id":8574,"name":"Qin Zhao","username":"zhaoqin","inactive":true},"change_message_id":"aecd2506c2f0340efbda160549e8c9b814d07206","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        resources \u003d []"},{"line_number":197,"context_line":"        controller \u003d ServiceController(self.ext_mgr)"},{"line_number":198,"context_line":"        resource \u003d extensions.ResourceExtension(\u0027os-services\u0027,"},{"line_number":199,"context_line":"                                                controller)"},{"line_number":200,"context_line":"        resources.append(resource)"},{"line_number":201,"context_line":"        return resources"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9KpY%3D","line":199,"updated":"2013-12-16 03:30:46.000000000","message":"the 2nd parameter is not aligned","commit_id":"97bd20d167ea324cf683c98b6f1aadbb0b0deea9"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"d75cc92bcf491a779a637baca4585e11ea9ffc65","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        resources \u003d []"},{"line_number":197,"context_line":"        controller \u003d ServiceController(self.ext_mgr)"},{"line_number":198,"context_line":"        resource \u003d extensions.ResourceExtension(\u0027os-services\u0027,"},{"line_number":199,"context_line":"                                                controller)"},{"line_number":200,"context_line":"        resources.append(resource)"},{"line_number":201,"context_line":"        return resources"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9Ke0%3D","line":199,"in_reply_to":"AAAATn%2F9KpY%3D","updated":"2013-12-16 05:19:18.000000000","message":"Done","commit_id":"97bd20d167ea324cf683c98b6f1aadbb0b0deea9"},{"author":{"_account_id":1207,"name":"Duncan Thomas","email":"duncan.thomas@gmail.com","username":"duncan-thomas"},"change_message_id":"9f216652bca0ce46b15d586581b9d69a2a887e07","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    def _is_valid_as_reason(self, reason):"},{"line_number":122,"context_line":"        try:"},{"line_number":123,"context_line":"            utils.check_string_length(reason.strip(), \u0027Disabled reason\u0027,"},{"line_number":124,"context_line":"                                      min_length\u003d1, max_length\u003d255)"},{"line_number":125,"context_line":"        except exception.InvalidInput:"},{"line_number":126,"context_line":"            return False"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9HwQ%3D","line":124,"updated":"2013-12-16 16:08:43.000000000","message":"I\u0027d say \"\" should be a valid reason, otherwise you risk having to jump through hoops in tools that set this automatically","commit_id":"56e15ac25181cc8ca14635fcaeb93101e3b73025"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"4ed737d9977d188fe6b15d9db91d5ab3183eff82","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    def _is_valid_as_reason(self, reason):"},{"line_number":122,"context_line":"        try:"},{"line_number":123,"context_line":"            utils.check_string_length(reason.strip(), \u0027Disabled reason\u0027,"},{"line_number":124,"context_line":"                                      min_length\u003d1, max_length\u003d255)"},{"line_number":125,"context_line":"        except exception.InvalidInput:"},{"line_number":126,"context_line":"            return False"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9FKE%3D","line":124,"in_reply_to":"AAAATn%2F9HwQ%3D","updated":"2013-12-17 00:01:49.000000000","message":"Done","commit_id":"56e15ac25181cc8ca14635fcaeb93101e3b73025"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"bd02aacfe6f10fa96a1b94d019d3f89aabb972af","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    def _is_valid_as_reason(self, reason):"},{"line_number":122,"context_line":"        try:"},{"line_number":123,"context_line":"            utils.check_string_length(reason.strip(), \u0027Disabled reason\u0027,"},{"line_number":124,"context_line":"                                      min_length\u003d0, max_length\u003d255)"},{"line_number":125,"context_line":"        except exception.InvalidInput:"},{"line_number":126,"context_line":"            return False"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9DcI%3D","line":124,"updated":"2013-12-17 09:26:57.000000000","message":"Why do you try to cut a string to 255?","commit_id":"36af320608e79c467c0375abfdd573a90ae8358c"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"24a40a1df22942caa2da9b7f7322fc8bf0a0dd3c","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    def _is_valid_as_reason(self, reason):"},{"line_number":122,"context_line":"        try:"},{"line_number":123,"context_line":"            utils.check_string_length(reason.strip(), \u0027Disabled reason\u0027,"},{"line_number":124,"context_line":"                                      min_length\u003d0, max_length\u003d255)"},{"line_number":125,"context_line":"        except exception.InvalidInput:"},{"line_number":126,"context_line":"            return False"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9C44%3D","line":124,"in_reply_to":"AAAATn%2F9DOo%3D","updated":"2013-12-17 10:57:22.000000000","message":"If the log message is too long, the we will throw exception here.","commit_id":"36af320608e79c467c0375abfdd573a90ae8358c"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"380286c41bad359da67c879f2fa66c4e4b9a155e","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    def _is_valid_as_reason(self, reason):"},{"line_number":122,"context_line":"        try:"},{"line_number":123,"context_line":"            utils.check_string_length(reason.strip(), \u0027Disabled reason\u0027,"},{"line_number":124,"context_line":"                                      min_length\u003d0, max_length\u003d255)"},{"line_number":125,"context_line":"        except exception.InvalidInput:"},{"line_number":126,"context_line":"            return False"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9DOo%3D","line":124,"in_reply_to":"AAAATn%2F9DQk%3D","updated":"2013-12-17 10:22:03.000000000","message":"Yes, I\u0027m sorry for wrong wording. In general I mean that a reason string can\u0027t be longer than 255. I\u0027m afraid that we can lose valuable information. And make it weird and get result something such as \"... service on port:\"","commit_id":"36af320608e79c467c0375abfdd573a90ae8358c"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"ba7c6ecd611cb1e0a09dba5418477bc8adb187f2","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    def _is_valid_as_reason(self, reason):"},{"line_number":122,"context_line":"        try:"},{"line_number":123,"context_line":"            utils.check_string_length(reason.strip(), \u0027Disabled reason\u0027,"},{"line_number":124,"context_line":"                                      min_length\u003d0, max_length\u003d255)"},{"line_number":125,"context_line":"        except exception.InvalidInput:"},{"line_number":126,"context_line":"            return False"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9DQk%3D","line":124,"in_reply_to":"AAAATn%2F9DcI%3D","updated":"2013-12-17 09:34:06.000000000","message":"I\u0027m not cutting the string but throwing exception for such case.","commit_id":"36af320608e79c467c0375abfdd573a90ae8358c"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"960a86c4e11aeb20956e744143ce595cb23d4ae4","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            if not self._is_valid_as_reason(reason):"},{"line_number":155,"context_line":"                msg \u003d _(\u0027Disabled reason contains invalid characters \u0027"},{"line_number":156,"context_line":"                        \u0027or is too long\u0027)"},{"line_number":157,"context_line":"                raise webob.exc.HTTPUnprocessableEntity(detail\u003dmsg)"},{"line_number":158,"context_line":"            status_detail[\u0027disabled_reason\u0027] \u003d reason"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        # NOTE(uni): deprecating service request key, binary takes precedence"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F9mRQ%3D","line":157,"updated":"2014-02-05 19:02:56.000000000","message":"We should raise webob.exc.HTTPBadRequest here instead. This error being raised is for responses to webdav requests.","commit_id":"542b6bc9f9661da597af8ddf664b39465cad78d1"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"7398fc21a0fb9ac58bb2e836bba455ab3160c3e7","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            if not self._is_valid_as_reason(reason):"},{"line_number":155,"context_line":"                msg \u003d _(\u0027Disabled reason contains invalid characters \u0027"},{"line_number":156,"context_line":"                        \u0027or is too long\u0027)"},{"line_number":157,"context_line":"                raise webob.exc.HTTPUnprocessableEntity(detail\u003dmsg)"},{"line_number":158,"context_line":"            status_detail[\u0027disabled_reason\u0027] \u003d reason"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        # NOTE(uni): deprecating service request key, binary takes precedence"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F9jQc%3D","line":157,"in_reply_to":"AAAAUH%2F9mRQ%3D","updated":"2014-02-06 04:31:04.000000000","message":"Done","commit_id":"542b6bc9f9661da597af8ddf664b39465cad78d1"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"a172e3d425fb07d12eb6945b529232a85873cc4f","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def _is_valid_as_reason(self, reason):"},{"line_number":120,"context_line":"        try:"},{"line_number":121,"context_line":"            utils.check_string_length(reason.strip(), \u0027Disabled reason\u0027,"},{"line_number":122,"context_line":"                                      min_length\u003d0, max_length\u003d255)"},{"line_number":123,"context_line":"        except exception.InvalidInput:"},{"line_number":124,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUX%2F%2FG7Y%3D","line":121,"updated":"2014-02-17 07:20:57.000000000","message":"If reason is not given in body, reason will be NoneType, which will raise here for not having strip() attr. There is also no test coverage for 121-123.","commit_id":"747cd54e7f3b98976416df7e66317d88572befe3"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"c2caffb40bc468ae60efdc31bcd7113f8ce4f9a6","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def _is_valid_as_reason(self, reason):"},{"line_number":120,"context_line":"        try:"},{"line_number":121,"context_line":"            utils.check_string_length(reason.strip(), \u0027Disabled reason\u0027,"},{"line_number":122,"context_line":"                                      min_length\u003d0, max_length\u003d255)"},{"line_number":123,"context_line":"        except exception.InvalidInput:"},{"line_number":124,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUX%2F%2BTKw%3D","line":121,"in_reply_to":"AAAAUX%2F%2FG7Y%3D","updated":"2014-02-22 03:46:14.000000000","message":"My original thinking is that we can do this checking in cinder client side. OK, I will add some checking here.","commit_id":"747cd54e7f3b98976416df7e66317d88572befe3"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"a172e3d425fb07d12eb6945b529232a85873cc4f","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        if id \u003d\u003d \"enable\":"},{"line_number":137,"context_line":"            disabled \u003d False"},{"line_number":138,"context_line":"            if ext_loaded:"},{"line_number":139,"context_line":"                status_detail[\u0027disabled_reason\u0027] \u003d None"},{"line_number":140,"context_line":"        elif (id \u003d\u003d \"disable\" or"},{"line_number":141,"context_line":"                (id \u003d\u003d \"disable-log-reason\" and ext_loaded)):"},{"line_number":142,"context_line":"            disabled \u003d True"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUX%2F%2FG4s%3D","line":139,"updated":"2014-02-17 07:20:57.000000000","message":"I think \u0027reason\u0027 instead of disabled_reason would suffice. This is a request to disable, or log disable, so it should be obvious.","commit_id":"747cd54e7f3b98976416df7e66317d88572befe3"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"c2caffb40bc468ae60efdc31bcd7113f8ce4f9a6","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        if id \u003d\u003d \"enable\":"},{"line_number":137,"context_line":"            disabled \u003d False"},{"line_number":138,"context_line":"            if ext_loaded:"},{"line_number":139,"context_line":"                status_detail[\u0027disabled_reason\u0027] \u003d None"},{"line_number":140,"context_line":"        elif (id \u003d\u003d \"disable\" or"},{"line_number":141,"context_line":"                (id \u003d\u003d \"disable-log-reason\" and ext_loaded)):"},{"line_number":142,"context_line":"            disabled \u003d True"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUX%2F%2BTIk%3D","line":139,"in_reply_to":"AAAAUX%2F%2FG4s%3D","updated":"2014-02-22 03:46:14.000000000","message":"The disabled_reason might be more clear here as this is mainly for logging reason when disable a service. \n\nNova is also using this as the parameter: https://github.com/openstack/nova/blob/master/nova/api/openstack/compute/contrib/services.py#L180","commit_id":"747cd54e7f3b98976416df7e66317d88572befe3"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"a172e3d425fb07d12eb6945b529232a85873cc4f","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            disabled \u003d False"},{"line_number":138,"context_line":"            if ext_loaded:"},{"line_number":139,"context_line":"                status_detail[\u0027disabled_reason\u0027] \u003d None"},{"line_number":140,"context_line":"        elif (id \u003d\u003d \"disable\" or"},{"line_number":141,"context_line":"                (id \u003d\u003d \"disable-log-reason\" and ext_loaded)):"},{"line_number":142,"context_line":"            disabled \u003d True"},{"line_number":143,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUX%2F%2FG5U%3D","line":140,"updated":"2014-02-17 07:20:57.000000000","message":"There shouldn\u0027t be a problem with taking the optional reason in the /v2/tenant/os-services/disable request. Would avoid the user having to do an extra request.","commit_id":"747cd54e7f3b98976416df7e66317d88572befe3"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"c2caffb40bc468ae60efdc31bcd7113f8ce4f9a6","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            disabled \u003d False"},{"line_number":138,"context_line":"            if ext_loaded:"},{"line_number":139,"context_line":"                status_detail[\u0027disabled_reason\u0027] \u003d None"},{"line_number":140,"context_line":"        elif (id \u003d\u003d \"disable\" or"},{"line_number":141,"context_line":"                (id \u003d\u003d \"disable-log-reason\" and ext_loaded)):"},{"line_number":142,"context_line":"            disabled \u003d True"},{"line_number":143,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUX%2F%2BTHA%3D","line":140,"in_reply_to":"AAAAUX%2F%2FG5U%3D","updated":"2014-02-22 03:46:14.000000000","message":"Yes, if using /v2/tenant/os-services/disable, it meant there is no disabled reason; if using /v2/tenant/os-services/disable-log-reason, it meant there is a disabled reason.","commit_id":"747cd54e7f3b98976416df7e66317d88572befe3"}],"cinder/tests/api/contrib/test_services.py":[{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"a172e3d425fb07d12eb6945b529232a85873cc4f","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                     \u0027zone\u0027: \u0027cinder\u0027,"},{"line_number":171,"context_line":"                     \u0027status\u0027: \u0027disabled\u0027, \u0027state\u0027: \u0027down\u0027,"},{"line_number":172,"context_line":"                     \u0027updated_at\u0027: datetime(2012, 9, 18, 8, 3, 38)}]}"},{"line_number":173,"context_line":"        self.assertEqual(res_dict, response)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def test_services_detail(self):"},{"line_number":176,"context_line":"        self.ext_mgr.extensions[\u0027os-extended-services\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUX%2F%2FF9w%3D","line":173,"updated":"2014-02-17 07:20:57.000000000","message":"Please add negative tests. No disable reason given, etc.","commit_id":"747cd54e7f3b98976416df7e66317d88572befe3"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"c2caffb40bc468ae60efdc31bcd7113f8ce4f9a6","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                     \u0027zone\u0027: \u0027cinder\u0027,"},{"line_number":171,"context_line":"                     \u0027status\u0027: \u0027disabled\u0027, \u0027state\u0027: \u0027down\u0027,"},{"line_number":172,"context_line":"                     \u0027updated_at\u0027: datetime(2012, 9, 18, 8, 3, 38)}]}"},{"line_number":173,"context_line":"        self.assertEqual(res_dict, response)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def test_services_detail(self):"},{"line_number":176,"context_line":"        self.ext_mgr.extensions[\u0027os-extended-services\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUX%2F%2BTGU%3D","line":173,"in_reply_to":"AAAAUX%2F%2FF9w%3D","updated":"2014-02-22 03:46:14.000000000","message":"Done","commit_id":"747cd54e7f3b98976416df7e66317d88572befe3"}],"cinder/utils.py":[{"author":{"_account_id":8574,"name":"Qin Zhao","username":"zhaoqin","inactive":true},"change_message_id":"aecd2506c2f0340efbda160549e8c9b814d07206","unresolved":false,"context_lines":[{"line_number":841,"context_line":"    :param name: the name of the string"},{"line_number":842,"context_line":"    :param min_length: the min_length of the string"},{"line_number":843,"context_line":"    :param max_length: the max_length of the string"},{"line_number":844,"context_line":"    \"\"\""},{"line_number":845,"context_line":"    if not isinstance(value, six.string_types):"},{"line_number":846,"context_line":"        msg \u003d _(\"%s is not a string or unicode\") % name"},{"line_number":847,"context_line":"        raise exception.InvalidInput(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9KqQ%3D","line":844,"updated":"2013-12-16 03:30:46.000000000","message":"I am not very clear why we must have the 2nd parameter, \u0027name\u0027. Does it has any other benefit, besides making the message a little more readable?","commit_id":"97bd20d167ea324cf683c98b6f1aadbb0b0deea9"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"d75cc92bcf491a779a637baca4585e11ea9ffc65","unresolved":false,"context_lines":[{"line_number":841,"context_line":"    :param name: the name of the string"},{"line_number":842,"context_line":"    :param min_length: the min_length of the string"},{"line_number":843,"context_line":"    :param max_length: the max_length of the string"},{"line_number":844,"context_line":"    \"\"\""},{"line_number":845,"context_line":"    if not isinstance(value, six.string_types):"},{"line_number":846,"context_line":"        msg \u003d _(\"%s is not a string or unicode\") % name"},{"line_number":847,"context_line":"        raise exception.InvalidInput(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9Kcs%3D","line":844,"in_reply_to":"AAAATn%2F9KqQ%3D","updated":"2013-12-16 05:19:18.000000000","message":"value is used to give a summary of the value, this function was get from nova.\n\nhttps://github.com/openstack/nova/blob/master/nova/utils.py#L945","commit_id":"97bd20d167ea324cf683c98b6f1aadbb0b0deea9"},{"author":{"_account_id":8574,"name":"Qin Zhao","username":"zhaoqin","inactive":true},"change_message_id":"aecd2506c2f0340efbda160549e8c9b814d07206","unresolved":false,"context_lines":[{"line_number":846,"context_line":"        msg \u003d _(\"%s is not a string or unicode\") % name"},{"line_number":847,"context_line":"        raise exception.InvalidInput(message\u003dmsg)"},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"    if len(value) \u003c min_length:"},{"line_number":850,"context_line":"        msg \u003d _(\"%(name)s has a minimum character requirement of \""},{"line_number":851,"context_line":"                \"%(min_length)s.\") % {\u0027name\u0027: name, \u0027min_length\u0027: min_length}"},{"line_number":852,"context_line":"        raise exception.InvalidInput(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9Kpw%3D","line":849,"updated":"2013-12-16 03:30:46.000000000","message":"I feel the following two messages is not that useful, because it does not contain the incorrect value or string...","commit_id":"97bd20d167ea324cf683c98b6f1aadbb0b0deea9"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"d75cc92bcf491a779a637baca4585e11ea9ffc65","unresolved":false,"context_lines":[{"line_number":846,"context_line":"        msg \u003d _(\"%s is not a string or unicode\") % name"},{"line_number":847,"context_line":"        raise exception.InvalidInput(message\u003dmsg)"},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"    if len(value) \u003c min_length:"},{"line_number":850,"context_line":"        msg \u003d _(\"%(name)s has a minimum character requirement of \""},{"line_number":851,"context_line":"                \"%(min_length)s.\") % {\u0027name\u0027: name, \u0027min_length\u0027: min_length}"},{"line_number":852,"context_line":"        raise exception.InvalidInput(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9Kco%3D","line":849,"in_reply_to":"AAAATn%2F9Kpw%3D","updated":"2013-12-16 05:19:18.000000000","message":"sometimes the value might be empty as the min value can be 0, so I only print the summary of the value here.","commit_id":"97bd20d167ea324cf683c98b6f1aadbb0b0deea9"}]}
