)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"207c4a51896bfb91570fe758c71c1c76b47e9172","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Dave Chen \u003cwei.d.chen@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-01-04 22:25:10 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Skip endpoints which is not available {WIP}"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the token is domain-scoped, there is no need to provide project"},{"line_number":10,"context_line":"id, skip these endpoints which under the hood of project to give a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a961159_ba2e7840","line":7,"updated":"2015-01-05 17:13:46.000000000","message":"Could remove {WIP} and use Workflow -1 in the review.","commit_id":"0d5e5d2871ae81051ce5bee580bcea0a241ece45"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"38576348ee11a0fc30fcffb7b89043b921693556","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Dave Chen \u003cwei.d.chen@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-01-04 22:25:10 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Skip endpoints which is not available {WIP}"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the token is domain-scoped, there is no need to provide project"},{"line_number":10,"context_line":"id, skip these endpoints which under the hood of project to give a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a961159_2096804c","line":7,"in_reply_to":"3a961159_ba2e7840","updated":"2015-01-08 03:40:19.000000000","message":"Lance, thanks for the sharing.","commit_id":"0d5e5d2871ae81051ce5bee580bcea0a241ece45"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"207c4a51896bfb91570fe758c71c1c76b47e9172","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Skip endpoints which is not available {WIP}"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the token is domain-scoped, there is no need to provide project"},{"line_number":10,"context_line":"id, skip these endpoints which under the hood of project to give a"},{"line_number":11,"context_line":"more clear output of catalog."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"TODO:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a961159_9ad29c32","line":10,"updated":"2015-01-05 17:13:46.000000000","message":"nit: Skip these endpoints to give a cleaner representation of the catalog. \n\nOr something along those lines.","commit_id":"0d5e5d2871ae81051ce5bee580bcea0a241ece45"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"38576348ee11a0fc30fcffb7b89043b921693556","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Skip endpoints which is not available {WIP}"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the token is domain-scoped, there is no need to provide project"},{"line_number":10,"context_line":"id, skip these endpoints which under the hood of project to give a"},{"line_number":11,"context_line":"more clear output of catalog."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"TODO:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a961159_4091cc50","line":10,"in_reply_to":"3a961159_9ad29c32","updated":"2015-01-08 03:40:19.000000000","message":"Done","commit_id":"0d5e5d2871ae81051ce5bee580bcea0a241ece45"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"207c4a51896bfb91570fe758c71c1c76b47e9172","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"TODO:"},{"line_number":14,"context_line":"1. check the KVS provider"},{"line_number":15,"context_line":"2. need testcase"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I3617a2509bfc4213f136b5c867c40d478a70ded8"},{"line_number":18,"context_line":"Closes-Bug: #1261468"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a961159_0b5d8048","line":15,"updated":"2015-01-05 17:13:46.000000000","message":"Suggest pull these out of the commit message and just specifying these work items in the Workflow -1 comment.","commit_id":"0d5e5d2871ae81051ce5bee580bcea0a241ece45"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"38576348ee11a0fc30fcffb7b89043b921693556","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"TODO:"},{"line_number":14,"context_line":"1. check the KVS provider"},{"line_number":15,"context_line":"2. need testcase"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I3617a2509bfc4213f136b5c867c40d478a70ded8"},{"line_number":18,"context_line":"Closes-Bug: #1261468"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a961159_e07f1815","line":15,"in_reply_to":"3a961159_0b5d8048","updated":"2015-01-08 03:40:19.000000000","message":"yes, thanks for the sharing.","commit_id":"0d5e5d2871ae81051ce5bee580bcea0a241ece45"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f1dc95faeac925aceac8ea0cd10e298d3359c4c4","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Dave Chen \u003cwei.d.chen@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-03-23 22:19:49 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Skip endpoints which is not available"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the token is domain-scoped, there is no need to provide project"},{"line_number":10,"context_line":"id, skip these endpoints to give a cleaner representation of the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"1a6ced46_10742e98","line":7,"updated":"2015-03-23 14:50:01.000000000","message":"Perhaps a better title might be:\nSkip irrelevant catalog endpoints for domain scoped tokens","commit_id":"9870dc9e7802b96134b62d33b08d84777030930b"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"eed7f4125388e7cc9125ebe033ed0a3d4b45fd5b","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Dave Chen \u003cwei.d.chen@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-03-23 22:19:49 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Skip endpoints which is not available"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the token is domain-scoped, there is no need to provide project"},{"line_number":10,"context_line":"id, skip these endpoints to give a cleaner representation of the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"1a6ced46_b4ac09a2","line":7,"in_reply_to":"1a6ced46_10742e98","updated":"2015-03-24 09:41:25.000000000","message":"Done","commit_id":"9870dc9e7802b96134b62d33b08d84777030930b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f1dc95faeac925aceac8ea0cd10e298d3359c4c4","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the token is domain-scoped, there is no need to provide project"},{"line_number":10,"context_line":"id, skip these endpoints to give a cleaner representation of the"},{"line_number":11,"context_line":"catalog."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I3617a2509bfc4213f136b5c867c40d478a70ded8"},{"line_number":14,"context_line":"Closes-Bug: #1261468"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"1a6ced46_30ddaa71","line":11,"updated":"2015-03-23 14:50:01.000000000","message":"Perhaps a better description might be:\nIf a token is domain-scoped, there is no project id defined. Hence for any catalog entries, we should skip any endpoints that need a project id in order to be formatted correctly.","commit_id":"9870dc9e7802b96134b62d33b08d84777030930b"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"eed7f4125388e7cc9125ebe033ed0a3d4b45fd5b","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the token is domain-scoped, there is no need to provide project"},{"line_number":10,"context_line":"id, skip these endpoints to give a cleaner representation of the"},{"line_number":11,"context_line":"catalog."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I3617a2509bfc4213f136b5c867c40d478a70ded8"},{"line_number":14,"context_line":"Closes-Bug: #1261468"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"1a6ced46_d4afc592","line":11,"in_reply_to":"1a6ced46_30ddaa71","updated":"2015-03-24 09:41:25.000000000","message":"Done","commit_id":"9870dc9e7802b96134b62d33b08d84777030930b"}],"keystone/catalog/backends/sql.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"98c8fd31c28a5e529dfffc44f5e2f9d53aacfd0b","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        def make_v3_service(svc):"},{"line_number":332,"context_line":"            # NOTE(davechen): In case we are trying to get the endpoint with"},{"line_number":333,"context_line":"            # SQL backends while project id is not provided, we should skip"},{"line_number":334,"context_line":"            # these endpoints as they are meaningless."},{"line_number":335,"context_line":"            # This happened when these are client-specific endpoints, there is"},{"line_number":336,"context_line":"            # no project id provided for the replacement of \u0027tenant_id\u0027."}],"source_content_type":"text/x-python","patch_set":11,"id":"7a75e904_7503b273","line":333,"updated":"2015-03-21 11:00:19.000000000","message":"I don\u0027t think you nee the \"SQL backend\" bit here...the code is in the sql.py!","commit_id":"1667e4b33daf5d0bc915c71c624329aa6a12c521"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"1aa713ebd7d6265e53182937f739559c9e25ef3c","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        def make_v3_service(svc):"},{"line_number":332,"context_line":"            # NOTE(davechen): In case we are trying to get the endpoint with"},{"line_number":333,"context_line":"            # SQL backends while project id is not provided, we should skip"},{"line_number":334,"context_line":"            # these endpoints as they are meaningless."},{"line_number":335,"context_line":"            # This happened when these are client-specific endpoints, there is"},{"line_number":336,"context_line":"            # no project id provided for the replacement of \u0027tenant_id\u0027."}],"source_content_type":"text/x-python","patch_set":11,"id":"7a75e904_15319e0b","line":333,"in_reply_to":"7a75e904_7503b273","updated":"2015-03-21 12:35:44.000000000","message":"Done","commit_id":"1667e4b33daf5d0bc915c71c624329aa6a12c521"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"98c8fd31c28a5e529dfffc44f5e2f9d53aacfd0b","unresolved":false,"context_lines":[{"line_number":332,"context_line":"            # NOTE(davechen): In case we are trying to get the endpoint with"},{"line_number":333,"context_line":"            # SQL backends while project id is not provided, we should skip"},{"line_number":334,"context_line":"            # these endpoints as they are meaningless."},{"line_number":335,"context_line":"            # This happened when these are client-specific endpoints, there is"},{"line_number":336,"context_line":"            # no project id provided for the replacement of \u0027tenant_id\u0027."},{"line_number":337,"context_line":"            # So the \u0027tenant_id\u0027 is replaced by \u0027None\u0027 make the endpoint"},{"line_number":338,"context_line":"            # is invalid."}],"source_content_type":"text/x-python","patch_set":11,"id":"7a75e904_95f74e8c","line":335,"updated":"2015-03-21 11:00:19.000000000","message":"suggest replacing:\n\nThis happened when these are client-specific endpoints, there is\n\nwith\n\nThis can happen when these are client-specific endpoints, and there is","commit_id":"1667e4b33daf5d0bc915c71c624329aa6a12c521"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"1aa713ebd7d6265e53182937f739559c9e25ef3c","unresolved":false,"context_lines":[{"line_number":332,"context_line":"            # NOTE(davechen): In case we are trying to get the endpoint with"},{"line_number":333,"context_line":"            # SQL backends while project id is not provided, we should skip"},{"line_number":334,"context_line":"            # these endpoints as they are meaningless."},{"line_number":335,"context_line":"            # This happened when these are client-specific endpoints, there is"},{"line_number":336,"context_line":"            # no project id provided for the replacement of \u0027tenant_id\u0027."},{"line_number":337,"context_line":"            # So the \u0027tenant_id\u0027 is replaced by \u0027None\u0027 make the endpoint"},{"line_number":338,"context_line":"            # is invalid."}],"source_content_type":"text/x-python","patch_set":11,"id":"7a75e904_35369a04","line":335,"in_reply_to":"7a75e904_95f74e8c","updated":"2015-03-21 12:35:44.000000000","message":"Done","commit_id":"1667e4b33daf5d0bc915c71c624329aa6a12c521"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"98c8fd31c28a5e529dfffc44f5e2f9d53aacfd0b","unresolved":false,"context_lines":[{"line_number":334,"context_line":"            # these endpoints as they are meaningless."},{"line_number":335,"context_line":"            # This happened when these are client-specific endpoints, there is"},{"line_number":336,"context_line":"            # no project id provided for the replacement of \u0027tenant_id\u0027."},{"line_number":337,"context_line":"            # So the \u0027tenant_id\u0027 is replaced by \u0027None\u0027 make the endpoint"},{"line_number":338,"context_line":"            # is invalid."},{"line_number":339,"context_line":"            patterns \u003d [\u0027$(tenant_id)s\u0027, \u0027%(tenant_id)s\u0027]"},{"line_number":340,"context_line":"            if not tenant_id:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a75e904_f5eec2b3","line":337,"updated":"2015-03-21 11:00:19.000000000","message":"I\u0027m not sure I understand this last sentance...","commit_id":"1667e4b33daf5d0bc915c71c624329aa6a12c521"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"1aa713ebd7d6265e53182937f739559c9e25ef3c","unresolved":false,"context_lines":[{"line_number":334,"context_line":"            # these endpoints as they are meaningless."},{"line_number":335,"context_line":"            # This happened when these are client-specific endpoints, there is"},{"line_number":336,"context_line":"            # no project id provided for the replacement of \u0027tenant_id\u0027."},{"line_number":337,"context_line":"            # So the \u0027tenant_id\u0027 is replaced by \u0027None\u0027 make the endpoint"},{"line_number":338,"context_line":"            # is invalid."},{"line_number":339,"context_line":"            patterns \u003d [\u0027$(tenant_id)s\u0027, \u0027%(tenant_id)s\u0027]"},{"line_number":340,"context_line":"            if not tenant_id:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a75e904_75401257","line":337,"in_reply_to":"7a75e904_f5eec2b3","updated":"2015-03-21 12:35:44.000000000","message":"Done","commit_id":"1667e4b33daf5d0bc915c71c624329aa6a12c521"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"656c97c17a5b4062ab981f04e857030ee13023b7","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        def make_v3_service(svc):"},{"line_number":344,"context_line":"            # NOTE(davechen): In case we are trying to get the endpoint while"},{"line_number":345,"context_line":"            # project id is not provided, we should skip these endpoints as"},{"line_number":346,"context_line":"            # they are meaningless."},{"line_number":347,"context_line":"            # This can happen when these are client-specific endpoints, and"},{"line_number":348,"context_line":"            # there is no project id provided for the replacement of"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a6ced46_781d5b73","line":345,"updated":"2015-03-23 08:12:35.000000000","message":"Should we notify this \"skip\" in the log file?","commit_id":"c3d73f5ce3a459a9db2e552b7e40274987a5fd03"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2f17fa4e3a4896d1b6b28701bb8712255139b4c0","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        def make_v3_service(svc):"},{"line_number":344,"context_line":"            # NOTE(davechen): In case we are trying to get the endpoint while"},{"line_number":345,"context_line":"            # project id is not provided, we should skip these endpoints as"},{"line_number":346,"context_line":"            # they are meaningless."},{"line_number":347,"context_line":"            # This can happen when these are client-specific endpoints, and"},{"line_number":348,"context_line":"            # there is no project id provided for the replacement of"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a6ced46_12ad1b32","line":345,"in_reply_to":"1a6ced46_781d5b73","updated":"2015-03-23 12:29:07.000000000","message":"I don\u0027t think so...there would be a LOT of log messages...although open to suggestions from others...","commit_id":"c3d73f5ce3a459a9db2e552b7e40274987a5fd03"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d90d06f53d601edd6623b555d9cbc839eaff8f84","unresolved":false,"context_lines":[{"line_number":268,"context_line":"            ref.extra \u003d new_endpoint.extra"},{"line_number":269,"context_line":"        return ref.to_dict()"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def get_catalog(self, user_id, tenant_id):"},{"line_number":272,"context_line":"        substitutions \u003d dict("},{"line_number":273,"context_line":"            itertools.chain(six.iteritems(CONF),"},{"line_number":274,"context_line":"                            six.iteritems(CONF.eventlet_server)))"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a6ced46_2a6352dd","line":271,"updated":"2015-03-24 10:21:04.000000000","message":"I would add a doc string that explains that tenant_id could be None, in which case we\u0027ll not include any endpoints in the catalog (or a whole service if there are no valid endpoints)","commit_id":"a6a7f6fd93ef40b613b5cc0983b7d4ff5bf7ee61"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9c804cf27c8ea4577ec5d41595a3b3fd2aee7d68","unresolved":false,"context_lines":[{"line_number":268,"context_line":"            ref.extra \u003d new_endpoint.extra"},{"line_number":269,"context_line":"        return ref.to_dict()"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def get_catalog(self, user_id, tenant_id):"},{"line_number":272,"context_line":"        substitutions \u003d dict("},{"line_number":273,"context_line":"            itertools.chain(six.iteritems(CONF),"},{"line_number":274,"context_line":"                            six.iteritems(CONF.eventlet_server)))"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a6ced46_4c3c21e3","line":271,"in_reply_to":"1a6ced46_2a6352dd","updated":"2015-03-24 15:03:27.000000000","message":"Done","commit_id":"a6a7f6fd93ef40b613b5cc0983b7d4ff5bf7ee61"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e8ad55731c209e2c830c878b7586a1a0e30ccf2","unresolved":false,"context_lines":[{"line_number":291,"context_line":"                continue"},{"line_number":292,"context_line":"            try:"},{"line_number":293,"context_line":"                url \u003d core.format_url(endpoint[\u0027url\u0027], substitutions,"},{"line_number":294,"context_line":"                                      allow_substitution_keyerror)"},{"line_number":295,"context_line":"            except exception.MalformedEndpoint:"},{"line_number":296,"context_line":"                continue  # this failure is already logged in format_url()"},{"line_number":297,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a6ced46_e01a3616","line":294,"updated":"2015-03-24 13:06:52.000000000","message":"allow_substitution_keyerror should be passed as a keyword argument, since it\u0027s referenced that way in the method signature.","commit_id":"a6a7f6fd93ef40b613b5cc0983b7d4ff5bf7ee61"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9c804cf27c8ea4577ec5d41595a3b3fd2aee7d68","unresolved":false,"context_lines":[{"line_number":291,"context_line":"                continue"},{"line_number":292,"context_line":"            try:"},{"line_number":293,"context_line":"                url \u003d core.format_url(endpoint[\u0027url\u0027], substitutions,"},{"line_number":294,"context_line":"                                      allow_substitution_keyerror)"},{"line_number":295,"context_line":"            except exception.MalformedEndpoint:"},{"line_number":296,"context_line":"                continue  # this failure is already logged in format_url()"},{"line_number":297,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a6ced46_f71596e5","line":294,"in_reply_to":"1a6ced46_e01a3616","updated":"2015-03-24 15:03:27.000000000","message":"Done","commit_id":"a6a7f6fd93ef40b613b5cc0983b7d4ff5bf7ee61"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9641c9553a71ef23345ba2993987d81a2882753b","unresolved":false,"context_lines":[{"line_number":291,"context_line":"                continue"},{"line_number":292,"context_line":"            try:"},{"line_number":293,"context_line":"                url \u003d core.format_url(endpoint[\u0027url\u0027], substitutions,"},{"line_number":294,"context_line":"                                      allow_substitution_keyerror)"},{"line_number":295,"context_line":"            except exception.MalformedEndpoint:"},{"line_number":296,"context_line":"                continue  # this failure is already logged in format_url()"},{"line_number":297,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a6ced46_63cbb0a5","line":294,"in_reply_to":"1a6ced46_e01a3616","updated":"2015-03-24 13:23:43.000000000","message":"Yep, quite right...that was my bad.","commit_id":"a6a7f6fd93ef40b613b5cc0983b7d4ff5bf7ee61"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d90d06f53d601edd6623b555d9cbc839eaff8f84","unresolved":false,"context_lines":[{"line_number":309,"context_line":""},{"line_number":310,"context_line":"        return catalog"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    def get_v3_catalog(self, user_id, tenant_id):"},{"line_number":313,"context_line":"        d \u003d dict("},{"line_number":314,"context_line":"            itertools.chain(six.iteritems(CONF),"},{"line_number":315,"context_line":"                            six.iteritems(CONF.eventlet_server)))"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a6ced46_8a9fe6b3","line":312,"updated":"2015-03-24 10:21:04.000000000","message":"add a similar doc string..","commit_id":"a6a7f6fd93ef40b613b5cc0983b7d4ff5bf7ee61"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9c804cf27c8ea4577ec5d41595a3b3fd2aee7d68","unresolved":false,"context_lines":[{"line_number":309,"context_line":""},{"line_number":310,"context_line":"        return catalog"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    def get_v3_catalog(self, user_id, tenant_id):"},{"line_number":313,"context_line":"        d \u003d dict("},{"line_number":314,"context_line":"            itertools.chain(six.iteritems(CONF),"},{"line_number":315,"context_line":"                            six.iteritems(CONF.eventlet_server)))"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a6ced46_57a66a11","line":312,"in_reply_to":"1a6ced46_8a9fe6b3","updated":"2015-03-24 15:03:27.000000000","message":"Done","commit_id":"a6a7f6fd93ef40b613b5cc0983b7d4ff5bf7ee61"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e8ad55731c209e2c830c878b7586a1a0e30ccf2","unresolved":false,"context_lines":[{"line_number":333,"context_line":"                endpoint[\u0027region\u0027] \u003d endpoint[\u0027region_id\u0027]"},{"line_number":334,"context_line":"                try:"},{"line_number":335,"context_line":"                    endpoint[\u0027url\u0027] \u003d core.format_url("},{"line_number":336,"context_line":"                        endpoint[\u0027url\u0027], d, allow_substitution_keyerror)"},{"line_number":337,"context_line":"                except exception.MalformedEndpoint:"},{"line_number":338,"context_line":"                    continue  # this failure is already logged in format_url()"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a6ced46_e0f156ce","line":336,"updated":"2015-03-24 13:06:52.000000000","message":"same comment here as above.","commit_id":"a6a7f6fd93ef40b613b5cc0983b7d4ff5bf7ee61"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9c804cf27c8ea4577ec5d41595a3b3fd2aee7d68","unresolved":false,"context_lines":[{"line_number":333,"context_line":"                endpoint[\u0027region\u0027] \u003d endpoint[\u0027region_id\u0027]"},{"line_number":334,"context_line":"                try:"},{"line_number":335,"context_line":"                    endpoint[\u0027url\u0027] \u003d core.format_url("},{"line_number":336,"context_line":"                        endpoint[\u0027url\u0027], d, allow_substitution_keyerror)"},{"line_number":337,"context_line":"                except exception.MalformedEndpoint:"},{"line_number":338,"context_line":"                    continue  # this failure is already logged in format_url()"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a6ced46_17a232ae","line":336,"in_reply_to":"1a6ced46_e0f156ce","updated":"2015-03-24 15:03:27.000000000","message":"Done","commit_id":"a6a7f6fd93ef40b613b5cc0983b7d4ff5bf7ee61"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0b63d2e6f5a6b720df9b213c8589a1fc394eca1f","unresolved":false,"context_lines":[{"line_number":275,"context_line":"            authenticated for creating service catalog."},{"line_number":276,"context_line":"        :param unicode string tenant_id: The id of project. \u0027tenant_id\u0027 will"},{"line_number":277,"context_line":"            be None in the case this being called to create a catalog to go"},{"line_number":278,"context_line":"            in a domain scoped token, this will lead to invalid URL in the"},{"line_number":279,"context_line":"            endpoint, we will skip these endpoints or the whole service"},{"line_number":280,"context_line":"            if there are no valid endpoints."},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"1a6ced46_7521999e","line":278,"updated":"2015-03-24 16:25:37.000000000","message":"nit: Maybe a bit more descriptive might be:\n\n...in a domain scoped token. In this case, any endpoints that require a tenant_id as part of their URL will be skipped (as would a whole service if, as a consequence, it has no valid endpoints).","commit_id":"fe0ae1698ce4057b14fd0a52545409112bc4030f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a4135dfd86fb69586671c9d4fc6d9b94d397913e","unresolved":false,"context_lines":[{"line_number":275,"context_line":"            authenticated for creating service catalog."},{"line_number":276,"context_line":"        :param unicode string tenant_id: The id of project. \u0027tenant_id\u0027 will"},{"line_number":277,"context_line":"            be None in the case this being called to create a catalog to go"},{"line_number":278,"context_line":"            in a domain scoped token, this will lead to invalid URL in the"},{"line_number":279,"context_line":"            endpoint, we will skip these endpoints or the whole service"},{"line_number":280,"context_line":"            if there are no valid endpoints."},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"1a6ced46_304c7842","line":278,"in_reply_to":"1a6ced46_7521999e","updated":"2015-03-25 03:49:14.000000000","message":"Done","commit_id":"fe0ae1698ce4057b14fd0a52545409112bc4030f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0b63d2e6f5a6b720df9b213c8589a1fc394eca1f","unresolved":false,"context_lines":[{"line_number":336,"context_line":"            be None in the case this being called to create a catalog to go"},{"line_number":337,"context_line":"            in a domain scoped token, this will lead to invalid URL in the"},{"line_number":338,"context_line":"            endpoint, we will skip these endpoints or the whole service"},{"line_number":339,"context_line":"            if there are no valid endpoints."},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        :returns: A list representing the service catalog or an empty list"},{"line_number":342,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"1a6ced46_355f21e7","line":339,"updated":"2015-03-24 16:25:37.000000000","message":"hmm...actually I\u0027m not sure the second part is true in this case...I think we will, as the code stands, return an \"empty\" service...not sure if we should fix this or not....","commit_id":"fe0ae1698ce4057b14fd0a52545409112bc4030f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a4135dfd86fb69586671c9d4fc6d9b94d397913e","unresolved":false,"context_lines":[{"line_number":336,"context_line":"            be None in the case this being called to create a catalog to go"},{"line_number":337,"context_line":"            in a domain scoped token, this will lead to invalid URL in the"},{"line_number":338,"context_line":"            endpoint, we will skip these endpoints or the whole service"},{"line_number":339,"context_line":"            if there are no valid endpoints."},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        :returns: A list representing the service catalog or an empty list"},{"line_number":342,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"1a6ced46_50e3b404","line":339,"in_reply_to":"1a6ced46_355f21e7","updated":"2015-03-25 03:49:14.000000000","message":"Not sure either, but maybe this will also impact the previous logic if we do in that way, any service with \"MalformedEndpoint\" should also keep such an \"empty\" service? or there is a big difference if we are talking about client-specific endpoint?\n\nLet\u0027s open this to others.\n\nThanks.","commit_id":"fe0ae1698ce4057b14fd0a52545409112bc4030f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2a4719563557e46d5b57ff0682f147f6dc2448f9","unresolved":false,"context_lines":[{"line_number":334,"context_line":"            be None in the case this being called to create a catalog to go"},{"line_number":335,"context_line":"            in a domain scoped token. In this case, any endpoint that requires"},{"line_number":336,"context_line":"            a tenant_id as part of their URL will be skipped (as would a whole"},{"line_number":337,"context_line":"            service if, as a consequence, it has no valid endpoints)."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        :returns: A list representing the service catalog or an empty list"},{"line_number":340,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1a6ced46_14e847e1","line":337,"updated":"2015-03-25 10:16:07.000000000","message":"So as previously discussed, in this v3 sql method, the service will still be included even with no endpoints (unlike the v2 or generic v3 methods).  I think this is actually a bug - the catalog is not a generalised service discovery mechanism, it\u0027s an \"endpoints that are accessible for the scope of my token\" discovery mechanism. So I think you should:\n\n 1) Change this comment to remove the bit about the service\n 2) Raise a separate bug saying that in circumstances that there are no valid endpoints, the service should also not be enumerated (this will let others debate this point separately)\n 3) Add a separate TODO comment in the make_v3_service method below saying that a bug has been raised about this","commit_id":"c45b249edf4635aed914c386325b7adc8a886c38"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7d0fa52e3566bb221b6f521c3fe70156019f4f9f","unresolved":false,"context_lines":[{"line_number":334,"context_line":"            be None in the case this being called to create a catalog to go"},{"line_number":335,"context_line":"            in a domain scoped token. In this case, any endpoint that requires"},{"line_number":336,"context_line":"            a tenant_id as part of their URL will be skipped (as would a whole"},{"line_number":337,"context_line":"            service if, as a consequence, it has no valid endpoints)."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        :returns: A list representing the service catalog or an empty list"},{"line_number":340,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1a6ced46_e39ca96c","line":337,"in_reply_to":"1a6ced46_14e847e1","updated":"2015-03-26 07:21:17.000000000","message":"Done","commit_id":"c45b249edf4635aed914c386325b7adc8a886c38"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":271,"context_line":"    def get_catalog(self, user_id, tenant_id):"},{"line_number":272,"context_line":"        \"\"\"Retrieve and format the V2 service catalog."},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        :param unicode string user_id: The id of user who has been"},{"line_number":275,"context_line":"            authenticated for creating service catalog."},{"line_number":276,"context_line":"        :param unicode string tenant_id: The id of project. \u0027tenant_id\u0027 will"},{"line_number":277,"context_line":"            be None in the case this being called to create a catalog to go"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_905f2b0e","line":274,"updated":"2015-03-27 01:12:51.000000000","message":"this doesn\u0027t format correctly due to the space in the type, the type needs to be on a separate line in this case:\n\n :type user_id: unicode string\n\nalso, change \"of user\" to \"of the user\"","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":271,"context_line":"    def get_catalog(self, user_id, tenant_id):"},{"line_number":272,"context_line":"        \"\"\"Retrieve and format the V2 service catalog."},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        :param unicode string user_id: The id of user who has been"},{"line_number":275,"context_line":"            authenticated for creating service catalog."},{"line_number":276,"context_line":"        :param unicode string tenant_id: The id of project. \u0027tenant_id\u0027 will"},{"line_number":277,"context_line":"            be None in the case this being called to create a catalog to go"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_14789dc3","line":274,"in_reply_to":"fa963961_905f2b0e","updated":"2015-03-27 14:56:30.000000000","message":"\"unicode string\" looks strange and makes the format ugly, so I think we can remove it as this is not mandatory.","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        :param unicode string user_id: The id of user who has been"},{"line_number":275,"context_line":"            authenticated for creating service catalog."},{"line_number":276,"context_line":"        :param unicode string tenant_id: The id of project. \u0027tenant_id\u0027 will"},{"line_number":277,"context_line":"            be None in the case this being called to create a catalog to go"},{"line_number":278,"context_line":"            in a domain scoped token. In this case, any endpoint that requires"},{"line_number":279,"context_line":"            a tenant_id as part of their URL will be skipped (as would a whole"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_709b87ca","line":276,"updated":"2015-03-27 01:12:51.000000000","message":"same here\n\nchange \"of project\" to \"of the project\"","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        :param unicode string user_id: The id of user who has been"},{"line_number":275,"context_line":"            authenticated for creating service catalog."},{"line_number":276,"context_line":"        :param unicode string tenant_id: The id of project. \u0027tenant_id\u0027 will"},{"line_number":277,"context_line":"            be None in the case this being called to create a catalog to go"},{"line_number":278,"context_line":"            in a domain scoped token. In this case, any endpoint that requires"},{"line_number":279,"context_line":"            a tenant_id as part of their URL will be skipped (as would a whole"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_8f4db674","line":276,"in_reply_to":"fa963961_709b87ca","updated":"2015-03-27 14:56:30.000000000","message":"Done","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":328,"context_line":"    def get_v3_catalog(self, user_id, tenant_id):"},{"line_number":329,"context_line":"        \"\"\"Retrieve and format the current V3 service catalog."},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        :param unicode string user_id: The id of user who has been"},{"line_number":332,"context_line":"            authenticated for creating service catalog."},{"line_number":333,"context_line":"        :param unicode string tenant_id: The id of project. \u0027tenant_id\u0027 will"},{"line_number":334,"context_line":"            be None in the case this being called to create a catalog to go"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_70826754","line":331,"updated":"2015-03-27 01:12:51.000000000","message":"similar comment here.","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":328,"context_line":"    def get_v3_catalog(self, user_id, tenant_id):"},{"line_number":329,"context_line":"        \"\"\"Retrieve and format the current V3 service catalog."},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        :param unicode string user_id: The id of user who has been"},{"line_number":332,"context_line":"            authenticated for creating service catalog."},{"line_number":333,"context_line":"        :param unicode string tenant_id: The id of project. \u0027tenant_id\u0027 will"},{"line_number":334,"context_line":"            be None in the case this being called to create a catalog to go"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_8fe9361d","line":331,"in_reply_to":"fa963961_70826754","updated":"2015-03-27 14:56:30.000000000","message":"Done","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        :param unicode string user_id: The id of user who has been"},{"line_number":332,"context_line":"            authenticated for creating service catalog."},{"line_number":333,"context_line":"        :param unicode string tenant_id: The id of project. \u0027tenant_id\u0027 will"},{"line_number":334,"context_line":"            be None in the case this being called to create a catalog to go"},{"line_number":335,"context_line":"            in a domain scoped token. In this case, any endpoint that requires"},{"line_number":336,"context_line":"            a tenant_id as part of their URL will be skipped."}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_50876361","line":333,"updated":"2015-03-27 01:12:51.000000000","message":"similar comment here.","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        :param unicode string user_id: The id of user who has been"},{"line_number":332,"context_line":"            authenticated for creating service catalog."},{"line_number":333,"context_line":"        :param unicode string tenant_id: The id of project. \u0027tenant_id\u0027 will"},{"line_number":334,"context_line":"            be None in the case this being called to create a catalog to go"},{"line_number":335,"context_line":"            in a domain scoped token. In this case, any endpoint that requires"},{"line_number":336,"context_line":"            a tenant_id as part of their URL will be skipped."}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_6feef223","line":333,"in_reply_to":"fa963961_50876361","updated":"2015-03-27 14:56:30.000000000","message":"Done","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        d \u003d dict("},{"line_number":342,"context_line":"            itertools.chain(six.iteritems(CONF),"},{"line_number":343,"context_line":"                            six.iteritems(CONF.eventlet_server)))"},{"line_number":344,"context_line":"        d.update({\u0027user_id\u0027: user_id})"},{"line_number":345,"context_line":"        allow_substitution_keyerror \u003d []"},{"line_number":346,"context_line":"        if tenant_id:"},{"line_number":347,"context_line":"            d.update({\u0027tenant_id\u0027: tenant_id})"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_1081db4a","line":344,"updated":"2015-03-27 01:12:51.000000000","message":"should refactor this code first to remove the duplication.","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        d \u003d dict("},{"line_number":342,"context_line":"            itertools.chain(six.iteritems(CONF),"},{"line_number":343,"context_line":"                            six.iteritems(CONF.eventlet_server)))"},{"line_number":344,"context_line":"        d.update({\u0027user_id\u0027: user_id})"},{"line_number":345,"context_line":"        allow_substitution_keyerror \u003d []"},{"line_number":346,"context_line":"        if tenant_id:"},{"line_number":347,"context_line":"            d.update({\u0027tenant_id\u0027: tenant_id})"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_0ffac6bd","line":344,"in_reply_to":"fa963961_1081db4a","updated":"2015-03-27 14:56:30.000000000","message":"Sorry Brant, I am not quite understand this comment.","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"7be47e558165cb7e11a307d5f7e86b798fd4c768","unresolved":false,"context_lines":[{"line_number":305,"context_line":"            if not endpoint.service[\u0027enabled\u0027]:"},{"line_number":306,"context_line":"                continue"},{"line_number":307,"context_line":"            try:"},{"line_number":308,"context_line":"                url \u003d core.format_url("},{"line_number":309,"context_line":"                    endpoint[\u0027url\u0027], substitutions,"},{"line_number":310,"context_line":"                    silent_keyerror_failures\u003dsilent_keyerror_failures)"},{"line_number":311,"context_line":"            except exception.MalformedEndpoint:"}],"source_content_type":"text/x-python","patch_set":23,"id":"da9b358b_e35b582d","line":308,"updated":"2015-03-29 17:59:29.000000000","message":"so since this no longer errors on tenant key error....doesn\u0027t that mean we are putting in endpoint below with url \u003d None?","commit_id":"718133fa16a6adc57c423bfb059edd7908d9669a"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"fe08c88a833c0ca732f7d8e2e127dcad8da4b32d","unresolved":false,"context_lines":[{"line_number":305,"context_line":"            if not endpoint.service[\u0027enabled\u0027]:"},{"line_number":306,"context_line":"                continue"},{"line_number":307,"context_line":"            try:"},{"line_number":308,"context_line":"                url \u003d core.format_url("},{"line_number":309,"context_line":"                    endpoint[\u0027url\u0027], substitutions,"},{"line_number":310,"context_line":"                    silent_keyerror_failures\u003dsilent_keyerror_failures)"},{"line_number":311,"context_line":"            except exception.MalformedEndpoint:"}],"source_content_type":"text/x-python","patch_set":23,"id":"da9b358b_a4ac36ee","line":308,"in_reply_to":"da9b358b_e35b582d","updated":"2015-03-30 01:49:26.000000000","message":"Henry, IIUC, the tenant ID is None can only happen in V3, it seems like in V3 API,\n\n- Get V3 catalog does not depend on V2 catalog when the backend is SQL, it retrieve the data from DB separately.\n\n- Get V3 catalog will generate the V3 catalog based on the V2 catalog, so we need filter None url.\n\nIf the above is correct, I am wonderring whether the change in \"mod: get_catalog(self, user_id, tenant_id)\" here is needed or not.","commit_id":"718133fa16a6adc57c423bfb059edd7908d9669a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"8eed4884397c1764ca08463f5cefbafeeaf35719","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"                yield endpoint"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"        # TODO(davechen) If there is service with no endpoints, we should skip"},{"line_number":374,"context_line":"        # the service instead of keeping it in the catalog, see bug #1436704."},{"line_number":375,"context_line":"        def make_v3_service(svc):"},{"line_number":376,"context_line":"            eps \u003d list(make_v3_endpoints(svc.endpoints))"}],"source_content_type":"text/x-python","patch_set":23,"id":"da9b358b_5bbb08c5","line":373,"updated":"2015-03-30 05:36:19.000000000","message":"nit: format this as:\n\n# TODO(davechen): If there...","commit_id":"718133fa16a6adc57c423bfb059edd7908d9669a"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a194af1ca7eb28dba440e5c6bfcb85a7de9a47c2","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"                yield endpoint"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"        # TODO(davechen) If there is service with no endpoints, we should skip"},{"line_number":374,"context_line":"        # the service instead of keeping it in the catalog, see bug #1436704."},{"line_number":375,"context_line":"        def make_v3_service(svc):"},{"line_number":376,"context_line":"            eps \u003d list(make_v3_endpoints(svc.endpoints))"}],"source_content_type":"text/x-python","patch_set":23,"id":"da9b358b_acee4f89","line":373,"in_reply_to":"da9b358b_5bbb08c5","updated":"2015-04-01 07:24:51.000000000","message":"Done","commit_id":"718133fa16a6adc57c423bfb059edd7908d9669a"}],"keystone/catalog/backends/templated.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d90d06f53d601edd6623b555d9cbc839eaff8f84","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            LOG.critical(_LC(\u0027Unable to open template file %s\u0027), template_file)"},{"line_number":107,"context_line":"            raise"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def get_catalog(self, user_id, tenant_id):"},{"line_number":110,"context_line":"        substitutions \u003d dict("},{"line_number":111,"context_line":"            itertools.chain(six.iteritems(CONF),"},{"line_number":112,"context_line":"                            six.iteritems(CONF.eventlet_server)))"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a6ced46_2aba7223","line":109,"updated":"2015-03-24 10:21:04.000000000","message":"...and maybe here...","commit_id":"a6a7f6fd93ef40b613b5cc0983b7d4ff5bf7ee61"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9c804cf27c8ea4577ec5d41595a3b3fd2aee7d68","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            LOG.critical(_LC(\u0027Unable to open template file %s\u0027), template_file)"},{"line_number":107,"context_line":"            raise"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def get_catalog(self, user_id, tenant_id):"},{"line_number":110,"context_line":"        substitutions \u003d dict("},{"line_number":111,"context_line":"            itertools.chain(six.iteritems(CONF),"},{"line_number":112,"context_line":"                            six.iteritems(CONF.eventlet_server)))"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a6ced46_17deb211","line":109,"in_reply_to":"1a6ced46_2aba7223","updated":"2015-03-24 15:03:27.000000000","message":"Done","commit_id":"a6a7f6fd93ef40b613b5cc0983b7d4ff5bf7ee61"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e8ad55731c209e2c830c878b7586a1a0e30ccf2","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                service_data \u003d {}"},{"line_number":125,"context_line":"                try:"},{"line_number":126,"context_line":"                    for k, v in six.iteritems(service_ref):"},{"line_number":127,"context_line":"                        service_data[k] \u003d core.format_url("},{"line_number":128,"context_line":"                            v, substitutions, allow_substitution_keyerror)"},{"line_number":129,"context_line":"                except exception.MalformedEndpoint:"},{"line_number":130,"context_line":"                    continue  # this failure is already logged in format_url()"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a6ced46_c0f45ad1","line":127,"updated":"2015-03-24 13:06:52.000000000","message":"allow_substitution_keyerror should be passed to the format_url method as a keyword argument since it\u0027s referenced that way in the format_url method signature.","commit_id":"a6a7f6fd93ef40b613b5cc0983b7d4ff5bf7ee61"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9c804cf27c8ea4577ec5d41595a3b3fd2aee7d68","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                service_data \u003d {}"},{"line_number":125,"context_line":"                try:"},{"line_number":126,"context_line":"                    for k, v in six.iteritems(service_ref):"},{"line_number":127,"context_line":"                        service_data[k] \u003d core.format_url("},{"line_number":128,"context_line":"                            v, substitutions, allow_substitution_keyerror)"},{"line_number":129,"context_line":"                except exception.MalformedEndpoint:"},{"line_number":130,"context_line":"                    continue  # this failure is already logged in format_url()"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a6ced46_b7595e5d","line":127,"in_reply_to":"1a6ced46_c0f45ad1","updated":"2015-03-24 15:03:27.000000000","message":"since the parameter exceed length limitation, just initialize the parameter instead.","commit_id":"a6a7f6fd93ef40b613b5cc0983b7d4ff5bf7ee61"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    def get_catalog(self, user_id, tenant_id):"},{"line_number":110,"context_line":"        \"\"\"Retrieve and format the V2 service catalog."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        :param unicode string user_id: The id of user who has been"},{"line_number":113,"context_line":"            authenticated for creating service catalog."},{"line_number":114,"context_line":"        :param unicode string tenant_id: The id of project. \u0027tenant_id\u0027 will"},{"line_number":115,"context_line":"            be None in the case this being called to create a catalog to go"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_70e9471a","line":112,"updated":"2015-03-27 01:12:51.000000000","message":"put type on separate line so it\u0027s formatted correctly.\n\nchange \"of user\" to \"of the user\"","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    def get_catalog(self, user_id, tenant_id):"},{"line_number":110,"context_line":"        \"\"\"Retrieve and format the V2 service catalog."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        :param unicode string user_id: The id of user who has been"},{"line_number":113,"context_line":"            authenticated for creating service catalog."},{"line_number":114,"context_line":"        :param unicode string tenant_id: The id of project. \u0027tenant_id\u0027 will"},{"line_number":115,"context_line":"            be None in the case this being called to create a catalog to go"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_afe2ba9d","line":112,"in_reply_to":"fa963961_70e9471a","updated":"2015-03-27 14:56:30.000000000","message":"Done","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        :param unicode string user_id: The id of user who has been"},{"line_number":113,"context_line":"            authenticated for creating service catalog."},{"line_number":114,"context_line":"        :param unicode string tenant_id: The id of project. \u0027tenant_id\u0027 will"},{"line_number":115,"context_line":"            be None in the case this being called to create a catalog to go"},{"line_number":116,"context_line":"            in a domain scoped token. In this case, any endpoint that requires"},{"line_number":117,"context_line":"            a tenant_id as part of their URL will be skipped (as would a whole"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_50ee4323","line":114,"updated":"2015-03-27 01:12:51.000000000","message":"same comment here.","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        :param unicode string user_id: The id of user who has been"},{"line_number":113,"context_line":"            authenticated for creating service catalog."},{"line_number":114,"context_line":"        :param unicode string tenant_id: The id of project. \u0027tenant_id\u0027 will"},{"line_number":115,"context_line":"            be None in the case this being called to create a catalog to go"},{"line_number":116,"context_line":"            in a domain scoped token. In this case, any endpoint that requires"},{"line_number":117,"context_line":"            a tenant_id as part of their URL will be skipped (as would a whole"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_8feed689","line":114,"in_reply_to":"fa963961_50ee4323","updated":"2015-03-27 14:56:30.000000000","message":"Done","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                service_data \u003d {}"},{"line_number":139,"context_line":"                try:"},{"line_number":140,"context_line":"                    for k, v in six.iteritems(service_ref):"},{"line_number":141,"context_line":"                        silent_keyerror_failures \u003d allow_substitution_keyerror"},{"line_number":142,"context_line":"                        service_data[k] \u003d core.format_url("},{"line_number":143,"context_line":"                            v, substitutions, silent_keyerror_failures)"},{"line_number":144,"context_line":"                except exception.MalformedEndpoint:"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_b0558fc7","line":141,"updated":"2015-03-27 01:12:51.000000000","message":"why alias the list? pick the right name to begin with.","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                service_data \u003d {}"},{"line_number":139,"context_line":"                try:"},{"line_number":140,"context_line":"                    for k, v in six.iteritems(service_ref):"},{"line_number":141,"context_line":"                        silent_keyerror_failures \u003d allow_substitution_keyerror"},{"line_number":142,"context_line":"                        service_data[k] \u003d core.format_url("},{"line_number":143,"context_line":"                            v, substitutions, silent_keyerror_failures)"},{"line_number":144,"context_line":"                except exception.MalformedEndpoint:"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_cf061e20","line":141,"in_reply_to":"fa963961_b0558fc7","updated":"2015-03-27 14:56:30.000000000","message":"Done","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                        service_data[k] \u003d core.format_url("},{"line_number":143,"context_line":"                            v, substitutions, silent_keyerror_failures)"},{"line_number":144,"context_line":"                except exception.MalformedEndpoint:"},{"line_number":145,"context_line":"                    continue  # this failure is already logged in format_url()"},{"line_number":146,"context_line":"                catalog[region][service] \u003d service_data"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        return catalog"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_500ac3d3","line":145,"updated":"2015-03-27 01:12:51.000000000","message":"this comment should be updated since it\u0027s not always a failure.\n\nIs it intentional that once a URL is found that doesn\u0027t match that all later URLs will be skipped? This doesn\u0027t seem correct.","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                        service_data[k] \u003d core.format_url("},{"line_number":143,"context_line":"                            v, substitutions, silent_keyerror_failures)"},{"line_number":144,"context_line":"                except exception.MalformedEndpoint:"},{"line_number":145,"context_line":"                    continue  # this failure is already logged in format_url()"},{"line_number":146,"context_line":"                catalog[region][service] \u003d service_data"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        return catalog"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_59a54002","line":145,"in_reply_to":"fa963961_500ac3d3","updated":"2015-03-27 14:56:30.000000000","message":"Yep, I also think it\u0027s not correct, so I changed it to not raise the exception when it\u0027s the expected keyerror.","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0f67f8f45799427f3f489e3c59d9f40aa73247e3","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        :param tenant_id: The id of the project. \u0027tenant_id\u0027 will be None in"},{"line_number":115,"context_line":"            the case this being called to create a catalog to go in a domain"},{"line_number":116,"context_line":"            scoped token. In this case, any endpoint that requires a tenant_id"},{"line_number":117,"context_line":"            as part of their URL will be skipped (as would a whole service if,"},{"line_number":118,"context_line":"            as a consequence, it has no valid endpoints)."},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        :returns: A nested dict representing the service catalog or an"}],"source_content_type":"text/x-python","patch_set":25,"id":"baa041b7_5f09ab2b","line":117,"updated":"2015-04-02 07:42:16.000000000","message":"I don\u0027t think we skip the service yet here...that\u0027s what your TODO is about...","commit_id":"842bc40cc2ed6bdbf78d4e3fe0ef09d7eefe436a"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"d4353f6c37077a3dd558cd26b583df2521248486","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        :param tenant_id: The id of the project. \u0027tenant_id\u0027 will be None in"},{"line_number":115,"context_line":"            the case this being called to create a catalog to go in a domain"},{"line_number":116,"context_line":"            scoped token. In this case, any endpoint that requires a tenant_id"},{"line_number":117,"context_line":"            as part of their URL will be skipped (as would a whole service if,"},{"line_number":118,"context_line":"            as a consequence, it has no valid endpoints)."},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        :returns: A nested dict representing the service catalog or an"}],"source_content_type":"text/x-python","patch_set":25,"id":"baa041b7_a2ff7e00","line":117,"in_reply_to":"baa041b7_5f09ab2b","updated":"2015-04-02 13:33:35.000000000","message":"yep, we should update it again ;(","commit_id":"842bc40cc2ed6bdbf78d4e3fe0ef09d7eefe436a"}],"keystone/catalog/core.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2d8eaa8666ef77dbd98acc7ac83db2e965d92ce4","unresolved":false,"context_lines":[{"line_number":461,"context_line":"        \"\"\""},{"line_number":462,"context_line":"        v2_catalog \u003d self.get_catalog(user_id, tenant_id, metadata\u003dmetadata)"},{"line_number":463,"context_line":"        v3_catalog \u003d []"},{"line_number":464,"context_line":"        pattern \u003d re.compile(r\"/None(\u0027|/|\\\")|/None\")"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"        for region_name, region in six.iteritems(v2_catalog):"},{"line_number":467,"context_line":"            for service_type, service in six.iteritems(region):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_de0dec91","line":464,"updated":"2015-02-24 10:15:30.000000000","message":"Can you add some note what this regexp is matching?","commit_id":"7a586aa6af282c0433572d46c79a30e72af27f49"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"e2fa1b54477802fc45aad9e1595e06cb128d5e1d","unresolved":false,"context_lines":[{"line_number":461,"context_line":"        \"\"\""},{"line_number":462,"context_line":"        v2_catalog \u003d self.get_catalog(user_id, tenant_id, metadata\u003dmetadata)"},{"line_number":463,"context_line":"        v3_catalog \u003d []"},{"line_number":464,"context_line":"        pattern \u003d re.compile(r\"/None(\u0027|/|\\\")|/None\")"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"        for region_name, region in six.iteritems(v2_catalog):"},{"line_number":467,"context_line":"            for service_type, service in six.iteritems(region):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_d2665f29","line":464,"in_reply_to":"ba7be1f8_de0dec91","updated":"2015-02-26 03:13:15.000000000","message":"Done","commit_id":"7a586aa6af282c0433572d46c79a30e72af27f49"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"25795d35b490f282352af9e9d3f5ba70698756b4","unresolved":false,"context_lines":[{"line_number":466,"context_line":"        # such as: /None\u0027, /None/, /None\""},{"line_number":467,"context_line":"        # The invalid project id is presented in the end of URL,"},{"line_number":468,"context_line":"        # such as: /None"},{"line_number":469,"context_line":"        pattern \u003d re.compile(r\"/None(\u0027|/|\\\")|/None$\")"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        for region_name, region in six.iteritems(v2_catalog):"},{"line_number":472,"context_line":"            for service_type, service in six.iteritems(region):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_6b38a23d","line":469,"updated":"2015-03-13 07:30:25.000000000","message":"there isnt really any other way to distinguish whether endpoint is for project?","commit_id":"734332f51fa63e83b1d9750bf728eb266b17c46b"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2169745a9ad12c137f3c4736b6102fb013759ece","unresolved":false,"context_lines":[{"line_number":466,"context_line":"        # such as: /None\u0027, /None/, /None\""},{"line_number":467,"context_line":"        # The invalid project id is presented in the end of URL,"},{"line_number":468,"context_line":"        # such as: /None"},{"line_number":469,"context_line":"        pattern \u003d re.compile(r\"/None(\u0027|/|\\\")|/None$\")"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        for region_name, region in six.iteritems(v2_catalog):"},{"line_number":472,"context_line":"            for service_type, service in six.iteritems(region):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_a11e3b0a","line":469,"in_reply_to":"9a80dd14_6b38a23d","updated":"2015-03-13 08:28:26.000000000","message":"@Marek, thanks for reviewing. What I can see is those info is read from the template,I cannot see a better approach to pick it out.","commit_id":"734332f51fa63e83b1d9750bf728eb266b17c46b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3ec681a2a7cba2515ba5985d60375b7cea8adea9","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        v2_catalog \u003d self.get_catalog(user_id, tenant_id, metadata\u003dmetadata)"},{"line_number":476,"context_line":"        v3_catalog \u003d []"},{"line_number":477,"context_line":"        # The matched endpoints should fall into two cases,"},{"line_number":478,"context_line":"        # The invalid project id is presented in the mid of URL,"},{"line_number":479,"context_line":"        # such as: /None\u0027, /None/, /None\""},{"line_number":480,"context_line":"        # The invalid project id is presented in the end of URL,"},{"line_number":481,"context_line":"        # such as: /None"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_8e1a046d","line":478,"updated":"2015-03-20 15:16:08.000000000","message":"I find this comment confusing....what \"invalid project id\" are we talking about....it sounds like there should always been one...is that what we are expecting?","commit_id":"e4fa8c789fa61643b64a2497549b570c4c3fd17b"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"735397394312ddbc5029e70a8453cc6c1758bad9","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        v2_catalog \u003d self.get_catalog(user_id, tenant_id, metadata\u003dmetadata)"},{"line_number":476,"context_line":"        v3_catalog \u003d []"},{"line_number":477,"context_line":"        # The matched endpoints should fall into two cases,"},{"line_number":478,"context_line":"        # The invalid project id is presented in the mid of URL,"},{"line_number":479,"context_line":"        # such as: /None\u0027, /None/, /None\""},{"line_number":480,"context_line":"        # The invalid project id is presented in the end of URL,"},{"line_number":481,"context_line":"        # such as: /None"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a75e904_4c355345","line":478,"in_reply_to":"9a80dd14_4e0d6c3d","updated":"2015-03-21 03:03:59.000000000","message":"Done","commit_id":"e4fa8c789fa61643b64a2497549b570c4c3fd17b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5516adcac54b3fd7b8155deb242ef6dcfa24fee0","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        v2_catalog \u003d self.get_catalog(user_id, tenant_id, metadata\u003dmetadata)"},{"line_number":476,"context_line":"        v3_catalog \u003d []"},{"line_number":477,"context_line":"        # The matched endpoints should fall into two cases,"},{"line_number":478,"context_line":"        # The invalid project id is presented in the mid of URL,"},{"line_number":479,"context_line":"        # such as: /None\u0027, /None/, /None\""},{"line_number":480,"context_line":"        # The invalid project id is presented in the end of URL,"},{"line_number":481,"context_line":"        # such as: /None"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_4e0d6c3d","line":478,"in_reply_to":"9a80dd14_8e1a046d","updated":"2015-03-20 15:39:10.000000000","message":"++","commit_id":"e4fa8c789fa61643b64a2497549b570c4c3fd17b"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"735397394312ddbc5029e70a8453cc6c1758bad9","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        v2_catalog \u003d self.get_catalog(user_id, tenant_id, metadata\u003dmetadata)"},{"line_number":476,"context_line":"        v3_catalog \u003d []"},{"line_number":477,"context_line":"        # The matched endpoints should fall into two cases,"},{"line_number":478,"context_line":"        # The invalid project id is presented in the mid of URL,"},{"line_number":479,"context_line":"        # such as: /None\u0027, /None/, /None\""},{"line_number":480,"context_line":"        # The invalid project id is presented in the end of URL,"},{"line_number":481,"context_line":"        # such as: /None"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a75e904_2c301756","line":478,"in_reply_to":"9a80dd14_8e1a046d","updated":"2015-03-21 03:03:59.000000000","message":"Done","commit_id":"e4fa8c789fa61643b64a2497549b570c4c3fd17b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"98c8fd31c28a5e529dfffc44f5e2f9d53aacfd0b","unresolved":false,"context_lines":[{"line_number":484,"context_line":"        # The first case, \u0027None\u0027 is found in the mid of URL,"},{"line_number":485,"context_line":"        # such as: /None\u0027, /None/, /None\"."},{"line_number":486,"context_line":"        # The second case, \u0027None\u0027 is found in the end of URL,"},{"line_number":487,"context_line":"        # such as: /None."},{"line_number":488,"context_line":"        pattern \u003d re.compile(r\"/None(\u0027|/|\\\")|/None$\")"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        for region_name, region in six.iteritems(v2_catalog):"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a75e904_55e796e4","line":487,"updated":"2015-03-21 11:00:19.000000000","message":"This is better, thank you. Here\u0027s a suggestion to further improve this comment, feel free to ignore if you prefer your own version:\n\n# NOTE(davechen): The main task in generating the v3 catalog is to turn any v2 URL attributes into v3 endpoints. As we are doing this, we should watch out for v2 attributes that were expecting a tenant_id substitution, but this was not supplied when the v2 catalog was built. This can happen, for example, with client-specific endpoints when the catalog is not being built for a specific tenant scope. If we find any such non-substituted attributes, we ignore them and don\u0027t create v3 endpoints. A non-substituted attribute will have \u0027None\u0027 in it\u0027s value in place of the tenant_id - and this could occur in the middle or at the end of the URL.","commit_id":"1667e4b33daf5d0bc915c71c624329aa6a12c521"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"1aa713ebd7d6265e53182937f739559c9e25ef3c","unresolved":false,"context_lines":[{"line_number":484,"context_line":"        # The first case, \u0027None\u0027 is found in the mid of URL,"},{"line_number":485,"context_line":"        # such as: /None\u0027, /None/, /None\"."},{"line_number":486,"context_line":"        # The second case, \u0027None\u0027 is found in the end of URL,"},{"line_number":487,"context_line":"        # such as: /None."},{"line_number":488,"context_line":"        pattern \u003d re.compile(r\"/None(\u0027|/|\\\")|/None$\")"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        for region_name, region in six.iteritems(v2_catalog):"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a75e904_f5540223","line":487,"in_reply_to":"7a75e904_55e796e4","updated":"2015-03-21 12:35:44.000000000","message":"Done","commit_id":"1667e4b33daf5d0bc915c71c624329aa6a12c521"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"98c8fd31c28a5e529dfffc44f5e2f9d53aacfd0b","unresolved":false,"context_lines":[{"line_number":513,"context_line":""},{"line_number":514,"context_line":"                    # Other attributes are copied to the service."},{"line_number":515,"context_line":"                    # If \"tenant_id\" is None, only those attributes will be"},{"line_number":516,"context_line":"                    # presented in V3 catalog"},{"line_number":517,"context_line":"                    service_v3[attr] \u003d value"},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"                v3_catalog.append(service_v3)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a75e904_15043e7d","line":516,"updated":"2015-03-21 11:00:19.000000000","message":"again, this is slightly confusing...I think we\u0027ll copy these in whether tenant_id is None or not. And it isn\u0027t obvious what you mean by \"these\".  I think you mean \"non URL attributes\"?","commit_id":"1667e4b33daf5d0bc915c71c624329aa6a12c521"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"1aa713ebd7d6265e53182937f739559c9e25ef3c","unresolved":false,"context_lines":[{"line_number":513,"context_line":""},{"line_number":514,"context_line":"                    # Other attributes are copied to the service."},{"line_number":515,"context_line":"                    # If \"tenant_id\" is None, only those attributes will be"},{"line_number":516,"context_line":"                    # presented in V3 catalog"},{"line_number":517,"context_line":"                    service_v3[attr] \u003d value"},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"                v3_catalog.append(service_v3)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a75e904_d5570625","line":516,"in_reply_to":"7a75e904_15043e7d","updated":"2015-03-21 12:35:44.000000000","message":"Done","commit_id":"1667e4b33daf5d0bc915c71c624329aa6a12c521"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0e662e6d98512100d2862bcfbb3db70c8642bdd9","unresolved":false,"context_lines":[{"line_number":442,"context_line":"        \"\"\""},{"line_number":443,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"    def get_v3_catalog(self, user_id, tenant_id, metadata\u003dNone):"},{"line_number":446,"context_line":"        \"\"\"Retrieve and format the current V3 service catalog."},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        The default implementation builds the V3 catalog from the V2 catalog."}],"source_content_type":"text/x-python","patch_set":13,"id":"7a75e904_a095e689","line":445,"updated":"2015-03-21 13:23:52.000000000","message":"I\u0027d suggest we add parameter descriptions to the doc string, which would include indicating that tenant_id will be None in the case this being called to create a catalog to go in a domain scoped token.  Then the rest of the code below starts to make sense as to why we need to careful of a None tenant_id","commit_id":"e7840d55b1c1564125f10c8889a390b68e66f19c"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"63e3a6b2e98f9ec91d95fdf255b598ff1490af2c","unresolved":false,"context_lines":[{"line_number":442,"context_line":"        \"\"\""},{"line_number":443,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"    def get_v3_catalog(self, user_id, tenant_id, metadata\u003dNone):"},{"line_number":446,"context_line":"        \"\"\"Retrieve and format the current V3 service catalog."},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        The default implementation builds the V3 catalog from the V2 catalog."}],"source_content_type":"text/x-python","patch_set":13,"id":"1a6ced46_3105c3c2","line":445,"in_reply_to":"7a75e904_a095e689","updated":"2015-03-23 06:33:45.000000000","message":"Done","commit_id":"e7840d55b1c1564125f10c8889a390b68e66f19c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0e662e6d98512100d2862bcfbb3db70c8642bdd9","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        v2_catalog \u003d self.get_catalog(user_id, tenant_id, metadata\u003dmetadata)"},{"line_number":476,"context_line":"        v3_catalog \u003d []"},{"line_number":477,"context_line":"        # NOTE(davechen): The main task in generating the v3 catalog is to"},{"line_number":478,"context_line":"        # turn any v2 URL attributes into v3 endpoints. As we are doing this,"},{"line_number":479,"context_line":"        # we should watch out for v2 attributes that were expecting a tenant_id"},{"line_number":480,"context_line":"        # substitution, but this was not always supplied when the v2 catalog"},{"line_number":481,"context_line":"        # was built. This can happen, for example, with client-specific"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a75e904_e0e6fe43","line":478,"updated":"2015-03-21 13:23:52.000000000","message":"actually maybe call them \"v2 URL interface attributes\"","commit_id":"e7840d55b1c1564125f10c8889a390b68e66f19c"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"63e3a6b2e98f9ec91d95fdf255b598ff1490af2c","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        v2_catalog \u003d self.get_catalog(user_id, tenant_id, metadata\u003dmetadata)"},{"line_number":476,"context_line":"        v3_catalog \u003d []"},{"line_number":477,"context_line":"        # NOTE(davechen): The main task in generating the v3 catalog is to"},{"line_number":478,"context_line":"        # turn any v2 URL attributes into v3 endpoints. As we are doing this,"},{"line_number":479,"context_line":"        # we should watch out for v2 attributes that were expecting a tenant_id"},{"line_number":480,"context_line":"        # substitution, but this was not always supplied when the v2 catalog"},{"line_number":481,"context_line":"        # was built. This can happen, for example, with client-specific"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a6ced46_510a3fd3","line":478,"in_reply_to":"7a75e904_e0e6fe43","updated":"2015-03-23 06:33:45.000000000","message":"Done","commit_id":"e7840d55b1c1564125f10c8889a390b68e66f19c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0e662e6d98512100d2862bcfbb3db70c8642bdd9","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                            })"},{"line_number":511,"context_line":"                        continue"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"                    # Other attributes are copied to the service whether"},{"line_number":514,"context_line":"                    # \"tenant_id\" is None or not."},{"line_number":515,"context_line":"                    service_v3[attr] \u003d value"},{"line_number":516,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7a75e904_c03662e7","line":513,"updated":"2015-03-21 13:23:52.000000000","message":"(nit) for clarity, maybe:\n\nOther non-URL attributes are copied to the service whether...","commit_id":"e7840d55b1c1564125f10c8889a390b68e66f19c"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"63e3a6b2e98f9ec91d95fdf255b598ff1490af2c","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                            })"},{"line_number":511,"context_line":"                        continue"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"                    # Other attributes are copied to the service whether"},{"line_number":514,"context_line":"                    # \"tenant_id\" is None or not."},{"line_number":515,"context_line":"                    service_v3[attr] \u003d value"},{"line_number":516,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1a6ced46_d1f54fcc","line":513,"in_reply_to":"7a75e904_c03662e7","updated":"2015-03-23 06:33:45.000000000","message":"Done","commit_id":"e7840d55b1c1564125f10c8889a390b68e66f19c"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"552356d2478ae6ff2e625d18e28ebac8cc13f0a5","unresolved":false,"context_lines":[{"line_number":441,"context_line":""},{"line_number":442,"context_line":"        \"\"\""},{"line_number":443,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"    def get_v3_catalog(self, user_id, tenant_id, metadata\u003dNone):"},{"line_number":446,"context_line":"        \"\"\"Retrieve and format the current V3 service catalog."},{"line_number":447,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1a6ced46_91e2f701","line":444,"updated":"2015-03-23 06:37:31.000000000","message":"Not sure where is metadata coming from and where is it going.\nMaybe we can safely remove this parameter.","commit_id":"c3d73f5ce3a459a9db2e552b7e40274987a5fd03"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2f17fa4e3a4896d1b6b28701bb8712255139b4c0","unresolved":false,"context_lines":[{"line_number":441,"context_line":""},{"line_number":442,"context_line":"        \"\"\""},{"line_number":443,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"    def get_v3_catalog(self, user_id, tenant_id, metadata\u003dNone):"},{"line_number":446,"context_line":"        \"\"\"Retrieve and format the current V3 service catalog."},{"line_number":447,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1a6ced46_3293f7fb","line":444,"in_reply_to":"1a6ced46_91e2f701","updated":"2015-03-23 12:29:07.000000000","message":"As far as I can see, it is never used. I have raised this as bug #1435312 and will fix that first, then you can rebase this on my change and this parameter will go away :-)","commit_id":"c3d73f5ce3a459a9db2e552b7e40274987a5fd03"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":37,"context_line":"MEMOIZE \u003d cache.get_memoization_decorator(section\u003d\u0027catalog\u0027)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def format_url(url, substitutions, silent_keyerror_failures\u003dNone):"},{"line_number":41,"context_line":"    \"\"\"Formats a user-defined URL with the given substitutions."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    :param string url: the URL to be formatted"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_f020b74b","line":40,"updated":"2015-03-27 01:12:51.000000000","message":"Look into making this function specific to its use rather than trying to be uselessly generic. This function can do essentially all the work that the callers are doing now. \n\nFor example, could pass in CONF, user_id, and tenant instead of substitutions \u0026 silent_keyerror_failures.\n\nMake it a class so that it can keep track of stuff.","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":37,"context_line":"MEMOIZE \u003d cache.get_memoization_decorator(section\u003d\u0027catalog\u0027)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def format_url(url, substitutions, silent_keyerror_failures\u003dNone):"},{"line_number":41,"context_line":"    \"\"\"Formats a user-defined URL with the given substitutions."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    :param string url: the URL to be formatted"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_59442073","line":40,"in_reply_to":"fa963961_f020b74b","updated":"2015-03-27 14:56:30.000000000","message":"Brant,good idea! the refactor here may bloating the patch and need more testcase to verify, could I track it down and address this in a separate patch?","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    :param string url: the URL to be formatted"},{"line_number":44,"context_line":"    :param dict substitutions: the dictionary used for substitution"},{"line_number":45,"context_line":"    :param list silent_keyerror_failures: list of keys for which we should"},{"line_number":46,"context_line":"                                          be silent if there is a keyerror on"},{"line_number":47,"context_line":"                                          substitution attempt"},{"line_number":48,"context_line":"    :returns: a formatted URL"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_10cf9bb1","line":45,"updated":"2015-03-27 01:12:51.000000000","message":"suggest remove \"list of\" since it\u0027s already in the type for the parameter.","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    :param string url: the URL to be formatted"},{"line_number":44,"context_line":"    :param dict substitutions: the dictionary used for substitution"},{"line_number":45,"context_line":"    :param list silent_keyerror_failures: list of keys for which we should"},{"line_number":46,"context_line":"                                          be silent if there is a keyerror on"},{"line_number":47,"context_line":"                                          substitution attempt"},{"line_number":48,"context_line":"    :returns: a formatted URL"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_192698ce","line":45,"in_reply_to":"fa963961_10cf9bb1","updated":"2015-03-27 14:56:30.000000000","message":"Done","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                          \"%(keyerror)s\"),"},{"line_number":71,"context_line":"                      {\"url\": url,"},{"line_number":72,"context_line":"                       \"keyerror\": e})"},{"line_number":73,"context_line":"        raise exception.MalformedEndpoint(endpoint\u003durl)"},{"line_number":74,"context_line":"    except TypeError as e:"},{"line_number":75,"context_line":"        LOG.error(_LE(\"Malformed endpoint \u0027%(url)s\u0027. The following type error \""},{"line_number":76,"context_line":"                      \"occurred during string substitution: %(typeerror)s\"),"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_30417f0c","line":73,"updated":"2015-03-27 01:12:51.000000000","message":"why raise if there\u0027s no error?","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                          \"%(keyerror)s\"),"},{"line_number":71,"context_line":"                      {\"url\": url,"},{"line_number":72,"context_line":"                       \"keyerror\": e})"},{"line_number":73,"context_line":"        raise exception.MalformedEndpoint(endpoint\u003durl)"},{"line_number":74,"context_line":"    except TypeError as e:"},{"line_number":75,"context_line":"        LOG.error(_LE(\"Malformed endpoint \u0027%(url)s\u0027. The following type error \""},{"line_number":76,"context_line":"                      \"occurred during string substitution: %(typeerror)s\"),"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_99186886","line":73,"in_reply_to":"fa963961_30417f0c","updated":"2015-03-27 14:56:30.000000000","message":"Done","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"8eed4884397c1764ca08463f5cefbafeeaf35719","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    :param string url: the URL to be formatted"},{"line_number":44,"context_line":"    :param dict substitutions: the dictionary used for substitution"},{"line_number":45,"context_line":"    :param list silent_keyerror_failures: keys for which we should be silent"},{"line_number":46,"context_line":"        if there is a keyerror on substitution attempt"},{"line_number":47,"context_line":"    :returns: a formatted URL"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":23,"id":"da9b358b_5b09c894","line":46,"updated":"2015-03-30 05:36:19.000000000","message":"KeyError*","commit_id":"718133fa16a6adc57c423bfb059edd7908d9669a"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a194af1ca7eb28dba440e5c6bfcb85a7de9a47c2","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    :param string url: the URL to be formatted"},{"line_number":44,"context_line":"    :param dict substitutions: the dictionary used for substitution"},{"line_number":45,"context_line":"    :param list silent_keyerror_failures: keys for which we should be silent"},{"line_number":46,"context_line":"        if there is a keyerror on substitution attempt"},{"line_number":47,"context_line":"    :returns: a formatted URL"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":23,"id":"da9b358b_ec81f790","line":46,"in_reply_to":"da9b358b_5b09c894","updated":"2015-04-01 07:24:51.000000000","message":"Done","commit_id":"718133fa16a6adc57c423bfb059edd7908d9669a"}],"keystone/tests/unit/test_backend_templated.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5516adcac54b3fd7b8155deb242ef6dcfa24fee0","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    def test_get_catalog_ignores_endpoints_with_invalid_urls(self):"},{"line_number":124,"context_line":"        user_id \u003d uuid.uuid4().hex"},{"line_number":125,"context_line":"        project_id \u003d None"},{"line_number":126,"context_line":"        catalog_ref \u003d self.catalog_api.get_v3_catalog(user_id, project_id)"},{"line_number":127,"context_line":"        exp_catalog \u003d ["},{"line_number":128,"context_line":"            {\u0027endpoints\u0027: [],"},{"line_number":129,"context_line":"             \u0027type\u0027: \u0027compute\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_4942c63e","line":126,"updated":"2015-03-20 15:39:10.000000000","message":"we aren\u0027t setting up any invalid data here, so is this done in the setUp? Should we be setting up invalid data in the setUp for these tests?","commit_id":"e4fa8c789fa61643b64a2497549b570c4c3fd17b"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"735397394312ddbc5029e70a8453cc6c1758bad9","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    def test_get_catalog_ignores_endpoints_with_invalid_urls(self):"},{"line_number":124,"context_line":"        user_id \u003d uuid.uuid4().hex"},{"line_number":125,"context_line":"        project_id \u003d None"},{"line_number":126,"context_line":"        catalog_ref \u003d self.catalog_api.get_v3_catalog(user_id, project_id)"},{"line_number":127,"context_line":"        exp_catalog \u003d ["},{"line_number":128,"context_line":"            {\u0027endpoints\u0027: [],"},{"line_number":129,"context_line":"             \u0027type\u0027: \u0027compute\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a75e904_8c258b0c","line":126,"in_reply_to":"9a80dd14_4942c63e","updated":"2015-03-21 03:03:59.000000000","message":"Lance, \"project_id \u003d None\" is the invalid data I think, let\u0027s say the \u0027project_id\u0027 is None, for example we are trying to get the domain-scoped token as the description of the bug, there is no \u0027project_id\u0027 available, so there will some invalid URL found with the EP. So, \u0027catalog_api.get_v3_catalog\u0027 should skip them.","commit_id":"e4fa8c789fa61643b64a2497549b570c4c3fd17b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b533944ac37077d05343864a278f2e99dbd2b291","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def test_get_catalog_ignores_endpoints_with_invalid_urls(self):"},{"line_number":124,"context_line":"        user_id \u003d uuid.uuid4().hex"},{"line_number":125,"context_line":"        # tenant_id is None, so we will get some URL has the \u0027None\u0027"},{"line_number":126,"context_line":"        # in it, the endpoints with this kind of URL will be ignored."},{"line_number":127,"context_line":"        catalog_ref \u003d self.catalog_api.get_v3_catalog(user_id, tenant_id\u003dNone)"},{"line_number":128,"context_line":"        exp_catalog \u003d ["}],"source_content_type":"text/x-python","patch_set":26,"id":"baa041b7_cd6cea9e","line":125,"updated":"2015-04-02 13:54:03.000000000","message":"this sentence doesn\u0027t actually make sense anymore, given they way we have changed the logic...","commit_id":"93265d99502bec2df47d08237738c46f8f6647d9"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"33120e92d4c8e88f857f174e60ca8e2c70dfc35a","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def test_get_catalog_ignores_endpoints_with_invalid_urls(self):"},{"line_number":124,"context_line":"        user_id \u003d uuid.uuid4().hex"},{"line_number":125,"context_line":"        # tenant_id is None, so we will get some URL has the \u0027None\u0027"},{"line_number":126,"context_line":"        # in it, the endpoints with this kind of URL will be ignored."},{"line_number":127,"context_line":"        catalog_ref \u003d self.catalog_api.get_v3_catalog(user_id, tenant_id\u003dNone)"},{"line_number":128,"context_line":"        exp_catalog \u003d ["}],"source_content_type":"text/x-python","patch_set":26,"id":"baa041b7_68314ca2","line":125,"in_reply_to":"baa041b7_cd6cea9e","updated":"2015-04-02 14:25:42.000000000","message":"Done","commit_id":"93265d99502bec2df47d08237738c46f8f6647d9"}],"keystone/tests/unit/test_v3_catalog.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":633,"context_line":"        # all three appear in the backend"},{"line_number":634,"context_line":"        self.assertEqual(3, len(self.catalog_api.list_endpoints()))"},{"line_number":635,"context_line":""},{"line_number":636,"context_line":"        # create another valid endpoint - tenant_id expect to be replaced"},{"line_number":637,"context_line":"        ref \u003d self.new_endpoint_ref(self.service_id)"},{"line_number":638,"context_line":"        ref[\u0027url\u0027] \u003d \u0027http://keystone/%(tenant_id)s\u0027"},{"line_number":639,"context_line":"        self.catalog_api.create_endpoint(ref[\u0027id\u0027], ref)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_30ddff42","line":636,"updated":"2015-03-27 01:12:51.000000000","message":"change \"expect to be\" to \"will be\"","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":633,"context_line":"        # all three appear in the backend"},{"line_number":634,"context_line":"        self.assertEqual(3, len(self.catalog_api.list_endpoints()))"},{"line_number":635,"context_line":""},{"line_number":636,"context_line":"        # create another valid endpoint - tenant_id expect to be replaced"},{"line_number":637,"context_line":"        ref \u003d self.new_endpoint_ref(self.service_id)"},{"line_number":638,"context_line":"        ref[\u0027url\u0027] \u003d \u0027http://keystone/%(tenant_id)s\u0027"},{"line_number":639,"context_line":"        self.catalog_api.create_endpoint(ref[\u0027id\u0027], ref)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_7095c7e2","line":636,"in_reply_to":"fa963961_30ddff42","updated":"2015-03-27 14:56:30.000000000","message":"Done","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":640,"context_line":""},{"line_number":641,"context_line":"        # there are two valid endpoints, positive check"},{"line_number":642,"context_line":"        catalog \u003d self.catalog_api.get_v3_catalog(user_id, tenant_id)"},{"line_number":643,"context_line":"        self.assertEqual(2, len(catalog[0][\u0027endpoints\u0027]))"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"        # ignore the invalid endpoints, negative check"},{"line_number":646,"context_line":"        # \u0027invalid endpoints\u0027 here means the endpoint has \u0027None\u0027 as"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_d0e4930e","line":643,"updated":"2015-03-27 01:12:51.000000000","message":"use matcher.HasLength, or better verify that the endpoints are exactly what\u0027s expected.","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":640,"context_line":""},{"line_number":641,"context_line":"        # there are two valid endpoints, positive check"},{"line_number":642,"context_line":"        catalog \u003d self.catalog_api.get_v3_catalog(user_id, tenant_id)"},{"line_number":643,"context_line":"        self.assertEqual(2, len(catalog[0][\u0027endpoints\u0027]))"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"        # ignore the invalid endpoints, negative check"},{"line_number":646,"context_line":"        # \u0027invalid endpoints\u0027 here means the endpoint has \u0027None\u0027 as"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_e6cebd82","line":643,"in_reply_to":"fa963961_d0e4930e","updated":"2015-03-27 14:56:30.000000000","message":"Done","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":645,"context_line":"        # ignore the invalid endpoints, negative check"},{"line_number":646,"context_line":"        # \u0027invalid endpoints\u0027 here means the endpoint has \u0027None\u0027 as"},{"line_number":647,"context_line":"        # the replacement of \u0027tenant_id\u0027."},{"line_number":648,"context_line":"        tenant_id \u003d None"},{"line_number":649,"context_line":"        catalog \u003d self.catalog_api.get_v3_catalog(user_id, tenant_id)"},{"line_number":650,"context_line":"        self.assertEqual(1, len(catalog[0][\u0027endpoints\u0027]))"},{"line_number":651,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_f0ce7782","line":648,"updated":"2015-03-27 01:12:51.000000000","message":"modifying tenant_id here is scary. Use tenant_id\u003dNone in the call instead.","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":645,"context_line":"        # ignore the invalid endpoints, negative check"},{"line_number":646,"context_line":"        # \u0027invalid endpoints\u0027 here means the endpoint has \u0027None\u0027 as"},{"line_number":647,"context_line":"        # the replacement of \u0027tenant_id\u0027."},{"line_number":648,"context_line":"        tenant_id \u003d None"},{"line_number":649,"context_line":"        catalog \u003d self.catalog_api.get_v3_catalog(user_id, tenant_id)"},{"line_number":650,"context_line":"        self.assertEqual(1, len(catalog[0][\u0027endpoints\u0027]))"},{"line_number":651,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_861a516d","line":648,"in_reply_to":"fa963961_f0ce7782","updated":"2015-03-27 14:56:30.000000000","message":"Done","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fcc4ad18f24d57024330073bc043ed284f69b184","unresolved":false,"context_lines":[{"line_number":647,"context_line":"        # the replacement of \u0027tenant_id\u0027."},{"line_number":648,"context_line":"        tenant_id \u003d None"},{"line_number":649,"context_line":"        catalog \u003d self.catalog_api.get_v3_catalog(user_id, tenant_id)"},{"line_number":650,"context_line":"        self.assertEqual(1, len(catalog[0][\u0027endpoints\u0027]))"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"    def test_get_catalog_always_returns_service_name(self):"},{"line_number":653,"context_line":"        user_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_70ba67e3","line":650,"updated":"2015-03-27 01:12:51.000000000","message":"use matcher.HasLength, or better verify that the endpoint is exactly what\u0027s expected.","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2edcebd5a5fea44c4777d8ac366fc3c138eedced","unresolved":false,"context_lines":[{"line_number":647,"context_line":"        # the replacement of \u0027tenant_id\u0027."},{"line_number":648,"context_line":"        tenant_id \u003d None"},{"line_number":649,"context_line":"        catalog \u003d self.catalog_api.get_v3_catalog(user_id, tenant_id)"},{"line_number":650,"context_line":"        self.assertEqual(1, len(catalog[0][\u0027endpoints\u0027]))"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"    def test_get_catalog_always_returns_service_name(self):"},{"line_number":653,"context_line":"        user_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_865ff10d","line":650,"in_reply_to":"fa963961_70ba67e3","updated":"2015-03-27 14:56:30.000000000","message":"Done","commit_id":"757bc5d822c39f22204bc0278d28b4f28f229b0f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b533944ac37077d05343864a278f2e99dbd2b291","unresolved":false,"context_lines":[{"line_number":688,"context_line":"        self.assertThat(catalog[0][\u0027endpoints\u0027], matchers.HasLength(2))"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"        # ignore the invalid endpoints, negative check"},{"line_number":691,"context_line":"        # \u0027invalid endpoints\u0027 here means the endpoint has \u0027None\u0027 as"},{"line_number":692,"context_line":"        # the replacement of \u0027tenant_id\u0027."},{"line_number":693,"context_line":"        catalog \u003d self.catalog_api.get_v3_catalog(user_id, tenant_id\u003dNone)"},{"line_number":694,"context_line":"        self.assertThat(catalog[0][\u0027endpoints\u0027], matchers.HasLength(1))"}],"source_content_type":"text/x-python","patch_set":26,"id":"baa041b7_2d2b5632","line":691,"updated":"2015-04-02 13:54:03.000000000","message":"again, this doesn\u0027t quite make sense since the code no longer inserts \"None\" into the url","commit_id":"93265d99502bec2df47d08237738c46f8f6647d9"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"33120e92d4c8e88f857f174e60ca8e2c70dfc35a","unresolved":false,"context_lines":[{"line_number":688,"context_line":"        self.assertThat(catalog[0][\u0027endpoints\u0027], matchers.HasLength(2))"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"        # ignore the invalid endpoints, negative check"},{"line_number":691,"context_line":"        # \u0027invalid endpoints\u0027 here means the endpoint has \u0027None\u0027 as"},{"line_number":692,"context_line":"        # the replacement of \u0027tenant_id\u0027."},{"line_number":693,"context_line":"        catalog \u003d self.catalog_api.get_v3_catalog(user_id, tenant_id\u003dNone)"},{"line_number":694,"context_line":"        self.assertThat(catalog[0][\u0027endpoints\u0027], matchers.HasLength(1))"}],"source_content_type":"text/x-python","patch_set":26,"id":"baa041b7_68bf0cd1","line":691,"in_reply_to":"baa041b7_2d2b5632","updated":"2015-04-02 14:25:42.000000000","message":"Done","commit_id":"93265d99502bec2df47d08237738c46f8f6647d9"}]}
