Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 71 additions & 78 deletions tests/unittests/config/test_apt_conf_v1.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,50 +3,44 @@
import copy
import os
import re
import shutil
import tempfile

import pytest

from cloudinit import util
from cloudinit.config import cc_apt_configure
from tests.unittests.helpers import TestCase


class TestAptProxyConfig(TestCase):
def setUp(self):
super(TestAptProxyConfig, self).setUp()
self.tmp = tempfile.mkdtemp()
self.addCleanup(shutil.rmtree, self.tmp)
self.pfile = os.path.join(self.tmp, "proxy.cfg")
self.cfile = os.path.join(self.tmp, "config.cfg")

def _search_apt_config(self, contents, ptype, value):
return re.search(
r"acquire::%s::proxy\s+[\"']%s[\"'];\n" % (ptype, value),
contents,
flags=re.IGNORECASE,
)

def test_apt_proxy_written(self):
cfg = {"proxy": "myproxy"}
cc_apt_configure.apply_apt_config(cfg, self.pfile, self.cfile)

self.assertTrue(os.path.isfile(self.pfile))
self.assertFalse(os.path.isfile(self.cfile))
@pytest.fixture
def p_c_files(tmp_path):
pfile = str(tmp_path / "proxy.cfg")
cfile = str(tmp_path / "config.cfg")
return pfile, cfile


def _search_apt_config(contents, ptype, value):
return re.search(
r"acquire::%s::proxy\s+[\"']%s[\"'];\n" % (ptype, value),
contents,
flags=re.IGNORECASE,
)

contents = util.load_text_file(self.pfile)
self.assertTrue(self._search_apt_config(contents, "http", "myproxy"))

def test_apt_http_proxy_written(self):
cfg = {"http_proxy": "myproxy"}
cc_apt_configure.apply_apt_config(cfg, self.pfile, self.cfile)
class TestAptProxyConfig:
@pytest.mark.parametrize(
"cfg", [{"proxy": "myproxy"}, {"http_proxy": "myproxy"}]
)
def test_apt_proxy_written_variants(self, p_c_files, cfg):
pfile, cfile = p_c_files
cc_apt_configure.apply_apt_config(cfg, pfile, cfile)

self.assertTrue(os.path.isfile(self.pfile))
self.assertFalse(os.path.isfile(self.cfile))
assert os.path.isfile(pfile)
assert not os.path.isfile(cfile)

contents = util.load_text_file(self.pfile)
self.assertTrue(self._search_apt_config(contents, "http", "myproxy"))
contents = util.load_text_file(pfile)
assert _search_apt_config(contents, "http", "myproxy")

def test_apt_all_proxy_written(self):
def test_apt_all_proxy_written(self, p_c_files):
pfile, cfile = p_c_files
cfg = {
"http_proxy": "myproxy_http_proxy",
"https_proxy": "myproxy_https_proxy",
Expand All @@ -59,76 +53,75 @@ def test_apt_all_proxy_written(self):
"ftp": cfg["ftp_proxy"],
}

cc_apt_configure.apply_apt_config(cfg, self.pfile, self.cfile)
cc_apt_configure.apply_apt_config(cfg, pfile, cfile)

self.assertTrue(os.path.isfile(self.pfile))
self.assertFalse(os.path.isfile(self.cfile))
assert os.path.isfile(pfile)
assert not os.path.isfile(cfile)

contents = util.load_text_file(self.pfile)
contents = util.load_text_file(pfile)

for ptype, pval in values.items():
self.assertTrue(self._search_apt_config(contents, ptype, pval))

def test_proxy_deleted(self):
util.write_file(self.cfile, "content doesnt matter")
cc_apt_configure.apply_apt_config({}, self.pfile, self.cfile)
self.assertFalse(os.path.isfile(self.pfile))
self.assertFalse(os.path.isfile(self.cfile))

def test_proxy_replaced(self):
util.write_file(self.cfile, "content doesnt matter")
cc_apt_configure.apply_apt_config(
{"proxy": "foo"}, self.pfile, self.cfile
)
self.assertTrue(os.path.isfile(self.pfile))
contents = util.load_text_file(self.pfile)
self.assertTrue(self._search_apt_config(contents, "http", "foo"))

def test_config_written(self):
assert _search_apt_config(contents, ptype, pval)

def test_proxy_deleted(self, p_c_files):
pfile, cfile = p_c_files
util.write_file(cfile, "content doesn't matter")
cc_apt_configure.apply_apt_config({}, pfile, cfile)
assert not os.path.isfile(pfile)
assert not os.path.isfile(cfile)

def test_proxy_replaced(self, p_c_files):
pfile, cfile = p_c_files
util.write_file(cfile, "content doesn't matter")
cc_apt_configure.apply_apt_config({"proxy": "foo"}, pfile, cfile)
assert os.path.isfile(pfile)
contents = util.load_text_file(pfile)
assert _search_apt_config(contents, "http", "foo")

def test_config_written(self, p_c_files):
pfile, cfile = p_c_files
payload = "this is my apt config"
cfg = {"conf": payload}

cc_apt_configure.apply_apt_config(cfg, self.pfile, self.cfile)
cc_apt_configure.apply_apt_config(cfg, pfile, cfile)

self.assertTrue(os.path.isfile(self.cfile))
self.assertFalse(os.path.isfile(self.pfile))
assert os.path.isfile(cfile)
assert not os.path.isfile(pfile)

self.assertEqual(util.load_text_file(self.cfile), payload)
assert util.load_text_file(cfile) == payload

def test_config_replaced(self):
util.write_file(self.pfile, "content doesnt matter")
cc_apt_configure.apply_apt_config(
{"conf": "foo"}, self.pfile, self.cfile
)
self.assertTrue(os.path.isfile(self.cfile))
self.assertEqual(util.load_text_file(self.cfile), "foo")
def test_config_replaced(self, p_c_files):
pfile, cfile = p_c_files
util.write_file(pfile, "content doesn't matter")
cc_apt_configure.apply_apt_config({"conf": "foo"}, pfile, cfile)
assert os.path.isfile(cfile)
assert util.load_text_file(cfile) == "foo"

def test_config_deleted(self):
def test_config_deleted(self, p_c_files):
# if no 'conf' is provided, delete any previously written file
util.write_file(self.pfile, "content doesnt matter")
cc_apt_configure.apply_apt_config({}, self.pfile, self.cfile)
self.assertFalse(os.path.isfile(self.pfile))
self.assertFalse(os.path.isfile(self.cfile))
pfile, cfile = p_c_files
util.write_file(pfile, "content doesn't matter")
cc_apt_configure.apply_apt_config({}, pfile, cfile)
assert not os.path.isfile(pfile)
assert not os.path.isfile(cfile)


class TestConversion(TestCase):
class TestConversion:
def test_convert_with_apt_mirror_as_empty_string(self):
# an empty apt_mirror is the same as no apt_mirror
empty_m_found = cc_apt_configure.convert_to_v3_apt_format(
{"apt_mirror": ""}
)
default_found = cc_apt_configure.convert_to_v3_apt_format({})
self.assertEqual(default_found, empty_m_found)
assert default_found == empty_m_found

def test_convert_with_apt_mirror(self):
mirror = "http://my.mirror/ubuntu"
f = cc_apt_configure.convert_to_v3_apt_format({"apt_mirror": mirror})
self.assertIn(mirror, set(m["uri"] for m in f["apt"]["primary"]))
assert mirror in set(m["uri"] for m in f["apt"]["primary"])

def test_no_old_content(self):
mirror = "http://my.mirror/ubuntu"
mydata = {"apt": {"primary": {"arches": ["default"], "uri": mirror}}}
expected = copy.deepcopy(mydata)
self.assertEqual(
expected, cc_apt_configure.convert_to_v3_apt_format(mydata)
)
assert expected == cc_apt_configure.convert_to_v3_apt_format(mydata)