diff options
author | Scott Moser <smoser@nelson> | 2010-01-05 23:40:05 -0500 |
---|---|---|
committer | Scott Moser <smoser@nelson> | 2010-01-05 23:40:05 -0500 |
commit | e6cb87fa2499e4066b3e4959ea903952b4e3723e (patch) | |
tree | e4410dd93159aa16d333a0c11624836f2a0004f8 /ec2init/__init__.py | |
parent | 48acacce6a964930b78ad4400c5e65aa66e63063 (diff) | |
download | vyos-cloud-init-e6cb87fa2499e4066b3e4959ea903952b4e3723e.tar.gz vyos-cloud-init-e6cb87fa2499e4066b3e4959ea903952b4e3723e.zip |
initial re-org, ec2 data source successfully reads from cache if present
Diffstat (limited to 'ec2init/__init__.py')
-rw-r--r-- | ec2init/__init__.py | 122 |
1 files changed, 36 insertions, 86 deletions
diff --git a/ec2init/__init__.py b/ec2init/__init__.py index 3bd1d23e..b34f15cc 100644 --- a/ec2init/__init__.py +++ b/ec2init/__init__.py @@ -1,6 +1,6 @@ # # Common code for the EC2 initialisation scripts in Ubuntu -# Copyright (C) 2008-2009 Canonical Ltd. +# Copyright (C) 2008-2009 Canonical Ltd # # Author: Soren Hansen <soren@canonical.com> # @@ -18,105 +18,55 @@ # import os -import socket -import time -import urllib2 from configobj import ConfigObj import boto.utils -class EC2Init(): - api_ver = '2008-02-01' - conffile = '/etc/ec2-init/ec2-config.cfg' +cachedir = '/var/lib/cloud/data/cache' - location_locale_map = { - 'us' : 'en_US.UTF-8', - 'eu' : 'en_GB.UTF-8' - } +import DataSourceEc2 - location_archive_map = { - 'us' : 'http://us.ec2.archive.ubuntu.com/ubuntu', - 'eu' : 'http://eu.ec2.archive.ubuntu.com/ubuntu' - } +class EC2Init: + datasource_list = [ DataSourceEc2.DataSourceEc2 ] - def __init__(self): - self.meta_data_base_url = 'http://169.254.169.254/%s/meta-data' % self.api_ver - self.user_data_base_url = 'http://169.254.169.254/%s/user-data' % self.api_ver - self.config = ConfigObj(self.conffile) - - def wait_or_bail(self): - if self.wait_for_metadata_service(): + def restore_from_cache(self): + try: + f=open(cachedir + "/obj.pkl", "rb") + data = pickle.load(f) + self.datasource = data return True - else: - bailout_command = self.get_cfg_option_str('bailout_command') - if bailout_command: - os.system(bailout_command) + except: return False - def get_cfg_option_bool(self, key, default=None): - val = self.config.get(key, default) - if val.lower() in ['1', 'on', 'yes']: + def write_to_cache(self): + try: + f=open(cachedir + "/obj.pkl", "wb") + data = pickle.dump(self.datasource,f) + return True + except: + return False + + def get_data_source(self): + if self.restore_from_cache(): return True - return False - - def get_cfg_option_str(self, key, default=None): - return self.config.get(key, default) - def get_ssh_keys(self): - conn = urllib2.urlopen('%s/public-keys/' % self.meta_data_base_url) - data = conn.read() - keyids = [line.split('=')[0] for line in data.split('\n')] - return [urllib2.urlopen('%s/public-keys/%d/openssh-key' % (self.meta_data_base_url, int(keyid))).read().rstrip() for keyid in keyids] + for source in self.datasource_list: + try: + print "trying + %s" % source + s = source() + if s.get_data(): + self.datasource = s + return + except: + pass + raise Exception("Could not find data source") def get_user_data(self): - return boto.utils.get_instance_userdata() + return(self.datasource.get_user_data()) - def get_instance_metadata(self): - self.instance_metadata = getattr(self, 'instance_metadata', boto.utils.get_instance_metadata()) - return self.instance_metadata - - def get_ami_id(self): - return self.get_instance_metadata()['ami-id'] - - def get_availability_zone(self): - conn = urllib2.urlopen('%s/placement/availability-zone' % self.meta_data_base_url) - return conn.read() - - def get_hostname(self): - hostname = self.get_instance_metadata()['local-hostname'] - hostname = hostname.split('.')[0] - return hostname - - def get_mirror_from_availability_zone(self, availability_zone): - # availability is like 'us-west-1b' or 'eu-west-1a' - try: - host="%s.ec2.archive.ubuntu.com" % availability_zone[:-1] - socket.getaddrinfo(host, None, 0, socket.SOCK_STREAM) - return 'http://%s/ubuntu/' % host - except: - return 'http://archive.ubuntu.com/ubuntu/' - - def wait_for_metadata_service(self): - timeout = 2 - # This gives us about half an hour before we ultimately bail out - for x in range(10): - s = socket.socket() - try: - address = '169.254.169.254' - port = 80 - s.connect((address,port)) - s.close() - return True - except socket.error, e: - time.sleep(timeout) - timeout = timeout * 2 + def get_cfg_option_bool(self, key, default=None): + val = self.config.get(key, default) + if val.lower() in ['1', 'on', 'yes']: + return True return False - def get_location_from_availability_zone(self, availability_zone): - if availability_zone.startswith('us-'): - return 'us' - elif availability_zone.startswith('eu-'): - return 'eu' - raise Exception('Could not determine location') - - |