)]}'
{"heat/engine/clients/client_plugin.py":[{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"1e206c47b0f10f42ec51845bdc52167c4d5c929b","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    def __init__(self, clients):"},{"line_number":23,"context_line":"        self.context \u003d clients.context"},{"line_number":24,"context_line":"        self.clients \u003d clients"},{"line_number":25,"context_line":"        self._client \u003d None"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def client(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_6c309e55","line":24,"updated":"2014-06-26 21:57:37.000000000","message":"I wonder if we run the risk of circular dependencies here. Seems to me a client plugin should initialized with just the context and get its needed info from there or configuration.","commit_id":"e74754dd02995f1ea6ee7a88e6a59a1149a50015"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"2abcc536d3ea99d79149b0637d07503629b377e3","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    def __init__(self, clients):"},{"line_number":23,"context_line":"        self.context \u003d clients.context"},{"line_number":24,"context_line":"        self.clients \u003d clients"},{"line_number":25,"context_line":"        self._client \u003d None"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def client(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_648b52c0","line":24,"in_reply_to":"1ae5cdf2_6c309e55","updated":"2014-06-27 01:49:11.000000000","message":"Client plugins can request other client plugins, it might not always be keystone. (for example, a cinder helper method might call nova and cinder clients)","commit_id":"e74754dd02995f1ea6ee7a88e6a59a1149a50015"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"1e206c47b0f10f42ec51845bdc52167c4d5c929b","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        # if there is no auth token in the context"},{"line_number":40,"context_line":"        # attempt to get one using the context username and password"},{"line_number":41,"context_line":"        return (self.context.auth_token or"},{"line_number":42,"context_line":"                self.clients.client(\u0027keystone\u0027).auth_token)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def url_for(self, **kwargs):"},{"line_number":45,"context_line":"        return self.clients.client(\u0027keystone\u0027).url_for(**kwargs)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_6c07be70","line":42,"updated":"2014-06-26 21:57:37.000000000","message":"Hrm. This also makes me wonder if we should treat keystone like other plugins. Its central to OpenStack and every other client needs it. Maybe that is why it makes sense here, but not sure. Perhaps it would be best to pass that in rather than have it dynamically registered like other clients.","commit_id":"e74754dd02995f1ea6ee7a88e6a59a1149a50015"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"1e206c47b0f10f42ec51845bdc52167c4d5c929b","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        return (self.context.auth_token or"},{"line_number":42,"context_line":"                self.clients.client(\u0027keystone\u0027).auth_token)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def url_for(self, **kwargs):"},{"line_number":45,"context_line":"        return self.clients.client(\u0027keystone\u0027).url_for(**kwargs)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _get_client_option(self, client, option):"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_ec702e43","line":44,"updated":"2014-06-26 21:57:37.000000000","message":"I may be forgetting things from the rest of the set, but does this belong here? I know keystone is an exception, but as a general base class for clients, I would think that this would be information passed into the plugin or that the plugin would get from the context. At best, maybe this and auth_token is a classmethod?","commit_id":"e74754dd02995f1ea6ee7a88e6a59a1149a50015"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"2abcc536d3ea99d79149b0637d07503629b377e3","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        return (self.context.auth_token or"},{"line_number":42,"context_line":"                self.clients.client(\u0027keystone\u0027).auth_token)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def url_for(self, **kwargs):"},{"line_number":45,"context_line":"        return self.clients.client(\u0027keystone\u0027).url_for(**kwargs)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _get_client_option(self, client, option):"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_24acea34","line":44,"in_reply_to":"1ae5cdf2_ec702e43","updated":"2014-06-27 01:49:11.000000000","message":"_create methods in subclasses generally need to call url_for","commit_id":"e74754dd02995f1ea6ee7a88e6a59a1149a50015"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"6ab815d32ee3751184fab6b0e7138a5b301eb9c2","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        # if there is no auth token in the context"},{"line_number":40,"context_line":"        # attempt to get one using the context username and password"},{"line_number":41,"context_line":"        return (self.context.auth_token or"},{"line_number":42,"context_line":"                self.clients.client(\u0027keystone\u0027).auth_token)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def url_for(self, **kwargs):"},{"line_number":45,"context_line":"        return self.clients.client(\u0027keystone\u0027).url_for(**kwargs)"}],"source_content_type":"text/x-python","patch_set":16,"id":"baada198_e90dac91","line":42,"updated":"2014-07-03 08:54:22.000000000","message":"This needs to be rebased on https://review.openstack.org/#/c/100700/2/heat/engine/clients.py or we\u0027ll revert to the previous behavior and things won\u0027t work when I get the heat_keystoneclient auth_token() method handling token expiry.","commit_id":"7c5886a8db49b57e6fc8a1a32ac467a4fca56316"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"9a8546cab711f482ef004a2ad8de3148d66e65e9","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        # if there is no auth token in the context"},{"line_number":40,"context_line":"        # attempt to get one using the context username and password"},{"line_number":41,"context_line":"        return (self.context.auth_token or"},{"line_number":42,"context_line":"                self.clients.client(\u0027keystone\u0027).auth_token)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def url_for(self, **kwargs):"},{"line_number":45,"context_line":"        return self.clients.client(\u0027keystone\u0027).url_for(**kwargs)"}],"source_content_type":"text/x-python","patch_set":16,"id":"baada198_013a9b98","line":42,"in_reply_to":"baada198_e90dac91","updated":"2014-07-03 19:54:52.000000000","message":"Done","commit_id":"7c5886a8db49b57e6fc8a1a32ac467a4fca56316"}],"heat/tests/test_clients.py":[{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"c33b0f7387f231c6aad1e6f2ad60fce39b3717b9","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.assertEqual(heat, heat_cached)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"class FooClientsPlugin(clients.client_plugin.ClientPlugin):"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _create(self):"},{"line_number":96,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_6861eed2","line":93,"updated":"2014-06-09 08:14:26.000000000","message":"Currently all these tests are not passed (please look in test_results). I suppose, it happens because current link on module does not work.\nI have added in import line:\n\nfrom heat.engine.clients import client_plugin\n\nand now it works correct.\n\nSo It should be fixed, or we will lose part of tests :)","commit_id":"bc2ba7ba9e8debd9c1e83f66f8a00dc13d5c60cc"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"b0fdcc22f4c87a282fc03d548372d19a357fb236","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.assertEqual(heat, heat_cached)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"class FooClientsPlugin(clients.client_plugin.ClientPlugin):"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _create(self):"},{"line_number":96,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_425074d4","line":93,"in_reply_to":"1ae5cdf2_6861eed2","updated":"2014-06-09 21:37:15.000000000","message":"Done","commit_id":"bc2ba7ba9e8debd9c1e83f66f8a00dc13d5c60cc"}]}
