...
1
2
3 package hcs
4
5 import (
6 "context"
7 "fmt"
8 "strconv"
9
10 "github.com/pkg/errors"
11
12 "github.com/Microsoft/hcsshim/internal/hcs/resourcepaths"
13 hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2"
14 "github.com/Microsoft/hcsshim/internal/protocol/guestrequest"
15 "github.com/Microsoft/hcsshim/internal/vm"
16 )
17
18 func (uvmb *utilityVMBuilder) AddVPMemController(maximumDevices uint32, maximumSizeBytes uint64) error {
19 uvmb.doc.VirtualMachine.Devices.VirtualPMem = &hcsschema.VirtualPMemController{
20 MaximumCount: maximumDevices,
21 MaximumSizeBytes: maximumSizeBytes,
22 }
23 uvmb.doc.VirtualMachine.Devices.VirtualPMem.Devices = make(map[string]hcsschema.VirtualPMemDevice)
24 return nil
25 }
26
27 func (uvmb *utilityVMBuilder) AddVPMemDevice(ctx context.Context, id uint32, path string, readOnly bool, imageFormat vm.VPMemImageFormat) error {
28 if uvmb.doc.VirtualMachine.Devices.VirtualPMem == nil {
29 return errors.New("VPMem controller has not been added")
30 }
31 imageFormatString, err := getVPMemImageFormatString(imageFormat)
32 if err != nil {
33 return err
34 }
35 uvmb.doc.VirtualMachine.Devices.VirtualPMem.Devices[strconv.Itoa(int(id))] = hcsschema.VirtualPMemDevice{
36 HostPath: path,
37 ReadOnly: readOnly,
38 ImageFormat: imageFormatString,
39 }
40 return nil
41 }
42
43 func (uvmb *utilityVMBuilder) RemoveVPMemDevice(ctx context.Context, id uint32, path string) error {
44 return vm.ErrNotSupported
45 }
46
47 func (uvm *utilityVM) AddVPMemController(maximumDevices uint32, maximumSizeBytes uint64) error {
48 return vm.ErrNotSupported
49 }
50
51 func (uvm *utilityVM) AddVPMemDevice(ctx context.Context, id uint32, path string, readOnly bool, imageFormat vm.VPMemImageFormat) error {
52 imageFormatString, err := getVPMemImageFormatString(imageFormat)
53 if err != nil {
54 return err
55 }
56 request := &hcsschema.ModifySettingRequest{
57 RequestType: guestrequest.RequestTypeAdd,
58 Settings: hcsschema.VirtualPMemDevice{
59 HostPath: path,
60 ReadOnly: readOnly,
61 ImageFormat: imageFormatString,
62 },
63 ResourcePath: fmt.Sprintf(resourcepaths.VPMemControllerResourceFormat, id),
64 }
65 return uvm.cs.Modify(ctx, request)
66 }
67
68 func (uvm *utilityVM) RemoveVPMemDevice(ctx context.Context, id uint32, path string) error {
69 request := &hcsschema.ModifySettingRequest{
70 RequestType: guestrequest.RequestTypeRemove,
71 ResourcePath: fmt.Sprintf(resourcepaths.VPMemControllerResourceFormat, id),
72 }
73 return uvm.cs.Modify(ctx, request)
74 }
75
76 func getVPMemImageFormatString(imageFormat vm.VPMemImageFormat) (string, error) {
77 switch imageFormat {
78 case vm.VPMemImageFormatVHD1:
79 return "Vhd1", nil
80 case vm.VPMemImageFormatVHDX:
81 return "Vhdx", nil
82 default:
83 return "", fmt.Errorf("unsupported VPMem image format: %d", imageFormat)
84 }
85 }
86
View as plain text