47 lines
1.2 KiB
Go
47 lines
1.2 KiB
Go
package lcow
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/Microsoft/hcsshim/internal/uvm"
|
|
specs "github.com/opencontainers/runtime-spec/specs-go"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// TarToVhd streams a tarstream contained in an io.Reader to a fixed vhd file
|
|
func TarToVhd(lcowUVM *uvm.UtilityVM, targetVHDFile string, reader io.Reader) (int64, error) {
|
|
logrus.Debugf("hcsshim: TarToVhd: %s", targetVHDFile)
|
|
|
|
if lcowUVM == nil {
|
|
return 0, fmt.Errorf("no utility VM passed")
|
|
}
|
|
|
|
//defer uvm.DebugLCOWGCS()
|
|
|
|
outFile, err := os.Create(targetVHDFile)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("tar2vhd failed to create %s: %s", targetVHDFile, err)
|
|
}
|
|
defer outFile.Close()
|
|
// BUGBUG Delete the file on failure
|
|
|
|
tar2vhd, byteCounts, err := CreateProcess(&ProcessOptions{
|
|
HCSSystem: lcowUVM.ComputeSystem(),
|
|
Process: &specs.Process{Args: []string{"tar2vhd"}},
|
|
CreateInUtilityVm: true,
|
|
Stdin: reader,
|
|
Stdout: outFile,
|
|
CopyTimeout: 2 * time.Minute,
|
|
})
|
|
if err != nil {
|
|
return 0, fmt.Errorf("failed to start tar2vhd for %s: %s", targetVHDFile, err)
|
|
}
|
|
defer tar2vhd.Close()
|
|
|
|
logrus.Debugf("hcsshim: TarToVhd: %s created, %d bytes", targetVHDFile, byteCounts.Out)
|
|
return byteCounts.Out, err
|
|
}
|