)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":17073,"name":"Theodore Ilie","email":"theodorex.ilie@intel.com","username":"Lactem"},"change_message_id":"2d2a9d98fbc382e90aafe61f46ee428f55b2afee","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     jiaxi \u003cjiaxi@unitedstack.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-07-10 09:22:05 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Invalid URLs are not suppressed when create endpoint"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When create endpoint with invalid url, such as uuid string"},{"line_number":10,"context_line":"or \"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\", should"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"ba3cc151_85e7c445","line":7,"updated":"2015-07-10 15:43:07.000000000","message":"create --\u003e creating","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":17073,"name":"Theodore Ilie","email":"theodorex.ilie@intel.com","username":"Lactem"},"change_message_id":"2d2a9d98fbc382e90aafe61f46ee428f55b2afee","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Invalid URLs are not suppressed when create endpoint"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When create endpoint with invalid url, such as uuid string"},{"line_number":10,"context_line":"or \"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\", should"},{"line_number":11,"context_line":"be suppressed."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"ba3cc151_a5d3e85e","line":9,"updated":"2015-07-10 15:43:07.000000000","message":"create --\u003e creating","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":17073,"name":"Theodore Ilie","email":"theodorex.ilie@intel.com","username":"Lactem"},"change_message_id":"2d2a9d98fbc382e90aafe61f46ee428f55b2afee","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Invalid URLs are not suppressed when create endpoint"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When create endpoint with invalid url, such as uuid string"},{"line_number":10,"context_line":"or \"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\", should"},{"line_number":11,"context_line":"be suppressed."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Closes-Bug: #1471034"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"ba3cc151_655ba0f7","line":10,"updated":"2015-07-10 15:43:07.000000000","message":"should be --\u003e it is now","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":17073,"name":"Theodore Ilie","email":"theodorex.ilie@intel.com","username":"Lactem"},"change_message_id":"2d2a9d98fbc382e90aafe61f46ee428f55b2afee","unresolved":false,"context_lines":[{"line_number":10,"context_line":"or \"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\", should"},{"line_number":11,"context_line":"be suppressed."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Closes-Bug: #1471034"},{"line_number":14,"context_line":"Change-Id: I6728edaae26b140fc19afec6331674c57856985c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"ba3cc151_d08ee878","line":13,"updated":"2015-07-10 15:43:07.000000000","message":"This also closes your duplicate bug https://bugs.launchpad.net/keystone/+bug/1473267, but I don\u0027t know if you would put that in the commit message.","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f1ef1c9e5fd165069682e547a7a2020d1567d737","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Invalid URLs are not suppressed when creating endpoint"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When creating endpoint with invalid url, such as uuid string"},{"line_number":10,"context_line":"or \"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\", it is now"},{"line_number":11,"context_line":"suppressed."},{"line_number":12,"context_line":"The bug occurs when use the keystone command: keystone endpoint-create."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"9a41bdd9_9a1cab78","line":9,"updated":"2015-07-14 11:17:21.000000000","message":"Does it catch these now?","commit_id":"038fa3f3abfab3602c73f5e798dcaf4ebc8fdc15"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"38520f8a181abcecc1675dc4dfdbc2729d9d93ed","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Invalid URLs are not suppressed when creating endpoint"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When creating endpoint with invalid url, such as uuid string"},{"line_number":10,"context_line":"or \"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\", it is now"},{"line_number":11,"context_line":"suppressed."},{"line_number":12,"context_line":"The bug occurs when use the keystone command: keystone endpoint-create."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"9a41bdd9_87ec0e2b","line":9,"in_reply_to":"9a41bdd9_4e2ae82d","updated":"2015-07-15 13:37:01.000000000","message":"The regular expression that you see in the current code base [0] was put in place so that we could support ipv6 [1]. If the current implementation is in fact terribly wrong, we\u0027ll need to make sure what we replace it with does regress. \n\n\n[0] https://github.com/openstack/keystone/blob/e517baf5f094570853056223627e62834325b10b/keystone/common/validation/parameter_types.py#L54-L57\n\n[1] https://bugs.launchpad.net/keystone/+bug/1386376","commit_id":"038fa3f3abfab3602c73f5e798dcaf4ebc8fdc15"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"131d3e15ba17ea4bb9397adc6bcceb091f28fca1","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Invalid URLs are not suppressed when creating endpoint"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When creating endpoint with invalid url, such as uuid string"},{"line_number":10,"context_line":"or \"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\", it is now"},{"line_number":11,"context_line":"suppressed."},{"line_number":12,"context_line":"The bug occurs when use the keystone command: keystone endpoint-create."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"9a41bdd9_a70a7288","line":9,"in_reply_to":"9a41bdd9_87ec0e2b","updated":"2015-07-29 12:37:54.000000000","message":"I can make a endpoint_url regex to solve the bug.If I replace the original one.Many codes related will be modified.Maybe next fix is ok.","commit_id":"038fa3f3abfab3602c73f5e798dcaf4ebc8fdc15"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"55a0f9d05a9d7fa5e1b9e5313268aa61b7a39796","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Invalid URLs are not suppressed when creating endpoint"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When creating endpoint with invalid url, such as uuid string"},{"line_number":10,"context_line":"or \"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\", it is now"},{"line_number":11,"context_line":"suppressed."},{"line_number":12,"context_line":"The bug occurs when use the keystone command: keystone endpoint-create."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"9a41bdd9_4e2ae82d","line":9,"in_reply_to":"9a41bdd9_9a1cab78","updated":"2015-07-14 11:49:58.000000000","message":"No,the original validation of url is wrong.keystone.common.validation.parameter_types.py #57 is terriblily wrong.Why should we use this regex?","commit_id":"038fa3f3abfab3602c73f5e798dcaf4ebc8fdc15"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f1ef1c9e5fd165069682e547a7a2020d1567d737","unresolved":false,"context_lines":[{"line_number":14,"context_line":"only supports the Identity v2.0 API."},{"line_number":15,"context_line":"So only v2.0 API is modified in this commit."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Closes-Bug: #1471034"},{"line_number":18,"context_line":"Change-Id: I6728edaae26b140fc19afec6331674c57856985c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"9a41bdd9_ba596f5c","line":17,"updated":"2015-07-14 11:17:21.000000000","message":"Does this actually close the bug now?","commit_id":"038fa3f3abfab3602c73f5e798dcaf4ebc8fdc15"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"55a0f9d05a9d7fa5e1b9e5313268aa61b7a39796","unresolved":false,"context_lines":[{"line_number":14,"context_line":"only supports the Identity v2.0 API."},{"line_number":15,"context_line":"So only v2.0 API is modified in this commit."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Closes-Bug: #1471034"},{"line_number":18,"context_line":"Change-Id: I6728edaae26b140fc19afec6331674c57856985c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"9a41bdd9_2eac449f","line":17,"in_reply_to":"9a41bdd9_ba596f5c","updated":"2015-07-14 11:49:58.000000000","message":"No,I was thinking about the regex fo validation url. The original is wrong.\nkeystone.common.validation.parameter_types.py #57 is terriblily wrong.Why should we use this regex?","commit_id":"038fa3f3abfab3602c73f5e798dcaf4ebc8fdc15"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"47bf1107531959db9cd3ae289a703f4ab9ab6058","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When creating endpoint with invalid url, such as uuid string"},{"line_number":10,"context_line":"or \"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\", it is now"},{"line_number":11,"context_line":"suppressed."},{"line_number":12,"context_line":"The bug occurs when use the keystone command: keystone endpoint-create."},{"line_number":13,"context_line":"The Keystone command line interface packaged in python-keystoneclient"},{"line_number":14,"context_line":"only supports the Identity v2.0 API."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9a41bdd9_f9534e15","line":11,"updated":"2015-07-15 08:43:26.000000000","message":"s/it is now suppressed/these invalid url should be suppressed","commit_id":"a0c48be60cda0a753a09ea519e0fd821091e8079"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"0ba194f647d8eced19cd50e96b9ee953ac97a19a","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When creating endpoint with invalid url, such as uuid string"},{"line_number":10,"context_line":"or \"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\", it is now"},{"line_number":11,"context_line":"suppressed."},{"line_number":12,"context_line":"The bug occurs when use the keystone command: keystone endpoint-create."},{"line_number":13,"context_line":"The Keystone command line interface packaged in python-keystoneclient"},{"line_number":14,"context_line":"only supports the Identity v2.0 API."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9a41bdd9_1d237da8","line":11,"in_reply_to":"9a41bdd9_f9534e15","updated":"2015-07-29 12:38:05.000000000","message":"Of course.","commit_id":"a0c48be60cda0a753a09ea519e0fd821091e8079"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"47bf1107531959db9cd3ae289a703f4ab9ab6058","unresolved":false,"context_lines":[{"line_number":12,"context_line":"The bug occurs when use the keystone command: keystone endpoint-create."},{"line_number":13,"context_line":"The Keystone command line interface packaged in python-keystoneclient"},{"line_number":14,"context_line":"only supports the Identity v2.0 API."},{"line_number":15,"context_line":"So only v2.0 API is modified in this commit."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Closes-Bug: #1471034"},{"line_number":18,"context_line":"Change-Id: I6728edaae26b140fc19afec6331674c57856985c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9a41bdd9_59e91ae5","line":15,"updated":"2015-07-15 08:43:26.000000000","message":"The above commit message is not correct.\n\nThis issue also existing in V3 API, pls use openstack CLI for V3 API, this issue not restricted in the client command but the CURL as well.\n\nPls remove V2 API and keystone command stuff in the commit message, and I belive the issue also existed in other APIs, such as update API.\n\nIf you only want to address partial of the bug, pls change Closes-Bug to Partial-Bug, that will looks better.\n\nI think it\u0027s better to understand what\u0027s Lance\u0027s comments meant in the PS9, and maybe a better approach could be figured out.","commit_id":"a0c48be60cda0a753a09ea519e0fd821091e8079"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"0ba194f647d8eced19cd50e96b9ee953ac97a19a","unresolved":false,"context_lines":[{"line_number":12,"context_line":"The bug occurs when use the keystone command: keystone endpoint-create."},{"line_number":13,"context_line":"The Keystone command line interface packaged in python-keystoneclient"},{"line_number":14,"context_line":"only supports the Identity v2.0 API."},{"line_number":15,"context_line":"So only v2.0 API is modified in this commit."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Closes-Bug: #1471034"},{"line_number":18,"context_line":"Change-Id: I6728edaae26b140fc19afec6331674c57856985c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9a41bdd9_fdf019ff","line":15,"in_reply_to":"9a41bdd9_59e91ae5","updated":"2015-07-29 12:38:05.000000000","message":"Partial-Bug.","commit_id":"a0c48be60cda0a753a09ea519e0fd821091e8079"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"4ca3897775f26e0f9a2c8acc41ebd4f14bb07dea","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When creating endpoint with invalid url, such as uuid string"},{"line_number":10,"context_line":"or \"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\", it is now"},{"line_number":11,"context_line":"reject."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This bug is simply about the substitutions,so we should only check"},{"line_number":14,"context_line":"the substitutions and the whitespace."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"3a50d1a3_06d39460","line":11,"updated":"2015-07-26 14:14:05.000000000","message":"nits:  should be rejected.","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"9ad4593fec12bfac41a1cae22e576b610dd0465b","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When creating endpoint with invalid url, such as uuid string"},{"line_number":10,"context_line":"or \"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\", it is now"},{"line_number":11,"context_line":"reject."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This bug is simply about the substitutions,so we should only check"},{"line_number":14,"context_line":"the substitutions and the whitespace."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"3a50d1a3_660cd842","line":11,"in_reply_to":"3a50d1a3_06d39460","updated":"2015-07-29 23:53:58.000000000","message":"Done","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5d631379797c1842da1011556fad2c18b498ebd9","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Reject create endpoint with invalid urls"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When creating endpoint with invalid url, such as uuid string"},{"line_number":10,"context_line":"or \"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\", it is now"},{"line_number":11,"context_line":"rejected."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"3a50d1a3_d3b9cfcc","line":9,"updated":"2015-07-27 12:45:44.000000000","message":"I don\u0027t think this is true anymore.","commit_id":"b49ad6b376e4345b3024fc75a63749bb14d2aa1b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5d631379797c1842da1011556fad2c18b498ebd9","unresolved":false,"context_lines":[{"line_number":22,"context_line":"testcase should be deleted."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"And I delete the four testcases below:"},{"line_number":25,"context_line":"tests.unit.test_catalog.V2CatalogTestCase.test_endpoint_create_with_null_adminurl"},{"line_number":26,"context_line":"tests.unit.test_catalog.V2CatalogTestCase.test_endpoint_create_with_empty_adminurl"},{"line_number":27,"context_line":"tests.unit.test_catalog.V2CatalogTestCase.test_endpoint_create_with_empty_internalurl"},{"line_number":28,"context_line":"tests.unit.test_catalog.V2CatalogTestCase.test_endpoint_create_with_null_internalurl"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"3a50d1a3_b379a3fe","line":25,"updated":"2015-07-27 12:45:44.000000000","message":"Since the bug is about substitutions I don\u0027t know why you need to remove working tests. If you broke the tests then you broke the behavior too.","commit_id":"b49ad6b376e4345b3024fc75a63749bb14d2aa1b"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"56d84a5feb0565f930288ae7eeef1cc6c3d8b67c","unresolved":false,"context_lines":[{"line_number":10,"context_line":"\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\","},{"line_number":11,"context_line":"it is now rejected."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This bug is simply about the substitutions,so we should only check"},{"line_number":14,"context_line":"the substitutions and the whitespace."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"The bug also happen in v3.So we have to fix this bug in both v2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":35,"id":"3a50d1a3_19f13501","line":13,"updated":"2015-07-29 06:18:02.000000000","message":"add space after the comma","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"56d84a5feb0565f930288ae7eeef1cc6c3d8b67c","unresolved":false,"context_lines":[{"line_number":13,"context_line":"This bug is simply about the substitutions,so we should only check"},{"line_number":14,"context_line":"the substitutions and the whitespace."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"The bug also happen in v3.So we have to fix this bug in both v2"},{"line_number":17,"context_line":"and v3."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Closes-Bug: #1471034"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":35,"id":"3a50d1a3_39f431ef","line":16,"updated":"2015-07-29 06:18:02.000000000","message":"add space after the period","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5365b17ac8a9668cb3bd96d64ef17c54b512f704","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When creating endpoint with invalid url, like"},{"line_number":10,"context_line":"\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\","},{"line_number":11,"context_line":"it is now rejected."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This bug is simply about the substitutions, so we should only"},{"line_number":14,"context_line":"check the substitutions. Since it\u0027s a little specail, we should"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"3a50d1a3_28c9d25a","line":11,"updated":"2015-07-31 03:34:28.000000000","message":"I think you should just delete this paragraph.","commit_id":"0140a9914617b4101ca5fcb6952a5d3a733c918a"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"caea2d6ca29bff2a8125330dcb0ce4b0b2270e17","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When creating endpoint with invalid url, like"},{"line_number":10,"context_line":"\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\","},{"line_number":11,"context_line":"it is now rejected."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This bug is simply about the substitutions, so we should only"},{"line_number":14,"context_line":"check the substitutions. Since it\u0027s a little specail, we should"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"3a50d1a3_c3eccf2b","line":11,"in_reply_to":"3a50d1a3_28c9d25a","updated":"2015-07-31 04:02:04.000000000","message":"Done","commit_id":"0140a9914617b4101ca5fcb6952a5d3a733c918a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5365b17ac8a9668cb3bd96d64ef17c54b512f704","unresolved":false,"context_lines":[{"line_number":11,"context_line":"it is now rejected."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This bug is simply about the substitutions, so we should only"},{"line_number":14,"context_line":"check the substitutions. Since it\u0027s a little specail, we should"},{"line_number":15,"context_line":"not regard it as a general url validation."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The bug also happen in v3. So we have to fix this bug in both"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"3a50d1a3_c892ae4b","line":14,"updated":"2015-07-31 03:34:28.000000000","message":"(nit) special","commit_id":"0140a9914617b4101ca5fcb6952a5d3a733c918a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5365b17ac8a9668cb3bd96d64ef17c54b512f704","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This bug is simply about the substitutions, so we should only"},{"line_number":14,"context_line":"check the substitutions. Since it\u0027s a little specail, we should"},{"line_number":15,"context_line":"not regard it as a general url validation."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The bug also happen in v3. So we have to fix this bug in both"},{"line_number":18,"context_line":"v2 and v3."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"3a50d1a3_88ea66ab","line":15,"updated":"2015-07-31 03:34:28.000000000","message":"I think you can replace this paragraph with:\n\nThe patch is not for general URL validation. It just implements a check to make sure any substitutions in the URL will be valid when building the catalog.","commit_id":"0140a9914617b4101ca5fcb6952a5d3a733c918a"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"caea2d6ca29bff2a8125330dcb0ce4b0b2270e17","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This bug is simply about the substitutions, so we should only"},{"line_number":14,"context_line":"check the substitutions. Since it\u0027s a little specail, we should"},{"line_number":15,"context_line":"not regard it as a general url validation."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The bug also happen in v3. So we have to fix this bug in both"},{"line_number":18,"context_line":"v2 and v3."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"3a50d1a3_63f13b01","line":15,"in_reply_to":"3a50d1a3_88ea66ab","updated":"2015-07-31 04:02:04.000000000","message":"Done","commit_id":"0140a9914617b4101ca5fcb6952a5d3a733c918a"}],"keystone/catalog/controllers.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"40d8084d1e35bc35d3565e1798c582ecf0a90e3c","unresolved":false,"context_lines":[{"line_number":313,"context_line":"        return endpoint"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    @controller.protected()"},{"line_number":316,"context_line":"    @validation.validated(schema.endpoint_create, \u0027endpoint\u0027)"},{"line_number":317,"context_line":"    def create_endpoint(self, context, endpoint):"},{"line_number":318,"context_line":"        ref \u003d self._assign_unique_id(self._normalize_dict(endpoint))"},{"line_number":319,"context_line":"        ref \u003d self._validate_endpoint_region(ref, context)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_34e5e6a7","line":316,"updated":"2015-07-11 08:04:45.000000000","message":"what about V3 endpoint creation? address in this commit or another?","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"703b4f63e4fa5b7a0ee681208fc981ad3b273382","unresolved":false,"context_lines":[{"line_number":313,"context_line":"        return endpoint"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    @controller.protected()"},{"line_number":316,"context_line":"    @validation.validated(schema.endpoint_create, \u0027endpoint\u0027)"},{"line_number":317,"context_line":"    def create_endpoint(self, context, endpoint):"},{"line_number":318,"context_line":"        ref \u003d self._assign_unique_id(self._normalize_dict(endpoint))"},{"line_number":319,"context_line":"        ref \u003d self._validate_endpoint_region(ref, context)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_e8afa292","line":316,"in_reply_to":"9a41bdd9_34e5e6a7","updated":"2015-07-29 04:01:12.000000000","message":"I will address it in commit log soon.","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"40d8084d1e35bc35d3565e1798c582ecf0a90e3c","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        return EndpointV3.wrap_member(context, ref)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    @controller.protected()"},{"line_number":336,"context_line":"    @validation.validated(schema.endpoint_update, \u0027endpoint\u0027)"},{"line_number":337,"context_line":"    def update_endpoint(self, context, endpoint_id, endpoint):"},{"line_number":338,"context_line":"        self._require_matching_id(endpoint_id, endpoint)"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_b4e7b6ab","line":336,"updated":"2015-07-11 08:04:45.000000000","message":"IIUC, update endpoint should have the same issue.","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"703b4f63e4fa5b7a0ee681208fc981ad3b273382","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        return EndpointV3.wrap_member(context, ref)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    @controller.protected()"},{"line_number":336,"context_line":"    @validation.validated(schema.endpoint_update, \u0027endpoint\u0027)"},{"line_number":337,"context_line":"    def update_endpoint(self, context, endpoint_id, endpoint):"},{"line_number":338,"context_line":"        self._require_matching_id(endpoint_id, endpoint)"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_082be6ec","line":336,"in_reply_to":"9a41bdd9_b4e7b6ab","updated":"2015-07-29 04:01:12.000000000","message":"I will address it in commit log soon.","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c3753da3fc56e553c6e39f41e1e374ea91c7783d","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        return {\u0027endpoints\u0027: list(legacy_endpoints.values())}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @controller.v2_deprecated"},{"line_number":94,"context_line":"    @validation.validated(schema.endpoint_create_v2, \u0027endpoint\u0027)"},{"line_number":95,"context_line":"    def create_endpoint(self, context, endpoint):"},{"line_number":96,"context_line":"        \"\"\"Create three v3 endpoint refs based on a legacy ref.\"\"\""},{"line_number":97,"context_line":"        self.assert_admin(context)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a41bdd9_0d457d44","line":94,"updated":"2015-07-15 14:05:00.000000000","message":"I don\u0027t think we should be taking this step yet. We already have a module (keystone/clean.py) that is used to validate the v2.0 code path. I don\u0027t think we need to have two different validation techniques scattered across two API versions, mixed and matched.\n\nIf we\u0027re going to be using jsonschema to validate the v2.0, we should prepare the current validation module (keystone/clean.py) to be removed. We should also be using one schema validation framework on all Keystone v2.0 entities to be consistent. I don\u0027t think it\u0027s right to use jsonschema to validate *some* things in v2.0 and not other things. \n\nThe current validation implementation was introduced per each v3 entity [0]. \n\n\n[0] https://review.openstack.org/#/c/96266/","commit_id":"9786b5c0a0bfc990e4f796abaad499afc4b53bc1"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"0189a86d2ae189960c24773bd757774c06aa89a9","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        return {\u0027endpoints\u0027: list(legacy_endpoints.values())}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @controller.v2_deprecated"},{"line_number":94,"context_line":"    @validation.validated(schema.endpoint_create_v2, \u0027endpoint\u0027)"},{"line_number":95,"context_line":"    def create_endpoint(self, context, endpoint):"},{"line_number":96,"context_line":"        \"\"\"Create three v3 endpoint refs based on a legacy ref.\"\"\""},{"line_number":97,"context_line":"        self.assert_admin(context)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a41bdd9_2d6c0134","line":94,"in_reply_to":"9a41bdd9_0d457d44","updated":"2015-07-29 12:38:17.000000000","message":"Thank you. Very good opinion.","commit_id":"9786b5c0a0bfc990e4f796abaad499afc4b53bc1"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e1f94198868e67b2ec2a8a078f1ed377130000a8","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            legacy_ep[\u0027%surl\u0027 % endpoint[\u0027interface\u0027]] \u003d endpoint[\u0027url\u0027]"},{"line_number":92,"context_line":"        return {\u0027endpoints\u0027: list(legacy_endpoints.values())}"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @controller.v2_deprecated"},{"line_number":95,"context_line":"    def create_endpoint(self, context, endpoint):"},{"line_number":96,"context_line":"        \"\"\"Create three v3 endpoint refs based on a legacy ref.\"\"\""},{"line_number":97,"context_line":"        self.assert_admin(context)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a41bdd9_633f3fb4","line":94,"updated":"2015-07-16 13:50:43.000000000","message":"why are we doing this for v2 if it\u0027s deprecated?","commit_id":"ea7ce8c7005873eabac4eeab38f2d0dbe8b4cb0c"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"e21062852fb3dc1e3efa15e8140f245d272b062a","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            legacy_ep[\u0027%surl\u0027 % endpoint[\u0027interface\u0027]] \u003d endpoint[\u0027url\u0027]"},{"line_number":92,"context_line":"        return {\u0027endpoints\u0027: list(legacy_endpoints.values())}"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @controller.v2_deprecated"},{"line_number":95,"context_line":"    def create_endpoint(self, context, endpoint):"},{"line_number":96,"context_line":"        \"\"\"Create three v3 endpoint refs based on a legacy ref.\"\"\""},{"line_number":97,"context_line":"        self.assert_admin(context)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a41bdd9_e3302f58","line":94,"in_reply_to":"9a41bdd9_633f3fb4","updated":"2015-07-29 23:57:29.000000000","message":"Sorry,More details?","commit_id":"ea7ce8c7005873eabac4eeab38f2d0dbe8b4cb0c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"58d32a90473cdb04d2cbd462062d439726d88c05","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            legacy_ep[\u0027%surl\u0027 % endpoint[\u0027interface\u0027]] \u003d endpoint[\u0027url\u0027]"},{"line_number":92,"context_line":"        return {\u0027endpoints\u0027: list(legacy_endpoints.values())}"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @controller.v2_deprecated"},{"line_number":95,"context_line":"    def create_endpoint(self, context, endpoint):"},{"line_number":96,"context_line":"        \"\"\"Create three v3 endpoint refs based on a legacy ref.\"\"\""},{"line_number":97,"context_line":"        self.assert_admin(context)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a41bdd9_fe01813a","line":94,"in_reply_to":"9a41bdd9_633f3fb4","updated":"2015-07-17 04:13:31.000000000","message":"v2 is frozen - not deprecated (the decorator is a hold-over). This is a serious enough ux issue I\u0027m ok with it landing in general though.","commit_id":"ea7ce8c7005873eabac4eeab38f2d0dbe8b4cb0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e1f94198868e67b2ec2a8a078f1ed377130000a8","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        # if any url is invalid, raise exception.ValidationURLError"},{"line_number":114,"context_line":"        for url in urls:"},{"line_number":115,"context_line":"            if not clean.check_endpoint_url(url):"},{"line_number":116,"context_line":"                raise exception.ValidationURLError()"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a41bdd9_c862e83d","line":116,"updated":"2015-07-16 13:50:43.000000000","message":"this would be confusing for the user because you\u0027re not telling them *what* url is invalid.","commit_id":"ea7ce8c7005873eabac4eeab38f2d0dbe8b4cb0c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"58d32a90473cdb04d2cbd462062d439726d88c05","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        # if any url is invalid, raise exception.ValidationURLError"},{"line_number":114,"context_line":"        for url in urls:"},{"line_number":115,"context_line":"            if not clean.check_endpoint_url(url):"},{"line_number":116,"context_line":"                raise exception.ValidationURLError()"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a41bdd9_def83d4c","line":116,"in_reply_to":"9a41bdd9_c862e83d","updated":"2015-07-17 04:13:31.000000000","message":"I agree, This likely should be strictly a validation error not a ValidationURLError","commit_id":"ea7ce8c7005873eabac4eeab38f2d0dbe8b4cb0c"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"e21062852fb3dc1e3efa15e8140f245d272b062a","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        # if any url is invalid, raise exception.ValidationURLError"},{"line_number":114,"context_line":"        for url in urls:"},{"line_number":115,"context_line":"            if not clean.check_endpoint_url(url):"},{"line_number":116,"context_line":"                raise exception.ValidationURLError()"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a41bdd9_e3658f44","line":116,"in_reply_to":"9a41bdd9_c862e83d","updated":"2015-07-29 23:57:29.000000000","message":"Thank you for remainding. I will provice url info in exception.","commit_id":"ea7ce8c7005873eabac4eeab38f2d0dbe8b4cb0c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"4eacef3fab931afa67023e524855cf4ea45be571","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self._require_attribute(endpoint, \u0027service_id\u0027)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # when the url is invalid, we should suppress the request"},{"line_number":106,"context_line":"        urls \u003d []"},{"line_number":107,"context_line":"        if endpoint.get(\u0027publicurl\u0027):"},{"line_number":108,"context_line":"            urls.append(endpoint[\u0027publicurl\u0027])"},{"line_number":109,"context_line":"        if endpoint.get(\u0027adminurl\u0027):"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_400e8735","line":106,"updated":"2015-07-20 15:14:54.000000000","message":"why is this necessary?","commit_id":"0e896c0abecf5a8583e2187f32ec9ce3e9c53571"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5c52ae1f4d0ad0513b602b7e37b4bab8781accf7","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self._require_attribute(endpoint, \u0027service_id\u0027)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # when the url is invalid, we should suppress the request"},{"line_number":106,"context_line":"        urls \u003d []"},{"line_number":107,"context_line":"        if endpoint.get(\u0027publicurl\u0027):"},{"line_number":108,"context_line":"            urls.append(endpoint[\u0027publicurl\u0027])"},{"line_number":109,"context_line":"        if endpoint.get(\u0027adminurl\u0027):"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_9b6880f7","line":106,"in_reply_to":"3a50d1a3_400e8735","updated":"2015-07-20 15:35:55.000000000","message":"It\u0027s not. I would replace all of this code with three explicit calls to the validator.","commit_id":"0e896c0abecf5a8583e2187f32ec9ce3e9c53571"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e02535b6683d8933f9ae9b64de10b998ae96ac61","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self._require_attribute(endpoint, \u0027service_id\u0027)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # when the url is invalid, we should suppress the request"},{"line_number":106,"context_line":"        urls \u003d []"},{"line_number":107,"context_line":"        if endpoint.get(\u0027publicurl\u0027):"},{"line_number":108,"context_line":"            urls.append(endpoint[\u0027publicurl\u0027])"},{"line_number":109,"context_line":"        if endpoint.get(\u0027adminurl\u0027):"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_366e21ca","line":106,"in_reply_to":"3a50d1a3_400e8735","updated":"2015-07-20 15:29:40.000000000","message":"Iterate through the collection on line 32 to do this logic without having a second list.","commit_id":"0e896c0abecf5a8583e2187f32ec9ce3e9c53571"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1eee830d2fb690aa4241c64dd7b04c926a02e622","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                                     core.WHITELISTED_PROPERTIES)"},{"line_number":114,"context_line":"        if endpoint.get(\u0027internalurl\u0027):"},{"line_number":115,"context_line":"            clean.check_endpoint_url(endpoint[\u0027internalurl\u0027],"},{"line_number":116,"context_line":"                                     core.WHITELISTED_PROPERTIES)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3a50d1a3_f8edcaef","line":116,"updated":"2015-07-21 14:54:44.000000000","message":"we are only doing this for the v2 api? Is this going to cause an inconsistency if v2 returns invalid for a specific url and v3 won\u0027t because it\u0027s not using the same validation framework?","commit_id":"881b60e72a7bde6edee8cf58436743e555ee462a"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"fb50fcabc1c701df367130c23a4aa4f12babab44","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        # service_id is necessary"},{"line_number":103,"context_line":"        self._require_attribute(endpoint, \u0027service_id\u0027)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # we should check publicurl, adminurl, internalurl"},{"line_number":106,"context_line":"        # if invalid, we should raise a exception to suppress"},{"line_number":107,"context_line":"        # the request"},{"line_number":108,"context_line":"        if endpoint.get(\u0027publicurl\u0027):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a50d1a3_e80c783d","line":105,"updated":"2015-07-24 03:24:53.000000000","message":"Change to iterate throug the list like this.\n\n\nfor interface in INTERFACES:\n    if endpoint.get(interface + \u0027url\u0027):\n            clean.check_endpoint_url(endpoint[interface + \u0027url\u0027],\n                                     core.WHITELISTED_PROPERTIES)","commit_id":"0e028a3085298b4c2f51b6e44002aa88aad2014b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8f16bc652bdc4ccf212005236bbca625f29dc1ec","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        self._require_attribute(endpoint, \u0027publicurl\u0027)"},{"line_number":102,"context_line":"        # service_id is necessary"},{"line_number":103,"context_line":"        self._require_attribute(endpoint, \u0027service_id\u0027)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # we should check publicurl, adminurl, internalurl"},{"line_number":106,"context_line":"        # if invalid, we should raise a exception to suppress"},{"line_number":107,"context_line":"        # the request"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a50d1a3_9d1f18b7","line":104,"updated":"2015-07-24 14:28:12.000000000","message":"this makes much more sense.  Thanks.","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"4ca3897775f26e0f9a2c8acc41ebd4f14bb07dea","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self._require_attribute(endpoint, \u0027service_id\u0027)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # we should check publicurl, adminurl, internalurl"},{"line_number":106,"context_line":"        # if invalid, we should raise a exception to suppress"},{"line_number":107,"context_line":"        # the request"},{"line_number":108,"context_line":"        for interface in INTERFACES:"},{"line_number":109,"context_line":"            if endpoint.get(interface + \u0027url\u0027):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a50d1a3_c08913cc","line":106,"updated":"2015-07-26 14:14:05.000000000","message":"s/a/an","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"9ad4593fec12bfac41a1cae22e576b610dd0465b","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self._require_attribute(endpoint, \u0027service_id\u0027)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # we should check publicurl, adminurl, internalurl"},{"line_number":106,"context_line":"        # if invalid, we should raise a exception to suppress"},{"line_number":107,"context_line":"        # the request"},{"line_number":108,"context_line":"        for interface in INTERFACES:"},{"line_number":109,"context_line":"            if endpoint.get(interface + \u0027url\u0027):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a50d1a3_66db78ee","line":106,"in_reply_to":"3a50d1a3_c08913cc","updated":"2015-07-29 23:53:58.000000000","message":"Done","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"4ab6acbcc6668686d4d09e58f686a67e4d1992b6","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self._require_attribute(endpoint, \u0027service_id\u0027)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # we should check publicurl, adminurl, internalurl"},{"line_number":106,"context_line":"        # if invalid, we should raise an exception to suppress"},{"line_number":107,"context_line":"        # the request"},{"line_number":108,"context_line":"        for interface in INTERFACES:"},{"line_number":109,"context_line":"            # we shouldn\u0027t use if endpoint.get(interface + \u0027url\u0027):"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a50d1a3_2dd30861","line":106,"updated":"2015-07-27 03:58:26.000000000","message":"s/suppress/reject","commit_id":"568fd8d58e2c6b796a323629df9a6bb9fdad0ce7"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"5a0f2dff7ff61c9362c3a1226b643166c2a8f91d","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        # if invalid, we should raise an exception to reject"},{"line_number":107,"context_line":"        # the request"},{"line_number":108,"context_line":"        for interface in INTERFACES:"},{"line_number":109,"context_line":"            if endpoint.get(interface + \u0027url\u0027):"},{"line_number":110,"context_line":"                utils.check_endpoint_url(endpoint[interface + \u0027url\u0027],"},{"line_number":111,"context_line":"                                         core.WHITELISTED_PROPERTIES)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"3a50d1a3_7dbd0867","line":109,"updated":"2015-07-28 01:58:27.000000000","message":"nit: no need to get this twice.\n\ninterface_url \u003d endpoint.get(interface + \u0027url\u0027)\nif interface_url:\n    utils.check_endpoint_url(interface_url,","commit_id":"4b7d1f4ff2567effc16f1e74091189a576cdc666"}],"keystone/catalog/core.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"41b4c4af524e2cad22b6d1361a490b428c492de1","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        substitutions)"},{"line_number":106,"context_line":"    try:"},{"line_number":107,"context_line":"        url.replace(\u0027$(\u0027, \u0027%(\u0027) % substitutions"},{"line_number":108,"context_line":"    except AttributeError:"},{"line_number":109,"context_line":"        raise exception.URLValidationError(url)"},{"line_number":110,"context_line":"    except KeyError:"},{"line_number":111,"context_line":"        raise exception.URLValidationError(url)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a50d1a3_84f51cee","line":108,"updated":"2015-07-28 05:49:29.000000000","message":"whilst frowned upon generally i think that this is a good time to use \n\nexcept Exception:\n\notherwise \n\nexcept (AttributeError, KeyError, TypeError, ValueError): \n    raise","commit_id":"8014e956a4a49264100894a3405256c14b27e617"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"75bf2c972a2f3e0df1a03edadabdb819e38a7bee","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    # check whether the property in the path is exactly the same"},{"line_number":101,"context_line":"    # with that in the whitelist below"},{"line_number":102,"context_line":"    substitutions \u003d {}"},{"line_number":103,"context_line":"    substitutions \u003d utils.WhiteListedItemFilter("},{"line_number":104,"context_line":"        WHITELISTED_PROPERTIES,"},{"line_number":105,"context_line":"        substitutions)"},{"line_number":106,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_2673d34f","line":103,"updated":"2015-07-28 15:38:56.000000000","message":"This will prevent any valid URLs that contain substitutions.","commit_id":"5f6feaad8fe0471b006a7cce3cdef6f04e022ed5"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"cbd8d2d239d40c1ab1890c2cb83995e69a8dd689","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    # check whether the property in the path is exactly the same"},{"line_number":101,"context_line":"    # with that in the whitelist below"},{"line_number":102,"context_line":"    substitutions \u003d {}"},{"line_number":103,"context_line":"    substitutions \u003d utils.WhiteListedItemFilter("},{"line_number":104,"context_line":"        WHITELISTED_PROPERTIES,"},{"line_number":105,"context_line":"        substitutions)"},{"line_number":106,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_e83855d5","line":103,"in_reply_to":"3a50d1a3_02e480dd","updated":"2015-07-28 16:08:58.000000000","message":"That code is used for a different purpose. You are passing in an empty dictionary for the context. This means that even if the value *is* in the whitelist the substitution will fail because there is not value for it. The other code that uses the filter has a fully populated dictionary of values.","commit_id":"5f6feaad8fe0471b006a7cce3cdef6f04e022ed5"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"16cac009bcbae4ae5fe9cdd6bed020adddd2f714","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    # check whether the property in the path is exactly the same"},{"line_number":101,"context_line":"    # with that in the whitelist below"},{"line_number":102,"context_line":"    substitutions \u003d {}"},{"line_number":103,"context_line":"    substitutions \u003d utils.WhiteListedItemFilter("},{"line_number":104,"context_line":"        WHITELISTED_PROPERTIES,"},{"line_number":105,"context_line":"        substitutions)"},{"line_number":106,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_02e480dd","line":103,"in_reply_to":"3a50d1a3_2673d34f","updated":"2015-07-28 16:01:57.000000000","message":"Why? In fact, I just reuse your code above.","commit_id":"5f6feaad8fe0471b006a7cce3cdef6f04e022ed5"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"ec424d5809c3abbd448f3e205f8073180372b98a","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    # check whether the property in the path is exactly the same"},{"line_number":101,"context_line":"    # with that in the whitelist below"},{"line_number":102,"context_line":"    substitutions \u003d {}"},{"line_number":103,"context_line":"    substitutions \u003d utils.WhiteListedItemFilter("},{"line_number":104,"context_line":"        WHITELISTED_PROPERTIES,"},{"line_number":105,"context_line":"        substitutions)"},{"line_number":106,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_c896b94b","line":103,"in_reply_to":"3a50d1a3_e83855d5","updated":"2015-07-29 03:27:58.000000000","message":"You want me to reuse your code. But I don\u0027t know to add what to substitutions \u003d {}. So I leave it {}.Can you tell me what should I add in it ?","commit_id":"5f6feaad8fe0471b006a7cce3cdef6f04e022ed5"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"dcd9a0392a153c50e699049360d86a0767fba7de","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    :param str url: the URL to validate"},{"line_number":98,"context_line":"    :rtype: None"},{"line_number":99,"context_line":"    :raises keystone.exception.URLValidationError: if the URL is invalid"},{"line_number":100,"context_line":"    \"\"\""},{"line_number":101,"context_line":"    # url with space is invalid"},{"line_number":102,"context_line":"    if \u0027 \u0027 in url:"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_908439d3","line":99,"updated":"2015-07-29 06:34:17.000000000","message":"Nice docstring!","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"de938053049756bd92f743f420648f80113fbab9","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    return result"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def check_endpoint_url(url):"},{"line_number":89,"context_line":"    \"\"\"Validate URL."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    When the url is not valid, should reject it"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a50d1a3_6601666a","line":88,"updated":"2015-07-30 14:25:32.000000000","message":"global-requirements already has rfc3986\u003e\u003d0.2.0 which can validate URLs. Use that rather than try to implement our own.","commit_id":"bd97f75bb93c226b3577e2fe0aa0513f02ecb4f0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2c9b05cfaf936e65748fbfa47f903f2ab7ef0e01","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    return result"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def check_endpoint_url(url):"},{"line_number":89,"context_line":"    \"\"\"Validate URL."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    When the url is not valid, should reject it"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a50d1a3_1aaeb1e7","line":88,"in_reply_to":"3a50d1a3_0faf552c","updated":"2015-07-30 15:27:13.000000000","message":"If the bug is only about substitutions then the fix shouldn\u0027t also be checking for spaces.","commit_id":"bd97f75bb93c226b3577e2fe0aa0513f02ecb4f0"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"dcd6badd5e8e8001fc9c0f8e79056a6078013f76","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    return result"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def check_endpoint_url(url):"},{"line_number":89,"context_line":"    \"\"\"Validate URL."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    When the url is not valid, should reject it"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a50d1a3_7a12550b","line":88,"in_reply_to":"3a50d1a3_1aaeb1e7","updated":"2015-07-30 15:31:29.000000000","message":"Have you ever read the launchpad and the commit log?\nhttps://bugs.launchpad.net/keystone/+bug/1471034\n\ne.g:\n\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\n\n1. have a space after 8774\n2. tenant_i d is not right.\n\nThis bug is about substitution and space.","commit_id":"bd97f75bb93c226b3577e2fe0aa0513f02ecb4f0"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"73028c92129325e68b81acf1c0925ce4d7b34d5a","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    return result"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def check_endpoint_url(url):"},{"line_number":89,"context_line":"    \"\"\"Validate URL."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    When the url is not valid, should reject it"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a50d1a3_d2501b0d","line":88,"in_reply_to":"3a50d1a3_215ed612","updated":"2015-07-31 01:36:35.000000000","message":"According some of your suggestion, I will only check substitution.\nIf you don\u0027t agree with me about this, I hope you can discuss with David first.","commit_id":"bd97f75bb93c226b3577e2fe0aa0513f02ecb4f0"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"1ab32771c54330d86d37085f00fdebe7360ffbfd","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    return result"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def check_endpoint_url(url):"},{"line_number":89,"context_line":"    \"\"\"Validate URL."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    When the url is not valid, should reject it"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a50d1a3_39e60a17","line":88,"in_reply_to":"3a50d1a3_215ed612","updated":"2015-07-30 23:39:12.000000000","message":"First of all, you said a url with a space is valid. That\u0027s because the broswer and curl will remove space by itself. So, you think a space in a url is removed by itself in every place???????????????\n\n\nMy preferred option is to use a library that validates URLs correctly rather than writing our own???\n\nI have told you that\n1. This bug is simply about the substitutions.\nThe rfc3986 is about validating every espect. https://www.ietf.org/rfc/rfc3986.txt\nI mean rfc3987 is for general validation. Here is a little special.\nI hope you can think twice.\n\n2. @Dolph Mathews @David Stanek They all think do it like this is okay.\nI hope that you can have a discuss with them.\n\nYou are like to use a library to validate substitution ???Please tell me how???","commit_id":"bd97f75bb93c226b3577e2fe0aa0513f02ecb4f0"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"bd6b9308b3377cbb9fc0365deb877bc4f232d764","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    return result"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def check_endpoint_url(url):"},{"line_number":89,"context_line":"    \"\"\"Validate URL."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    When the url is not valid, should reject it"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a50d1a3_0faf552c","line":88,"in_reply_to":"3a50d1a3_6601666a","updated":"2015-07-30 15:20:52.000000000","message":"1.\nThis bug is simply about the substitutions.\n\nThe rfc3986 is about validating every espect.\nhttps://www.ietf.org/rfc/rfc3986.txt\n\nI mean rfc3987 is for general validation.\nHere is a little special.\n\nI hope you can think twice.\n\n2. \n@Dolph Mathews  @David Stanek\nThey all think do it like this is okay. \n\nI hope that you can have a discuss with them.","commit_id":"bd97f75bb93c226b3577e2fe0aa0513f02ecb4f0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e0ec4c5c6eb02dbb12067b65760e1ae120967221","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    return result"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def check_endpoint_url(url):"},{"line_number":89,"context_line":"    \"\"\"Validate URL."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    When the url is not valid, should reject it"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a50d1a3_215ed612","line":88,"in_reply_to":"3a50d1a3_7a12550b","updated":"2015-07-30 21:31:16.000000000","message":"I did read the launchpad and the commit log, but then in your comment above you said \"This bug is simply about the substitutions.\". You will find this a couple of comments above. If all this commit was doing was validating the substitution strings in the URL I would be fine with that change. So this commit could be split into 2 commits, one to validate the substitutions and one to ensure there are no spaces. I\u0027d prefer it if the commit was split up since it would be easier to understand and review.\n\nI tried out a URL that has a space in it in a few user agents and they handled it without problems. I used Firefox, curl command line, and python requests library. So this new behavior will reject valid URLs and potentially result in breaking existing deployments. As such, keystone must not reject urls just because they have spaces in them. My preferred option is to use a library that validates URLs correctly rather than writing our own.","commit_id":"bd97f75bb93c226b3577e2fe0aa0513f02ecb4f0"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5365b17ac8a9668cb3bd96d64ef17c54b512f704","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def check_endpoint_url(url):"},{"line_number":89,"context_line":"    \"\"\"Check substitution of endpoint_url."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    When the url is not valid, should reject it"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3a50d1a3_c8070e80","line":89,"updated":"2015-07-31 03:34:28.000000000","message":"replace endpoint_url with url","commit_id":"0140a9914617b4101ca5fcb6952a5d3a733c918a"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"caea2d6ca29bff2a8125330dcb0ce4b0b2270e17","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def check_endpoint_url(url):"},{"line_number":89,"context_line":"    \"\"\"Check substitution of endpoint_url."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    When the url is not valid, should reject it"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3a50d1a3_883ee6d8","line":89,"in_reply_to":"3a50d1a3_c8070e80","updated":"2015-07-31 04:02:04.000000000","message":"Done","commit_id":"0140a9914617b4101ca5fcb6952a5d3a733c918a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5365b17ac8a9668cb3bd96d64ef17c54b512f704","unresolved":false,"context_lines":[{"line_number":88,"context_line":"def check_endpoint_url(url):"},{"line_number":89,"context_line":"    \"\"\"Check substitution of endpoint_url."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    When the url is not valid, should reject it"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    The invalid urls are as follows:"},{"line_number":94,"context_line":"    urls with substitutions that is not in the whitelist"}],"source_content_type":"text/x-python","patch_set":37,"id":"3a50d1a3_28f7928d","line":91,"updated":"2015-07-31 03:34:28.000000000","message":"Delete this","commit_id":"0140a9914617b4101ca5fcb6952a5d3a733c918a"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"caea2d6ca29bff2a8125330dcb0ce4b0b2270e17","unresolved":false,"context_lines":[{"line_number":88,"context_line":"def check_endpoint_url(url):"},{"line_number":89,"context_line":"    \"\"\"Check substitution of endpoint_url."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    When the url is not valid, should reject it"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    The invalid urls are as follows:"},{"line_number":94,"context_line":"    urls with substitutions that is not in the whitelist"}],"source_content_type":"text/x-python","patch_set":37,"id":"3a50d1a3_282472c4","line":91,"in_reply_to":"3a50d1a3_28f7928d","updated":"2015-07-31 04:02:04.000000000","message":"Done","commit_id":"0140a9914617b4101ca5fcb6952a5d3a733c918a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5365b17ac8a9668cb3bd96d64ef17c54b512f704","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    When the url is not valid, should reject it"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    The invalid urls are as follows:"},{"line_number":94,"context_line":"    urls with substitutions that is not in the whitelist"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    :param str url: the URL to validate"},{"line_number":97,"context_line":"    :rtype: None"}],"source_content_type":"text/x-python","patch_set":37,"id":"3a50d1a3_68335a63","line":94,"updated":"2015-07-31 03:34:28.000000000","message":"Replace this with:\n\nCheck the substitutions in the URL to make sure they are valid and on the whitelist.","commit_id":"0140a9914617b4101ca5fcb6952a5d3a733c918a"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"caea2d6ca29bff2a8125330dcb0ce4b0b2270e17","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    When the url is not valid, should reject it"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    The invalid urls are as follows:"},{"line_number":94,"context_line":"    urls with substitutions that is not in the whitelist"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    :param str url: the URL to validate"},{"line_number":97,"context_line":"    :rtype: None"}],"source_content_type":"text/x-python","patch_set":37,"id":"3a50d1a3_43367fe8","line":94,"in_reply_to":"3a50d1a3_68335a63","updated":"2015-07-31 04:02:04.000000000","message":"Done","commit_id":"0140a9914617b4101ca5fcb6952a5d3a733c918a"}],"keystone/catalog/schema.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"029530d954a23ea93912e78f8902f4622c7b48d2","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    \u0027additionalProperties\u0027: True"},{"line_number":98,"context_line":"}"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"_endpoint_properties_v2 \u003d {"},{"line_number":101,"context_line":"    \u0027service_id\u0027: {"},{"line_number":102,"context_line":"        \u0027type\u0027: \u0027string\u0027"},{"line_number":103,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a41bdd9_6ad3cfd5","line":100,"updated":"2015-07-15 14:05:07.000000000","message":"We currently don\u0027t use the jsonschema validation framework in Keystone to validate the v2.0 api. I think there is some other work that needs to be addressed before we start pulling the v2 schema validation under the jsonschema umbrella. One of those things would probably be to consolidate all the v2.0 validation logic into the same layer, which is something I attempted before but didn\u0027t have the bandwidth to finish it [0].\n\n\nI don\u0027t think we should just add v2.0 schemas to the current jsonschema implementation without cleaning things up first. \n\n\n[0] https://review.openstack.org/#/c/132095/","commit_id":"030ea322c6ebb8f1d8d84e807b6762aeaffe7ee4"}],"keystone/clean.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e1f94198868e67b2ec2a8a078f1ed377130000a8","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        netloc, port \u003d netloc.split(\u0027:\u0027)"},{"line_number":102,"context_line":"    try:"},{"line_number":103,"context_line":"        socket.gethostbyname(netloc)"},{"line_number":104,"context_line":"    except Exception:"},{"line_number":105,"context_line":"        LOG.warning(\u0027%s is not a valid host or ip.\u0027, netloc)"},{"line_number":106,"context_line":"        return False"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a41bdd9_0880d089","line":104,"updated":"2015-07-16 13:50:43.000000000","message":"this is catching everything if it goes wrong, we should look for a specific exception and build for that case","commit_id":"ea7ce8c7005873eabac4eeab38f2d0dbe8b4cb0c"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"e21062852fb3dc1e3efa15e8140f245d272b062a","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        netloc, port \u003d netloc.split(\u0027:\u0027)"},{"line_number":102,"context_line":"    try:"},{"line_number":103,"context_line":"        socket.gethostbyname(netloc)"},{"line_number":104,"context_line":"    except Exception:"},{"line_number":105,"context_line":"        LOG.warning(\u0027%s is not a valid host or ip.\u0027, netloc)"},{"line_number":106,"context_line":"        return False"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a41bdd9_437a3bbe","line":104,"in_reply_to":"9a41bdd9_0880d089","updated":"2015-07-29 23:57:29.000000000","message":"This is specific for testing netloc.Not everything.","commit_id":"ea7ce8c7005873eabac4eeab38f2d0dbe8b4cb0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e1f94198868e67b2ec2a8a078f1ed377130000a8","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        socket.gethostbyname(netloc)"},{"line_number":104,"context_line":"    except Exception:"},{"line_number":105,"context_line":"        LOG.warning(\u0027%s is not a valid host or ip.\u0027, netloc)"},{"line_number":106,"context_line":"        return False"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    if port and int(port) \u003e 65535:"},{"line_number":109,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a41bdd9_2829149b","line":106,"updated":"2015-07-16 13:50:43.000000000","message":"i\u0027d suggest re-raising the exception instead of just logging it.","commit_id":"ea7ce8c7005873eabac4eeab38f2d0dbe8b4cb0c"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"e21062852fb3dc1e3efa15e8140f245d272b062a","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        socket.gethostbyname(netloc)"},{"line_number":104,"context_line":"    except Exception:"},{"line_number":105,"context_line":"        LOG.warning(\u0027%s is not a valid host or ip.\u0027, netloc)"},{"line_number":106,"context_line":"        return False"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    if port and int(port) \u003e 65535:"},{"line_number":109,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a41bdd9_9f1e535e","line":106,"in_reply_to":"9a41bdd9_2829149b","updated":"2015-07-29 23:57:29.000000000","message":"re-raise what exception?This is only the part of url.Do you want me to create a new exception for netloc ?  maybe name NetlocError ?\n\nIf netloc should re-raise exception?\nWhy not port ?\nWhy not scheme?\nThey are all just one part of the url.\nSo I think that check all and raise once for conclusion is more proper.\n\nWelcome to correct me.","commit_id":"ea7ce8c7005873eabac4eeab38f2d0dbe8b4cb0c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5c52ae1f4d0ad0513b602b7e37b4bab8781accf7","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    return name"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"def check_endpoint_url(url, whitelist):"},{"line_number":68,"context_line":"    \"\"\"Validate url like \u0027\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\u0027"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    When the url is not valid, should suppress it"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_3609412d","line":67,"updated":"2015-07-20 15:35:55.000000000","message":"Instead of returning True or False why isn\u0027t this just raising a validation error when it needs to?","commit_id":"0e896c0abecf5a8583e2187f32ec9ce3e9c53571"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5c52ae1f4d0ad0513b602b7e37b4bab8781accf7","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    # check whether the property in the path is exactly the same"},{"line_number":86,"context_line":"    # with that in the WHITELISTED_PROPERTIES below"},{"line_number":87,"context_line":"    WHITELISTED_PROPERTIES \u003d {}"},{"line_number":88,"context_line":"    for property in whitelist:"},{"line_number":89,"context_line":"        WHITELISTED_PROPERTIES[property] \u003d property"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_5625eda8","line":87,"updated":"2015-07-20 15:35:55.000000000","message":"(nit) lowercase this since this isn\u0027t a constant. also this whole thing boils down to:\n\n  whitelist \u003d dict((v, v) for v in whitelist)","commit_id":"0e896c0abecf5a8583e2187f32ec9ce3e9c53571"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5c52ae1f4d0ad0513b602b7e37b4bab8781accf7","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            path \u003d path % WHITELISTED_PROPERTIES"},{"line_number":96,"context_line":"        except Exception:"},{"line_number":97,"context_line":"            LOG.warning(\u0027The path: %s has error.\u0027, path)"},{"line_number":98,"context_line":"            return False"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_36caa1a2","line":97,"updated":"2015-07-20 15:35:55.000000000","message":"This still hasn\u0027t been updated. I mentioned in a previous revision that you need to wrap the string here with the _LW i18n helper.","commit_id":"0e896c0abecf5a8583e2187f32ec9ce3e9c53571"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d2d63d6162c56fad3fbdf927f1b05cf0eb718e4c","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    \"\"\""},{"line_number":77,"context_line":"    # valid url should not be None"},{"line_number":78,"context_line":"    if not url:"},{"line_number":79,"context_line":"        LOG.warning(_LW(\u0027The url should not be None.\u0027))"},{"line_number":80,"context_line":"        raise exception.ValidationURLError(url)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    # url with space is invalid"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a50d1a3_c547b749","line":79,"updated":"2015-07-21 19:57:36.000000000","message":"please don\u0027t raise a warning for this. operators do not need to be awoken in the middle of the night because end users made a bad request.","commit_id":"881b60e72a7bde6edee8cf58436743e555ee462a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d2d63d6162c56fad3fbdf927f1b05cf0eb718e4c","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    # url with space is invalid"},{"line_number":83,"context_line":"    if \u0027 \u0027 in url:"},{"line_number":84,"context_line":"        LOG.warning(_LW(\u0027There is some space in url.\u0027))"},{"line_number":85,"context_line":"        raise exception.ValidationURLError(url)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    # check whether the property in the path is exactly the same"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a50d1a3_659ca3c0","line":84,"updated":"2015-07-21 19:57:36.000000000","message":"same","commit_id":"881b60e72a7bde6edee8cf58436743e555ee462a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d2d63d6162c56fad3fbdf927f1b05cf0eb718e4c","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        path \u003d path.replace(\u0027$\u0027, \u0027%\u0027)"},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            path \u003d path % whitelist"},{"line_number":96,"context_line":"        except Exception:"},{"line_number":97,"context_line":"            LOG.warning(_LW(\u0027The path: %s has error.\u0027), path)"},{"line_number":98,"context_line":"            raise exception.ValidationURLError(url)"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3a50d1a3_a5baab21","line":96,"updated":"2015-07-21 19:57:36.000000000","message":"what Exception, exactly? be more specific","commit_id":"881b60e72a7bde6edee8cf58436743e555ee462a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d2d63d6162c56fad3fbdf927f1b05cf0eb718e4c","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            path \u003d path % whitelist"},{"line_number":96,"context_line":"        except Exception:"},{"line_number":97,"context_line":"            LOG.warning(_LW(\u0027The path: %s has error.\u0027), path)"},{"line_number":98,"context_line":"            raise exception.ValidationURLError(url)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3a50d1a3_25a69b10","line":97,"updated":"2015-07-21 19:57:36.000000000","message":"same","commit_id":"881b60e72a7bde6edee8cf58436743e555ee462a"}],"keystone/common/clean.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"4ca3897775f26e0f9a2c8acc41ebd4f14bb07dea","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    return name"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"def check_endpoint_url(url, whitelist):"},{"line_number":64,"context_line":"    \"\"\"Validate url like \u0027\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\u0027"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    When the url is not valid, should suppress it"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a50d1a3_863c84c0","line":63,"updated":"2015-07-26 14:14:05.000000000","message":"I am wonder why this is not in the common.utils but here?","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"9ad4593fec12bfac41a1cae22e576b610dd0465b","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    return name"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"def check_endpoint_url(url, whitelist):"},{"line_number":64,"context_line":"    \"\"\"Validate url like \u0027\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\u0027"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    When the url is not valid, should suppress it"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a50d1a3_46f75c59","line":63,"in_reply_to":"3a50d1a3_863c84c0","updated":"2015-07-29 23:53:58.000000000","message":"The clean.py is about check the validation of variable.Such as name,type ,url and so on.\nAnd common.utils is about implementation of some small deal data. etc, format datetime.\n\nSo I think that it\u0027 much better put check_endpoint_url here.","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"4ca3897775f26e0f9a2c8acc41ebd4f14bb07dea","unresolved":false,"context_lines":[{"line_number":63,"context_line":"def check_endpoint_url(url, whitelist):"},{"line_number":64,"context_line":"    \"\"\"Validate url like \u0027\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\u0027"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    When the url is not valid, should suppress it"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    The invalid urls are as follows:"},{"line_number":69,"context_line":"    1. a url which is None"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a50d1a3_4063c31a","line":66,"updated":"2015-07-26 14:14:05.000000000","message":"s/suppress/reject to consistent with your commit message.","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"9ad4593fec12bfac41a1cae22e576b610dd0465b","unresolved":false,"context_lines":[{"line_number":63,"context_line":"def check_endpoint_url(url, whitelist):"},{"line_number":64,"context_line":"    \"\"\"Validate url like \u0027\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\u0027"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    When the url is not valid, should suppress it"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    The invalid urls are as follows:"},{"line_number":69,"context_line":"    1. a url which is None"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a50d1a3_0698741a","line":66,"in_reply_to":"3a50d1a3_4063c31a","updated":"2015-07-29 23:53:58.000000000","message":"Done","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"4ca3897775f26e0f9a2c8acc41ebd4f14bb07dea","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    # url with space is invalid"},{"line_number":78,"context_line":"    if \u0027 \u0027 in url:"},{"line_number":79,"context_line":"        raise exception.URLValidationError(url)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    # check whether the property in the path is exactly the same"},{"line_number":82,"context_line":"    # with that in the whitelist below"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a50d1a3_404ae384","line":79,"updated":"2015-07-26 14:14:05.000000000","message":"if not url or \u0027 \u0027 in url:\n    raise exception.URLValidationError(url)","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"9ad4593fec12bfac41a1cae22e576b610dd0465b","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    # url with space is invalid"},{"line_number":78,"context_line":"    if \u0027 \u0027 in url:"},{"line_number":79,"context_line":"        raise exception.URLValidationError(url)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    # check whether the property in the path is exactly the same"},{"line_number":82,"context_line":"    # with that in the whitelist below"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a50d1a3_269330fc","line":79,"in_reply_to":"3a50d1a3_404ae384","updated":"2015-07-29 23:53:58.000000000","message":"Done","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"4ca3897775f26e0f9a2c8acc41ebd4f14bb07dea","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        try:"},{"line_number":89,"context_line":"            path \u003d path % whitelist"},{"line_number":90,"context_line":"        except KeyError:"},{"line_number":91,"context_line":"            # do not raise keyError, should raise URLValidationError"},{"line_number":92,"context_line":"            pass"},{"line_number":93,"context_line":"        raise exception.URLValidationError(url)"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a50d1a3_a0f72758","line":91,"updated":"2015-07-26 14:14:05.000000000","message":"except KeyError:\n    raise exception.URLValidationError(url)","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"9ad4593fec12bfac41a1cae22e576b610dd0465b","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        try:"},{"line_number":89,"context_line":"            path \u003d path % whitelist"},{"line_number":90,"context_line":"        except KeyError:"},{"line_number":91,"context_line":"            # do not raise keyError, should raise URLValidationError"},{"line_number":92,"context_line":"            pass"},{"line_number":93,"context_line":"        raise exception.URLValidationError(url)"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a50d1a3_468e7cd1","line":91,"in_reply_to":"3a50d1a3_a0f72758","updated":"2015-07-29 23:53:58.000000000","message":"Done","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"4ab6acbcc6668686d4d09e58f686a67e4d1992b6","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    return name"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"def check_endpoint_url(url, whitelist):"},{"line_number":64,"context_line":"    \"\"\"Validate url like \u0027\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\u0027"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    When the url is not valid, should reject it"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a50d1a3_ad46381f","line":63,"updated":"2015-07-27 03:58:26.000000000","message":"This method doesn\u0027t belong here, should be in the utils.py. I have this patch under review, https://review.openstack.org/#/c/205886/, not sure whether this can happen, but the method provided is definitely not here.","commit_id":"568fd8d58e2c6b796a323629df9a6bb9fdad0ce7"}],"keystone/common/controller.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e13c8daaa95b0f5f08dbee5db83a6dc1231f36f1","unresolved":false,"context_lines":[{"line_number":375,"context_line":"        return o"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"    def validate_url(self, url):"},{"line_number":378,"context_line":"        \"\"\"validate url like \u0027\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\u0027"},{"line_number":379,"context_line":"           when the url is not valid or not right, should suppress it"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_cd5c1c4f","line":378,"updated":"2015-07-10 13:35:34.000000000","message":"http://docs.openstack.org/developer/hacking/#docstrings","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"ccfa7a31303bed2ead23cf7828c2d249ff7b17f6","unresolved":false,"context_lines":[{"line_number":375,"context_line":"        return o"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"    def validate_url(self, url):"},{"line_number":378,"context_line":"        \"\"\"validate url like \u0027\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\u0027"},{"line_number":379,"context_line":"           when the url is not valid or not right, should suppress it"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_485eba7a","line":378,"in_reply_to":"ba3cc151_cd5c1c4f","updated":"2015-07-29 04:00:01.000000000","message":"Done","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e13c8daaa95b0f5f08dbee5db83a6dc1231f36f1","unresolved":false,"context_lines":[{"line_number":381,"context_line":"        \"\"\""},{"line_number":382,"context_line":"        # some test case set url \u003d None,"},{"line_number":383,"context_line":"        # eg: test_v3_catalog.test_create_endpoint_on_v2"},{"line_number":384,"context_line":"        if not url:"},{"line_number":385,"context_line":"            return True"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        url \u003d url.replace(\u0027localhost\u0027, \u0027127.0.0.1\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_8d7ff4aa","line":384,"updated":"2015-07-10 13:35:34.000000000","message":"So None and \u0027\u0027 are valid URLs?","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"ccfa7a31303bed2ead23cf7828c2d249ff7b17f6","unresolved":false,"context_lines":[{"line_number":381,"context_line":"        \"\"\""},{"line_number":382,"context_line":"        # some test case set url \u003d None,"},{"line_number":383,"context_line":"        # eg: test_v3_catalog.test_create_endpoint_on_v2"},{"line_number":384,"context_line":"        if not url:"},{"line_number":385,"context_line":"            return True"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        url \u003d url.replace(\u0027localhost\u0027, \u0027127.0.0.1\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_28449619","line":384,"in_reply_to":"ba3cc151_8d7ff4aa","updated":"2015-07-29 04:00:01.000000000","message":"Done","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e13c8daaa95b0f5f08dbee5db83a6dc1231f36f1","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        if not url:"},{"line_number":385,"context_line":"            return True"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        url \u003d url.replace(\u0027localhost\u0027, \u0027127.0.0.1\u0027)"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"        # url with space is invalid"},{"line_number":390,"context_line":"        if url.find(\u0027 \u0027) !\u003d -1:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_2db9087a","line":387,"updated":"2015-07-10 13:35:34.000000000","message":"why? the logic below is broken.","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"ccfa7a31303bed2ead23cf7828c2d249ff7b17f6","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        if not url:"},{"line_number":385,"context_line":"            return True"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        url \u003d url.replace(\u0027localhost\u0027, \u0027127.0.0.1\u0027)"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"        # url with space is invalid"},{"line_number":390,"context_line":"        if url.find(\u0027 \u0027) !\u003d -1:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_3e2feca8","line":387,"in_reply_to":"ba3cc151_2db9087a","updated":"2015-07-29 04:00:01.000000000","message":"Thanks.I will modify it soon.","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"7c147ce65c2294b5df07dac2a279058dcdcc0a3a","unresolved":false,"context_lines":[{"line_number":389,"context_line":"        # url with space is invalid"},{"line_number":390,"context_line":"        if url.find(\u0027 \u0027) !\u003d -1:"},{"line_number":391,"context_line":"            return False"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        if url.startswith(\u0027http\u0027) and url.endswith(\u0027.com\u0027):"},{"line_number":394,"context_line":"            return True"},{"line_number":395,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_3eb4ccd2","line":392,"updated":"2015-07-10 14:25:41.000000000","message":"you should check if the url does NOT start with \"http\" and return false from that,  if you return true it won\u0027t actually check validity of the url, it is just checking the syntax.  Also your url will not always end with \".com\".   Can you have other top-level domains, other than \".com\"?","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e13c8daaa95b0f5f08dbee5db83a6dc1231f36f1","unresolved":false,"context_lines":[{"line_number":397,"context_line":"        if url \u003d\u003d \u0027http://127.0.0.1:8080\u0027:"},{"line_number":398,"context_line":"            return True"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"        ip_port_start \u003d url.find(\u0027//\u0027) + 2"},{"line_number":401,"context_line":"        ip_port_end \u003d url.find(\u0027/\u0027, ip_port_start)"},{"line_number":402,"context_line":"        if ip_port_end \u003d\u003d -1:"},{"line_number":403,"context_line":"            ip_port_end \u003d len(url)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_6d34f0fa","line":400,"updated":"2015-07-10 13:35:34.000000000","message":"why are you not using urlparse instead of doing this logic?","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"ccfa7a31303bed2ead23cf7828c2d249ff7b17f6","unresolved":false,"context_lines":[{"line_number":397,"context_line":"        if url \u003d\u003d \u0027http://127.0.0.1:8080\u0027:"},{"line_number":398,"context_line":"            return True"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"        ip_port_start \u003d url.find(\u0027//\u0027) + 2"},{"line_number":401,"context_line":"        ip_port_end \u003d url.find(\u0027/\u0027, ip_port_start)"},{"line_number":402,"context_line":"        if ip_port_end \u003d\u003d -1:"},{"line_number":403,"context_line":"            ip_port_end \u003d len(url)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_432f7ba7","line":400,"in_reply_to":"ba3cc151_6d34f0fa","updated":"2015-07-29 04:00:01.000000000","message":"Good suggestion.Thank you.I will modify right now.","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e13c8daaa95b0f5f08dbee5db83a6dc1231f36f1","unresolved":false,"context_lines":[{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        # check whether ip is valid or not"},{"line_number":413,"context_line":"        try:"},{"line_number":414,"context_line":"            socket.inet_aton(ip)"},{"line_number":415,"context_line":"        except socket.error:"},{"line_number":416,"context_line":"            return False"},{"line_number":417,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_ade0b897","line":414,"updated":"2015-07-10 13:35:34.000000000","message":"What about names?","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"ccfa7a31303bed2ead23cf7828c2d249ff7b17f6","unresolved":false,"context_lines":[{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        # check whether ip is valid or not"},{"line_number":413,"context_line":"        try:"},{"line_number":414,"context_line":"            socket.inet_aton(ip)"},{"line_number":415,"context_line":"        except socket.error:"},{"line_number":416,"context_line":"            return False"},{"line_number":417,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_be753ccd","line":414,"in_reply_to":"ba3cc151_ade0b897","updated":"2015-07-29 04:00:01.000000000","message":"Good consideration.I will think it twice.","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e13c8daaa95b0f5f08dbee5db83a6dc1231f36f1","unresolved":false,"context_lines":[{"line_number":416,"context_line":"            return False"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"        # a valid port should in [1024, 65535]"},{"line_number":419,"context_line":"        if port \u003c \u00271024\u0027 or port \u003e \u002765535\u0027:"},{"line_number":420,"context_line":"            return False"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        # tanant_id should exactly \u0027$(tenant_id)s\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_ed680024","line":419,"updated":"2015-07-10 13:35:34.000000000","message":"Why? I can run on port 80 if I want to!","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"ccfa7a31303bed2ead23cf7828c2d249ff7b17f6","unresolved":false,"context_lines":[{"line_number":416,"context_line":"            return False"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"        # a valid port should in [1024, 65535]"},{"line_number":419,"context_line":"        if port \u003c \u00271024\u0027 or port \u003e \u002765535\u0027:"},{"line_number":420,"context_line":"            return False"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        # tanant_id should exactly \u0027$(tenant_id)s\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_884cc2c9","line":419,"in_reply_to":"ba3cc151_ed680024","updated":"2015-07-29 04:00:01.000000000","message":"Done","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":17073,"name":"Theodore Ilie","email":"theodorex.ilie@intel.com","username":"Lactem"},"change_message_id":"2d2a9d98fbc382e90aafe61f46ee428f55b2afee","unresolved":false,"context_lines":[{"line_number":419,"context_line":"        if port \u003c \u00271024\u0027 or port \u003e \u002765535\u0027:"},{"line_number":420,"context_line":"            return False"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        # tanant_id should exactly \u0027$(tenant_id)s\u0027"},{"line_number":423,"context_line":"        if tenant_id_str !\u003d \u0027$(tenant_id)s\u0027:"},{"line_number":424,"context_line":"            return False"},{"line_number":425,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_25227802","line":422,"updated":"2015-07-10 15:43:07.000000000","message":"I\u0027m not sure if endpoints can have endpoint_id in them, but if they can then you should check to make sure endpoint_id is exactly endpoint_id in the same way you make sure tenant_id is exactly tenant_id.","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e13c8daaa95b0f5f08dbee5db83a6dc1231f36f1","unresolved":false,"context_lines":[{"line_number":419,"context_line":"        if port \u003c \u00271024\u0027 or port \u003e \u002765535\u0027:"},{"line_number":420,"context_line":"            return False"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        # tanant_id should exactly \u0027$(tenant_id)s\u0027"},{"line_number":423,"context_line":"        if tenant_id_str !\u003d \u0027$(tenant_id)s\u0027:"},{"line_number":424,"context_line":"            return False"},{"line_number":425,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_0d58c489","line":422,"updated":"2015-07-10 13:35:34.000000000","message":"tenant_id?","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"ccfa7a31303bed2ead23cf7828c2d249ff7b17f6","unresolved":false,"context_lines":[{"line_number":419,"context_line":"        if port \u003c \u00271024\u0027 or port \u003e \u002765535\u0027:"},{"line_number":420,"context_line":"            return False"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        # tanant_id should exactly \u0027$(tenant_id)s\u0027"},{"line_number":423,"context_line":"        if tenant_id_str !\u003d \u0027$(tenant_id)s\u0027:"},{"line_number":424,"context_line":"            return False"},{"line_number":425,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_8875a2fb","line":422,"in_reply_to":"ba3cc151_0d58c489","updated":"2015-07-29 04:00:01.000000000","message":"what do you mean? more details?","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"40d8084d1e35bc35d3565e1798c582ecf0a90e3c","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import functools"},{"line_number":16,"context_line":"from urlparse import urlparse"},{"line_number":17,"context_line":"import uuid"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_342f26a3","line":16,"updated":"2015-07-11 08:04:45.000000000","message":"Do not import objects, only modules\nsee: http://docs.openstack.org/developer/hacking/#imports","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"703b4f63e4fa5b7a0ee681208fc981ad3b273382","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import functools"},{"line_number":16,"context_line":"from urlparse import urlparse"},{"line_number":17,"context_line":"import uuid"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_28090a96","line":16,"in_reply_to":"9a41bdd9_342f26a3","updated":"2015-07-29 04:01:12.000000000","message":"Done","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"40d8084d1e35bc35d3565e1798c582ecf0a90e3c","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from oslo_config import cfg"},{"line_number":20,"context_line":"from oslo_log import log"},{"line_number":21,"context_line":"import six"},{"line_number":22,"context_line":"import socket"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from keystone.common import authorization"},{"line_number":25,"context_line":"from keystone.common import dependency"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_948632b8","line":22,"updated":"2015-07-11 08:04:45.000000000","message":"socket is python lib, it\u0027s not belonged here.\nsee: http://docs.openstack.org/developer/hacking/#import-order-template","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"703b4f63e4fa5b7a0ee681208fc981ad3b273382","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from oslo_config import cfg"},{"line_number":20,"context_line":"from oslo_log import log"},{"line_number":21,"context_line":"import six"},{"line_number":22,"context_line":"import socket"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from keystone.common import authorization"},{"line_number":25,"context_line":"from keystone.common import dependency"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_c8fdfe6f","line":22,"in_reply_to":"9a41bdd9_948632b8","updated":"2015-07-29 04:01:12.000000000","message":"Done","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"40d8084d1e35bc35d3565e1798c582ecf0a90e3c","unresolved":false,"context_lines":[{"line_number":378,"context_line":"    def validate_url(self, url):"},{"line_number":379,"context_line":"        \"\"\"Validate url like \u0027\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\u0027"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"           When the url is not valid or not right, should suppress it"},{"line_number":382,"context_line":"        \"\"\""},{"line_number":383,"context_line":"        # valid url should not be None"},{"line_number":384,"context_line":"        if not url:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_34f2c69b","line":381,"updated":"2015-07-11 08:04:45.000000000","message":"Expect more details in the docstring about which cases are not rights.","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"703b4f63e4fa5b7a0ee681208fc981ad3b273382","unresolved":false,"context_lines":[{"line_number":378,"context_line":"    def validate_url(self, url):"},{"line_number":379,"context_line":"        \"\"\"Validate url like \u0027\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\u0027"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"           When the url is not valid or not right, should suppress it"},{"line_number":382,"context_line":"        \"\"\""},{"line_number":383,"context_line":"        # valid url should not be None"},{"line_number":384,"context_line":"        if not url:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_e802426f","line":381,"in_reply_to":"9a41bdd9_34f2c69b","updated":"2015-07-29 04:01:12.000000000","message":"Done","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"40d8084d1e35bc35d3565e1798c582ecf0a90e3c","unresolved":false,"context_lines":[{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        try:"},{"line_number":407,"context_line":"            socket.gethostbyname(netloc)"},{"line_number":408,"context_line":"        except Exception:"},{"line_number":409,"context_line":"            return False"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        if port and int(port) \u003e 65535:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_8841363c","line":408,"updated":"2015-07-11 08:04:45.000000000","message":"log some info when exception happens here.","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"703b4f63e4fa5b7a0ee681208fc981ad3b273382","unresolved":false,"context_lines":[{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        try:"},{"line_number":407,"context_line":"            socket.gethostbyname(netloc)"},{"line_number":408,"context_line":"        except Exception:"},{"line_number":409,"context_line":"            return False"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        if port and int(port) \u003e 65535:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_88f8567e","line":408,"in_reply_to":"9a41bdd9_8841363c","updated":"2015-07-29 04:01:12.000000000","message":"Done","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"40d8084d1e35bc35d3565e1798c582ecf0a90e3c","unresolved":false,"context_lines":[{"line_number":413,"context_line":""},{"line_number":414,"context_line":"        # check whether tenant_id or endpoint_id exist"},{"line_number":415,"context_line":"        if (path and"},{"line_number":416,"context_line":"            (path.find(\u0027$(tenant_id)s\u0027) !\u003d -1"},{"line_number":417,"context_line":"             or path.find(\u0027$(endpoint_id)s\u0027) !\u003d -1)):"},{"line_number":418,"context_line":"            return True"},{"line_number":419,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_28d82a53","line":416,"updated":"2015-07-11 08:04:45.000000000","message":"why focus on the tenant_id and endpoint_id,\nsee: https://github.com/openstack/keystone/blob/master/keystone/catalog/core.py#L51-L54, all of them are valid substitution.","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"703b4f63e4fa5b7a0ee681208fc981ad3b273382","unresolved":false,"context_lines":[{"line_number":413,"context_line":""},{"line_number":414,"context_line":"        # check whether tenant_id or endpoint_id exist"},{"line_number":415,"context_line":"        if (path and"},{"line_number":416,"context_line":"            (path.find(\u0027$(tenant_id)s\u0027) !\u003d -1"},{"line_number":417,"context_line":"             or path.find(\u0027$(endpoint_id)s\u0027) !\u003d -1)):"},{"line_number":418,"context_line":"            return True"},{"line_number":419,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_48f24e9c","line":416,"in_reply_to":"9a41bdd9_28d82a53","updated":"2015-07-29 04:01:12.000000000","message":"Done","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"40d8084d1e35bc35d3565e1798c582ecf0a90e3c","unresolved":false,"context_lines":[{"line_number":415,"context_line":"        if (path and"},{"line_number":416,"context_line":"            (path.find(\u0027$(tenant_id)s\u0027) !\u003d -1"},{"line_number":417,"context_line":"             or path.find(\u0027$(endpoint_id)s\u0027) !\u003d -1)):"},{"line_number":418,"context_line":"            return True"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"        return True"},{"line_number":421,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_e82a422c","line":418,"updated":"2015-07-11 08:04:45.000000000","message":"I think the code logic here is wrong, it will always True start from here, see your code at the end of this method, so what\u0027s the purpose of the validation here, the method will return True even the check here is negative.","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"703b4f63e4fa5b7a0ee681208fc981ad3b273382","unresolved":false,"context_lines":[{"line_number":415,"context_line":"        if (path and"},{"line_number":416,"context_line":"            (path.find(\u0027$(tenant_id)s\u0027) !\u003d -1"},{"line_number":417,"context_line":"             or path.find(\u0027$(endpoint_id)s\u0027) !\u003d -1)):"},{"line_number":418,"context_line":"            return True"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"        return True"},{"line_number":421,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_68ef12b1","line":418,"in_reply_to":"9a41bdd9_e82a422c","updated":"2015-07-29 04:01:12.000000000","message":"Done","commit_id":"f5f86e9e6fdc16cf6de9d2d94e0f18640aae4e9d"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"4c4e7e11d86dd3461bb529d6f3e3ea8ded189fa7","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    import urlparse"},{"line_number":21,"context_line":"except ImportError:"},{"line_number":22,"context_line":"    # For python3"},{"line_number":23,"context_line":"    import urllib.parse as urlparse"},{"line_number":24,"context_line":"import uuid"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a41bdd9_d4103051","line":23,"updated":"2015-07-12 08:46:48.000000000","message":"try this: six.moves.urllib?","commit_id":"c288e7d6ea428dc88e9a39543c56135de4c2617b"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"cbd4a35bb11796e2e37bb6f772191e0ce56c736b","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    import urlparse"},{"line_number":21,"context_line":"except ImportError:"},{"line_number":22,"context_line":"    # For python3"},{"line_number":23,"context_line":"    import urllib.parse as urlparse"},{"line_number":24,"context_line":"import uuid"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a41bdd9_74b9242e","line":23,"in_reply_to":"9a41bdd9_d4103051","updated":"2015-07-29 12:37:14.000000000","message":"Done","commit_id":"c288e7d6ea428dc88e9a39543c56135de4c2617b"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"4c4e7e11d86dd3461bb529d6f3e3ea8ded189fa7","unresolved":false,"context_lines":[{"line_number":392,"context_line":"           3. a url whose scheme is not \u0027http\u0027 or \u0027https\u0027"},{"line_number":393,"context_line":"           4. a url whose host in not valid"},{"line_number":394,"context_line":"           5. a url whose port is greater than 65535(if the url has port)"},{"line_number":395,"context_line":"        \"\"\""},{"line_number":396,"context_line":"        # valid url should not be None"},{"line_number":397,"context_line":"        if not url:"},{"line_number":398,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a41bdd9_34ff1c03","line":395,"updated":"2015-07-12 08:46:48.000000000","message":"this is over indented, see L325 in this file for example.","commit_id":"c288e7d6ea428dc88e9a39543c56135de4c2617b"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"cbd4a35bb11796e2e37bb6f772191e0ce56c736b","unresolved":false,"context_lines":[{"line_number":392,"context_line":"           3. a url whose scheme is not \u0027http\u0027 or \u0027https\u0027"},{"line_number":393,"context_line":"           4. a url whose host in not valid"},{"line_number":394,"context_line":"           5. a url whose port is greater than 65535(if the url has port)"},{"line_number":395,"context_line":"        \"\"\""},{"line_number":396,"context_line":"        # valid url should not be None"},{"line_number":397,"context_line":"        if not url:"},{"line_number":398,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a41bdd9_94b6283c","line":395,"in_reply_to":"9a41bdd9_34ff1c03","updated":"2015-07-29 12:37:14.000000000","message":"Done","commit_id":"c288e7d6ea428dc88e9a39543c56135de4c2617b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a7151debbb010728e861a4f370bea18621c3cb88","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import functools"},{"line_number":16,"context_line":"from six.moves.urllib import parse"},{"line_number":17,"context_line":"import socket"},{"line_number":18,"context_line":"import uuid"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a41bdd9_97b11c92","line":16,"updated":"2015-07-13 12:36:58.000000000","message":"This is a third party module and should be in the next section.","commit_id":"2cda136ffc6e5acd0728b0bd5aea09fb738b1d5c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3ad74fd4f9bcecbdeeefe49dfb5c36d3736b53d9","unresolved":false,"context_lines":[{"line_number":375,"context_line":"             \u0027tenants_links\u0027: []}"},{"line_number":376,"context_line":"        return o"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    def validate_url(self, url):"},{"line_number":379,"context_line":"        \"\"\"Validate url like \u0027\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\u0027"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        When the url is not valid or not right, should suppress it"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a41bdd9_2b06a9ce","line":378,"updated":"2015-07-13 13:11:58.000000000","message":"We relaxed the initial scheme requirements for urls once already [0] in order to support ipv6 [1]. I\u0027m not sure we\u0027re ready to tighten it back up. Not to mention I think this builds too much validation logic outside of the module that we already have to do this [2]. \n\n\n[0] https://github.com/openstack/keystone/blob/c387a9353ed8c06428e2ee8b1fbfe71e3b60a737/keystone/common/validation/parameter_types.py#L50-L58\n\n[1] https://github.com/openstack/keystone/commit/7fa6e92c441644c0d990e79a78692b786d88acec\n\n[2] https://github.com/openstack/keystone/tree/c387a9353ed8c06428e2ee8b1fbfe71e3b60a737/keystone/common/validation","commit_id":"2cda136ffc6e5acd0728b0bd5aea09fb738b1d5c"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"a2c268b3afc52e800b18fc311a594ba7ddd02e24","unresolved":false,"context_lines":[{"line_number":375,"context_line":"             \u0027tenants_links\u0027: []}"},{"line_number":376,"context_line":"        return o"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    def validate_url(self, url):"},{"line_number":379,"context_line":"        \"\"\"Validate url like \u0027\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\u0027"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        When the url is not valid or not right, should suppress it"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a41bdd9_ad862d11","line":378,"in_reply_to":"9a41bdd9_2b06a9ce","updated":"2015-07-29 12:37:35.000000000","message":"The info you provide can not prevent many invalid case. such as: http://sth.comm","commit_id":"2cda136ffc6e5acd0728b0bd5aea09fb738b1d5c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a7151debbb010728e861a4f370bea18621c3cb88","unresolved":false,"context_lines":[{"line_number":376,"context_line":"        return o"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    def validate_url(self, url):"},{"line_number":379,"context_line":"        \"\"\"Validate url like \u0027\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\u0027"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        When the url is not valid or not right, should suppress it"},{"line_number":382,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a41bdd9_b721c0b6","line":379,"updated":"2015-07-13 12:36:58.000000000","message":"put the example later in the docstring.","commit_id":"2cda136ffc6e5acd0728b0bd5aea09fb738b1d5c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a7151debbb010728e861a4f370bea18621c3cb88","unresolved":false,"context_lines":[{"line_number":378,"context_line":"    def validate_url(self, url):"},{"line_number":379,"context_line":"        \"\"\"Validate url like \u0027\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\u0027"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        When the url is not valid or not right, should suppress it"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        The invalid urls are as follows:"},{"line_number":384,"context_line":"        1. a url which is none value"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a41bdd9_57595459","line":381,"updated":"2015-07-13 12:36:58.000000000","message":"delete \u0027or not right\u0027","commit_id":"2cda136ffc6e5acd0728b0bd5aea09fb738b1d5c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a7151debbb010728e861a4f370bea18621c3cb88","unresolved":false,"context_lines":[{"line_number":381,"context_line":"        When the url is not valid or not right, should suppress it"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        The invalid urls are as follows:"},{"line_number":384,"context_line":"        1. a url which is none value"},{"line_number":385,"context_line":"        2. a url which has space in it"},{"line_number":386,"context_line":"        3. a url whose scheme is not \u0027http\u0027 or \u0027https\u0027"},{"line_number":387,"context_line":"        4. a url whose host in not valid"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a41bdd9_374e1097","line":384,"updated":"2015-07-13 12:36:58.000000000","message":"None","commit_id":"2cda136ffc6e5acd0728b0bd5aea09fb738b1d5c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a7151debbb010728e861a4f370bea18621c3cb88","unresolved":false,"context_lines":[{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        The invalid urls are as follows:"},{"line_number":384,"context_line":"        1. a url which is none value"},{"line_number":385,"context_line":"        2. a url which has space in it"},{"line_number":386,"context_line":"        3. a url whose scheme is not \u0027http\u0027 or \u0027https\u0027"},{"line_number":387,"context_line":"        4. a url whose host in not valid"},{"line_number":388,"context_line":"        5. a url whose port is greater than 65535(if the url has port)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a41bdd9_da7ca974","line":385,"updated":"2015-07-13 12:36:58.000000000","message":"why?","commit_id":"2cda136ffc6e5acd0728b0bd5aea09fb738b1d5c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a7151debbb010728e861a4f370bea18621c3cb88","unresolved":false,"context_lines":[{"line_number":383,"context_line":"        The invalid urls are as follows:"},{"line_number":384,"context_line":"        1. a url which is none value"},{"line_number":385,"context_line":"        2. a url which has space in it"},{"line_number":386,"context_line":"        3. a url whose scheme is not \u0027http\u0027 or \u0027https\u0027"},{"line_number":387,"context_line":"        4. a url whose host in not valid"},{"line_number":388,"context_line":"        5. a url whose port is greater than 65535(if the url has port)"},{"line_number":389,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a41bdd9_5707141c","line":386,"updated":"2015-07-13 12:36:58.000000000","message":"why?","commit_id":"2cda136ffc6e5acd0728b0bd5aea09fb738b1d5c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a7151debbb010728e861a4f370bea18621c3cb88","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        1. a url which is none value"},{"line_number":385,"context_line":"        2. a url which has space in it"},{"line_number":386,"context_line":"        3. a url whose scheme is not \u0027http\u0027 or \u0027https\u0027"},{"line_number":387,"context_line":"        4. a url whose host in not valid"},{"line_number":388,"context_line":"        5. a url whose port is greater than 65535(if the url has port)"},{"line_number":389,"context_line":"        \"\"\""},{"line_number":390,"context_line":"        # valid url should not be None"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a41bdd9_da3b49ea","line":387,"updated":"2015-07-13 12:36:58.000000000","message":"Is there any value to checking that the host has a valid network address here?","commit_id":"2cda136ffc6e5acd0728b0bd5aea09fb738b1d5c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a7151debbb010728e861a4f370bea18621c3cb88","unresolved":false,"context_lines":[{"line_number":392,"context_line":"            return False"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"        # url with space is invalid"},{"line_number":395,"context_line":"        if url.find(\u0027 \u0027) !\u003d -1:"},{"line_number":396,"context_line":"            return False"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"        # parse url and analyze the result"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a41bdd9_1a9c51bf","line":395,"updated":"2015-07-13 12:36:58.000000000","message":"more pythonic would be:\n\n  if \u0027 \u0027 in url:","commit_id":"2cda136ffc6e5acd0728b0bd5aea09fb738b1d5c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a7151debbb010728e861a4f370bea18621c3cb88","unresolved":false,"context_lines":[{"line_number":413,"context_line":"        try:"},{"line_number":414,"context_line":"            socket.gethostbyname(netloc)"},{"line_number":415,"context_line":"        except Exception:"},{"line_number":416,"context_line":"            LOG.warning(\u0027%s is not a valid host or ip.\u0027 % netloc)"},{"line_number":417,"context_line":"            return False"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"        if port and int(port) \u003e 65535:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a41bdd9_1a4e916f","line":416,"updated":"2015-07-13 12:36:58.000000000","message":"don\u0027t use % in log statements only use a comma","commit_id":"2cda136ffc6e5acd0728b0bd5aea09fb738b1d5c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a7151debbb010728e861a4f370bea18621c3cb88","unresolved":false,"context_lines":[{"line_number":420,"context_line":"            return False"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        # check whether the property in the path is exactly the same"},{"line_number":423,"context_line":"        # with that in the WHITELISTED_PROPERTIES below"},{"line_number":424,"context_line":"        WHITELISTED_PROPERTIES \u003d ["},{"line_number":425,"context_line":"            \u0027tenant_id\u0027, \u0027user_id\u0027, \u0027public_bind_host\u0027, \u0027admin_bind_host\u0027,"},{"line_number":426,"context_line":"            \u0027compute_host\u0027, \u0027admin_port\u0027, \u0027public_port\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a41bdd9_9a4ce143","line":423,"updated":"2015-07-13 12:36:58.000000000","message":"we should definitely not copy the list. if we do then we\u0027ll have to remember to change it in both places","commit_id":"2cda136ffc6e5acd0728b0bd5aea09fb738b1d5c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a7151debbb010728e861a4f370bea18621c3cb88","unresolved":false,"context_lines":[{"line_number":428,"context_line":""},{"line_number":429,"context_line":"        if path:"},{"line_number":430,"context_line":"            # /v1.1/\\$(tenant_i d)s will split to be [/v1.1, $(tenant_i d)s]"},{"line_number":431,"context_line":"            # check the second one"},{"line_number":432,"context_line":"            path_element \u003d path.split(\u0027\\\\\u0027)"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"            # if path \u003d\u003d \u0027/v1.1\u0027 is ok too"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a41bdd9_7aa9dd7a","line":431,"updated":"2015-07-13 12:36:58.000000000","message":"This doesn\u0027t make any sense. Is /v1.1/$(tenant_i d)s/xyz a valid URL?","commit_id":"2cda136ffc6e5acd0728b0bd5aea09fb738b1d5c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a7151debbb010728e861a4f370bea18621c3cb88","unresolved":false,"context_lines":[{"line_number":437,"context_line":""},{"line_number":438,"context_line":"            property_str \u003d path_element[-1]"},{"line_number":439,"context_line":"            for one_property in WHITELISTED_PROPERTIES:"},{"line_number":440,"context_line":"                if property_str.find(\u0027$(%s)s\u0027 % one_property) !\u003d -1:"},{"line_number":441,"context_line":"                    return True"},{"line_number":442,"context_line":"                else:"},{"line_number":443,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a41bdd9_9a038142","line":440,"updated":"2015-07-13 12:36:58.000000000","message":"Why not turn the WHITELISTED_PROPERTIES list into a dictionary and then you can do something like (You\u0027ll have to convert $ to % first...):\n\n  url % WHITELISTED_PROPERTIES\n\nThis will raise a KeyError if a substitution is not found.\n\nThis will also catch the case where a user uses %(not_found)s in their URL.  If the key doesn\u0027t exist the URL is invalid.","commit_id":"2cda136ffc6e5acd0728b0bd5aea09fb738b1d5c"}],"keystone/common/utils.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"5a0f2dff7ff61c9362c3a1226b643166c2a8f91d","unresolved":false,"context_lines":[{"line_number":506,"context_line":"    at \u003d timeutils.utcnow()"},{"line_number":507,"context_line":"    return at.strftime(timeutils.PERFECT_TIME_FORMAT)"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"def check_endpoint_url(url, whitelist):"},{"line_number":511,"context_line":"    \"\"\"Validate url like \u0027\"http://127.0.0.1:8774 /v1.1/\\$(tenant_i d)s\"\u0027"},{"line_number":512,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"3a50d1a3_dda45c4c","line":509,"updated":"2015-07-28 01:58:27.000000000","message":"nit: could have put this in catalog/utils.py or somewhere else as it\u0027s not going to be required by all the backends.\n\nIf you put it in catalog/core.py then you wouldn\u0027t need to pass the whitelist in.","commit_id":"4b7d1f4ff2567effc16f1e74091189a576cdc666"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"5a0f2dff7ff61c9362c3a1226b643166c2a8f91d","unresolved":false,"context_lines":[{"line_number":529,"context_line":"        path \u003d path.replace(\u0027$\u0027, \u0027%\u0027)"},{"line_number":530,"context_line":"        try:"},{"line_number":531,"context_line":"            path \u003d path % whitelist"},{"line_number":532,"context_line":"        except KeyError:"},{"line_number":533,"context_line":"            raise exception.URLValidationError(url)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3a50d1a3_bd2cf0ac","line":532,"updated":"2015-07-28 01:58:27.000000000","message":"neat hack","commit_id":"4b7d1f4ff2567effc16f1e74091189a576cdc666"}],"keystone/common/validation/parameter_types.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f60277d4bf32052b41c1d32e523346d1ffb1fb93","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    \u0027type\u0027: \u0027string\u0027,"},{"line_number":62,"context_line":"    \u0027minLength\u0027: 0,"},{"line_number":63,"context_line":"    \u0027maxLength\u0027: 225,"},{"line_number":64,"context_line":"    \u0027pattern\u0027: \u0027%s%s\u0027 % (\u0027^(https?:\\/\\/[a-zA-Z0-9_+%-]+(\\.[a-zA-Z0-9+\\_%-]\u0027,"},{"line_number":65,"context_line":"                         \u0027+)*(:[0-9]{1,5})?(\\/[a-zA-Z0-9+()?#~\u003d\u0026\\._%-]*)*)?$\u0027)"},{"line_number":66,"context_line":"}"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a41bdd9_8a7c13ed","line":64,"updated":"2015-07-15 13:59:00.000000000","message":"What is the source of this regex? I don\u0027t like the idea of making one up because we run the risk of false positives. Also this is no longer valid: http://127.0.0.1:8774/v1.1/%(tenant_id)s","commit_id":"9786b5c0a0bfc990e4f796abaad499afc4b53bc1"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"0189a86d2ae189960c24773bd757774c06aa89a9","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    \u0027type\u0027: \u0027string\u0027,"},{"line_number":62,"context_line":"    \u0027minLength\u0027: 0,"},{"line_number":63,"context_line":"    \u0027maxLength\u0027: 225,"},{"line_number":64,"context_line":"    \u0027pattern\u0027: \u0027%s%s\u0027 % (\u0027^(https?:\\/\\/[a-zA-Z0-9_+%-]+(\\.[a-zA-Z0-9+\\_%-]\u0027,"},{"line_number":65,"context_line":"                         \u0027+)*(:[0-9]{1,5})?(\\/[a-zA-Z0-9+()?#~\u003d\u0026\\._%-]*)*)?$\u0027)"},{"line_number":66,"context_line":"}"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a41bdd9_ed2e198b","line":64,"in_reply_to":"9a41bdd9_8a7c13ed","updated":"2015-07-29 12:38:17.000000000","message":"From stackoverflow.I will recheck.","commit_id":"9786b5c0a0bfc990e4f796abaad499afc4b53bc1"}],"keystone/exception.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d2d63d6162c56fad3fbdf927f1b05cf0eb718e4c","unresolved":false,"context_lines":[{"line_number":478,"context_line":"    title \u003d \u0027Error retrieving OAuth headers\u0027"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"class ValidationURLError(Error):"},{"line_number":482,"context_line":"    message_format \u003d _(\u0027Cannot create an endpoint with an invalid URL:\u0027"},{"line_number":483,"context_line":"                       \u0027 %(url)s\u0027)"},{"line_number":484,"context_line":"    code \u003d 400"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a50d1a3_45808746","line":481,"updated":"2015-07-21 19:57:36.000000000","message":"URLValidationError would read more naturally.\n\nalso, this should extend ValidationError and share it\u0027s code and title. it should also be moved to follow ValidationError in this file","commit_id":"881b60e72a7bde6edee8cf58436743e555ee462a"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"56d84a5feb0565f930288ae7eeef1cc6c3d8b67c","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"class URLValidationError(ValidationError):"},{"line_number":88,"context_line":"    message_format \u003d _(\u0027Cannot create an endpoint with an invalid URL:\u0027"},{"line_number":89,"context_line":"                       \u0027 %(url)s\u0027)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_769ac615","line":88,"updated":"2015-07-29 06:18:02.000000000","message":"use double quote consistently","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"54cf6e5a6ecfebedfe49d0579a219d9f80d80bfc","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"class URLValidationError(ValidationError):"},{"line_number":88,"context_line":"    message_format \u003d _(\u0027Cannot create an endpoint with an invalid URL:\u0027"},{"line_number":89,"context_line":"                       \u0027 %(url)s\u0027)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_59bc9ddb","line":88,"in_reply_to":"3a50d1a3_769ac615","updated":"2015-07-29 06:47:10.000000000","message":"Done","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"}],"keystone/tests/unit/test_catalog.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"19e6a4bb83106d878a446c68fcc5053b96a1346a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"3a50d1a3_739a3b65","updated":"2015-07-21 15:09:16.000000000","message":"i\u0027d like to see a test where the substitution works, \n\nand maybe another test where only admin_url fails with a space","commit_id":"881b60e72a7bde6edee8cf58436743e555ee462a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1eee830d2fb690aa4241c64dd7b04c926a02e622","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    def test_endpoint_create_with_empty_service_id(self):"},{"line_number":129,"context_line":"        self._endpoint_create(expected_status\u003d400, service_id\u003d\u0027\u0027)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def test_endpoint_create_with_invalid_url(self):"},{"line_number":132,"context_line":"        \"\"\"Test some invalid cases:"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        1. a url which is none value"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a50d1a3_78021a71","line":131,"updated":"2015-07-21 14:54:44.000000000","message":"can we add a test that creates an endpoint with the v3 api and the v3 api using the same url, and assert they are consistent?","commit_id":"881b60e72a7bde6edee8cf58436743e555ee462a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1eee830d2fb690aa4241c64dd7b04c926a02e622","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        1. a url which is none value"},{"line_number":135,"context_line":"        2. a url which has space in it"},{"line_number":136,"context_line":"        3. substitutions is exactly right"},{"line_number":137,"context_line":"        \"\"\""},{"line_number":138,"context_line":"        INVALID_URLS \u003d ["},{"line_number":139,"context_line":"            \u0027\u0027, None,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a50d1a3_18a516a1","line":136,"updated":"2015-07-21 14:54:44.000000000","message":"step 3 isn\u0027t done here, is it?","commit_id":"881b60e72a7bde6edee8cf58436743e555ee462a"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"4ca3897775f26e0f9a2c8acc41ebd4f14bb07dea","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(public_e ndpoint)s\u0027,"},{"line_number":148,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(admin_e ndpoint)s\u0027"},{"line_number":149,"context_line":"        ]"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":152,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a50d1a3_26901095","line":150,"updated":"2015-07-26 14:14:05.000000000","message":"pls also cover your third invalid cases, \"substitutions is not exactly right\", \u0027http://127.0.0.1:8774/v1.1/\\$(no_sub)s\u0027 for example.","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"9ad4593fec12bfac41a1cae22e576b610dd0465b","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(public_e ndpoint)s\u0027,"},{"line_number":148,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(admin_e ndpoint)s\u0027"},{"line_number":149,"context_line":"        ]"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":152,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a50d1a3_06bf1461","line":150,"in_reply_to":"3a50d1a3_26901095","updated":"2015-07-29 23:53:58.000000000","message":"Done","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5d631379797c1842da1011556fad2c18b498ebd9","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        for field, value in six.iteritems(req_body[\u0027endpoint\u0027]):"},{"line_number":97,"context_line":"            self.assertEqual(response.result[\u0027endpoint\u0027][field], value)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def test_endpoint_create_with_null_adminurl(self):"},{"line_number":100,"context_line":"        req_body, response \u003d self._endpoint_create(adminurl\u003dNone)"},{"line_number":101,"context_line":"        self.assertIsNone(req_body[\u0027endpoint\u0027][\u0027adminurl\u0027])"},{"line_number":102,"context_line":"        self.assertNotIn(\u0027adminurl\u0027, response.result[\u0027endpoint\u0027])"}],"source_content_type":"text/x-python","patch_set":28,"id":"3a50d1a3_13ee57b4","side":"PARENT","line":99,"updated":"2015-07-27 12:45:44.000000000","message":"To me these test cases imply that we support a null (or None) URL. Why are we changing this?","commit_id":"a9c794ae5edee2cf7fce70ea9bdbd8ab7ae35682"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"75bf2c972a2f3e0df1a03edadabdb819e38a7bee","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        1. a url which has space in it"},{"line_number":135,"context_line":"        2. substitutions is not exactly right"},{"line_number":136,"context_line":"        \"\"\""},{"line_number":137,"context_line":"        INVALID_URLS \u003d ["},{"line_number":138,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_i d)s\u0027,"},{"line_number":139,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(user_i d)s\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_86c8a756","line":136,"updated":"2015-07-28 15:38:56.000000000","message":"It would be nice to expand this test to prove valid URLs work.","commit_id":"5f6feaad8fe0471b006a7cce3cdef6f04e022ed5"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"16cac009bcbae4ae5fe9cdd6bed020adddd2f714","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        1. a url which has space in it"},{"line_number":135,"context_line":"        2. substitutions is not exactly right"},{"line_number":136,"context_line":"        \"\"\""},{"line_number":137,"context_line":"        INVALID_URLS \u003d ["},{"line_number":138,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_i d)s\u0027,"},{"line_number":139,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(user_i d)s\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_e23dd42b","line":136,"in_reply_to":"3a50d1a3_86c8a756","updated":"2015-07-28 16:01:57.000000000","message":"Look at the function name  test_endpoint_create_with_invalid_url...\n\nShould I add another test named test_endpoint_create_with_valid_url ??","commit_id":"5f6feaad8fe0471b006a7cce3cdef6f04e022ed5"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"cbd8d2d239d40c1ab1890c2cb83995e69a8dd689","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        1. a url which has space in it"},{"line_number":135,"context_line":"        2. substitutions is not exactly right"},{"line_number":136,"context_line":"        \"\"\""},{"line_number":137,"context_line":"        INVALID_URLS \u003d ["},{"line_number":138,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_i d)s\u0027,"},{"line_number":139,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(user_i d)s\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_c8b0f945","line":136,"in_reply_to":"3a50d1a3_e23dd42b","updated":"2015-07-28 16:08:58.000000000","message":"Sure, but I still want to validate that value URL substitutions work. As it stands right now they do not.","commit_id":"5f6feaad8fe0471b006a7cce3cdef6f04e022ed5"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"75bf2c972a2f3e0df1a03edadabdb819e38a7bee","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        2. substitutions is not exactly right"},{"line_number":136,"context_line":"        \"\"\""},{"line_number":137,"context_line":"        INVALID_URLS \u003d ["},{"line_number":138,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_i d)s\u0027,"},{"line_number":139,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(user_i d)s\u0027,"},{"line_number":140,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(public_bind_h ost)s\u0027,"},{"line_number":141,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(admin_bind_h ost)s\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_66f9db7f","line":138,"updated":"2015-07-28 15:38:56.000000000","message":"I don\u0027t think all of these are necessary since they test the same case.","commit_id":"5f6feaad8fe0471b006a7cce3cdef6f04e022ed5"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"ec424d5809c3abbd448f3e205f8073180372b98a","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        2. substitutions is not exactly right"},{"line_number":136,"context_line":"        \"\"\""},{"line_number":137,"context_line":"        INVALID_URLS \u003d ["},{"line_number":138,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_i d)s\u0027,"},{"line_number":139,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(user_i d)s\u0027,"},{"line_number":140,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(public_bind_h ost)s\u0027,"},{"line_number":141,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(admin_bind_h ost)s\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_48614938","line":138,"in_reply_to":"3a50d1a3_28439d14","updated":"2015-07-29 03:27:58.000000000","message":"So I can add some testcase like\n \u0027http://127.0.0.1:8774/v1.1/\\$(user_di)s\u0027\n \u0027http://127.0.0.1:8774/v1.1/\\$(us_di)s\u0027\n\nWith space in only one case for mismatch of substitution. Misspell is another case. I should add it ? right ?","commit_id":"5f6feaad8fe0471b006a7cce3cdef6f04e022ed5"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"16cac009bcbae4ae5fe9cdd6bed020adddd2f714","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        2. substitutions is not exactly right"},{"line_number":136,"context_line":"        \"\"\""},{"line_number":137,"context_line":"        INVALID_URLS \u003d ["},{"line_number":138,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_i d)s\u0027,"},{"line_number":139,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(user_i d)s\u0027,"},{"line_number":140,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(public_bind_h ost)s\u0027,"},{"line_number":141,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(admin_bind_h ost)s\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_c2553850","line":138,"in_reply_to":"3a50d1a3_66f9db7f","updated":"2015-07-28 16:01:57.000000000","message":"make coverage rate 100%. All the substitution should be tested.Which one should be deleted below and why ?","commit_id":"5f6feaad8fe0471b006a7cce3cdef6f04e022ed5"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"cbd8d2d239d40c1ab1890c2cb83995e69a8dd689","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        2. substitutions is not exactly right"},{"line_number":136,"context_line":"        \"\"\""},{"line_number":137,"context_line":"        INVALID_URLS \u003d ["},{"line_number":138,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_i d)s\u0027,"},{"line_number":139,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(user_i d)s\u0027,"},{"line_number":140,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(public_bind_h ost)s\u0027,"},{"line_number":141,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(admin_bind_h ost)s\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_28439d14","line":138,"in_reply_to":"3a50d1a3_c2553850","updated":"2015-07-28 16:08:58.000000000","message":"All of the ones that have a space in them are the same test case. Increasing the count does not improve the coverage since they all take the same code path. There are other cases that you are not covering like what causes the exceptions we are catching.","commit_id":"5f6feaad8fe0471b006a7cce3cdef6f04e022ed5"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1533209eddbb1e79e0a2110f7a375f57a953c5c8","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                              internalurl\u003dVALID_URL,"},{"line_number":162,"context_line":"                              adminurl\u003dVALID_URL)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        # Case one: publichurl, internalurl and adminurl are"},{"line_number":165,"context_line":"        # all invalid"},{"line_number":166,"context_line":"        for invalid_url in INVALID_URLS:"},{"line_number":167,"context_line":"            self._endpoint_create(expected_status\u003d400,"}],"source_content_type":"text/x-python","patch_set":33,"id":"3a50d1a3_0b9c9b0c","line":164,"updated":"2015-07-28 16:39:42.000000000","message":"nit: publicurl","commit_id":"495d9b04ba45143a0f52e876cd063cf7b5456ad3"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bdbf90814687c6482a60048366f0e98084a9e314","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                              internalurl\u003dVALID_URL,"},{"line_number":162,"context_line":"                              adminurl\u003dVALID_URL)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        # Case one: publichurl, internalurl and adminurl are"},{"line_number":165,"context_line":"        # all invalid"},{"line_number":166,"context_line":"        for invalid_url in INVALID_URLS:"},{"line_number":167,"context_line":"            self._endpoint_create(expected_status\u003d400,"}],"source_content_type":"text/x-python","patch_set":33,"id":"3a50d1a3_1c7e1f6a","line":164,"in_reply_to":"3a50d1a3_0b9c9b0c","updated":"2015-07-28 17:16:26.000000000","message":"Done","commit_id":"495d9b04ba45143a0f52e876cd063cf7b5456ad3"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1533209eddbb1e79e0a2110f7a375f57a953c5c8","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                                  internalurl\u003dinvalid_url,"},{"line_number":194,"context_line":"                                  adminurl\u003dinvalid_url)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        # Case five: publicurl is invalid, internelurl"},{"line_number":197,"context_line":"        # and adminurl are valid"},{"line_number":198,"context_line":"        for invalid_url in INVALID_URLS:"},{"line_number":199,"context_line":"            self._endpoint_create(expected_status\u003d400,"}],"source_content_type":"text/x-python","patch_set":33,"id":"3a50d1a3_ab7b27bd","line":196,"updated":"2015-07-28 16:39:42.000000000","message":"nit: internalurl","commit_id":"495d9b04ba45143a0f52e876cd063cf7b5456ad3"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bdbf90814687c6482a60048366f0e98084a9e314","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                                  internalurl\u003dinvalid_url,"},{"line_number":194,"context_line":"                                  adminurl\u003dinvalid_url)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        # Case five: publicurl is invalid, internelurl"},{"line_number":197,"context_line":"        # and adminurl are valid"},{"line_number":198,"context_line":"        for invalid_url in INVALID_URLS:"},{"line_number":199,"context_line":"            self._endpoint_create(expected_status\u003d400,"}],"source_content_type":"text/x-python","patch_set":33,"id":"3a50d1a3_bc97eb8e","line":196,"in_reply_to":"3a50d1a3_ab7b27bd","updated":"2015-07-28 17:16:26.000000000","message":"Done","commit_id":"495d9b04ba45143a0f52e876cd063cf7b5456ad3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0081e6a2163d3b68ecff75889dab2c66e8419a05","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        self._endpoint_create(expected_status\u003d200,"},{"line_number":160,"context_line":"                              publicurl\u003dVALID_URL,"},{"line_number":161,"context_line":"                              internalurl\u003dVALID_URL,"},{"line_number":162,"context_line":"                              adminurl\u003dVALID_URL)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        # Case one: publicurl, internalurl and adminurl are"},{"line_number":165,"context_line":"        # all invalid"}],"source_content_type":"text/x-python","patch_set":34,"id":"3a50d1a3_d793b059","line":162,"updated":"2015-07-28 17:45:34.000000000","message":"this specific case might benefit from being pulled out into it\u0027s own test, since it goes against the naming of this test (test_endpoint_create_with_invalid_url)","commit_id":"748a1b626226f0a4837278e637b33a7e1dad8eed"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"13f2524a2bc2fff0d73f688af5dd902367efd66f","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        self._endpoint_create(expected_status\u003d200,"},{"line_number":160,"context_line":"                              publicurl\u003dVALID_URL,"},{"line_number":161,"context_line":"                              internalurl\u003dVALID_URL,"},{"line_number":162,"context_line":"                              adminurl\u003dVALID_URL)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        # Case one: publicurl, internalurl and adminurl are"},{"line_number":165,"context_line":"        # all invalid"}],"source_content_type":"text/x-python","patch_set":34,"id":"3a50d1a3_2c272ab7","line":162,"in_reply_to":"3a50d1a3_d793b059","updated":"2015-07-28 18:21:15.000000000","message":"I agree. I\u0027ll let jiaxi tackle that. I\u0027m fine with that being in a follow up review too.","commit_id":"748a1b626226f0a4837278e637b33a7e1dad8eed"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"56d84a5feb0565f930288ae7eeef1cc6c3d8b67c","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def test_endpoint_create_with_valid_url(self):"},{"line_number":132,"context_line":"        \"\"\"Create endpoint with valid url should be tested,too."},{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":135,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_564c6a9d","line":133,"updated":"2015-07-29 06:18:02.000000000","message":"move \"\"\" up, this should be a one liner: https://www.python.org/dev/peps/pep-0257/#one-line-docstrings","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"54cf6e5a6ecfebedfe49d0579a219d9f80d80bfc","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def test_endpoint_create_with_valid_url(self):"},{"line_number":132,"context_line":"        \"\"\"Create endpoint with valid url should be tested,too."},{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":135,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_3983d104","line":133,"in_reply_to":"3a50d1a3_564c6a9d","updated":"2015-07-29 06:47:10.000000000","message":"Done","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"dcd9a0392a153c50e699049360d86a0767fba7de","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \"\"\"Create endpoint with valid url should be tested,too."},{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":135,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        # baseline tests that all valid URLs works"},{"line_number":138,"context_line":"        self._endpoint_create(expected_status\u003d200,"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_10526935","line":135,"updated":"2015-07-29 06:34:17.000000000","message":"Needn\u0027t escape the \u0027$\u0027 in the URL, it\u0027s just string substitution.","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"56d84a5feb0565f930288ae7eeef1cc6c3d8b67c","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \"\"\"Create endpoint with valid url should be tested,too."},{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":135,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        # baseline tests that all valid URLs works"},{"line_number":138,"context_line":"        self._endpoint_create(expected_status\u003d200,"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_363c3ee0","line":135,"updated":"2015-07-29 06:18:02.000000000","message":"only constants should be all caps","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"54cf6e5a6ecfebedfe49d0579a219d9f80d80bfc","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \"\"\"Create endpoint with valid url should be tested,too."},{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":135,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        # baseline tests that all valid URLs works"},{"line_number":138,"context_line":"        self._endpoint_create(expected_status\u003d200,"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_7cd5c740","line":135,"in_reply_to":"3a50d1a3_10526935","updated":"2015-07-29 06:47:10.000000000","message":"What do you mean ?","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"54cf6e5a6ecfebedfe49d0579a219d9f80d80bfc","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \"\"\"Create endpoint with valid url should be tested,too."},{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":135,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        # baseline tests that all valid URLs works"},{"line_number":138,"context_line":"        self._endpoint_create(expected_status\u003d200,"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_b96fe15e","line":135,"in_reply_to":"3a50d1a3_363c3ee0","updated":"2015-07-29 06:47:10.000000000","message":"Done","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"56d84a5feb0565f930288ae7eeef1cc6c3d8b67c","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        1. a URL which has space in it"},{"line_number":147,"context_line":"        2. substitutions is not exactly right"},{"line_number":148,"context_line":"        \"\"\""},{"line_number":149,"context_line":"        INVALID_URLS \u003d ["},{"line_number":150,"context_line":"            # as space in the URL"},{"line_number":151,"context_line":"            \u0027http://127.0.0.1:8774/ v1.1/\u0027,"},{"line_number":152,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(tenant_i d)s\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_f62256b8","line":149,"updated":"2015-07-29 06:18:02.000000000","message":"same here","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"54cf6e5a6ecfebedfe49d0579a219d9f80d80bfc","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        1. a URL which has space in it"},{"line_number":147,"context_line":"        2. substitutions is not exactly right"},{"line_number":148,"context_line":"        \"\"\""},{"line_number":149,"context_line":"        INVALID_URLS \u003d ["},{"line_number":150,"context_line":"            # as space in the URL"},{"line_number":151,"context_line":"            \u0027http://127.0.0.1:8774/ v1.1/\u0027,"},{"line_number":152,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(tenant_i d)s\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_59149d9e","line":149,"in_reply_to":"3a50d1a3_f62256b8","updated":"2015-07-29 06:47:10.000000000","message":"Done","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"dcd9a0392a153c50e699049360d86a0767fba7de","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        2. substitutions is not exactly right"},{"line_number":148,"context_line":"        \"\"\""},{"line_number":149,"context_line":"        INVALID_URLS \u003d ["},{"line_number":150,"context_line":"            # as space in the URL"},{"line_number":151,"context_line":"            \u0027http://127.0.0.1:8774/ v1.1/\u0027,"},{"line_number":152,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(tenant_i d)s\u0027,"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_f9e4890d","line":150,"updated":"2015-07-29 06:34:17.000000000","message":"del/\u0027as\u0027","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"54cf6e5a6ecfebedfe49d0579a219d9f80d80bfc","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        2. substitutions is not exactly right"},{"line_number":148,"context_line":"        \"\"\""},{"line_number":149,"context_line":"        INVALID_URLS \u003d ["},{"line_number":150,"context_line":"            # as space in the URL"},{"line_number":151,"context_line":"            \u0027http://127.0.0.1:8774/ v1.1/\u0027,"},{"line_number":152,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(tenant_i d)s\u0027,"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_1c55a3f8","line":150,"in_reply_to":"3a50d1a3_f9e4890d","updated":"2015-07-29 06:47:10.000000000","message":"Done","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"dcd9a0392a153c50e699049360d86a0767fba7de","unresolved":false,"context_lines":[{"line_number":151,"context_line":"            \u0027http://127.0.0.1:8774/ v1.1/\u0027,"},{"line_number":152,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(tenant_i d)s\u0027,"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"            # using a substitution that is now whitelisted - KeyError"},{"line_number":155,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(nonexistent)s\u0027,"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"            # invalid formatting - ValueError"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_3958b130","line":154,"updated":"2015-07-29 06:34:17.000000000","message":"nit: s/now/not","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"54cf6e5a6ecfebedfe49d0579a219d9f80d80bfc","unresolved":false,"context_lines":[{"line_number":151,"context_line":"            \u0027http://127.0.0.1:8774/ v1.1/\u0027,"},{"line_number":152,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(tenant_i d)s\u0027,"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"            # using a substitution that is now whitelisted - KeyError"},{"line_number":155,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(nonexistent)s\u0027,"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"            # invalid formatting - ValueError"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_3c589f30","line":154,"in_reply_to":"3a50d1a3_3958b130","updated":"2015-07-29 06:47:10.000000000","message":"Done","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"56d84a5feb0565f930288ae7eeef1cc6c3d8b67c","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        ]"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":168,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        # Case one: publicurl, internalurl and adminurl are"},{"line_number":171,"context_line":"        # all invalid"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_16102258","line":168,"updated":"2015-07-29 06:18:02.000000000","message":"here too","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"54cf6e5a6ecfebedfe49d0579a219d9f80d80bfc","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        ]"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":168,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        # Case one: publicurl, internalurl and adminurl are"},{"line_number":171,"context_line":"        # all invalid"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_390d118f","line":168,"in_reply_to":"3a50d1a3_16102258","updated":"2015-07-29 06:47:10.000000000","message":"Done","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"dcd9a0392a153c50e699049360d86a0767fba7de","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":168,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        # Case one: publicurl, internalurl and adminurl are"},{"line_number":171,"context_line":"        # all invalid"},{"line_number":172,"context_line":"        for invalid_url in INVALID_URLS:"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_1924d55d","line":169,"updated":"2015-07-29 06:34:17.000000000","message":"Needn\u0027t escape the \u0027$\u0027 in the URL, it\u0027s just string substitution.","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"54cf6e5a6ecfebedfe49d0579a219d9f80d80bfc","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":168,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        # Case one: publicurl, internalurl and adminurl are"},{"line_number":171,"context_line":"        # all invalid"},{"line_number":172,"context_line":"        for invalid_url in INVALID_URLS:"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_bc890f71","line":169,"in_reply_to":"3a50d1a3_1924d55d","updated":"2015-07-29 06:47:10.000000000","message":"What do you mean ?","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"}],"keystone/tests/unit/test_v2_keystoneclient_sql.py":[{"author":{"_account_id":17073,"name":"Theodore Ilie","email":"theodorex.ilie@intel.com","username":"Lactem"},"change_message_id":"2d2a9d98fbc382e90aafe61f46ee428f55b2afee","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        endpoint_region \u003d uuid.uuid4().hex"},{"line_number":43,"context_line":"        invalid_service_id \u003d uuid.uuid4().hex"},{"line_number":44,"context_line":"        endpoint_publicurl \u003d \u0027http://localhost:8080\u0027"},{"line_number":45,"context_line":"        endpoint_internalurl \u003d \u0027http://localhost:8080\u0027"},{"line_number":46,"context_line":"        endpoint_adminurl \u003d \u0027http://localhost:8080\u0027"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_70b7dcf5","line":44,"updated":"2015-07-10 15:43:07.000000000","message":"You may also want to take a look at test cases in test_v3_catalog.py that use uuid. example: https://github.com/openstack/keystone/blob/master/keystone/tests/unit/test_v3_catalog.py#L573-L580","commit_id":"26ff3bb16ead6f1f5eedf4d2bf447de9583b4f94"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5c52ae1f4d0ad0513b602b7e37b4bab8781accf7","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        endpoint_region \u003d uuid.uuid4().hex"},{"line_number":43,"context_line":"        invalid_service_id \u003d uuid.uuid4().hex"},{"line_number":44,"context_line":"        endpoint_publicurl \u003d \u0027http://localhost:8080\u0027"},{"line_number":45,"context_line":"        endpoint_internalurl \u003d \u0027http://localhost:8080\u0027"},{"line_number":46,"context_line":"        endpoint_adminurl \u003d \u0027http://localhost:8080\u0027"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_f620b94b","line":44,"updated":"2015-07-20 15:35:55.000000000","message":"Do we need to change all of the tests too? it\u0027s nice to use uuid\u0027s in tests because it prevents tests from interacting badly when the use the same values for things.","commit_id":"0e896c0abecf5a8583e2187f32ec9ce3e9c53571"}],"keystone/tests/unit/test_v3.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"029530d954a23ea93912e78f8902f4622c7b48d2","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        del ref[\u0027enabled\u0027]  # enabled is optional"},{"line_number":291,"context_line":"        ref[\u0027interface\u0027] \u003d interface"},{"line_number":292,"context_line":"        ref[\u0027service_id\u0027] \u003d service_id"},{"line_number":293,"context_line":"        ref[\u0027url\u0027] \u003d \u0027https://127.0.0.1\u0027"},{"line_number":294,"context_line":"        ref[\u0027region_id\u0027] \u003d self.region_id"},{"line_number":295,"context_line":"        ref.update(kwargs)"},{"line_number":296,"context_line":"        return ref"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a41bdd9_6aeaef75","line":293,"updated":"2015-07-15 14:05:07.000000000","message":"why change this exactly?","commit_id":"030ea322c6ebb8f1d8d84e807b6762aeaffe7ee4"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5c52ae1f4d0ad0513b602b7e37b4bab8781accf7","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        del ref[\u0027enabled\u0027]  # enabled is optional"},{"line_number":291,"context_line":"        ref[\u0027interface\u0027] \u003d interface"},{"line_number":292,"context_line":"        ref[\u0027service_id\u0027] \u003d service_id"},{"line_number":293,"context_line":"        ref[\u0027url\u0027] \u003d \u0027https://127.0.0.1\u0027"},{"line_number":294,"context_line":"        ref[\u0027region_id\u0027] \u003d self.region_id"},{"line_number":295,"context_line":"        ref.update(kwargs)"},{"line_number":296,"context_line":"        return ref"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_16e52508","line":293,"updated":"2015-07-20 15:35:55.000000000","message":"do we need to change this one?","commit_id":"0e896c0abecf5a8583e2187f32ec9ce3e9c53571"}],"keystone/tests/unit/test_v3_catalog.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"4ca3897775f26e0f9a2c8acc41ebd4f14bb07dea","unresolved":false,"context_lines":[{"line_number":636,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(public_e ndpoint)s\u0027,"},{"line_number":637,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(admin_e ndpoint)s\u0027"},{"line_number":638,"context_line":"        ]"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"        ref \u003d self.new_endpoint_ref(self.service_id)"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        for invalid_url in INVALID_URLS:"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a50d1a3_26b9f02e","line":639,"updated":"2015-07-26 14:14:05.000000000","message":"I have two questions here,\n\n1. Does the third invalid case is really tested?  the INVALID_URLS covered the none and spece in the url, but where is the third checkpoint covered?\n\n2. Why the testcases here is so simply compared with V2 case?","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"9ad4593fec12bfac41a1cae22e576b610dd0465b","unresolved":false,"context_lines":[{"line_number":636,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(public_e ndpoint)s\u0027,"},{"line_number":637,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(admin_e ndpoint)s\u0027"},{"line_number":638,"context_line":"        ]"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"        ref \u003d self.new_endpoint_ref(self.service_id)"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        for invalid_url in INVALID_URLS:"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a50d1a3_862004b2","line":639,"in_reply_to":"3a50d1a3_26b9f02e","updated":"2015-07-29 23:53:58.000000000","message":"@Dave Chen\t\n1. Of course will. In the for sentence below. every case in INVALID_URLS will be tested.\n\n2. Is simple compared with v2. The reason is that endpoint create in v2, has three urls(adminurl, internalurl, and publicurl)\nHowever, in v3, there is only one url.","commit_id":"814e05eb35b245eb33cefd543acace99b46600ed"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"bed5f7c0f2c3caf012484b0d0facd25e4212a488","unresolved":false,"context_lines":[{"line_number":634,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(admin_p ort)s\u0027,"},{"line_number":635,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(public_p ort)s\u0027,"},{"line_number":636,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(public_e ndpoint)s\u0027,"},{"line_number":637,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(admin_e ndpoint)s\u0027"},{"line_number":638,"context_line":"        ]"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"        ref \u003d self.new_endpoint_ref(self.service_id)"}],"source_content_type":"text/x-python","patch_set":26,"id":"3a50d1a3_a0b3a009","line":637,"updated":"2015-07-27 02:12:40.000000000","message":"\u0027http://127.0.0.1:8774/v1.1/\\$(sth_strange)s\u0027 should be here too.","commit_id":"d71817e936b583cdbf6d19129d2abb788699d858"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"5a0f2dff7ff61c9362c3a1226b643166c2a8f91d","unresolved":false,"context_lines":[{"line_number":636,"context_line":"        self.delete(\u0027/endpoints/%s\u0027 % endpoint[\u0027id\u0027])"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"        # make sure it\u0027s deleted (GET should return 404)"},{"line_number":639,"context_line":"        self.get(\u0027/endpoints/%s\u0027 % endpoint[\u0027id\u0027], expected_status\u003d404)"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"class TestCatalogAPISQL(tests.TestCase):"}],"source_content_type":"text/x-python","patch_set":30,"id":"3a50d1a3_5dea8c75","side":"PARENT","line":639,"updated":"2015-07-28 01:58:27.000000000","message":"i don\u0027t think you should remove the old test. \n\nIf people have already created the endpoint with a space prior to this patch landing they are going to need to be able to remove it, so the test is still valid, just not as likely to be required.","commit_id":"a9c794ae5edee2cf7fce70ea9bdbd8ab7ae35682"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"d68cc9980b0342f66ca7e50e0e720919bed81360","unresolved":false,"context_lines":[{"line_number":636,"context_line":"        self.delete(\u0027/endpoints/%s\u0027 % endpoint[\u0027id\u0027])"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"        # make sure it\u0027s deleted (GET should return 404)"},{"line_number":639,"context_line":"        self.get(\u0027/endpoints/%s\u0027 % endpoint[\u0027id\u0027], expected_status\u003d404)"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"class TestCatalogAPISQL(tests.TestCase):"}],"source_content_type":"text/x-python","patch_set":30,"id":"3a50d1a3_616be9f1","side":"PARENT","line":639,"in_reply_to":"3a50d1a3_5dea8c75","updated":"2015-07-29 03:02:11.000000000","message":"Any chance that there is a space in the url? seems like this is a invliad case we should drop.","commit_id":"a9c794ae5edee2cf7fce70ea9bdbd8ab7ae35682"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b37af2ae1dbc8eabdfcb86c57fad32f213568b4f","unresolved":false,"context_lines":[{"line_number":636,"context_line":"        self.delete(\u0027/endpoints/%s\u0027 % endpoint[\u0027id\u0027])"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"        # make sure it\u0027s deleted (GET should return 404)"},{"line_number":639,"context_line":"        self.get(\u0027/endpoints/%s\u0027 % endpoint[\u0027id\u0027], expected_status\u003d404)"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"class TestCatalogAPISQL(tests.TestCase):"}],"source_content_type":"text/x-python","patch_set":30,"id":"3a50d1a3_2423af57","side":"PARENT","line":639,"in_reply_to":"3a50d1a3_616be9f1","updated":"2015-07-29 03:21:09.000000000","message":"This is testing that we can delete a URL that exists in the backend. While it\u0027s true that this review will make that harder to do, there is lots of existing data out there.","commit_id":"a9c794ae5edee2cf7fce70ea9bdbd8ab7ae35682"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"607f07d149dd96db1ab3d54d1541780f29b51703","unresolved":false,"context_lines":[{"line_number":629,"context_line":"        ref[\u0027url\u0027] \u003d url_with_space"},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"        # add the endpoint to the database"},{"line_number":632,"context_line":"        self.catalog_api.create_endpoint(ref[\u0027id\u0027], ref)"},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"        # delete the endpoint"},{"line_number":635,"context_line":"        self.delete(\u0027/endpoints/%s\u0027 % ref[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_a871ed0d","line":632,"updated":"2015-07-28 16:15:20.000000000","message":"Nice!","commit_id":"5f6feaad8fe0471b006a7cce3cdef6f04e022ed5"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"75bf2c972a2f3e0df1a03edadabdb819e38a7bee","unresolved":false,"context_lines":[{"line_number":644,"context_line":"        2. substitutions is not exactly right"},{"line_number":645,"context_line":"        \"\"\""},{"line_number":646,"context_line":"        INVALID_URLS \u003d ["},{"line_number":647,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_i d)s\u0027,"},{"line_number":648,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(user_i d)s\u0027,"},{"line_number":649,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(public_bind_h ost)s\u0027,"},{"line_number":650,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(admin_bind_h ost)s\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_fcd81a55","line":647,"updated":"2015-07-28 15:38:56.000000000","message":"There is little value to all of these URLs since they test the same case.","commit_id":"5f6feaad8fe0471b006a7cce3cdef6f04e022ed5"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"cbd8d2d239d40c1ab1890c2cb83995e69a8dd689","unresolved":false,"context_lines":[{"line_number":644,"context_line":"        2. substitutions is not exactly right"},{"line_number":645,"context_line":"        \"\"\""},{"line_number":646,"context_line":"        INVALID_URLS \u003d ["},{"line_number":647,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_i d)s\u0027,"},{"line_number":648,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(user_i d)s\u0027,"},{"line_number":649,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(public_bind_h ost)s\u0027,"},{"line_number":650,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(admin_bind_h ost)s\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_c873197f","line":647,"in_reply_to":"3a50d1a3_62c224eb","updated":"2015-07-28 16:08:58.000000000","message":"This is the same problem as the other tests.","commit_id":"5f6feaad8fe0471b006a7cce3cdef6f04e022ed5"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"16cac009bcbae4ae5fe9cdd6bed020adddd2f714","unresolved":false,"context_lines":[{"line_number":644,"context_line":"        2. substitutions is not exactly right"},{"line_number":645,"context_line":"        \"\"\""},{"line_number":646,"context_line":"        INVALID_URLS \u003d ["},{"line_number":647,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_i d)s\u0027,"},{"line_number":648,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(user_i d)s\u0027,"},{"line_number":649,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(public_bind_h ost)s\u0027,"},{"line_number":650,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/\\$(admin_bind_h ost)s\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_62c224eb","line":647,"in_reply_to":"3a50d1a3_fcd81a55","updated":"2015-07-28 16:01:57.000000000","message":"I think we should test all as we do in v2. And why not? Why not we should do different in v3？","commit_id":"5f6feaad8fe0471b006a7cce3cdef6f04e022ed5"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"56d84a5feb0565f930288ae7eeef1cc6c3d8b67c","unresolved":false,"context_lines":[{"line_number":639,"context_line":""},{"line_number":640,"context_line":"    def test_endpoint_create_with_valid_url(self):"},{"line_number":641,"context_line":"        \"\"\"Create endpoint with valid url should be tested,too."},{"line_number":642,"context_line":"        \"\"\""},{"line_number":643,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":644,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":645,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_d9b18d48","line":642,"updated":"2015-07-29 06:18:02.000000000","message":"should be one liner comment","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"54cf6e5a6ecfebedfe49d0579a219d9f80d80bfc","unresolved":false,"context_lines":[{"line_number":639,"context_line":""},{"line_number":640,"context_line":"    def test_endpoint_create_with_valid_url(self):"},{"line_number":641,"context_line":"        \"\"\"Create endpoint with valid url should be tested,too."},{"line_number":642,"context_line":"        \"\"\""},{"line_number":643,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":644,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":645,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_b91921d3","line":642,"in_reply_to":"3a50d1a3_d9b18d48","updated":"2015-07-29 06:47:10.000000000","message":"Done","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"56d84a5feb0565f930288ae7eeef1cc6c3d8b67c","unresolved":false,"context_lines":[{"line_number":641,"context_line":"        \"\"\"Create endpoint with valid url should be tested,too."},{"line_number":642,"context_line":"        \"\"\""},{"line_number":643,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":644,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"        ref \u003d self.new_endpoint_ref(self.service_id)"},{"line_number":647,"context_line":"        ref[\u0027url\u0027] \u003d VALID_URL"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_99b78539","line":644,"updated":"2015-07-29 06:18:02.000000000","message":"all caps are for class/module constants, this is just local variable","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"54cf6e5a6ecfebedfe49d0579a219d9f80d80bfc","unresolved":false,"context_lines":[{"line_number":641,"context_line":"        \"\"\"Create endpoint with valid url should be tested,too."},{"line_number":642,"context_line":"        \"\"\""},{"line_number":643,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":644,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"        ref \u003d self.new_endpoint_ref(self.service_id)"},{"line_number":647,"context_line":"        ref[\u0027url\u0027] \u003d VALID_URL"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_597b3df5","line":644,"in_reply_to":"3a50d1a3_99b78539","updated":"2015-07-29 06:47:10.000000000","message":"Done","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"dcd9a0392a153c50e699049360d86a0767fba7de","unresolved":false,"context_lines":[{"line_number":642,"context_line":"        \"\"\""},{"line_number":643,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":644,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"        ref \u003d self.new_endpoint_ref(self.service_id)"},{"line_number":647,"context_line":"        ref[\u0027url\u0027] \u003d VALID_URL"},{"line_number":648,"context_line":"        self.post(\u0027/endpoints\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_b9d4c1e8","line":645,"updated":"2015-07-29 06:34:17.000000000","message":"Needn\u0027t escape the \u0027$\u0027 in the URL, it\u0027s just string substitution.","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"54cf6e5a6ecfebedfe49d0579a219d9f80d80bfc","unresolved":false,"context_lines":[{"line_number":642,"context_line":"        \"\"\""},{"line_number":643,"context_line":"        # list one valid url is enough, no need to list too much"},{"line_number":644,"context_line":"        VALID_URL \u003d \u0027http://127.0.0.1:8774/v1.1/\\$(tenant_id)s\u0027"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"        ref \u003d self.new_endpoint_ref(self.service_id)"},{"line_number":647,"context_line":"        ref[\u0027url\u0027] \u003d VALID_URL"},{"line_number":648,"context_line":"        self.post(\u0027/endpoints\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_bcb7cf1f","line":645,"in_reply_to":"3a50d1a3_b9d4c1e8","updated":"2015-07-29 06:47:10.000000000","message":"What do you mean ?","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"56d84a5feb0565f930288ae7eeef1cc6c3d8b67c","unresolved":false,"context_lines":[{"line_number":655,"context_line":"        1. a url which has space in it"},{"line_number":656,"context_line":"        2. substitutions is not exactly right"},{"line_number":657,"context_line":"        \"\"\""},{"line_number":658,"context_line":"        INVALID_URLS \u003d ["},{"line_number":659,"context_line":"            # as space in the URL"},{"line_number":660,"context_line":"            \u0027http://127.0.0.1:8774/ v1.1/\u0027,"},{"line_number":661,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(tenant_i d)s\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_59849d5c","line":658,"updated":"2015-07-29 06:18:02.000000000","message":"same here","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"54cf6e5a6ecfebedfe49d0579a219d9f80d80bfc","unresolved":false,"context_lines":[{"line_number":655,"context_line":"        1. a url which has space in it"},{"line_number":656,"context_line":"        2. substitutions is not exactly right"},{"line_number":657,"context_line":"        \"\"\""},{"line_number":658,"context_line":"        INVALID_URLS \u003d ["},{"line_number":659,"context_line":"            # as space in the URL"},{"line_number":660,"context_line":"            \u0027http://127.0.0.1:8774/ v1.1/\u0027,"},{"line_number":661,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(tenant_i d)s\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_797e39e5","line":658,"in_reply_to":"3a50d1a3_59849d5c","updated":"2015-07-29 06:47:10.000000000","message":"Done","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"dcd9a0392a153c50e699049360d86a0767fba7de","unresolved":false,"context_lines":[{"line_number":656,"context_line":"        2. substitutions is not exactly right"},{"line_number":657,"context_line":"        \"\"\""},{"line_number":658,"context_line":"        INVALID_URLS \u003d ["},{"line_number":659,"context_line":"            # as space in the URL"},{"line_number":660,"context_line":"            \u0027http://127.0.0.1:8774/ v1.1/\u0027,"},{"line_number":661,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(tenant_i d)s\u0027,"},{"line_number":662,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_39ff5167","line":659,"updated":"2015-07-29 06:34:17.000000000","message":"del/as","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"54cf6e5a6ecfebedfe49d0579a219d9f80d80bfc","unresolved":false,"context_lines":[{"line_number":656,"context_line":"        2. substitutions is not exactly right"},{"line_number":657,"context_line":"        \"\"\""},{"line_number":658,"context_line":"        INVALID_URLS \u003d ["},{"line_number":659,"context_line":"            # as space in the URL"},{"line_number":660,"context_line":"            \u0027http://127.0.0.1:8774/ v1.1/\u0027,"},{"line_number":661,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(tenant_i d)s\u0027,"},{"line_number":662,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_1ca36301","line":659,"in_reply_to":"3a50d1a3_39ff5167","updated":"2015-07-29 06:47:10.000000000","message":"Done","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"dcd9a0392a153c50e699049360d86a0767fba7de","unresolved":false,"context_lines":[{"line_number":660,"context_line":"            \u0027http://127.0.0.1:8774/ v1.1/\u0027,"},{"line_number":661,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(tenant_i d)s\u0027,"},{"line_number":662,"context_line":""},{"line_number":663,"context_line":"            # using a substitution that is now whitelisted - KeyError"},{"line_number":664,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(nonexistent)s\u0027,"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"            # invalid formatting - ValueError"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_f9f56982","line":663,"updated":"2015-07-29 06:34:17.000000000","message":"s/now/not","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"54cf6e5a6ecfebedfe49d0579a219d9f80d80bfc","unresolved":false,"context_lines":[{"line_number":660,"context_line":"            \u0027http://127.0.0.1:8774/ v1.1/\u0027,"},{"line_number":661,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(tenant_i d)s\u0027,"},{"line_number":662,"context_line":""},{"line_number":663,"context_line":"            # using a substitution that is now whitelisted - KeyError"},{"line_number":664,"context_line":"            \u0027http://127.0.0.1:8774/v1.1/$(nonexistent)s\u0027,"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"            # invalid formatting - ValueError"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a50d1a3_3ca65f0f","line":663,"in_reply_to":"3a50d1a3_f9f56982","updated":"2015-07-29 06:47:10.000000000","message":"Done","commit_id":"b44ecc0d50d7d529095e3f83ea5fd54ada99bb06"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"2d47820206c0345eac0d45c397c03dea52ef8917","unresolved":false,"context_lines":[{"line_number":635,"context_line":"        self.delete(\u0027/endpoints/%s\u0027 % ref[\u0027id\u0027])"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"        # make sure it\u0027s deleted (GET should return 404)"},{"line_number":638,"context_line":"        self.get(\u0027/endpoints/%s\u0027 % ref[\u0027id\u0027], expected_status\u003d404)"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"    def test_endpoint_create_with_valid_url(self):"},{"line_number":641,"context_line":"        \"\"\"Create endpoint with valid url should be tested,too.\"\"\""}],"source_content_type":"text/x-python","patch_set":38,"id":"3a50d1a3_355cb018","line":638,"updated":"2015-07-31 13:37:45.000000000","message":"any need to refactor this testcase if url with space is valid?","commit_id":"312d6c9fd0ab3901cafece0fcb4181490910ea65"},{"author":{"_account_id":15830,"name":"jiaxi","email":"jiaxi@unitedstack.com","username":"jiaxi"},"change_message_id":"cca55800ce2f83efc93391a8dcaf624318194911","unresolved":false,"context_lines":[{"line_number":635,"context_line":"        self.delete(\u0027/endpoints/%s\u0027 % ref[\u0027id\u0027])"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"        # make sure it\u0027s deleted (GET should return 404)"},{"line_number":638,"context_line":"        self.get(\u0027/endpoints/%s\u0027 % ref[\u0027id\u0027], expected_status\u003d404)"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"    def test_endpoint_create_with_valid_url(self):"},{"line_number":641,"context_line":"        \"\"\"Create endpoint with valid url should be tested,too.\"\"\""}],"source_content_type":"text/x-python","patch_set":38,"id":"3a50d1a3_b01a0b17","line":638,"in_reply_to":"3a50d1a3_355cb018","updated":"2015-07-31 14:43:26.000000000","message":"I have had a discussion with Jamie Lennox and David about this.\nThey two cores suggested that I should create endpoint through the manager.\nEven if there is a need to refactor, it should not be included in this patch.","commit_id":"312d6c9fd0ab3901cafece0fcb4181490910ea65"}]}
