)]}'
{"smaug/services/protection/client_factory.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"689d81c14b8437543519df963eead44afaa46ea4","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"class ClientFactory(object):"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    @classmethod"},{"line_number":17,"context_line":"    def create_client(cls, service, context, conf\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a122d0e_11ea29ac","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":28},"updated":"2016-04-20 19:28:38.000000000","message":"Maybe remove this class.\nIn Protectables, instead of\n  ClientFactory.create_client(...)\nDo:\n  self._context.get_client(...)","commit_id":"596e2f172e1c56c2ad639f6af1ef5525e78f85e8"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"689d81c14b8437543519df963eead44afaa46ea4","unresolved":false,"context_lines":[{"line_number":21,"context_line":"        param context: instance of smaug.services.protection."},{"line_number":22,"context_line":"                       protect_context.ProtectContext"},{"line_number":23,"context_line":"        \"\"\""},{"line_number":24,"context_line":"        return context.get_client(service)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a122d0e_d618a7d5","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":42},"updated":"2016-04-20 19:28:38.000000000","message":"Need to pass the conf object to get_client","commit_id":"596e2f172e1c56c2ad639f6af1ef5525e78f85e8"}],"smaug/services/protection/clients/__init__.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"689d81c14b8437543519df963eead44afaa46ea4","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        for name in self._client_plugins:"},{"line_number":33,"context_line":"            self._client_plugins[name].invalidate()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def client(self, name):"},{"line_number":36,"context_line":"        client_plugin \u003d self._get_client_plugin(name)"},{"line_number":37,"context_line":"        if client_plugin:"},{"line_number":38,"context_line":"            return client_plugin.client()"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1a122d0e_d666e74f","line":36,"range":{"start_line":35,"start_character":0,"end_line":36,"end_character":53},"updated":"2016-04-20 19:28:38.000000000","message":"must get a conf object and pass it to the _get_client_plugin","commit_id":"596e2f172e1c56c2ad639f6af1ef5525e78f85e8"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"689d81c14b8437543519df963eead44afaa46ea4","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        if name in self._client_plugins:"},{"line_number":44,"context_line":"            return self._client_plugins[name]"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        global _ALL_CLIENT_PLUGIN_CLASSES"},{"line_number":47,"context_line":"        all_cls \u003d _ALL_CLIENT_PLUGIN_CLASSES"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        if all_cls and name in all_cls:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a122d0e_6c43c442","line":46,"range":{"start_line":46,"start_character":0,"end_line":46,"end_character":41},"updated":"2016-04-20 19:28:38.000000000","message":"See comment below - you can make this variable owned by the Clients clas","commit_id":"596e2f172e1c56c2ad639f6af1ef5525e78f85e8"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"689d81c14b8437543519df963eead44afaa46ea4","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            # If the token is near expiry, force creating a new client,"},{"line_number":72,"context_line":"            # which will get a new token via another call to auth_token"},{"line_number":73,"context_line":"            # We also have to invalidate all other cached clients"},{"line_number":74,"context_line":"            self._clients.invalidate_plugins()"},{"line_number":75,"context_line":"            self._client \u003d self._create()"},{"line_number":76,"context_line":"        return self._client"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1a122d0e_515dc145","line":74,"range":{"start_line":74,"start_character":0,"end_line":74,"end_character":46},"updated":"2016-04-20 19:28:38.000000000","message":"What if there is a client is using an explicit endpoint?","commit_id":"596e2f172e1c56c2ad639f6af1ef5525e78f85e8"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"689d81c14b8437543519df963eead44afaa46ea4","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"def initialise():"},{"line_number":91,"context_line":"    global _ALL_CLIENT_PLUGIN_CLASSES"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    all_cls \u003d ClientPluginHandler().get_all_classes()"},{"line_number":94,"context_line":"    _ALL_CLIENT_PLUGIN_CLASSES \u003d {cls.PLUGIN_NAME: cls"},{"line_number":95,"context_line":"                                  for cls in all_cls}"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a122d0e_8c18e076","line":95,"range":{"start_line":91,"start_character":0,"end_line":95,"end_character":53},"updated":"2016-04-20 19:28:38.000000000","message":"What is \u0027cls\u0027 in this context?\nConsider moving this logic to \u0027Client\u0027 as a class method (maybe have initialize() call it)","commit_id":"596e2f172e1c56c2ad639f6af1ef5525e78f85e8"}],"smaug/services/protection/clients/cinder.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"689d81c14b8437543519df963eead44afaa46ea4","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class CinderClientPlugin(ClientPlugin):"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    PLUGIN_NAME \u003d \u0027cinder\u0027"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def _create(self):"},{"line_number":44,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a122d0e_d10b91d4","line":41,"range":{"start_line":41,"start_character":0,"end_line":41,"end_character":26},"updated":"2016-04-20 19:28:38.000000000","message":"why both SERVICE and PLUGIN_NAME? Can they be different?\nMaybe PLUGIN_NAME \u003d SERVICE ?","commit_id":"596e2f172e1c56c2ad639f6af1ef5525e78f85e8"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"689d81c14b8437543519df963eead44afaa46ea4","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    PLUGIN_NAME \u003d \u0027cinder\u0027"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def _create(self):"},{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            url \u003d utils.get_url(SERVICE, self._context,"},{"line_number":46,"context_line":"                                cfg.CONF, append_project\u003dTrue)"},{"line_number":47,"context_line":"        except Exception:"},{"line_number":48,"context_line":"            LOG.error(_LE(\"Get cinder service endpoint url failed.\"))"},{"line_number":49,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a122d0e_b6fa4b41","line":46,"range":{"start_line":43,"start_character":0,"end_line":46,"end_character":62},"updated":"2016-04-20 19:28:38.000000000","message":"should get a conf object, register the cinder_client_opts on the it, and pass it to get_url","commit_id":"596e2f172e1c56c2ad639f6af1ef5525e78f85e8"}],"smaug/services/protection/protect_context.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"689d81c14b8437543519df963eead44afaa46ea4","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    CONF.register_opts(opts, group\u003dgroup)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class ProtectContext(context.RequestContext):"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def __init__(self, req_context):"},{"line_number":60,"context_line":"        \"\"\"Initiate"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a122d0e_7698b3c0","line":57,"range":{"start_line":57,"start_character":0,"end_line":57,"end_character":45},"updated":"2016-04-20 19:28:38.000000000","message":"Why do we need both RequestContext and ProtectContext?","commit_id":"596e2f172e1c56c2ad639f6af1ef5525e78f85e8"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"689d81c14b8437543519df963eead44afaa46ea4","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        super(ProtectContext, self).__init__(**req_context.to_dict())"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        self._clients \u003d clients.Clients(self)"},{"line_number":68,"context_line":"        self._trust_id \u003d None"},{"line_number":69,"context_line":"        self._session \u003d None"},{"line_number":70,"context_line":"        self._auth_uri \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a122d0e_3a0a7e8a","line":67,"range":{"start_line":67,"start_character":0,"end_line":67,"end_character":45},"updated":"2016-04-20 19:28:38.000000000","message":"Passing \u0027self\u0027 to a new object? That seems like breaking encapsulation","commit_id":"596e2f172e1c56c2ad639f6af1ef5525e78f85e8"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"689d81c14b8437543519df963eead44afaa46ea4","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    def get_token(self):"},{"line_number":94,"context_line":"        return self._auth_plugin.get_token(self._session)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def get_client(self, name):"},{"line_number":97,"context_line":"        self._clients.client(name)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def _create_session(self):"},{"line_number":100,"context_line":"        opts \u003d {\u0027cacert\u0027: None,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a122d0e_7641d3a8","line":97,"range":{"start_line":96,"start_character":0,"end_line":97,"end_character":34},"updated":"2016-04-20 19:28:38.000000000","message":"Needs to get a conf object and pass it to the client","commit_id":"596e2f172e1c56c2ad639f6af1ef5525e78f85e8"}]}
