def test_v1_extra_fields_are_ignored(self): """Test v1 id ignores unused entries in config.""" cfg = self.v1_cfg.copy() cfg["consumer_secret"] = "BOO" cfg["unrelated"] = "HI MOM" result = DataSourceMAAS.get_id_from_ds_cfg(cfg) self.assertEqual(self.v1_id, result)
def test_v1_extra_fields_are_ignored(self): """Test v1 id ignores unused entries in config.""" cfg = self.v1_cfg.copy() cfg['consumer_secret'] = "BOO" cfg['unrelated'] = "HI MOM" result = DataSourceMAAS.get_id_from_ds_cfg(cfg) self.assertEqual(self.v1_id, result)
def test_seed_url_valid(self): """Verify that valid seed_url is read as such.""" valid = { 'meta-data/instance-id': 'i-instanceid', 'meta-data/local-hostname': 'test-hostname', 'meta-data/public-keys': 'test-hostname', 'user-data': b'foodata', } valid_order = [ 'meta-data/local-hostname', 'meta-data/instance-id', 'meta-data/public-keys', 'user-data', ] my_seed = "http://example.com/xmeta" my_ver = "1999-99-99" my_headers = {'header1': 'value1', 'header2': 'value2'} def my_headers_cb(url): return my_headers # Each time url_helper.readurl() is called, something different is # returned based on the canned data above. We need to build up a list # of side effect return values, which the mock will return. At the # same time, we'll build up a list of expected call arguments for # asserting after the code under test is run. calls = [] def side_effect(): for key in valid_order: resp = valid.get(key) url = "%s/%s/%s" % (my_seed, my_ver, key) calls.append( mock.call(url, headers=None, timeout=mock.ANY, data=mock.ANY, sec_between=mock.ANY, ssl_details=mock.ANY, retries=mock.ANY, headers_cb=my_headers_cb, exception_cb=mock.ANY)) yield url_helper.StringResponse(resp) # Now do the actual call of the code under test. with mock.patch.object(url_helper, 'readurl', side_effect=side_effect()) as mockobj: userdata, metadata = DataSourceMAAS.read_maas_seed_url( my_seed, header_cb=my_headers_cb, version=my_ver) self.assertEqual(b"foodata", userdata) self.assertEqual(metadata['instance-id'], valid['meta-data/instance-id']) self.assertEqual(metadata['local-hostname'], valid['meta-data/local-hostname']) mockobj.has_calls(calls)
def test_seed_url_valid(self): """Verify that valid seed_url is read as such.""" valid = { 'meta-data/instance-id': 'i-instanceid', 'meta-data/local-hostname': 'test-hostname', 'meta-data/public-keys': 'test-hostname', 'user-data': 'foodata' } valid_order = [ 'meta-data/local-hostname', 'meta-data/instance-id', 'meta-data/public-keys', 'user-data', ] my_seed = "http://example.com/xmeta" my_ver = "1999-99-99" my_headers = {'header1': 'value1', 'header2': 'value2'} def my_headers_cb(url): return my_headers mock_request = self.mocker.replace(url_helper.readurl, passthrough=False) for key in valid_order: url = "%s/%s/%s" % (my_seed, my_ver, key) mock_request(url, headers=None, timeout=mocker.ANY, data=mocker.ANY, sec_between=mocker.ANY, ssl_details=mocker.ANY, retries=mocker.ANY, headers_cb=my_headers_cb, exception_cb=mocker.ANY) resp = valid.get(key) self.mocker.result(url_helper.StringResponse(resp)) self.mocker.replay() (userdata, metadata) = DataSourceMAAS.read_maas_seed_url(my_seed, header_cb=my_headers_cb, version=my_ver) self.assertEqual("foodata", userdata) self.assertEqual(metadata['instance-id'], valid['meta-data/instance-id']) self.assertEqual(metadata['local-hostname'], valid['meta-data/local-hostname'])
def test_seed_dir_valid_extra(self): """Verify extra files do not affect seed_dir validity.""" data = {'instance-id': 'i-valid-extra', 'local-hostname': 'valid-extra-hostname', 'user-data': b'valid-extra-userdata', 'foo': 'bar'} my_d = os.path.join(self.tmp, "valid_extra") populate_dir(my_d, data) (userdata, metadata) = DataSourceMAAS.read_maas_seed_dir(my_d) self.assertEqual(userdata, data['user-data']) for key in ('instance-id', 'local-hostname'): self.assertEqual(data[key], metadata[key]) # additional files should not just appear as keys in metadata atm self.assertFalse(('foo' in metadata))
def test_seed_dir_valid(self): """Verify a valid seeddir is read as such.""" data = {'instance-id': 'i-valid01', 'local-hostname': 'valid01-hostname', 'user-data': b'valid01-userdata', 'public-keys': 'ssh-rsa AAAAB3Nz...aC1yc2E= keyname'} my_d = os.path.join(self.tmp, "valid") populate_dir(my_d, data) (userdata, metadata) = DataSourceMAAS.read_maas_seed_dir(my_d) self.assertEqual(userdata, data['user-data']) for key in ('instance-id', 'local-hostname'): self.assertEqual(data[key], metadata[key]) # verify that 'userdata' is not returned as part of the metadata self.assertFalse(('user-data' in metadata))
def test_seed_url_valid(self): """Verify that valid seed_url is read as such.""" valid = {'meta-data/instance-id': 'i-instanceid', 'meta-data/local-hostname': 'test-hostname', 'meta-data/public-keys': 'test-hostname', 'user-data': 'foodata'} valid_order = [ 'meta-data/local-hostname', 'meta-data/instance-id', 'meta-data/public-keys', 'user-data', ] my_seed = "http://example.com/xmeta" my_ver = "1999-99-99" my_headers = {'header1': 'value1', 'header2': 'value2'} def my_headers_cb(url): return my_headers mock_request = self.mocker.replace(url_helper.readurl, passthrough=False) for key in valid_order: url = "%s/%s/%s" % (my_seed, my_ver, key) mock_request(url, headers=None, timeout=mocker.ANY, data=mocker.ANY, sec_between=mocker.ANY, ssl_details=mocker.ANY, retries=mocker.ANY, headers_cb=my_headers_cb, exception_cb=mocker.ANY) resp = valid.get(key) self.mocker.result(url_helper.StringResponse(resp)) self.mocker.replay() (userdata, metadata) = DataSourceMAAS.read_maas_seed_url(my_seed, header_cb=my_headers_cb, version=my_ver) self.assertEqual("foodata", userdata) self.assertEqual(metadata['instance-id'], valid['meta-data/instance-id']) self.assertEqual(metadata['local-hostname'], valid['meta-data/local-hostname'])
def test_seed_dir_valid_extra(self): """Verify extra files do not affect seed_dir validity.""" data = { "instance-id": "i-valid-extra", "local-hostname": "valid-extra-hostname", "user-data": "valid-extra-userdata", "foo": "bar", } my_d = os.path.join(self.tmp, "valid_extra") populate_dir(my_d, data) (userdata, metadata) = DataSourceMAAS.read_maas_seed_dir(my_d) self.assertEqual(userdata, data["user-data"]) for key in ("instance-id", "local-hostname"): self.assertEqual(data[key], metadata[key]) # additional files should not just appear as keys in metadata atm self.assertFalse(("foo" in metadata))
def mock_read_maas_seed_url(self, data, seed, version="19991231"): """mock up readurl to appear as a web server at seed has provided data. return what read_maas_seed_url returns.""" def my_readurl(*args, **kwargs): if len(args): url = args[0] else: url = kwargs['url'] prefix = "%s/%s/" % (seed, version) if not url.startswith(prefix): raise ValueError("unexpected call %s" % url) short = url[len(prefix):] if short not in data: raise url_helper.UrlError("not found", code=404, url=url) return url_helper.StringResponse(data[short]) # Now do the actual call of the code under test. with mock.patch("cloudinit.url_helper.readurl") as mock_readurl: mock_readurl.side_effect = my_readurl return DataSourceMAAS.read_maas_seed_url(seed, version=version)
def test_seed_dir_valid(self): """Verify a valid seeddir is read as such.""" data = { "instance-id": "i-valid01", "local-hostname": "valid01-hostname", "user-data": "valid01-userdata", "public-keys": "ssh-rsa AAAAB3Nz...aC1yc2E= keyname", } my_d = os.path.join(self.tmp, "valid") populate_dir(my_d, data) (userdata, metadata) = DataSourceMAAS.read_maas_seed_dir(my_d) self.assertEqual(userdata, data["user-data"]) for key in ("instance-id", "local-hostname"): self.assertEqual(data[key], metadata[key]) # verify that 'userdata' is not returned as part of the metadata self.assertFalse(("user-data" in metadata))
def test_seed_url_valid(self): """Verify that valid seed_url is read as such.""" valid = { "meta-data/instance-id": "i-instanceid", "meta-data/local-hostname": "test-hostname", "meta-data/public-keys": "test-hostname", "user-data": "foodata", } valid_order = ["meta-data/local-hostname", "meta-data/instance-id", "meta-data/public-keys", "user-data"] my_seed = "http://example.com/xmeta" my_ver = "1999-99-99" my_headers = {"header1": "value1", "header2": "value2"} def my_headers_cb(url): return my_headers mock_request = self.mocker.replace(url_helper.readurl, passthrough=False) for key in valid_order: url = "%s/%s/%s" % (my_seed, my_ver, key) mock_request( url, headers=None, timeout=mocker.ANY, data=mocker.ANY, sec_between=mocker.ANY, ssl_details=mocker.ANY, retries=mocker.ANY, headers_cb=my_headers_cb, ) resp = valid.get(key) self.mocker.result(util.StringResponse(resp)) self.mocker.replay() (userdata, metadata) = DataSourceMAAS.read_maas_seed_url(my_seed, header_cb=my_headers_cb, version=my_ver) self.assertEqual("foodata", userdata) self.assertEqual(metadata["instance-id"], valid["meta-data/instance-id"]) self.assertEqual(metadata["local-hostname"], valid["meta-data/local-hostname"])
def test_seed_dir_valid_extra(self): """Verify extra files do not affect seed_dir validity.""" userdata = b"valid-extra-userdata" data = { "meta-data/instance-id": "i-valid-extra", "meta-data/local-hostname": "valid-extra-hostname", "user-data": userdata, "foo": "bar", } my_d = os.path.join(self.tmp, "valid_extra") populate_dir(my_d, data) ud, md, _vd = DataSourceMAAS.read_maas_seed_dir(my_d) self.assertEqual(userdata, ud) for key in ("instance-id", "local-hostname"): self.assertEqual(data["meta-data/" + key], md[key]) # additional files should not just appear as keys in metadata atm self.assertFalse(("foo" in md))
def test_seed_dir_valid(self): """Verify a valid seeddir is read as such.""" userdata = b"valid01-userdata" data = { "meta-data/instance-id": "i-valid01", "meta-data/local-hostname": "valid01-hostname", "user-data": userdata, "public-keys": "ssh-rsa AAAAB3Nz...aC1yc2E= keyname", } my_d = os.path.join(self.tmp, "valid") populate_dir(my_d, data) ud, md, vd = DataSourceMAAS.read_maas_seed_dir(my_d) self.assertEqual(userdata, ud) for key in ("instance-id", "local-hostname"): self.assertEqual(data["meta-data/" + key], md[key]) # verify that 'userdata' is not returned as part of the metadata self.assertFalse(("user-data" in md)) self.assertIsNone(vd)
def test_all_required(self, m_helper): """Valid config as expected.""" DataSourceMAAS.get_oauth_helper(self.base_cfg.copy()) m_helper.assert_has_calls([mock.call(**self.base_cfg)])
def test_other_fields_not_passed_through(self, m_helper): """Only relevant fields are passed through.""" mycfg = self.base_cfg.copy() mycfg['unrelated_field'] = 'unrelated' DataSourceMAAS.get_oauth_helper(mycfg) m_helper.assert_has_calls([mock.call(**self.base_cfg)])
def test_v1_expected(self): """Test v1 id generated as expected working behavior from config.""" result = DataSourceMAAS.get_id_from_ds_cfg(self.v1_cfg.copy()) self.assertEqual(self.v1_id, result)
def test_other_fields_not_passed_through(self, m_helper): """Only relevant fields are passed through.""" mycfg = self.base_cfg.copy() mycfg["unrelated_field"] = "unrelated" DataSourceMAAS.get_oauth_helper(mycfg) m_helper.assert_has_calls([mock.call(**self.base_cfg)])