|
|
@ -17,10 +17,14 @@ limitations under the License.
|
|
|
|
package chartutil
|
|
|
|
package chartutil
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
import (
|
|
|
|
|
|
|
|
"archive/tar"
|
|
|
|
|
|
|
|
"compress/gzip"
|
|
|
|
|
|
|
|
"io"
|
|
|
|
"io/ioutil"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"os"
|
|
|
|
"strings"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/golang/protobuf/ptypes/any"
|
|
|
|
"github.com/golang/protobuf/ptypes/any"
|
|
|
|
"k8s.io/helm/pkg/proto/hapi/chart"
|
|
|
|
"k8s.io/helm/pkg/proto/hapi/chart"
|
|
|
@ -73,6 +77,82 @@ func TestSave(t *testing.T) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func TestSavePreservesTimestamps(t *testing.T) {
|
|
|
|
|
|
|
|
// Test executes so quickly that if we don't subtract a second, the
|
|
|
|
|
|
|
|
// check will fail because `initialCreateTime` will be identical to the
|
|
|
|
|
|
|
|
// written timestamp for the files.
|
|
|
|
|
|
|
|
initialCreateTime := time.Now().Add(-1 * time.Second)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tmp, err := ioutil.TempDir("", "helm-")
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
defer os.RemoveAll(tmp)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
c := &chart.Chart{
|
|
|
|
|
|
|
|
Metadata: &chart.Metadata{
|
|
|
|
|
|
|
|
Name: "ahab",
|
|
|
|
|
|
|
|
Version: "1.2.3.4",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
Values: &chart.Config{
|
|
|
|
|
|
|
|
Raw: "ship: Pequod",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
Files: []*any.Any{
|
|
|
|
|
|
|
|
{TypeUrl: "scheherazade/shahryar.txt", Value: []byte("1,001 Nights")},
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
where, err := Save(c, tmp)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
t.Fatalf("Failed to save: %s", err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
allHeaders, err := retrieveAllHeadersFromTar(where)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
t.Fatalf("Failed to parse tar: %v", err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for _, header := range allHeaders {
|
|
|
|
|
|
|
|
if header.ModTime.Before(initialCreateTime) {
|
|
|
|
|
|
|
|
t.Fatalf("File timestamp not preserved: %v", header.ModTime)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// We could refactor `load.go` to use this `retrieveAllHeadersFromTar` function
|
|
|
|
|
|
|
|
// as well, so we are not duplicating components of the code which iterate
|
|
|
|
|
|
|
|
// through the tar.
|
|
|
|
|
|
|
|
func retrieveAllHeadersFromTar(path string) ([]*tar.Header, error) {
|
|
|
|
|
|
|
|
raw, err := os.Open(path)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
defer raw.Close()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unzipped, err := gzip.NewReader(raw)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
defer unzipped.Close()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tr := tar.NewReader(unzipped)
|
|
|
|
|
|
|
|
headers := []*tar.Header{}
|
|
|
|
|
|
|
|
for {
|
|
|
|
|
|
|
|
hd, err := tr.Next()
|
|
|
|
|
|
|
|
if err == io.EOF {
|
|
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
headers = append(headers, hd)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return headers, nil
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func TestSaveDir(t *testing.T) {
|
|
|
|
func TestSaveDir(t *testing.T) {
|
|
|
|
tmp, err := ioutil.TempDir("", "helm-")
|
|
|
|
tmp, err := ioutil.TempDir("", "helm-")
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|