)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"706405f8d95c43adf6044c771ce2acfe486f93f4","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implement a basic REST alarm notification"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change add schemes http:// and https:// to the alarm notifier."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"The URL is called as a POST request."},{"line_number":12,"context_line":"The body of request contains a json dictionnary with alarm state and the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAP3%2F%2Flbk%3D","line":9,"updated":"2013-07-16 08:30:41.000000000","message":"adds","commit_id":"8cf29f9f056b3654ee9a359209bfb20079c73f8d"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"3eed7a68c9f0da5aef7eaa8d9fef799a8d3a04e8","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implement a basic REST alarm notification"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change add schemes http:// and https:// to the alarm notifier."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"The URL is called as a POST request."},{"line_number":12,"context_line":"The body of request contains a json dictionnary with alarm state and the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAP3%2F%2FlUM%3D","line":9,"in_reply_to":"AAAAP3%2F%2Flbk%3D","updated":"2013-07-16 09:30:45.000000000","message":"Done","commit_id":"8cf29f9f056b3654ee9a359209bfb20079c73f8d"}],"ceilometer/alarm/notifier/rest.py":[{"author":{"_account_id":7891,"name":"Anthony Dodd","email":"Dodd.AnthonyJosiah@gmail.com","username":"TheDodd"},"change_message_id":"080f80709f8f596089505a47f1dc0d86a86c143d","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class RestAlarmNotifier(notifier.AlarmNotifier):"},{"line_number":30,"context_line":"    \"Rest alarm notifier.\"\"\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def notify(self, action, alarm, state, reason):"},{"line_number":33,"context_line":"        LOG.info(\"Notifying alarm %s in state %s with action %s because %s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAP3%2F%2Fxgg%3D","line":30,"updated":"2013-07-11 17:02:06.000000000","message":"Missing two double-quotes to open the doc-string.","commit_id":"d2e6697e2c8e814bab13c1960f44fa9760b2e29f"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"0f319e56e1e64e2c5358061dca52d5eeb4397098","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class RestAlarmNotifier(notifier.AlarmNotifier):"},{"line_number":30,"context_line":"    \"Rest alarm notifier.\"\"\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def notify(self, action, alarm, state, reason):"},{"line_number":33,"context_line":"        LOG.info(\"Notifying alarm %s in state %s with action %s because %s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAP3%2F%2FxfU%3D","line":30,"in_reply_to":"AAAAP3%2F%2Fxgg%3D","updated":"2013-07-11 17:04:32.000000000","message":"Done","commit_id":"d2e6697e2c8e814bab13c1960f44fa9760b2e29f"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"76c385b63f2ec11ad1d8178d323458f7698af383","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    \"\"\"Rest alarm notifier.\"\"\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def notify(self, action, alarm, state, reason):"},{"line_number":33,"context_line":"        LOG.info(\"Notifying alarm %s in state %s with action %s because %s\","},{"line_number":34,"context_line":"                 alarm, state, action, reason)"},{"line_number":35,"context_line":"        eventlet.spawn_n(requests.post, action)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAP3%2F%2FxMk%3D","line":33,"updated":"2013-07-11 18:36:02.000000000","message":"use gettext()","commit_id":"819bae3e65e2594f38461a9aca8afd1419aa38a2"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"76c385b63f2ec11ad1d8178d323458f7698af383","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def notify(self, action, alarm, state, reason):"},{"line_number":33,"context_line":"        LOG.info(\"Notifying alarm %s in state %s with action %s because %s\","},{"line_number":34,"context_line":"                 alarm, state, action, reason)"},{"line_number":35,"context_line":"        eventlet.spawn_n(requests.post, action)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAP3%2F%2FxMY%3D","line":35,"updated":"2013-07-11 18:36:02.000000000","message":"Should the notification body also contain some data about the state/reason? It\u0027s not very useful otherwise.","commit_id":"819bae3e65e2594f38461a9aca8afd1419aa38a2"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b451899e236b7c20b06487fc77443c6e577f4c6e","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def notify(self, action, alarm, state, reason):"},{"line_number":33,"context_line":"        LOG.info(\"Notifying alarm %s in state %s with action %s because %s\","},{"line_number":34,"context_line":"                 alarm, state, action, reason)"},{"line_number":35,"context_line":"        eventlet.spawn_n(requests.post, action)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAP3%2F%2Flf8%3D","line":35,"in_reply_to":"AAAAP3%2F%2FoyM%3D","updated":"2013-07-16 08:13:23.000000000","message":"Done","commit_id":"819bae3e65e2594f38461a9aca8afd1419aa38a2"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"20f31bf0bec6d4a944663278025f733b8a0d497a","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def notify(self, action, alarm, state, reason):"},{"line_number":33,"context_line":"        LOG.info(\"Notifying alarm %s in state %s with action %s because %s\","},{"line_number":34,"context_line":"                 alarm, state, action, reason)"},{"line_number":35,"context_line":"        eventlet.spawn_n(requests.post, action)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAP3%2F%2FoyM%3D","line":35,"in_reply_to":"AAAAP3%2F%2FxMY%3D","updated":"2013-07-15 15:06:39.000000000","message":"Yes, I thought the state and reason string would be encoded as a JSON fragment in the POST entity-body.","commit_id":"819bae3e65e2594f38461a9aca8afd1419aa38a2"}],"setup.cfg":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"8cee84d28b85c110b769a2946fab0b8aee478f9f","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    log \u003d ceilometer.alarm.notifier.log:LogAlarmNotifier"},{"line_number":105,"context_line":"    test \u003d ceilometer.alarm.notifier.test:TestAlarmNotifier"},{"line_number":106,"context_line":"    http \u003d ceilometer.alarm.notifier.rest:RestAlarmNotifier"},{"line_number":107,"context_line":"    https \u003d ceilometer.alarm.notifier.rest:RestAlarmNotifier"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"paste.filter_factory \u003d"},{"line_number":110,"context_line":"    swift \u003d ceilometer.objectstore.swift_middleware:filter_factory"}],"source_content_type":"text/x-ttcn-cfg","patch_set":4,"id":"AAAAP3%2F%2FlVo%3D","line":107,"updated":"2013-07-16 09:03:52.000000000","message":"Just wondering about the https case here, would the requests.post action need further parameters in order to work in a realistic way?\n\ne.g. whether to run in \"insecure\" mode (i.e. confidentiality only, no service-side cert validation), what CA cert to trust etc.?","commit_id":"8cf29f9f056b3654ee9a359209bfb20079c73f8d"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"eb32c43f820efd95a68a25363ec4fe8fce1b185f","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    log \u003d ceilometer.alarm.notifier.log:LogAlarmNotifier"},{"line_number":105,"context_line":"    test \u003d ceilometer.alarm.notifier.test:TestAlarmNotifier"},{"line_number":106,"context_line":"    http \u003d ceilometer.alarm.notifier.rest:RestAlarmNotifier"},{"line_number":107,"context_line":"    https \u003d ceilometer.alarm.notifier.rest:RestAlarmNotifier"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"paste.filter_factory \u003d"},{"line_number":110,"context_line":"    swift \u003d ceilometer.objectstore.swift_middleware:filter_factory"}],"source_content_type":"text/x-ttcn-cfg","patch_set":4,"id":"AAAAP3%2F%2FlAQ%3D","line":107,"in_reply_to":"AAAAP3%2F%2FlJU%3D","updated":"2013-07-16 10:57:36.000000000","message":"For sure, if we use extra query param we must don\u0027t touch the query. The user must deal with that.\n\nThe extra query param must be very explicit to be sure anybody understands this is ceilometer-alarm stuffs.\n\nI think the global setting and the per-action setting doesn\u0027t cover the same use case.\n\nFor person that only want confidentiality on their private cloud (with self-signed cert), it is more easy to set a global setting to globaly disable ssl verification.\n\nBut for public cloud, it should be a per-user or per-alarm or per-action setting to allow API user to choice the behavior. And the default behavior must be \u0027safe for user\u0027.","commit_id":"8cf29f9f056b3654ee9a359209bfb20079c73f8d"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"620c2ef75eab68504cd0fc32be95ca5e94d95549","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    log \u003d ceilometer.alarm.notifier.log:LogAlarmNotifier"},{"line_number":105,"context_line":"    test \u003d ceilometer.alarm.notifier.test:TestAlarmNotifier"},{"line_number":106,"context_line":"    http \u003d ceilometer.alarm.notifier.rest:RestAlarmNotifier"},{"line_number":107,"context_line":"    https \u003d ceilometer.alarm.notifier.rest:RestAlarmNotifier"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"paste.filter_factory \u003d"},{"line_number":110,"context_line":"    swift \u003d ceilometer.objectstore.swift_middleware:filter_factory"}],"source_content_type":"text/x-ttcn-cfg","patch_set":4,"id":"AAAAP3%2F%2FlJU%3D","line":107,"in_reply_to":"AAAAP3%2F%2FlNg%3D","updated":"2013-07-16 10:07:38.000000000","message":"I\u0027m not sure I like the idea of including a query parameter in the action URL purely for ceilometer\u0027s benefit (as opposed to it having some meaning for the called service).\n\nWould this extra query param have to be stripped off before the action URL is POST\u0027d?\n\nIf so, wouldn\u0027t that impact on pre-signed URLs?\n\nMaybe the absolute simplest approach, i.e. a global config setting, would actually suffice here?","commit_id":"8cf29f9f056b3654ee9a359209bfb20079c73f8d"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"8e8375c8467862dd4c345fe510d4f151a65bd9c0","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    log \u003d ceilometer.alarm.notifier.log:LogAlarmNotifier"},{"line_number":105,"context_line":"    test \u003d ceilometer.alarm.notifier.test:TestAlarmNotifier"},{"line_number":106,"context_line":"    http \u003d ceilometer.alarm.notifier.rest:RestAlarmNotifier"},{"line_number":107,"context_line":"    https \u003d ceilometer.alarm.notifier.rest:RestAlarmNotifier"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"paste.filter_factory \u003d"},{"line_number":110,"context_line":"    swift \u003d ceilometer.objectstore.swift_middleware:filter_factory"}],"source_content_type":"text/x-ttcn-cfg","patch_set":4,"id":"AAAAP3%2F%2FlNg%3D","line":107,"in_reply_to":"AAAAP3%2F%2FlPY%3D","updated":"2013-07-16 09:40:15.000000000","message":"For the insecure mode, I see three ways:\n\n* Set a parameter in the callback url like this: https://insecure-hosts/?ceilometer-alarm-ssl-verify\u003dfalse (very simple)\n\n* Add new field in the alarm description (A bit ugly and not flexible stuff)\n\n* Adding global flags in the cielometer.conf (not a per alarm setting)\n\n\nI prefer the first one.","commit_id":"8cf29f9f056b3654ee9a359209bfb20079c73f8d"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"620c2ef75eab68504cd0fc32be95ca5e94d95549","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    log \u003d ceilometer.alarm.notifier.log:LogAlarmNotifier"},{"line_number":105,"context_line":"    test \u003d ceilometer.alarm.notifier.test:TestAlarmNotifier"},{"line_number":106,"context_line":"    http \u003d ceilometer.alarm.notifier.rest:RestAlarmNotifier"},{"line_number":107,"context_line":"    https \u003d ceilometer.alarm.notifier.rest:RestAlarmNotifier"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"paste.filter_factory \u003d"},{"line_number":110,"context_line":"    swift \u003d ceilometer.objectstore.swift_middleware:filter_factory"}],"source_content_type":"text/x-ttcn-cfg","patch_set":4,"id":"AAAAP3%2F%2FlJQ%3D","line":107,"in_reply_to":"AAAAP3%2F%2FlPY%3D","updated":"2013-07-16 10:07:38.000000000","message":"Yes, specifying the client certificate would be fine as a global setting in ceilometer.conf (i.e. not per-action).","commit_id":"8cf29f9f056b3654ee9a359209bfb20079c73f8d"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"3eed7a68c9f0da5aef7eaa8d9fef799a8d3a04e8","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    log \u003d ceilometer.alarm.notifier.log:LogAlarmNotifier"},{"line_number":105,"context_line":"    test \u003d ceilometer.alarm.notifier.test:TestAlarmNotifier"},{"line_number":106,"context_line":"    http \u003d ceilometer.alarm.notifier.rest:RestAlarmNotifier"},{"line_number":107,"context_line":"    https \u003d ceilometer.alarm.notifier.rest:RestAlarmNotifier"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"paste.filter_factory \u003d"},{"line_number":110,"context_line":"    swift \u003d ceilometer.objectstore.swift_middleware:filter_factory"}],"source_content_type":"text/x-ttcn-cfg","patch_set":4,"id":"AAAAP3%2F%2FlPY%3D","line":107,"in_reply_to":"AAAAP3%2F%2FlVo%3D","updated":"2013-07-16 09:30:45.000000000","message":"By default, python-requests does the server certificate verification like a browser does, but with the CA trusted by the system.\n\nI will add some configuration fields in ceilometer.conf to allow to set the client certificate, so the server can verify it if it want. What do you think ?","commit_id":"8cf29f9f056b3654ee9a359209bfb20079c73f8d"}],"tests/alarm/test_notifier.py":[{"author":{"_account_id":7409,"name":"Eric Pendergrass","email":"epende@gmail.com","username":"epende"},"change_message_id":"f85c92fba6790c2cf43626af4577d58d48b59d2e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":17,"context_line":"# under the License."},{"line_number":18,"context_line":"import eventlet"},{"line_number":19,"context_line":"import urlparse"},{"line_number":20,"context_line":"import mock"},{"line_number":21,"context_line":"import requests"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAP3%2F%2FxKA%3D","line":19,"updated":"2013-07-11 18:45:50.000000000","message":"Is this used?","commit_id":"819bae3e65e2594f38461a9aca8afd1419aa38a2"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"4bda94170b8cccec5fad26bccf4ed71967cacbea","unresolved":false,"context_lines":[{"line_number":16,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":17,"context_line":"# under the License."},{"line_number":18,"context_line":"import eventlet"},{"line_number":19,"context_line":"import urlparse"},{"line_number":20,"context_line":"import mock"},{"line_number":21,"context_line":"import requests"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAP3%2F%2FuSs%3D","line":19,"in_reply_to":"AAAAP3%2F%2FxKA%3D","updated":"2013-07-12 12:25:09.000000000","message":"Yes otherwise it would be catched by pep8","commit_id":"819bae3e65e2594f38461a9aca8afd1419aa38a2"}]}
