~smoser/ubuntu/quantal/cloud-init/sru

« back to all changes in this revision

Viewing changes to cloudinit/DataSourceEc2.py

  • Committer: Scott Moser
  • Date: 2011-01-26 22:16:53 UTC
  • mto: This revision was merged to the branch mainline in revision 59.
  • Revision ID: smoser@ubuntu.com-20110126221653-31nkvnsunkt9zdpo
Tags: upstream-0.6.0
ImportĀ upstreamĀ versionĀ 0.6.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
 
19
19
import DataSource
20
20
 
21
 
import cloudinit
 
21
from cloudinit import seeddir
22
22
import cloudinit.util as util
23
23
import socket
24
24
import urllib2
30
30
 
31
31
class DataSourceEc2(DataSource.DataSource):
32
32
    api_ver  = '2009-04-04'
33
 
    cachedir = cloudinit.cachedir + '/ec2'
34
 
 
35
 
    location_locale_map = { 
36
 
        'us' : 'en_US.UTF-8',
37
 
        'eu' : 'en_GB.UTF-8',
38
 
        'default' : 'en_US.UTF-8',
39
 
    }
40
 
 
41
 
    def __init__(self):
42
 
        pass
 
33
    seeddir = seeddir + '/ec2'
43
34
 
44
35
    def __str__(self):
45
36
        return("DataSourceEc2")
46
37
 
47
38
    def get_data(self):
48
39
        seedret={ }
49
 
        if util.read_optional_seed(seedret,base=self.cachedir + "/"):
 
40
        if util.read_optional_seed(seedret,base=self.seeddir+ "/"):
50
41
            self.userdata_raw = seedret['user-data']
51
42
            self.metadata = seedret['meta-data']
52
 
            cloudinit.log.debug("using seeded ec2 data in %s" % self.cachedir)
 
43
            self.log.debug("using seeded ec2 data in %s" % self.seeddir)
53
44
            return True
54
45
        
55
46
        try:
71
62
    def get_local_mirror(self):
72
63
        return(self.get_mirror_from_availability_zone())
73
64
 
74
 
    def get_locale(self):
75
 
        az = self.metadata['placement']['availability-zone']
76
 
        if self.location_locale_map.has_key(az[0:2]):
77
 
            return(self.location_locale_map[az[0:2]])
78
 
        else:
79
 
            return(self.location_locale_map["default"])
80
 
 
81
65
    def get_mirror_from_availability_zone(self, availability_zone = None):
82
66
        # availability is like 'us-west-1b' or 'eu-west-1a'
83
67
        if availability_zone == None:
84
68
            availability_zone = self.get_availability_zone()
85
69
 
 
70
        fallback = 'http://archive.ubuntu.com/ubuntu/'
 
71
 
 
72
        if self.is_vpc():
 
73
            return fallback
 
74
 
86
75
        try:
87
76
            host="%s.ec2.archive.ubuntu.com" % availability_zone[:-1]
88
77
            socket.getaddrinfo(host, None, 0, socket.SOCK_STREAM)
89
78
            return 'http://%s/ubuntu/' % host
90
79
        except:
91
 
            return 'http://archive.ubuntu.com/ubuntu/'
 
80
            return fallback
92
81
 
93
82
 
94
83
    def wait_for_metadata_service(self, sleeps = 100):
107
96
                resp = urllib2.urlopen(req, timeout=2)
108
97
                if resp.read() != "": return True
109
98
                reason = "empty data [%s]" % resp.getcode()
110
 
            except urllib2.HTTPError, e:
 
99
            except urllib2.HTTPError as e:
111
100
                reason = "http error [%s]" % e.code
112
 
            except urllib2.URLError, e:
 
101
            except urllib2.URLError as e:
113
102
                reason = "url error [%s]" % e.reason
114
103
    
115
104
            if x == 0:
116
 
                cloudinit.log.warning("waiting for metadata service at %s\n" % url)
 
105
                self.log.warning("waiting for metadata service at %s\n" % url)
117
106
 
118
 
            cloudinit.log.warning("  %s [%02s/%s]: %s\n" %
119
 
                (time.strftime("%H:%M:%S"), x+1, sleeps, reason))
 
107
            self.log.warning("  %s [%02s/%s]: %s\n" %
 
108
                (time.strftime("%H:%M:%S",time.gmtime()), x+1, sleeps, reason))
120
109
            time.sleep(sleeptime)
121
110
 
122
 
        cloudinit.log.critical("giving up on md after %i seconds\n" %
 
111
        self.log.critical("giving up on md after %i seconds\n" %
123
112
                  int(time.time()-starttime))
124
113
        return False
125
114
 
139
128
            if entname == "ephemeral" and name == "ephemeral0":
140
129
                found = device
141
130
        if found == None:
142
 
            cloudinit.log.warn("unable to convert %s to a device" % name)
 
131
            self.log.warn("unable to convert %s to a device" % name)
143
132
            return None
144
133
 
145
134
        # LP: #611137
162
151
            for nto in tlist:
163
152
                cand = "/dev/%s%s" % (nto, short[len(nfrom):])
164
153
                if os.path.exists(cand):
165
 
                    cloudinit.log.debug("remapped device name %s => %s" % (found,cand))
 
154
                    self.log.debug("remapped device name %s => %s" % (found,cand))
166
155
                    return(cand)
167
156
        return ofound
 
157
 
 
158
    def is_vpc(self):
 
159
        # per comment in LP: #615545
 
160
        ph="public-hostname"; p4="public-ipv4"
 
161
        if ((ph not in self.metadata or self.metadata[ph] == "") and
 
162
            (p4 not in self.metadata or self.metadata[p4] == "")):
 
163
            return True
 
164
        return False
 
165
 
 
166
datasources = [ 
 
167
  ( DataSourceEc2, ( DataSource.DEP_FILESYSTEM , DataSource.DEP_NETWORK ) ),
 
168
]
 
169
 
 
170
# return a list of data sources that match this set of dependencies
 
171
def get_datasource_list(depends):
 
172
    return(DataSource.list_from_depends(depends, datasources))