Skip to content

Commit 11fd4bd

Browse files
committed
Add containerID to CombineLayers and MountBlockCIM request types
containerID is required for all gcs requests in confidential mode. Most of the requests already include it but CombineLayers and MountBlockCIM request types don't. This commit adds that to these request types. Signed-off-by: Amit Barve <ambarve@microsoft.com>
1 parent e48451f commit 11fd4bd

7 files changed

Lines changed: 71 additions & 27 deletions

File tree

internal/gcs-sidecar/handlers.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,11 @@ func (b *Bridge) modifySettings(req *request) (err error) {
338338

339339
case guestresource.ResourceTypeWCOWBlockCims:
340340
// This is request to mount the merged cim at given volumeGUID
341-
wcowBlockCimMounts := modifyGuestSettingsRequest.Settings.(*guestresource.WCOWBlockCIMMounts)
341+
if modifyGuestSettingsRequest.RequestType == guestrequest.RequestTypeRemove {
342+
return fmt.Errorf("not implemented")
343+
}
344+
345+
wcowBlockCimMounts := modifyGuestSettingsRequest.Settings.(*guestresource.CWCOWBlockCIMMounts)
342346
log.G(ctx).Tracef("WCOWBlockCIMMounts { %v}", wcowBlockCimMounts)
343347

344348
// The block device takes some time to show up. Wait for a few seconds.
@@ -386,6 +390,11 @@ func (b *Bridge) modifySettings(req *request) (err error) {
386390
return nil
387391

388392
case guestresource.ResourceTypeCWCOWCombinedLayers:
393+
394+
if modifyGuestSettingsRequest.RequestType == guestrequest.RequestTypeRemove {
395+
return fmt.Errorf("not implemented")
396+
}
397+
389398
settings := modifyGuestSettingsRequest.Settings.(*guestresource.CWCOWCombinedLayers)
390399
containerID := settings.ContainerID
391400
log.G(ctx).Tracef("CWCOWCombinedLayers:: ContainerID: %v, ContainerRootPath: %v, Layers: %v, ScratchPath: %v",

internal/gcs-sidecar/uvm.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ func unmarshalContainerModifySettings(req *request) (_ *prot.ContainerModifySett
106106
modifyGuestSettingsRequest.Settings = wcowMappedVirtualDisk
107107

108108
case guestresource.ResourceTypeWCOWBlockCims:
109-
wcowBlockCimMounts := &guestresource.WCOWBlockCIMMounts{}
109+
wcowBlockCimMounts := &guestresource.CWCOWBlockCIMMounts{}
110110
if err := commonutils.UnmarshalJSONWithHresult(rawGuestRequest, wcowBlockCimMounts); err != nil {
111111
return nil, fmt.Errorf("invalid ResourceTypeWCOWBlockCims request: %w", err)
112112
}

internal/layers/wcow_mount.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,8 @@ func mountHypervIsolatedWCIFSLayers(ctx context.Context, l *wcowWCIFSLayers, vm
440440
})
441441
}
442442

443-
err = vm.CombineLayersWCOW(ctx, hcsLayers, ml.RootFS, hcsschema.WCIFS)
443+
// containerID isn't required when using non-confidential pods (WCIFS based layers can't run confidential pods)
444+
err = vm.CombineLayersWCOW(ctx, hcsLayers, ml.RootFS, hcsschema.WCIFS, "")
444445
if err != nil {
445446
return nil, nil, err
446447
}
@@ -476,7 +477,7 @@ func mountHypervIsolatedBlockCIMLayers(ctx context.Context, l *wcowBlockCIMLayer
476477
"parent layers": l.parentLayers,
477478
}).Debug("mounting hyperv isolated block CIM layers")
478479

479-
mountedCIMs, err := vm.MountBlockCIMs(ctx, l.mergedLayer, l.parentLayers)
480+
mountedCIMs, err := vm.MountBlockCIMs(ctx, l.mergedLayer, l.parentLayers, containerID)
480481
if err != nil {
481482
return nil, nil, fmt.Errorf("failed to mount block CIMs in UVM: %w", err)
482483
}
@@ -524,8 +525,7 @@ func mountHypervIsolatedBlockCIMLayers(ctx context.Context, l *wcowBlockCIMLayer
524525
},
525526
}
526527

527-
// TODO(ambarve): Do we need CWCOW specific request type here?
528-
err = vm.CombineLayersWCOW(ctx, hcsLayers, ml.RootFS, hcsschema.UnionFS)
528+
err = vm.CombineLayersWCOW(ctx, hcsLayers, ml.RootFS, hcsschema.UnionFS, containerID)
529529
if err != nil {
530530
return nil, nil, err
531531
}

internal/protocol/guestresource/resources.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,12 @@ type BlockCIMDevice struct {
114114
Lun int32
115115
}
116116

117-
type WCOWBlockCIMMounts struct {
117+
type CWCOWBlockCIMMounts struct {
118118
// BlockCIMs should be ordered from merged CIM followed by Layer n .. layer 1
119-
BlockCIMs []BlockCIMDevice `json:"BlockCIMs,omitempty"`
120-
VolumeGUID guid.GUID `json:"VolumeGUID,omitempty"`
121-
MountFlags uint32 `json:"MountFlags,omitempty"`
119+
BlockCIMs []BlockCIMDevice `json:"BlockCIMs,omitempty"`
120+
VolumeGUID guid.GUID `json:"VolumeGUID,omitempty"`
121+
MountFlags uint32 `json:"MountFlags,omitempty"`
122+
ContainerID string `json:"ContainerID,omitempty"`
122123
}
123124

124125
type WCOWMappedVirtualDisk struct {

internal/uvm/cimfs.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func (umb *UVMMountedBlockCIMs) Release(ctx context.Context) error {
4646
guestReq := guestrequest.ModificationRequest{
4747
ResourceType: guestresource.ResourceTypeWCOWBlockCims,
4848
RequestType: guestrequest.RequestTypeRemove,
49-
Settings: &guestresource.WCOWBlockCIMMounts{
49+
Settings: &guestresource.CWCOWBlockCIMMounts{
5050
VolumeGUID: umb.volumeGUID,
5151
},
5252
}
@@ -67,7 +67,7 @@ func (umb *UVMMountedBlockCIMs) Release(ctx context.Context) error {
6767

6868
// mergedCIM can be nil,
6969
// sourceCIMs MUST be in the top to bottom order
70-
func (uvm *UtilityVM) MountBlockCIMs(ctx context.Context, mergedCIM *cimfs.BlockCIM, sourceCIMs []*cimfs.BlockCIM) (_ *UVMMountedBlockCIMs, retErr error) {
70+
func (uvm *UtilityVM) MountBlockCIMs(ctx context.Context, mergedCIM *cimfs.BlockCIM, sourceCIMs []*cimfs.BlockCIM, containerID string) (_ *UVMMountedBlockCIMs, retErr error) {
7171
if len(sourceCIMs) < 1 {
7272
return nil, fmt.Errorf("at least 1 source CIM is required")
7373
}
@@ -94,10 +94,14 @@ func (uvm *UtilityVM) MountBlockCIMs(ctx context.Context, mergedCIM *cimfs.Block
9494
return nil, fmt.Errorf("generated cim mount GUID: %w", err)
9595
}
9696

97-
settings := &guestresource.WCOWBlockCIMMounts{
98-
BlockCIMs: []guestresource.BlockCIMDevice{},
99-
VolumeGUID: volumeGUID,
100-
MountFlags: cimfs.CimMountBlockDeviceCim,
97+
// TODO(ambarve): When inbox GCS adds support for mounting block CIMs, we should
98+
// use the appropriate request type for confidential vs regular pods as inbox GCS
99+
// may not understand the CWCOWBlockCIMMounts type.
100+
settings := &guestresource.CWCOWBlockCIMMounts{
101+
BlockCIMs: []guestresource.BlockCIMDevice{},
102+
VolumeGUID: volumeGUID,
103+
MountFlags: cimfs.CimMountBlockDeviceCim,
104+
ContainerID: containerID,
101105
}
102106

103107
umb := &UVMMountedBlockCIMs{

internal/uvm/combine_layers.go

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,41 @@ import (
1414
// container file system.
1515
//
1616
// Note: `layerPaths` and `containerRootPath` are paths from within the UVM.
17-
func (uvm *UtilityVM) CombineLayersWCOW(ctx context.Context, layerPaths []hcsschema.Layer, containerRootPath string, filterType hcsschema.FileSystemFilterType) error {
17+
func (uvm *UtilityVM) CombineLayersWCOW(ctx context.Context, layerPaths []hcsschema.Layer, containerRootPath string, filterType hcsschema.FileSystemFilterType, containerID string) error {
1818
if uvm.operatingSystem != "windows" {
1919
return errNotSupported
2020
}
21-
msr := &hcsschema.ModifySettingRequest{
22-
GuestRequest: guestrequest.ModificationRequest{
23-
ResourceType: guestresource.ResourceTypeCombinedLayers,
24-
RequestType: guestrequest.RequestTypeAdd,
25-
Settings: guestresource.WCOWCombinedLayers{
26-
ContainerRootPath: containerRootPath,
27-
Layers: layerPaths,
28-
FilterType: filterType,
21+
22+
var modifyRequest *hcsschema.ModifySettingRequest
23+
if uvm.HasConfidentialPolicy() {
24+
modifyRequest = &hcsschema.ModifySettingRequest{
25+
GuestRequest: guestrequest.ModificationRequest{
26+
ResourceType: guestresource.ResourceTypeCWCOWCombinedLayers,
27+
RequestType: guestrequest.RequestTypeAdd,
28+
Settings: guestresource.CWCOWCombinedLayers{
29+
ContainerID: containerID,
30+
CombinedLayers: guestresource.WCOWCombinedLayers{
31+
ContainerRootPath: containerRootPath,
32+
Layers: layerPaths,
33+
FilterType: filterType,
34+
},
35+
},
2936
},
30-
},
37+
}
38+
} else {
39+
modifyRequest = &hcsschema.ModifySettingRequest{
40+
GuestRequest: guestrequest.ModificationRequest{
41+
ResourceType: guestresource.ResourceTypeCombinedLayers,
42+
RequestType: guestrequest.RequestTypeAdd,
43+
Settings: guestresource.WCOWCombinedLayers{
44+
ContainerRootPath: containerRootPath,
45+
Layers: layerPaths,
46+
FilterType: filterType,
47+
},
48+
},
49+
}
3150
}
32-
return uvm.modify(ctx, msr)
51+
return uvm.modify(ctx, modifyRequest)
3352
}
3453

3554
// CombineLayersLCOW combines `layerPaths` and optionally `scratchPath` into an

internal/uvm/security_policy.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,14 @@ func (uvm *UtilityVM) InjectPolicyFragment(ctx context.Context, fragment *ctrdta
120120
}
121121
return uvm.modify(ctx, mod)
122122
}
123+
124+
// returns if this instance of the UtilityVM is created with confidential policy
125+
func (uvm *UtilityVM) HasConfidentialPolicy() bool {
126+
switch opts := uvm.createOpts.(type) {
127+
case *OptionsWCOW:
128+
return opts.SecurityPolicyEnabled
129+
case *OptionsLCOW:
130+
return opts.SecurityPolicyEnabled
131+
}
132+
return false
133+
}

0 commit comments

Comments
 (0)