123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554 |
- /*
- Copyright 2016 The Kubernetes Authors.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package persistentvolume
- import (
- "testing"
- "k8s.io/kubernetes/pkg/api"
- "k8s.io/kubernetes/pkg/apis/extensions"
- )
- // Test single call to syncClaim and syncVolume methods.
- // 1. Fill in the controller with initial data
- // 2. Call the tested function (syncClaim/syncVolume) via
- // controllerTest.testCall *once*.
- // 3. Compare resulting volumes and claims with expected volumes and claims.
- func TestSync(t *testing.T) {
- labels := map[string]string{
- "foo": "true",
- "bar": "false",
- }
- tests := []controllerTest{
- // [Unit test set 1] User did not care which PV they get.
- // Test the matching with no claim.Spec.VolumeName and with various
- // volumes.
- {
- // syncClaim binds to a matching unbound volume.
- "1-1 - successful bind",
- newVolumeArray("volume1-1", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume1-1", "1Gi", "uid1-1", "claim1-1", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- newClaimArray("claim1-1", "uid1-1", "1Gi", "", api.ClaimPending),
- newClaimArray("claim1-1", "uid1-1", "1Gi", "volume1-1", api.ClaimBound, annBoundByController, annBindCompleted),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim does not do anything when there is no matching volume.
- "1-2 - noop",
- newVolumeArray("volume1-2", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume1-2", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newClaimArray("claim1-2", "uid1-2", "10Gi", "", api.ClaimPending),
- newClaimArray("claim1-2", "uid1-2", "10Gi", "", api.ClaimPending),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim resets claim.Status to Pending when there is no
- // matching volume.
- "1-3 - reset to Pending",
- newVolumeArray("volume1-3", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume1-3", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newClaimArray("claim1-3", "uid1-3", "10Gi", "", api.ClaimBound),
- newClaimArray("claim1-3", "uid1-3", "10Gi", "", api.ClaimPending),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim binds claims to the smallest matching volume
- "1-4 - smallest volume",
- []*api.PersistentVolume{
- newVolume("volume1-4_1", "10Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolume("volume1-4_2", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- },
- []*api.PersistentVolume{
- newVolume("volume1-4_1", "10Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolume("volume1-4_2", "1Gi", "uid1-4", "claim1-4", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- },
- newClaimArray("claim1-4", "uid1-4", "1Gi", "", api.ClaimPending),
- newClaimArray("claim1-4", "uid1-4", "1Gi", "volume1-4_2", api.ClaimBound, annBoundByController, annBindCompleted),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim binds a claim only to volume that points to it (by
- // name), even though a smaller one is available.
- "1-5 - prebound volume by name - success",
- []*api.PersistentVolume{
- newVolume("volume1-5_1", "10Gi", "", "claim1-5", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolume("volume1-5_2", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- },
- []*api.PersistentVolume{
- newVolume("volume1-5_1", "10Gi", "uid1-5", "claim1-5", api.VolumeBound, api.PersistentVolumeReclaimRetain),
- newVolume("volume1-5_2", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- },
- newClaimArray("claim1-5", "uid1-5", "1Gi", "", api.ClaimPending),
- withExpectedCapacity("10Gi", newClaimArray("claim1-5", "uid1-5", "1Gi", "volume1-5_1", api.ClaimBound, annBoundByController, annBindCompleted)),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim binds a claim only to volume that points to it (by
- // UID), even though a smaller one is available.
- "1-6 - prebound volume by UID - success",
- []*api.PersistentVolume{
- newVolume("volume1-6_1", "10Gi", "uid1-6", "claim1-6", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolume("volume1-6_2", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- },
- []*api.PersistentVolume{
- newVolume("volume1-6_1", "10Gi", "uid1-6", "claim1-6", api.VolumeBound, api.PersistentVolumeReclaimRetain),
- newVolume("volume1-6_2", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- },
- newClaimArray("claim1-6", "uid1-6", "1Gi", "", api.ClaimPending),
- withExpectedCapacity("10Gi", newClaimArray("claim1-6", "uid1-6", "1Gi", "volume1-6_1", api.ClaimBound, annBoundByController, annBindCompleted)),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim does not bind claim to a volume prebound to a claim with
- // same name and different UID
- "1-7 - prebound volume to different claim",
- newVolumeArray("volume1-7", "10Gi", "uid1-777", "claim1-7", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume1-7", "10Gi", "uid1-777", "claim1-7", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newClaimArray("claim1-7", "uid1-7", "1Gi", "", api.ClaimPending),
- newClaimArray("claim1-7", "uid1-7", "1Gi", "", api.ClaimPending),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim completes binding - simulates controller crash after
- // PV.ClaimRef is saved
- "1-8 - complete bind after crash - PV bound",
- newVolumeArray("volume1-8", "1Gi", "uid1-8", "claim1-8", api.VolumePending, api.PersistentVolumeReclaimRetain, annBoundByController),
- newVolumeArray("volume1-8", "1Gi", "uid1-8", "claim1-8", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- newClaimArray("claim1-8", "uid1-8", "1Gi", "", api.ClaimPending),
- newClaimArray("claim1-8", "uid1-8", "1Gi", "volume1-8", api.ClaimBound, annBoundByController, annBindCompleted),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim completes binding - simulates controller crash after
- // PV.Status is saved
- "1-9 - complete bind after crash - PV status saved",
- newVolumeArray("volume1-9", "1Gi", "uid1-9", "claim1-9", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- newVolumeArray("volume1-9", "1Gi", "uid1-9", "claim1-9", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- newClaimArray("claim1-9", "uid1-9", "1Gi", "", api.ClaimPending),
- newClaimArray("claim1-9", "uid1-9", "1Gi", "volume1-9", api.ClaimBound, annBoundByController, annBindCompleted),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim completes binding - simulates controller crash after
- // PVC.VolumeName is saved
- "1-10 - complete bind after crash - PVC bound",
- newVolumeArray("volume1-10", "1Gi", "uid1-10", "claim1-10", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- newVolumeArray("volume1-10", "1Gi", "uid1-10", "claim1-10", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- newClaimArray("claim1-10", "uid1-10", "1Gi", "volume1-10", api.ClaimPending, annBoundByController, annBindCompleted),
- newClaimArray("claim1-10", "uid1-10", "1Gi", "volume1-10", api.ClaimBound, annBoundByController, annBindCompleted),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim binds a claim only when the label selector matches the volume
- "1-11 - bind when selector matches",
- withLabels(labels, newVolumeArray("volume1-1", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain)),
- withLabels(labels, newVolumeArray("volume1-1", "1Gi", "uid1-1", "claim1-1", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController)),
- withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", api.ClaimPending)),
- withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "volume1-1", api.ClaimBound, annBoundByController, annBindCompleted)),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim does not bind a claim when the label selector doesn't match
- "1-12 - do not bind when selector does not match",
- newVolumeArray("volume1-1", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume1-1", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", api.ClaimPending)),
- withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", api.ClaimPending)),
- noevents, noerrors, testSyncClaim,
- },
- // [Unit test set 2] User asked for a specific PV.
- // Test the binding when pv.ClaimRef is already set by controller or
- // by user.
- {
- // syncClaim with claim pre-bound to a PV that does not exist
- "2-1 - claim prebound to non-existing volume - noop",
- novolumes,
- novolumes,
- newClaimArray("claim2-1", "uid2-1", "10Gi", "volume2-1", api.ClaimPending),
- newClaimArray("claim2-1", "uid2-1", "10Gi", "volume2-1", api.ClaimPending),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim with claim pre-bound to a PV that does not exist.
- // Check that the claim status is reset to Pending
- "2-2 - claim prebound to non-existing volume - reset status",
- novolumes,
- novolumes,
- newClaimArray("claim2-2", "uid2-2", "10Gi", "volume2-2", api.ClaimBound),
- newClaimArray("claim2-2", "uid2-2", "10Gi", "volume2-2", api.ClaimPending),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim with claim pre-bound to a PV that exists and is
- // unbound. Check it gets bound and no annBoundByController is set.
- "2-3 - claim prebound to unbound volume",
- newVolumeArray("volume2-3", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume2-3", "1Gi", "uid2-3", "claim2-3", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", api.ClaimPending),
- newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", api.ClaimBound, annBindCompleted),
- noevents, noerrors, testSyncClaim,
- },
- {
- // claim with claim pre-bound to a PV that is pre-bound to the claim
- // by name. Check it gets bound and no annBoundByController is set.
- "2-4 - claim prebound to prebound volume by name",
- newVolumeArray("volume2-4", "1Gi", "", "claim2-4", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume2-4", "1Gi", "uid2-4", "claim2-4", api.VolumeBound, api.PersistentVolumeReclaimRetain),
- newClaimArray("claim2-4", "uid2-4", "1Gi", "volume2-4", api.ClaimPending),
- newClaimArray("claim2-4", "uid2-4", "1Gi", "volume2-4", api.ClaimBound, annBindCompleted),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim with claim pre-bound to a PV that is pre-bound to the
- // claim by UID. Check it gets bound and no annBoundByController is
- // set.
- "2-5 - claim prebound to prebound volume by UID",
- newVolumeArray("volume2-5", "1Gi", "uid2-5", "claim2-5", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume2-5", "1Gi", "uid2-5", "claim2-5", api.VolumeBound, api.PersistentVolumeReclaimRetain),
- newClaimArray("claim2-5", "uid2-5", "1Gi", "volume2-5", api.ClaimPending),
- newClaimArray("claim2-5", "uid2-5", "1Gi", "volume2-5", api.ClaimBound, annBindCompleted),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim with claim pre-bound to a PV that is bound to different
- // claim. Check it's reset to Pending.
- "2-6 - claim prebound to already bound volume",
- newVolumeArray("volume2-6", "1Gi", "uid2-6_1", "claim2-6_1", api.VolumeBound, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume2-6", "1Gi", "uid2-6_1", "claim2-6_1", api.VolumeBound, api.PersistentVolumeReclaimRetain),
- newClaimArray("claim2-6", "uid2-6", "1Gi", "volume2-6", api.ClaimBound),
- newClaimArray("claim2-6", "uid2-6", "1Gi", "volume2-6", api.ClaimPending),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim with claim bound by controller to a PV that is bound to
- // different claim. Check it throws an error.
- "2-7 - claim bound by controller to already bound volume",
- newVolumeArray("volume2-7", "1Gi", "uid2-7_1", "claim2-7_1", api.VolumeBound, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume2-7", "1Gi", "uid2-7_1", "claim2-7_1", api.VolumeBound, api.PersistentVolumeReclaimRetain),
- newClaimArray("claim2-7", "uid2-7", "1Gi", "volume2-7", api.ClaimBound, annBoundByController),
- newClaimArray("claim2-7", "uid2-7", "1Gi", "volume2-7", api.ClaimBound, annBoundByController),
- noevents, noerrors, testSyncClaimError,
- },
- {
- // syncClaim with claim pre-bound to a PV that exists and is
- // unbound, but does not match the selector. Check it gets bound
- // and no annBoundByController is set.
- "2-8 - claim prebound to unbound volume that does not match the selector",
- newVolumeArray("volume2-3", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume2-3", "1Gi", "uid2-3", "claim2-3", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- withLabelSelector(labels, newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", api.ClaimPending)),
- withLabelSelector(labels, newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", api.ClaimBound, annBindCompleted)),
- noevents, noerrors, testSyncClaim,
- },
- // [Unit test set 3] Syncing bound claim
- {
- // syncClaim with claim bound and its claim.Spec.VolumeName is
- // removed. Check it's marked as Lost.
- "3-1 - bound claim with missing VolumeName",
- novolumes,
- novolumes,
- newClaimArray("claim3-1", "uid3-1", "10Gi", "", api.ClaimBound, annBoundByController, annBindCompleted),
- newClaimArray("claim3-1", "uid3-1", "10Gi", "", api.ClaimLost, annBoundByController, annBindCompleted),
- []string{"Warning ClaimLost"}, noerrors, testSyncClaim,
- },
- {
- // syncClaim with claim bound to non-existing volume. Check it's
- // marked as Lost.
- "3-2 - bound claim with missing volume",
- novolumes,
- novolumes,
- newClaimArray("claim3-2", "uid3-2", "10Gi", "volume3-2", api.ClaimBound, annBoundByController, annBindCompleted),
- newClaimArray("claim3-2", "uid3-2", "10Gi", "volume3-2", api.ClaimLost, annBoundByController, annBindCompleted),
- []string{"Warning ClaimLost"}, noerrors, testSyncClaim,
- },
- {
- // syncClaim with claim bound to unbound volume. Check it's bound.
- // Also check that Pending phase is set to Bound
- "3-3 - bound claim with unbound volume",
- newVolumeArray("volume3-3", "10Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume3-3", "10Gi", "uid3-3", "claim3-3", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", api.ClaimPending, annBoundByController, annBindCompleted),
- newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", api.ClaimBound, annBoundByController, annBindCompleted),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim with claim bound to volume with missing (or different)
- // volume.Spec.ClaimRef.UID. Check that the claim is marked as lost.
- "3-4 - bound claim with prebound volume",
- newVolumeArray("volume3-4", "10Gi", "claim3-4-x", "claim3-4", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume3-4", "10Gi", "claim3-4-x", "claim3-4", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newClaimArray("claim3-4", "uid3-4", "10Gi", "volume3-4", api.ClaimPending, annBoundByController, annBindCompleted),
- newClaimArray("claim3-4", "uid3-4", "10Gi", "volume3-4", api.ClaimLost, annBoundByController, annBindCompleted),
- []string{"Warning ClaimMisbound"}, noerrors, testSyncClaim,
- },
- {
- // syncClaim with claim bound to bound volume. Check that the
- // controller does not do anything. Also check that Pending phase is
- // set to Bound
- "3-5 - bound claim with bound volume",
- newVolumeArray("volume3-5", "10Gi", "uid3-5", "claim3-5", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume3-5", "10Gi", "uid3-5", "claim3-5", api.VolumeBound, api.PersistentVolumeReclaimRetain),
- newClaimArray("claim3-5", "uid3-5", "10Gi", "volume3-5", api.ClaimPending, annBindCompleted),
- newClaimArray("claim3-5", "uid3-5", "10Gi", "volume3-5", api.ClaimBound, annBindCompleted),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncClaim with claim bound to a volume that is bound to different
- // claim. Check that the claim is marked as lost.
- // TODO: test that an event is emitted
- "3-6 - bound claim with bound volume",
- newVolumeArray("volume3-6", "10Gi", "uid3-6-x", "claim3-6-x", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume3-6", "10Gi", "uid3-6-x", "claim3-6-x", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newClaimArray("claim3-6", "uid3-6", "10Gi", "volume3-6", api.ClaimPending, annBindCompleted),
- newClaimArray("claim3-6", "uid3-6", "10Gi", "volume3-6", api.ClaimLost, annBindCompleted),
- []string{"Warning ClaimMisbound"}, noerrors, testSyncClaim,
- },
- {
- // syncClaim with claim bound to unbound volume. Check it's bound
- // even if the claim's selector doesn't match the volume. Also
- // check that Pending phase is set to Bound
- "3-7 - bound claim with unbound volume where selector doesn't match",
- newVolumeArray("volume3-3", "10Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume3-3", "10Gi", "uid3-3", "claim3-3", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- withLabelSelector(labels, newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", api.ClaimPending, annBoundByController, annBindCompleted)),
- withLabelSelector(labels, newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", api.ClaimBound, annBoundByController, annBindCompleted)),
- noevents, noerrors, testSyncClaim,
- },
- // [Unit test set 4] All syncVolume tests.
- {
- // syncVolume with pending volume. Check it's marked as Available.
- "4-1 - pending volume",
- newVolumeArray("volume4-1", "10Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume4-1", "10Gi", "", "", api.VolumeAvailable, api.PersistentVolumeReclaimRetain),
- noclaims,
- noclaims,
- noevents, noerrors, testSyncVolume,
- },
- {
- // syncVolume with prebound pending volume. Check it's marked as
- // Available.
- "4-2 - pending prebound volume",
- newVolumeArray("volume4-2", "10Gi", "", "claim4-2", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume4-2", "10Gi", "", "claim4-2", api.VolumeAvailable, api.PersistentVolumeReclaimRetain),
- noclaims,
- noclaims,
- noevents, noerrors, testSyncVolume,
- },
- {
- // syncVolume with volume bound to missing claim.
- // Check the volume gets Released
- "4-3 - bound volume with missing claim",
- newVolumeArray("volume4-3", "10Gi", "uid4-3", "claim4-3", api.VolumeBound, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume4-3", "10Gi", "uid4-3", "claim4-3", api.VolumeReleased, api.PersistentVolumeReclaimRetain),
- noclaims,
- noclaims,
- noevents, noerrors, testSyncVolume,
- },
- {
- // syncVolume with volume bound to claim with different UID.
- // Check the volume gets Released.
- "4-4 - volume bound to claim with different UID",
- newVolumeArray("volume4-4", "10Gi", "uid4-4", "claim4-4", api.VolumeBound, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume4-4", "10Gi", "uid4-4", "claim4-4", api.VolumeReleased, api.PersistentVolumeReclaimRetain),
- newClaimArray("claim4-4", "uid4-4-x", "10Gi", "volume4-4", api.ClaimBound, annBindCompleted),
- newClaimArray("claim4-4", "uid4-4-x", "10Gi", "volume4-4", api.ClaimBound, annBindCompleted),
- noevents, noerrors, testSyncVolume,
- },
- {
- // syncVolume with volume bound by controller to unbound claim.
- // Check syncVolume does not do anything.
- "4-5 - volume bound by controller to unbound claim",
- newVolumeArray("volume4-5", "10Gi", "uid4-5", "claim4-5", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- newVolumeArray("volume4-5", "10Gi", "uid4-5", "claim4-5", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- newClaimArray("claim4-5", "uid4-5", "10Gi", "", api.ClaimPending),
- newClaimArray("claim4-5", "uid4-5", "10Gi", "", api.ClaimPending),
- noevents, noerrors, testSyncVolume,
- },
- {
- // syncVolume with volume bound by user to unbound claim.
- // Check syncVolume does not do anything.
- "4-5 - volume bound by user to bound claim",
- newVolumeArray("volume4-5", "10Gi", "uid4-5", "claim4-5", api.VolumeBound, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume4-5", "10Gi", "uid4-5", "claim4-5", api.VolumeBound, api.PersistentVolumeReclaimRetain),
- newClaimArray("claim4-5", "uid4-5", "10Gi", "", api.ClaimPending),
- newClaimArray("claim4-5", "uid4-5", "10Gi", "", api.ClaimPending),
- noevents, noerrors, testSyncVolume,
- },
- {
- // syncVolume with volume bound to bound claim.
- // Check that the volume is marked as Bound.
- "4-6 - volume bound by to bound claim",
- newVolumeArray("volume4-6", "10Gi", "uid4-6", "claim4-6", api.VolumeAvailable, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume4-6", "10Gi", "uid4-6", "claim4-6", api.VolumeBound, api.PersistentVolumeReclaimRetain),
- newClaimArray("claim4-6", "uid4-6", "10Gi", "volume4-6", api.ClaimBound),
- newClaimArray("claim4-6", "uid4-6", "10Gi", "volume4-6", api.ClaimBound),
- noevents, noerrors, testSyncVolume,
- },
- {
- // syncVolume with volume bound by controller to claim bound to
- // another volume. Check that the volume is rolled back.
- "4-7 - volume bound by controller to claim bound somewhere else",
- newVolumeArray("volume4-7", "10Gi", "uid4-7", "claim4-7", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- newVolumeArray("volume4-7", "10Gi", "", "", api.VolumeAvailable, api.PersistentVolumeReclaimRetain),
- newClaimArray("claim4-7", "uid4-7", "10Gi", "volume4-7-x", api.ClaimBound),
- newClaimArray("claim4-7", "uid4-7", "10Gi", "volume4-7-x", api.ClaimBound),
- noevents, noerrors, testSyncVolume,
- },
- {
- // syncVolume with volume bound by user to claim bound to
- // another volume. Check that the volume is marked as Available
- // and its UID is reset.
- "4-8 - volume bound by user to claim bound somewhere else",
- newVolumeArray("volume4-8", "10Gi", "uid4-8", "claim4-8", api.VolumeBound, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume4-8", "10Gi", "", "claim4-8", api.VolumeAvailable, api.PersistentVolumeReclaimRetain),
- newClaimArray("claim4-8", "uid4-8", "10Gi", "volume4-8-x", api.ClaimBound),
- newClaimArray("claim4-8", "uid4-8", "10Gi", "volume4-8-x", api.ClaimBound),
- noevents, noerrors, testSyncVolume,
- },
- // PVC with class
- {
- // syncVolume binds a claim to requested class even if there is a
- // smaller PV available
- "13-1 - binding to class",
- []*api.PersistentVolume{
- newVolume("volume13-1-1", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolume("volume13-1-2", "10Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain, annClass),
- },
- []*api.PersistentVolume{
- newVolume("volume13-1-1", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolume("volume13-1-2", "10Gi", "uid13-1", "claim13-1", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController, annClass),
- },
- newClaimArray("claim13-1", "uid13-1", "1Gi", "", api.ClaimPending, annClass),
- withExpectedCapacity("10Gi", newClaimArray("claim13-1", "uid13-1", "1Gi", "volume13-1-2", api.ClaimBound, annBoundByController, annClass, annBindCompleted)),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncVolume binds a claim without a class even if there is a
- // smaller PV with a class available
- "13-2 - binding without a class",
- []*api.PersistentVolume{
- newVolume("volume13-2-1", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain, annClass),
- newVolume("volume13-2-2", "10Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- },
- []*api.PersistentVolume{
- newVolume("volume13-2-1", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain, annClass),
- newVolume("volume13-2-2", "10Gi", "uid13-2", "claim13-2", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- },
- newClaimArray("claim13-2", "uid13-2", "1Gi", "", api.ClaimPending),
- withExpectedCapacity("10Gi", newClaimArray("claim13-2", "uid13-2", "1Gi", "volume13-2-2", api.ClaimBound, annBoundByController, annBindCompleted)),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncVolume binds a claim with given class even if there is a
- // smaller PV with different class available
- "13-3 - binding to specific a class",
- volumeWithClass("silver", []*api.PersistentVolume{
- newVolume("volume13-3-1", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolume("volume13-3-2", "10Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain, annClass),
- }),
- volumeWithClass("silver", []*api.PersistentVolume{
- newVolume("volume13-3-1", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolume("volume13-3-2", "10Gi", "uid13-3", "claim13-3", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController, annClass),
- }),
- newClaimArray("claim13-3", "uid13-3", "1Gi", "", api.ClaimPending, annClass),
- withExpectedCapacity("10Gi", newClaimArray("claim13-3", "uid13-3", "1Gi", "volume13-3-2", api.ClaimBound, annBoundByController, annBindCompleted, annClass)),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncVolume binds claim requesting class "" to claim to PV with
- // class=""
- "13-4 - empty class",
- volumeWithClass("", newVolumeArray("volume13-4", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain)),
- volumeWithClass("", newVolumeArray("volume13-4", "1Gi", "uid13-4", "claim13-4", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController)),
- claimWithClass("", newClaimArray("claim13-4", "uid13-4", "1Gi", "", api.ClaimPending)),
- claimWithClass("", newClaimArray("claim13-4", "uid13-4", "1Gi", "volume13-4", api.ClaimBound, annBoundByController, annBindCompleted)),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncVolume binds claim requesting class nil to claim to PV with
- // class = ""
- "13-5 - nil class",
- volumeWithClass("", newVolumeArray("volume13-5", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain)),
- volumeWithClass("", newVolumeArray("volume13-5", "1Gi", "uid13-5", "claim13-5", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController)),
- newClaimArray("claim13-5", "uid13-5", "1Gi", "", api.ClaimPending),
- newClaimArray("claim13-5", "uid13-5", "1Gi", "volume13-5", api.ClaimBound, annBoundByController, annBindCompleted),
- noevents, noerrors, testSyncClaim,
- },
- {
- // syncVolume binds claim requesting class "" to claim to PV with
- // class=nil
- "13-6 - nil class in PV, '' class in claim",
- newVolumeArray("volume13-6", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume13-6", "1Gi", "uid13-6", "claim13-6", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- claimWithClass("", newClaimArray("claim13-6", "uid13-6", "1Gi", "", api.ClaimPending)),
- claimWithClass("", newClaimArray("claim13-6", "uid13-6", "1Gi", "volume13-6", api.ClaimBound, annBoundByController, annBindCompleted)),
- noevents, noerrors, testSyncClaim,
- },
- }
- runSyncTests(t, tests, []*extensions.StorageClass{})
- }
- // Test multiple calls to syncClaim/syncVolume and periodic sync of all
- // volume/claims. The test follows this pattern:
- // 0. Load the controller with initial data.
- // 1. Call controllerTest.testCall() once as in TestSync()
- // 2. For all volumes/claims changed by previous syncVolume/syncClaim calls,
- // call appropriate syncVolume/syncClaim (simulating "volume/claim changed"
- // events). Go to 2. if these calls change anything.
- // 3. When all changes are processed and no new changes were made, call
- // syncVolume/syncClaim on all volumes/claims (simulating "periodic sync").
- // 4. If some changes were done by step 3., go to 2. (simulation of
- // "volume/claim updated" events, eventually performing step 3. again)
- // 5. When 3. does not do any changes, finish the tests and compare final set
- // of volumes/claims with expected claims/volumes and report differences.
- // Some limit of calls in enforced to prevent endless loops.
- func TestMultiSync(t *testing.T) {
- tests := []controllerTest{
- // Test simple binding
- {
- // syncClaim binds to a matching unbound volume.
- "10-1 - successful bind",
- newVolumeArray("volume10-1", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
- newVolumeArray("volume10-1", "1Gi", "uid10-1", "claim10-1", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- newClaimArray("claim10-1", "uid10-1", "1Gi", "", api.ClaimPending),
- newClaimArray("claim10-1", "uid10-1", "1Gi", "volume10-1", api.ClaimBound, annBoundByController, annBindCompleted),
- noevents, noerrors, testSyncClaim,
- },
- {
- // Two controllers bound two PVs to single claim. Test one of them
- // wins and the second rolls back.
- "10-2 - bind PV race",
- []*api.PersistentVolume{
- newVolume("volume10-2-1", "1Gi", "uid10-2", "claim10-2", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- newVolume("volume10-2-2", "1Gi", "uid10-2", "claim10-2", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- },
- []*api.PersistentVolume{
- newVolume("volume10-2-1", "1Gi", "uid10-2", "claim10-2", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
- newVolume("volume10-2-2", "1Gi", "", "", api.VolumeAvailable, api.PersistentVolumeReclaimRetain),
- },
- newClaimArray("claim10-2", "uid10-2", "1Gi", "volume10-2-1", api.ClaimBound, annBoundByController, annBindCompleted),
- newClaimArray("claim10-2", "uid10-2", "1Gi", "volume10-2-1", api.ClaimBound, annBoundByController, annBindCompleted),
- noevents, noerrors, testSyncClaim,
- },
- }
- runMultisyncTests(t, tests, []*extensions.StorageClass{}, "")
- }
|