Skip to content

Commit 5a2d837

Browse files
committed
implement guest manager interfaces for VM operations
Signed-off-by: Harsh Rawat <harshrawat@microsoft.com>
1 parent fa57661 commit 5a2d837

18 files changed

Lines changed: 1126 additions & 0 deletions
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
//go:build windows
2+
3+
package guestmanager
4+
5+
import (
6+
"context"
7+
"fmt"
8+
9+
hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2"
10+
"github.com/Microsoft/hcsshim/internal/protocol/guestrequest"
11+
"github.com/Microsoft/hcsshim/internal/protocol/guestresource"
12+
)
13+
14+
// CIMsManager exposes guest WCOW block CIM operations.
15+
type CIMsManager interface {
16+
// AddWCOWBlockCIMs adds WCOW block CIM mounts in the guest.
17+
AddWCOWBlockCIMs(ctx context.Context, settings *guestresource.CWCOWBlockCIMMounts) error
18+
// RemoveWCOWBlockCIMs removes WCOW block CIM mounts from the guest.
19+
RemoveWCOWBlockCIMs(ctx context.Context, settings *guestresource.CWCOWBlockCIMMounts) error
20+
}
21+
22+
var _ CIMsManager = (*Guest)(nil)
23+
24+
// AddWCOWBlockCIMs adds WCOW block CIM mounts in the guest.
25+
func (gm *Guest) AddWCOWBlockCIMs(ctx context.Context, settings *guestresource.CWCOWBlockCIMMounts) error {
26+
request := &hcsschema.ModifySettingRequest{
27+
GuestRequest: guestrequest.ModificationRequest{
28+
ResourceType: guestresource.ResourceTypeWCOWBlockCims,
29+
RequestType: guestrequest.RequestTypeAdd,
30+
Settings: settings,
31+
},
32+
}
33+
34+
err := gm.modify(ctx, request.GuestRequest)
35+
if err != nil {
36+
return fmt.Errorf("failed to add WCOW block CIMs: %w", err)
37+
}
38+
39+
return nil
40+
}
41+
42+
// RemoveWCOWBlockCIMs removes WCOW block CIM mounts in the guest.
43+
func (gm *Guest) RemoveWCOWBlockCIMs(ctx context.Context, settings *guestresource.CWCOWBlockCIMMounts) error {
44+
request := &hcsschema.ModifySettingRequest{
45+
GuestRequest: guestrequest.ModificationRequest{
46+
ResourceType: guestresource.ResourceTypeWCOWBlockCims,
47+
RequestType: guestrequest.RequestTypeRemove,
48+
Settings: settings,
49+
},
50+
}
51+
52+
err := gm.modify(ctx, request.GuestRequest)
53+
if err != nil {
54+
return fmt.Errorf("failed to remove WCOW block CIMs: %w", err)
55+
}
56+
57+
return nil
58+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
//go:build windows
2+
3+
package guestmanager
4+
5+
import (
6+
"context"
7+
"fmt"
8+
9+
hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2"
10+
"github.com/Microsoft/hcsshim/internal/protocol/guestrequest"
11+
"github.com/Microsoft/hcsshim/internal/protocol/guestresource"
12+
)
13+
14+
// LCOWLayersManager exposes combined layer operations in the LCOW guest.
15+
type LCOWLayersManager interface {
16+
// AddLCOWCombinedLayers adds combined layers to the LCOW guest.
17+
AddLCOWCombinedLayers(ctx context.Context, settings guestresource.LCOWCombinedLayers) error
18+
// RemoveLCOWCombinedLayers removes combined layers from the LCOW guest.
19+
RemoveLCOWCombinedLayers(ctx context.Context, settings guestresource.LCOWCombinedLayers) error
20+
}
21+
22+
var _ LCOWLayersManager = (*Guest)(nil)
23+
24+
// AddLCOWCombinedLayers adds LCOW combined layers in the guest.
25+
func (gm *Guest) AddLCOWCombinedLayers(ctx context.Context, settings guestresource.LCOWCombinedLayers) error {
26+
modifyRequest := &hcsschema.ModifySettingRequest{
27+
GuestRequest: guestrequest.ModificationRequest{
28+
ResourceType: guestresource.ResourceTypeCombinedLayers,
29+
RequestType: guestrequest.RequestTypeAdd,
30+
Settings: settings,
31+
},
32+
}
33+
34+
err := gm.modify(ctx, modifyRequest.GuestRequest)
35+
if err != nil {
36+
return fmt.Errorf("failed to add LCOW combined layers: %w", err)
37+
}
38+
return nil
39+
}
40+
41+
// RemoveLCOWCombinedLayers removes LCOW combined layers in the guest.
42+
func (gm *Guest) RemoveLCOWCombinedLayers(ctx context.Context, settings guestresource.LCOWCombinedLayers) error {
43+
modifyRequest := &hcsschema.ModifySettingRequest{
44+
GuestRequest: guestrequest.ModificationRequest{
45+
ResourceType: guestresource.ResourceTypeCombinedLayers,
46+
RequestType: guestrequest.RequestTypeRemove,
47+
Settings: settings,
48+
},
49+
}
50+
51+
err := gm.modify(ctx, modifyRequest.GuestRequest)
52+
if err != nil {
53+
return fmt.Errorf("failed to remove LCOW combined layers: %w", err)
54+
}
55+
return nil
56+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
//go:build windows
2+
3+
package guestmanager
4+
5+
import (
6+
"context"
7+
"fmt"
8+
9+
hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2"
10+
"github.com/Microsoft/hcsshim/internal/protocol/guestrequest"
11+
"github.com/Microsoft/hcsshim/internal/protocol/guestresource"
12+
)
13+
14+
// WCOWLayersManager exposes combined layer operations in the WCOW guest.
15+
type WCOWLayersManager interface {
16+
// AddWCOWCombinedLayers adds combined layers to the WCOW guest.
17+
AddWCOWCombinedLayers(ctx context.Context, settings guestresource.WCOWCombinedLayers) error
18+
// AddCWCOWCombinedLayers adds combined layers to the CWCOW guest.
19+
AddCWCOWCombinedLayers(ctx context.Context, settings guestresource.CWCOWCombinedLayers) error
20+
// RemoveWCOWCombinedLayers removes combined layers from the WCOW guest.
21+
RemoveWCOWCombinedLayers(ctx context.Context, settings guestresource.WCOWCombinedLayers) error
22+
// RemoveCWCOWCombinedLayers removes combined layers from the CWCOW guest.
23+
RemoveCWCOWCombinedLayers(ctx context.Context, settings guestresource.CWCOWCombinedLayers) error
24+
}
25+
26+
var _ WCOWLayersManager = (*Guest)(nil)
27+
28+
// AddWCOWCombinedLayers adds WCOW combined layers in the guest.
29+
func (gm *Guest) AddWCOWCombinedLayers(ctx context.Context, settings guestresource.WCOWCombinedLayers) error {
30+
modifyRequest := &hcsschema.ModifySettingRequest{
31+
GuestRequest: guestrequest.ModificationRequest{
32+
ResourceType: guestresource.ResourceTypeCombinedLayers,
33+
RequestType: guestrequest.RequestTypeAdd,
34+
Settings: settings,
35+
},
36+
}
37+
38+
err := gm.modify(ctx, modifyRequest.GuestRequest)
39+
if err != nil {
40+
return fmt.Errorf("failed to add WCOW combined layers: %w", err)
41+
}
42+
return nil
43+
}
44+
45+
// AddCWCOWCombinedLayers adds combined layers in the CWCOW guest.
46+
func (gm *Guest) AddCWCOWCombinedLayers(ctx context.Context, settings guestresource.CWCOWCombinedLayers) error {
47+
modifyRequest := &hcsschema.ModifySettingRequest{
48+
GuestRequest: guestrequest.ModificationRequest{
49+
ResourceType: guestresource.ResourceTypeCWCOWCombinedLayers,
50+
RequestType: guestrequest.RequestTypeAdd,
51+
Settings: settings,
52+
},
53+
}
54+
55+
err := gm.modify(ctx, modifyRequest.GuestRequest)
56+
if err != nil {
57+
return fmt.Errorf("failed to add CWCOW combined layers: %w", err)
58+
}
59+
return nil
60+
}
61+
62+
// RemoveWCOWCombinedLayers removes WCOW combined layers in the guest.
63+
func (gm *Guest) RemoveWCOWCombinedLayers(ctx context.Context, settings guestresource.WCOWCombinedLayers) error {
64+
modifyRequest := &hcsschema.ModifySettingRequest{
65+
GuestRequest: guestrequest.ModificationRequest{
66+
ResourceType: guestresource.ResourceTypeCombinedLayers,
67+
RequestType: guestrequest.RequestTypeRemove,
68+
Settings: settings,
69+
},
70+
}
71+
72+
err := gm.modify(ctx, modifyRequest.GuestRequest)
73+
if err != nil {
74+
return fmt.Errorf("failed to remove WCOW combined layers: %w", err)
75+
}
76+
return nil
77+
}
78+
79+
// RemoveCWCOWCombinedLayers removes combined layers in CWCOW guest.
80+
func (gm *Guest) RemoveCWCOWCombinedLayers(ctx context.Context, settings guestresource.CWCOWCombinedLayers) error {
81+
modifyRequest := &hcsschema.ModifySettingRequest{
82+
GuestRequest: guestrequest.ModificationRequest{
83+
ResourceType: guestresource.ResourceTypeCWCOWCombinedLayers,
84+
RequestType: guestrequest.RequestTypeRemove,
85+
Settings: settings,
86+
},
87+
}
88+
89+
err := gm.modify(ctx, modifyRequest.GuestRequest)
90+
if err != nil {
91+
return fmt.Errorf("failed to remove CWCOW combined layers: %w", err)
92+
}
93+
return nil
94+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
//go:build windows
2+
3+
package guestmanager
4+
5+
import (
6+
"context"
7+
"fmt"
8+
9+
hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2"
10+
"github.com/Microsoft/hcsshim/internal/protocol/guestrequest"
11+
"github.com/Microsoft/hcsshim/internal/protocol/guestresource"
12+
)
13+
14+
// LCOWDeviceManager exposes VPCI and VPMem device operations in the LCOW guest.
15+
type LCOWDeviceManager interface {
16+
// AddVPCIDevice adds a VPCI device to the guest.
17+
AddVPCIDevice(ctx context.Context, settings guestresource.LCOWMappedVPCIDevice) error
18+
// AddVPMemDevice adds a VPMem device to the guest.
19+
AddVPMemDevice(ctx context.Context, settings guestresource.LCOWMappedVPMemDevice) error
20+
// RemoveVPMemDevice removes a VPMem device from the guest.
21+
RemoveVPMemDevice(ctx context.Context, settings guestresource.LCOWMappedVPMemDevice) error
22+
}
23+
24+
var _ LCOWDeviceManager = (*Guest)(nil)
25+
26+
// AddVPCIDevice adds a VPCI device in the guest.
27+
func (gm *Guest) AddVPCIDevice(ctx context.Context, settings guestresource.LCOWMappedVPCIDevice) error {
28+
request := &hcsschema.ModifySettingRequest{
29+
GuestRequest: guestrequest.ModificationRequest{
30+
ResourceType: guestresource.ResourceTypeVPCIDevice,
31+
RequestType: guestrequest.RequestTypeAdd,
32+
Settings: settings,
33+
},
34+
}
35+
36+
err := gm.modify(ctx, request.GuestRequest)
37+
if err != nil {
38+
return fmt.Errorf("failed to add VPCI device: %w", err)
39+
}
40+
return nil
41+
}
42+
43+
// AddVPMemDevice adds a VPMem device in the guest.
44+
func (gm *Guest) AddVPMemDevice(ctx context.Context, settings guestresource.LCOWMappedVPMemDevice) error {
45+
request := &hcsschema.ModifySettingRequest{
46+
GuestRequest: guestrequest.ModificationRequest{
47+
ResourceType: guestresource.ResourceTypeVPMemDevice,
48+
RequestType: guestrequest.RequestTypeAdd,
49+
Settings: settings,
50+
},
51+
}
52+
53+
err := gm.modify(ctx, request.GuestRequest)
54+
if err != nil {
55+
return fmt.Errorf("failed to add VPMem device: %w", err)
56+
}
57+
return nil
58+
}
59+
60+
// RemoveVPMemDevice removes a VPMem device in the guest.
61+
func (gm *Guest) RemoveVPMemDevice(ctx context.Context, settings guestresource.LCOWMappedVPMemDevice) error {
62+
request := &hcsschema.ModifySettingRequest{
63+
GuestRequest: guestrequest.ModificationRequest{
64+
ResourceType: guestresource.ResourceTypeVPMemDevice,
65+
RequestType: guestrequest.RequestTypeRemove,
66+
Settings: settings,
67+
},
68+
}
69+
70+
err := gm.modify(ctx, request.GuestRequest)
71+
if err != nil {
72+
return fmt.Errorf("failed to remove VPMem device: %w", err)
73+
}
74+
return nil
75+
}

internal/vm/guestmanager/doc.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
//go:build windows
2+
3+
/*
4+
Package guestmanager manages guest-side operations for utility VMs (UVMs) via the
5+
GCS (Guest Compute Service) connection.
6+
7+
It provides a concrete [Guest] struct, a top-level [Manager] interface that
8+
aggregates connection lifecycle and container/process operations, and a set of
9+
granular resource-scoped manager interfaces:
10+
11+
- [Manager] – connection lifecycle, container and process creation, stack dumps,
12+
and container state deletion.
13+
- [LCOWNetworkManager] – add and remove network interfaces in an LCOW guest.
14+
- [WCOWNetworkManager] – add and remove network interfaces and namespaces in a WCOW guest.
15+
- [LCOWDirectoryManager] – map and unmap directories in an LCOW guest.
16+
- [WCOWDirectoryManager] – map directories in a WCOW guest.
17+
- [LCOWScsiManager] – add and remove mapped virtual disks and SCSI devices in an LCOW guest.
18+
- [WCOWScsiManager] – add and remove mapped virtual disks and SCSI devices in a WCOW guest.
19+
- [LCOWLayersManager] – add and remove combined layers in an LCOW guest.
20+
- [WCOWLayersManager] – add and remove combined layers in a WCOW guest.
21+
- [CIMsManager] – add and remove WCOW block CIM mounts.
22+
- [LCOWDeviceManager] – add and remove VPCI and VPMem devices in an LCOW guest.
23+
- [SecurityPolicyManager] – add security policies and inject policy fragments.
24+
25+
All interfaces are implemented by [Guest].
26+
27+
This package is strictly guest-side. It does not own or modify host-side UVM
28+
state; that is the responsibility of the sibling vmmanager package. It also does
29+
not store UVM host or guest state — state management belongs to the orchestration
30+
layer above.
31+
32+
# Creating a Guest
33+
34+
After the UVM has been started via vmmanager, create a [Guest] and establish the
35+
GCS connection:
36+
37+
g, err := guestmanager.New(ctx, uvm)
38+
if err != nil { // handle error }
39+
if err := g.CreateConnection(ctx); err != nil { // handle error }
40+
41+
After the connection is established, use the manager interfaces for guest-side changes:
42+
43+
_ = g.AddLCOWNetworkInterface(ctx, &guestresource.LCOWNetworkAdapter{...})
44+
_ = g.AddLCOWMappedVirtualDisk(ctx, guestresource.LCOWMappedVirtualDisk{...})
45+
46+
# Layer Boundaries
47+
48+
This package covers guest-side changes executed over the GCS connection. Host-side
49+
VM configuration and lifecycle operations belong in the sibling vmmanager package.
50+
*/
51+
package guestmanager

0 commit comments

Comments
 (0)