diff options
author | Kiran Kamineni <kiran.k.kamineni@intel.com> | 2018-11-20 14:32:50 -0800 |
---|---|---|
committer | Kiran Kamineni <kiran.k.kamineni@intel.com> | 2018-11-21 11:36:41 -0800 |
commit | f54fee24c32465478e2c6fc4cd6fc6bfb44fe096 (patch) | |
tree | ebe95c5f51972d2cacb8c304abace2423b7952db /src/k8splugin/rb/archive.go | |
parent | 3f780f7973081903f1ab6ea01a855fb6c5512a48 (diff) |
Add upload backend implementation
Upload is a seperate API where it takes
a binary stream and stores it. The api supports
tar.gz file format only.
P2: Check if ID is valid before trying upload
Add test with an invalid ID
Issue-ID: MULTICLOUD-393
Change-Id: Id636a95823a046e1795d3be72d0214e953a8c5fc
Signed-off-by: Kiran Kamineni <kiran.k.kamineni@intel.com>
Diffstat (limited to 'src/k8splugin/rb/archive.go')
-rw-r--r-- | src/k8splugin/rb/archive.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/k8splugin/rb/archive.go b/src/k8splugin/rb/archive.go new file mode 100644 index 00000000..8eb0fbed --- /dev/null +++ b/src/k8splugin/rb/archive.go @@ -0,0 +1,65 @@ +/* + * Copyright 2018 Intel Corporation, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package rb + +import ( + "archive/tar" + "compress/gzip" + pkgerrors "github.com/pkg/errors" + "io" +) + +func isTarGz(r io.Reader) error { + //Check if it is a valid gz + gzf, err := gzip.NewReader(r) + if err != nil { + return pkgerrors.Errorf("Invalid gz format %s", err.Error()) + } + + //Check if it is a valid tar file + //Unfortunately this can only be done by inspecting all the tar contents + tarR := tar.NewReader(gzf) + first := true + + for true { + header, err := tarR.Next() + + if err == io.EOF { + //Check if we have just a gzip file without a tar archive inside + if first { + return pkgerrors.New("Empty or non-existant Tar file found") + } + //End of archive + break + } + + if err != nil { + return pkgerrors.Errorf("Error reading tar file %s", err.Error()) + } + + //Check if files are of type directory and regular file + if header.Typeflag != tar.TypeDir && + header.Typeflag != tar.TypeReg { + return pkgerrors.Errorf("Unknown header in tar %s, %s", + header.Name, string(header.Typeflag)) + } + + first = false + } + + return nil +} |