)]}'
{"smaug/services/protection/plugins/protectables/server.py":[{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"90e1864b703d7f0b420a8a2159d9c1994e6b4a51","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"nova_client_opts \u003d ["},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027nova_endpoint\u0027,"},{"line_number":28,"context_line":"               help\u003d\u0027The info of the nova endpoint. \u0027"},{"line_number":29,"context_line":"                    \u0027Format is: separated values of the form: \u0027"},{"line_number":30,"context_line":"                    \u0027\u003cservice_type\u003e;\u003cendpoint_url\u003e;\u003cendpoint_type\u003e\u0027),"},{"line_number":31,"context_line":"    cfg.StrOpt(\u0027nova_catalog_info\u0027,"},{"line_number":32,"context_line":"               default\u003d\u0027compute;nova;publicURL\u0027,"},{"line_number":33,"context_line":"               help\u003d\u0027Info to match when looking for nova in the service \u0027"},{"line_number":34,"context_line":"               \u0027catalog. Format is: separated values of the form: \u0027"},{"line_number":35,"context_line":"               \u0027\u003cservice_type\u003e;\u003cservice_name\u003e;\u003cendpoint_type\u003e - \u0027"},{"line_number":36,"context_line":"               \u0027Only used if nova_endpoint is unset\u0027),"},{"line_number":37,"context_line":"]"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"cfg.CONF.register_opts(nova_client_opts, group\u003d\u0027nova_client\u0027)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_202b3032","line":37,"range":{"start_line":26,"start_character":0,"end_line":37,"end_character":1},"updated":"2016-03-01 15:25:23.000000000","message":"Shouldn\u0027t we get this from keystone?","commit_id":"aa19895afed770b76daa5ef7992fecc840c76916"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"d5fc31a99fa742208971ee281bcc19455d27cfed","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"nova_client_opts \u003d ["},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027nova_endpoint\u0027,"},{"line_number":28,"context_line":"               help\u003d\u0027The info of the nova endpoint. \u0027"},{"line_number":29,"context_line":"                    \u0027Format is: separated values of the form: \u0027"},{"line_number":30,"context_line":"                    \u0027\u003cservice_type\u003e;\u003cendpoint_url\u003e;\u003cendpoint_type\u003e\u0027),"},{"line_number":31,"context_line":"    cfg.StrOpt(\u0027nova_catalog_info\u0027,"},{"line_number":32,"context_line":"               default\u003d\u0027compute;nova;publicURL\u0027,"},{"line_number":33,"context_line":"               help\u003d\u0027Info to match when looking for nova in the service \u0027"},{"line_number":34,"context_line":"               \u0027catalog. Format is: separated values of the form: \u0027"},{"line_number":35,"context_line":"               \u0027\u003cservice_type\u003e;\u003cservice_name\u003e;\u003cendpoint_type\u003e - \u0027"},{"line_number":36,"context_line":"               \u0027Only used if nova_endpoint is unset\u0027),"},{"line_number":37,"context_line":"]"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"cfg.CONF.register_opts(nova_client_opts, group\u003d\u0027nova_client\u0027)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_cb787df5","line":37,"range":{"start_line":26,"start_character":0,"end_line":37,"end_character":1},"in_reply_to":"7af24918_202b3032","updated":"2016-03-02 08:28:11.000000000","message":"Please see the reply at cinder protectable patch","commit_id":"aa19895afed770b76daa5ef7992fecc840c76916"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"90e1864b703d7f0b420a8a2159d9c1994e6b4a51","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    _NOVACLIENT_VERSION \u003d \u00272\u0027"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @property"},{"line_number":51,"context_line":"    def client(self):"},{"line_number":52,"context_line":"        if not self._client:"},{"line_number":53,"context_line":"            self._client \u003d self._create()"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_8095e441","line":51,"range":{"start_line":51,"start_character":8,"end_line":51,"end_character":14},"updated":"2016-03-01 15:25:23.000000000","message":"Should this really be public?","commit_id":"aa19895afed770b76daa5ef7992fecc840c76916"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"d5fc31a99fa742208971ee281bcc19455d27cfed","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    _NOVACLIENT_VERSION \u003d \u00272\u0027"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @property"},{"line_number":51,"context_line":"    def client(self):"},{"line_number":52,"context_line":"        if not self._client:"},{"line_number":53,"context_line":"            self._client \u003d self._create()"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_0b61c539","line":51,"range":{"start_line":51,"start_character":8,"end_line":51,"end_character":14},"in_reply_to":"7af24918_8095e441","updated":"2016-03-02 08:28:11.000000000","message":"Done","commit_id":"aa19895afed770b76daa5ef7992fecc840c76916"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"deab09be6f140ba6a359bbe1df95b3f872e3ddff","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        return self._SUPPORT_RESOURCE_TYPE"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def get_parent_resource_types(self):"},{"line_number":100,"context_line":"        return (\"OS::Keystone::Project\", )"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def list_resources(self):"},{"line_number":103,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_d6edf3f0","line":100,"range":{"start_line":100,"start_character":17,"end_line":100,"end_character":38},"updated":"2016-03-05 06:59:20.000000000","message":"Please consider const as I suggested in the cinder patch","commit_id":"8eb798e22b055409465784c6b9fc671d3a7dd947"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"a16163c7d24ffa2947194d992182b1d80d2309b6","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                                      id\u003dserver.id)"},{"line_number":113,"context_line":"                    for server in servers]"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def fetch_child_resources(self, parent_resource):"},{"line_number":116,"context_line":"        # Utilize list_resource here, cause its function is"},{"line_number":117,"context_line":"        # listing resources of given project"},{"line_number":118,"context_line":"        return self.list_resources()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_56eba3b0","line":115,"range":{"start_line":115,"start_character":36,"end_line":115,"end_character":51},"updated":"2016-03-05 07:12:46.000000000","message":"You should verify that the parent_resource is project","commit_id":"8eb798e22b055409465784c6b9fc671d3a7dd947"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"d6a35f6079f3b2007f14c2e21653446ff3a2069d","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    def fetch_child_resources(self, parent_resource):"},{"line_number":116,"context_line":"        # Utilize list_resource here, cause its function is"},{"line_number":117,"context_line":"        # listing resources of given project"},{"line_number":118,"context_line":"        return self.list_resources()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_69a44307","line":118,"updated":"2016-03-04 01:11:35.000000000","message":"sorry, the child resources are the resource of parent_resource, instead of resources of this type. \nIn this way, we couldn\u0027t build the resource graph.","commit_id":"8eb798e22b055409465784c6b9fc671d3a7dd947"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"a16163c7d24ffa2947194d992182b1d80d2309b6","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    def fetch_child_resources(self, parent_resource):"},{"line_number":116,"context_line":"        # Utilize list_resource here, cause its function is"},{"line_number":117,"context_line":"        # listing resources of given project"},{"line_number":118,"context_line":"        return self.list_resources()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_96cd2b60","line":118,"in_reply_to":"7af24918_56860314","updated":"2016-03-05 07:12:46.000000000","message":"Discard my comment just make sure you verify that the parent resource could be an ancestor of this protactabole and if not throws and exception","commit_id":"8eb798e22b055409465784c6b9fc671d3a7dd947"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"deab09be6f140ba6a359bbe1df95b3f872e3ddff","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    def fetch_child_resources(self, parent_resource):"},{"line_number":116,"context_line":"        # Utilize list_resource here, cause its function is"},{"line_number":117,"context_line":"        # listing resources of given project"},{"line_number":118,"context_line":"        return self.list_resources()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_56860314","line":118,"in_reply_to":"7af24918_69a44307","updated":"2016-03-05 06:59:20.000000000","message":"+1 yes yinwei is correct we need to find the dependent glance resource ID   and if this instance has volume attached to it the cinder volume id","commit_id":"8eb798e22b055409465784c6b9fc671d3a7dd947"}],"smaug/services/protection/protectable_plugin.py":[{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"f048aa85e4fe714a7d8f9320391067e59b0e142a","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    \"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def __init__(self, context\u003dNone):"},{"line_number":24,"context_line":"        self._context \u003d context"},{"line_number":25,"context_line":"        self._client_instance \u003d None"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def instance(self, context):"},{"line_number":28,"context_line":"        return self.__class__(context)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @abc.abstractmethod"},{"line_number":31,"context_line":"    def get_resource_type(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_bf40ec36","line":28,"range":{"start_line":23,"start_character":0,"end_line":28,"end_character":38},"updated":"2016-03-06 16:33:16.000000000","message":"Why do we need this interface enhancement?","commit_id":"8eb798e22b055409465784c6b9fc671d3a7dd947"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"5f1adfb9beb09833d1c689c1a0c9e6087e5ef391","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    \"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def __init__(self, context\u003dNone):"},{"line_number":24,"context_line":"        self._context \u003d context"},{"line_number":25,"context_line":"        self._client_instance \u003d None"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def instance(self, context):"},{"line_number":28,"context_line":"        return self.__class__(context)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @abc.abstractmethod"},{"line_number":31,"context_line":"    def get_resource_type(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_23da2e79","line":28,"range":{"start_line":23,"start_character":0,"end_line":28,"end_character":38},"in_reply_to":"7af24918_bf40ec36","updated":"2016-03-07 07:49:01.000000000","message":"Because we need a way to get instance from another instance of ProtectablePlugin, for different contexts.\nWhen the ProtectableRegistry loads all plugins, I have to register all plugins as objects, not classes, because we can\u0027t make sure that child classes would implement get_resource_type as a classmethod or object method.\nPlease check https://review.openstack.org/#/c/281783/8/smaug/services/protection/protectable_registry.py\n\nIf you got any better idea, I\u0027d be happy to listen.","commit_id":"8eb798e22b055409465784c6b9fc671d3a7dd947"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"cdcdb6c9be3645f5d60f79c5c371d6da41e8eb4f","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def __init__(self, context\u003dNone):"},{"line_number":24,"context_line":"        self._context \u003d context"},{"line_number":25,"context_line":"        self._client_instance \u003d None"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def instance(self, context):"},{"line_number":28,"context_line":"        return self.__class__(context)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa0719c6_94249960","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":36},"updated":"2016-03-23 09:52:02.000000000","message":"rebase, this line is removed","commit_id":"34049ebafcd74679ba88d40e8c23922a1051fe2f"}],"smaug/services/protection/protectable_plugins/server.py":[{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"18fa93f87e37a15fd24afc60a125a977ef218ca9","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                                      id\u003dserver.id)"},{"line_number":114,"context_line":"                    for server in servers]"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def fetch_child_resources(self, parent_resource):"},{"line_number":117,"context_line":"        # Utilize list_resource here, cause its function is"},{"line_number":118,"context_line":"        # listing resources of given project"},{"line_number":119,"context_line":"        return self.list_resources()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5aef4532_5a13620d","line":116,"range":{"start_line":116,"start_character":17,"end_line":116,"end_character":18},"updated":"2016-03-09 08:51:52.000000000","message":"please change the name to the name we derided in the IRC meeting","commit_id":"01151e5bea5a0de334307bf65274f48dc3422bcf"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"27d7153e343c1d7429573ddb79e8f8f8de29c274","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"nova_client_opts \u003d ["},{"line_number":28,"context_line":"    cfg.StrOpt(\u0027nova_endpoint\u0027,"},{"line_number":29,"context_line":"               help\u003d\u0027The info of the nova endpoint. \u0027"},{"line_number":30,"context_line":"                    \u0027Format is: separated values of the form: \u0027"},{"line_number":31,"context_line":"                    \u0027\u003cservice_type\u003e;\u003cendpoint_url\u003e;\u003cendpoint_type\u003e\u0027),"},{"line_number":32,"context_line":"    cfg.StrOpt(\u0027nova_catalog_info\u0027,"},{"line_number":33,"context_line":"               default\u003d\u0027compute;nova;publicURL\u0027,"},{"line_number":34,"context_line":"               help\u003d\u0027Info to match when looking for nova in the service \u0027"},{"line_number":35,"context_line":"               \u0027catalog. Format is: separated values of the form: \u0027"},{"line_number":36,"context_line":"               \u0027\u003cservice_type\u003e;\u003cservice_name\u003e;\u003cendpoint_type\u003e - \u0027"},{"line_number":37,"context_line":"               \u0027Only used if nova_endpoint is unset\u0027),"},{"line_number":38,"context_line":"]"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"cfg.CONF.register_opts(nova_client_opts, group\u003d\u0027nova_client\u0027)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class ServerProtectablePlugin(protectable_plugin.ProtectablePlugin):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_2e1b6ecb","line":40,"range":{"start_line":27,"start_character":0,"end_line":40,"end_character":61},"updated":"2016-03-10 08:36:38.000000000","message":"Move nova client configuration to a common client configuration location.\nAlso, seems like the convention is to use \u0027:\u0027 as a delimiter, and not \u0027;\u0027.","commit_id":"e953ed2b89f54c554e0bc33ba6a832e3d8efaf91"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"27d7153e343c1d7429573ddb79e8f8f8de29c274","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    _SUPPORT_RESOURCE_TYPE \u003d constants.SERVER_RESOURCE_TYPE"},{"line_number":49,"context_line":"    _NOVACLIENT_VERSION \u003d \u00272\u0027"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @property"},{"line_number":52,"context_line":"    def _client(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_0e71520f","line":49,"range":{"start_line":49,"start_character":0,"end_line":49,"end_character":29},"updated":"2016-03-10 08:36:38.000000000","message":"Add to novaclient configuration (as above) and move to a common client configuration location.","commit_id":"e953ed2b89f54c554e0bc33ba6a832e3d8efaf91"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"27d7153e343c1d7429573ddb79e8f8f8de29c274","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    _SUPPORT_RESOURCE_TYPE \u003d constants.SERVER_RESOURCE_TYPE"},{"line_number":49,"context_line":"    _NOVACLIENT_VERSION \u003d \u00272\u0027"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @property"},{"line_number":52,"context_line":"    def _client(self):"},{"line_number":53,"context_line":"        if not self._client_instance:"},{"line_number":54,"context_line":"            self._client_instance \u003d self._create()"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        return self._client_instance"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def _get_url(self):"},{"line_number":59,"context_line":"        \u0027\u0027\u0027Return the url of nova endpoint.\u0027\u0027\u0027"},{"line_number":60,"context_line":"        if cfg.CONF.nova_client.nova_endpoint is None:"},{"line_number":61,"context_line":"            return utils.parse_service_catalog_info("},{"line_number":62,"context_line":"                \u0027nova_catalog_info\u0027,"},{"line_number":63,"context_line":"                cfg.CONF.nova_client.nova_catalog_info,"},{"line_number":64,"context_line":"                self._context.service_catalog"},{"line_number":65,"context_line":"            )"},{"line_number":66,"context_line":"        else:"},{"line_number":67,"context_line":"            return utils.parse_service_endpoint("},{"line_number":68,"context_line":"                \u0027nova_endpoint\u0027,"},{"line_number":69,"context_line":"                cfg.CONF.nova_client.nova_endpoint,"},{"line_number":70,"context_line":"                self._context.project_id"},{"line_number":71,"context_line":"            )"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _create(self):"},{"line_number":74,"context_line":"        try:"},{"line_number":75,"context_line":"            service_type, url, endpoint_type \u003d self._get_url()"},{"line_number":76,"context_line":"        except Exception:"},{"line_number":77,"context_line":"            LOG.error(_LE(\"Get nova service endpoint url failed.\"))"},{"line_number":78,"context_line":"            raise"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        LOG.info(_LI(\u0027Creating nova client with url %s.\u0027), url)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        extensions \u003d nc.discover_extensions(self._NOVACLIENT_VERSION)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        args \u003d {"},{"line_number":85,"context_line":"            \u0027project_id\u0027: self._context.project_id,"},{"line_number":86,"context_line":"            \u0027auth_url\u0027: self._context.auth_url,"},{"line_number":87,"context_line":"            \u0027auth_token\u0027: self._context.auth_token,"},{"line_number":88,"context_line":"            \u0027extensions\u0027: extensions,"},{"line_number":89,"context_line":"            \u0027endpoint_type\u0027: endpoint_type"},{"line_number":90,"context_line":"        }"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        client \u003d nc.Client(self._NOVACLIENT_VERSION, **args)"},{"line_number":93,"context_line":"        client.client.set_management_url(url)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        return client"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def get_resource_type(self):"},{"line_number":98,"context_line":"        return self._SUPPORT_RESOURCE_TYPE"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_2e724e11","line":95,"range":{"start_line":51,"start_character":0,"end_line":95,"end_character":21},"updated":"2016-03-10 08:36:38.000000000","message":"Move the client creation to a common location (for use in other protectable or protection plug-ins)","commit_id":"e953ed2b89f54c554e0bc33ba6a832e3d8efaf91"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"25e9c0ac1bee6f1c795f6be10a13eaf0eca2d243","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from smaug import exception"},{"line_number":18,"context_line":"from smaug.i18n import _LE"},{"line_number":19,"context_line":"from smaug import resource"},{"line_number":20,"context_line":"from smaug.services.protection.client_factory import CLIENT_FACTORY"},{"line_number":21,"context_line":"from smaug.services.protection import protectable_plugin"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa0719c6_90c97e7b","line":20,"range":{"start_line":20,"start_character":0,"end_line":20,"end_character":67},"updated":"2016-03-22 11:04:39.000000000","message":"No need to reference CLIENT_FACTORY, you can use ClientFactory\u0027s classmethod .create_client()","commit_id":"14cfe9afdc3fe8693b648dccd70164cf5d5657f7"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"25e9c0ac1bee6f1c795f6be10a13eaf0eca2d243","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    @property"},{"line_number":34,"context_line":"    def _client(self):"},{"line_number":35,"context_line":"        if not self._client_instance:"},{"line_number":36,"context_line":"            self._client_instance \u003d CLIENT_FACTORY.create_client("},{"line_number":37,"context_line":"                \"nova\","},{"line_number":38,"context_line":"                self._context)"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa0719c6_10ac4e9f","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":65},"updated":"2016-03-22 11:04:39.000000000","message":"ditto","commit_id":"14cfe9afdc3fe8693b648dccd70164cf5d5657f7"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"cdcdb6c9be3645f5d60f79c5c371d6da41e8eb4f","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @property"},{"line_number":34,"context_line":"    def _client(self):"},{"line_number":35,"context_line":"        if not self._client_instance:"},{"line_number":36,"context_line":"            self._client_instance \u003d ClientFactory.create_client("},{"line_number":37,"context_line":"                \"nova\","},{"line_number":38,"context_line":"                self._context)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa0719c6_b4f8bdc4","line":35,"range":{"start_line":35,"start_character":0,"end_line":35,"end_character":37},"updated":"2016-03-23 09:52:02.000000000","message":"Please rebase and check instead:\nif not hasattr(self, \u0027_client_instance\u0027)","commit_id":"34049ebafcd74679ba88d40e8c23922a1051fe2f"}]}
