)]}'
{"murano/api/v1/cloudfoundry/__init__.py":[{"author":{"_account_id":7549,"name":"Ekaterina Chernova","email":"katyafervent@yandex.ru","username":"efedorova"},"change_message_id":"836d17d85a13d79a900abc84e177178edb28548f","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from keystoneclient.v2_0 import client"},{"line_number":16,"context_line":"from oslo.config import cfg"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from murano.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_00de1f3f","line":15,"updated":"2015-07-13 14:21:41.000000000","message":"are you sure trusts is not needed?\n\nyou can take a look to murano.common.authutils, maybe you can use some functions from there","commit_id":"24bb2f0e99401635fddb2afcd96e6f5917c64b05"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"d7500a23fa166e414b24ce6153b0f9d19ba40f76","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from keystoneclient.v2_0 import client"},{"line_number":16,"context_line":"from oslo.config import cfg"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from murano.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_ea1a7fc5","line":15,"in_reply_to":"9a41bdd9_00de1f3f","updated":"2015-07-15 13:57:08.000000000","message":"Thanks for the notification. Will take a look at it later","commit_id":"24bb2f0e99401635fddb2afcd96e6f5917c64b05"}],"murano/api/v1/cloudfoundry/auth.py":[{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"afa3a5e2032c9b6b3d03e0cd0cf90d42be9ab3eb","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from keystoneclient.v2_0 import client"},{"line_number":16,"context_line":"from oslo_config import cfg"},{"line_number":17,"context_line":"from oslo_log import log as logging"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_3ad924f4","line":15,"updated":"2015-08-18 12:42:49.000000000","message":"can we maybe use v3 here?\n\nor even better support both?","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"432fdef88a2b7efabc6df5c259e7e865e0ef0ee7","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from keystoneclient.v2_0 import client"},{"line_number":16,"context_line":"from oslo_config import cfg"},{"line_number":17,"context_line":"from oslo_log import log as logging"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_b5cc6536","line":15,"in_reply_to":"fa1b9901_3ad924f4","updated":"2015-08-18 12:50:36.000000000","message":"yeah, you\u0027re right. this is the most \u0027old\u0027 part of the code. will do.","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":7549,"name":"Ekaterina Chernova","email":"katyafervent@yandex.ru","username":"efedorova"},"change_message_id":"5cb6ac59cec1950114af1f16a2b254cf1f7a8062","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Copyright (c) 2013 Mirantis, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_9aa79ba6","line":1,"updated":"2015-08-26 10:37:04.000000000","message":"please, update year. \n+ I\u0027m not sure if company name is needed anymore","commit_id":"238e59350fe3891ed7731275e7cce0efb35fdc5c"},{"author":{"_account_id":13962,"name":"Victor Ryzhenkin","email":"vryzhenkin@mirantis.com","username":"vryzhenkin"},"change_message_id":"271f61e66cfb3517789dfcd38ffa407109fa9cd5","unresolved":false,"context_lines":[{"line_number":20,"context_line":"CONF \u003d cfg.CONF"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def authenticate(user, password, tenant\u003dNone):"},{"line_number":24,"context_line":"    keystone \u003d client.Client(username\u003duser,"},{"line_number":25,"context_line":"                             password\u003dpassword,"},{"line_number":26,"context_line":"                             tenant_name\u003dCONF.cfapi.tenant,"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_61f15895","line":23,"updated":"2015-09-01 21:20:49.000000000","message":"Correct me please, if I wrong, this method used to authenticate CF broker murano service?\nIf this is True, why you didn\u0027t using smth like this algorithm:\nhttps://github.com/openstack/murano/blob/master/murano/common/auth_utils.py","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"1b8c1216c3291e09bb01863afa286cf71f1aebb0","unresolved":false,"context_lines":[{"line_number":20,"context_line":"CONF \u003d cfg.CONF"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def authenticate(user, password, tenant\u003dNone):"},{"line_number":24,"context_line":"    keystone \u003d client.Client(username\u003duser,"},{"line_number":25,"context_line":"                             password\u003dpassword,"},{"line_number":26,"context_line":"                             tenant_name\u003dCONF.cfapi.tenant,"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_88f2766e","line":23,"in_reply_to":"da20952f_61f15895","updated":"2015-09-02 11:43:14.000000000","message":"you\u0027re right. the problem is that we don\u0027t have any method in auth_utils which can create keystone client using username/password, it\u0027s always used token and tenant_id which usually is available from context. In the request which come from CF we don\u0027t have any token and I don\u0027t have an idea how to take it.\nIn service broker we first create keystone client and then get token.","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"}],"murano/api/v1/cloudfoundry/cfapi.py":[{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"afa3a5e2032c9b6b3d03e0cd0cf90d42be9ab3eb","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def _check_auth(self, req, tenant\u003dNone):"},{"line_number":65,"context_line":"        auth \u003d req.headers.get(\u0027Authorization\u0027, None)"},{"line_number":66,"context_line":"        if auth is None:"},{"line_number":67,"context_line":"            raise Exception(\u0027Authentication needed.\u0027)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        auth_info \u003d auth.split(\u0027 \u0027)[1]"},{"line_number":70,"context_line":"        auth_decoded \u003d base64.b64decode(auth_info)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_7aa47c56","line":67,"updated":"2015-08-18 12:42:49.000000000","message":"This has to be 401 HTTPUnauthorized. Current code would cause 500","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"432fdef88a2b7efabc6df5c259e7e865e0ef0ee7","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def _check_auth(self, req, tenant\u003dNone):"},{"line_number":65,"context_line":"        auth \u003d req.headers.get(\u0027Authorization\u0027, None)"},{"line_number":66,"context_line":"        if auth is None:"},{"line_number":67,"context_line":"            raise Exception(\u0027Authentication needed.\u0027)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        auth_info \u003d auth.split(\u0027 \u0027)[1]"},{"line_number":70,"context_line":"        auth_decoded \u003d base64.b64decode(auth_info)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_7549ed8a","line":67,"in_reply_to":"fa1b9901_7aa47c56","updated":"2015-08-18 12:50:36.000000000","message":"Done","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"afa3a5e2032c9b6b3d03e0cd0cf90d42be9ab3eb","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                              \"name\": name})"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _make_service(self, name, package, plan_id):"},{"line_number":97,"context_line":"        id \u003d str(uuid.uuid4().hex)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return {\"name\": name,"},{"line_number":100,"context_line":"                \"?\": {plan_id: {\"name\": package.name},"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_5509492b","line":97,"updated":"2015-08-18 12:42:49.000000000","message":"str is redundant here, hex already returns string","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"432fdef88a2b7efabc6df5c259e7e865e0ef0ee7","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                              \"name\": name})"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _make_service(self, name, package, plan_id):"},{"line_number":97,"context_line":"        id \u003d str(uuid.uuid4().hex)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        return {\"name\": name,"},{"line_number":100,"context_line":"                \"?\": {plan_id: {\"name\": package.name},"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_d5e559a8","line":97,"in_reply_to":"fa1b9901_5509492b","updated":"2015-08-18 12:50:36.000000000","message":"Done","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"afa3a5e2032c9b6b3d03e0cd0cf90d42be9ab3eb","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        # data \u003d json.load(req.body)"},{"line_number":113,"context_line":"        # tenant \u003d db_cf.get_tenant_for_org(org_guid)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        ctx \u003d context.RequestContext(user\u003duser, tenant\u003d\u0027\u0027, is_admin\u003dTrue,"},{"line_number":116,"context_line":"                                     auth_token\u003dtoken)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        packages \u003d db_api.package_search({}, ctx)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_f55f3d0c","line":115,"updated":"2015-08-18 12:42:49.000000000","message":"is it ok to pass is_admin\u003dTrue here? Seems that this can cause visibility problems. I might be wrong though.\n\nAlso can\u0027t we use current context?","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"8e4adce75ac412f91118f2c0c417aca6af07546b","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        # data \u003d json.load(req.body)"},{"line_number":113,"context_line":"        # tenant \u003d db_cf.get_tenant_for_org(org_guid)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        ctx \u003d context.RequestContext(user\u003duser, tenant\u003d\u0027\u0027, is_admin\u003dTrue,"},{"line_number":116,"context_line":"                                     auth_token\u003dtoken)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        packages \u003d db_api.package_search({}, ctx)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_8b5ca8ee","line":115,"in_reply_to":"fa1b9901_f55f3d0c","updated":"2015-08-24 08:53:41.000000000","message":"@Kirill after deep dive I can answer this questions:\n1) we can\u0027t use req.context here, because request comes from Cloud Foundry and don\u0027t have this section.\n2)also, if I remove \u0027is_admin\u003dTrue\u0027, I have empty list of packages. It can be limitation of my deployment, I\u0027m not sure how it works.","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"432fdef88a2b7efabc6df5c259e7e865e0ef0ee7","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        # data \u003d json.load(req.body)"},{"line_number":113,"context_line":"        # tenant \u003d db_cf.get_tenant_for_org(org_guid)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        ctx \u003d context.RequestContext(user\u003duser, tenant\u003d\u0027\u0027, is_admin\u003dTrue,"},{"line_number":116,"context_line":"                                     auth_token\u003dtoken)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        packages \u003d db_api.package_search({}, ctx)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_35005534","line":115,"in_reply_to":"fa1b9901_f55f3d0c","updated":"2015-08-18 12:50:36.000000000","message":"sure, will fix it.","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"afa3a5e2032c9b6b3d03e0cd0cf90d42be9ab3eb","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        return resp"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def provision(self, req, body, instance_id):"},{"line_number":128,"context_line":"        # Parse body parameter"},{"line_number":129,"context_line":"        # {"},{"line_number":130,"context_line":"        # \"service_id\":        \"service-guid-here\","},{"line_number":131,"context_line":"        # \"plan_id\":           \"plan-guid-here\","}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_d5b9d92f","line":128,"updated":"2015-08-18 12:42:49.000000000","message":"this should probably be doctringed, right?","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"432fdef88a2b7efabc6df5c259e7e865e0ef0ee7","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        return resp"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def provision(self, req, body, instance_id):"},{"line_number":128,"context_line":"        # Parse body parameter"},{"line_number":129,"context_line":"        # {"},{"line_number":130,"context_line":"        # \"service_id\":        \"service-guid-here\","},{"line_number":131,"context_line":"        # \"plan_id\":           \"plan-guid-here\","}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_9595a1e5","line":128,"in_reply_to":"fa1b9901_d5b9d92f","updated":"2015-08-18 12:50:36.000000000","message":"yeah.","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"afa3a5e2032c9b6b3d03e0cd0cf90d42be9ab3eb","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            LOG.debug(\u0027Auth: %s\u0027 % keystone.auth_ref)"},{"line_number":175,"context_line":"            tenant_id \u003d keystone.auth_ref[\u0027token\u0027][\u0027id\u0027]"},{"line_number":176,"context_line":"            ctx \u003d context.RequestContext(user\u003duser, tenant\u003dtenant_id,"},{"line_number":177,"context_line":"                                         is_admin\u003dTrue)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"            package \u003d db_api.package_get(service_id, ctx)"},{"line_number":180,"context_line":"            LOG.debug(\u0027Adding service %s\u0027 % package.name)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_d590f997","line":177,"updated":"2015-08-18 12:42:49.000000000","message":"same question here. can\u0027t we use current context?","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"432fdef88a2b7efabc6df5c259e7e865e0ef0ee7","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            LOG.debug(\u0027Auth: %s\u0027 % keystone.auth_ref)"},{"line_number":175,"context_line":"            tenant_id \u003d keystone.auth_ref[\u0027token\u0027][\u0027id\u0027]"},{"line_number":176,"context_line":"            ctx \u003d context.RequestContext(user\u003duser, tenant\u003dtenant_id,"},{"line_number":177,"context_line":"                                         is_admin\u003dTrue)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"            package \u003d db_api.package_get(service_id, ctx)"},{"line_number":180,"context_line":"            LOG.debug(\u0027Adding service %s\u0027 % package.name)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_b59a2513","line":177,"in_reply_to":"fa1b9901_d590f997","updated":"2015-08-18 12:50:36.000000000","message":"sure.","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":7549,"name":"Ekaterina Chernova","email":"katyafervent@yandex.ru","username":"efedorova"},"change_message_id":"5cb6ac59cec1950114af1f16a2b254cf1f7a8062","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from murano.db.catalog import api as db_api"},{"line_number":27,"context_line":"from murano.db.services import cf_connections as db_cf"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"import muranoclient.client as client"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"cfapi_opts \u003d ["},{"line_number":32,"context_line":"    cfg.StrOpt(\u0027tenant\u0027, default\u003d\u0027admin\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_dac8b357","line":29,"updated":"2015-08-26 10:37:04.000000000","message":"there are should be 3 groups: muranoclient belongs to the second one","commit_id":"238e59350fe3891ed7731275e7cce0efb35fdc5c"},{"author":{"_account_id":7549,"name":"Ekaterina Chernova","email":"katyafervent@yandex.ru","username":"efedorova"},"change_message_id":"b21968705cab9bdb455d8579c42c33840ade1e7c","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"cfapi_opts \u003d ["},{"line_number":32,"context_line":"    cfg.StrOpt(\u0027tenant\u0027, default\u003d\u0027admin\u0027,"},{"line_number":33,"context_line":"               help\u003d(\u0027Tenant for service broker\u0027)),"},{"line_number":34,"context_line":"    cfg.StrOpt(\u0027bind_host\u0027, default\u003d\u0027localhost\u0027,"},{"line_number":35,"context_line":"               help\u003d(\u0027host for service broker\u0027)),"},{"line_number":36,"context_line":"    cfg.StrOpt(\u0027bind_port\u0027, default\u003d\u00278083\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_fdc1a8e4","line":33,"updated":"2015-09-01 12:46:32.000000000","message":"Is it openstack tenant? why separate tenant is needed to be provided?","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"7f1427fcfbfff498d351cf8ee1e9bc080bb441df","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"cfapi_opts \u003d ["},{"line_number":32,"context_line":"    cfg.StrOpt(\u0027tenant\u0027, default\u003d\u0027admin\u0027,"},{"line_number":33,"context_line":"               help\u003d(\u0027Tenant for service broker\u0027)),"},{"line_number":34,"context_line":"    cfg.StrOpt(\u0027bind_host\u0027, default\u003d\u0027localhost\u0027,"},{"line_number":35,"context_line":"               help\u003d(\u0027host for service broker\u0027)),"},{"line_number":36,"context_line":"    cfg.StrOpt(\u0027bind_port\u0027, default\u003d\u00278083\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_59c9c359","line":33,"in_reply_to":"da20952f_fdc1a8e4","updated":"2015-09-01 13:55:57.000000000","message":"we suppose that murano service broker can be deployed on the separate node, so it\u0027s better to have all needed options in one place. I guess this is the answer.","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":13962,"name":"Victor Ryzhenkin","email":"vryzhenkin@mirantis.com","username":"vryzhenkin"},"change_message_id":"271f61e66cfb3517789dfcd38ffa407109fa9cd5","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def _check_auth(self, req, tenant\u003dNone):"},{"line_number":65,"context_line":"        auth \u003d req.headers.get(\u0027Authorization\u0027, None)"},{"line_number":66,"context_line":"        if auth is None:"},{"line_number":67,"context_line":"            raise Exception(\u0027Authentication needed.\u0027)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        auth_info \u003d auth.split(\u0027 \u0027)[1]"},{"line_number":70,"context_line":"        auth_decoded \u003d base64.b64decode(auth_info)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_dce5abdc","line":67,"updated":"2015-09-01 21:20:49.000000000","message":"Khm. This is bad. Using custom exception, I mean.\nSo, I strongly suggest you to use webob library for exception.\nWebob already in murano requirements.\n\nLike this:\nfrom kebob import exc\n    raise exc.HTTPUnauthorised","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"1b8c1216c3291e09bb01863afa286cf71f1aebb0","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def _check_auth(self, req, tenant\u003dNone):"},{"line_number":65,"context_line":"        auth \u003d req.headers.get(\u0027Authorization\u0027, None)"},{"line_number":66,"context_line":"        if auth is None:"},{"line_number":67,"context_line":"            raise Exception(\u0027Authentication needed.\u0027)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        auth_info \u003d auth.split(\u0027 \u0027)[1]"},{"line_number":70,"context_line":"        auth_decoded \u003d base64.b64decode(auth_info)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_e92a137e","line":67,"in_reply_to":"da20952f_dce5abdc","updated":"2015-09-02 11:43:14.000000000","message":"Done","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"dfc7c9c389367446464b902baab18876ba47f9a5","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        # Once we get here we were authorized by keystone"},{"line_number":90,"context_line":"        token \u003d keystone.auth_ref[\u0027token\u0027][\u0027id\u0027]"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        ctx \u003d context.RequestContext(user\u003duser, tenant\u003d\u0027\u0027, is_admin\u003dTrue,"},{"line_number":93,"context_line":"                                     auth_token\u003dtoken)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        packages \u003d db_api.package_search({\u0027type\u0027: \u0027application\u0027}, ctx)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_57487a2d","line":92,"updated":"2015-09-02 10:50:39.000000000","message":"I still think, that is_admin\u003dTrue is not secure here. This means, that CF would get access to private packages from other tennants.\n\nI suggest you use catalog\u003dTrue for db_api calls http://murano.readthedocs.org/en/latest/specification/#list-packages","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"1b8c1216c3291e09bb01863afa286cf71f1aebb0","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        # Once we get here we were authorized by keystone"},{"line_number":90,"context_line":"        token \u003d keystone.auth_ref[\u0027token\u0027][\u0027id\u0027]"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        ctx \u003d context.RequestContext(user\u003duser, tenant\u003d\u0027\u0027, is_admin\u003dTrue,"},{"line_number":93,"context_line":"                                     auth_token\u003dtoken)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        packages \u003d db_api.package_search({\u0027type\u0027: \u0027application\u0027}, ctx)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_5d92d958","line":92,"in_reply_to":"da20952f_57487a2d","updated":"2015-09-02 11:43:14.000000000","message":"Done","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"e6b83b8529fa517a7a70cebb51f23f6fdfa9c07b","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        ctx \u003d context.RequestContext(user\u003duser, tenant\u003d\u0027\u0027, is_admin\u003dTrue,"},{"line_number":93,"context_line":"                                     auth_token\u003dtoken)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        packages \u003d db_api.package_search({\u0027type\u0027: \u0027application\u0027}, ctx)"},{"line_number":96,"context_line":"        services \u003d []"},{"line_number":97,"context_line":"        for package in packages:"},{"line_number":98,"context_line":"            services.append(self._package_to_service(package))"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_b7bb1675","line":95,"updated":"2015-09-02 11:07:00.000000000","message":"you should use catalog\u003dTrue here.","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"1b8c1216c3291e09bb01863afa286cf71f1aebb0","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        ctx \u003d context.RequestContext(user\u003duser, tenant\u003d\u0027\u0027, is_admin\u003dTrue,"},{"line_number":93,"context_line":"                                     auth_token\u003dtoken)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        packages \u003d db_api.package_search({\u0027type\u0027: \u0027application\u0027}, ctx)"},{"line_number":96,"context_line":"        services \u003d []"},{"line_number":97,"context_line":"        for package in packages:"},{"line_number":98,"context_line":"            services.append(self._package_to_service(package))"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_fd9e4d62","line":95,"in_reply_to":"da20952f_b7bb1675","updated":"2015-09-02 11:43:14.000000000","message":"Done","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":7549,"name":"Ekaterina Chernova","email":"katyafervent@yandex.ru","username":"efedorova"},"change_message_id":"b21968705cab9bdb455d8579c42c33840ade1e7c","unresolved":false,"context_lines":[{"line_number":114,"context_line":"         }"},{"line_number":115,"context_line":"        \"\"\""},{"line_number":116,"context_line":"        data \u003d json.loads(req.body)"},{"line_number":117,"context_line":"        space_guid \u003d data[\u0027space_guid\u0027]"},{"line_number":118,"context_line":"        org_guid \u003d data[\u0027organization_guid\u0027]"},{"line_number":119,"context_line":"        plan_id \u003d data[\u0027plan_id\u0027]"},{"line_number":120,"context_line":"        service_id \u003d data[\u0027service_id\u0027]"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_5d8c54d9","line":117,"updated":"2015-09-01 12:46:32.000000000","message":"where did you validate the json?","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"7f1427fcfbfff498d351cf8ee1e9bc080bb441df","unresolved":false,"context_lines":[{"line_number":114,"context_line":"         }"},{"line_number":115,"context_line":"        \"\"\""},{"line_number":116,"context_line":"        data \u003d json.loads(req.body)"},{"line_number":117,"context_line":"        space_guid \u003d data[\u0027space_guid\u0027]"},{"line_number":118,"context_line":"        org_guid \u003d data[\u0027organization_guid\u0027]"},{"line_number":119,"context_line":"        plan_id \u003d data[\u0027plan_id\u0027]"},{"line_number":120,"context_line":"        service_id \u003d data[\u0027service_id\u0027]"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_99a99b93","line":117,"in_reply_to":"da20952f_5d8c54d9","updated":"2015-09-01 13:55:57.000000000","message":"no need for it. JSON is passed from CF and they have their own tools for validation.","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"e6b83b8529fa517a7a70cebb51f23f6fdfa9c07b","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        LOG.debug(\u0027Auth: %s\u0027 % keystone.auth_ref)"},{"line_number":155,"context_line":"        tenant_id \u003d keystone.auth_ref[\u0027token\u0027][\u0027id\u0027]"},{"line_number":156,"context_line":"        ctx \u003d context.RequestContext(user\u003duser, tenant\u003dtenant_id,"},{"line_number":157,"context_line":"                                     is_admin\u003dTrue)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        package \u003d db_api.package_get(service_id, ctx)"},{"line_number":160,"context_line":"        LOG.debug(\u0027Adding service {name}\u0027.format(name\u003dpackage.name))"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_57adda2f","line":157,"updated":"2015-09-02 11:07:00.000000000","message":"is_admin\u003dTrue is not required here at all.\n\npackage_get would allow you to access public packages.","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"1b8c1216c3291e09bb01863afa286cf71f1aebb0","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        LOG.debug(\u0027Auth: %s\u0027 % keystone.auth_ref)"},{"line_number":155,"context_line":"        tenant_id \u003d keystone.auth_ref[\u0027token\u0027][\u0027id\u0027]"},{"line_number":156,"context_line":"        ctx \u003d context.RequestContext(user\u003duser, tenant\u003dtenant_id,"},{"line_number":157,"context_line":"                                     is_admin\u003dTrue)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        package \u003d db_api.package_get(service_id, ctx)"},{"line_number":160,"context_line":"        LOG.debug(\u0027Adding service {name}\u0027.format(name\u003dpackage.name))"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_bd877511","line":157,"in_reply_to":"da20952f_57adda2f","updated":"2015-09-02 11:43:14.000000000","message":"Done","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":13962,"name":"Victor Ryzhenkin","email":"vryzhenkin@mirantis.com","username":"vryzhenkin"},"change_message_id":"271f61e66cfb3517789dfcd38ffa407109fa9cd5","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        try:"},{"line_number":200,"context_line":"            session_id \u003d create_session(m_cli, environment_id)"},{"line_number":201,"context_line":"        except Exception:"},{"line_number":202,"context_line":"            return {}"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        m_cli.services.delete(environment_id, \u0027/\u0027 + service_id, session_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_bc3b1738","line":201,"updated":"2015-09-01 21:20:49.000000000","message":"LOG it, please!","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"1b8c1216c3291e09bb01863afa286cf71f1aebb0","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        try:"},{"line_number":200,"context_line":"            session_id \u003d create_session(m_cli, environment_id)"},{"line_number":201,"context_line":"        except Exception:"},{"line_number":202,"context_line":"            return {}"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        m_cli.services.delete(environment_id, \u0027/\u0027 + service_id, session_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_c94cef78","line":201,"in_reply_to":"da20952f_bc3b1738","updated":"2015-09-02 11:43:14.000000000","message":"good catch. this place should be rewrited. I forgot about it.","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":13962,"name":"Victor Ryzhenkin","email":"vryzhenkin@mirantis.com","username":"vryzhenkin"},"change_message_id":"271f61e66cfb3517789dfcd38ffa407109fa9cd5","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        murano_host\u003dCONF.bind_host, murano_port\u003dCONF.bind_port)"},{"line_number":218,"context_line":"    insecure \u003d False"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    LOG.debug(\u0027Murano::Client \u003cUrl: {endpoint}, TokenId: {token_id}\u003e\u0027.format("},{"line_number":221,"context_line":"        endpoint\u003dendpoint, token_id\u003dtoken_id))"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    return client.Client(1, endpoint\u003dendpoint, token\u003dtoken_id,"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_7645a0b1","line":220,"updated":"2015-09-01 21:20:49.000000000","message":"It\u0027s really good idea to log token_id?","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"1b8c1216c3291e09bb01863afa286cf71f1aebb0","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        murano_host\u003dCONF.bind_host, murano_port\u003dCONF.bind_port)"},{"line_number":218,"context_line":"    insecure \u003d False"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    LOG.debug(\u0027Murano::Client \u003cUrl: {endpoint}, TokenId: {token_id}\u003e\u0027.format("},{"line_number":221,"context_line":"        endpoint\u003dendpoint, token_id\u003dtoken_id))"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    return client.Client(1, endpoint\u003dendpoint, token\u003dtoken_id,"}],"source_content_type":"text/x-python","patch_set":22,"id":"da20952f_4913ff5c","line":220,"in_reply_to":"da20952f_7645a0b1","updated":"2015-09-02 11:43:14.000000000","message":"good catch, thx.","commit_id":"c077a84aa57f0b92552368e0c6c5e19b1243e293"}],"murano/api/v1/cloudfoundry/router.py":[{"author":{"_account_id":7549,"name":"Ekaterina Chernova","email":"katyafervent@yandex.ru","username":"efedorova"},"change_message_id":"5cb6ac59cec1950114af1f16a2b254cf1f7a8062","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Copyright (c) 2013 Mirantis, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_da7513cb","line":1,"updated":"2015-08-26 10:37:04.000000000","message":"fix year please","commit_id":"238e59350fe3891ed7731275e7cce0efb35fdc5c"}],"murano/cmd/cfapi.py":[{"author":{"_account_id":7549,"name":"Ekaterina Chernova","email":"katyafervent@yandex.ru","username":"efedorova"},"change_message_id":"86c10e2bfc7f266a50f3f3b19619aa3aad17a008","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        launcher.launch_service(server.get_rpc_service())"},{"line_number":67,"context_line":"        launcher.launch_service(server.get_notification_service())"},{"line_number":68,"context_line":"        launcher.launch_service(stats.StatsCollectingService())"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        launcher.wait()"},{"line_number":71,"context_line":"    except RuntimeError as e:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a4dcd0f_96960293","line":68,"updated":"2015-08-10 13:30:43.000000000","message":"does it work ok here?\nare you sure wee need it?","commit_id":"332a440a4b48c9dce2c05a8a3a9b85d7a2cc81c9"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"abf04a1627bcdd05e1b8fa04cec184f1cd7aab46","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        launcher.launch_service(server.get_rpc_service())"},{"line_number":67,"context_line":"        launcher.launch_service(server.get_notification_service())"},{"line_number":68,"context_line":"        launcher.launch_service(stats.StatsCollectingService())"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        launcher.wait()"},{"line_number":71,"context_line":"    except RuntimeError as e:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a4dcd0f_ed96f53c","line":68,"in_reply_to":"1a4dcd0f_96960293","updated":"2015-08-13 06:00:25.000000000","message":"I\u0027m not sure. I work on more detailed tests now.","commit_id":"332a440a4b48c9dce2c05a8a3a9b85d7a2cc81c9"}],"murano/db/models.py":[{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"afa3a5e2032c9b6b3d03e0cd0cf90d42be9ab3eb","unresolved":false,"context_lines":[{"line_number":329,"context_line":"class CFSpace(Base):"},{"line_number":330,"context_line":"    __tablename__ \u003d \"cf_spaces\""},{"line_number":331,"context_line":"    id \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"},{"line_number":332,"context_line":"    env_id \u003d sa.Column(sa.String(255), sa.ForeignKey(\u0027environment.id\u0027),"},{"line_number":333,"context_line":"                       nullable\u003dFalse)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def to_dict(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_15a431a4","line":332,"updated":"2015-08-18 12:42:49.000000000","message":"Let\u0027s maybe spell it as environment_id? We have it like that at Session and Task tables","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"432fdef88a2b7efabc6df5c259e7e865e0ef0ee7","unresolved":false,"context_lines":[{"line_number":329,"context_line":"class CFSpace(Base):"},{"line_number":330,"context_line":"    __tablename__ \u003d \"cf_spaces\""},{"line_number":331,"context_line":"    id \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"},{"line_number":332,"context_line":"    env_id \u003d sa.Column(sa.String(255), sa.ForeignKey(\u0027environment.id\u0027),"},{"line_number":333,"context_line":"                       nullable\u003dFalse)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def to_dict(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_3575b5ca","line":332,"in_reply_to":"fa1b9901_15a431a4","updated":"2015-08-18 12:50:36.000000000","message":"yeap, will fix it.","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"faf34ad09cab6c0a9f2e9dbc91c11822c890be97","unresolved":false,"context_lines":[{"line_number":351,"context_line":"    \"\"\"Creates database tables for all models with the given engine.\"\"\""},{"line_number":352,"context_line":"    models \u003d (Environment, Status, Session, Task,"},{"line_number":353,"context_line":"              ApiStats, Package, Category, Class, Instance, Lock, CFSpace,"},{"line_number":354,"context_line":"              CFOrganization)"},{"line_number":355,"context_line":"    for model in models:"},{"line_number":356,"context_line":"        model.metadata.create_all(engine)"},{"line_number":357,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_506e37ca","line":354,"updated":"2015-08-18 12:54:07.000000000","message":"nb: need to add CFServiceInstance here","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"},{"author":{"_account_id":7535,"name":"Nikolay Starodubtsev","email":"starodubcevna@gmail.com","username":"Kezar"},"change_message_id":"faf34ad09cab6c0a9f2e9dbc91c11822c890be97","unresolved":false,"context_lines":[{"line_number":360,"context_line":"    \"\"\"Drops database tables for all models with the given engine.\"\"\""},{"line_number":361,"context_line":"    models \u003d (Environment, Status, Session, Task,"},{"line_number":362,"context_line":"              ApiStats, Package, Category, Class, Lock, CFOrganization,"},{"line_number":363,"context_line":"              CFSpace)"},{"line_number":364,"context_line":"    for model in models:"},{"line_number":365,"context_line":"        model.metadata.drop_all(engine)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_10699fbe","line":363,"updated":"2015-08-18 12:54:07.000000000","message":"and here","commit_id":"e118df6131b94b76af4a8ba513f6fb242ad2b23d"}],"tox.ini":[{"author":{"_account_id":7549,"name":"Ekaterina Chernova","email":"katyafervent@yandex.ru","username":"efedorova"},"change_message_id":"5cb6ac59cec1950114af1f16a2b254cf1f7a8062","unresolved":false,"context_lines":[{"line_number":22,"context_line":"commands \u003d {posargs}"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"[testenv:cover]"},{"line_number":25,"context_line":"commands \u003d"},{"line_number":26,"context_line":"    {toxinidir}/tools/cover.sh {posargs}"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"[testenv:docs]"}],"source_content_type":"text/x-properties","patch_set":20,"id":"fa1b9901_372c6801","line":25,"updated":"2015-08-26 10:37:04.000000000","message":"this change is not connected to the commit, please remove","commit_id":"238e59350fe3891ed7731275e7cce0efb35fdc5c"}]}
