diff options
| author | Scott Moser <smoser@ubuntu.com> | 2015-08-07 14:45:01 -0500 | 
|---|---|---|
| committer | Scott Moser <smoser@ubuntu.com> | 2015-08-07 14:45:01 -0500 | 
| commit | 9975e06338bb646dbefe0749f7a8f88974d44d24 (patch) | |
| tree | 17b072271f8faa303bbfdde1ff33496cc320ecec /cloudinit/sources/DataSourceMAAS.py | |
| parent | 328cc7fbaf4d60b51193fb8c14e52d8c6f3273f2 (diff) | |
| parent | 95bfe5d5150e2bf0a26dd1b97578c4fd04152365 (diff) | |
| download | vyos-cloud-init-9975e06338bb646dbefe0749f7a8f88974d44d24.tar.gz vyos-cloud-init-9975e06338bb646dbefe0749f7a8f88974d44d24.zip | |
Add initial reporting module and events
Diffstat (limited to 'cloudinit/sources/DataSourceMAAS.py')
| -rw-r--r-- | cloudinit/sources/DataSourceMAAS.py | 146 | 
1 files changed, 42 insertions, 104 deletions
| diff --git a/cloudinit/sources/DataSourceMAAS.py b/cloudinit/sources/DataSourceMAAS.py index c1a0eb61..2f36bbe2 100644 --- a/cloudinit/sources/DataSourceMAAS.py +++ b/cloudinit/sources/DataSourceMAAS.py @@ -52,7 +52,20 @@ class DataSourceMAAS(sources.DataSource):          sources.DataSource.__init__(self, sys_cfg, distro, paths)          self.base_url = None          self.seed_dir = os.path.join(paths.seed_dir, 'maas') -        self.oauth_clockskew = None +        self.oauth_helper = self._get_helper() + +    def _get_helper(self): +        mcfg = self.ds_cfg +        # If we are missing token_key, token_secret or consumer_key +        # then just do non-authed requests +        for required in ('token_key', 'token_secret', 'consumer_key'): +            if required not in mcfg: +                return url_helper.OauthUrlHelper() + +        return url_helper.OauthHelper( +            consumer_key=mcfg['consumer_key'], token_key=mcfg['token_key'], +            token_secret=mcfg['token_secret'], +            consumer_secret=mcfg.get('consumer_secret'))      def __str__(self):          root = sources.DataSource.__str__(self) @@ -84,9 +97,9 @@ class DataSourceMAAS(sources.DataSource):              self.base_url = url -            (userdata, metadata) = read_maas_seed_url(self.base_url, -                                                      self._md_headers, -                                                      paths=self.paths) +            (userdata, metadata) = read_maas_seed_url( +                self.base_url, self.oauth_helper.md_headers, +                paths=self.paths)              self.userdata_raw = userdata              self.metadata = metadata              return True @@ -94,31 +107,8 @@ class DataSourceMAAS(sources.DataSource):              util.logexc(LOG, "Failed fetching metadata from url %s", url)              return False -    def _md_headers(self, url): -        mcfg = self.ds_cfg - -        # If we are missing token_key, token_secret or consumer_key -        # then just do non-authed requests -        for required in ('token_key', 'token_secret', 'consumer_key'): -            if required not in mcfg: -                return {} - -        consumer_secret = mcfg.get('consumer_secret', "") - -        timestamp = None -        if self.oauth_clockskew: -            timestamp = int(time.time()) + self.oauth_clockskew - -        return oauth_headers(url=url, -                             consumer_key=mcfg['consumer_key'], -                             token_key=mcfg['token_key'], -                             token_secret=mcfg['token_secret'], -                             consumer_secret=consumer_secret, -                             timestamp=timestamp) -      def wait_for_metadata_service(self, url):          mcfg = self.ds_cfg -          max_wait = 120          try:              max_wait = int(mcfg.get("max_wait", max_wait)) @@ -138,10 +128,8 @@ class DataSourceMAAS(sources.DataSource):          starttime = time.time()          check_url = "%s/%s/meta-data/instance-id" % (url, MD_VERSION)          urls = [check_url] -        url = url_helper.wait_for_url(urls=urls, max_wait=max_wait, -                                      timeout=timeout, -                                      exception_cb=self._except_cb, -                                      headers_cb=self._md_headers) +        url = self.oauth_helper.wait_for_url( +            urls=urls, max_wait=max_wait, timeout=timeout)          if url:              LOG.debug("Using metadata source: '%s'", url) @@ -151,26 +139,6 @@ class DataSourceMAAS(sources.DataSource):          return bool(url) -    def _except_cb(self, msg, exception): -        if not (isinstance(exception, url_helper.UrlError) and -                (exception.code == 403 or exception.code == 401)): -            return - -        if 'date' not in exception.headers: -            LOG.warn("Missing header 'date' in %s response", exception.code) -            return - -        date = exception.headers['date'] -        try: -            ret_time = time.mktime(parsedate(date)) -        except Exception as e: -            LOG.warn("Failed to convert datetime '%s': %s", date, e) -            return - -        self.oauth_clockskew = int(ret_time - time.time()) -        LOG.warn("Setting oauth clockskew to %d", self.oauth_clockskew) -        return -  def read_maas_seed_dir(seed_d):      """ @@ -196,12 +164,12 @@ def read_maas_seed_dir(seed_d):      return check_seed_contents(md, seed_d) -def read_maas_seed_url(seed_url, header_cb=None, timeout=None, +def read_maas_seed_url(seed_url, read_file_or_url=None, timeout=None,                         version=MD_VERSION, paths=None):      """      Read the maas datasource at seed_url. -      - header_cb is a method that should return a headers dictionary for -        a given url +      read_file_or_url is a method that should provide an interface +      like util.read_file_or_url      Expected format of seed_url is are the following files:        * <seed_url>/<version>/meta-data/instance-id @@ -222,14 +190,12 @@ def read_maas_seed_url(seed_url, header_cb=None, timeout=None,          'user-data': "%s/%s" % (base_url, 'user-data'),      } +    if read_file_or_url is None: +        read_file_or_url = util.read_file_or_url +      md = {}      for name in file_order:          url = files.get(name) -        if not header_cb: -            def _cb(url): -                return {} -            header_cb = _cb -          if name == 'user-data':              retries = 0          else: @@ -237,10 +203,8 @@ def read_maas_seed_url(seed_url, header_cb=None, timeout=None,          try:              ssl_details = util.fetch_ssl_details(paths) -            resp = util.read_file_or_url(url, retries=retries, -                                         headers_cb=header_cb, -                                         timeout=timeout, -                                         ssl_details=ssl_details) +            resp = read_file_or_url(url, retries=retries, +                                    timeout=timeout, ssl_details=ssl_details)              if resp.ok():                  if name in BINARY_FIELDS:                      md[name] = resp.contents @@ -280,24 +244,6 @@ def check_seed_contents(content, seed):      return (userdata, md) -def oauth_headers(url, consumer_key, token_key, token_secret, consumer_secret, -                  timestamp=None): -    if timestamp: -        timestamp = str(timestamp) -    else: -        timestamp = None - -    client = oauth1.Client( -        consumer_key, -        client_secret=consumer_secret, -        resource_owner_key=token_key, -        resource_owner_secret=token_secret, -        signature_method=oauth1.SIGNATURE_PLAINTEXT, -        timestamp=timestamp) -    uri, signed_headers, body = client.sign(url) -    return signed_headers - -  class MAASSeedDirNone(Exception):      pass @@ -361,47 +307,39 @@ if __name__ == "__main__":                  if key in cfg and creds[key] is None:                      creds[key] = cfg[key] -        def geturl(url, headers_cb): -            req = Request(url, data=None, headers=headers_cb(url)) -            return urlopen(req).read() +        oauth_helper = url_helper.OauthUrlHelper(**creds) + +        def geturl(url): +            return oauth_helper.readurl(url).contents          def printurl(url, headers_cb): -            print("== %s ==\n%s\n" % (url, geturl(url, headers_cb))) +            print("== %s ==\n%s\n" % (url, geturl(url))) -        def crawl(url, headers_cb=None): +        def crawl(url):              if url.endswith("/"): -                for line in geturl(url, headers_cb).splitlines(): +                for line in geturl(url).splitlines():                      if line.endswith("/"): -                        crawl("%s%s" % (url, line), headers_cb) +                        crawl("%s%s" % (url, line))                      else: -                        printurl("%s%s" % (url, line), headers_cb) +                        printurl("%s%s" % (url, line))              else: -                printurl(url, headers_cb) - -        def my_headers(url): -            headers = {} -            if creds.get('consumer_key', None) is not None: -                headers = oauth_headers(url, **creds) -            return headers +                printurl(url)          if args.subcmd == "check-seed": -            if args.url.startswith("http"): -                (userdata, metadata) = read_maas_seed_url(args.url, -                                                          header_cb=my_headers, -                                                          version=args.apiver) -            else: -                (userdata, metadata) = read_maas_seed_url(args.url) +            (userdata, metadata) = read_maas_seed_url( +                args.url, read_file_or_url=oauth_helper.read_file_or_url, +                version=args.apiver)              print("=== userdata ===")              print(userdata)              print("=== metadata ===")              pprint.pprint(metadata)          elif args.subcmd == "get": -            printurl(args.url, my_headers) +            printurl(args.url)          elif args.subcmd == "crawl":              if not args.url.endswith("/"):                  args.url = "%s/" % args.url -            crawl(args.url, my_headers) +            crawl(args.url)      main() | 
