Skip to content

Commit

Permalink
cloudapi: Add testing for blueprint compose request
Browse files Browse the repository at this point in the history
This tests to make sure the blueprint produced by the customizations
data and the blueprint data are identical.
  • Loading branch information
bcl committed Jan 9, 2024
1 parent 4fa4e48 commit 434ce4b
Showing 1 changed file with 241 additions and 96 deletions.
337 changes: 241 additions & 96 deletions internal/cloudapi/v2/compose_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,125 @@ import (
"github.com/stretchr/testify/require"
)

// GetTestBlueprint returns a populated blueprint
// This is used in testing the Customizations compose request
// and the Blueprint compose request.
// They both result in the same final blueprint used to create the compose
func GetTestBlueprint() blueprint.Blueprint {
// Test with customizations
expected := blueprint.Blueprint{Name: "empty blueprint"}
err := expected.Initialize()
// An empty blueprint should never fail to initialize
if err != nil {
panic(err)
}

// 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),
}

return expected
}

func TestGetBlueprintFromCustomizations(t *testing.T) {
// Empty request should return empty blueprint
cr := ComposeRequest{}
Expand All @@ -31,11 +150,6 @@ func TestGetBlueprintFromCustomizations(t *testing.T) {
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"

Expand Down Expand Up @@ -114,8 +228,8 @@ func TestGetBlueprintFromCustomizations(t *testing.T) {
DiunPubKeyHash: common.ToPtr("pubkeyhash"),
DiunPubKeyInsecure: common.ToPtr("pubkeyinsecure"),
DiunPubKeyRootCerts: common.ToPtr("pubkeyrootcerts"),
ManufacturingServerUrl: common.ToPtr("serverurl"),
DiMfgStringTypeMacIface: common.ToPtr("iface"),
ManufacturingServerUrl: common.ToPtr("serverurl"),
},
Ignition: &Ignition{
Firstboot: &IgnitionFirstboot{
Expand All @@ -132,111 +246,142 @@ func TestGetBlueprintFromCustomizations(t *testing.T) {
Fips: &FIPS{Enabled: common.ToPtr(true)},
}}

// Construct the expected blueprint result
// Packages
expected.Packages = []blueprint.Package{
{Name: "bash"},
{Name: "tmux"},
}
bp, err = cr.GetBlueprintFromCustomizations()
require.Nil(t, err)
assert.Equal(t, GetTestBlueprint(), bp)
}

// Containers
expected.Containers = []blueprint.Container{
blueprint.Container{
Name: "container-name",
Source: "http://some.path.to/a/container/source",
},
func TestGetBlueprintFromCompose(t *testing.T) {
// Empty request should return empty blueprint
cr := ComposeRequest{}
bp, err := cr.GetBlueprintFromCompose()
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{
Blueprint: &Blueprint{},
}
bp, err = cr.GetBlueprintFromCompose()
require.Nil(t, err)
assert.Equal(t, "empty blueprint", bp.Name)
assert.Equal(t, "0.0.0", bp.Version)
assert.Nil(t, bp.Customizations)

// Customizations
expected.Customizations = &blueprint.Customizations{
User: []blueprint.UserCustomization{
blueprint.UserCustomization{
Name: "admin",
Key: common.ToPtr("dummy ssh-key"),
Groups: []string{"users", "wheel"},
// interface{} is a terrible idea. Work around it...
var rootStr interface{} = "root"

// Construct the compose request with a blueprint
cr = ComposeRequest{Blueprint: &Blueprint{
Name: "empty blueprint",
Version: common.ToPtr("0.0.0"),
Packages: &[]Package{{Name: "bash"}, {Name: "tmux"}},
Containers: &[]Container{
Container{
Name: common.ToPtr("container-name"),
Source: "http://some.path.to/a/container/source",
},
},
Directories: []blueprint.DirectoryCustomization{
blueprint.DirectoryCustomization{
Path: "/opt/extra",
User: "root",
Group: "root",
Mode: "0755",
EnsureParents: true,
Customizations: &BlueprintCustomizations{
User: &[]BlueprintUser{
{
Name: "admin",
Key: common.ToPtr("dummy ssh-key"),
Groups: &[]string{"users", "wheel"},
}},
Directories: &[]Directory{
Directory{
Path: "/opt/extra",
EnsureParents: common.ToPtr(true),
User: &rootStr,
Group: &rootStr,
Mode: common.ToPtr("0755"),
},
},
},
Files: []blueprint.FileCustomization{
blueprint.FileCustomization{
Path: "/etc/mad.conf",
User: "root",
Group: "root",
Mode: "0644",
Data: "Alfred E. Neuman was here.\n",
Files: &[]BlueprintFile{
{
Path: "/etc/mad.conf",
Data: common.ToPtr("Alfred E. Neuman was here.\n"),
User: &rootStr,
Group: &rootStr,
Mode: common.ToPtr("0644"),
},
},
},
Filesystem: []blueprint.FilesystemCustomization{
blueprint.FilesystemCustomization{
Mountpoint: "/var/lib/wopr/",
MinSize: 1099511627776,
Filesystem: &[]BlueprintFilesystem{
{
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),
Services: &Services{
Disabled: &[]string{"cleanup"},
Enabled: &[]string{"sshd"},
},
},
Firewall: &blueprint.FirewallCustomization{
Ports: []string{
"22/tcp",
Openscap: &BlueprintOpenSCAP{ProfileId: "B 263-59"},
Repositories: &[]BlueprintRepository{
{
Id: "custom repo",
Metalink: common.ToPtr("http://example.org/metalink"),
Gpgcheck: common.ToPtr(true),
Enabled: common.ToPtr(true),
ModuleHotfixes: common.ToPtr(true),
},
},
},
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",
Firewall: &BlueprintFirewall{
Ports: common.ToPtr([]string{
"22/tcp",
}),
},
},
FDO: &blueprint.FDOCustomization{
DiunPubKeyHash: "pubkeyhash",
DiunPubKeyInsecure: "pubkeyinsecure",
DiunPubKeyRootCerts: "pubkeyrootcerts",
ManufacturingServerURL: "serverurl",
DiMfgStringTypeMacIface: "iface",
},
Ignition: &blueprint.IgnitionCustomization{
FirstBoot: &blueprint.FirstBootIgnitionCustomization{
ProvisioningURL: "provisioning-url.local",
Hostname: common.ToPtr("hostname"),
InstallationDevice: common.ToPtr("/dev/sda"),
Kernel: &Kernel{
Append: common.ToPtr("nosmt=force"),
Name: common.ToPtr("kernel-debug"),
},
},
Timezone: &blueprint.TimezoneCustomization{
Timezone: common.ToPtr("US/Eastern"),
NTPServers: []string{
"0.north-america.pool.ntp.org",
"1.north-america.pool.ntp.org",
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"),
DiMfgStringTypeMacIface: common.ToPtr("iface"),
ManufacturingServerUrl: common.ToPtr("serverurl"),
},
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: common.ToPtr(true),
},
FIPS: common.ToPtr(true),
}
bp, err = cr.GetBlueprintFromCustomizations()
}}

bp, err = cr.GetBlueprintFromCompose()
require.Nil(t, err)
assert.Equal(t, bp, expected)
assert.Equal(t, GetTestBlueprint(), bp)
}

func TestGetBlueprint(t *testing.T) {
cr := ComposeRequest{}
bp, err := cr.GetBlueprint()
require.Nil(t, err)
require.Nil(t, err)
assert.Equal(t, "empty blueprint", bp.Name)
assert.Equal(t, "0.0.0", bp.Version)
assert.Nil(t, bp.Customizations)
}

func TestGetPayloadRepositories(t *testing.T) {
Expand Down

0 comments on commit 434ce4b

Please sign in to comment.