~ubuntu-branches/ubuntu/precise/cloud-init/precise-updates

« back to all changes in this revision

Viewing changes to tests/unittests/test_datasource/test_maas.py

  • Committer: Package Import Robot
  • Author(s): Scott Moser
  • Date: 2012-03-09 16:37:01 UTC
  • mfrom: (174.1.9 precise)
  • Revision ID: package-import@ubuntu.com-20120309163701-w1ntss7kxz8jsy1p
Tags: 0.6.3~bzr539-0ubuntu1
* New upstream snapshot.
  * add ability to configure Acquire::http::Pipeline-Depth via
    cloud-config setting 'apt_pipelining' (LP: #942061)
  * if cloud-config settings removed default certificats
    (remove-defaults), then seed package ca-certificates to not
    install new ones on upgrade.
  * run-parts now uses internal implementation rather than
    separate command.
  * add MaaS datasource (LP: #942061)
* debian/cloud-init.postinst: address population of apt_pipeline 
  setting on installation.
* debian/cloud-init.postinst: support configuring cloud-init
  maas datasource via preseed values cloud-init/maas-metadata-url and
  cloud-init/maas-credentials. (LP: #942061)
* debian/cloud-init.postinst: support for (LP: #924375)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from tempfile import mkdtemp
 
2
from shutil import rmtree
 
3
import os
 
4
from StringIO import StringIO
 
5
from copy import copy
 
6
from cloudinit.DataSourceMaaS import (
 
7
    MaasSeedDirNone,
 
8
    MaasSeedDirMalformed,
 
9
    read_maas_seed_dir,
 
10
    read_maas_seed_url,
 
11
)
 
12
from mocker import MockerTestCase
 
13
 
 
14
 
 
15
class TestMaasDataSource(MockerTestCase):
 
16
 
 
17
    def setUp(self):
 
18
        super(TestMaasDataSource, self).setUp()
 
19
        # Make a temp directoy for tests to use.
 
20
        self.tmp = mkdtemp(prefix="unittest_")
 
21
 
 
22
    def tearDown(self):
 
23
        super(TestMaasDataSource, self).tearDown()
 
24
        # Clean up temp directory
 
25
        rmtree(self.tmp)
 
26
 
 
27
    def test_seed_dir_valid(self):
 
28
        """Verify a valid seeddir is read as such"""
 
29
 
 
30
        data = {'instance-id': 'i-valid01',
 
31
            'local-hostname': 'valid01-hostname',
 
32
            'user-data': 'valid01-userdata'}
 
33
 
 
34
        my_d = os.path.join(self.tmp, "valid")
 
35
        populate_dir(my_d, data)
 
36
 
 
37
        (userdata, metadata) = read_maas_seed_dir(my_d)
 
38
 
 
39
        self.assertEqual(userdata, data['user-data'])
 
40
        for key in ('instance-id', 'local-hostname'):
 
41
            self.assertEqual(data[key], metadata[key])
 
42
 
 
43
        # verify that 'userdata' is not returned as part of the metadata
 
44
        self.assertFalse(('user-data' in metadata))
 
45
 
 
46
    def test_seed_dir_valid_extra(self):
 
47
        """Verify extra files do not affect seed_dir validity """
 
48
 
 
49
        data = {'instance-id': 'i-valid-extra',
 
50
            'local-hostname': 'valid-extra-hostname',
 
51
            'user-data': 'valid-extra-userdata', 'foo': 'bar'}
 
52
 
 
53
        my_d = os.path.join(self.tmp, "valid_extra")
 
54
        populate_dir(my_d, data)
 
55
 
 
56
        (userdata, metadata) = read_maas_seed_dir(my_d)
 
57
 
 
58
        self.assertEqual(userdata, data['user-data'])
 
59
        for key in ('instance-id', 'local-hostname'):
 
60
            self.assertEqual(data[key], metadata[key])
 
61
 
 
62
        # additional files should not just appear as keys in metadata atm
 
63
        self.assertFalse(('foo' in metadata))
 
64
 
 
65
    def test_seed_dir_invalid(self):
 
66
        """Verify that invalid seed_dir raises MaasSeedDirMalformed"""
 
67
 
 
68
        valid = {'instance-id': 'i-instanceid',
 
69
            'local-hostname': 'test-hostname', 'user-data': ''}
 
70
 
 
71
        my_based = os.path.join(self.tmp, "valid_extra")
 
72
 
 
73
        # missing 'userdata' file
 
74
        my_d = "%s-01" % my_based
 
75
        invalid_data = copy(valid)
 
76
        del invalid_data['local-hostname']
 
77
        populate_dir(my_d, invalid_data)
 
78
        self.assertRaises(MaasSeedDirMalformed, read_maas_seed_dir, my_d)
 
79
 
 
80
        # missing 'instance-id'
 
81
        my_d = "%s-02" % my_based
 
82
        invalid_data = copy(valid)
 
83
        del invalid_data['instance-id']
 
84
        populate_dir(my_d, invalid_data)
 
85
        self.assertRaises(MaasSeedDirMalformed, read_maas_seed_dir, my_d)
 
86
 
 
87
    def test_seed_dir_none(self):
 
88
        """Verify that empty seed_dir raises MaasSeedDirNone"""
 
89
 
 
90
        my_d = os.path.join(self.tmp, "valid_empty")
 
91
        self.assertRaises(MaasSeedDirNone, read_maas_seed_dir, my_d)
 
92
 
 
93
    def test_seed_dir_missing(self):
 
94
        """Verify that missing seed_dir raises MaasSeedDirNone"""
 
95
        self.assertRaises(MaasSeedDirNone, read_maas_seed_dir,
 
96
            os.path.join(self.tmp, "nonexistantdirectory"))
 
97
 
 
98
    def test_seed_url_valid(self):
 
99
        """Verify that valid seed_url is read as such"""
 
100
        valid = {'meta-data/instance-id': 'i-instanceid',
 
101
            'meta-data/local-hostname': 'test-hostname',
 
102
            'user-data': 'foodata'}
 
103
 
 
104
        my_seed = "http://example.com/xmeta"
 
105
        my_ver = "1999-99-99"
 
106
        my_headers = {'header1': 'value1', 'header2': 'value2'}
 
107
 
 
108
        def my_headers_cb(url):
 
109
            return(my_headers)
 
110
 
 
111
        mock_request = self.mocker.replace("urllib2.Request",
 
112
            passthrough=False)
 
113
        mock_urlopen = self.mocker.replace("urllib2.urlopen",
 
114
            passthrough=False)
 
115
 
 
116
        for (key, val) in valid.iteritems():
 
117
            mock_request("%s/%s/%s" % (my_seed, my_ver, key),
 
118
                data=None, headers=my_headers)
 
119
            self.mocker.nospec()
 
120
            self.mocker.result("fake-request-%s" % key)
 
121
            mock_urlopen("fake-request-%s" % key, timeout=None)
 
122
            self.mocker.result(StringIO(val))
 
123
 
 
124
        self.mocker.replay()
 
125
 
 
126
        (userdata, metadata) = read_maas_seed_url(my_seed,
 
127
            header_cb=my_headers_cb, version=my_ver)
 
128
 
 
129
        self.assertEqual("foodata", userdata)
 
130
        self.assertEqual(metadata['instance-id'],
 
131
            valid['meta-data/instance-id'])
 
132
        self.assertEqual(metadata['local-hostname'],
 
133
            valid['meta-data/local-hostname'])
 
134
 
 
135
    def test_seed_url_invalid(self):
 
136
        """Verify that invalid seed_url raises MaasSeedDirMalformed"""
 
137
        pass
 
138
 
 
139
    def test_seed_url_missing(self):
 
140
        """Verify seed_url with no found entries raises MaasSeedDirNone"""
 
141
        pass
 
142
 
 
143
 
 
144
def populate_dir(seed_dir, files):
 
145
    os.mkdir(seed_dir)
 
146
    for (name, content) in files.iteritems():
 
147
        with open(os.path.join(seed_dir, name), "w") as fp:
 
148
            fp.write(content)
 
149
            fp.close()
 
150
 
 
151
# vi: ts=4 expandtab