debian-forge-composer/internal/cloudapi/v2/compose_test.go
Brian C. Lane 7438e29375 cloudapi: Create a compose using the blueprint data
If the request includes a blueprint (and not customizations) it uses
that blueprint for the compose.
2024-01-15 11:48:35 +01:00

319 lines
8.5 KiB
Go

package v2
import (
"testing"
"github.com/osbuild/images/pkg/disk"
"github.com/osbuild/images/pkg/subscription"
"github.com/osbuild/osbuild-composer/internal/blueprint"
"github.com/osbuild/osbuild-composer/internal/common"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestGetBlueprintFromCustomizations(t *testing.T) {
// Empty request should return empty blueprint
cr := ComposeRequest{}
bp, err := cr.GetBlueprintFromCustomizations()
require.Nil(t, err)
assert.Equal(t, "empty blueprint", bp.Name)
assert.Equal(t, "0.0.0", bp.Version)
assert.Nil(t, bp.Customizations)
// Empty request should return empty blueprint
cr = ComposeRequest{
Customizations: &Customizations{},
}
bp, err = cr.GetBlueprintFromCustomizations()
require.Nil(t, err)
assert.Equal(t, "empty blueprint", bp.Name)
assert.Equal(t, "0.0.0", bp.Version)
assert.Nil(t, bp.Customizations)
// Test with customizations
expected := blueprint.Blueprint{Name: "empty blueprint"}
err = expected.Initialize()
require.Nil(t, err)
// interface{} is a terrible idea. Work around it...
var rootStr interface{} = "root"
// Construct the compose request with customizations
cr = ComposeRequest{Customizations: &Customizations{
Users: &[]User{
User{
Name: "admin",
Key: common.ToPtr("dummy ssh-key"),
Groups: &[]string{"users", "wheel"},
}},
Packages: &[]string{"bash", "tmux"},
Containers: &[]Container{
Container{
Name: common.ToPtr("container-name"),
Source: "http://some.path.to/a/container/source",
},
},
Directories: &[]Directory{
Directory{
Path: "/opt/extra",
EnsureParents: common.ToPtr(true),
User: &rootStr,
Group: &rootStr,
Mode: common.ToPtr("0755"),
},
},
Files: &[]File{
File{
Path: "/etc/mad.conf",
Data: common.ToPtr("Alfred E. Neuman was here.\n"),
EnsureParents: common.ToPtr(true),
User: &rootStr,
Group: &rootStr,
Mode: common.ToPtr("0644"),
},
},
Filesystem: &[]Filesystem{
Filesystem{
Mountpoint: "/var/lib/wopr/",
MinSize: 1099511627776,
},
},
Services: &Services{
Disabled: &[]string{"cleanup"},
Enabled: &[]string{"sshd"},
},
Openscap: &OpenSCAP{ProfileId: "B 263-59"},
CustomRepositories: &[]CustomRepository{
CustomRepository{
Id: "custom repo",
Metalink: common.ToPtr("http://example.org/metalink"),
CheckGpg: common.ToPtr(true),
Enabled: common.ToPtr(true),
ModuleHotfixes: common.ToPtr(true),
},
},
Firewall: &FirewallCustomization{
Ports: common.ToPtr([]string{
"22/tcp",
}),
},
Hostname: common.ToPtr("hostname"),
InstallationDevice: common.ToPtr("/dev/sda"),
Kernel: &Kernel{
Append: common.ToPtr("nosmt=force"),
Name: common.ToPtr("kernel-debug"),
},
Locale: &Locale{
Keyboard: common.ToPtr("us"),
Languages: common.ToPtr([]string{
"en_US.UTF-8",
}),
},
Fdo: &FDO{
DiunPubKeyHash: common.ToPtr("pubkeyhash"),
DiunPubKeyInsecure: common.ToPtr("pubkeyinsecure"),
DiunPubKeyRootCerts: common.ToPtr("pubkeyrootcerts"),
ManufacturingServerUrl: common.ToPtr("serverurl"),
DiMfgStringTypeMacIface: common.ToPtr("iface"),
},
Ignition: &Ignition{
Firstboot: &IgnitionFirstboot{
Url: "provisioning-url.local",
},
},
Timezone: &Timezone{
Timezone: common.ToPtr("US/Eastern"),
Ntpservers: common.ToPtr([]string{
"0.north-america.pool.ntp.org",
"1.north-america.pool.ntp.org",
}),
},
Fips: &FIPS{Enabled: common.ToPtr(true)},
}}
// Construct the expected blueprint result
// Packages
expected.Packages = []blueprint.Package{
{Name: "bash"},
{Name: "tmux"},
}
// Containers
expected.Containers = []blueprint.Container{
blueprint.Container{
Name: "container-name",
Source: "http://some.path.to/a/container/source",
},
}
// Customizations
expected.Customizations = &blueprint.Customizations{
User: []blueprint.UserCustomization{
blueprint.UserCustomization{
Name: "admin",
Key: common.ToPtr("dummy ssh-key"),
Groups: []string{"users", "wheel"},
},
},
Directories: []blueprint.DirectoryCustomization{
blueprint.DirectoryCustomization{
Path: "/opt/extra",
User: "root",
Group: "root",
Mode: "0755",
EnsureParents: true,
},
},
Files: []blueprint.FileCustomization{
blueprint.FileCustomization{
Path: "/etc/mad.conf",
User: "root",
Group: "root",
Mode: "0644",
Data: "Alfred E. Neuman was here.\n",
},
},
Filesystem: []blueprint.FilesystemCustomization{
blueprint.FilesystemCustomization{
Mountpoint: "/var/lib/wopr/",
MinSize: 1099511627776,
},
},
Services: &blueprint.ServicesCustomization{
Enabled: []string{"sshd"},
Disabled: []string{"cleanup"},
},
OpenSCAP: &blueprint.OpenSCAPCustomization{
ProfileID: "B 263-59",
},
Repositories: []blueprint.RepositoryCustomization{
blueprint.RepositoryCustomization{
Id: "custom repo",
Metalink: "http://example.org/metalink",
Enabled: common.ToPtr(true),
GPGCheck: common.ToPtr(true),
ModuleHotfixes: common.ToPtr(true),
},
},
Firewall: &blueprint.FirewallCustomization{
Ports: []string{
"22/tcp",
},
},
Hostname: common.ToPtr("hostname"),
InstallationDevice: "/dev/sda",
Kernel: &blueprint.KernelCustomization{
Append: "nosmt=force",
Name: "kernel-debug",
},
Locale: &blueprint.LocaleCustomization{
Keyboard: common.ToPtr("us"),
Languages: []string{
"en_US.UTF-8",
},
},
FDO: &blueprint.FDOCustomization{
DiunPubKeyHash: "pubkeyhash",
DiunPubKeyInsecure: "pubkeyinsecure",
DiunPubKeyRootCerts: "pubkeyrootcerts",
ManufacturingServerURL: "serverurl",
DiMfgStringTypeMacIface: "iface",
},
Ignition: &blueprint.IgnitionCustomization{
FirstBoot: &blueprint.FirstBootIgnitionCustomization{
ProvisioningURL: "provisioning-url.local",
},
},
Timezone: &blueprint.TimezoneCustomization{
Timezone: common.ToPtr("US/Eastern"),
NTPServers: []string{
"0.north-america.pool.ntp.org",
"1.north-america.pool.ntp.org",
},
},
FIPS: common.ToPtr(true),
}
bp, err = cr.GetBlueprintFromCustomizations()
require.Nil(t, err)
assert.Equal(t, bp, expected)
}
func TestGetPayloadRepositories(t *testing.T) {
// Empty PayloadRepositories
cr := ComposeRequest{}
repos := cr.GetPayloadRepositories()
assert.Len(t, repos, 0)
assert.Equal(t, []Repository(nil), repos)
// Populated PayloadRepositories
cr = ComposeRequest{Customizations: &Customizations{
PayloadRepositories: &[]Repository{
Repository{
Baseurl: common.ToPtr("http://example.org/pub/linux/repo"),
CheckGpg: common.ToPtr(true),
PackageSets: &[]string{"build", "archive"},
Rhsm: common.ToPtr(false),
ModuleHotfixes: common.ToPtr(true),
},
},
}}
expected := []Repository{
Repository{
Baseurl: common.ToPtr("http://example.org/pub/linux/repo"),
CheckGpg: common.ToPtr(true),
PackageSets: &[]string{"build", "archive"},
Rhsm: common.ToPtr(false),
ModuleHotfixes: common.ToPtr(true),
},
}
repos = cr.GetPayloadRepositories()
assert.Len(t, repos, 1)
assert.Equal(t, expected, repos)
}
func TestGetSubscriptions(t *testing.T) {
// Empty Subscription
cr := ComposeRequest{}
sub := cr.GetSubscription()
assert.Equal(t, (*subscription.ImageOptions)(nil), sub)
// Populated Subscription
cr = ComposeRequest{Customizations: &Customizations{
Subscription: common.ToPtr(Subscription{
ActivationKey: "key",
BaseUrl: "http://example.org/baseurl",
Insights: false,
Organization: "Weyland-Yutani",
ServerUrl: "http://example.org/serverurl",
}),
}}
expected := &subscription.ImageOptions{
ActivationKey: "key",
BaseUrl: "http://example.org/baseurl",
Insights: false,
Organization: "Weyland-Yutani",
ServerUrl: "http://example.org/serverurl",
}
sub = cr.GetSubscription()
assert.Equal(t, expected, sub)
}
func TestGetPartitioningMode(t *testing.T) {
// Empty Partitioning Mode
cr := ComposeRequest{}
_, err := cr.GetPartitioningMode()
assert.NoError(t, err)
// Populated PartitioningMode
cr = ComposeRequest{Customizations: &Customizations{
PartitioningMode: common.ToPtr(CustomizationsPartitioningModeAutoLvm),
}}
pm, err := cr.GetPartitioningMode()
assert.NoError(t, err)
assert.Equal(t, disk.AutoLVMPartitioningMode, pm)
}