/
configmap.go
106 lines (88 loc) · 3.48 KB
/
configmap.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package applicationcontroller
import (
"context"
"github.com/kartverket/skiperator/pkg/resourcegenerator/gcp"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
skiperatorv1alpha1 "github.com/kartverket/skiperator/api/v1alpha1"
"github.com/kartverket/skiperator/pkg/util"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/types"
ctrlutil "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
)
type Config struct {
Type string `json:"type"`
Audience string `json:"audience"`
ServiceAccountImpersonationUrl string `json:"service_account_impersonation_url"`
SubjectTokenType string `json:"subject_token_type"`
TokenUrl string `json:"token_url"`
CredentialSource CredentialSource `json:"credential_source"`
}
type CredentialSource struct {
File string `json:"file"`
}
var controllerName = "ConfigMap"
func (r *ApplicationReconciler) reconcileConfigMap(ctx context.Context, application *skiperatorv1alpha1.Application) (reconcile.Result, error) {
r.SetControllerProgressing(ctx, application, controllerName)
if application.Spec.GCP != nil {
gcpIdentityConfigMapNamespacedName := types.NamespacedName{Namespace: "skiperator-system", Name: "gcp-identity-config"}
gcpIdentityConfigMap, err := util.GetConfigMap(r.GetClient(), ctx, gcpIdentityConfigMapNamespacedName)
if !util.ErrIsMissingOrNil(
r.GetRecorder(),
err,
"Cannot find configmap named "+gcpIdentityConfigMapNamespacedName.Name+" in namespace "+gcpIdentityConfigMapNamespacedName.Namespace,
application,
) {
r.SetControllerError(ctx, application, controllerName, err)
return reconcile.Result{}, err
}
err = r.setupGCPAuthConfigMap(ctx, gcpIdentityConfigMap, application)
if err != nil {
r.SetControllerError(ctx, application, controllerName, err)
return reconcile.Result{}, err
}
} else {
gcpAuthConfigMap := corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Namespace: application.Namespace,
Name: gcp.GetGCPConfigMapName(application.Name),
},
}
err := client.IgnoreNotFound(r.GetClient().Delete(ctx, &gcpAuthConfigMap))
if err != nil {
return reconcile.Result{}, err
}
}
r.SetControllerFinishedOutcome(ctx, application, controllerName, nil)
return reconcile.Result{}, nil
}
func (r *ApplicationReconciler) setupGCPAuthConfigMap(ctx context.Context, gcpIdentityConfigMap corev1.ConfigMap, application *skiperatorv1alpha1.Application) error {
gcpAuthConfigMapName := gcp.GetGCPConfigMapName(application.Name)
gcpAuthConfigMap, err := gcp.GetGoogleServiceAccountCredentialsConfigMap(
ctx,
application.Namespace,
gcpAuthConfigMapName,
application.Spec.GCP.Auth.ServiceAccount,
gcpIdentityConfigMap,
)
if err != nil {
return err
}
shouldReconcile, err := r.ShouldReconcile(ctx, &gcpAuthConfigMap)
if err != nil || !shouldReconcile {
r.SetControllerFinishedOutcome(ctx, application, controllerName, err)
return err
}
_, err = ctrlutil.CreateOrPatch(ctx, r.GetClient(), &gcpAuthConfigMap, func() error {
// Set application as owner of the configmap
err := ctrlutil.SetControllerReference(application, &gcpAuthConfigMap, r.GetScheme())
if err != nil {
r.SetControllerError(ctx, application, controllerName, err)
return err
}
r.SetLabelsFromApplication(&gcpAuthConfigMap, *application)
return nil
})
return err
}