Merge lp:~gmb/maas-test/fix-up-proxy-config-dir-for-tests into lp:maas-test

Proposed by Graham Binns
Status: Merged
Merged at revision: 78
Proposed branch: lp:~gmb/maas-test/fix-up-proxy-config-dir-for-tests
Merge into: lp:maas-test
Diff against target: 321 lines (+50/-42)
6 files modified
maastest/cases.py (+2/-1)
maastest/kvmfixture.py (+9/-2)
maastest/proxyfixture.py (+10/-9)
maastest/tests/test_kvmfixture.py (+3/-8)
maastest/tests/test_proxyfixture.py (+24/-22)
packages.txt (+2/-0)
To merge this branch: bzr merge lp:~gmb/maas-test/fix-up-proxy-config-dir-for-tests
Reviewer Review Type Date Requested Status
Gavin Panella (community) Approve
Review via email: mp+196918@code.launchpad.net

Description of the change

This branch makes the config_dir of LocalProxyFixture, and the ssh_key_dir of KVMFixture configurable. It also adds a command-line option, --config-dir, which sets both of the above (there's an argument for having ssh_key_dir separate, I suppose; I'm happy to do that if it's a better fit).

To post a comment you must log in.
77. By Graham Binns

Fixed a typo.

78. By Graham Binns

Removed TODO that was TODONE.

Revision history for this message
Gavin Panella (allenap) wrote :

Looks good, but I'm concerned about punting everything to the user.

[1]

+    # maas-test config
+    parser.add_argument(
+        '--config-dir', type=text_type,
+        default="~/.maas-test",
+        help="The directory in which to store maas-test config and cache "
+        "files. Defaults to %(default)s")

I think we should use the xdg stuff I mentioned to rvb yesterday, and
not have yet another configuration option. Or is there a compelling
use-case for allowing this? This feels like getting the user to choose
because we can't make a decision.

review: Needs Information
Revision history for this message
Julian Edwards (julian-edwards) wrote :

On Wednesday 27 Nov 2013 16:28:29 you wrote:
> Review: Needs Information
>
> Looks good, but I'm concerned about punting everything to the user.
>
>
> [1]
>
> + # maas-test config
> + parser.add_argument(
> + '--config-dir', type=text_type,
> + default="~/.maas-test",
> + help="The directory in which to store maas-test config and cache "
> + "files. Defaults to %(default)s")
>
> I think we should use the xdg stuff I mentioned to rvb yesterday, and
> not have yet another configuration option. Or is there a compelling
> use-case for allowing this? This feels like getting the user to choose
> because we can't make a decision.

+1 to removing config where sane and and possible.

Revision history for this message
Graham Binns (gmb) wrote :

On 27 November 2013 22:51, Julian Edwards <email address hidden> wrote:
>> I think we should use the xdg stuff I mentioned to rvb yesterday, and
>> not have yet another configuration option. Or is there a compelling
>> use-case for allowing this? This feels like getting the user to choose
>> because we can't make a decision.

I saw that whizz past in a merge proposal and promptly forgot about
it. That makes perfect sense to me.

Revision history for this message
Julian Edwards (julian-edwards) wrote :

On Thursday 28 Nov 2013 07:21:34 you wrote:
> On 27 November 2013 22:51, Julian Edwards <email address hidden>
wrote:
> >> I think we should use the xdg stuff I mentioned to rvb yesterday, and
> >> not have yet another configuration option. Or is there a compelling
> >> use-case for allowing this? This feels like getting the user to choose
> >> because we can't make a decision.
>
> I saw that whizz past in a merge proposal and promptly forgot about
> it. That makes perfect sense to me.

For the record, I didn't say that, Gavin did :)

Revision history for this message
Graham Binns (gmb) wrote :

On 28 November 2013 07:24, Julian Edwards <email address hidden> wrote:
> For the record, I didn't say that, Gavin did :)

Yeah, trimming fail.

79. By Graham Binns

Removed config-dir option stuff; we'll use xdg instead.

80. By Graham Binns

XDG conversion.

81. By Graham Binns

Merged trunk.

82. By Graham Binns

Added dependencies.

83. By Graham Binns

Trimmed some lint.

84. By Graham Binns

Removed a TODO.

Revision history for this message
Gavin Panella (allenap) wrote :

Tip top. One more small thing:

[2]

-            os.path.expanduser('~'), '.maas-test', 'vm_ssh_id_rsa')
+            BaseDirectory.save_config_path('.maas-test'), 'vm_ssh_id_rsa')

No need for the leading . on .maas-test.

This appears elsewhere too.

Also, fwiw, any number of components can passed to save_config_path(),
for example:

            BaseDirectory.save_config_path('maas-test', 'vm-ssh')

would create a directory at $XDG_CONFIG_HOME/maas-test/vm-ssh.

review: Approve
Revision history for this message
Graham Binns (gmb) wrote :

On 28 November 2013 10:03, Gavin Panella <email address hidden> wrote:
> Review: Approve
>
> Tip top. One more small thing:
>
>
> [2]
>
> - os.path.expanduser('~'), '.maas-test', 'vm_ssh_id_rsa')
> + BaseDirectory.save_config_path('.maas-test'), 'vm_ssh_id_rsa')
>
> No need for the leading . on .maas-test.
>
> This appears elsewhere too.

On it.

> Also, fwiw, any number of components can passed to save_config_path(),
> for example:
>
> BaseDirectory.save_config_path('maas-test', 'vm-ssh')
>
> would create a directory at $XDG_CONFIG_HOME/maas-test/vm-ssh.

Ah, but we don't want to create a directory there (I've improved the
code so that's more obvious). vm_ssh_id_rsa is the name of the
keyfile, so we need to make sure the directory is there and then
create the path to the file from it. As I said, I've improved the
clarity.

85. By Graham Binns

Fixed an assortment of wonderful things.

86. By Graham Binns

Removed unused imports.

Revision history for this message
Gavin Panella (allenap) wrote :

> Ah, but we don't want to create a directory there (I've improved the
> code so that's more obvious).

I did understand that - your code was clear - I was just pointing it out
for future reference.

Revision history for this message
Graham Binns (gmb) wrote :

On 28 November 2013 14:25, Gavin Panella <email address hidden> wrote:
> I did understand that - your code was clear - I was just pointing it out
> for future reference.

Okay, cool. Thanks for the clarification.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'maastest/cases.py'
--- maastest/cases.py 2013-11-27 17:22:21 +0000
+++ maastest/cases.py 2013-11-28 14:16:14 +0000
@@ -129,11 +129,12 @@
129 "URL: http://%s/MAAS/\n"129 "URL: http://%s/MAAS/\n"
130 "Username: %s\n"130 "Username: %s\n"
131 "Password: %s\n"131 "Password: %s\n"
132 "SSH login: ssh -i ~/.maas-test/vm_ssh_id_rsa %s\n"132 "SSH login: ssh -i %s %s\n"
133 % (133 % (
134 self.machine.ip_address(),134 self.machine.ip_address(),
135 self.maas.admin_user,135 self.maas.admin_user,
136 self.maas.admin_password,136 self.maas.admin_password,
137 self.machine.ssh_private_key_file,
137 self.machine.identity(),138 self.machine.identity(),
138 ))139 ))
139140
140141
=== modified file 'maastest/kvmfixture.py'
--- maastest/kvmfixture.py 2013-11-27 13:36:27 +0000
+++ maastest/kvmfixture.py 2013-11-28 14:16:14 +0000
@@ -34,6 +34,7 @@
34import netaddr34import netaddr
35from six import text_type35from six import text_type
36from testtools.content import text_content36from testtools.content import text_content
37from xdg import BaseDirectory
3738
38# Maximum wait for the virtual machine to complete its cloud-init39# Maximum wait for the virtual machine to complete its cloud-init
39# initialization. It can take quite a while, because it performs an40# initialization. It can take quite a while, because it performs an
@@ -67,7 +68,7 @@
67 """68 """
68 def __init__(self, series, architecture, proxy_url,69 def __init__(self, series, architecture, proxy_url,
69 direct_interface=None, direct_network=None, name=None,70 direct_interface=None, direct_network=None, name=None,
70 archive=None):71 archive=None, ssh_key_dir=None):
71 """Initialise a KVM-based Virtual Machine fixture.72 """Initialise a KVM-based Virtual Machine fixture.
7273
73 The VM's network is configured like this:74 The VM's network is configured like this:
@@ -103,6 +104,10 @@
103 :param archive: An optional repository name. If provided, the104 :param archive: An optional repository name. If provided, the
104 repository will be added onto the VM.105 repository will be added onto the VM.
105 :type archive: string106 :type archive: string
107 :param ssh_key_dir: The directory in which to store the SSH keys
108 for connecting to this KVM instance. If None, this defaults
109 to the default XDG config directory.
110 :type ssh_key_dir: string.
106 """111 """
107 super(KVMFixture, self).__init__()112 super(KVMFixture, self).__init__()
108 self.command_count = itertools.count(1)113 self.command_count = itertools.count(1)
@@ -124,8 +129,10 @@
124 if name is None:129 if name is None:
125 name = text_type(uuid1())130 name = text_type(uuid1())
126 self.name = name131 self.name = name
132 if ssh_key_dir is None:
133 ssh_key_dir = BaseDirectory.save_config_path('maas-test')
127 self.ssh_private_key_file = os.path.join(134 self.ssh_private_key_file = os.path.join(
128 os.path.expanduser('~'), '.maas-test', 'vm_ssh_id_rsa')135 ssh_key_dir, 'vm_ssh_id_rsa')
129 self.running = False136 self.running = False
130137
131 def setUp(self):138 def setUp(self):
132139
=== modified file 'maastest/proxyfixture.py'
--- maastest/proxyfixture.py 2013-11-27 13:36:27 +0000
+++ maastest/proxyfixture.py 2013-11-28 14:16:14 +0000
@@ -23,10 +23,9 @@
23from maastest import utils23from maastest import utils
24from netaddr import IPNetwork24from netaddr import IPNetwork
25import netifaces25import netifaces
26from xdg import BaseDirectory
2627
27# TODO: '.maas-test' shouln't be harcoded like that, it should28DISK_CACHE_ROOT = '%(config_dir)s/proxy_cache/'
28# be a parameter passed to LocalProxyFixture().
29DISK_CACHE_ROOT = '~/.maas-test/proxy_cache/'
3029
31PROXY_CONFIG_ITEMS = {30PROXY_CONFIG_ITEMS = {
32 'daemonise': 'true',31 'daemonise': 'true',
@@ -59,7 +58,7 @@
5958
60 #TODO: port should be determined at runtime from the set of59 #TODO: port should be determined at runtime from the set of
61 # available ports rather than being an arbitrary one as it is here.60 # available ports rather than being an arbitrary one as it is here.
62 def __init__(self, port=42676):61 def __init__(self, config_dir=None, port=42676):
63 """Create a `LocalProxyFixture` object.62 """Create a `LocalProxyFixture` object.
6463
65 :param url: The URL of the proxy to use. If None, LocalProxyFixture64 :param url: The URL of the proxy to use. If None, LocalProxyFixture
@@ -68,13 +67,15 @@
68 :param port: The port on which to start a local caching proxy.67 :param port: The port on which to start a local caching proxy.
69 If URL is specified, this parameter is ignored.68 If URL is specified, this parameter is ignored.
70 :type port: int69 :type port: int
70 :param config_dir: The directory in which to put the proxy's
71 config, pid file and cache.
72 :type config_dir: string
71 """73 """
72 super(LocalProxyFixture, self).__init__()74 super(LocalProxyFixture, self).__init__()
73 self.port = port75 self.port = port
74 # TODO: '.maas-test' shouln't be harcoded like that, it should76 if config_dir is None:
75 # be a parameter passed to LocalProxyFixture().77 config_dir = BaseDirectory.save_config_path('maas-test')
76 self.config_dir = os.path.join(78 self.config_dir = config_dir
77 os.path.expanduser('~'), '.maas-test')
78 self.pid_file = os.path.join(self.config_dir, 'proxy.pid')79 self.pid_file = os.path.join(self.config_dir, 'proxy.pid')
79 self._network_address = None80 self._network_address = None
8081
@@ -132,7 +133,7 @@
132 logging.info("Done starting proxy.")133 logging.info("Done starting proxy.")
133134
134 def create_cache_root(self):135 def create_cache_root(self):
135 cache_root = os.path.expanduser(DISK_CACHE_ROOT)136 cache_root = DISK_CACHE_ROOT % {'config_dir': self.config_dir}
136 try:137 try:
137 os.makedirs(cache_root)138 os.makedirs(cache_root)
138 except OSError as error:139 except OSError as error:
139140
=== modified file 'maastest/tests/test_kvmfixture.py'
--- maastest/tests/test_kvmfixture.py 2013-11-27 17:44:58 +0000
+++ maastest/tests/test_kvmfixture.py 2013-11-28 14:16:14 +0000
@@ -13,8 +13,6 @@
13__all__ = []13__all__ = []
1414
15import itertools15import itertools
16import os
17import os.path
18import random16import random
19from random import randint17from random import randint
20import textwrap18import textwrap
@@ -49,9 +47,7 @@
49 # KVMFixture.generate_ssh_key() generates an ssh key in ~/.maas-test,47 # KVMFixture.generate_ssh_key() generates an ssh key in ~/.maas-test,
50 # creating that directory if necessary. Set up a fake home directory48 # creating that directory if necessary. Set up a fake home directory
51 # so it can do what it needs to.49 # so it can do what it needs to.
52 home_dir = self.useFixture(fixtures.TempDir()).path50 self.home_dir = self.useFixture(fixtures.TempDir()).path
53 self.patch(
54 os.path, 'expanduser', mock.MagicMock(return_value=home_dir))
5551
56 def patch_run_command(self, return_value=0, stdout=b'', stderr=b''):52 def patch_run_command(self, return_value=0, stdout=b'', stderr=b''):
57 """Patch out `kvmfixture` calls to `run_command`.53 """Patch out `kvmfixture` calls to `run_command`.
@@ -84,7 +80,7 @@
84 series, architecture, name=name,80 series, architecture, name=name,
85 direct_interface=direct_interface,81 direct_interface=direct_interface,
86 direct_network=direct_network, archive=archive,82 direct_network=direct_network, archive=archive,
87 proxy_url=proxy_url)83 proxy_url=proxy_url, ssh_key_dir=self.home_dir)
88 # Hack to get fixture.addDetail to work without actually calling84 # Hack to get fixture.addDetail to work without actually calling
89 # fixture.setUp().85 # fixture.setUp().
90 fixture._details = {}86 fixture._details = {}
@@ -288,7 +284,6 @@
288 self.logger.output.strip().split("\n"))284 self.logger.output.strip().split("\n"))
289285
290 def test_generate_ssh_key_sets_up_temporary_key_pair(self):286 def test_generate_ssh_key_sets_up_temporary_key_pair(self):
291 home_dir = os.path.expanduser('~')
292 fixture = self.make_KVMFixture()287 fixture = self.make_KVMFixture()
293 fixtures.Fixture.setUp(fixture)288 fixtures.Fixture.setUp(fixture)
294289
@@ -297,7 +292,7 @@
297 self.assertThat(fixture.ssh_private_key_file, FileExists())292 self.assertThat(fixture.ssh_private_key_file, FileExists())
298 self.assertThat(fixture.get_ssh_public_key_file(), FileExists())293 self.assertThat(fixture.get_ssh_public_key_file(), FileExists())
299 self.assertThat(294 self.assertThat(
300 fixture.ssh_private_key_file, StartsWith(home_dir + '/'))295 fixture.ssh_private_key_file, StartsWith(self.home_dir + '/'))
301296
302 self.assertThat(297 self.assertThat(
303 fixture.ssh_private_key_file,298 fixture.ssh_private_key_file,
304299
=== modified file 'maastest/tests/test_proxyfixture.py'
--- maastest/tests/test_proxyfixture.py 2013-11-26 22:51:09 +0000
+++ maastest/tests/test_proxyfixture.py 2013-11-28 14:16:14 +0000
@@ -39,24 +39,23 @@
39 'netmask': '255.255.255.0',39 'netmask': '255.255.255.0',
40 }]}40 }]}
41 self.patch(netifaces, 'ifaddresses', mock_ifaddresses)41 self.patch(netifaces, 'ifaddresses', mock_ifaddresses)
42 self.temp_dir = self.useFixture(TempDir()).path
4243
43 def get_random_port_number(self):44 def get_random_port_number(self):
44 return random.randint(1, 65535)45 return random.randint(1, 65535)
4546
46 def test_init_sets_properties(self):47 def test_init_sets_properties(self):
47 port = self.get_random_port_number()48 port = self.get_random_port_number()
48 proxy_fixture = LocalProxyFixture(port=port)49 proxy_fixture = LocalProxyFixture(port=port, config_dir=self.temp_dir)
49 expected_config_path = os.path.join(
50 os.path.expanduser('~'), '.maas-test')
51 self.assertEqual(port, proxy_fixture.port)50 self.assertEqual(port, proxy_fixture.port)
52 self.assertEqual(expected_config_path, proxy_fixture.config_dir)51 self.assertEqual(self.temp_dir, proxy_fixture.config_dir)
53 self.assertEqual(52 self.assertEqual(
54 os.path.join(expected_config_path, 'proxy.pid'),53 os.path.join(self.temp_dir, 'proxy.pid'),
55 proxy_fixture.pid_file)54 proxy_fixture.pid_file)
5655
57 def test_get_url_returns_proxy_url(self):56 def test_get_url_returns_proxy_url(self):
58 port = self.get_random_port_number()57 port = self.get_random_port_number()
59 proxy_fixture = LocalProxyFixture(port=port)58 proxy_fixture = LocalProxyFixture(config_dir=self.temp_dir, port=port)
60 self.assertEqual(59 self.assertEqual(
61 "http://192.168.0.1:%s" % port,60 "http://192.168.0.1:%s" % port,
62 proxy_fixture.get_url())61 proxy_fixture.get_url())
@@ -65,8 +64,9 @@
65 self.patch(LocalProxyFixture, 'create_cache_root', mock.MagicMock())64 self.patch(LocalProxyFixture, 'create_cache_root', mock.MagicMock())
66 self.patch(LocalProxyFixture, 'start_proxy', mock.MagicMock())65 self.patch(LocalProxyFixture, 'start_proxy', mock.MagicMock())
6766
68 random_port = self.get_random_port_number()67 port = self.get_random_port_number()
69 with LocalProxyFixture(port=random_port) as fixture:68 config_dir = self.temp_dir
69 with LocalProxyFixture(config_dir=config_dir, port=port) as fixture:
70 pass70 pass
7171
72 self.assertEqual(72 self.assertEqual(
@@ -79,7 +79,8 @@
79 def test_start_proxy_starts_proxy(self):79 def test_start_proxy_starts_proxy(self):
80 mock_run_command = mock.MagicMock()80 mock_run_command = mock.MagicMock()
81 self.patch(utils, 'run_command', mock_run_command)81 self.patch(utils, 'run_command', mock_run_command)
82 proxy_fixture = LocalProxyFixture(port=self.get_random_port_number())82 proxy_fixture = LocalProxyFixture(
83 config_dir=self.temp_dir, port=self.get_random_port_number())
8384
84 proxy_fixture.start_proxy()85 proxy_fixture.start_proxy()
8586
@@ -90,26 +91,27 @@
90 mock_run_command.mock_calls[-1])91 mock_run_command.mock_calls[-1])
9192
92 def test_create_cache_root_creates_directory(self):93 def test_create_cache_root_creates_directory(self):
93 temp_dir = self.useFixture(TempDir()).path94 proxy_fixture = LocalProxyFixture(
94 test_cache_path = temp_dir + "path"95 config_dir=self.temp_dir, port=self.get_random_port_number())
95 self.patch(proxyfixture, 'DISK_CACHE_ROOT', test_cache_path)
96 proxy_fixture = LocalProxyFixture(port=self.get_random_port_number())
9796
98 proxy_fixture.create_cache_root()97 proxy_fixture.create_cache_root()
9998 expected_cache_path = proxyfixture.DISK_CACHE_ROOT % {
100 self.assertThat(test_cache_path, DirExists())99 'config_dir': self.temp_dir}
100 self.assertThat(expected_cache_path, DirExists())
101101
102 def test_create_cache_root_ignores_existing_directory(self):102 def test_create_cache_root_ignores_existing_directory(self):
103 temp_dir = self.useFixture(TempDir()).path103 temp_dir = self.useFixture(TempDir()).path
104 self.patch(proxyfixture, 'DISK_CACHE_ROOT', temp_dir)104 self.patch(proxyfixture, 'DISK_CACHE_ROOT', temp_dir)
105 proxy_fixture = LocalProxyFixture(port=self.get_random_port_number())105 proxy_fixture = LocalProxyFixture(
106 config_dir=self.temp_dir, port=self.get_random_port_number())
106107
107 proxy_fixture.create_cache_root()108 proxy_fixture.create_cache_root()
108109
109 self.assertThat(temp_dir, DirExists())110 self.assertThat(temp_dir, DirExists())
110111
111 def test_get_network_address(self):112 def test_get_network_address(self):
112 proxy_fixture = LocalProxyFixture(port=self.get_random_port_number())113 proxy_fixture = LocalProxyFixture(
114 config_dir=self.temp_dir, port=self.get_random_port_number())
113 proxy_adddress = proxy_fixture._get_network_address()115 proxy_adddress = proxy_fixture._get_network_address()
114 self.assertEqual('192.168.0.1', proxy_adddress.ip.format())116 self.assertEqual('192.168.0.1', proxy_adddress.ip.format())
115 self.assertEqual(24, proxy_adddress.prefixlen)117 self.assertEqual(24, proxy_adddress.prefixlen)
@@ -120,7 +122,7 @@
120 mock_read_file = mock.MagicMock()122 mock_read_file = mock.MagicMock()
121 mock_read_file.return_value = bytes(self.getUniqueInteger())123 mock_read_file.return_value = bytes(self.getUniqueInteger())
122 self.patch(utils, 'read_file', mock_read_file)124 self.patch(utils, 'read_file', mock_read_file)
123 proxy_fixture = LocalProxyFixture()125 proxy_fixture = LocalProxyFixture(config_dir=self.temp_dir)
124 proxy_fixture.kill_running_proxy()126 proxy_fixture.kill_running_proxy()
125 self.assertEqual(127 self.assertEqual(
126 mock.call(['kill', mock_read_file.return_value], check_call=True),128 mock.call(['kill', mock_read_file.return_value], check_call=True),
@@ -132,7 +134,7 @@
132 mock_read_file = mock.MagicMock()134 mock_read_file = mock.MagicMock()
133 mock_read_file.side_effect = Exception(self.getUniqueString())135 mock_read_file.side_effect = Exception(self.getUniqueString())
134 self.patch(utils, 'read_file', mock_read_file)136 self.patch(utils, 'read_file', mock_read_file)
135 proxy_fixture = LocalProxyFixture()137 proxy_fixture = LocalProxyFixture(config_dir=self.temp_dir)
136 proxy_fixture.kill_running_proxy()138 proxy_fixture.kill_running_proxy()
137 mock_log_error.assert_has_calls([139 mock_log_error.assert_has_calls([
138 mock.call("Unable to kill proxy:"),140 mock.call("Unable to kill proxy:"),
@@ -147,7 +149,7 @@
147 mock_read_file = mock.MagicMock()149 mock_read_file = mock.MagicMock()
148 mock_read_file.return_value = bytes(self.getUniqueInteger())150 mock_read_file.return_value = bytes(self.getUniqueInteger())
149 self.patch(utils, 'read_file', mock_read_file)151 self.patch(utils, 'read_file', mock_read_file)
150 proxy_fixture = LocalProxyFixture()152 proxy_fixture = LocalProxyFixture(config_dir=self.temp_dir)
151 proxy_fixture.kill_running_proxy()153 proxy_fixture.kill_running_proxy()
152 mock_log_error.assert_has_calls([154 mock_log_error.assert_has_calls([
153 mock.call("Unable to kill proxy:"),155 mock.call("Unable to kill proxy:"),
@@ -162,7 +164,7 @@
162 mock_kill_running_proxy = mock.MagicMock()164 mock_kill_running_proxy = mock.MagicMock()
163165
164 port = self.get_random_port_number()166 port = self.get_random_port_number()
165 proxy_fixture = LocalProxyFixture(port)167 proxy_fixture = LocalProxyFixture(config_dir=self.temp_dir, port=port)
166 self.patch(168 self.patch(
167 proxy_fixture, 'kill_running_proxy', mock_kill_running_proxy)169 proxy_fixture, 'kill_running_proxy', mock_kill_running_proxy)
168170
@@ -174,5 +176,5 @@
174 mock_exists = mock.MagicMock()176 mock_exists = mock.MagicMock()
175 mock_exists.return_value = True177 mock_exists.return_value = True
176 self.patch(os.path, 'exists', mock_exists)178 self.patch(os.path, 'exists', mock_exists)
177 proxy_fixture = LocalProxyFixture()179 proxy_fixture = LocalProxyFixture(config_dir=self.temp_dir)
178 self.assertRaises(Exception, proxy_fixture.setUp)180 self.assertRaises(Exception, proxy_fixture.setUp)
179181
=== modified file 'packages.txt'
--- packages.txt 2013-11-26 13:10:43 +0000
+++ packages.txt 2013-11-28 14:16:14 +0000
@@ -11,6 +11,7 @@
11python-testresources11python-testresources
12python-testtools12python-testtools
13python-virtualenv13python-virtualenv
14python-xdg
14python3-fixtures15python3-fixtures
15python3-lxml16python3-lxml
16python3-mock17python3-mock
@@ -18,6 +19,7 @@
18python3-six19python3-six
19python3-testresources20python3-testresources
20python3-testtools21python3-testtools
22python3-xdg
21qemu-kvm23qemu-kvm
22uvtool24uvtool
23uvtool-libvirt25uvtool-libvirt

Subscribers

People subscribed via source and target branches