![dependabot[bot]](/assets/img/avatar_default.png)
Bumps the golang group with 5 updates: | Package | From | To | | --- | --- | --- | | [github.com/Microsoft/hcsshim](https://github.com/Microsoft/hcsshim) | `0.11.4` | `0.12.0` | | [github.com/alexflint/go-filemutex](https://github.com/alexflint/go-filemutex) | `1.2.0` | `1.3.0` | | [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) | `2.13.2` | `2.16.0` | | [github.com/onsi/gomega](https://github.com/onsi/gomega) | `1.30.0` | `1.31.1` | | [golang.org/x/sys](https://github.com/golang/sys) | `0.15.0` | `0.17.0` | Updates `github.com/Microsoft/hcsshim` from 0.11.4 to 0.12.0 - [Release notes](https://github.com/Microsoft/hcsshim/releases) - [Commits](https://github.com/Microsoft/hcsshim/compare/v0.11.4...v0.12.0) Updates `github.com/alexflint/go-filemutex` from 1.2.0 to 1.3.0 - [Release notes](https://github.com/alexflint/go-filemutex/releases) - [Commits](https://github.com/alexflint/go-filemutex/compare/v1.2.0...v1.3.0) Updates `github.com/onsi/ginkgo/v2` from 2.13.2 to 2.16.0 - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.13.2...v2.16.0) Updates `github.com/onsi/gomega` from 1.30.0 to 1.31.1 - [Release notes](https://github.com/onsi/gomega/releases) - [Changelog](https://github.com/onsi/gomega/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/gomega/compare/v1.30.0...v1.31.1) Updates `golang.org/x/sys` from 0.15.0 to 0.17.0 - [Commits](https://github.com/golang/sys/compare/v0.15.0...v0.17.0) --- updated-dependencies: - dependency-name: github.com/Microsoft/hcsshim dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: github.com/alexflint/go-filemutex dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: github.com/onsi/gomega dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: golang.org/x/sys dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang ... Signed-off-by: dependabot[bot] <support@github.com>
200 lines
6.7 KiB
Go
200 lines
6.7 KiB
Go
//go:build windows
|
|
|
|
package computestorage
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"path/filepath"
|
|
"syscall"
|
|
|
|
"github.com/Microsoft/go-winio/vhd"
|
|
"github.com/Microsoft/hcsshim/internal/memory"
|
|
"github.com/pkg/errors"
|
|
"golang.org/x/sys/windows"
|
|
|
|
"github.com/Microsoft/hcsshim/internal/security"
|
|
)
|
|
|
|
const (
|
|
defaultVHDXBlockSizeInMB = 1
|
|
)
|
|
|
|
// SetupContainerBaseLayer is a helper to setup a containers scratch. It
|
|
// will create and format the vhdx's inside and the size is configurable with the sizeInGB
|
|
// parameter.
|
|
//
|
|
// `layerPath` is the path to the base container layer on disk.
|
|
//
|
|
// `baseVhdPath` is the path to where the base vhdx for the base layer should be created.
|
|
//
|
|
// `diffVhdPath` is the path where the differencing disk for the base layer should be created.
|
|
//
|
|
// `sizeInGB` is the size in gigabytes to make the base vhdx.
|
|
func SetupContainerBaseLayer(ctx context.Context, layerPath, baseVhdPath, diffVhdPath string, sizeInGB uint64) (err error) {
|
|
var (
|
|
hivesPath = filepath.Join(layerPath, "Hives")
|
|
layoutPath = filepath.Join(layerPath, "Layout")
|
|
)
|
|
|
|
// We need to remove the hives directory and layout file as `SetupBaseOSLayer` fails if these files
|
|
// already exist. `SetupBaseOSLayer` will create these files internally. We also remove the base and
|
|
// differencing disks if they exist in case we're asking for a different size.
|
|
if _, err := os.Stat(hivesPath); err == nil {
|
|
if err := os.RemoveAll(hivesPath); err != nil {
|
|
return errors.Wrap(err, "failed to remove prexisting hives directory")
|
|
}
|
|
}
|
|
if _, err := os.Stat(layoutPath); err == nil {
|
|
if err := os.RemoveAll(layoutPath); err != nil {
|
|
return errors.Wrap(err, "failed to remove prexisting layout file")
|
|
}
|
|
}
|
|
|
|
if _, err := os.Stat(baseVhdPath); err == nil {
|
|
if err := os.RemoveAll(baseVhdPath); err != nil {
|
|
return errors.Wrap(err, "failed to remove base vhdx path")
|
|
}
|
|
}
|
|
if _, err := os.Stat(diffVhdPath); err == nil {
|
|
if err := os.RemoveAll(diffVhdPath); err != nil {
|
|
return errors.Wrap(err, "failed to remove differencing vhdx")
|
|
}
|
|
}
|
|
|
|
createParams := &vhd.CreateVirtualDiskParameters{
|
|
Version: 2,
|
|
Version2: vhd.CreateVersion2{
|
|
MaximumSize: sizeInGB * memory.GiB,
|
|
BlockSizeInBytes: defaultVHDXBlockSizeInMB * memory.MiB,
|
|
},
|
|
}
|
|
handle, err := vhd.CreateVirtualDisk(baseVhdPath, vhd.VirtualDiskAccessNone, vhd.CreateVirtualDiskFlagNone, createParams)
|
|
if err != nil {
|
|
return errors.Wrap(err, "failed to create vhdx")
|
|
}
|
|
|
|
defer func() {
|
|
if err != nil {
|
|
_ = syscall.CloseHandle(handle)
|
|
os.RemoveAll(baseVhdPath)
|
|
os.RemoveAll(diffVhdPath)
|
|
}
|
|
}()
|
|
|
|
if err = FormatWritableLayerVhd(ctx, windows.Handle(handle)); err != nil {
|
|
return err
|
|
}
|
|
// Base vhd handle must be closed before calling SetupBaseLayer in case of Container layer
|
|
if err = syscall.CloseHandle(handle); err != nil {
|
|
return errors.Wrap(err, "failed to close vhdx handle")
|
|
}
|
|
|
|
options := OsLayerOptions{
|
|
Type: OsLayerTypeContainer,
|
|
}
|
|
|
|
// SetupBaseOSLayer expects an empty vhd handle for a container layer and will
|
|
// error out otherwise.
|
|
if err = SetupBaseOSLayer(ctx, layerPath, 0, options); err != nil {
|
|
return err
|
|
}
|
|
// Create the differencing disk that will be what's copied for the final rw layer
|
|
// for a container.
|
|
if err = vhd.CreateDiffVhd(diffVhdPath, baseVhdPath, defaultVHDXBlockSizeInMB); err != nil {
|
|
return errors.Wrap(err, "failed to create differencing disk")
|
|
}
|
|
|
|
if err = security.GrantVmGroupAccess(baseVhdPath); err != nil {
|
|
return errors.Wrapf(err, "failed to grant vm group access to %s", baseVhdPath)
|
|
}
|
|
if err = security.GrantVmGroupAccess(diffVhdPath); err != nil {
|
|
return errors.Wrapf(err, "failed to grant vm group access to %s", diffVhdPath)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// SetupUtilityVMBaseLayer is a helper to setup a UVMs scratch space. It will create and format
|
|
// the vhdx inside and the size is configurable by the sizeInGB parameter.
|
|
//
|
|
// `uvmPath` is the path to the UtilityVM filesystem.
|
|
//
|
|
// `baseVhdPath` is the path to where the base vhdx for the UVM should be created.
|
|
//
|
|
// `diffVhdPath` is the path where the differencing disk for the UVM should be created.
|
|
//
|
|
// `sizeInGB` specifies the size in gigabytes to make the base vhdx.
|
|
func SetupUtilityVMBaseLayer(ctx context.Context, uvmPath, baseVhdPath, diffVhdPath string, sizeInGB uint64) (err error) {
|
|
// Remove the base and differencing disks if they exist in case we're asking for a different size.
|
|
if _, err := os.Stat(baseVhdPath); err == nil {
|
|
if err := os.RemoveAll(baseVhdPath); err != nil {
|
|
return errors.Wrap(err, "failed to remove base vhdx")
|
|
}
|
|
}
|
|
if _, err := os.Stat(diffVhdPath); err == nil {
|
|
if err := os.RemoveAll(diffVhdPath); err != nil {
|
|
return errors.Wrap(err, "failed to remove differencing vhdx")
|
|
}
|
|
}
|
|
|
|
// Just create the vhdx for utilityVM layer, no need to format it.
|
|
createParams := &vhd.CreateVirtualDiskParameters{
|
|
Version: 2,
|
|
Version2: vhd.CreateVersion2{
|
|
MaximumSize: sizeInGB * memory.GiB,
|
|
BlockSizeInBytes: defaultVHDXBlockSizeInMB * memory.MiB,
|
|
},
|
|
}
|
|
handle, err := vhd.CreateVirtualDisk(baseVhdPath, vhd.VirtualDiskAccessNone, vhd.CreateVirtualDiskFlagNone, createParams)
|
|
if err != nil {
|
|
return errors.Wrap(err, "failed to create vhdx")
|
|
}
|
|
|
|
defer func() {
|
|
if err != nil {
|
|
_ = syscall.CloseHandle(handle)
|
|
os.RemoveAll(baseVhdPath)
|
|
os.RemoveAll(diffVhdPath)
|
|
}
|
|
}()
|
|
|
|
// If it is a UtilityVM layer then the base vhdx must be attached when calling
|
|
// `SetupBaseOSLayer`
|
|
attachParams := &vhd.AttachVirtualDiskParameters{
|
|
Version: 2,
|
|
}
|
|
if err := vhd.AttachVirtualDisk(handle, vhd.AttachVirtualDiskFlagNone, attachParams); err != nil {
|
|
return errors.Wrapf(err, "failed to attach virtual disk")
|
|
}
|
|
|
|
options := OsLayerOptions{
|
|
Type: OsLayerTypeVM,
|
|
}
|
|
if err := SetupBaseOSLayer(ctx, uvmPath, windows.Handle(handle), options); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Detach and close the handle after setting up the layer as we don't need the handle
|
|
// for anything else and we no longer need to be attached either.
|
|
if err = vhd.DetachVirtualDisk(handle); err != nil {
|
|
return errors.Wrap(err, "failed to detach vhdx")
|
|
}
|
|
if err = syscall.CloseHandle(handle); err != nil {
|
|
return errors.Wrap(err, "failed to close vhdx handle")
|
|
}
|
|
|
|
// Create the differencing disk that will be what's copied for the final rw layer
|
|
// for a container.
|
|
if err = vhd.CreateDiffVhd(diffVhdPath, baseVhdPath, defaultVHDXBlockSizeInMB); err != nil {
|
|
return errors.Wrap(err, "failed to create differencing disk")
|
|
}
|
|
|
|
if err := security.GrantVmGroupAccess(baseVhdPath); err != nil {
|
|
return errors.Wrapf(err, "failed to grant vm group access to %s", baseVhdPath)
|
|
}
|
|
if err := security.GrantVmGroupAccess(diffVhdPath); err != nil {
|
|
return errors.Wrapf(err, "failed to grant vm group access to %s", diffVhdPath)
|
|
}
|
|
return nil
|
|
}
|