Merge lp:~smoser/cloud-init/mirror-rework into lp:~cloud-init-dev/cloud-init/trunk

Proposed by Scott Moser
Status: Merged
Merged at revision: 630
Proposed branch: lp:~smoser/cloud-init/mirror-rework
Merge into: lp:~cloud-init-dev/cloud-init/trunk
Diff against target: 591 lines (+309/-108)
11 files modified
ChangeLog (+4/-0)
cloudinit/cloud.py (+0/-3)
cloudinit/config/cc_apt_update_upgrade.py (+74/-57)
cloudinit/distros/__init__.py (+71/-2)
cloudinit/distros/debian.py (+4/-0)
cloudinit/sources/DataSourceCloudStack.py (+2/-1)
cloudinit/sources/DataSourceEc2.py (+6/-34)
cloudinit/sources/__init__.py (+7/-3)
config/cloud.cfg (+14/-2)
templates/sources.list.tmpl (+6/-6)
tests/unittests/test_distros/test_generic.py (+121/-0)
To merge this branch: bzr merge lp:~smoser/cloud-init/mirror-rework
Reviewer Review Type Date Requested Status
cloud-init Commiters Pending
Review via email: mp+120852@code.launchpad.net

Commit message

rework package mirror selection

There are several changes here.
 * Datasource now has a 'availability_zone' getter.
 * get_package_mirror_info
   * Datasource convenience 'get_package_mirror_info' that calls
     the configured distro, and passes it the availability-zone
   * distro has a get_package_mirror_info method
   * get_package_mirror_info returns a dict that of name:mirror
     this is to facilitate use of 'security' and 'primary' archive.
   * this supports searching based on templates. Any template
     that references undefined values is skipped. These templates
     can contain 'availability_zone' (LP: #1037727)
   * distro's mirrors can be arch specific (LP: #1028501)
 * rename_apt_lists supports the "mirror_info" rather than single mirror
 * generate_sources_list supports mirror_info, and as a result, the
   ubuntu mirrors reference '$security' rather than security (LP: #1006963)
 * remove the DataSourceEc2 specific mirror selection, but instead
   rely on the above filtering, and the fact that 'ec2_region' is only
   defined if the availability_zone looks like a ec2 az.

To post a comment you must log in.
lp:~smoser/cloud-init/mirror-rework updated
634. By Scott Moser

improve the check for "uses unknown key" in mirror templates

instead of substituting and then checking for presense of a unlikely to
occur string, this only adds to the search list if there is no KeyError
raised.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'ChangeLog'
--- ChangeLog 2012-08-21 01:27:04 +0000
+++ ChangeLog 2012-08-22 19:21:17 +0000
@@ -1,4 +1,8 @@
10.7.0:10.7.0:
2 - allow distro mirror selection to include availability-zone (LP: #1037727)
3 - allow arch specific mirror selection (select ports.ubuntu.com on arm)
4 LP: #1028501
5 - allow specification of security mirrors (LP: #1006963)
2 - add the 'None' datasource (LP: #906669), which will allow jobs6 - add the 'None' datasource (LP: #906669), which will allow jobs
3 to run even if there is no "real" datasource found.7 to run even if there is no "real" datasource found.
4 - write ssh authorized keys to console, ssh_authkey_fingerprints8 - write ssh authorized keys to console, ssh_authkey_fingerprints
59
=== modified file 'cloudinit/cloud.py'
--- cloudinit/cloud.py 2012-06-21 16:12:16 +0000
+++ cloudinit/cloud.py 2012-08-22 19:21:17 +0000
@@ -82,9 +82,6 @@
82 def get_locale(self):82 def get_locale(self):
83 return self.datasource.get_locale()83 return self.datasource.get_locale()
8484
85 def get_local_mirror(self):
86 return self.datasource.get_local_mirror()
87
88 def get_hostname(self, fqdn=False):85 def get_hostname(self, fqdn=False):
89 return self.datasource.get_hostname(fqdn=fqdn)86 return self.datasource.get_hostname(fqdn=fqdn)
9087
9188
=== modified file 'cloudinit/config/cc_apt_update_upgrade.py'
--- cloudinit/config/cc_apt_update_upgrade.py 2012-08-22 18:12:32 +0000
+++ cloudinit/config/cc_apt_update_upgrade.py 2012-08-22 19:21:17 +0000
@@ -50,20 +50,25 @@
50 upgrade = util.get_cfg_option_bool(cfg, 'apt_upgrade', False)50 upgrade = util.get_cfg_option_bool(cfg, 'apt_upgrade', False)
5151
52 release = get_release()52 release = get_release()
53 mirror = find_apt_mirror(cloud, cfg)53 mirrors = find_apt_mirror_info(cloud, cfg)
54 if not mirror:54 if not mirrors or "primary" not in mirrors:
55 log.debug(("Skipping module named %s,"55 log.debug(("Skipping module named %s,"
56 " no package 'mirror' located"), name)56 " no package 'mirror' located"), name)
57 return57 return
5858
59 log.debug("Selected mirror at: %s" % mirror)59 # backwards compatibility
60 mirror = mirrors["primary"]
61 mirrors["mirror"] = mirror
62
63 log.debug("mirror info: %s" % mirrors)
6064
61 if not util.get_cfg_option_bool(cfg,65 if not util.get_cfg_option_bool(cfg,
62 'apt_preserve_sources_list', False):66 'apt_preserve_sources_list', False):
63 generate_sources_list(release, mirror, cloud, log)67 generate_sources_list(release, mirrors, cloud, log)
64 old_mir = util.get_cfg_option_str(cfg, 'apt_old_mirror',68 old_mirrors = cfg.get('apt_old_mirrors',
65 "archive.ubuntu.com/ubuntu")69 {"primary": "archive.ubuntu.com/ubuntu",
66 rename_apt_lists(old_mir, mirror)70 "security": "security.ubuntu.com/ubuntu"})
71 rename_apt_lists(old_mirrors, mirrors)
6772
68 # Set up any apt proxy73 # Set up any apt proxy
69 proxy = cfg.get("apt_proxy", None)74 proxy = cfg.get("apt_proxy", None)
@@ -81,8 +86,10 @@
8186
82 # Process 'apt_sources'87 # Process 'apt_sources'
83 if 'apt_sources' in cfg:88 if 'apt_sources' in cfg:
84 errors = add_sources(cloud, cfg['apt_sources'],89 params = mirrors
85 {'MIRROR': mirror, 'RELEASE': release})90 params['RELEASE'] = release
91 params['MIRROR'] = mirror
92 errors = add_sources(cloud, cfg['apt_sources'], params)
86 for e in errors:93 for e in errors:
87 log.warn("Source Error: %s", ':'.join(e))94 log.warn("Source Error: %s", ':'.join(e))
8895
@@ -146,15 +153,18 @@
146 return string153 return string
147154
148155
149def rename_apt_lists(omirror, new_mirror, lists_d="/var/lib/apt/lists"):156def rename_apt_lists(old_mirrors, new_mirrors, lists_d="/var/lib/apt/lists"):
150 oprefix = os.path.join(lists_d, mirror2lists_fileprefix(omirror))157 for (name, omirror) in old_mirrors.iteritems():
151 nprefix = os.path.join(lists_d, mirror2lists_fileprefix(new_mirror))158 nmirror = new_mirrors.get(name)
152 if oprefix == nprefix:159 if not nmirror:
153 return160 continue
154 olen = len(oprefix)161 oprefix = os.path.join(lists_d, mirror2lists_fileprefix(omirror))
155 for filename in glob.glob("%s_*" % oprefix):162 nprefix = os.path.join(lists_d, mirror2lists_fileprefix(nmirror))
156 # TODO(harlowja) use the cloud.paths.join...163 if oprefix == nprefix:
157 util.rename(filename, "%s%s" % (nprefix, filename[olen:]))164 continue
165 olen = len(oprefix)
166 for filename in glob.glob("%s_*" % oprefix):
167 util.rename(filename, "%s%s" % (nprefix, filename[olen:]))
158168
159169
160def get_release():170def get_release():
@@ -162,14 +172,17 @@
162 return stdout.strip()172 return stdout.strip()
163173
164174
165def generate_sources_list(codename, mirror, cloud, log):175def generate_sources_list(codename, mirrors, cloud, log):
166 template_fn = cloud.get_template_filename('sources.list')176 template_fn = cloud.get_template_filename('sources.list')
167 if template_fn:177 if not template_fn:
168 params = {'mirror': mirror, 'codename': codename}
169 out_fn = cloud.paths.join(False, '/etc/apt/sources.list')
170 templater.render_to_file(template_fn, out_fn, params)
171 else:
172 log.warn("No template found, not rendering /etc/apt/sources.list")178 log.warn("No template found, not rendering /etc/apt/sources.list")
179 return
180
181 params = {'codename': codename}
182 for k in mirrors:
183 params[k] = mirrors[k]
184 out_fn = cloud.paths.join(False, '/etc/apt/sources.list')
185 templater.render_to_file(template_fn, out_fn, params)
173186
174187
175def add_sources(cloud, srclist, template_params=None):188def add_sources(cloud, srclist, template_params=None):
@@ -231,43 +244,47 @@
231 return errorlist244 return errorlist
232245
233246
234def find_apt_mirror(cloud, cfg):247def find_apt_mirror_info(cloud, cfg):
235 """find an apt_mirror given the cloud and cfg provided."""248 """find an apt_mirror given the cloud and cfg provided."""
236249
237 mirror = None250 mirror = None
238251
239 cfg_mirror = cfg.get("apt_mirror", None)252 # this is less preferred way of specifying mirror preferred would be to
240 if cfg_mirror:253 # use the distro's search or package_mirror.
241 mirror = cfg["apt_mirror"]254 mirror = cfg.get("apt_mirror", None)
242 elif "apt_mirror_search" in cfg:255
243 mirror = util.search_for_mirror(cfg['apt_mirror_search'])256 search = cfg.get("apt_mirror_search", None)
244 else:257 if not mirror and search:
245 mirror = cloud.get_local_mirror()258 mirror = util.search_for_mirror(search)
246259
260 if (not mirror and
261 util.get_cfg_option_bool(cfg, "apt_mirror_search_dns", False)):
247 mydom = ""262 mydom = ""
248
249 doms = []263 doms = []
250264
251 if not mirror:265 # if we have a fqdn, then search its domain portion first
252 # if we have a fqdn, then search its domain portion first266 (_hostname, fqdn) = util.get_hostname_fqdn(cfg, cloud)
253 (_hostname, fqdn) = util.get_hostname_fqdn(cfg, cloud)267 mydom = ".".join(fqdn.split(".")[1:])
254 mydom = ".".join(fqdn.split(".")[1:])268 if mydom:
255 if mydom:269 doms.append(".%s" % mydom)
256 doms.append(".%s" % mydom)270
257271 doms.extend((".localdomain", "",))
258 if (not mirror and272
259 util.get_cfg_option_bool(cfg, "apt_mirror_search_dns", False)):273 mirror_list = []
260 doms.extend((".localdomain", "",))274 distro = cloud.distro.name
261275 mirrorfmt = "http://%s-mirror%s/%s" % (distro, "%s", distro)
262 mirror_list = []276 for post in doms:
263 distro = cloud.distro.name277 mirror_list.append(mirrorfmt % (post))
264 mirrorfmt = "http://%s-mirror%s/%s" % (distro, "%s", distro)278
265 for post in doms:279 mirror = util.search_for_mirror(mirror_list)
266 mirror_list.append(mirrorfmt % (post))280
267281 mirror_info = cloud.datasource.get_package_mirror_info()
268 mirror = util.search_for_mirror(mirror_list)282
269283 # this is a bit strange.
270 if not mirror:284 # if mirror is set, then one of the legacy options above set it
271 mirror = cloud.distro.get_package_mirror()285 # but they do not cover security. so we need to get that from
272286 # get_package_mirror_info
273 return mirror287 if mirror:
288 mirror_info.update({'primary': mirror})
289
290 return mirror_info
274291
=== modified file 'cloudinit/distros/__init__.py'
--- cloudinit/distros/__init__.py 2012-08-22 18:12:32 +0000
+++ cloudinit/distros/__init__.py 2012-08-22 19:21:17 +0000
@@ -23,6 +23,8 @@
23from StringIO import StringIO23from StringIO import StringIO
2424
25import abc25import abc
26import os
27import re
2628
27from cloudinit import importer29from cloudinit import importer
28from cloudinit import log as logging30from cloudinit import log as logging
@@ -75,8 +77,26 @@
75 def update_package_sources(self):77 def update_package_sources(self):
76 raise NotImplementedError()78 raise NotImplementedError()
7779
78 def get_package_mirror(self):80 def get_primary_arch(self):
79 return self.get_option('package_mirror')81 arch = os.uname[4]
82 if arch in ("i386", "i486", "i586", "i686"):
83 return "i386"
84 return arch
85
86 def _get_arch_package_mirror_info(self, arch=None):
87 mirror_info = self.get_option("package_mirrors", None)
88 if arch == None:
89 arch = self.get_primary_arch()
90 return _get_arch_package_mirror_info(mirror_info, arch)
91
92 def get_package_mirror_info(self, arch=None,
93 availability_zone=None):
94 # this resolves the package_mirrors config option
95 # down to a single dict of {mirror_name: mirror_url}
96 arch_info = self._get_arch_package_mirror_info(arch)
97
98 return _get_package_mirror_info(availability_zone=availability_zone,
99 mirror_info=arch_info)
80100
81 def apply_network(self, settings, bring_up=True):101 def apply_network(self, settings, bring_up=True):
82 # Write it out102 # Write it out
@@ -151,6 +171,55 @@
151 return False171 return False
152172
153173
174def _get_package_mirror_info(mirror_info, availability_zone=None,
175 mirror_filter=util.search_for_mirror):
176 # given a arch specific 'mirror_info' entry (from package_mirrors)
177 # search through the 'search' entries, and fallback appropriately
178 # return a dict with only {name: mirror} entries.
179
180 ec2_az_re = ("^[a-z][a-z]-(%s)-[1-9][0-9]*[a-z]$" %
181 "north|northeast|east|southeast|south|southwest|west|northwest")
182
183 subst = {}
184 if availability_zone:
185 subst['availability_zone'] = availability_zone
186
187 if availability_zone and re.match(ec2_az_re, availability_zone):
188 subst['ec2_region'] = "%s" % availability_zone[0:-1]
189
190 results = {}
191 for (name, mirror) in mirror_info.get('failsafe', {}).iteritems():
192 results[name] = mirror
193
194 for (name, searchlist) in mirror_info.get('search', {}).iteritems():
195 mirrors = []
196 for tmpl in searchlist:
197 try:
198 mirrors.append(tmpl % subst)
199 except KeyError:
200 pass
201
202 found = mirror_filter(mirrors)
203 if found:
204 results[name] = found
205
206 LOG.debug("filtered distro mirror info: %s" % results)
207
208 return results
209
210
211def _get_arch_package_mirror_info(package_mirrors, arch):
212 # pull out the specific arch from a 'package_mirrors' config option
213 default = None
214 for item in package_mirrors:
215 arches = item.get("arches")
216 if arch in arches:
217 return item
218 if "default" in arches:
219 default = item
220 return default
221
222
154def fetch(name):223def fetch(name):
155 locs = importer.find_module(name,224 locs = importer.find_module(name,
156 ['', __name__],225 ['', __name__],
157226
=== modified file 'cloudinit/distros/debian.py'
--- cloudinit/distros/debian.py 2012-06-30 00:06:32 +0000
+++ cloudinit/distros/debian.py 2012-08-22 19:21:17 +0000
@@ -147,3 +147,7 @@
147 def update_package_sources(self):147 def update_package_sources(self):
148 self._runner.run("update-sources", self.package_command,148 self._runner.run("update-sources", self.package_command,
149 ["update"], freq=PER_INSTANCE)149 ["update"], freq=PER_INSTANCE)
150
151 def get_primary_arch(self):
152 (arch, _err) = util.subp(['dpkg', '--print-architecture'])
153 return str(arch).strip()
150154
=== modified file 'cloudinit/sources/DataSourceCloudStack.py'
--- cloudinit/sources/DataSourceCloudStack.py 2012-08-22 18:12:32 +0000
+++ cloudinit/sources/DataSourceCloudStack.py 2012-08-22 19:21:17 +0000
@@ -131,7 +131,8 @@
131 def get_instance_id(self):131 def get_instance_id(self):
132 return self.metadata['instance-id']132 return self.metadata['instance-id']
133133
134 def get_availability_zone(self):134 @property
135 def availability_zone(self):
135 return self.metadata['availability-zone']136 return self.metadata['availability-zone']
136137
137138
138139
=== modified file 'cloudinit/sources/DataSourceEc2.py'
--- cloudinit/sources/DataSourceEc2.py 2012-07-16 20:16:27 +0000
+++ cloudinit/sources/DataSourceEc2.py 2012-08-22 19:21:17 +0000
@@ -83,40 +83,6 @@
83 def get_availability_zone(self):83 def get_availability_zone(self):
84 return self.metadata['placement']['availability-zone']84 return self.metadata['placement']['availability-zone']
8585
86 def get_local_mirror(self):
87 return self.get_mirror_from_availability_zone()
88
89 def get_mirror_from_availability_zone(self, availability_zone=None):
90 # Return type None indicates there is no cloud specific mirror
91 # Availability is like 'us-west-1b' or 'eu-west-1a'
92 if availability_zone is None:
93 availability_zone = self.get_availability_zone()
94
95 if self.is_vpc():
96 return None
97
98 if not availability_zone:
99 return None
100
101 mirror_tpl = self.distro.get_option('package_mirror_ec2_template',
102 None)
103
104 if mirror_tpl is None:
105 return None
106
107 # in EC2, the 'region' is 'us-east-1' if 'zone' is 'us-east-1a'
108 tpl_params = {
109 'zone': availability_zone.strip(),
110 'region': availability_zone[:-1]
111 }
112 mirror_url = mirror_tpl % (tpl_params)
113
114 found = util.search_for_mirror([mirror_url])
115 if found is not None:
116 return mirror_url
117
118 return None
119
120 def _get_url_settings(self):86 def _get_url_settings(self):
121 mcfg = self.ds_cfg87 mcfg = self.ds_cfg
122 if not mcfg:88 if not mcfg:
@@ -255,6 +221,12 @@
255 return True221 return True
256 return False222 return False
257223
224 @property
225 def availability_zone(self):
226 try:
227 return self.metadata['placement']['availability-zone']
228 except KeyError:
229 return None
258230
259# Used to match classes to dependencies231# Used to match classes to dependencies
260datasources = [232datasources = [
261233
=== modified file 'cloudinit/sources/__init__.py'
--- cloudinit/sources/__init__.py 2012-08-20 05:28:14 +0000
+++ cloudinit/sources/__init__.py 2012-08-22 19:21:17 +0000
@@ -117,9 +117,9 @@
117 def get_locale(self):117 def get_locale(self):
118 return 'en_US.UTF-8'118 return 'en_US.UTF-8'
119119
120 def get_local_mirror(self):120 @property
121 # ??121 def availability_zone(self):
122 return None122 return self.metadata.get('availability-zone')
123123
124 def get_instance_id(self):124 def get_instance_id(self):
125 if not self.metadata or 'instance-id' not in self.metadata:125 if not self.metadata or 'instance-id' not in self.metadata:
@@ -166,6 +166,10 @@
166 else:166 else:
167 return hostname167 return hostname
168168
169 def get_package_mirror_info(self):
170 return self.distro.get_package_mirror_info(
171 availability_zone=self.availability_zone)
172
169173
170def find_source(sys_cfg, distro, paths, ds_deps, cfg_list, pkg_list):174def find_source(sys_cfg, distro, paths, ds_deps, cfg_list, pkg_list):
171 ds_list = list_sources(cfg_list, ds_deps, pkg_list)175 ds_list = list_sources(cfg_list, ds_deps, pkg_list)
172176
=== modified file 'config/cloud.cfg'
--- config/cloud.cfg 2012-08-20 21:11:46 +0000
+++ config/cloud.cfg 2012-08-22 19:21:17 +0000
@@ -74,6 +74,18 @@
74 cloud_dir: /var/lib/cloud/74 cloud_dir: /var/lib/cloud/
75 templates_dir: /etc/cloud/templates/75 templates_dir: /etc/cloud/templates/
76 upstart_dir: /etc/init/76 upstart_dir: /etc/init/
77 package_mirror: http://archive.ubuntu.com/ubuntu77 package_mirrors:
78 package_mirror_ec2_template: http://%(region)s.ec2.archive.ubuntu.com/ubuntu/78 - arches: [i386, amd64]
79 failsafe:
80 primary: http://archive.ubuntu.com/ubuntu
81 security: http://security.ubuntu.com/ubuntu
82 search:
83 primary:
84 - http://%(ec2_region)s.ec2.archive.ubuntu.com/ubuntu/
85 - http://%(availability_zone)s.clouds.archive.ubuntu.com/ubuntu/
86 security: []
87 - arches: [armhf, armel, default]
88 failsafe:
89 primary: http://ports.ubuntu.com/ubuntu
90 security: http://ports.ubuntu.com/ubuntu
79 ssh_svcname: ssh91 ssh_svcname: ssh
8092
=== modified file 'templates/sources.list.tmpl'
--- templates/sources.list.tmpl 2012-07-09 20:41:45 +0000
+++ templates/sources.list.tmpl 2012-08-22 19:21:17 +0000
@@ -52,9 +52,9 @@
52# deb http://archive.canonical.com/ubuntu $codename partner52# deb http://archive.canonical.com/ubuntu $codename partner
53# deb-src http://archive.canonical.com/ubuntu $codename partner53# deb-src http://archive.canonical.com/ubuntu $codename partner
5454
55deb http://security.ubuntu.com/ubuntu $codename-security main55deb $security $codename-security main
56deb-src http://security.ubuntu.com/ubuntu $codename-security main56deb-src $security $codename-security main
57deb http://security.ubuntu.com/ubuntu $codename-security universe57deb $security $codename-security universe
58deb-src http://security.ubuntu.com/ubuntu $codename-security universe58deb-src $security $codename-security universe
59# deb http://security.ubuntu.com/ubuntu $codename-security multiverse59# deb $security $codename-security multiverse
60# deb-src http://security.ubuntu.com/ubuntu $codename-security multiverse60# deb-src $security $codename-security multiverse
6161
=== added directory 'tests/unittests/test_distros'
=== added file 'tests/unittests/test_distros/test_generic.py'
--- tests/unittests/test_distros/test_generic.py 1970-01-01 00:00:00 +0000
+++ tests/unittests/test_distros/test_generic.py 2012-08-22 19:21:17 +0000
@@ -0,0 +1,121 @@
1from mocker import MockerTestCase
2
3from cloudinit import distros
4
5unknown_arch_info = {
6 'arches': ['default'],
7 'failsafe': {'primary': 'http://fs-primary-default',
8 'security': 'http://fs-security-default'}
9}
10
11package_mirrors = [
12 {'arches': ['i386', 'amd64'],
13 'failsafe': {'primary': 'http://fs-primary-intel',
14 'security': 'http://fs-security-intel'},
15 'search': {
16 'primary': ['http://%(ec2_region)s.ec2/',
17 'http://%(availability_zone)s.clouds/'],
18 'security': ['http://security-mirror1-intel',
19 'http://security-mirror2-intel']}},
20 {'arches': ['armhf', 'armel'],
21 'failsafe': {'primary': 'http://fs-primary-arm',
22 'security': 'http://fs-security-arm'}},
23 unknown_arch_info
24]
25
26gpmi = distros._get_package_mirror_info # pylint: disable=W0212
27gapmi = distros._get_arch_package_mirror_info # pylint: disable=W0212
28
29
30class TestGenericDistro(MockerTestCase):
31
32 def return_first(self, mlist):
33 if not mlist:
34 return None
35 return mlist[0]
36
37 def return_second(self, mlist):
38 if not mlist:
39 return None
40 return mlist[1]
41
42 def return_none(self, _mlist):
43 return None
44
45 def return_last(self, mlist):
46 if not mlist:
47 return None
48 return(mlist[-1])
49
50 def setUp(self):
51 super(TestGenericDistro, self).setUp()
52 # Make a temp directoy for tests to use.
53 self.tmp = self.makeDir()
54
55 def test_arch_package_mirror_info_unknown(self):
56 """for an unknown arch, we should get back that with arch 'default'."""
57 arch_mirrors = gapmi(package_mirrors, arch="unknown")
58 self.assertEqual(unknown_arch_info, arch_mirrors)
59
60 def test_arch_package_mirror_info_known(self):
61 arch_mirrors = gapmi(package_mirrors, arch="amd64")
62 self.assertEqual(package_mirrors[0], arch_mirrors)
63
64 def test_get_package_mirror_info_az_ec2(self):
65 arch_mirrors = gapmi(package_mirrors, arch="amd64")
66
67 results = gpmi(arch_mirrors, availability_zone="us-east-1a",
68 mirror_filter=self.return_first)
69 self.assertEqual(results,
70 {'primary': 'http://us-east-1.ec2/',
71 'security': 'http://security-mirror1-intel'})
72
73 results = gpmi(arch_mirrors, availability_zone="us-east-1a",
74 mirror_filter=self.return_second)
75 self.assertEqual(results,
76 {'primary': 'http://us-east-1a.clouds/',
77 'security': 'http://security-mirror2-intel'})
78
79 results = gpmi(arch_mirrors, availability_zone="us-east-1a",
80 mirror_filter=self.return_none)
81 self.assertEqual(results, package_mirrors[0]['failsafe'])
82
83 def test_get_package_mirror_info_az_non_ec2(self):
84 arch_mirrors = gapmi(package_mirrors, arch="amd64")
85
86 results = gpmi(arch_mirrors, availability_zone="nova.cloudvendor",
87 mirror_filter=self.return_first)
88 self.assertEqual(results,
89 {'primary': 'http://nova.cloudvendor.clouds/',
90 'security': 'http://security-mirror1-intel'})
91
92 results = gpmi(arch_mirrors, availability_zone="nova.cloudvendor",
93 mirror_filter=self.return_last)
94 self.assertEqual(results,
95 {'primary': 'http://nova.cloudvendor.clouds/',
96 'security': 'http://security-mirror2-intel'})
97
98 def test_get_package_mirror_info_none(self):
99 arch_mirrors = gapmi(package_mirrors, arch="amd64")
100
101 # because both search entries here replacement based on
102 # availability-zone, the filter will be called with an empty list and
103 # failsafe should be taken.
104 results = gpmi(arch_mirrors, availability_zone=None,
105 mirror_filter=self.return_first)
106 self.assertEqual(results,
107 {'primary': 'http://fs-primary-intel',
108 'security': 'http://security-mirror1-intel'})
109
110 results = gpmi(arch_mirrors, availability_zone=None,
111 mirror_filter=self.return_last)
112 self.assertEqual(results,
113 {'primary': 'http://fs-primary-intel',
114 'security': 'http://security-mirror2-intel'})
115
116
117#def _get_package_mirror_info(mirror_info, availability_zone=None,
118# mirror_filter=util.search_for_mirror):
119
120
121# vi: ts=4 expandtab