def test_write_configdrive(self, open_mock, makedirs_mock): metadata = {'admin_pass': '******', 'hostname': 'test'} files = utils.get_ordereddict([ ('/etc/conf0', base64.b64encode('contents0')), ('/etc/conf1', base64.b64encode('contents1')), ]) metadata['files'] = [ {'content_path': '/content/0000', 'path': '/etc/conf0'}, {'content_path': '/content/0001', 'path': '/etc/conf1'}, ] open_mock.return_value.__enter__ = lambda s: s open_mock.return_value.__exit__ = mock.Mock() write_mock = open_mock.return_value.write configdrive.write_configdrive('/lol', metadata, files, prefix='openstack', version='latest') # have to pull out the JSON passed to write and parse it # because arbitrary dictionary ordering, etc calls = write_mock.mock_calls json_data = calls[-1][1][0] data = json.loads(json_data) self.assertEqual(data, metadata) open_calls = [ mock.call('/lol/openstack/content/0000', 'wb'), mock.call().write('contents0'), mock.call().__exit__(None, None, None), mock.call('/lol/openstack/content/0001', 'wb'), mock.call().write('contents1'), mock.call().__exit__(None, None, None), mock.call('/lol/openstack/latest/meta_data.json', 'wb'), # already checked mock.call().write(mock.ANY), mock.call().__exit__(None, None, None), ] self.assertEqual(open_mock.mock_calls, open_calls) makedirs_calls = [ mock.call('/lol/openstack/latest'), mock.call('/lol/openstack/content') ] self.assertEqual(makedirs_calls, makedirs_mock.call_args_list)
def test_write_configdrive(self, open_mock, makedirs_mock): metadata = {'admin_pass': '******', 'hostname': 'test'} files = utils.get_ordereddict([ ('/etc/conf0', base64.b64encode(b'contents0')), ('/etc/conf1', base64.b64encode(b'contents1')), ]) metadata['files'] = [ {'content_path': '/content/0000', 'path': '/etc/conf0'}, {'content_path': '/content/0001', 'path': '/etc/conf1'}, ] open_mock.return_value.__enter__ = lambda s: s open_mock.return_value.__exit__ = mock.Mock() write_mock = open_mock.return_value.write configdrive.write_configdrive('/lol', metadata, files, prefix='openstack', version='latest') # have to pull out the JSON passed to write and parse it # because arbitrary dictionary ordering, etc calls = write_mock.mock_calls json_data = calls[-1][1][0] data = json.loads(json_data) self.assertEqual(data, metadata) open_calls = [ mock.call('/lol/openstack/content/0000', 'wb'), mock.call().write(b'contents0'), mock.call().__exit__(None, None, None), mock.call('/lol/openstack/content/0001', 'wb'), mock.call().write(b'contents1'), mock.call().__exit__(None, None, None), mock.call('/lol/openstack/latest/meta_data.json', 'wb'), # already checked mock.call().write(mock.ANY), mock.call().__exit__(None, None, None), ] self.assertEqual(open_mock.mock_calls, open_calls) makedirs_calls = [ mock.call('/lol/openstack/latest'), mock.call('/lol/openstack/content') ] self.assertEqual(makedirs_calls, makedirs_mock.call_args_list)
def prepare_image(self, command_name, image_info=None, metadata=None, files=None): location = _configdrive_location() device = hardware.get_manager().get_os_install_device() # don't write image again if already cached if self.cached_image_id != image_info['id']: _download_image(image_info) _write_image(image_info, device) self.cached_image_id = image_info['id'] LOG.debug('Writing configdrive to {0}'.format(location)) configdrive.write_configdrive(location, metadata, files) _copy_configdrive_to_disk(location, device)