Index: cloud-init/cloudinit/DataSourceEc2.py =================================================================== --- cloud-init.orig/cloudinit/DataSourceEc2.py +++ cloud-init/cloudinit/DataSourceEc2.py @@ -24,7 +24,7 @@ import socket import urllib2 import time import sys -import boto_utils +import boto.utils import os.path import errno import urlparse @@ -48,8 +48,8 @@ class DataSourceEc2(DataSource.DataSourc try: if not self.wait_for_metadata_service(): return False - self.userdata_raw = boto_utils.get_instance_userdata(self.api_ver, None, self.metadata_address) - self.metadata = boto_utils.get_instance_metadata(self.api_ver, self.metadata_address) + self.userdata_raw = boto.utils.get_instance_userdata(self.api_ver, None, self.metadata_address) + self.metadata = boto.utils.get_instance_metadata(self.api_ver, self.metadata_address) return True except Exception as e: print e Index: cloud-init/cloudinit/boto_utils.py =================================================================== --- cloud-init.orig/cloudinit/boto_utils.py +++ /dev/null @@ -1,107 +0,0 @@ -# The contents of this file are taken from boto 1.9b's boto/utils.py -# -# Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/ -# -# Permission is hereby granted, free of charge, to any person obtaining a -# copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, dis- -# tribute, sublicense, and/or sell copies of the Software, and to permit -# persons to whom the Software is furnished to do so, subject to the fol- -# lowing conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- -# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -# IN THE SOFTWARE. - -# -# Parts of this code were copied or derived from sample code supplied by AWS. -# The following notice applies to that code. -# -# This software code is made available "AS IS" without warranties of any -# kind. You may copy, display, modify and redistribute the software -# code either by itself or as incorporated into your code; provided that -# you do not remove any proprietary notices. Your use of this software -# code is at your own risk and you waive any claim against Amazon -# Digital Services, Inc. or its affiliates with respect to your use of -# this software code. (c) 2006 Amazon Digital Services, Inc. or its -# affiliates. -import urllib2 -import sys -import time - -def retry_url(url, retry_on_404=True): - for i in range(0, 10): - try: - req = urllib2.Request(url) - resp = urllib2.urlopen(req) - return resp.read() - except urllib2.HTTPError as e: - # in 2.6 you use getcode(), in 2.5 and earlier you use code - if hasattr(e, 'getcode'): - code = e.getcode() - else: - code = e.code - if code == 404 and not retry_on_404: - return '' - except: - pass - #boto.log.exception('Caught exception reading instance data') - sys.stderr.write('Caught exception reading instance data: %s\n' % url) - time.sleep(2**i) - #boto.log.error('Unable to read instance data, giving up') - sys.stderr.write('Caught exception reading instance data, giving up\n') - return '' - -def get_instance_metadata(version='latest',url='http://169.254.169.254'): - """ - Returns the instance metadata as a nested Python dictionary. - Simple values (e.g. local_hostname, hostname, etc.) will be - stored as string values. Values such as ancestor-ami-ids will - be stored in the dict as a list of string values. More complex - fields such as public-keys and will be stored as nested dicts. - """ - url = '%s/%s/meta-data/' % (url,version) - return _get_instance_metadata(url) - -def get_instance_userdata(version='latest', sep=None,url='http://169.254.169.254'): - url = '%s/%s/user-data' % (url,version) - user_data = retry_url(url, retry_on_404=False) - if user_data: - if sep: - l = user_data.split(sep) - user_data = {} - for nvpair in l: - t = nvpair.split('=') - user_data[t[0].strip()] = t[1].strip() - return user_data - - -def _get_instance_metadata(url): - d = {} - data = retry_url(url) - if data: - fields = data.split('\n') - for field in fields: - if field.endswith('/'): - d[field[0:-1]] = _get_instance_metadata(url + field) - else: - p = field.find('=') - if p > 0: - key = field[p+1:] - resource = field[0:p] + '/openssh-key' - else: - key = resource = field - val = retry_url(url + resource) - p = val.find('\n') - if p > 0: - val = val.split('\n') - d[key] = val - return d