diff options
| -rw-r--r-- | cloudinit/sources/helpers/openstack.py | 101 | 
1 files changed, 52 insertions, 49 deletions
| diff --git a/cloudinit/sources/helpers/openstack.py b/cloudinit/sources/helpers/openstack.py index 0fac0335..361c9994 100644 --- a/cloudinit/sources/helpers/openstack.py +++ b/cloudinit/sources/helpers/openstack.py @@ -150,10 +150,6 @@ class BaseReader(object):          pass      @abc.abstractmethod -    def _path_exists(self, path): -        pass - -    @abc.abstractmethod      def _path_read(self, path):          pass @@ -170,22 +166,9 @@ class BaseReader(object):          path = self._path_join(self.base_path, "openstack", *path_pieces)          return self._path_read(path) +    @abc.abstractmethod      def _find_working_version(self, version): -        search_versions = [version] + list(OS_VERSIONS) -        for potential_version in search_versions: -            if not potential_version: -                continue -            path = self._path_join(self.base_path, "openstack", -                                   potential_version) -            if self._path_exists(path): -                if potential_version != version: -                    LOG.debug("Version '%s' not available, attempting to use" -                              " version '%s' instead", version, -                              potential_version) -                return potential_version -        LOG.debug("Version '%s' not available, attempting to use '%s'" -                  " instead", version, OS_LATEST) -        return OS_LATEST +        pass      def read_v2(self, version=None):          """Reads a version 2 formatted location. @@ -228,15 +211,14 @@ class BaseReader(object):              path = self._path_join(self.base_path, path)              data = None              found = False -            if self._path_exists(path): -                try: -                    data = self._path_read(path) -                except IOError: -                    raise NonReadable("Failed to read: %s" % path) -                found = True +            try: +                data = self._path_read(path) +            except IOError: +                pass              else: -                if required: -                    raise NonReadable("Missing mandatory path: %s" % path) +                found = True +            if required and not found: +                raise NonReadable("Missing mandatory path: %s" % path)              if found and translator:                  try:                      data = translator(data) @@ -315,6 +297,23 @@ class ConfigDriveReader(BaseReader):      def _path_read(self, path):          return util.load_file(path) +    def _find_working_version(self, version): +        search_versions = [version] + list(OS_VERSIONS) +        for potential_version in search_versions: +            if not potential_version: +                continue +            path = self._path_join(self.base_path, "openstack", +                                   potential_version) +            if self._path_exists(path): +                if potential_version != version: +                    LOG.debug("Version '%s' not available, attempting to use" +                              " version '%s' instead", version, +                              potential_version) +                return potential_version +        LOG.debug("Version '%s' not available, attempting to use '%s'" +                  " instead", version, OS_LATEST) +        return OS_LATEST +      def _read_ec2_metadata(self):          path = self._path_join(self.base_path,                                 'ec2', 'latest', 'meta-data.json') @@ -401,6 +400,32 @@ class MetadataReader(BaseReader):          self.timeout = float(timeout)          self.retries = int(retries) +    def _find_working_version(self, version): +        search_versions = [version] + list(OS_VERSIONS) +        version_path = self._path_join(self.base_path, "openstack") +        versions_available = [] +        try: +            versions = self._path_read(version_path) +        except IOError: +            pass +        else: +            for line in versions.splitlines(): +                line = line.strip() +                if not line: +                    continue +                versions_available.append(line) +        for potential_version in search_versions: +            if potential_version not in versions_available: +                continue +            if potential_version != version: +                LOG.debug("Version '%s' not available, attempting to use" +                          " version '%s' instead", version, +                          potential_version) +            return potential_version +        LOG.debug("Version '%s' not available, searched %s, attempting to" +                  " use '%s' instead", version, search_versions, OS_LATEST) +        return OS_LATEST +      def _path_read(self, path):          response = url_helper.readurl(path,                                        retries=self.retries, @@ -408,28 +433,6 @@ class MetadataReader(BaseReader):                                        timeout=self.timeout)          return response.contents -    def _path_exists(self, path): - -        def should_retry_cb(request, cause): -            try: -                code = int(cause.code) -                if code >= 400: -                    return False -            except (TypeError, ValueError): -                # Older versions of requests didn't have a code. -                pass -            return True - -        try: -            response = url_helper.readurl(path, -                                          retries=self.retries, -                                          ssl_details=self.ssl_details, -                                          timeout=self.timeout, -                                          exception_cb=should_retry_cb) -            return response.ok() -        except IOError: -            return False -      def _path_join(self, base, *add_ons):          return url_helper.combine_url(base, *add_ons) | 
