Skip to content

Commit 52843e3

Browse files
committed
add generic kubernetest resource management api
1 parent cb53f23 commit 52843e3

23 files changed

+282
-0
lines changed

pkg/resources/clusterrole.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package resources
2+
3+
import (
4+
"fmt"
5+
6+
v1 "k8s.io/api/rbac/v1"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
)
9+
10+
type ClusterRoleMutator struct {
11+
Name string
12+
Labels map[string]string
13+
Rules []v1.PolicyRule
14+
}
15+
16+
var _ Mutator[*v1.ClusterRole] = &ClusterRoleMutator{}
17+
18+
func (m *ClusterRoleMutator) String() string {
19+
return fmt.Sprintf("clusterrole %s", m.Name)
20+
}
21+
22+
func (m *ClusterRoleMutator) Empty() *v1.ClusterRole {
23+
return &v1.ClusterRole{
24+
TypeMeta: metav1.TypeMeta{
25+
APIVersion: "rbac.authorization.k8s.io/v1",
26+
Kind: "ClusterRole",
27+
},
28+
ObjectMeta: metav1.ObjectMeta{
29+
Name: m.Name,
30+
},
31+
}
32+
}
33+
34+
func (m *ClusterRoleMutator) Mutate(r *v1.ClusterRole) error {
35+
r.ObjectMeta.Labels = m.Labels
36+
r.Rules = m.Rules
37+
return nil
38+
}

pkg/resources/clusterrole_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package resources
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package resources
2+
3+
import (
4+
"fmt"
5+
6+
v1 "k8s.io/api/rbac/v1"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
)
9+
10+
type ClusterRoleBindingMutator struct {
11+
ClusterRoleBindingName string
12+
ClusterRoleName string
13+
ServiceAccountName string
14+
ServiceAccountNamespace string
15+
Labels map[string]string
16+
}
17+
18+
var _ Mutator[*v1.ClusterRoleBinding] = &ClusterRoleBindingMutator{}
19+
20+
func (m *ClusterRoleBindingMutator) String() string {
21+
return fmt.Sprintf("clusterrolebinding %s", m.ClusterRoleBindingName)
22+
}
23+
24+
func (m *ClusterRoleBindingMutator) Empty() *v1.ClusterRoleBinding {
25+
return &v1.ClusterRoleBinding{
26+
TypeMeta: metav1.TypeMeta{
27+
APIVersion: "rbac.authorization.k8s.io/v1",
28+
Kind: "ClusterRoleBinding",
29+
},
30+
ObjectMeta: metav1.ObjectMeta{
31+
Name: m.ClusterRoleBindingName,
32+
},
33+
}
34+
}
35+
36+
func (m *ClusterRoleBindingMutator) Mutate(r *v1.ClusterRoleBinding) error {
37+
r.ObjectMeta.Labels = m.Labels
38+
r.RoleRef = v1.RoleRef{
39+
APIGroup: "rbac.authorization.k8s.io",
40+
Kind: "ClusterRole",
41+
Name: m.ClusterRoleName,
42+
}
43+
r.Subjects = []v1.Subject{
44+
{
45+
Kind: "ServiceAccount",
46+
Name: m.ServiceAccountName,
47+
Namespace: m.ServiceAccountNamespace,
48+
},
49+
}
50+
return nil
51+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package resources

pkg/resources/configmap.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package resources

pkg/resources/configmap_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package resources

pkg/resources/crd.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package resources
2+
3+
import (
4+
"fmt"
5+
6+
apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
)
9+
10+
type crdMutator struct {
11+
crd *apiextv1.CustomResourceDefinition
12+
}
13+
14+
var _ Mutator[*apiextv1.CustomResourceDefinition] = &crdMutator{}
15+
16+
func NewCRDMutator(crd *apiextv1.CustomResourceDefinition) Mutator[*apiextv1.CustomResourceDefinition] {
17+
return &crdMutator{crd: crd}
18+
}
19+
20+
func (m *crdMutator) String() string {
21+
return fmt.Sprintf("crd %s", m.crd.Name)
22+
}
23+
24+
func (m *crdMutator) Empty() *apiextv1.CustomResourceDefinition {
25+
return &apiextv1.CustomResourceDefinition{
26+
TypeMeta: metav1.TypeMeta{
27+
APIVersion: "apiextensions.k8s.io/v1",
28+
Kind: "CustomResourceDefinition",
29+
},
30+
ObjectMeta: metav1.ObjectMeta{
31+
Name: m.crd.Name,
32+
},
33+
}
34+
}
35+
36+
func (m *crdMutator) Mutate(r *apiextv1.CustomResourceDefinition) error {
37+
m.crd.Spec.DeepCopyInto(&r.Spec)
38+
return nil
39+
}

pkg/resources/crd_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package resources

pkg/resources/metadata.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package resources
2+
3+
import (
4+
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
5+
"sigs.k8s.io/controller-runtime/pkg/client"
6+
)
7+
8+
type baseMutator struct {
9+
Labels map[string]string
10+
Annotations map[string]string
11+
}
12+
13+
var _ Mutator[client.Object] = &baseMutator{}
14+
15+
func NewBaseMutator(labels, annotations map[string]string) Mutator[client.Object] {
16+
return &baseMutator{
17+
Labels: labels,
18+
Annotations: annotations,
19+
}
20+
}

pkg/resources/mutator.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package resources
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"sigs.k8s.io/controller-runtime/pkg/client"
8+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
9+
)
10+
11+
type Mutator[K client.Object] interface {
12+
Empty() K
13+
Mutate(res K) error
14+
String() string
15+
}
16+
17+
func GetResource[K client.Object](ctx context.Context, clt client.Client, m Mutator[K]) (K, error) {
18+
res := m.Empty()
19+
if err := clt.Get(ctx, client.ObjectKeyFromObject(res), res); err != nil {
20+
return res, fmt.Errorf("failed to get %s: %w", m.String(), err)
21+
}
22+
return res, nil
23+
}
24+
25+
func CreateOrUpdateResource[K client.Object](ctx context.Context, clt client.Client, m Mutator[K]) error {
26+
res := m.Empty()
27+
_, err := controllerutil.CreateOrUpdate(ctx, clt, res, func() error {
28+
return m.Mutate(res)
29+
})
30+
if err != nil {
31+
return fmt.Errorf("failed to create or update %s: %w", m.String(), err)
32+
}
33+
return nil
34+
}
35+
36+
func DeleteResource[K client.Object](ctx context.Context, clt client.Client, m Mutator[K]) error {
37+
res := m.Empty()
38+
if err := clt.Delete(ctx, res); client.IgnoreNotFound(err) != nil {
39+
return fmt.Errorf("failed to delete %s: %w", m.String(), err)
40+
}
41+
return nil
42+
}

0 commit comments

Comments
 (0)