Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 75 additions & 21 deletions chart/tests/clusterrole_test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,69 @@ templates:
- clusterrole.yaml

tests:
- it: disable when volume snapshot rules are disabled
- it: grants the fake PV handoff verbs when PVC sync is enabled and PV sync is disabled
set:
rbac:
enableVolumeSnapshotRules:
enabled: false
asserts:
- hasDocuments:
count: 1
- lengthEqual:
path: rules
count: 1
- contains:
path: rules
content:
apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "patch"]

- it: does not create a ClusterRole when PVC PV and snapshot access are disabled
set:
rbac:
enableVolumeSnapshotRules:
enabled: false
sync:
toHost:
persistentVolumeClaims:
enabled: false
persistentVolumes:
enabled: false
asserts:
- hasDocuments:
count: 0

- it: retains the full PV lifecycle verbs when PV sync is enabled
set:
rbac:
enableVolumeSnapshotRules:
enabled: false
sync:
toHost:
persistentVolumeClaims:
enabled: true
persistentVolumes:
enabled: true
asserts:
- hasDocuments:
count: 1
- lengthEqual:
path: rules
count: 2
- contains:
path: rules
content:
apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list"]
- contains:
path: rules
content:
apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["create", "delete", "patch", "update", "watch"]

- it: enabled by default with default rules
asserts:
- hasDocuments:
Expand Down Expand Up @@ -162,7 +216,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 4
count: 5
- contains:
path: rules
content:
Expand Down Expand Up @@ -212,7 +266,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 5
count: 6
- contains:
path: rules
content:
Expand Down Expand Up @@ -243,7 +297,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 5
count: 6
- contains:
path: rules
content:
Expand All @@ -269,7 +323,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 4
count: 5
- contains:
path: rules
content:
Expand All @@ -288,7 +342,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 5
count: 6
- contains:
path: rules
content:
Expand Down Expand Up @@ -318,7 +372,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 4
count: 5
- contains:
path: rules
content:
Expand All @@ -343,7 +397,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 4
count: 5
- contains:
path: rules
content:
Expand All @@ -359,7 +413,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 6
count: 7
- contains:
path: rules
content:
Expand Down Expand Up @@ -419,7 +473,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 4
count: 5
- contains:
path: rules
content:
Expand All @@ -439,7 +493,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 5
count: 6
- contains:
path: rules
content:
Expand All @@ -465,7 +519,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 5
count: 6
- contains:
path: rules
content:
Expand All @@ -487,7 +541,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 4
count: 5
- contains:
path: rules
content:
Expand All @@ -514,7 +568,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 6
count: 7
- contains:
path: rules
content:
Expand Down Expand Up @@ -588,7 +642,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 6
count: 7
- contains:
path: rules
content:
Expand Down Expand Up @@ -624,7 +678,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 6
count: 7
- contains:
path: rules
content:
Expand Down Expand Up @@ -660,7 +714,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 6
count: 7
- contains:
path: rules
content:
Expand Down Expand Up @@ -707,7 +761,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 6
count: 7
- contains:
path: rules
content:
Expand Down Expand Up @@ -743,7 +797,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 6
count: 7
- contains:
path: rules
content:
Expand Down Expand Up @@ -779,7 +833,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 6
count: 7
- contains:
path: rules
content:
Expand Down Expand Up @@ -813,7 +867,7 @@ tests:
count: 1
- lengthEqual:
path: rules
count: 4
count: 5
- contains:
path: rules
content:
Expand Down
12 changes: 9 additions & 3 deletions chart/tests/statefulset_test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ templates:

tests:
- it: image name
chart:
version: 9.8.7-test
set:
controlPlane:
statefulSet:
Expand All @@ -12,17 +14,19 @@ tests:
asserts:
- equal:
path: spec.template.spec.containers[0].image
value: custom-registry.com/loft-sh/vcluster-pro:0.0.1
value: custom-registry.com/loft-sh/vcluster-pro:9.8.7-test

- it: defaultImageRegistry
chart:
version: 9.8.7-test
set:
controlPlane:
advanced:
defaultImageRegistry: docker.io
asserts:
- equal:
path: spec.template.spec.containers[0].image
value: docker.io/loft-sh/vcluster-pro:0.0.1
value: docker.io/loft-sh/vcluster-pro:9.8.7-test

- it: custom tag
set:
Expand Down Expand Up @@ -81,6 +85,8 @@ tests:
release:
name: my-release
namespace: my-namespace
chart:
version: 9.8.7-test
capabilities:
majorVersion: 1
minorVersion: 29
Expand All @@ -95,7 +101,7 @@ tests:
count: 1
- equal:
path: spec.template.spec.containers[0].image
value: ghcr.io/loft-sh/vcluster-pro:0.0.1
value: ghcr.io/loft-sh/vcluster-pro:9.8.7-test
- contains:
path: spec.template.spec.containers[0].env
content:
Expand Down
93 changes: 93 additions & 0 deletions pkg/controllers/resources/persistentvolumeclaims/syncer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,99 @@ func (c *injectHelperAfterHostPVGetClient) Patch(ctx context.Context, obj client
return c.Client.Patch(ctx, obj, patch, opts...)
}

type hostPVAccessRecordingClient struct {
client.Client
pvGets int
pvPatches int
}

func (c *hostPVAccessRecordingClient) Get(ctx context.Context, key client.ObjectKey, obj client.Object, opts ...client.GetOption) error {
if _, ok := obj.(*corev1.PersistentVolume); ok {
c.pvGets++
}
return c.Client.Get(ctx, key, obj, opts...)
}

func (c *hostPVAccessRecordingClient) Patch(ctx context.Context, obj client.Object, patch client.Patch, opts ...client.PatchOption) error {
if _, ok := obj.(*corev1.PersistentVolume); ok {
c.pvPatches++
}
return c.Client.Patch(ctx, obj, patch, opts...)
}

func TestExternalPopulatorHostPVAccessContract(t *testing.T) {
virtualTarget := &corev1.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{
Name: "target",
Namespace: "virtual-ns",
UID: types.UID("virtual-target-uid"),
},
Spec: corev1.PersistentVolumeClaimSpec{VolumeName: "host-pv"},
Status: corev1.PersistentVolumeClaimStatus{
Conditions: []corev1.PersistentVolumeClaimCondition{
{
Type: externalPopulatorPopulateConditionType,
Status: corev1.ConditionTrue,
Reason: externalPopulatorRestoreConditionReasonSucceeded,
},
},
},
}
hostTarget := &corev1.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{
Name: "host-target",
Namespace: "host-ns",
UID: types.UID("host-target-uid"),
},
}
hostPV := &corev1.PersistentVolume{
ObjectMeta: metav1.ObjectMeta{Name: "host-pv"},
Spec: corev1.PersistentVolumeSpec{
ClaimRef: &corev1.ObjectReference{
APIVersion: corev1.SchemeGroupVersion.Version,
Kind: "PersistentVolumeClaim",
Name: hostTarget.Name,
Namespace: hostTarget.Namespace,
UID: types.UID("stale-host-target-uid"),
},
},
}
expectedHostPV := hostPV.DeepCopy()
expectedHostPV.Spec.ClaimRef.UID = hostTarget.UID

syncertesting.RunTests(t, []*syncertesting.SyncTest{
{
Name: "fake PV handoff gets and patches the host PV claimRef",
InitialPhysicalState: []runtime.Object{hostPV},
InitialVirtualState: []runtime.Object{virtualTarget},
ExpectedPhysicalState: map[schema.GroupVersionKind][]runtime.Object{
corev1.SchemeGroupVersion.WithKind("PersistentVolume"): {expectedHostPV},
},
ExpectedVirtualState: map[schema.GroupVersionKind][]runtime.Object{
corev1.SchemeGroupVersion.WithKind("PersistentVolumeClaim"): {virtualTarget},
},
Sync: func(ctx *synccontext.RegisterContext) {
syncCtx, rawSyncer := syncertesting.FakeStartSyncer(t, ctx, New)
recorder := &hostPVAccessRecordingClient{Client: syncCtx.HostClient}
syncCtx.HostClient = recorder

ready, err := rawSyncer.(*persistentVolumeClaimSyncer).ensureExternalPopulatorHostPVClaimRef(
syncCtx,
hostPV.Name,
hostTarget,
virtualTarget,
nil,
false,
)
assert.NilError(t, err)
assert.Check(t, ready)
assert.Equal(t, recorder.pvGets, 1)
assert.Equal(t, recorder.pvPatches, 1)
},
},
})
}

func TestSync(t *testing.T) {
vObjectMeta := metav1.ObjectMeta{
Name: "testpvc",
Expand Down