blob: 0328781e890fd2a02fbe21ff472c7263cbc8473f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
import pytest
from tests.integration_tests.util import verify_clean_log
# This works by setting up a local repository and web server
# daemon on the first boot. Second boot should succeed
# with the running web service and git repo configured.
# This instrumentation allows the test to run self-contained
# without network access or external git repos.
REPO_D = "/root/playbooks"
USER_DATA = """\
#cloud-config
version: v1
packages_update: true
packages_upgrade: true
packages:
- git
- python3-pip
write_files:
- path: /etc/systemd/system/repo_server.service
content: |
[Unit]
Description=Serve a local git repo
[Service]
ExecStart=/usr/bin/env python3 -m http.server --directory \
/root/playbooks/.git
Restart=on-failure
[Install]
WantedBy=cloud-final.service
- path: /root/playbooks/ubuntu.yml
content: |
---
- hosts: 127.0.0.1
connection: local
become: true
vars:
packages:
- git
- python3-pip
roles:
- apt
- path: /root/playbooks/roles/apt/tasks/main.yml
content: |
---
- name: "install packages"
apt:
name: "*"
update_cache: yes
cache_valid_time: 3600
- name: "install packages"
apt:
name:
- "{{ item }}"
state: latest
loop: "{{ packages }}"
"""
INSTALL_METHOD = """
ansible:
install-method: {method}
package-name: {package}
pull:
url: "http://0.0.0.0:8000/"
playbook-name: ubuntu.yml
full: true
runcmd:
- "systemctl enable repo_server.service"
"""
SETUP_REPO = f"cd {REPO_D} &&\
git init {REPO_D} &&\
git add {REPO_D}/roles/apt/tasks/main.yml {REPO_D}/ubuntu.yml &&\
git commit -m auto &&\
git update-server-info"
def _test_ansible_pull_from_local_server(my_client):
assert my_client.execute(SETUP_REPO).ok
my_client.execute("cloud-init clean --logs")
my_client.restart()
log = my_client.read_from_file("/var/log/cloud-init.log")
# These ensure the repo used for ansible-pull works as expected
assert my_client.execute("wget http://0.0.0.0:8000").ok
assert my_client.execute("git clone http://0.0.0.0:8000/").ok
assert "(dead)" not in my_client.execute(
"systemctl status repo_server.service"
)
# Following assertions verify ansible behavior itself
verify_clean_log(log)
output_log = my_client.read_from_file("/var/log/cloud-init-output.log")
assert "ok=3" in output_log
assert "SUCCESS: config-ansible ran successfully" in log
@pytest.mark.user_data(
USER_DATA + INSTALL_METHOD.format(package="ansible-core", method="pip")
)
class TestAnsiblePullPip:
def test_ansible_pull_pip(self, class_client):
_test_ansible_pull_from_local_server(class_client)
@pytest.mark.user_data(
USER_DATA + INSTALL_METHOD.format(package="ansible", method="distro")
)
class TestAnsiblePullDistro:
def test_ansible_pull_distro(self, class_client):
_test_ansible_pull_from_local_server(class_client)
|