Enable dynamic provisioning of GCE Regional PD
This is the code required to create a GCE Regional PD via the Kubernetes dynamic provisioning and a GCE PD StorageClass.
This commit is contained in:
@@ -396,134 +396,477 @@ func TestChooseZoneForVolume(t *testing.T) {
|
||||
checkFnv32(t, "", 2166136261)
|
||||
|
||||
tests := []struct {
|
||||
Zones []string
|
||||
Zones sets.String
|
||||
VolumeName string
|
||||
Expected string
|
||||
}{
|
||||
// Test for PVC names that don't have a dash
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley",
|
||||
Expected: "a", // hash("henley") == 0
|
||||
},
|
||||
// Tests for PVC names that end in - number, but don't look like statefulset PVCs
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-0",
|
||||
Expected: "a", // hash("henley") == 0
|
||||
},
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-1",
|
||||
Expected: "b", // hash("henley") + 1 == 1
|
||||
},
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-2",
|
||||
Expected: "c", // hash("henley") + 2 == 2
|
||||
},
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-3",
|
||||
Expected: "a", // hash("henley") + 3 == 3 === 0 mod 3
|
||||
},
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-4",
|
||||
Expected: "b", // hash("henley") + 4 == 4 === 1 mod 3
|
||||
},
|
||||
// Tests for PVC names that are edge cases
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-",
|
||||
Expected: "c", // hash("henley-") = 2652299129 === 2 mod 3
|
||||
},
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-a",
|
||||
Expected: "c", // hash("henley-a") = 1459735322 === 2 mod 3
|
||||
},
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium--1",
|
||||
Expected: "c", // hash("") + 1 == 2166136261 + 1 === 2 mod 3
|
||||
},
|
||||
// Tests for PVC names for simple StatefulSet cases
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley-1",
|
||||
Expected: "b", // hash("henley") + 1 == 1
|
||||
},
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "loud-henley-1",
|
||||
Expected: "b", // hash("henley") + 1 == 1
|
||||
},
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "quiet-henley-2",
|
||||
Expected: "c", // hash("henley") + 2 == 2
|
||||
},
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley-2",
|
||||
Expected: "c", // hash("henley") + 2 == 2
|
||||
},
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley-3",
|
||||
Expected: "a", // hash("henley") + 3 == 3 === 0 mod 3
|
||||
},
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley-4",
|
||||
Expected: "b", // hash("henley") + 4 == 4 === 1 mod 3
|
||||
},
|
||||
// Tests for statefulsets (or claims) with dashes in the names
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-alpha-henley-2",
|
||||
Expected: "c", // hash("henley") + 2 == 2
|
||||
},
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-beta-henley-3",
|
||||
Expected: "a", // hash("henley") + 3 == 3 === 0 mod 3
|
||||
},
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-gamma-henley-4",
|
||||
Expected: "b", // hash("henley") + 4 == 4 === 1 mod 3
|
||||
},
|
||||
// Tests for statefulsets name ending in -
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley--2",
|
||||
Expected: "a", // hash("") + 2 == 0 mod 3
|
||||
},
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley--3",
|
||||
Expected: "b", // hash("") + 3 == 1 mod 3
|
||||
},
|
||||
{
|
||||
Zones: []string{"a", "b", "c"},
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley--4",
|
||||
Expected: "c", // hash("") + 4 == 2 mod 3
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
zonesSet := sets.NewString(test.Zones...)
|
||||
actual := ChooseZoneForVolume(test.Zones, test.VolumeName)
|
||||
|
||||
actual := ChooseZoneForVolume(zonesSet, test.VolumeName)
|
||||
|
||||
for actual != test.Expected {
|
||||
if actual != test.Expected {
|
||||
t.Errorf("Test %v failed, expected zone %q, actual %q", test, test.Expected, actual)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestChooseZonesForVolume(t *testing.T) {
|
||||
checkFnv32(t, "henley", 1180403676)
|
||||
// 1180403676 mod 3 == 0, so the offset from "henley" is 0, which makes it easier to verify this by inspection
|
||||
|
||||
// A few others
|
||||
checkFnv32(t, "henley-", 2652299129)
|
||||
checkFnv32(t, "henley-a", 1459735322)
|
||||
checkFnv32(t, "", 2166136261)
|
||||
|
||||
tests := []struct {
|
||||
Zones sets.String
|
||||
VolumeName string
|
||||
NumZones uint32
|
||||
Expected sets.String
|
||||
}{
|
||||
// Test for PVC names that don't have a dash
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("a" /* hash("henley") == 0 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("a" /* hash("henley") == 0 */, "b"),
|
||||
},
|
||||
// Tests for PVC names that end in - number, but don't look like statefulset PVCs
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-0",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("a" /* hash("henley") == 0 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-0",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("a" /* hash("henley") == 0 */, "b"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-1",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("b" /* hash("henley") + 1 == 1 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-1",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("c" /* hash("henley") + 1 + 1(startingIndex) == 2 */, "a"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-2",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("c" /* hash("henley") + 2 == 2 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-2",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("b" /* hash("henley") + 2 + 2(startingIndex) == 4 */, "c"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-3",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("a" /* hash("henley") + 3 == 3 === 0 mod 3 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-3",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("a" /* hash("henley") + 3 + 3(startingIndex) == 6 */, "b"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-4",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("b" /* hash("henley") + 4 == 4 === 1 mod 3 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-4",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("c" /* hash("henley") + 4 + 4(startingIndex) == 8 */, "a"),
|
||||
},
|
||||
// Tests for PVC names that are edge cases
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("c" /* hash("henley-") = 2652299129 === 2 mod 3 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("c" /* hash("henley-") = 2652299129 === 2 mod 3 = 2 */, "a"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-a",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("c" /* hash("henley-a") = 1459735322 === 2 mod 3 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "henley-a",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("c" /* hash("henley-a") = 1459735322 === 2 mod 3 = 2 */, "a"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium--1",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("c" /* hash("") + 1 == 2166136261 + 1 === 2 mod 3 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium--1",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("a" /* hash("") + 1 + 1(startingIndex) == 2166136261 + 1 + 1 === 3 mod 3 = 0 */, "b"),
|
||||
},
|
||||
// Tests for PVC names for simple StatefulSet cases
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley-1",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("b" /* hash("henley") + 1 == 1 */),
|
||||
},
|
||||
// Tests for PVC names for simple StatefulSet cases
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley-1",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("c" /* hash("henley") + 1 + 1(startingIndex) == 2 */, "a"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "loud-henley-1",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("b" /* hash("henley") + 1 == 1 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "loud-henley-1",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("c" /* hash("henley") + 1 + 1(startingIndex) == 2 */, "a"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "quiet-henley-2",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("c" /* hash("henley") + 2 == 2 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "quiet-henley-2",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("b" /* hash("henley") + 2 + 2(startingIndex) == 4 */, "c"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley-2",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("c" /* hash("henley") + 2 == 2 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley-2",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("b" /* hash("henley") + 2 + 2(startingIndex) == 4 */, "c"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley-3",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("a" /* hash("henley") + 3 == 3 === 0 mod 3 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley-3",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("a" /* hash("henley") + 3 + 3(startingIndex) == 6 === 6 mod 3 = 0 */, "b"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley-4",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("b" /* hash("henley") + 4 == 4 === 1 mod 3 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley-4",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("c" /* hash("henley") + 4 + 4(startingIndex) == 8 === 2 mod 3 */, "a"),
|
||||
},
|
||||
// Tests for statefulsets (or claims) with dashes in the names
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-alpha-henley-2",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("c" /* hash("henley") + 2 == 2 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-alpha-henley-2",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("b" /* hash("henley") + 2 + 2(startingIndex) == 4 */, "c"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-beta-henley-3",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("a" /* hash("henley") + 3 == 3 === 0 mod 3 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-beta-henley-3",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("a" /* hash("henley") + 3 + 3(startingIndex) == 6 === 0 mod 3 */, "b"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-gamma-henley-4",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("b" /* hash("henley") + 4 == 4 === 1 mod 3 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-gamma-henley-4",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("c" /* hash("henley") + 4 + 4(startingIndex) == 8 === 2 mod 3 */, "a"),
|
||||
},
|
||||
// Tests for statefulsets name ending in -
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley--2",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("a" /* hash("") + 2 == 0 mod 3 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley--2",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("c" /* hash("") + 2 + 2(startingIndex) == 2 mod 3 */, "a"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley--3",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("b" /* hash("") + 3 == 1 mod 3 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley--3",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("b" /* hash("") + 3 + 3(startingIndex) == 1 mod 3 */, "c"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley--4",
|
||||
NumZones: 1,
|
||||
Expected: sets.NewString("c" /* hash("") + 4 == 2 mod 3 */),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley--4",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("a" /* hash("") + 4 + 4(startingIndex) == 0 mod 3 */, "b"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley--4",
|
||||
NumZones: 3,
|
||||
Expected: sets.NewString("c" /* hash("") + 4 == 2 mod 3 */, "a", "b"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c"),
|
||||
VolumeName: "medium-henley--4",
|
||||
NumZones: 4,
|
||||
Expected: sets.NewString("c" /* hash("") + 4 + 9(startingIndex) == 2 mod 3 */, "a", "b", "c"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c", "d", "e", "f", "g", "h", "i"),
|
||||
VolumeName: "henley-0",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("a" /* hash("henley") == 0 */, "b"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c", "d", "e", "f", "g", "h", "i"),
|
||||
VolumeName: "henley-1",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("c" /* hash("henley") == 0 + 2 */, "d"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c", "d", "e", "f", "g", "h", "i"),
|
||||
VolumeName: "henley-2",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("e" /* hash("henley") == 0 + 2 + 2(startingIndex) */, "f"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c", "d", "e", "f", "g", "h", "i"),
|
||||
VolumeName: "henley-3",
|
||||
NumZones: 2,
|
||||
Expected: sets.NewString("g" /* hash("henley") == 0 + 2 + 4(startingIndex) */, "h"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c", "d", "e", "f", "g", "h", "i"),
|
||||
VolumeName: "henley-0",
|
||||
NumZones: 3,
|
||||
Expected: sets.NewString("a" /* hash("henley") == 0 */, "b", "c"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c", "d", "e", "f", "g", "h", "i"),
|
||||
VolumeName: "henley-1",
|
||||
NumZones: 3,
|
||||
Expected: sets.NewString("d" /* hash("henley") == 0 + 1 + 2(startingIndex) */, "e", "f"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c", "d", "e", "f", "g", "h", "i"),
|
||||
VolumeName: "henley-2",
|
||||
NumZones: 3,
|
||||
Expected: sets.NewString("g" /* hash("henley") == 0 + 2 + 4(startingIndex) */, "h", "i"),
|
||||
},
|
||||
{
|
||||
Zones: sets.NewString("a", "b", "c", "d", "e", "f", "g", "h", "i"),
|
||||
VolumeName: "henley-3",
|
||||
NumZones: 3,
|
||||
Expected: sets.NewString("a" /* hash("henley") == 0 + 3 + 6(startingIndex) */, "b", "c"),
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
actual := ChooseZonesForVolume(test.Zones, test.VolumeName, test.NumZones)
|
||||
|
||||
if !actual.Equal(test.Expected) {
|
||||
t.Errorf("Test %v failed, expected zone %#v, actual %#v", test, test.Expected, actual)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestZonesToSet(t *testing.T) {
|
||||
functionUnderTest := "ZonesToSet"
|
||||
// First part: want an error
|
||||
|
Reference in New Issue
Block a user