Skip to content

Commit 7b76124

Browse files
authored
KSPACE-46: Use SpaceProvisionerConfig for space assignment (#924)
1 parent 0b43c07 commit 7b76124

7 files changed

Lines changed: 197 additions & 170 deletions

File tree

deploy/host-operator/default-spaceprovisionerconfig.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ objects:
1111
spec:
1212
toolchainCluster: ${TOOLCHAINCLUSTER_NAME}
1313
enabled: true
14+
placementRoles:
15+
- cluster-role.toolchain.dev.openshift.com/tenant
1416
parameters:
1517
- name: SPACEPROVISIONERCONFIG_NAME
1618
- name: SPACEPROVISIONERCONFIG_NS

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
module github.com/codeready-toolchain/toolchain-e2e
22

33
require (
4-
github.com/codeready-toolchain/api v0.0.0-20240227210924-371ddb054d87
5-
github.com/codeready-toolchain/toolchain-common v0.0.0-20240313081501-5cafefaa6598
4+
github.com/codeready-toolchain/api v0.0.0-20240322110702-5ab3840476e9
5+
github.com/codeready-toolchain/toolchain-common v0.0.0-20240322131000-8d44f7428e83
66
github.com/davecgh/go-spew v1.1.1
77
github.com/fatih/color v1.12.0
88
github.com/ghodss/yaml v1.0.0

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,10 @@ github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:z
123123
github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
124124
github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
125125
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
126-
github.com/codeready-toolchain/api v0.0.0-20240227210924-371ddb054d87 h1:eQLsrMqfjAzGfuO9t6pVxO4K6cUDKOMxEvl0ujQq/2I=
127-
github.com/codeready-toolchain/api v0.0.0-20240227210924-371ddb054d87/go.mod h1:FO7kgXH1x1LqkF327D5a36u0WIrwjVCbeijPkzgwaZc=
128-
github.com/codeready-toolchain/toolchain-common v0.0.0-20240313081501-5cafefaa6598 h1:06nit/nCQFVKp51ZtIOyY49ncmxEK5shJGTaM+Ogicw=
129-
github.com/codeready-toolchain/toolchain-common v0.0.0-20240313081501-5cafefaa6598/go.mod h1:c2JxboVI7keMD5fx5bB7LwzowFYYTwbepJhzPWSYXVs=
126+
github.com/codeready-toolchain/api v0.0.0-20240322110702-5ab3840476e9 h1:Lm7bFLrzfJzrUiRGVqtsSaZMpj+akLiR/fvAFjjE9gM=
127+
github.com/codeready-toolchain/api v0.0.0-20240322110702-5ab3840476e9/go.mod h1:cfNN6YPX4TORvhhZXMSjSPesqAHlB3nD/WAfGe4WLKQ=
128+
github.com/codeready-toolchain/toolchain-common v0.0.0-20240322131000-8d44f7428e83 h1:j+3snE8RGTyB5MdwPUqIfmAm9C2aScCni+ma1EveC4c=
129+
github.com/codeready-toolchain/toolchain-common v0.0.0-20240322131000-8d44f7428e83/go.mod h1:OJ3L9aaTRMGjxr2WeH/9l6m5OjExwEK3Bp/+P+efoGg=
130130
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
131131
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
132132
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=

test/e2e/parallel/spacerequest_test.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ import (
66

77
toolchainv1alpha1 "github.com/codeready-toolchain/api/api/v1alpha1"
88
"github.com/codeready-toolchain/toolchain-common/pkg/cluster"
9+
testSpc "github.com/codeready-toolchain/toolchain-common/pkg/test/spaceprovisionerconfig"
910
. "github.com/codeready-toolchain/toolchain-e2e/testsupport"
1011
. "github.com/codeready-toolchain/toolchain-e2e/testsupport/space"
12+
"github.com/codeready-toolchain/toolchain-e2e/testsupport/spaceprovisionerconfig"
1113
. "github.com/codeready-toolchain/toolchain-e2e/testsupport/wait"
1214
"github.com/stretchr/testify/require"
1315
"k8s.io/apimachinery/pkg/types"
@@ -202,10 +204,7 @@ func TestCreateSpaceRequest(t *testing.T) {
202204
memberCluster2, found, err := hostAwait.GetToolchainCluster(t, memberAwait2.Namespace, nil)
203205
require.NoError(t, err)
204206
require.True(t, found)
205-
_, err = hostAwait.UpdateToolchainCluster(t, memberCluster2.Name, func(tc *toolchainv1alpha1.ToolchainCluster) {
206-
tc.Labels[cluster.RoleLabel("member-2")] = "" // add a new cluster-role label, the value is blank since only key matters.
207-
})
208-
require.NoError(t, err)
207+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberCluster2.Name, testSpc.WithPlacementRoles(cluster.RoleLabel("member-2")))
209208
spaceRequest, parentSpace := CreateSpaceRequest(t, awaitilities, memberAwait.ClusterName,
210209
WithSpecTierName("appstudio-env"),
211210
WithSpecTargetClusterRoles([]string{cluster.RoleLabel("member-2")}), // the target cluster is member-2 while the spacerequest is on member-1

test/e2e/space_autocompletion_test.go

Lines changed: 21 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ import (
88
"github.com/codeready-toolchain/toolchain-common/pkg/cluster"
99
testconfig "github.com/codeready-toolchain/toolchain-common/pkg/test/config"
1010
testspace "github.com/codeready-toolchain/toolchain-common/pkg/test/space"
11+
testSpc "github.com/codeready-toolchain/toolchain-common/pkg/test/spaceprovisionerconfig"
1112
. "github.com/codeready-toolchain/toolchain-e2e/testsupport"
1213
. "github.com/codeready-toolchain/toolchain-e2e/testsupport/space"
14+
"github.com/codeready-toolchain/toolchain-e2e/testsupport/spaceprovisionerconfig"
1315
"github.com/codeready-toolchain/toolchain-e2e/testsupport/wait"
1416

1517
"github.com/stretchr/testify/assert"
@@ -44,13 +46,8 @@ func TestAutomaticClusterAssignment(t *testing.T) {
4446

4547
t.Run("set low max number of spaces and expect that space won't be provisioned but added on waiting list", func(t *testing.T) {
4648
// given
47-
hostAwait.UpdateToolchainConfig(t,
48-
testconfig.CapacityThresholds().
49-
MaxNumberOfSpaces(
50-
testconfig.PerMemberCluster(memberAwait1.ClusterName, -1),
51-
testconfig.PerMemberCluster(memberAwait2.ClusterName, -1),
52-
),
53-
)
49+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait1.ClusterName, testSpc.Enabled(false))
50+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait2.ClusterName, testSpc.Enabled(false))
5451
// some short time to get the cache populated with the change
5552
// sometimes the ToolchainConfig doesn't have the new values in the CapacityThresholds section before the creation of Spaces is issued
5653
// so Spaces were still created while Capacity was updated with the above values.
@@ -69,28 +66,17 @@ func TestAutomaticClusterAssignment(t *testing.T) {
6966

7067
t.Run("increment the max number of spaces and expect that first space will be provisioned.", func(t *testing.T) {
7168
// when
72-
hostAwait.UpdateToolchainConfig(t,
73-
testconfig.CapacityThresholds().
74-
MaxNumberOfSpaces(
75-
// increment max spaces only on member1
76-
testconfig.PerMemberCluster(memberAwait1.ClusterName, 2),
77-
testconfig.PerMemberCluster(memberAwait2.ClusterName, -1),
78-
),
79-
)
69+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait1.ClusterName, testSpc.MaxNumberOfSpaces(2), testSpc.Enabled(true))
70+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait2.ClusterName, testSpc.Enabled(false))
8071

8172
// then
8273
VerifyResourcesProvisionedForSpace(t, awaitilities, space1.Name)
8374
// the second space won't be provisioned immediately
8475
waitUntilSpaceIsPendingCluster(t, hostAwait, space2.Name)
8576
t.Run("reset the max number and expect the second space will be provisioned as well", func(t *testing.T) {
8677
// when
87-
hostAwait.UpdateToolchainConfig(t,
88-
testconfig.CapacityThresholds().
89-
MaxNumberOfSpaces(
90-
testconfig.PerMemberCluster(memberAwait1.ClusterName, 500),
91-
testconfig.PerMemberCluster(memberAwait2.ClusterName, 500),
92-
),
93-
)
78+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait1.ClusterName, testSpc.MaxNumberOfSpaces(500), testSpc.Enabled(true))
79+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait2.ClusterName, testSpc.MaxNumberOfSpaces(500), testSpc.Enabled(true))
9480

9581
// then
9682
VerifyResourcesProvisionedForSpace(t, awaitilities, space2.Name)
@@ -100,9 +86,8 @@ func TestAutomaticClusterAssignment(t *testing.T) {
10086

10187
t.Run("set low capacity threshold and expect that space will have default tier, but won't have target cluster so it won't be provisioned", func(t *testing.T) {
10288
// given
103-
hostAwait.UpdateToolchainConfig(t,
104-
testconfig.CapacityThresholds().ResourceCapacityThreshold(1),
105-
)
89+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait1.ClusterName, testSpc.MaxMemoryUtilizationPercent(1))
90+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait2.ClusterName, testSpc.MaxMemoryUtilizationPercent(1))
10691
// some short time to get the cache populated with the change
10792
time.Sleep(1 * time.Second)
10893

@@ -115,7 +100,8 @@ func TestAutomaticClusterAssignment(t *testing.T) {
115100

116101
t.Run("reset the threshold and expect the space will be have the targetCluster set and will be also provisioned", func(t *testing.T) {
117102
// when
118-
hostAwait.UpdateToolchainConfig(t, testconfig.CapacityThresholds().ResourceCapacityThreshold(80))
103+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait1.ClusterName, testSpc.MaxMemoryUtilizationPercent(80))
104+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait2.ClusterName, testSpc.MaxMemoryUtilizationPercent(80))
119105

120106
// then
121107
VerifyResourcesProvisionedForSpace(t, awaitilities, space.Name)
@@ -124,21 +110,17 @@ func TestAutomaticClusterAssignment(t *testing.T) {
124110

125111
t.Run("mark the first member cluster as full and for the second keep some capacity - expect that the space will be provisioned to the second one", func(t *testing.T) {
126112
// given
127-
var memberLimits []testconfig.PerMemberClusterOptionInt
128113
toolchainStatus, err := hostAwait.WaitForToolchainStatus(t,
129114
wait.UntilToolchainStatusHasConditions(wait.ToolchainStatusReadyAndUnreadyNotificationNotCreated()...),
130115
wait.UntilToolchainStatusUpdatedAfter(time.Now()))
131116
require.NoError(t, err)
132117
for _, m := range toolchainStatus.Status.Members {
133118
if memberAwait1.ClusterName == m.ClusterName {
134-
memberLimits = append(memberLimits, testconfig.PerMemberCluster(memberAwait1.ClusterName, m.SpaceCount))
119+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait1.ClusterName, testSpc.MaxNumberOfSpaces(uint(m.SpaceCount)))
135120
} else if memberAwait2.ClusterName == m.ClusterName {
136-
memberLimits = append(memberLimits, testconfig.PerMemberCluster(memberAwait2.ClusterName, m.SpaceCount+1))
121+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait2.ClusterName, testSpc.MaxNumberOfSpaces(uint(m.SpaceCount+1)))
137122
}
138123
}
139-
require.Len(t, memberLimits, 2)
140-
141-
hostAwait.UpdateToolchainConfig(t, testconfig.CapacityThresholds().MaxNumberOfSpaces(memberLimits...))
142124

143125
// when
144126
space1, _ := CreateSpaceWithBinding(t, awaitilities, mur, testspace.WithName("space-multimember-1"), testspace.WithTierName("appstudio"))
@@ -148,16 +130,9 @@ func TestAutomaticClusterAssignment(t *testing.T) {
148130

149131
t.Run("after both members marking as full then the new space won't be provisioned", func(t *testing.T) {
150132
// given
151-
var memberLimits []testconfig.PerMemberClusterOptionInt
152133
for _, m := range toolchainStatus.Status.Members {
153-
if memberAwait1.ClusterName == m.ClusterName {
154-
memberLimits = append(memberLimits, testconfig.PerMemberCluster(memberAwait1.ClusterName, m.SpaceCount))
155-
} else if memberAwait2.ClusterName == m.ClusterName {
156-
memberLimits = append(memberLimits, testconfig.PerMemberCluster(memberAwait2.ClusterName, m.SpaceCount))
157-
}
134+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, m.ClusterName, testSpc.MaxNumberOfSpaces(uint(m.SpaceCount)))
158135
}
159-
require.Len(t, memberLimits, 2)
160-
hostAwait.UpdateToolchainConfig(t, testconfig.CapacityThresholds().MaxNumberOfSpaces(memberLimits...))
161136

162137
// when
163138
space2, _ := CreateSpaceWithBinding(t, awaitilities, mur, testspace.WithName("space-multimember-2"), testspace.WithTierName("appstudio"))
@@ -178,18 +153,8 @@ func TestAutomaticClusterAssignment(t *testing.T) {
178153
t.Run("set cluster-role label only on member2 cluster and expect it will be selected", func(t *testing.T) {
179154
// given
180155
// both cluster have room for more spaces ...
181-
hostAwait.UpdateToolchainConfig(t, testconfig.CapacityThresholds().MaxNumberOfSpaces(
182-
testconfig.PerMemberCluster(memberAwait1.ClusterName, 500),
183-
testconfig.PerMemberCluster(memberAwait2.ClusterName, 500),
184-
))
185-
// let's add a custom cluster-role for member2
186-
memberCluster2, found, err := hostAwait.GetToolchainCluster(t, memberAwait2.Namespace, nil)
187-
require.NoError(t, err)
188-
require.True(t, found)
189-
_, err = hostAwait.UpdateToolchainCluster(t, memberCluster2.Name, func(tc *toolchainv1alpha1.ToolchainCluster) {
190-
tc.Labels[cluster.RoleLabel("workspace")] = "" // add a new cluster-role label, the value is blank since only key matters.
191-
})
192-
require.NoError(t, err)
156+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait1.ClusterName, testSpc.MaxNumberOfSpaces(500))
157+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait2.ClusterName, testSpc.MaxNumberOfSpaces(500), testSpc.WithPlacementRoles(testSpc.PlacementRole("workspace")))
193158

194159
// when
195160
space1, _ := CreateSpaceWithBinding(t, awaitilities, mur, testspace.WithName("space-clusterole-tenant"),
@@ -203,18 +168,8 @@ func TestAutomaticClusterAssignment(t *testing.T) {
203168
t.Run("set cluster-role label only on member2 cluster but mark it as full so that no cluster will be available", func(t *testing.T) {
204169
// given
205170
// only member1 as room for spaces
206-
hostAwait.UpdateToolchainConfig(t, testconfig.CapacityThresholds().MaxNumberOfSpaces(
207-
testconfig.PerMemberCluster(memberAwait1.ClusterName, 500), // member1 has more room
208-
testconfig.PerMemberCluster(memberAwait2.ClusterName, -1), // member2 is full
209-
))
210-
// let's add a custom cluster-role for member2
211-
memberCluster2, found, err := hostAwait.GetToolchainCluster(t, memberAwait2.Namespace, nil)
212-
require.NoError(t, err)
213-
require.True(t, found)
214-
_, err = hostAwait.UpdateToolchainCluster(t, memberCluster2.Name, func(tc *toolchainv1alpha1.ToolchainCluster) {
215-
tc.Labels[cluster.RoleLabel("workspace")] = "" // add a new cluster-role label, the value is blank since only key matters.
216-
})
217-
require.NoError(t, err)
171+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait1.ClusterName, testSpc.MaxNumberOfSpaces(500))
172+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait2.ClusterName, testSpc.Enabled(false), testSpc.WithPlacementRoles(testSpc.PlacementRole("workspace")))
218173

219174
// when
220175
space1, _ := CreateSpaceWithBinding(t, awaitilities, mur, testspace.WithName("space-clusterole-tenant-pending"),
@@ -227,18 +182,8 @@ func TestAutomaticClusterAssignment(t *testing.T) {
227182

228183
t.Run("provision space on the required cluster even if it doesn't match the specified cluster-role", func(t *testing.T) {
229184
// given
230-
hostAwait.UpdateToolchainConfig(t, testconfig.CapacityThresholds().MaxNumberOfSpaces(
231-
testconfig.PerMemberCluster(memberAwait1.ClusterName, 500), // member1 has more room
232-
testconfig.PerMemberCluster(memberAwait2.ClusterName, 500), // member2 has more room as well
233-
))
234-
// let's add a custom cluster-role for member2
235-
memberCluster2, found, err := hostAwait.GetToolchainCluster(t, memberAwait2.Namespace, nil)
236-
require.NoError(t, err)
237-
require.True(t, found)
238-
_, err = hostAwait.UpdateToolchainCluster(t, memberCluster2.Name, func(tc *toolchainv1alpha1.ToolchainCluster) {
239-
tc.Labels[cluster.RoleLabel("workspace")] = "" // add a new cluster-role label, the value is blank since only key matters.
240-
})
241-
require.NoError(t, err)
185+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait1.ClusterName, testSpc.MaxNumberOfSpaces(500))
186+
spaceprovisionerconfig.UpdateForCluster(t, hostAwait.Awaitility, memberAwait2.ClusterName, testSpc.MaxNumberOfSpaces(500), testSpc.WithPlacementRoles(testSpc.PlacementRole("workspace")))
242187

243188
// when
244189
space1, _ := CreateSpaceWithBinding(t, awaitilities, mur,

0 commit comments

Comments
 (0)