mirror of
https://github.com/psviderski/uncloud.git
synced 2026-08-26 19:13:34 +00:00
115 lines
3.1 KiB
Go
115 lines
3.1 KiB
Go
package e2e
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/psviderski/uncloud/internal/ucind"
|
|
"github.com/psviderski/uncloud/pkg/api"
|
|
"github.com/psviderski/uncloud/pkg/client/compose"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestComposeConfigs(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
clusterName := "ucind-test.compose-configs"
|
|
ctx := context.Background()
|
|
c, _ := createTestCluster(t, clusterName, ucind.CreateClusterOptions{Machines: 1}, true)
|
|
|
|
machine := c.Machines[0]
|
|
cli, err := machine.Connect(ctx)
|
|
require.NoError(t, err)
|
|
|
|
t.Run("basic configs", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
name := "web"
|
|
t.Cleanup(func() {
|
|
removeServices(t, cli, name)
|
|
})
|
|
|
|
project, err := compose.LoadProject(ctx, []string{"fixtures/compose-configs.yaml"})
|
|
require.NoError(t, err)
|
|
|
|
deploy, err := compose.NewDeployment(ctx, cli, project)
|
|
require.NoError(t, err)
|
|
|
|
plan, err := deploy.Plan(ctx)
|
|
require.NoError(t, err)
|
|
assert.Len(t, plan.Operations, 1, "Expected 1 service deployment")
|
|
|
|
err = deploy.Run(ctx)
|
|
require.NoError(t, err)
|
|
|
|
svc, err := cli.InspectService(ctx, name)
|
|
require.NoError(t, err)
|
|
|
|
expectedSpec := api.ServiceSpec{
|
|
Name: name,
|
|
Mode: api.ServiceModeReplicated,
|
|
Container: api.ContainerSpec{
|
|
Command: []string{"sleep", "600"},
|
|
Image: "busybox:1.37.0-uclibc",
|
|
ConfigMounts: []api.ConfigMount{
|
|
{
|
|
ConfigName: "from-file",
|
|
ContainerPath: "/etc/config-from-file.conf",
|
|
Mode: func() *os.FileMode { m := os.FileMode(0o644); return &m }(),
|
|
},
|
|
{
|
|
ConfigName: "from-inline",
|
|
ContainerPath: "/etc/config-inline.conf",
|
|
Uid: "1000",
|
|
Gid: "1000",
|
|
Mode: func() *os.FileMode { m := os.FileMode(0o600); return &m }(),
|
|
},
|
|
},
|
|
},
|
|
Configs: []api.ConfigSpec{
|
|
{
|
|
Name: "from-file",
|
|
Content: []byte("this is file config\n"),
|
|
},
|
|
{
|
|
Name: "from-inline",
|
|
Content: []byte("this is inline config\n"),
|
|
},
|
|
},
|
|
Replicas: 1,
|
|
}
|
|
assertServiceMatchesSpec(t, svc, expectedSpec)
|
|
|
|
// Verify deployment is up-to-date after initial deployment
|
|
deploy, err = compose.NewDeployment(ctx, cli, project)
|
|
require.NoError(t, err)
|
|
|
|
plan, err = deploy.Plan(ctx)
|
|
require.NoError(t, err)
|
|
assert.Len(t, plan.Operations, 0, "Expected no new operations after configs deployment")
|
|
|
|
// Verify the config files are actually created in the container and contain expected content
|
|
containerName := svc.Containers[0].Container.Name
|
|
|
|
configContentFirst, err := readFileInfoInContainer(t, cli, name, containerName, "/etc/config-from-file.conf")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, fileInfo{
|
|
permissions: 0o644,
|
|
content: "this is file config\n",
|
|
userId: 0,
|
|
groupId: 0,
|
|
}, configContentFirst)
|
|
|
|
configContentSecond, err := readFileInfoInContainer(t, cli, name, containerName, "/etc/config-inline.conf")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, fileInfo{
|
|
permissions: 0o600,
|
|
content: "this is inline config\n",
|
|
userId: 1000,
|
|
groupId: 1000,
|
|
}, configContentSecond)
|
|
})
|
|
}
|