blob: 5ad21b91ac37ebde3b02b769dfd0449e69d97a67 [file] [log] [blame]
Giorgi Lekveishvilib591eae2023-06-16 12:31:49 +04001/*
2Copyright 2023.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17package controllers
18
19import (
20 "bytes"
21 "context"
22 "text/template"
23
24 corev1 "k8s.io/api/core/v1"
25 "k8s.io/apimachinery/pkg/runtime"
26 ctrl "sigs.k8s.io/controller-runtime"
27 "sigs.k8s.io/controller-runtime/pkg/client"
28 "sigs.k8s.io/controller-runtime/pkg/log"
29 "sigs.k8s.io/yaml"
30
31 dodocloudv1 "github.com/giolekva/pcloud/api/v1"
32)
33
34// ResourceRendererReconciler reconciles a ResourceRenderer object
35type ResourceRendererReconciler struct {
36 client.Client
37 Scheme *runtime.Scheme
38}
39
40//+kubebuilder:rbac:groups=dodo.cloud.dodo.cloud,resources=resourcerenderers,verbs=get;list;watch;create;update;patch;delete
41//+kubebuilder:rbac:groups=dodo.cloud.dodo.cloud,resources=resourcerenderers/status,verbs=get;update;patch
42//+kubebuilder:rbac:groups=dodo.cloud.dodo.cloud,resources=resourcerenderers/finalizers,verbs=update
43//+kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;watch;create;update;patch;delete
44//+kubebuilder:rbac:groups="",resources=configmaps,verbs=get;list;watch;create;update;patch;delete
45
46// Reconcile is part of the main kubernetes reconciliation loop which aims to
47// move the current state of the cluster closer to the desired state.
48// TODO(user): Modify the Reconcile function to compare the state specified by
49// the ResourceRenderer object against the actual cluster state, and then
50// perform operations to make the cluster state reflect the state specified by
51// the user.
52//
53// For more details, check Reconcile and its Result here:
54// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.12.2/pkg/reconcile
55func (r *ResourceRendererReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
56 logger := log.FromContext(ctx)
57 logger.Info(req.String())
58
59 resource := &dodocloudv1.ResourceRenderer{}
60 if err := r.Get(context.Background(), client.ObjectKey{
61 Namespace: req.Namespace,
62 Name: req.Name,
63 }, resource); err != nil {
64 return ctrl.Result{}, err
65 }
66 secret := &corev1.Secret{}
67 ns := resource.Spec.SecretNamespace
68 if len(ns) == 0 {
69 ns = req.Namespace
70 }
71 if err := r.Get(context.Background(), client.ObjectKey{
72 Namespace: ns,
73 Name: resource.Spec.SecretName,
74 }, secret); err != nil {
75 return ctrl.Result{}, err
76 }
77 data := make(map[string]string)
78 for key, value := range secret.Data {
79 data[key] = string(value)
80 }
81 tmpl, err := template.New("resource").Parse(resource.Spec.ResourceTemplate)
82 if err != nil {
83 return ctrl.Result{}, err
84 }
85 var rendered bytes.Buffer
86 if err := tmpl.Execute(&rendered, data); err != nil {
87 return ctrl.Result{}, err
88 }
89 config := &corev1.ConfigMap{}
90 if err := yaml.Unmarshal(rendered.Bytes(), config); err != nil {
91 return ctrl.Result{}, err
92 }
93 if err := r.Create(context.Background(), config); err != nil {
94 return ctrl.Result{}, err
95 }
96
97 return ctrl.Result{}, nil
98}
99
100// SetupWithManager sets up the controller with the Manager.
101func (r *ResourceRendererReconciler) SetupWithManager(mgr ctrl.Manager) error {
102 return ctrl.NewControllerManagedBy(mgr).
103 For(&dodocloudv1.ResourceRenderer{}).
104 Complete(r)
105}