text: # Copyright 2018 Red Hat, Inc.
  # 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.
  
  import yaml
  
  
  def _convert_remove_append(options):
      """Convert append and remove dicts read from .yaml file.
  
      :param options: {'section.key': 'value1,value2', ...}
      :type options: dict
      :return: ['section.key=value1,value2', ...]
      :rtype: list
      """
      converted = []
      for key in options:
          v = options[key]
          if isinstance(v, list):
              v = ','.join(v)
          converted.append(key + "=" + v)
      return converted
  
  
  def _read_yaml_file(path):
      """Read a .yaml file.
  
      :param path: path to the profile.yaml file
      :type path: string
      :return: profile arguments
      :rtype: dict
      """
      with open(path, 'r') as stream:
          return yaml.safe_load(stream)
  
  
  def read_profile_file(path):
      """Read python-tempestconf arguments from a .yaml file.
  
      :param path: path to the profile.yaml file
      :type path: string
      :return: profile arguments
      :rtype: dict
      """
      profile_args = _read_yaml_file(path)
      # convert overrides, to a list of tuples (s, k, v)
      overrides = []
      if 'overrides' in profile_args:
          for key in profile_args['overrides']:
              s, k = key.split('.')
              v = profile_args['overrides'][key]
              if isinstance(v, list):
                  v = ','.join(v)
              overrides.append((s, k, str(v)))
      profile_args['overrides'] = overrides
      # convert remove
      remove = []
      if 'remove' in profile_args:
          remove = _convert_remove_append(profile_args['remove'])
      profile_args['remove'] = remove
      # convert append values
      append = []
      if 'append' in profile_args:
          append = _convert_remove_append(profile_args['append'])
      profile_args['append'] = append
      return profile_args
  
  
  def generate_profile(args, path):
      """Generates a sample profile.yaml file.
  
      :type args: argparse.Namespace
      :param path: Specifies where the sample file will be generated in.
      :type path: string
      """
      iterable_args = vars(args)
      # pop following arguments as they are written
      # more detailed to the file below
      iterable_args.pop('append')
      iterable_args.pop('overrides')
      iterable_args.pop('remove')
      # pop profile as that shouldn't be in a profile.yaml
      iterable_args.pop('profile')
      with open(path, 'w') as outfile:
          yaml.safe_dump(iterable_args, outfile, default_flow_style=False)
          outfile.write("""append: {}
    #identity.username: username
    #compute-feature-enabled.api_extensions:
    #  - dvr
    #  - extension
  overrides: {}
    #identity.username: username
    #identity.password:
    #  - my_password
    #compute-feature-enabled.api_extensions:
    #  - dvr
    #  - extension
  remove: {}
    #identity.username: username
    #compute-feature-enabled.api_extensions:
    #  - dvr
    #  - extension
  """)
  