)]}'
{"rally/plugins/openstack/validators.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"5c1a008528b9a8b5555ad4df1e580fe417d08c93","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                      namespace\u003d\"openstack\")"},{"line_number":84,"context_line":"class RequiredNeutronExtensionsValidator(validation.Validator):"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def __init__(self, *required_extensions):"},{"line_number":87,"context_line":"        \"\"\"Validator checks if the specified Neutron extension is available"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        :param required_extensions: list of Neutron extensions"}],"source_content_type":"text/x-python","patch_set":5,"id":"5ff73747_6d8026c0","line":86,"range":{"start_line":86,"start_character":25,"end_line":86,"end_character":43},"updated":"2017-04-28 12:13:30.000000000","message":"let\u0027s call it just \"extensions\"","commit_id":"8f6a312c21b0ca223a08ff7b320dbdafb81e82ce"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"5c1a008528b9a8b5555ad4df1e580fe417d08c93","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def validate(self, config, credentials, plugin_cls, plugin_cfg):"},{"line_number":95,"context_line":"        for clients in credentials[\"openstack\"][\"users\"]:"},{"line_number":96,"context_line":"            extensions \u003d clients.get(\"credentials\", {}).clients().neutron().list_extensions().get("},{"line_number":97,"context_line":"                \"extensions\", [])"},{"line_number":98,"context_line":"            aliases \u003d map(lambda x: x[\"alias\"], extensions)"},{"line_number":99,"context_line":"            for extension in self.req_ext:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5ff73747_ad63ce41","line":96,"range":{"start_line":96,"start_character":32,"end_line":96,"end_character":55},"updated":"2017-04-28 12:13:30.000000000","message":"credentials should be there in 100% cases, so clients[\"credentials\"] should work","commit_id":"8f6a312c21b0ca223a08ff7b320dbdafb81e82ce"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"21929c252e9bb8576077e0c6b8c0a5a6366ca0ea","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        for user in credentials[\"openstack\"][\"users\"]:"},{"line_number":103,"context_line":"            clients \u003d user[\"credential\"].clients()"},{"line_number":104,"context_line":"            extensions \u003d clients.neutron().list_extensions()[\"extensions\"]"},{"line_number":105,"context_line":"            aliases \u003d map(lambda x: x[\"alias\"], extensions)"},{"line_number":106,"context_line":"            for extension in self.req_ext:"},{"line_number":107,"context_line":"                if extension not in aliases:"},{"line_number":108,"context_line":"                    msg \u003d (\"Neutron extension %s \""}],"source_content_type":"text/x-python","patch_set":10,"id":"5ff73747_84ff6c33","line":105,"range":{"start_line":105,"start_character":22,"end_line":105,"end_character":59},"updated":"2017-05-03 09:22:37.000000000","message":"if you will submit new patch-set, I prefer to use list comprehension instead of map. I mean\n\n   aliases \u003d [x[\"alias\"] for x in extensions]","commit_id":"f8dc8c6f02edfd8df8154fc6f91e7f73e2e3af71"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"13db4de0c20a8d572adad46dd3d27ff854eed7f7","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            self.req_ext.extend(args)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def validate(self, config, credentials, plugin_cls, plugin_cfg):"},{"line_number":102,"context_line":"        for user in credentials[\"openstack\"][\"users\"]:"},{"line_number":103,"context_line":"            clients \u003d user[\"credential\"].clients()"},{"line_number":104,"context_line":"            extensions \u003d clients.neutron().list_extensions()[\"extensions\"]"},{"line_number":105,"context_line":"            aliases \u003d [x[\"alias\"] for x in extensions]"},{"line_number":106,"context_line":"            for extension in self.req_ext:"},{"line_number":107,"context_line":"                if extension not in aliases:"},{"line_number":108,"context_line":"                    msg \u003d (\"Neutron extension %s \""},{"line_number":109,"context_line":"                           \"is not configured\") % extension"},{"line_number":110,"context_line":"                    return self.fail(msg)"}],"source_content_type":"text/x-python","patch_set":12,"id":"5ff73747_4f6cd09b","line":110,"range":{"start_line":102,"start_character":8,"end_line":110,"end_character":41},"updated":"2017-05-03 15:29:36.000000000","message":"Sorry for a minor comment after +2, but I had a talk with neutron folks and they said that response of list_extensions doesn\u0027t depend on user and should be equal for all regular users and admin, so let\u0027s remove \"for\" loop and use the first user from credentials[\"openstack\"][\"users\"] to verify available extensions.","commit_id":"f5986b39804cc4b8faa51e35e80e5ecbb3b8e5ab"}]}
