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
|
"""NoCloud datasource integration tests."""
import pytest
from pycloudlib.lxd.instance import LXDInstance
from cloudinit.subp import subp
from tests.integration_tests.instances import IntegrationInstance
VENDOR_DATA = """\
#cloud-config
runcmd:
- touch /var/tmp/seeded_vendordata_test_file
"""
LXD_METADATA_NOCLOUD_SEED = """\
/var/lib/cloud/seed/nocloud-net/meta-data:
when:
- create
- copy
create_only: false
template: emptycfg.tpl
properties:
default: |
#cloud-config
{}
/var/lib/cloud/seed/nocloud-net/user-data:
when:
- create
- copy
create_only: false
template: emptycfg.tpl
properties:
default: |
#cloud-config
{}
"""
def setup_nocloud(instance: LXDInstance):
# On Jammy and above, LXD no longer uses NoCloud, so we need to set
# it up manually
lxd_image_metadata = subp(
["lxc", "config", "metadata", "show", instance.name]
)
if "/var/lib/cloud/seed/nocloud-net" in lxd_image_metadata.stdout:
return
subp(
["lxc", "config", "template", "create", instance.name, "emptycfg.tpl"],
)
subp(
["lxc", "config", "template", "edit", instance.name, "emptycfg.tpl"],
data="#cloud-config\n{}\n",
)
subp(
["lxc", "config", "metadata", "edit", instance.name],
data=f"{lxd_image_metadata.stdout}{LXD_METADATA_NOCLOUD_SEED}",
)
# Only running on LXD container because we need NoCloud with custom setup
@pytest.mark.lxd_container
@pytest.mark.lxd_setup.with_args(setup_nocloud)
@pytest.mark.lxd_use_exec
def test_nocloud_seedfrom_vendordata(client: IntegrationInstance):
"""Integration test for #570.
Test that we can add optional vendor-data to the seedfrom file in a
NoCloud environment
"""
seed_dir = "/var/tmp/test_seed_dir"
result = client.execute(
"mkdir {seed_dir} && "
"touch {seed_dir}/user-data && "
"touch {seed_dir}/meta-data && "
"echo 'seedfrom: {seed_dir}/' > "
"/var/lib/cloud/seed/nocloud-net/meta-data".format(seed_dir=seed_dir)
)
assert result.return_code == 0
client.write_to_file(
"{}/vendor-data".format(seed_dir),
VENDOR_DATA,
)
client.execute("cloud-init clean --logs")
client.restart()
assert client.execute("cloud-init status").ok
assert "seeded_vendordata_test_file" in client.execute("ls /var/tmp")
|