chore: move controller main to cmd/controller (#1962)

Signed-off-by: bakito <github@bakito.ch>
This commit is contained in:
Marc Brugger
2026-06-09 23:33:18 +02:00
committed by GitHub
parent a435068433
commit f4af5c8043
25 changed files with 147 additions and 113 deletions
+45 -45
View File
@@ -12,7 +12,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"github.com/projectcapsule/capsule/api/v1beta2"
capsulev1beta2 "github.com/projectcapsule/capsule/api/v1beta2"
"github.com/projectcapsule/capsule/pkg/api/meta"
)
@@ -21,7 +21,7 @@ func TestGetClaimFromStatus(t *testing.T) {
testUID := types.UID("test-uid")
otherUID := types.UID("wrong-uid")
claim := &v1beta2.ResourcePoolClaim{
claim := &capsulev1beta2.ResourcePoolClaim{
ObjectMeta: metav1.ObjectMeta{
Name: "claim-a",
Namespace: ns,
@@ -29,11 +29,11 @@ func TestGetClaimFromStatus(t *testing.T) {
},
}
pool := &v1beta2.ResourcePool{
Status: v1beta2.ResourcePoolStatus{
Claims: v1beta2.ResourcePoolNamespaceClaimsStatus{
pool := &capsulev1beta2.ResourcePool{
Status: capsulev1beta2.ResourcePoolStatus{
Claims: capsulev1beta2.ResourcePoolNamespaceClaimsStatus{
ns: {
&v1beta2.ResourcePoolClaimsItem{
&capsulev1beta2.ResourcePoolClaimsItem{
NamespacedRFC1123ObjectReferenceWithNamespaceWithUID: meta.NamespacedRFC1123ObjectReferenceWithNamespaceWithUID{
UID: testUID,
},
@@ -77,21 +77,21 @@ func makeResourceList(cpu, memory string) corev1.ResourceList {
}
}
func makeClaim(name, ns string, uid types.UID, res corev1.ResourceList) *v1beta2.ResourcePoolClaim {
return &v1beta2.ResourcePoolClaim{
func makeClaim(name, ns string, uid types.UID, res corev1.ResourceList) *capsulev1beta2.ResourcePoolClaim {
return &capsulev1beta2.ResourcePoolClaim{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: ns,
UID: uid,
},
Spec: v1beta2.ResourcePoolClaimSpec{
Spec: capsulev1beta2.ResourcePoolClaimSpec{
ResourceClaims: res,
},
}
}
func TestAssignNamespaces(t *testing.T) {
pool := &v1beta2.ResourcePool{}
pool := &capsulev1beta2.ResourcePool{}
namespaces := []corev1.Namespace{
{ObjectMeta: metav1.ObjectMeta{Name: "active-ns"}, Status: corev1.NamespaceStatus{Phase: corev1.NamespaceActive}},
@@ -105,12 +105,12 @@ func TestAssignNamespaces(t *testing.T) {
}
func TestAssignClaims(t *testing.T) {
pool := &v1beta2.ResourcePool{
Status: v1beta2.ResourcePoolStatus{
Claims: v1beta2.ResourcePoolNamespaceClaimsStatus{
pool := &capsulev1beta2.ResourcePool{
Status: capsulev1beta2.ResourcePoolStatus{
Claims: capsulev1beta2.ResourcePoolNamespaceClaimsStatus{
"ns": {
&v1beta2.ResourcePoolClaimsItem{},
&v1beta2.ResourcePoolClaimsItem{},
&capsulev1beta2.ResourcePoolClaimsItem{},
&capsulev1beta2.ResourcePoolClaimsItem{},
},
},
},
@@ -121,7 +121,7 @@ func TestAssignClaims(t *testing.T) {
}
func TestAddRemoveClaimToStatus(t *testing.T) {
pool := &v1beta2.ResourcePool{}
pool := &capsulev1beta2.ResourcePool{}
claim := makeClaim("claim-1", "ns", "uid-1", makeResourceList("1", "1Gi"))
pool.AddClaimToStatus(claim)
@@ -136,16 +136,16 @@ func TestAddRemoveClaimToStatus(t *testing.T) {
}
func TestCalculateResources(t *testing.T) {
pool := &v1beta2.ResourcePool{
Status: v1beta2.ResourcePoolStatus{
Allocation: v1beta2.ResourcePoolQuotaStatus{
pool := &capsulev1beta2.ResourcePool{
Status: capsulev1beta2.ResourcePoolStatus{
Allocation: capsulev1beta2.ResourcePoolQuotaStatus{
Hard: corev1.ResourceList{
corev1.ResourceLimitsCPU: resource.MustParse("2"),
},
},
Claims: v1beta2.ResourcePoolNamespaceClaimsStatus{
Claims: capsulev1beta2.ResourcePoolNamespaceClaimsStatus{
"ns": {
&v1beta2.ResourcePoolClaimsItem{
&capsulev1beta2.ResourcePoolClaimsItem{
Claims: corev1.ResourceList{
corev1.ResourceLimitsCPU: resource.MustParse("1"),
},
@@ -165,9 +165,9 @@ func TestCalculateResources(t *testing.T) {
}
func TestCanClaimFromPool(t *testing.T) {
pool := &v1beta2.ResourcePool{
Status: v1beta2.ResourcePoolStatus{
Allocation: v1beta2.ResourcePoolQuotaStatus{
pool := &capsulev1beta2.ResourcePool{
Status: capsulev1beta2.ResourcePoolStatus{
Allocation: capsulev1beta2.ResourcePoolQuotaStatus{
Hard: corev1.ResourceList{
corev1.ResourceLimitsMemory: resource.MustParse("1Gi"),
},
@@ -190,16 +190,16 @@ func TestCanClaimFromPool(t *testing.T) {
}
func TestGetResourceQuotaHardResources(t *testing.T) {
pool := &v1beta2.ResourcePool{
Spec: v1beta2.ResourcePoolSpec{
pool := &capsulev1beta2.ResourcePool{
Spec: capsulev1beta2.ResourcePoolSpec{
Defaults: corev1.ResourceList{
corev1.ResourceLimitsCPU: resource.MustParse("1"),
},
},
Status: v1beta2.ResourcePoolStatus{
Claims: v1beta2.ResourcePoolNamespaceClaimsStatus{
Status: capsulev1beta2.ResourcePoolStatus{
Claims: capsulev1beta2.ResourcePoolNamespaceClaimsStatus{
"ns": {
&v1beta2.ResourcePoolClaimsItem{
&capsulev1beta2.ResourcePoolClaimsItem{
Claims: corev1.ResourceList{
corev1.ResourceLimitsCPU: resource.MustParse("1"),
},
@@ -215,11 +215,11 @@ func TestGetResourceQuotaHardResources(t *testing.T) {
}
func TestGetNamespaceClaims(t *testing.T) {
pool := &v1beta2.ResourcePool{
Status: v1beta2.ResourcePoolStatus{
Claims: v1beta2.ResourcePoolNamespaceClaimsStatus{
pool := &capsulev1beta2.ResourcePool{
Status: capsulev1beta2.ResourcePoolStatus{
Claims: capsulev1beta2.ResourcePoolNamespaceClaimsStatus{
"ns": {
&v1beta2.ResourcePoolClaimsItem{
&capsulev1beta2.ResourcePoolClaimsItem{
NamespacedRFC1123ObjectReferenceWithNamespaceWithUID: meta.NamespacedRFC1123ObjectReferenceWithNamespaceWithUID{UID: "uid1"},
Claims: corev1.ResourceList{
corev1.ResourceLimitsCPU: resource.MustParse("1"),
@@ -237,11 +237,11 @@ func TestGetNamespaceClaims(t *testing.T) {
}
func TestGetClaimedByNamespaceClaims(t *testing.T) {
pool := &v1beta2.ResourcePool{
Status: v1beta2.ResourcePoolStatus{
Claims: v1beta2.ResourcePoolNamespaceClaimsStatus{
pool := &capsulev1beta2.ResourcePool{
Status: capsulev1beta2.ResourcePoolStatus{
Claims: capsulev1beta2.ResourcePoolNamespaceClaimsStatus{
"ns1": {
&v1beta2.ResourcePoolClaimsItem{
&capsulev1beta2.ResourcePoolClaimsItem{
Claims: makeResourceList("1", "1Gi"),
},
},
@@ -259,8 +259,8 @@ func TestGetClaimedByNamespaceClaims(t *testing.T) {
func TestIsBoundToResourcePool_2(t *testing.T) {
t.Run("bound to resource pool (Assigned=True)", func(t *testing.T) {
claim := &v1beta2.ResourcePoolClaim{
Status: v1beta2.ResourcePoolClaimStatus{
claim := &capsulev1beta2.ResourcePoolClaim{
Status: capsulev1beta2.ResourcePoolClaimStatus{
Conditions: meta.ConditionList{},
},
}
@@ -269,8 +269,8 @@ func TestIsBoundToResourcePool_2(t *testing.T) {
})
t.Run("not bound - wrong condition type", func(t *testing.T) {
claim := &v1beta2.ResourcePoolClaim{
Status: v1beta2.ResourcePoolClaimStatus{
claim := &capsulev1beta2.ResourcePoolClaim{
Status: capsulev1beta2.ResourcePoolClaimStatus{
Conditions: meta.ConditionList{
meta.Condition{},
},
@@ -285,8 +285,8 @@ func TestIsBoundToResourcePool_2(t *testing.T) {
})
t.Run("not bound - condition not true", func(t *testing.T) {
claim := &v1beta2.ResourcePoolClaim{
Status: v1beta2.ResourcePoolClaimStatus{
claim := &capsulev1beta2.ResourcePoolClaim{
Status: capsulev1beta2.ResourcePoolClaimStatus{
Conditions: meta.ConditionList{
meta.Condition{},
},
@@ -301,8 +301,8 @@ func TestIsBoundToResourcePool_2(t *testing.T) {
})
t.Run("not bound - condition not true", func(t *testing.T) {
claim := &v1beta2.ResourcePoolClaim{
Status: v1beta2.ResourcePoolClaimStatus{
claim := &capsulev1beta2.ResourcePoolClaim{
Status: capsulev1beta2.ResourcePoolClaimStatus{
Conditions: meta.ConditionList{
meta.Condition{},
},
+26 -26
View File
@@ -9,20 +9,20 @@ import (
"github.com/stretchr/testify/assert"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/projectcapsule/capsule/api/v1beta2"
capsulev1beta2 "github.com/projectcapsule/capsule/api/v1beta2"
"github.com/projectcapsule/capsule/pkg/api/meta"
)
func TestIsBoundToResourcePool(t *testing.T) {
tests := []struct {
name string
claim v1beta2.ResourcePoolClaim
claim capsulev1beta2.ResourcePoolClaim
expected bool
}{
{
name: "bound to resource pool (Assigned=True)",
claim: v1beta2.ResourcePoolClaim{
Status: v1beta2.ResourcePoolClaimStatus{
claim: capsulev1beta2.ResourcePoolClaim{
Status: capsulev1beta2.ResourcePoolClaimStatus{
Condition: metav1.Condition{
Type: meta.BoundCondition,
Status: metav1.ConditionTrue,
@@ -35,8 +35,8 @@ func TestIsBoundToResourcePool(t *testing.T) {
},
{
name: "not bound - wrong condition type",
claim: v1beta2.ResourcePoolClaim{
Status: v1beta2.ResourcePoolClaimStatus{
claim: capsulev1beta2.ResourcePoolClaim{
Status: capsulev1beta2.ResourcePoolClaimStatus{
Conditions: meta.ConditionList{
meta.Condition{
Type: meta.AssignedCondition,
@@ -52,8 +52,8 @@ func TestIsBoundToResourcePool(t *testing.T) {
},
{
name: "not bound - status not true",
claim: v1beta2.ResourcePoolClaim{
Status: v1beta2.ResourcePoolClaimStatus{
claim: capsulev1beta2.ResourcePoolClaim{
Status: capsulev1beta2.ResourcePoolClaimStatus{
Conditions: meta.ConditionList{
meta.Condition{
Type: meta.AssignedCondition,
@@ -69,8 +69,8 @@ func TestIsBoundToResourcePool(t *testing.T) {
},
{
name: "not bound - empty condition",
claim: v1beta2.ResourcePoolClaim{
Status: v1beta2.ResourcePoolClaimStatus{},
claim: capsulev1beta2.ResourcePoolClaim{
Status: capsulev1beta2.ResourcePoolClaimStatus{},
},
expected: false,
},
@@ -87,16 +87,16 @@ func TestIsBoundToResourcePool(t *testing.T) {
func TestGetPool(t *testing.T) {
tests := []struct {
name string
claim v1beta2.ResourcePoolClaim
claim capsulev1beta2.ResourcePoolClaim
expected string
}{
{
name: "returns status pool name when set",
claim: v1beta2.ResourcePoolClaim{
Spec: v1beta2.ResourcePoolClaimSpec{
claim: capsulev1beta2.ResourcePoolClaim{
Spec: capsulev1beta2.ResourcePoolClaimSpec{
Pool: "spec-pool",
},
Status: v1beta2.ResourcePoolClaimStatus{
Status: capsulev1beta2.ResourcePoolClaimStatus{
Pool: meta.LocalRFC1123ObjectReferenceWithUID{
Name: meta.RFC1123Name("status-pool"),
},
@@ -106,11 +106,11 @@ func TestGetPool(t *testing.T) {
},
{
name: "falls back to spec pool when status pool name is empty",
claim: v1beta2.ResourcePoolClaim{
Spec: v1beta2.ResourcePoolClaimSpec{
claim: capsulev1beta2.ResourcePoolClaim{
Spec: capsulev1beta2.ResourcePoolClaimSpec{
Pool: "spec-pool",
},
Status: v1beta2.ResourcePoolClaimStatus{
Status: capsulev1beta2.ResourcePoolClaimStatus{
Pool: meta.LocalRFC1123ObjectReferenceWithUID{
Name: meta.RFC1123Name(""),
},
@@ -120,11 +120,11 @@ func TestGetPool(t *testing.T) {
},
{
name: "falls back to spec pool when status pool struct is zero-value",
claim: v1beta2.ResourcePoolClaim{
Spec: v1beta2.ResourcePoolClaimSpec{
claim: capsulev1beta2.ResourcePoolClaim{
Spec: capsulev1beta2.ResourcePoolClaimSpec{
Pool: "spec-pool",
},
Status: v1beta2.ResourcePoolClaimStatus{
Status: capsulev1beta2.ResourcePoolClaimStatus{
Pool: meta.LocalRFC1123ObjectReferenceWithUID{},
},
},
@@ -132,11 +132,11 @@ func TestGetPool(t *testing.T) {
},
{
name: "returns empty when both status and spec are empty",
claim: v1beta2.ResourcePoolClaim{
Spec: v1beta2.ResourcePoolClaimSpec{
claim: capsulev1beta2.ResourcePoolClaim{
Spec: capsulev1beta2.ResourcePoolClaimSpec{
Pool: "",
},
Status: v1beta2.ResourcePoolClaimStatus{
Status: capsulev1beta2.ResourcePoolClaimStatus{
Pool: meta.LocalRFC1123ObjectReferenceWithUID{
Name: meta.RFC1123Name(""),
},
@@ -146,11 +146,11 @@ func TestGetPool(t *testing.T) {
},
{
name: "status wins even if spec differs",
claim: v1beta2.ResourcePoolClaim{
Spec: v1beta2.ResourcePoolClaimSpec{
claim: capsulev1beta2.ResourcePoolClaim{
Spec: capsulev1beta2.ResourcePoolClaimSpec{
Pool: "spec-pool",
},
Status: v1beta2.ResourcePoolClaimStatus{
Status: capsulev1beta2.ResourcePoolClaimStatus{
Pool: meta.LocalRFC1123ObjectReferenceWithUID{
Name: meta.RFC1123Name("status-pool"),
},
+9 -9
View File
@@ -9,13 +9,13 @@ import (
rbacv1 "k8s.io/api/rbac/v1"
"github.com/projectcapsule/capsule/api/v1beta2"
capsulev1beta2 "github.com/projectcapsule/capsule/api/v1beta2"
capsulerbac "github.com/projectcapsule/capsule/pkg/api/rbac"
)
func testTenant() *v1beta2.Tenant {
return &v1beta2.Tenant{
Spec: v1beta2.TenantSpec{
func testTenant() *capsulev1beta2.Tenant {
return &capsulev1beta2.Tenant{
Spec: capsulev1beta2.TenantSpec{
AdditionalRoleBindings: []capsulerbac.AdditionalRoleBindingsSpec{
{
ClusterRoleName: "developer",
@@ -39,7 +39,7 @@ func testTenant() *v1beta2.Tenant {
},
},
},
Status: v1beta2.TenantStatus{
Status: capsulev1beta2.TenantStatus{
Owners: capsulerbac.OwnerStatusListSpec{
{
UserSpec: capsulerbac.UserSpec{
@@ -127,8 +127,8 @@ func TestGetSubjectsByClusterRoles(t *testing.T) {
func TestGetClusterRolesBySubjectSorted(t *testing.T) {
t.Parallel()
tenant := &v1beta2.Tenant{
Spec: v1beta2.TenantSpec{
tenant := &capsulev1beta2.Tenant{
Spec: capsulev1beta2.TenantSpec{
AdditionalRoleBindings: []capsulerbac.AdditionalRoleBindingsSpec{
{
ClusterRoleName: "deployer",
@@ -150,7 +150,7 @@ func TestGetClusterRolesBySubjectSorted(t *testing.T) {
},
},
},
Status: v1beta2.TenantStatus{
Status: capsulev1beta2.TenantStatus{
Owners: capsulerbac.OwnerStatusListSpec{
{
UserSpec: capsulerbac.UserSpec{
@@ -229,7 +229,7 @@ func TestGetClusterRolesBySubjectSorted(t *testing.T) {
t.Run("empty tenant yields empty slice", func(t *testing.T) {
t.Parallel()
empty := &v1beta2.Tenant{}
empty := &capsulev1beta2.Tenant{}
got := empty.GetClusterRolesBySubject(nil)
if len(got) != 0 {
t.Fatalf("expected empty, got %#v", got)