# This file is part of cloud-init. See LICENSE file for license information.
""" test_apk_configure
Test creation of repositories file
"""
import logging
import os
import textwrap
from cloudinit import (cloud, helpers, util)
from cloudinit.config import cc_apk_configure
from cloudinit.tests.helpers import (FilesystemMockingTestCase, mock)
REPO_FILE = "/etc/apk/repositories"
DEFAULT_MIRROR_URL = "https://alpine.global.ssl.fastly.net/alpine"
CC_APK = 'cloudinit.config.cc_apk_configure'
class TestNoConfig(FilesystemMockingTestCase):
def setUp(self):
super(TestNoConfig, self).setUp()
self.add_patch(CC_APK + '._write_repositories_file', 'm_write_repos')
self.name = "apk-configure"
self.cloud_init = None
self.log = logging.getLogger("TestNoConfig")
self.args = []
def test_no_config(self):
"""
Test that nothing is done if no apk-configure
configuration is provided.
"""
config = util.get_builtin_cfg()
cc_apk_configure.handle(self.name, config, self.cloud_init,
self.log, self.args)
self.assertEqual(0, self.m_write_repos.call_count)
class TestConfig(FilesystemMockingTestCase):
def setUp(self):
super(TestConfig, self).setUp()
self.new_root = self.tmp_dir()
self.new_root = self.reRoot(root=self.new_root)
for dirname in ['tmp', 'etc/apk']:
util.ensure_dir(os.path.join(self.new_root, dirname))
self.paths = helpers.Paths({'templates_dir': self.new_root})
self.name = "apk-configure"
self.cloud = cloud.Cloud(None, self.paths, None, None, None)
self.log = logging.getLogger("TestNoConfig")
self.args = []
@mock.patch(CC_APK + '._write_repositories_file')
def test_no_repo_settings(self, m_write_repos):
"""
Test that nothing is written if the 'alpine-repo' key
is not present.
"""
config = {"apk_repos": {}}
cc_apk_configure.handle(self.name, config, self.cloud, self.log,
self.args)
self.assertEqual(0, m_write_repos.call_count)
@mock.patch(CC_APK + '._write_repositories_file')
def test_empty_repo_settings(self, m_write_repos):
"""
Test that nothing is written if 'alpine_repo' list is empty.
"""
config = {"apk_repos": {"alpine_repo": []}}
cc_apk_configure.handle(self.name, config, self.cloud, self.log,
self.args)
self.assertEqual(0, m_write_repos.call_count)
def test_only_main_repo(self):
"""
Test when only details of main repo is written to file.
"""
alpine_version = 'v3.12'
config = {
"apk_repos": {
"alpine_repo": {
"version": alpine_version
}
}
}
cc_apk_configure.handle(self.name, config, self.cloud, self.log,
self.args)
expected_content = textwrap.dedent("""\
#
# Created by cloud-init
#
# This file is written on first boot of an instance
#
{0}/{1}/main
""".format(DEFAULT_MIRROR_URL, alpine_version))
self.assertEqual(expected_content, util.load_file(REPO_FILE))
def test_main_and_community_repos(self):
"""
Test when only details of main and community repos are
written to file.
"""
alpine_version = 'edge'
config = {
"apk_repos": {
"alpine_repo": {
"version": alpine_version,
"community_enabled": True
}
}
}
cc_apk_configure.handle(self.name, config, self.cloud, self.log,
self.args)
expected_content = textwrap.dedent("""\
#
# Created by cloud-init
#
# This file is written on first boot of an instance
#
{0}/{1}/main
{0}/{1}/community
""".format(DEFAULT_MIRROR_URL, alpine_version))
self.assertEqual(expected_content, util.load_file(REPO_FILE))
def test_main_community_testing_repos(self):
"""
Test when details of main, community and testing repos
are written to file.
"""
alpine_version = 'v3.12'
config = {
"apk_repos": {
"alpine_repo": {
"version": alpine_version,
"community_enabled": True,
"testing_enabled": True
}
}
}
cc_apk_configure.handle(self.name, config, self.cloud, self.log,
self.args)
expected_content = textwrap.dedent("""\
#
# Created by cloud-init
#
# This file is written on first boot of an instance
#
{0}/{1}/main
{0}/{1}/community
#
# Testing - using with non-Edge installation may cause problems!
#
{0}/edge/testing
""".format(DEFAULT_MIRROR_URL, alpine_version))
self.assertEqual(expected_content, util.load_file(REPO_FILE))
def test_edge_main_community_testing_repos(self):
"""
Test when details of main, community and testing repos
for Edge version of Alpine are written to file.
"""
alpine_version = 'edge'
config = {
"apk_repos": {
"alpine_repo": {
"version": alpine_version,
"community_enabled": True,
"testing_enabled": True
}
}
}
cc_apk_configure.handle(self.name, config, self.cloud, self.log,
self.args)
expected_content = textwrap.dedent("""\
#
# Created by cloud-init
#
# This file is written on first boot of an instance
#
{0}/{1}/main
{0}/{1}/community
{0}/{1}/testing
""".format(DEFAULT_MIRROR_URL, alpine_version))
self.assertEqual(expected_content, util.load_file(REPO_FILE))
def test_main_community_testing_local_repos(self):
"""
Test when details of main, community, testing and
local repos are written to file.
"""
alpine_version = 'v3.12'
local_repo_url = 'http://some.mirror/whereever'
config = {
"apk_repos": {
"alpine_repo": {
"version": alpine_version,
"community_enabled": True,
"testing_enabled": True
},
"local_repo_base_url": local_repo_url
}
}
cc_apk_configure.handle(self.name, config, self.cloud, self.log,
self.args)
expected_content = textwrap.dedent("""\
#
# Created by cloud-init
#
# This file is written on first boot of an instance
#
{0}/{1}/main
{0}/{1}/community
#
# Testing - using with non-Edge installation may cause problems!
#
{0}/edge/testing
#
# Local repo
#
{2}/{1}
""".format(DEFAULT_MIRROR_URL, alpine_version, local_repo_url))
self.assertEqual(expected_content, util.load_file(REPO_FILE))
def test_edge_main_community_testing_local_repos(self):
"""
Test when details of main, community, testing and local repos
for Edge version of Alpine are written to file.
"""
alpine_version = 'edge'
local_repo_url = 'http://some.mirror/whereever'
config = {
"apk_repos": {
"alpine_repo": {
"version": alpine_version,
"community_enabled": True,
"testing_enabled": True
},
"local_repo_base_url": local_repo_url
}
}
cc_apk_configure.handle(self.name, config, self.cloud, self.log,
self.args)
expected_content = textwrap.dedent("""\
#
# Created by cloud-init
#
# This file is written on first boot of an instance
#
{0}/{1}/main
{0}/{1}/community
{0}/edge/testing
#
# Local repo
#
{2}/{1}
""".format(DEFAULT_MIRROR_URL, alpine_version, local_repo_url))
self.assertEqual(expected_content, util.load_file(REPO_FILE))
# vi: ts=4 expandtab