diff --git a/cmd/manager/start.go b/cmd/manager/start.go index e1a05533d..65a7e502a 100644 --- a/cmd/manager/start.go +++ b/cmd/manager/start.go @@ -14,8 +14,6 @@ import ( func StartCmd(ctx context.Context, name string) *cobra.Command { var ( - dataDir string - disableWebsocket bool ) @@ -24,7 +22,10 @@ func StartCmd(ctx context.Context, name string) *cobra.Command { Short: fmt.Sprintf("Start the %s cluster manager", name), PreRun: func(cmd *cobra.Command, args []string) { // init runtime config and relevant env vars - runtimeconfig.ApplyFlags(cmd.Flags()) + if dataDir := os.Getenv("DATA_DIR"); dataDir != "" { + runtimeconfig.SetDataDir(dataDir) + } + os.Setenv("KUBECONFIG", runtimeconfig.PathToKubeConfig()) os.Setenv("TMPDIR", runtimeconfig.EmbeddedClusterTmpSubDir()) }, @@ -52,8 +53,6 @@ func StartCmd(ctx context.Context, name string) *cobra.Command { }, } - cmd.Flags().StringVar(&dataDir, "data-dir", "", "Path to the data directory") - // flags to enable running in test mode cmd.Flags().BoolVar(&disableWebsocket, "disable-websocket", false, "When set, don't connect to the KOTS webscoket") cmd.Flags().MarkHidden("disable-websocket") diff --git a/pkg/manager/install.go b/pkg/manager/install.go index df8dbec3a..c09e9c917 100644 --- a/pkg/manager/install.go +++ b/pkg/manager/install.go @@ -15,6 +15,8 @@ var ( _systemdUnitFileContents []byte managerDropInFileContents = `[Service] +Environment="DATA_DIR=%s" + # Empty ExecStart= will clear out the previous ExecStart value ExecStart= ExecStart=%s start @@ -138,6 +140,7 @@ func writeSystemdUnitFile() error { func writeDropInFile() error { contents := fmt.Sprintf( managerDropInFileContents, + runtimeconfig.EmbeddedClusterHomeDirectory(), runtimeconfig.PathToEmbeddedClusterBinary("manager"), ) err := systemd.WriteDropInFile(UnitName(), "embedded-cluster.conf", []byte(contents)) diff --git a/tests/integration/manager/Makefile b/tests/integration/manager/Makefile index f7ab70fbf..f829f92e5 100644 --- a/tests/integration/manager/Makefile +++ b/tests/integration/manager/Makefile @@ -28,7 +28,7 @@ test: .PHONY: clean clean: - rm -f manager.test + rm -f manager.test ../../../pkg/goods/bins/manager -docker rm -f $(CONTAINER_NAME) 2>/dev/null ; true .PHONY: build diff --git a/tests/integration/manager/install_test.go b/tests/integration/manager/install_test.go index 108455469..bed799ed1 100644 --- a/tests/integration/manager/install_test.go +++ b/tests/integration/manager/install_test.go @@ -4,6 +4,8 @@ import ( "context" "os" "os/exec" + "path/filepath" + "strings" "testing" "time" @@ -13,13 +15,42 @@ import ( "github.com/stretchr/testify/require" ) +const ( + kubeconfigContents = `apiVersion: v1 +kind: Config +clusters: +- name: dummy + cluster: + api-version: v1 + server: http://example.com +contexts: +- name: dummy + context: + cluster: dummy + namespace: dummy + user: dummy +users: +- name: dummy + user: + token: dummy +current-context: dummy +` +) + func TestManagerInstall(t *testing.T) { ctx := context.Background() - runtimeconfig.SetDataDir(getDataDir(t)) + dataDir := getDataDir(t) + runtimeconfig.SetDataDir(dataDir) + + // Write a dummy kubeconfig to the data dir + err := os.MkdirAll(filepath.Dir(runtimeconfig.PathToKubeConfig()), 0755) + require.NoError(t, err, "failed to create kubeconfig directory") + err = os.WriteFile(runtimeconfig.PathToKubeConfig(), []byte(kubeconfigContents), 0644) + require.NoError(t, err, "failed to write kubeconfig") manager.SetServiceName("ec") - err := manager.Install(ctx, t.Logf) + err = manager.Install(ctx, t.Logf) require.NoError(t, err, "failed to install manager") // Verify service files exists @@ -28,14 +59,16 @@ func TestManagerInstall(t *testing.T) { dropInDirExists := checkFileExists(t, "/etc/systemd/system/ec-manager.service.d") assert.True(t, dropInDirExists, "ec-manager.service.d drop-in directory should exist") - // Wait for service to start and become ready - // TODO: this should be added to the manager package - time.Sleep(5 * time.Second) - // Verify service is enabled and running status := getServiceStatus(t, "ec-manager.service") assert.Contains(t, status, "enabled", "service should be enabled") - assert.Contains(t, status, "active (running)", "service should be running") + + // Wait for service to start and become ready + // TODO: this should be added to the manager package + assert.Eventually(t, func() bool { + status := getServiceStatus(t, "ec-manager.service") + return strings.Contains(status, "active (running)") + }, 10*time.Second, 1*time.Second, "service should be running") err = manager.Uninstall(ctx, t.Logf) require.NoError(t, err, "failed to uninstall manager")