Skip to content
This repository has been archived by the owner on Jan 9, 2023. It is now read-only.

Commit

Permalink
Removing zipping functionality from tagging_control
Browse files Browse the repository at this point in the history
Signed-off-by: Christian Simon <simon@swine.de>
  • Loading branch information
simonswine committed Jan 28, 2019
1 parent 8b57068 commit bc70f28
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 264 deletions.
37 changes: 0 additions & 37 deletions cmd/tagging_control/cmd/zip.go

This file was deleted.

5 changes: 0 additions & 5 deletions docs/cmd-docs.rst
Original file line number Diff line number Diff line change
Expand Up @@ -199,8 +199,3 @@ Command line documentation for tarmak, wing and tagging_control commands

generated/cmd/tagging_control/tagging_control_version

.. toctree::
:maxdepth: 1

generated/cmd/tagging_control/tagging_control_zip

1 change: 0 additions & 1 deletion docs/generated/cmd/tagging_control/tagging_control.rst
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,4 @@ SEE ALSO

* `tagging_control handle <tagging_control_handle.html>`_ - Launch lambda request handler
* `tagging_control version <tagging_control_version.html>`_ - Print the version number of tagging-control
* `tagging_control zip <tagging_control_zip.html>`_ - zip utility

29 changes: 0 additions & 29 deletions docs/generated/cmd/tagging_control/tagging_control_zip.rst

This file was deleted.

104 changes: 15 additions & 89 deletions pkg/tarmak/utils/zip/zip.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,114 +6,40 @@ import (
"fmt"
"io"
"os"
"path/filepath"
"strings"

"github.com/jetstack/tarmak/pkg/tarmak/utils"
"time"
)

var (
overrideErr = "trying to override source file but not deleting source: %s %s"
)

func Zip(src []string, dst string, deleteSrc bool) error {
var writer io.Writer
var tempFile *os.File

if !strings.HasSuffix(dst, ".zip") {
dst = fmt.Sprintf("%s.zip", dst)
}

if utils.SliceContains(src, dst) {
if !deleteSrc {
return fmt.Errorf(overrideErr, src, dst)
}

// source contains destination file so write zip to temp file
var err error
tempFile, err = os.Create(filepath.Join(os.TempDir(), filepath.Base(dst)))
if err != nil {
return err
}

defer os.RemoveAll(tempFile.Name())
writer = tempFile

} else {

// source files doesn't contain destination so write straight to
// destination file
f, err := os.Create(dst)
if err != nil {
return err
}

defer f.Close()
writer = f
}

func ZipBytes(filenames []string, bytes [][]byte, modes []os.FileMode, writer io.Writer) error {
zipW := zip.NewWriter(writer)
defer zipW.Close()

for _, f := range src {
srcF, err := os.Open(f)
if err != nil {
return err
}
defer srcF.Close()
kubernetesEpoch := time.Unix(1437436800, 0)

info, err := srcF.Stat()
if err != nil {
return err
}

header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}

header.Name = f
header.Method = zip.Deflate

fWriter, err := zipW.CreateHeader(header)
if err != nil {
return err
}

if _, err = io.Copy(fWriter, srcF); err != nil {
return err
}
if lenFilenames, lenBytes, lenModes := len(filenames), len(bytes), len(modes); lenFilenames != lenBytes || lenBytes != lenModes {
return fmt.Errorf("count of filenames, modes and bytes slice in the input needs to match")
}

if deleteSrc {
for _, f := range src {
if err := os.RemoveAll(f); err != nil {
return fmt.Errorf("failed to delete all src files: %s", err)
}
for pos, _ := range filenames {
header := &zip.FileHeader{
Name: filenames[pos],
Method: zip.Deflate,
UncompressedSize64: uint64(len(bytes[pos])),
Modified: time.Now(),
}
}

zipW.Close()
header.SetMode(modes[pos])
header.SetModTime(kubernetesEpoch)

// zip is in temp so copy to destination file
if tempFile != nil {
tempFile.Close()

tempFile, err := os.Open(tempFile.Name())
if err != nil {
return err
}

f, err := os.Create(dst)
fWriter, err := zipW.CreateHeader(header)
if err != nil {
return err
}
defer f.Close()

if _, err = io.Copy(f, tempFile); err != nil {
if _, err := fWriter.Write(bytes[pos]); err != nil {
return err
}
}

return nil
}
126 changes: 23 additions & 103 deletions pkg/tarmak/utils/zip/zip_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,119 +2,39 @@
package zip

import (
"archive/zip"
"fmt"
"io/ioutil"
"math/rand"
"bytes"
"os"
"reflect"
"testing"
)

func Test_Zip(t *testing.T) {
dir, err := ioutil.TempDir("", "tarmak_zip_test")
try(t, nil, err)
defer os.RemoveAll(dir)
func TestZipBytes(t *testing.T) {

// can't override source
src := []string{"a.zip"}
dst := "a"
try(t, fmt.Errorf(overrideErr, src, src[0]), Zip(src, dst, false))
dst = "a.zip"
try(t, fmt.Errorf(overrideErr, src, dst), Zip(src, dst, false))

tmpSrc := tempFile(t, dir)
b := randBytes(t)
try(t, nil, ioutil.WriteFile(tmpSrc, b, 0664))
src = []string{tmpSrc}
dst = fmt.Sprintf("%s.zip", tempFile(t, dir))

// shouldn't delete source
try(t, nil, Zip(src, dst, false))
_, err = os.Stat(tmpSrc)
try(t, nil, err)

// should delete source
try(t, nil, Zip(src, dst, true))
_, err = os.Stat(tmpSrc)
try(t, fmt.Errorf("stat %s: no such file or directory", tmpSrc), err)

testUnzip(t, b, dst)

// should still unzip correctly when destination target is source file
tmpSrc = tempFile(t, dir)
tmpDst := tempFile(t, dir)
b = randBytes(t)
try(t, nil, ioutil.WriteFile(tmpSrc, b, 0664))
try(t, nil, ioutil.WriteFile(tmpDst, b, 0664))
try(t, nil, Zip([]string{tmpDst}, tmpDst, true))

tmpDst = fmt.Sprintf("%s.zip", tmpDst)
testUnzip(t, b, tmpDst)

src = []string{tmpSrc, tmpDst}

// zip source into itself
try(t, nil, Zip(src, tmpDst, true))
_, err = os.Stat(tmpDst)
try(t, nil, err)

testUnzip(t, b, tmpDst)
}

func testUnzip(t *testing.T, srcB []byte, dst string) {
reader, err := zip.OpenReader(dst)
try(t, nil, err)

if len(reader.File) == 0 {
t.Fatalf("expected zip to contain at least 1 file, got=%d", len(reader.File))
doZip := func() ([]byte, error) {
buf := new(bytes.Buffer)
err := ZipBytes(
[]string{"test-1/file-1.txt", "test-2/file-2.txt", "test-1/test-2/file12.txt"},
[][]byte{[]byte("1\n"), []byte("2\n"), []byte("12-secret\n")},
[]os.FileMode{0644, 0644, 0600},
buf,
)
if err != nil {
return []byte{}, err
}
return buf.Bytes(), nil
}

f, err := reader.File[0].Open()
try(t, nil, err)
b, err := ioutil.ReadAll(f)
try(t, nil, err)

if string(b) != string(srcB) {
t.Fatalf("final bytes don't match, exp=%s got=%s", srcB, b)
zip1, err1 := doZip()
if err1 != nil {
t.Errorf("unexpected error: %v", err1)
}
}

func try(t *testing.T, exp, got error) {
err := fmt.Sprintf("unexpected result, exp=[%v] got=[%v]",
exp, got)

if exp == got {
return
}

if exp == nil && got != nil {
t.Fatal(err)
zip2, err2 := doZip()
if err2 != nil {
t.Errorf("unexpected error: %v", err2)
}

if exp != nil && got == nil {
t.Fatal(err)
if !reflect.DeepEqual(zip1, zip2) {
t.Error("both zip files of the same files did mismatch")
}

if exp.Error() != got.Error() {
t.Fatal(err)
}
}

func tempFile(t *testing.T, dir string) string {
f, err := ioutil.TempFile(dir, "")
if err != nil {
t.Fatalf("failed to create temp file: %s", err)
}

return f.Name()
}

func randBytes(t *testing.T) []byte {
var b [256]byte
_, err := rand.Read(b[:])
if err != nil {
t.Fatalf("failed to generate random bytes: %s", err)
}

return b[:]
}

0 comments on commit bc70f28

Please sign in to comment.