diff --git a/go.mod b/go.mod index a0e52f84..0edc567d 100644 --- a/go.mod +++ b/go.mod @@ -40,6 +40,7 @@ require ( github.com/mattn/go-tty v0.0.3 github.com/mitchellh/go-homedir v1.1.0 github.com/morikuni/aec v1.0.0 // indirect + github.com/otiai10/copy v1.1.1 github.com/pkg/errors v0.8.1 github.com/qlik-oss/k-apis v0.0.36 github.com/robfig/cron/v3 v3.0.1 diff --git a/go.sum b/go.sum index f6543b8e..417a4047 100644 --- a/go.sum +++ b/go.sum @@ -792,6 +792,12 @@ github.com/opencontainers/selinux v1.3.0 h1:xsI95WzPZu5exzA6JzkLSfdr/DilzOhCJOqG github.com/opencontainers/selinux v1.3.0/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs= github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 h1:TnbXhKzrTOyuvWrjI8W6pcoI9XPbLHFXCdN2dtUw7Rw= github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc= +github.com/otiai10/copy v1.1.1 h1:PH7IFlRQ6Fv9vYmuXbDRLdgTHoP1w483kPNUP2bskpo= +github.com/otiai10/copy v1.1.1/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= diff --git a/pkg/api/copy.go b/pkg/api/copy.go index 55c8cabf..b1f23684 100644 --- a/pkg/api/copy.go +++ b/pkg/api/copy.go @@ -1,111 +1,8 @@ package api -import ( - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "syscall" -) +import "github.com/otiai10/copy" -func CopyDirectory(scrDir, dest string) error { - entries, err := ioutil.ReadDir(scrDir) - if err != nil { - return err - } - for _, entry := range entries { - sourcePath := filepath.Join(scrDir, entry.Name()) - destPath := filepath.Join(dest, entry.Name()) - - fileInfo, err := os.Stat(sourcePath) - if err != nil { - return err - } - - stat, ok := fileInfo.Sys().(*syscall.Stat_t) - if !ok { - return fmt.Errorf("failed to get raw syscall.Stat_t data for '%s'", sourcePath) - } - - switch fileInfo.Mode() & os.ModeType { - case os.ModeDir: - if err := CreateIfNotExists(destPath, 0755); err != nil { - return err - } - if err := CopyDirectory(sourcePath, destPath); err != nil { - return err - } - case os.ModeSymlink: - if err := CopySymLink(sourcePath, destPath); err != nil { - return err - } - default: - if err := Copy(sourcePath, destPath); err != nil { - return err - } - } - - if err := os.Lchown(destPath, int(stat.Uid), int(stat.Gid)); err != nil { - return err - } - - isSymlink := entry.Mode()&os.ModeSymlink != 0 - if !isSymlink { - if err := os.Chmod(destPath, entry.Mode()); err != nil { - return err - } - } - } - return nil -} - -func Copy(srcFile, dstFile string) error { - out, err := os.Create(dstFile) - if err != nil { - return err - } - - defer out.Close() - - in, err := os.Open(srcFile) - defer in.Close() - if err != nil { - return err - } - - _, err = io.Copy(out, in) - if err != nil { - return err - } - - return nil -} - -func Exists(filePath string) bool { - if _, err := os.Stat(filePath); os.IsNotExist(err) { - return false - } - - return true -} - -func CreateIfNotExists(dir string, perm os.FileMode) error { - if Exists(dir) { - return nil - } - - if err := os.MkdirAll(dir, perm); err != nil { - return fmt.Errorf("failed to create directory: '%s', error: '%s'", dir, err.Error()) - } - - return nil -} - -func CopySymLink(source, dest string) error { - link, err := os.Readlink(source) - if err != nil { - return err - } - return os.Symlink(link, dest) +//copy source directory to destination +func CopyDirectory(source string, dest string) error { + return copy.Copy(source, dest) } diff --git a/pkg/api/copy_test.go b/pkg/api/copy_test.go index 7993c684..ba0ccbb0 100644 --- a/pkg/api/copy_test.go +++ b/pkg/api/copy_test.go @@ -3,8 +3,15 @@ package api import ( "io/ioutil" "os" + "path" "path/filepath" "testing" + + kapis_git "github.com/qlik-oss/k-apis/pkg/git" + "sigs.k8s.io/kustomize/api/filesys" + "sigs.k8s.io/kustomize/api/konfig" + "sigs.k8s.io/kustomize/api/krusty" + "sigs.k8s.io/kustomize/api/types" ) func TestCopyDirectory(t *testing.T) { @@ -18,5 +25,77 @@ func TestCopyDirectory(t *testing.T) { t.Log(err) t.Fail() } +} + +func TestCopyDirectory_withGit_withKuz(t *testing.T) { + if testing.Short() { + t.Skip("Skipping in short test mode") + } + + tmpDir1, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + defer os.RemoveAll(tmpDir1) + + tmpDir2, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + defer os.RemoveAll(tmpDir2) + + repoPath1 := path.Join(tmpDir1, "repo") + repo1, err := kapis_git.CloneRepository(repoPath1, "https://github.com/qlik-oss/qliksense-k8s", nil) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if err := CopyDirectory(repoPath1, tmpDir2); err != nil { + t.Fatalf("unexpected error: %v", err) + } + + repoPath2 := tmpDir2 + repo2, err := kapis_git.OpenRepository(repoPath2) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if err := kapis_git.Checkout(repo2, "v0.0.2", "", nil); err != nil { + t.Fatalf("unexpected error: %v", err) + } + + repo2Manifest, err := kuz(path.Join(repoPath2, "manifests", "docker-desktop")) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if err := kapis_git.Checkout(repo1, "v0.0.2", "", nil); err != nil { + t.Fatalf("unexpected error: %v", err) + } + + repo1Manifest, err := kuz(path.Join(repoPath1, "manifests", "docker-desktop")) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if string(repo2Manifest) != string(repo1Manifest) { + t.Logf("manifest generated on the original config:\n%v", string(repo1Manifest)) + t.Logf("manifest generated on the copied config:\n%v", string(repo2Manifest)) + t.Fatal("expected manifests to be equal, but they were not") + } +} + +func kuz(directory string) ([]byte, error) { + options := &krusty.Options{ + DoLegacyResourceSort: false, + LoadRestrictions: types.LoadRestrictionsNone, + DoPrune: false, + PluginConfig: konfig.DisabledPluginConfig(), + } + k := krusty.MakeKustomizer(filesys.MakeFsOnDisk(), options) + resMap, err := k.Run(directory) + if err != nil { + return nil, err + } + return resMap.AsYaml() }