diff --git a/pkg/uki/common.go b/pkg/uki/common.go index bc498a1..206079d 100644 --- a/pkg/uki/common.go +++ b/pkg/uki/common.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "os" + "path/filepath" "strings" "github.com/kairos-io/kairos-agent/v2/pkg/constants" @@ -35,9 +36,17 @@ func overwriteArtifactSetRole(fs v1.FS, dir, oldRole, newRole string, logger sdk } // copy the source file but rename the base name to as -func copyArtifact(source, oldRole, newRole string) (string, error) { - newName := strings.ReplaceAll(source, oldRole, newRole) - return newName, copyFile(source, newName) +func copyArtifact(fs v1.FS, source, oldRole, newRole string) (string, error) { + dir := filepath.Dir(source) + base := filepath.Base(source) + + // Replace the substring in the base name + newBase := strings.ReplaceAll(base, oldRole, newRole) + + // Join the directory and the new base name + newName := filepath.Join(dir, newBase) + + return newName, fsutils.Copy(fs, source, newName) } func removeArtifactSetWithRole(fs v1.FS, artifactDir, role string) error { @@ -55,11 +64,16 @@ func copyArtifactSetRole(fs v1.FS, artifactDir, oldRole, newRole string, logger if err != nil { return err } + + if info.IsDir() { + return nil + } + if !strings.HasPrefix(info.Name(), oldRole) { return nil } - newPath, err := copyArtifact(path, oldRole, newRole) + newPath, err := copyArtifact(fs, path, oldRole, newRole) if err != nil { return fmt.Errorf("copying artifact from %s to %s: %w", path, newPath, err) } diff --git a/pkg/uki/common_test.go b/pkg/uki/common_test.go new file mode 100644 index 0000000..8343862 --- /dev/null +++ b/pkg/uki/common_test.go @@ -0,0 +1,64 @@ +package uki + +import ( + "bytes" + "os" + + cnst "github.com/kairos-io/kairos-agent/v2/pkg/constants" + fsutils "github.com/kairos-io/kairos-agent/v2/pkg/utils/fs" + sdkTypes "github.com/kairos-io/kairos-sdk/types" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "github.com/twpayne/go-vfs/v4" + "github.com/twpayne/go-vfs/v4/vfst" +) + +var _ = Describe("Common functions tests", func() { + Describe("copyArtifactSetRole", func() { + var fs vfs.FS + var err error + var memLog *bytes.Buffer + var logger sdkTypes.KairosLogger + + BeforeEach(func() { + fs, _, err = vfst.NewTestFS(map[string]interface{}{}) + Expect(err).ToNot(HaveOccurred()) + + logger = sdkTypes.NewBufferLogger(memLog) + logger.SetLevel("debug") + + Expect(fsutils.MkdirAll(fs, "/active", cnst.DirPerm)).ToNot(HaveOccurred()) + Expect(fsutils.MkdirAll(fs, "/other", cnst.DirPerm)).ToNot(HaveOccurred()) + + f, err := fs.Create("/other/active.efi") + Expect(err).ToNot(HaveOccurred()) + + _, err = os.Stat(f.Name()) + Expect(err).ToNot(HaveOccurred()) + + f, err = fs.Create("/other/other.efi") + Expect(err).ToNot(HaveOccurred()) + + _, err = os.Stat(f.Name()) + Expect(err).ToNot(HaveOccurred()) + }) + + It("skips directories", func() { + err = copyArtifactSetRole(fs, "/", "active", "passive", logger) + Expect(err).ToNot(HaveOccurred()) + }) + + It("replaces only the base file name", func() { + err = copyArtifactSetRole(fs, "/other", "other", "newother", logger) + Expect(err).ToNot(HaveOccurred()) + + glob, _ := fs.Glob("/other/*") + Expect(glob).To(HaveExactElements([]string{ + "/other/active.efi", + "/other/newother.efi", + "/other/other.efi", + })) + }) + }) +}) diff --git a/pkg/uki/suite_test.go b/pkg/uki/suite_test.go new file mode 100644 index 0000000..ce3a0ad --- /dev/null +++ b/pkg/uki/suite_test.go @@ -0,0 +1,13 @@ +package uki_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestActionSuite(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Uki test suite") +}