1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- //go:build windows
- package computestorage
- import (
- "context"
- "encoding/json"
- "github.com/Microsoft/hcsshim/internal/oc"
- "github.com/Microsoft/hcsshim/osversion"
- "github.com/pkg/errors"
- "go.opencensus.io/trace"
- "golang.org/x/sys/windows"
- )
- // SetupBaseOSLayer sets up a layer that contains a base OS for a container.
- //
- // `layerPath` is a path to a directory containing the layer.
- //
- // `vhdHandle` is an empty file handle of `options.Type == OsLayerTypeContainer`
- // or else it is a file handle to the 'SystemTemplateBase.vhdx' if `options.Type
- // == OsLayerTypeVm`.
- //
- // `options` are the options applied while processing the layer.
- func SetupBaseOSLayer(ctx context.Context, layerPath string, vhdHandle windows.Handle, options OsLayerOptions) (err error) {
- title := "hcsshim::SetupBaseOSLayer"
- ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck
- defer span.End()
- defer func() { oc.SetSpanStatus(span, err) }()
- span.AddAttributes(
- trace.StringAttribute("layerPath", layerPath),
- )
- bytes, err := json.Marshal(options)
- if err != nil {
- return err
- }
- err = hcsSetupBaseOSLayer(layerPath, vhdHandle, string(bytes))
- if err != nil {
- return errors.Wrap(err, "failed to setup base OS layer")
- }
- return nil
- }
- // SetupBaseOSVolume sets up a volume that contains a base OS for a container.
- //
- // `layerPath` is a path to a directory containing the layer.
- //
- // `volumePath` is the path to the volume to be used for setup.
- //
- // `options` are the options applied while processing the layer.
- //
- // NOTE: This API is only available on builds of Windows greater than 19645. Inside we
- // check if the hosts build has the API available by using 'GetVersion' which requires
- // the calling application to be manifested. https://docs.microsoft.com/en-us/windows/win32/sbscs/manifests
- func SetupBaseOSVolume(ctx context.Context, layerPath, volumePath string, options OsLayerOptions) (err error) {
- if osversion.Build() < 19645 {
- return errors.New("SetupBaseOSVolume is not present on builds older than 19645")
- }
- title := "hcsshim::SetupBaseOSVolume"
- ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck
- defer span.End()
- defer func() { oc.SetSpanStatus(span, err) }()
- span.AddAttributes(
- trace.StringAttribute("layerPath", layerPath),
- trace.StringAttribute("volumePath", volumePath),
- )
- bytes, err := json.Marshal(options)
- if err != nil {
- return err
- }
- err = hcsSetupBaseOSVolume(layerPath, volumePath, string(bytes))
- if err != nil {
- return errors.Wrap(err, "failed to setup base OS layer")
- }
- return nil
- }
|