text: # Licensed to the Apache Software Foundation (ASF) under one or more
  # contributor license agreements.  See the NOTICE file distributed with
  # this work for additional information regarding copyright ownership.
  # The ASF licenses this file to You 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.
  
  # Helper class for loading large fixture data
  from __future__ import with_statement
  
  import os
  import codecs
  
  from libcloud.utils.py3 import PY3
  from libcloud.utils.py3 import u
  
  FIXTURES_ROOT = {
      "common": "common/fixtures",
      "compute": "compute/fixtures",
      "storage": "storage/fixtures",
      "loadbalancer": "loadbalancer/fixtures",
      "dns": "dns/fixtures",
      "drs": "drs/fixtures",
      "backup": "backup/fixtures",
      "openstack": "compute/fixtures/openstack",
      "container": "container/fixtures",
  }
  
  
  class FileFixtures(object):
      def __init__(self, fixtures_type, sub_dir=""):
          script_dir = os.path.abspath(os.path.split(__file__)[0])
          self.root = os.path.join(script_dir, FIXTURES_ROOT[fixtures_type], sub_dir)
  
      def load(self, file):
          path = os.path.join(self.root, file)
          if os.path.exists(path):
              if PY3:
                  with open(path, "r", encoding="utf-8") as fh:
                      content = fh.read()
                  return u(content)
              else:
                  with codecs.open(path, "r", "utf-8") as fh:
                      content = fh.read()
                  return content
          else:
              raise IOError(path)
  
  
  class ComputeFileFixtures(FileFixtures):
      def __init__(self, sub_dir=""):
          super(ComputeFileFixtures, self).__init__(
              fixtures_type="compute", sub_dir=sub_dir
          )
  
  
  class StorageFileFixtures(FileFixtures):
      def __init__(self, sub_dir=""):
          super(StorageFileFixtures, self).__init__(
              fixtures_type="storage", sub_dir=sub_dir
          )
  
  
  class LoadBalancerFileFixtures(FileFixtures):
      def __init__(self, sub_dir=""):
          super(LoadBalancerFileFixtures, self).__init__(
              fixtures_type="loadbalancer", sub_dir=sub_dir
          )
  
  
  class DNSFileFixtures(FileFixtures):
      def __init__(self, sub_dir=""):
          super(DNSFileFixtures, self).__init__(fixtures_type="dns", sub_dir=sub_dir)
  
  
  class DRSFileFixtures(FileFixtures):
      def __init__(self, sub_dir=""):
          super(DRSFileFixtures, self).__init__(fixtures_type="drs", sub_dir=sub_dir)
  
  
  class OpenStackFixtures(FileFixtures):
      def __init__(self, sub_dir=""):
          super(OpenStackFixtures, self).__init__(
              fixtures_type="openstack", sub_dir=sub_dir
          )
  
  
  class ContainerFileFixtures(FileFixtures):
      def __init__(self, sub_dir=""):
          super(ContainerFileFixtures, self).__init__(
              fixtures_type="container", sub_dir=sub_dir
          )
  
  
  class BackupFileFixtures(FileFixtures):
      def __init__(self, sub_dir=""):
          super(BackupFileFixtures, self).__init__(
              fixtures_type="backup", sub_dir=sub_dir
          )
  