1
0
mirror of https://github.com/lxc/distrobuilder.git synced 2026-02-05 15:46:17 +01:00
Files
distrobuilder/generators/cloud-init_test.go
Stéphane Graber 57091a0e63 Fix golang-ci reported issues
Signed-off-by: Stéphane Graber <stgraber@stgraber.org>
2025-04-02 14:37:13 -04:00

167 lines
4.3 KiB
Go

package generators
import (
"context"
"fmt"
"log"
"os"
"path/filepath"
"testing"
incus "github.com/lxc/incus/v6/shared/util"
"github.com/stretchr/testify/require"
"github.com/lxc/distrobuilder/image"
"github.com/lxc/distrobuilder/shared"
)
func TestCloudInitGeneratorRunLXC(t *testing.T) {
cacheDir, err := os.MkdirTemp(os.TempDir(), "distrobuilder-test-")
require.NoError(t, err)
rootfsDir := filepath.Join(cacheDir, "rootfs")
setup(t, cacheDir)
defer teardown(cacheDir)
generator, err := Load("cloud-init", nil, cacheDir, rootfsDir, shared.DefinitionFile{}, shared.Definition{})
require.IsType(t, &cloudInit{}, generator)
require.NoError(t, err)
// Prepare rootfs
err = os.MkdirAll(filepath.Join(rootfsDir, "etc", "runlevels"), 0o755)
require.NoError(t, err)
err = os.MkdirAll(filepath.Join(rootfsDir, "etc", "cloud"), 0o755)
require.NoError(t, err)
for _, f := range []string{"cloud-init-local", "cloud-config", "cloud-init", "cloud-final"} {
fullPath := filepath.Join(rootfsDir, "etc", "runlevels", f)
err = os.Symlink("/dev/null", fullPath)
require.NoError(t, err)
require.FileExists(t, fullPath)
}
// Disable cloud-init
err = generator.RunLXC(nil, shared.DefinitionTargetLXC{})
require.NoError(t, err)
// Check whether the generator has altered the rootfs
for _, f := range []string{"cloud-init-local", "cloud-config", "cloud-init", "cloud-final"} {
fullPath := filepath.Join(rootfsDir, "etc", "runlevels", f)
require.Falsef(t, incus.PathExists(fullPath), "File '%s' exists but shouldn't", fullPath)
}
for i := 0; i <= 6; i++ {
dir := filepath.Join(rootfsDir, "etc", "rc.d", fmt.Sprintf("rc%d.d", i))
for _, f := range []string{"cloud-init-local", "cloud-config", "cloud-init", "cloud-final"} {
fullPath := filepath.Join(dir, fmt.Sprintf("S99%s", f))
require.Falsef(t, incus.PathExists(fullPath), "File '%s' exists but shouldn't", fullPath)
}
}
require.FileExists(t, filepath.Join(rootfsDir, "etc", "cloud", "cloud-init.disabled"))
}
func TestCloudInitGeneratorRunIncus(t *testing.T) {
cacheDir, err := os.MkdirTemp(os.TempDir(), "distrobuilder-test-")
require.NoError(t, err)
rootfsDir := filepath.Join(cacheDir, "rootfs")
setup(t, cacheDir)
defer teardown(cacheDir)
definition := shared.Definition{
Image: shared.DefinitionImage{
Distribution: "ubuntu",
Release: "artful",
},
}
image := image.NewIncusImage(context.TODO(), cacheDir, "", cacheDir, definition)
tests := []struct {
name string
expected string
shouldFail bool
}{
{
"user-data",
`{%- if config_get("cloud-init.user-data", properties.default) == properties.default -%}
{{ config_get("user.user-data", properties.default) }}
{%- else -%}
{{- config_get("cloud-init.user-data", properties.default) }}
{%- endif %}
`,
false,
},
{
"meta-data",
`instance-id: {{ container.name }}
local-hostname: {{ container.name }}
{{ config_get("user.meta-data", "") }}
`,
false,
},
{
"vendor-data",
`{%- if config_get("cloud-init.vendor-data", properties.default) == properties.default -%}
{{ config_get("user.vendor-data", properties.default) }}
{%- else -%}
{{- config_get("cloud-init.vendor-data", properties.default) }}
{%- endif %}
`,
false,
},
{
"network-config",
`{%- if config_get("cloud-init.network-config", "") == "" -%}
{%- if config_get("user.network-config", "") == "" -%}
version: 1
config:
- type: physical
name: {% if instance.type == "virtual-machine" %}enp5s0{% else %}eth0{% endif %}
subnets:
- type: dhcp
control: auto
{%- else -%}
{{- config_get("user.network-config", "") -}}
{%- endif -%}
{%- else -%}
{{- config_get("cloud-init.network-config", "") -}}
{%- endif %}
`,
false,
},
{
"foo",
"Unknown cloud-init configuration: foo",
true,
},
}
for i, tt := range tests {
log.Printf("Running test #%d: %s", i, tt.name)
generator, err := Load("cloud-init", nil, cacheDir, rootfsDir, shared.DefinitionFile{
Generator: "cloud-init",
Name: tt.name,
}, shared.Definition{})
require.IsType(t, &cloudInit{}, generator)
require.NoError(t, err)
err = generator.RunIncus(image, shared.DefinitionTargetIncus{})
if !tt.shouldFail {
require.NoError(t, err)
} else {
require.Regexp(t, tt.expected, err)
continue
}
validateTestFile(t, filepath.Join(cacheDir, "templates", fmt.Sprintf("cloud-init-%s.tpl", tt.name)), tt.expected)
}
}