gke-deploy/testservices/gsutil.go (78 lines of code) (raw):

package testservices import ( "context" "fmt" "io" "io/ioutil" "log" "os" "path/filepath" "strings" ) const tmpPermissionForDirectory = os.FileMode(0755) type TestGcsService struct { CopyResponse map[string]func(src, dst string) error } func (s *TestGcsService) Copy(ctx context.Context, src, dst string, recursive bool) error { res, ok := s.CopyResponse[src] if !ok { res, ok = s.CopyResponse[dst] if !ok { panic(fmt.Sprintf("no response for source %q", src)) } } return res(src, dst) } func copyFile(src, dst string) error { from, err := os.Open(src) if err != nil { log.Fatal(err) } defer from.Close() to, err := os.OpenFile(dst, os.O_RDWR|os.O_CREATE, 0777) if err != nil { return err } defer to.Close() _, err = io.Copy(to, from) if err != nil { return err } return nil } func copy(src, dest string, info os.FileInfo) error { if info.IsDir() { return copyDir(src, dest, info) } if !strings.HasSuffix(dest, "yaml") && !strings.HasSuffix(dest, "yml") { dest = filepath.Join(dest, info.Name()) } return copyFile(src, dest) } func copyDir(srcdir, destdir string, info os.FileInfo) error { contents, err := ioutil.ReadDir(srcdir) if err != nil { return err } for _, content := range contents { cs := filepath.Join(srcdir, content.Name()) cd := destdir if content.IsDir() { cd = filepath.Join(destdir, content.Name()) } // Make dest dir with 0755 so that everything writable. if err := os.MkdirAll(cd, tmpPermissionForDirectory); err != nil { return err } if err := copy(cs, cd, content); err != nil { return err } } return nil } // Copy simulates the gsutil copy. func Copy(src, dest string) error { info, err := os.Stat(src) if err != nil { return err } return copy(src, dest, info) }