)]}'
{"specs/client-manager-refactor.rst":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"09878dfaa58757a54cae55ff10c039ff90d2f86c","unresolved":false,"context_lines":[{"line_number":14,"context_line":"https://blueprints.launchpad.net/tempest/+spec/client-manager-refactor"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"The current client managers instantiate all possible clients at *__init__* time"},{"line_number":17,"context_line":"and expose the clients via class attributes. Client managers shall be "},{"line_number":18,"context_line":"refactored to import and instantiate clients on demand, and serve them via"},{"line_number":19,"context_line":"*get_** methods. "},{"line_number":20,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"7adec928_7ad97282","line":17,"updated":"2014-07-09 13:40:08.000000000","message":"Whitespace","commit_id":"e3d8f38a9e53739272b5f63ff94965c5cf0cc5f4"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"09878dfaa58757a54cae55ff10c039ff90d2f86c","unresolved":false,"context_lines":[{"line_number":16,"context_line":"The current client managers instantiate all possible clients at *__init__* time"},{"line_number":17,"context_line":"and expose the clients via class attributes. Client managers shall be "},{"line_number":18,"context_line":"refactored to import and instantiate clients on demand, and serve them via"},{"line_number":19,"context_line":"*get_** methods. "},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Problem description"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7adec928_9ae8fe11","line":19,"updated":"2014-07-09 13:40:08.000000000","message":"Whitespace","commit_id":"e3d8f38a9e53739272b5f63ff94965c5cf0cc5f4"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"09878dfaa58757a54cae55ff10c039ff90d2f86c","unresolved":false,"context_lines":[{"line_number":75,"context_line":"- client manager classes are instantiated by credentials only. A client"},{"line_number":76,"context_line":"  manager is a client factory that given a set of credentials can produce"},{"line_number":77,"context_line":"  a variety of clients consuming the credentials"},{"line_number":78,"context_line":"- clients are only instantiated on demand"},{"line_number":79,"context_line":"- the manager internally caches instances of clients and serve them from"},{"line_number":80,"context_line":"  cache where applicable"},{"line_number":81,"context_line":"- clients are server via *get_** methods, which support client specific"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_2053836d","line":78,"updated":"2014-07-09 13:40:08.000000000","message":"This is a big plus, because we constantly have bugs with CONF skips around this point.","commit_id":"e3d8f38a9e53739272b5f63ff94965c5cf0cc5f4"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"43d42cddc3c26480e9fe33b7d82121115d63763b","unresolved":false,"context_lines":[{"line_number":75,"context_line":"- client manager classes are instantiated by credentials only. A client"},{"line_number":76,"context_line":"  manager is a client factory that given a set of credentials can produce"},{"line_number":77,"context_line":"  a variety of clients consuming the credentials"},{"line_number":78,"context_line":"- clients are only instantiated on demand"},{"line_number":79,"context_line":"- the manager internally caches instances of clients and serve them from"},{"line_number":80,"context_line":"  cache where applicable"},{"line_number":81,"context_line":"- clients are server via *get_** methods, which support client specific"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_5ca7ffa6","line":78,"in_reply_to":"baada198_2053836d","updated":"2014-07-13 19:12:14.000000000","message":"Indeed :)","commit_id":"e3d8f38a9e53739272b5f63ff94965c5cf0cc5f4"},{"author":{"_account_id":5174,"name":"Mauro Sergio Martins Rodrigues","email":"maurosr@linux.vnet.ibm.com","username":"maurosr"},"change_message_id":"9d9340203caba297dbe87e108693efa7e3c19d10","unresolved":false,"context_lines":[{"line_number":78,"context_line":"- clients are only instantiated on demand"},{"line_number":79,"context_line":"- the manager internally caches instances of clients and serve them from"},{"line_number":80,"context_line":"  cache where applicable"},{"line_number":81,"context_line":"- clients are server via *get_** methods, which support client specific"},{"line_number":82,"context_line":"  parameters, such as API version"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"Example of the refactored *__init__* for *clients.Manager* class:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_3509fc2c","line":81,"updated":"2014-07-09 15:38:43.000000000","message":"typo server/served","commit_id":"e3d8f38a9e53739272b5f63ff94965c5cf0cc5f4"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"43d42cddc3c26480e9fe33b7d82121115d63763b","unresolved":false,"context_lines":[{"line_number":78,"context_line":"- clients are only instantiated on demand"},{"line_number":79,"context_line":"- the manager internally caches instances of clients and serve them from"},{"line_number":80,"context_line":"  cache where applicable"},{"line_number":81,"context_line":"- clients are server via *get_** methods, which support client specific"},{"line_number":82,"context_line":"  parameters, such as API version"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"Example of the refactored *__init__* for *clients.Manager* class:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_7cb763d8","line":81,"in_reply_to":"baada198_3509fc2c","updated":"2014-07-13 19:12:14.000000000","message":"Done","commit_id":"e3d8f38a9e53739272b5f63ff94965c5cf0cc5f4"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"2413c7d077dded597cd91b5c8d9d2bd75d3b538d","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    # In a scenario test or test base class"},{"line_number":113,"context_line":"    image_client \u003d os.get_client(\"image\", (1,0))"},{"line_number":114,"context_line":"    "},{"line_number":115,"context_line":".."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"Additional helpers - client getters:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1ae5cdf2_7fb895e5","line":114,"updated":"2014-06-02 12:02:01.000000000","message":"So from an consuming point of view, what if we did some magic attrs to make the following work?\n\n keypair_client \u003d os.keypair\n keypair_client_xml \u003d os.xml.keypair\n keypair_v3 \u003d os.compute_v3.keypair","commit_id":"e3d8f38a9e53739272b5f63ff94965c5cf0cc5f4"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"09878dfaa58757a54cae55ff10c039ff90d2f86c","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    # In a scenario test or test base class"},{"line_number":113,"context_line":"    image_client \u003d os.get_client(\"image\", (1,0))"},{"line_number":114,"context_line":"    "},{"line_number":115,"context_line":".."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"Additional helpers - client getters:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7adec928_b65895fb","line":114,"updated":"2014-07-09 13:40:08.000000000","message":"Yeah I think doing it with gettattr makes a lot of sense. We can still call get_client underneath, but also add getattr support. I think that\u0027ll make it a bit easier to read.\n\nWhitespace","commit_id":"e3d8f38a9e53739272b5f63ff94965c5cf0cc5f4"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"43d42cddc3c26480e9fe33b7d82121115d63763b","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    # In a scenario test or test base class"},{"line_number":113,"context_line":"    image_client \u003d os.get_client(\"image\", (1,0))"},{"line_number":114,"context_line":"    "},{"line_number":115,"context_line":".."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"Additional helpers - client getters:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_dcb22fe4","line":114,"in_reply_to":"1ae5cdf2_7fb895e5","updated":"2014-07-13 19:12:14.000000000","message":"++\n\nWe will need this to avoid a mass re-write of all base classes and tests.\n\nThere will be a number of names which are not aligned with the naming convention we set, but ultimately it will reduce the impact on code and it will be transparent for people used to the current style of access to clients.\n\nThere are two ways however:\n- define a __getattr__ in the client manager and leave the base classes and tests untouched\n- define a __getattr__ in the test root class which matches ^[^[:blank:]]*_client$ and calls the get_client on the client manager\n\nI would go for the latter, which would help remove a lot of clutter from the test base classes.\nWe just need to make sure we have an API version info in the test class, or in the test.","commit_id":"e3d8f38a9e53739272b5f63ff94965c5cf0cc5f4"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"38218ba0f1b262f9a18fe3c744c7557b3e24040d","unresolved":false,"context_lines":[{"line_number":25,"context_line":"and expose the clients via class attributes."},{"line_number":26,"context_line":"The problem with this is that regardless of tempest configuration about"},{"line_number":27,"context_line":"available services, extensions and API versions, all clients are instantiated,"},{"line_number":28,"context_line":"which has been a source of issues in the past. If I tell tempest that a service"},{"line_number":29,"context_line":"is not available, I should be able to ignore all the related configuration"},{"line_number":30,"context_line":"settings as well."},{"line_number":31,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"baada198_08441e9d","line":28,"updated":"2014-08-05 05:26:08.000000000","message":"Can you put one or two examples of the \u0027issues\u0027 in this spec?","commit_id":"1ba1b7a317f064ebed35286033b177a1ee31815e"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"a114b62c4a26445100ca55045034f161841f4789","unresolved":false,"context_lines":[{"line_number":79,"context_line":"  manager is a client factory that given a set of credentials can produce"},{"line_number":80,"context_line":"  a variety of clients consuming the credentials"},{"line_number":81,"context_line":"- clients are only instantiated on demand"},{"line_number":82,"context_line":"- the manager internally caches instances of clients and serve them from"},{"line_number":83,"context_line":"  cache where applicable"},{"line_number":84,"context_line":"- clients are served via *get_** methods, which support client specific"},{"line_number":85,"context_line":"  parameters, such as API version"}],"source_content_type":"text/x-rst","patch_set":4,"id":"baada198_0314bf9d","line":82,"updated":"2014-07-30 09:09:48.000000000","message":"So you want the clients to become \"singletons\"?","commit_id":"1ba1b7a317f064ebed35286033b177a1ee31815e"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"47d0139485b69d98b9bcb6e89402d7be47968803","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        \"\"\""},{"line_number":105,"context_line":"        Returns a client from cache or instantiates one"},{"line_number":106,"context_line":"        \"\"\""},{"line_number":107,"context_line":"        client \u003d self._from_cache(service, api_version, api, type)"},{"line_number":108,"context_line":"        if client is None:"},{"line_number":109,"context_line":"            client \u003d self._get_client(service, api_version, api, type)"},{"line_number":110,"context_line":"        return client"}],"source_content_type":"text/x-rst","patch_set":4,"id":"baada198_ead19af8","line":107,"updated":"2014-07-29 02:27:52.000000000","message":"That\u0027s really cool by sharing the same client instance among consumers of same type of clients.\nSo when this cache gets cleared and populated(I think populate on very first request)?\n(with scope of testr? where it does not need to care about current number of consumers)","commit_id":"1ba1b7a317f064ebed35286033b177a1ee31815e"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"38218ba0f1b262f9a18fe3c744c7557b3e24040d","unresolved":false,"context_lines":[{"line_number":162,"context_line":"----------"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"Target Milestone for completion:"},{"line_number":165,"context_line":"  Juno-2"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"Work Items"},{"line_number":168,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"baada198_880aee75","line":165,"updated":"2014-08-05 05:26:08.000000000","message":"I think this should be Juno-3 or just Juno :)","commit_id":"1ba1b7a317f064ebed35286033b177a1ee31815e"},{"author":{"_account_id":7227,"name":"Timur Nurlygayanov","email":"tnurlygayanov@mirantis.com","username":"tnurlygayanov"},"change_message_id":"876e0de6de93c73f84f4fd2ddae5949975521a39","unresolved":false,"context_lines":[{"line_number":162,"context_line":"----------"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"Target Milestone for completion:"},{"line_number":165,"context_line":"  Juno-2"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"Work Items"},{"line_number":168,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"9aa7fdbe_4b99e6c2","line":165,"in_reply_to":"baada198_880aee75","updated":"2014-10-27 21:02:38.000000000","message":"Probably, we can change it to Kilo? :)","commit_id":"1ba1b7a317f064ebed35286033b177a1ee31815e"}],"specs/tempest/client-manager-refactor.rst":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"615aad9675f894db3207dff3088c7e569d9d409b","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        :param group_params: A list of extra parameters expected by clients"},{"line_number":83,"context_line":"                             in this group"},{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":".."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa69d971_bbd9d585","line":85,"updated":"2016-01-07 16:18:21.000000000","message":"I\u0027m a bit unclear of the details here. So I get the lazy loading that makes sense. Not that the overhead we have from loading it all at once is that high. But the registration interface how does this work. How does the list of registered plugins get stored? I think this is the only piece missing from the spec. I guess just a little more detail on expected workflow. Like does the client registration happen during discovery, on demand, at the Manager init?","commit_id":"67c101eab3820162d014a37cd0e7b3de0f9f3acf"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"12992b56c36fbe31ec9bed160a268db496c57fd3","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        :param group_params: A list of extra parameters expected by clients"},{"line_number":83,"context_line":"                             in this group"},{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":".."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa69d971_4304317d","line":85,"in_reply_to":"fa69d971_bbd9d585","updated":"2016-01-08 08:53:18.000000000","message":"Done","commit_id":"67c101eab3820162d014a37cd0e7b3de0f9f3acf"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"d22076ad73d6f9f401bc9e21f06d3f0724019591","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        :param group_params: A list of extra parameters expected by clients"},{"line_number":83,"context_line":"                             in this group"},{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":".."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa69d971_83e549a9","line":85,"in_reply_to":"fa69d971_bbd9d585","updated":"2016-01-08 08:56:38.000000000","message":"In terms of lazing loading, it\u0027s not much about the overhead, rather the fact that clients depend on configuration items, which may not be defined when they are not going to be used. Also this adds protection against clients that try to do API calls at __init__ time.","commit_id":"67c101eab3820162d014a37cd0e7b3de0f9f3acf"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"25f29f3edf61a895543c7506f79ef10a67fe2d09","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"- migrate it to tempest-lib. This will help in turn the migration of credential"},{"line_number":26,"context_line":"  providers and service clients. And it will give people writing tempest"},{"line_number":27,"context_line":"  plug-in a home for their custom service clients"},{"line_number":28,"context_line":"- change it so that it is possible for plug-in developer to add their service"},{"line_number":29,"context_line":"  clients dynamically into the client manager, so we can have a consistent"},{"line_number":30,"context_line":"  way of accessing test clients from tests"}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_6f9f0a60","line":27,"range":{"start_line":27,"start_character":10,"end_line":27,"end_character":11},"updated":"2016-01-12 11:59:25.000000000","message":"s/a/at/ ?","commit_id":"378b6fbdd3a0a63fa49fc4816202a28a5c879aea"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"25f29f3edf61a895543c7506f79ef10a67fe2d09","unresolved":false,"context_lines":[{"line_number":29,"context_line":"  clients dynamically into the client manager, so we can have a consistent"},{"line_number":30,"context_line":"  way of accessing test clients from tests"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"The current client managers depends on CONF, and it\u0027s structure does not"},{"line_number":33,"context_line":"easily allow for runtime registration of extra clients."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"For instance, in *Manager* class:"}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_cf795631","line":32,"range":{"start_line":32,"start_character":19,"end_line":32,"end_character":27},"updated":"2016-01-12 11:59:25.000000000","message":"nit: s/managers/manager/","commit_id":"378b6fbdd3a0a63fa49fc4816202a28a5c879aea"},{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"cd1d9c6daa3cec9e2f32e09b7f820caef49c3f97","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            CONF.network.region or CONF.identity.region,"},{"line_number":43,"context_line":"            endpoint_type\u003dCONF.network.endpoint_type,"},{"line_number":44,"context_line":"            build_interval\u003dCONF.network.build_interval,"},{"line_number":45,"context_line":"            build_timeout\u003dCONF.network.build_timeout,"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":".."},{"line_number":48,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_2e734ab3","line":45,"updated":"2016-01-12 14:49:22.000000000","message":"Having any wait/retry mechanism for api call repeat built into the client is not good.","commit_id":"378b6fbdd3a0a63fa49fc4816202a28a5c879aea"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"6f3146b204d04dbab9ac12fce94a37d836f7d462","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            CONF.network.region or CONF.identity.region,"},{"line_number":43,"context_line":"            endpoint_type\u003dCONF.network.endpoint_type,"},{"line_number":44,"context_line":"            build_interval\u003dCONF.network.build_interval,"},{"line_number":45,"context_line":"            build_timeout\u003dCONF.network.build_timeout,"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":".."},{"line_number":48,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_b769b827","line":45,"in_reply_to":"da6ed579_2e734ab3","updated":"2016-01-12 23:05:42.000000000","message":"Indeed, that\u0027s how it is now, and not anything changed by this spec, but I expect we shall be able to drop those timeouts from the client parameters soon.","commit_id":"378b6fbdd3a0a63fa49fc4816202a28a5c879aea"},{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"cd1d9c6daa3cec9e2f32e09b7f820caef49c3f97","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        names within the client group."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        :param name: Name of the client group, e.g. \u0027orchestration\u0027"},{"line_number":90,"context_line":"        :param service_clients: A list with all service clients"},{"line_number":91,"context_line":"        :param description: A description of the group"},{"line_number":92,"context_line":"        :param group_params: A set of extra parameters expected by clients"},{"line_number":93,"context_line":"                             in this group"}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_1158ebf9","line":90,"updated":"2016-01-12 14:49:22.000000000","message":"The type of the items in the list ?\nWhere the client name comes from ?","commit_id":"378b6fbdd3a0a63fa49fc4816202a28a5c879aea"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"6f3146b204d04dbab9ac12fce94a37d836f7d462","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        names within the client group."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        :param name: Name of the client group, e.g. \u0027orchestration\u0027"},{"line_number":90,"context_line":"        :param service_clients: A list with all service clients"},{"line_number":91,"context_line":"        :param description: A description of the group"},{"line_number":92,"context_line":"        :param group_params: A set of extra parameters expected by clients"},{"line_number":93,"context_line":"                             in this group"}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_b773f8e6","line":90,"in_reply_to":"da6ed579_1158ebf9","updated":"2016-01-12 23:05:42.000000000","message":"It\u0027s a list of types. I hope this clarifies: https://review.openstack.org/#/c/260077/8/tempest/services/compute/__init__.py\n\nThe client name is inflection.underscore(client class name).\nThe attribute on client manager is \u003cgroup_name\u003e_\u003cclient_name\u003e, so the class name only has to be unique within a group.\n\nThat\u0027s actually not a valid assumption when considering volume and volumev2. So either I make them two groups (as I did in my patch later on this series), or I make one group and I allow for a custom name to be specified.","commit_id":"378b6fbdd3a0a63fa49fc4816202a28a5c879aea"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3cbd3799b8e29db1a5aeadf144a2443a36a8b7c6","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        names within the client group."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        :param name: Name of the client group, e.g. \u0027orchestration\u0027"},{"line_number":90,"context_line":"        :param service_clients: A list with all service clients"},{"line_number":91,"context_line":"        :param description: A description of the group"},{"line_number":92,"context_line":"        :param group_params: A set of extra parameters expected by clients"},{"line_number":93,"context_line":"                             in this group"}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_f49e38b7","line":90,"in_reply_to":"da6ed579_b773f8e6","updated":"2016-01-13 09:30:54.000000000","message":"preparing client name from service_clients list making very tight coupling with service clients class names. And same we need to have for clients in plugin.\n\nAnd how tests will get the clients obj with same naming convention?\n\n\nCan we have expected clients name from this or another list? if that make it simpler.","commit_id":"378b6fbdd3a0a63fa49fc4816202a28a5c879aea"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"4252e42bff56f6ce3529791f63890d5fa672163e","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        :param name: Name of the client group, e.g. \u0027orchestration\u0027"},{"line_number":90,"context_line":"        :param service_clients: A list with all service clients"},{"line_number":91,"context_line":"        :param description: A description of the group"},{"line_number":92,"context_line":"        :param group_params: A set of extra parameters expected by clients"},{"line_number":93,"context_line":"                             in this group"},{"line_number":94,"context_line":"        :param client_params: each is a set of client specific parameters,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_a8b065de","line":91,"updated":"2016-01-13 07:59:26.000000000","message":"do we really need this optional field? For what are we going to use it - logs?","commit_id":"378b6fbdd3a0a63fa49fc4816202a28a5c879aea"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"fde07e76979f4b15870e25f9f777d94366f727a9","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        :param name: Name of the client group, e.g. \u0027orchestration\u0027"},{"line_number":90,"context_line":"        :param service_clients: A list with all service clients"},{"line_number":91,"context_line":"        :param description: A description of the group"},{"line_number":92,"context_line":"        :param group_params: A set of extra parameters expected by clients"},{"line_number":93,"context_line":"                             in this group"},{"line_number":94,"context_line":"        :param client_params: each is a set of client specific parameters,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a68dd71_0aa5e9b3","line":91,"in_reply_to":"da6ed579_a8b065de","updated":"2016-01-21 16:33:14.000000000","message":"yes - it\u0027s only for logging purposes","commit_id":"378b6fbdd3a0a63fa49fc4816202a28a5c879aea"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"25f29f3edf61a895543c7506f79ef10a67fe2d09","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        :param name: Name of the client group, e.g. \u0027orchestration\u0027"},{"line_number":90,"context_line":"        :param service_clients: A list with all service clients"},{"line_number":91,"context_line":"        :param description: A description of the group"},{"line_number":92,"context_line":"        :param group_params: A set of extra parameters expected by clients"},{"line_number":93,"context_line":"                             in this group"},{"line_number":94,"context_line":"        :param client_params: each is a set of client specific parameters,"},{"line_number":95,"context_line":"                              where the key matches service_client.__name__"},{"line_number":96,"context_line":"        \"\"\""}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_cf22b6b9","line":93,"range":{"start_line":92,"start_character":0,"end_line":93,"end_character":42},"updated":"2016-01-12 11:59:25.000000000","message":"In most clients, the parameters are the same in the same group(compute, neutron, etc.).\n\nIn my understanding, this group_params is used for the same group if another them group clients don\u0027t pass this parameter, right?\n\nIf so, how about adding the other method for registering the default group_params instead of this?\n\n e.g:\n\n   register_default_group_params(self, name, params)\n\n   and\n\n   register_clients_group(self, name, service_clients, description\u003dNone, **client_params):\n\n?","commit_id":"378b6fbdd3a0a63fa49fc4816202a28a5c879aea"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"a0e007fdb2cea6980acf29edabb7eb4fdbea2a69","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        :param name: Name of the client group, e.g. \u0027orchestration\u0027"},{"line_number":90,"context_line":"        :param service_clients: A list with all service clients"},{"line_number":91,"context_line":"        :param description: A description of the group"},{"line_number":92,"context_line":"        :param group_params: A set of extra parameters expected by clients"},{"line_number":93,"context_line":"                             in this group"},{"line_number":94,"context_line":"        :param client_params: each is a set of client specific parameters,"},{"line_number":95,"context_line":"                              where the key matches service_client.__name__"},{"line_number":96,"context_line":"        \"\"\""}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_4e7243e7","line":93,"range":{"start_line":92,"start_character":0,"end_line":93,"end_character":42},"in_reply_to":"da6ed579_cf22b6b9","updated":"2016-01-12 13:29:47.000000000","message":"group_params is the list of params shared by all clients in a group. Most clients within a group expect the same parameters, but there are a few exceptions, which is where client_parameters are used.\n\nSee for instance https://review.openstack.org/#/c/260077/8/tempest/services/compute/__init__.py  - L87-89","commit_id":"378b6fbdd3a0a63fa49fc4816202a28a5c879aea"},{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"cd1d9c6daa3cec9e2f32e09b7f820caef49c3f97","unresolved":false,"context_lines":[{"line_number":110,"context_line":"clients. Attributes names include the group name, to avoid name conflicts"},{"line_number":111,"context_line":"across service clients that belong to different plugins."},{"line_number":112,"context_line":"For instance the ``HostsClient`` of ``compute`` group will be accessible via"},{"line_number":113,"context_line":"``\u003cclients_instance\u003e.compute_hosts``."},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_3173afb3","line":113,"updated":"2016-01-12 14:49:22.000000000","message":"Why not \u003cclients_instance\u003e.compute.hosts ?","commit_id":"378b6fbdd3a0a63fa49fc4816202a28a5c879aea"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"6f3146b204d04dbab9ac12fce94a37d836f7d462","unresolved":false,"context_lines":[{"line_number":110,"context_line":"clients. Attributes names include the group name, to avoid name conflicts"},{"line_number":111,"context_line":"across service clients that belong to different plugins."},{"line_number":112,"context_line":"For instance the ``HostsClient`` of ``compute`` group will be accessible via"},{"line_number":113,"context_line":"``\u003cclients_instance\u003e.compute_hosts``."},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_ba0f5d2d","line":113,"in_reply_to":"da6ed579_3173afb3","updated":"2016-01-12 23:05:42.000000000","message":"I felt that approach would require extra complexity in the implementation and give little advantage, but I\u0027m not opposed to it if you have a nice solution in mind.","commit_id":"378b6fbdd3a0a63fa49fc4816202a28a5c879aea"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"6a50091c12d6cc36dec4ded14bafd41272c30eef","unresolved":false,"context_lines":[{"line_number":58,"context_line":"Split the client manager in two parts."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"The first part provides lazy loading of clients, and it does not depend on"},{"line_number":61,"context_line":"tempest CONF, as it is planned for migration to tempest-lib."},{"line_number":62,"context_line":"It covers the six client groups for the six services covered by tempest in the"},{"line_number":63,"context_line":"big tent. It exposes an interface to register further service clients."},{"line_number":64,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"5aef4532_7fb9a7cb","line":61,"range":{"start_line":61,"start_character":48,"end_line":61,"end_character":59},"updated":"2016-03-10 07:43:45.000000000","message":"tempest.lib?","commit_id":"732c49e4ab0904c46fc7a7a1a84fc1745e1dd963"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"acc554d44b73cdc276e159d64b44d29747c25515","unresolved":false,"context_lines":[{"line_number":58,"context_line":"Split the client manager in two parts."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"The first part provides lazy loading of clients, and it does not depend on"},{"line_number":61,"context_line":"tempest CONF, as it is planned for migration to tempest-lib."},{"line_number":62,"context_line":"It covers the six client groups for the six services covered by tempest in the"},{"line_number":63,"context_line":"big tent. It exposes an interface to register further service clients."},{"line_number":64,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"9a061dce_9a1609a6","line":61,"range":{"start_line":61,"start_character":48,"end_line":61,"end_character":59},"in_reply_to":"5aef4532_7fb9a7cb","updated":"2016-04-04 08:17:02.000000000","message":"Done","commit_id":"732c49e4ab0904c46fc7a7a1a84fc1745e1dd963"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"de2f2828b6c66ee3ac1f433752acad5fd35f3b66","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"The first part provides lazy loading of clients, and it does not depend on"},{"line_number":61,"context_line":"tempest CONF, as it is planned for migration to tempest-lib."},{"line_number":62,"context_line":"It covers the six client groups for the six services covered by tempest in the"},{"line_number":63,"context_line":"big tent. It exposes an interface to register further service clients."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Lazy loading of clients provides protection against clients that try to"}],"source_content_type":"text/x-rst","patch_set":9,"id":"3afc51ec_4aed6124","line":62,"range":{"start_line":62,"start_character":40,"end_line":62,"end_character":52},"updated":"2016-03-14 19:24:50.000000000","message":"s/six services/six core services/","commit_id":"732c49e4ab0904c46fc7a7a1a84fc1745e1dd963"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"acc554d44b73cdc276e159d64b44d29747c25515","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"The first part provides lazy loading of clients, and it does not depend on"},{"line_number":61,"context_line":"tempest CONF, as it is planned for migration to tempest-lib."},{"line_number":62,"context_line":"It covers the six client groups for the six services covered by tempest in the"},{"line_number":63,"context_line":"big tent. It exposes an interface to register further service clients."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Lazy loading of clients provides protection against clients that try to"}],"source_content_type":"text/x-rst","patch_set":9,"id":"9a061dce_fa0bc57b","line":62,"range":{"start_line":62,"start_character":40,"end_line":62,"end_character":52},"in_reply_to":"3afc51ec_4aed6124","updated":"2016-04-04 08:17:02.000000000","message":"Done","commit_id":"732c49e4ab0904c46fc7a7a1a84fc1745e1dd963"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3c25545af1adbf7133d20bcc664e4d8950ef92ab","unresolved":false,"context_lines":[{"line_number":60,"context_line":"The first part provides lazy loading of clients, and it does not depend on"},{"line_number":61,"context_line":"tempest CONF, as it is planned for migration to tempest-lib."},{"line_number":62,"context_line":"It covers the six client groups for the six services covered by tempest in the"},{"line_number":63,"context_line":"big tent. It exposes an interface to register further service clients."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Lazy loading of clients provides protection against clients that try to"},{"line_number":66,"context_line":"make API calls at __init__ time; it also helps in running tempest with the"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1af94dfe_37035a44","line":63,"range":{"start_line":63,"start_character":10,"end_line":63,"end_character":70},"updated":"2016-03-16 06:58:22.000000000","message":"I did not get this interface, now tempest plugin will have new interface to register service client data and register those through register_clients_group.\n\nDo we expose another direct interface also on this client manager?","commit_id":"732c49e4ab0904c46fc7a7a1a84fc1745e1dd963"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"acc554d44b73cdc276e159d64b44d29747c25515","unresolved":false,"context_lines":[{"line_number":60,"context_line":"The first part provides lazy loading of clients, and it does not depend on"},{"line_number":61,"context_line":"tempest CONF, as it is planned for migration to tempest-lib."},{"line_number":62,"context_line":"It covers the six client groups for the six services covered by tempest in the"},{"line_number":63,"context_line":"big tent. It exposes an interface to register further service clients."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Lazy loading of clients provides protection against clients that try to"},{"line_number":66,"context_line":"make API calls at __init__ time; it also helps in running tempest with the"}],"source_content_type":"text/x-rst","patch_set":9,"id":"9a061dce_ba114db2","line":63,"range":{"start_line":63,"start_character":10,"end_line":63,"end_character":70},"in_reply_to":"1af94dfe_37035a44","updated":"2016-04-04 08:17:02.000000000","message":"The plugin allows to define extra options and tests. It is possible to define an own service client in a plugin, but not to use it via tempest client manager atm. \nThis new interface is meant to provide that, a way for plugins to define their service clients, so they can use the client manager from tempest and their clients from it.","commit_id":"732c49e4ab0904c46fc7a7a1a84fc1745e1dd963"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3c25545af1adbf7133d20bcc664e4d8950ef92ab","unresolved":false,"context_lines":[{"line_number":113,"context_line":"Attributes names are statically defined for now. They will be the same names as"},{"line_number":114,"context_line":"now, to minimize the impact on the codebase. For plugins, attributes names"},{"line_number":115,"context_line":"include the group name, to avoid name conflicts across service clients that"},{"line_number":116,"context_line":"belong to different plugins."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"Eventually the aim is to define a standard naming convention for attribute"},{"line_number":119,"context_line":"names and to enforce it by deriving names automatically. Future names may not"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1af94dfe_1aae432e","line":116,"range":{"start_line":116,"start_character":27,"end_line":116,"end_character":28},"updated":"2016-03-16 06:58:22.000000000","message":"So for plugins, their service client name will be like-\u003e group-name_(inflection.underscore(service_client.__name__)) ? ex - orchestration_client_v1 if class name is OrchestrationClientV1\n\nAnd they access their register service client via manager.orchestration_client_v1  or we provide any generic get interface?\n\nIf directly by attribute name then,\nthis is also dynamically we alter/generate name. And depends directly on inflection how it generate names.\n\nCan we get the full attribute name from plugins only in \u0027service_clients\u0027 ?\nsomething like - A Dict of all service clients- key-attribute name,value - service clients class\n\nThis way it will be easy to access those service clients by plugins etc. They know what attribute names they have registered and needs to access.","commit_id":"732c49e4ab0904c46fc7a7a1a84fc1745e1dd963"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"acc554d44b73cdc276e159d64b44d29747c25515","unresolved":false,"context_lines":[{"line_number":113,"context_line":"Attributes names are statically defined for now. They will be the same names as"},{"line_number":114,"context_line":"now, to minimize the impact on the codebase. For plugins, attributes names"},{"line_number":115,"context_line":"include the group name, to avoid name conflicts across service clients that"},{"line_number":116,"context_line":"belong to different plugins."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"Eventually the aim is to define a standard naming convention for attribute"},{"line_number":119,"context_line":"names and to enforce it by deriving names automatically. Future names may not"}],"source_content_type":"text/x-rst","patch_set":9,"id":"9a061dce_3adb7def","line":116,"range":{"start_line":116,"start_character":27,"end_line":116,"end_character":28},"in_reply_to":"1af94dfe_1aae432e","updated":"2016-04-04 08:17:02.000000000","message":"Based on your previous input I changed this, so that the name is specified statically, and there is no dependency on inflection.\nHowever I still need to combine group name with specified client name, because that way I can ensure uniqueness of attribute names.","commit_id":"732c49e4ab0904c46fc7a7a1a84fc1745e1dd963"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"de2f2828b6c66ee3ac1f433752acad5fd35f3b66","unresolved":false,"context_lines":[{"line_number":115,"context_line":"include the group name, to avoid name conflicts across service clients that"},{"line_number":116,"context_line":"belong to different plugins."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"Eventually the aim is to define a standard naming convention for attribute"},{"line_number":119,"context_line":"names and to enforce it by deriving names automatically. Future names may not"},{"line_number":120,"context_line":"contain the \u0027_client\u0027 suffix, to save space and allow for always specifying"},{"line_number":121,"context_line":"the client provider in test code, so to make the code more readable."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"Alternatives"},{"line_number":124,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":9,"id":"3afc51ec_6a7addf2","line":121,"range":{"start_line":118,"start_character":0,"end_line":121,"end_character":68},"updated":"2016-03-14 19:24:50.000000000","message":"I can see this merit for doing that, but sometimes this kind of automation makes new code readers(developers) confused easily. So if doing that, it is nice to write this on the docstring of register_clients_group() for the readability.","commit_id":"732c49e4ab0904c46fc7a7a1a84fc1745e1dd963"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"acc554d44b73cdc276e159d64b44d29747c25515","unresolved":false,"context_lines":[{"line_number":115,"context_line":"include the group name, to avoid name conflicts across service clients that"},{"line_number":116,"context_line":"belong to different plugins."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"Eventually the aim is to define a standard naming convention for attribute"},{"line_number":119,"context_line":"names and to enforce it by deriving names automatically. Future names may not"},{"line_number":120,"context_line":"contain the \u0027_client\u0027 suffix, to save space and allow for always specifying"},{"line_number":121,"context_line":"the client provider in test code, so to make the code more readable."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"Alternatives"},{"line_number":124,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":9,"id":"9a061dce_7afcd53e","line":121,"range":{"start_line":118,"start_character":0,"end_line":121,"end_character":68},"in_reply_to":"3afc51ec_6a7addf2","updated":"2016-04-04 08:17:02.000000000","message":"OK - I do not plan on doing this as part of the spec anyways, it was meant as future directions only. I can remove this section if you prefer.","commit_id":"732c49e4ab0904c46fc7a7a1a84fc1745e1dd963"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"6a50091c12d6cc36dec4ded14bafd41272c30eef","unresolved":false,"context_lines":[{"line_number":141,"context_line":"----------"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Target Milestone for completion:"},{"line_number":144,"context_line":"  Mitaka-2"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"Work Items"},{"line_number":147,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7af24918_50804ec0","line":144,"range":{"start_line":144,"start_character":2,"end_line":144,"end_character":10},"updated":"2016-03-10 07:43:45.000000000","message":"We need a time machine :P","commit_id":"732c49e4ab0904c46fc7a7a1a84fc1745e1dd963"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"acc554d44b73cdc276e159d64b44d29747c25515","unresolved":false,"context_lines":[{"line_number":141,"context_line":"----------"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Target Milestone for completion:"},{"line_number":144,"context_line":"  Mitaka-2"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"Work Items"},{"line_number":147,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":9,"id":"9a061dce_9a99e922","line":144,"range":{"start_line":144,"start_character":2,"end_line":144,"end_character":10},"in_reply_to":"7af24918_50804ec0","updated":"2016-04-04 08:17:02.000000000","message":"LoL indeed","commit_id":"732c49e4ab0904c46fc7a7a1a84fc1745e1dd963"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"d2d0f9739257eb2b7664621a07c2fa949644290c","unresolved":false,"context_lines":[{"line_number":142,"context_line":"----------"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"Target Milestone for completion:"},{"line_number":145,"context_line":"  Newtron-1"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"Work Items"},{"line_number":148,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9a061dce_ba302d09","line":145,"range":{"start_line":145,"start_character":2,"end_line":145,"end_character":9},"updated":"2016-04-04 08:22:34.000000000","message":"s/Newtron/Newton :)","commit_id":"07d8a3f497425bca64b962e3408be4e25da8d950"}]}
