text: # All Rights Reserved.
  #
  # Licensed under the Apache License, Version 2.0 (the "License"); you may
  # not use this file except in compliance with the License. You may obtain
  # a copy of the License at
  #
  # http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  # License for the specific language governing permissions and limitations
  # under the License.
  
  
  from rally.common.i18n import _
  from rally.common import logging
  from rally.common import objects
  from rally import osclients
  from rally.plugins.openstack.context.keystone import users
  from rally.task import context
  
  
  LOG = logging.getLogger(__name__)
  
  
  # NOTE(boris-42): This context should be hidden for now and used only by
  #                 benchmark engine.  In future during various refactoring of
  #                 validation system and rally CI testing we will make it public
  
  @context.configure(name="existing_users", order=99)
  class ExistingUsers(users.UserContextMixin, context.Context):
      """This context supports using existing users in Rally.
  
         It uses information about deployment to properly
         initialize context["users"] and context["tenants"]
  
         So there won't be big difference between usage of "users" and
         "existing_users" context.
      """
  
      # NOTE(boris-42): We don't need to check config schema because
      #                 this is used only by benchmark engine
      CONFIG_SCHEMA = {}
  
      @logging.log_task_wrapper(LOG.info, _("Enter context: `existing_users`"))
      def setup(self):
          self.context["users"] = []
          self.context["tenants"] = {}
  
          for user in self.config:
              user_credential = objects.Credential(**user)
              user_kclient = osclients.Clients(user_credential).keystone()
  
              if user_kclient.tenant_id not in self.context["tenants"]:
                  self.context["tenants"][user_kclient.tenant_id] = {
                      "id": user_kclient.tenant_id,
                      "name": user_kclient.tenant_name
                  }
  
              self.context["users"].append({
                  "credential": user_credential,
                  "id": user_kclient.user_id,
                  "tenant_id": user_kclient.tenant_id
              })
  
      @logging.log_task_wrapper(LOG.info, _("Exit context: `existing_users`"))
      def cleanup(self):
          """These users are not managed by Rally, so don't touch them."""
  