)]}'
{"etc/monasca/log-api-config.ini":[{"author":{"_account_id":7874,"name":"Venkat Sundaram","email":"tsv@hp.com","username":"tsv"},"change_message_id":"62c2dd91760a821be87f68dfb1b90627f8f1d94d","unresolved":false,"context_lines":[{"line_number":2,"context_line":"name \u003d monasca_log_api"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"[pipeline:main]"},{"line_number":5,"context_line":"pipeline \u003d healtcheck auth api"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[app:api]"},{"line_number":8,"context_line":"paste.app_factory \u003d monasca_log_api.server:launch"}],"source_content_type":"text/x-properties","patch_set":2,"id":"9a8ffd7b_119f4db5","line":5,"updated":"2015-11-25 17:57:35.000000000","message":"I see few issues with this flow:\n\n* healthcheck is called for every single API request\n* the healthcheck response mentions about kafka and the topic used in the failure message - will a client see this if there is no load balancer (in other words, will the client know about the log api implementation details ?) ?\n* w.r.t above point, is the load balancer expected to parse the health-check message and re-write the response to the client ?\n\nIn my past experience with Loadbalancers have seen that it works best when the healthcheck is done in a separate periodic interval (once every 10 seconds or more) not tied to the API request. \nWould it be better to have the healthcheck middleware in its own pipleline tied to a separate port or URL (/healthcheck) instead ? This way, the Loadbalancer would be able to easily separate healthcheck status from regular api status. \n\nThoughts ?","commit_id":"1f70a202b04c6000982e33df8f1b6c4ed13ff1c8"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"d5334c4bb7f5f06f9b89c78c445e5047b46f8800","unresolved":false,"context_lines":[{"line_number":2,"context_line":"name \u003d monasca_log_api"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"[pipeline:main]"},{"line_number":5,"context_line":"pipeline \u003d healtcheck auth api"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[app:api]"},{"line_number":8,"context_line":"paste.app_factory \u003d monasca_log_api.server:launch"}],"source_content_type":"text/x-properties","patch_set":2,"id":"9a8ffd7b_921016aa","line":5,"in_reply_to":"9a8ffd7b_119f4db5","updated":"2015-11-25 20:35:37.000000000","message":"If i wouldn\u0027t try to use only polite vocabulary, I would say something inappropriate. Of course there as is a load of good things you are telling me. I will rethink this change. If that\u0027s possible to accomplish with Gunicorn and it won\u0027t be any significant differences between this and Java implementation, I see no point why it couldn\u0027t be done the way you\u0027ve put it. However the point is that both Python and Java implementation must work similar in certain areas (i.e. ports, endpoint\u0027s URI and so on), in other words there shouldn\u0027t be any difference for outside world when it comes to use either implementation. \n\nAs for the current solution, I was that in documentation and similar changes that were using Oslo middleware thus were used in other OpenStack projects. Perhaps I misunderstood somethings, so it will be best to review similar problems","commit_id":"1f70a202b04c6000982e33df8f1b6c4ed13ff1c8"},{"author":{"_account_id":7874,"name":"Venkat Sundaram","email":"tsv@hp.com","username":"tsv"},"change_message_id":"672d70c7d880862d4bb7c9e9329d44c35cb34dc1","unresolved":false,"context_lines":[{"line_number":2,"context_line":"name \u003d monasca_log_api"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"[pipeline:main]"},{"line_number":5,"context_line":"pipeline \u003d healtcheck auth api"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[app:api]"},{"line_number":8,"context_line":"paste.app_factory \u003d monasca_log_api.server:launch"}],"source_content_type":"text/x-properties","patch_set":2,"id":"9a8ffd7b_e9dc0be6","line":5,"in_reply_to":"9a8ffd7b_921016aa","updated":"2015-11-26 05:00:08.000000000","message":"Ah, that comment was due to my lack of understanding of how the oslo.middleware\u0027s healthcheck module works!\n\nAfter reading the oslo.middleware code I do see that it does the healthcheck only if the request path is \"/healthcheck\" - so not for every request like I assumed.\n\nMy apologies for making the wrong assumption :(\n\nminor nit: healtcheck (missing \"h\")","commit_id":"1f70a202b04c6000982e33df8f1b6c4ed13ff1c8"},{"author":{"_account_id":7874,"name":"Venkat Sundaram","email":"tsv@hp.com","username":"tsv"},"change_message_id":"672d70c7d880862d4bb7c9e9329d44c35cb34dc1","unresolved":false,"context_lines":[{"line_number":10,"context_line":"[filter:auth]"},{"line_number":11,"context_line":"paste.filter_factory \u003d keystonemiddleware.auth_token:filter_factory"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[filter:healtcheck]"},{"line_number":14,"context_line":"paste.filter_factory \u003d oslo_middleware:Healthcheck.factory"},{"line_number":15,"context_line":"path \u003d /healthcheck"},{"line_number":16,"context_line":"backends \u003d kafka"}],"source_content_type":"text/x-properties","patch_set":2,"id":"9a8ffd7b_89677f24","line":13,"updated":"2015-11-26 05:00:08.000000000","message":"minor nit: healtcheck (missing \"h\")","commit_id":"1f70a202b04c6000982e33df8f1b6c4ed13ff1c8"}],"monasca_log_api/api/healthcheck_api.py":[{"author":{"_account_id":2419,"name":"Roland Hochmuth","email":"roland.hochmuth@hpe.com","username":"roland-hochmuth-s"},"change_message_id":"ef919a70d688734c9e5d1fc146a42e6abd79a58f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 FUJITSU LIMITED"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a5de9d1_27aa89d5","line":1,"range":{"start_line":1,"start_character":2,"end_line":1,"end_character":11},"updated":"2016-02-04 00:32:09.000000000","message":"Do  you want to modify for 2016?","commit_id":"7d9283eadb34d87802ad1b72f1602898332b76ac"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"42ea5fa8d99677698a8dfefd411b89dbb003e231","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 FUJITSU LIMITED"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a5ae5dd_63f6d1fa","line":1,"range":{"start_line":1,"start_character":2,"end_line":1,"end_character":11},"in_reply_to":"7a5de9d1_27aa89d5","updated":"2016-02-05 09:41:19.000000000","message":"Done","commit_id":"7d9283eadb34d87802ad1b72f1602898332b76ac"},{"author":{"_account_id":2419,"name":"Roland Hochmuth","email":"roland.hochmuth@hpe.com","username":"roland-hochmuth-s"},"change_message_id":"ef919a70d688734c9e5d1fc146a42e6abd79a58f","unresolved":false,"context_lines":[{"line_number":23,"context_line":"                                           [\u0027status\u0027, \u0027details\u0027])"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# TODO(feature) monasca-common candidate"},{"line_number":27,"context_line":"class HealthChecksApi(object):"},{"line_number":28,"context_line":"    \"\"\"HealthChecks Api"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7a5de9d1_c7961594","line":26,"range":{"start_line":26,"start_character":2,"end_line":26,"end_character":6},"updated":"2016-02-04 00:32:09.000000000","message":"I\u0027m assuming the TODO commend is for possibly moving this code into monasca-common as it could be useful for both the monasca-api and monasca-log-api and monasca-events-api.","commit_id":"7d9283eadb34d87802ad1b72f1602898332b76ac"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"42ea5fa8d99677698a8dfefd411b89dbb003e231","unresolved":false,"context_lines":[{"line_number":23,"context_line":"                                           [\u0027status\u0027, \u0027details\u0027])"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# TODO(feature) monasca-common candidate"},{"line_number":27,"context_line":"class HealthChecksApi(object):"},{"line_number":28,"context_line":"    \"\"\"HealthChecks Api"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"5a5ae5dd_635b31f7","line":26,"range":{"start_line":26,"start_character":2,"end_line":26,"end_character":6},"in_reply_to":"7a5de9d1_c7961594","updated":"2016-02-05 09:41:19.000000000","message":"I could but I don\u0027t know how it\u0027s gonna be if we move to Tornado, and it looks like we are going to, so having this code in common would be very hard to get.","commit_id":"7d9283eadb34d87802ad1b72f1602898332b76ac"}],"monasca_log_api/healthcheck/kafka_check.py":[{"author":{"_account_id":7874,"name":"Venkat Sundaram","email":"tsv@hp.com","username":"tsv"},"change_message_id":"62c2dd91760a821be87f68dfb1b90627f8f1d94d","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        kafka_topic \u003d self.conf.get(\u0027kafka_topic\u0027)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        if not (kafka_url and kafka_topic):"},{"line_number":73,"context_line":"            raise KafkaHealthCheckConfigurationError((\u0027kafka_url, kafka_topic \u0027"},{"line_number":74,"context_line":"                                                      \u0027must be set\u0027))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        cfg \u003d {\u0027url\u0027: kafka_url, \u0027topic\u0027: kafka_topic}"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a8ffd7b_78debe6e","line":73,"updated":"2015-11-25 17:57:35.000000000","message":"Who will handle this exception ?","commit_id":"1f70a202b04c6000982e33df8f1b6c4ed13ff1c8"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"ca96f29c089186f7144604c30f069ae7873ff5e0","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        kafka_topic \u003d self.conf.get(\u0027kafka_topic\u0027)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        if not (kafka_url and kafka_topic):"},{"line_number":73,"context_line":"            raise KafkaHealthCheckConfigurationError((\u0027kafka_url, kafka_topic \u0027"},{"line_number":74,"context_line":"                                                      \u0027must be set\u0027))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        cfg \u003d {\u0027url\u0027: kafka_url, \u0027topic\u0027: kafka_topic}"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a8ffd7b_7db1c3e0","line":73,"in_reply_to":"9a8ffd7b_78debe6e","updated":"2015-11-25 20:57:29.000000000","message":"Actually nobody, that means to prevent server from starting. My idea was that if someone wishes to enable this certain healtcheck (obviously one may desire to configure log api without) there are certain configuration settings that if not provided will not allow healtcheck to work at all thus why even bother to start server with a healthcheck that has no chance to return something useful.","commit_id":"1f70a202b04c6000982e33df8f1b6c4ed13ff1c8"},{"author":{"_account_id":7874,"name":"Venkat Sundaram","email":"tsv@hp.com","username":"tsv"},"change_message_id":"672d70c7d880862d4bb7c9e9329d44c35cb34dc1","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        kafka_topic \u003d self.conf.get(\u0027kafka_topic\u0027)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        if not (kafka_url and kafka_topic):"},{"line_number":73,"context_line":"            raise KafkaHealthCheckConfigurationError((\u0027kafka_url, kafka_topic \u0027"},{"line_number":74,"context_line":"                                                      \u0027must be set\u0027))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        cfg \u003d {\u0027url\u0027: kafka_url, \u0027topic\u0027: kafka_topic}"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a8ffd7b_c99b4771","line":73,"in_reply_to":"9a8ffd7b_7db1c3e0","updated":"2015-11-26 05:00:08.000000000","message":"Thanks for the detailed explanation. Makes sense.","commit_id":"1f70a202b04c6000982e33df8f1b6c4ed13ff1c8"},{"author":{"_account_id":7874,"name":"Venkat Sundaram","email":"tsv@hp.com","username":"tsv"},"change_message_id":"672d70c7d880862d4bb7c9e9329d44c35cb34dc1","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        result \u003d None"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        for_topic \u003d kafka_client.get_partition_ids_for_topic(topic)"},{"line_number":96,"context_line":"        if not for_topic:"},{"line_number":97,"context_line":"            result \u003d pluginbase.HealthcheckResult("},{"line_number":98,"context_line":"                available\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a8ffd7b_e46992bf","line":95,"updated":"2015-11-26 05:00:08.000000000","message":"while checking this in my dev box, got the following error:\n\nAttributeError: \u0027KafkaClient\u0027 object has no attribute \u0027get_partition_ids_for_topic\u0027\n\nUpon troubleshooting figured that my monasca-common master (including 0.0.2) still has the following in the requirements.txt file:\n\nkafka-python\u003e\u003d0.9.1,\u003c0.9.3\n\nHowever, looks like the method \"get_partition_ids_for_topic\" was added only in 0.9.3. Is there a monasca-common patch that fixes that already ?\n(Ironically, the patch in the dependency list of this patch has the correct version of kafka-python removed in favor of monasca-common 0.0.2)","commit_id":"1f70a202b04c6000982e33df8f1b6c4ed13ff1c8"},{"author":{"_account_id":2419,"name":"Roland Hochmuth","email":"roland.hochmuth@hpe.com","username":"roland-hochmuth-s"},"change_message_id":"3a204bf88901a5b6d60f458728c82081168564f2","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        url \u003d CONF.kafka_healthcheck.kafka_url"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        try:"},{"line_number":66,"context_line":"            kafka_client \u003d client.KafkaClient(hosts\u003durl)"},{"line_number":67,"context_line":"        except client.KafkaUnavailableError as ex:"},{"line_number":68,"context_line":"            LOG.error(repr(ex))"},{"line_number":69,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba63e191_5c78928f","line":66,"range":{"start_line":66,"start_character":12,"end_line":66,"end_character":24},"updated":"2016-01-19 20:33:17.000000000","message":"Just wondering if it would be better to create the kafka_client in the constructor.","commit_id":"77c55da173328a705be4c43e4a42a79a858a153a"},{"author":{"_account_id":16170,"name":"Michal Zielonka","email":"michal.zielonka@ts.fujitsu.com","username":"michal.zielonka"},"change_message_id":"b7b92f3bcb65d17a125892f11f86f76f78a55275","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        url \u003d CONF.kafka_healthcheck.kafka_url"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        try:"},{"line_number":66,"context_line":"            kafka_client \u003d client.KafkaClient(hosts\u003durl)"},{"line_number":67,"context_line":"        except client.KafkaUnavailableError as ex:"},{"line_number":68,"context_line":"            LOG.error(repr(ex))"},{"line_number":69,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba63e191_ec2bbc92","line":66,"range":{"start_line":66,"start_character":12,"end_line":66,"end_character":24},"in_reply_to":"ba63e191_5c78928f","updated":"2016-01-20 09:39:55.000000000","message":"I think that now is good, because healthcheck should be so simple as possible. And now if we have problem with kafka, healthcheck will run ok, and after removing problem healthcheck also will connect with kafka without special effort.","commit_id":"77c55da173328a705be4c43e4a42a79a858a153a"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"8a50a692821d2f6b0e507c736ea3e32212117718","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        url \u003d CONF.kafka_healthcheck.kafka_url"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        try:"},{"line_number":66,"context_line":"            kafka_client \u003d client.KafkaClient(hosts\u003durl)"},{"line_number":67,"context_line":"        except client.KafkaUnavailableError as ex:"},{"line_number":68,"context_line":"            LOG.error(repr(ex))"},{"line_number":69,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba63e191_e9a96e7c","line":66,"range":{"start_line":66,"start_character":12,"end_line":66,"end_character":24},"in_reply_to":"ba63e191_5c78928f","updated":"2016-01-20 09:37:49.000000000","message":"Rather not, the main idea I have is that healthcheck creates\na connection to kafka, if such cannot be obtained, therefore kafka is down and API is not healthy. I don\u0027t want to do this in constructor because a connection would have to be maintained even if no requests would reach /healthcheck.\n\nAlso, this approach (presented here), is much cleaner because when it comes to code. Otherwise, everything could went down right when healthcheck is created (because connection to brokers couldn\u0027t have been established). There is a chance that actually kafka is down, but on the other hand, kafka could have been down actually in that precise moment and few seconds later it is available, but API wont know it because it failed to start because of that error. We could add\n\n try...except\n\nthere in case connection fails, but what would be the point of trying to connect to kafka if we can\u0027t actually return what we\u0027ve found out to the potential client that would call /healthcheck.","commit_id":"77c55da173328a705be4c43e4a42a79a858a153a"},{"author":{"_account_id":2419,"name":"Roland Hochmuth","email":"roland.hochmuth@hpe.com","username":"roland-hochmuth-s"},"change_message_id":"3a204bf88901a5b6d60f458728c82081168564f2","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            LOG.error(repr(ex))"},{"line_number":69,"context_line":"            return False"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        result \u003d True"},{"line_number":72,"context_line":"        for t in topics:"},{"line_number":73,"context_line":"            # kafka client loads metadata for topics as fast"},{"line_number":74,"context_line":"            # as possible (happens in ini), therefore this"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba63e191_e6fe9737","line":71,"range":{"start_line":71,"start_character":8,"end_line":71,"end_character":14},"updated":"2016-01-19 20:33:17.000000000","message":"Do you want to add a single try/finally bock around this block and the next one.\n\nIf a problem is detected when iteration over all topics, the Kafka connection is not closed.","commit_id":"77c55da173328a705be4c43e4a42a79a858a153a"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"8a50a692821d2f6b0e507c736ea3e32212117718","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            LOG.error(repr(ex))"},{"line_number":69,"context_line":"            return False"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        result \u003d True"},{"line_number":72,"context_line":"        for t in topics:"},{"line_number":73,"context_line":"            # kafka client loads metadata for topics as fast"},{"line_number":74,"context_line":"            # as possible (happens in ini), therefore this"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba63e191_2cad5431","line":71,"range":{"start_line":71,"start_character":8,"end_line":71,"end_character":14},"in_reply_to":"ba63e191_e6fe9737","updated":"2016-01-20 09:37:49.000000000","message":"topic_partitions\n\nIt is simple dictionary filled with metadata for topics available in brokers. All I am doing, and assuming connection is successful, is checking if client loaded topic I wanted to verify into \n\n topic_partitions\n\nOperation does not involve any hidden code, it just checking if given key is a part of dictionary.","commit_id":"77c55da173328a705be4c43e4a42a79a858a153a"},{"author":{"_account_id":2419,"name":"Roland Hochmuth","email":"roland.hochmuth@hpe.com","username":"roland-hochmuth-s"},"change_message_id":"ef919a70d688734c9e5d1fc146a42e6abd79a58f","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        try:"},{"line_number":94,"context_line":"            kafka_client.close()"},{"line_number":95,"context_line":"        except Exception:"},{"line_number":96,"context_line":"            pass  # this should not affect healthcheck"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a5de9d1_47d0e553","line":96,"range":{"start_line":96,"start_character":12,"end_line":96,"end_character":16},"updated":"2016-02-04 00:32:09.000000000","message":"Wondering if you want to log at this point. Since you are catching an exception when you are trying to disconnect, it is probably not expected behaviour and might indicate some other problem.","commit_id":"7d9283eadb34d87802ad1b72f1602898332b76ac"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"42ea5fa8d99677698a8dfefd411b89dbb003e231","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        try:"},{"line_number":94,"context_line":"            kafka_client.close()"},{"line_number":95,"context_line":"        except Exception:"},{"line_number":96,"context_line":"            pass  # this should not affect healthcheck"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a5ae5dd_c31ea5ba","line":96,"range":{"start_line":96,"start_character":12,"end_line":96,"end_character":16},"in_reply_to":"7a5de9d1_47d0e553","updated":"2016-02-05 09:41:19.000000000","message":"I did some more investigation at here. Basically one possible error that could come up is being swallowed (check KafkaConnection#close). Other issues might come from closing socket. However connection itself is already terminated at this point. But I will log it just to keep track on any possible issues.","commit_id":"7d9283eadb34d87802ad1b72f1602898332b76ac"},{"author":{"_account_id":20033,"name":"Artur Basiak","email":"artur.basiak@ts.fujitsu.com","username":"abasiak"},"change_message_id":"d455d6a94c58cb0ca5b4a90c86df7ebdd86f1257","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    cfg.StrOpt(\u0027kafka_url\u0027,"},{"line_number":24,"context_line":"               required\u003dTrue,"},{"line_number":25,"context_line":"               help\u003d\u0027Url to kafka server\u0027),"},{"line_number":26,"context_line":"    cfg.MultiStrOpt(\u0027kafka_topics\u0027,"},{"line_number":27,"context_line":"                    required\u003dTrue,"},{"line_number":28,"context_line":"                    default\u003d[\u0027logs\u0027],"},{"line_number":29,"context_line":"                    help\u003d\u0027Verify existence of configured topics\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bae84128_1b73b04e","line":26,"range":{"start_line":26,"start_character":8,"end_line":26,"end_character":19},"updated":"2016-02-22 11:22:07.000000000","message":"This should be ListOpt for multiple possible entries.","commit_id":"4a2ecb779193e875f97c7daa68b8e45eae0e25bb"}]}
