Skip to content
This repository was archived by the owner on Jan 25, 2019. It is now read-only.

Commit 0096917

Browse files
authored
Merge pull request #51 from joelanford/reconcile-resources
Reconcile resources
2 parents 535b588 + 71a1349 commit 0096917

File tree

5 files changed

+187
-115
lines changed

5 files changed

+187
-115
lines changed

helm-app-operator/Gopkg.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

helm-app-operator/pkg/helm/controller/controller.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1010
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1111
"k8s.io/apimachinery/pkg/runtime/schema"
12-
"k8s.io/apimachinery/pkg/types"
1312
"sigs.k8s.io/controller-runtime/pkg/controller"
1413
crthandler "sigs.k8s.io/controller-runtime/pkg/handler"
1514
"sigs.k8s.io/controller-runtime/pkg/manager"
@@ -33,11 +32,10 @@ func Add(mgr manager.Manager, options WatchOptions) {
3332
options.ResyncPeriod = time.Minute
3433
}
3534
r := &helmOperatorReconciler{
36-
Client: mgr.GetClient(),
37-
GVK: options.GVK,
38-
Installer: options.Installer,
39-
ResyncPeriod: options.ResyncPeriod,
40-
lastResourceVersions: map[types.NamespacedName]string{},
35+
Client: mgr.GetClient(),
36+
GVK: options.GVK,
37+
Installer: options.Installer,
38+
ResyncPeriod: options.ResyncPeriod,
4139
}
4240

4341
// Register the GVK with the schema

helm-app-operator/pkg/helm/controller/reconcile.go

Lines changed: 15 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,13 @@ package controller
22

33
import (
44
"context"
5-
"fmt"
6-
"sync"
75
"time"
86

97
"github.com/sirupsen/logrus"
108

119
apierrors "k8s.io/apimachinery/pkg/api/errors"
1210
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1311
"k8s.io/apimachinery/pkg/runtime/schema"
14-
"k8s.io/apimachinery/pkg/types"
1512
"sigs.k8s.io/controller-runtime/pkg/client"
1613
"sigs.k8s.io/controller-runtime/pkg/reconcile"
1714

@@ -23,40 +20,40 @@ type helmOperatorReconciler struct {
2320
GVK schema.GroupVersionKind
2421
Installer helm.Installer
2522
ResyncPeriod time.Duration
26-
27-
lastResourceVersions map[types.NamespacedName]string
28-
mutex sync.RWMutex
2923
}
3024

3125
const (
3226
finalizer = "uninstall-helm-release"
3327
)
3428

3529
func (r *helmOperatorReconciler) Reconcile(request reconcile.Request) (reconcile.Result, error) {
36-
logrus.Infof("processing %s", request.NamespacedName)
37-
3830
o := &unstructured.Unstructured{}
3931
o.SetGroupVersionKind(r.GVK)
32+
o.SetNamespace(request.Namespace)
33+
o.SetName(request.Name)
34+
logrus.Debugf("Processing %s", helm.ResourceString(o))
35+
4036
err := r.Client.Get(context.TODO(), request.NamespacedName, o)
4137
if apierrors.IsNotFound(err) {
4238
return reconcile.Result{}, nil
4339
}
4440
if err != nil {
41+
logrus.Errorf("Failed to lookup %s: %s", helm.ResourceString(o), err)
4542
return reconcile.Result{}, err
4643
}
4744

4845
deleted := o.GetDeletionTimestamp() != nil
4946
pendingFinalizers := o.GetFinalizers()
5047
if !deleted && !contains(pendingFinalizers, finalizer) {
51-
logrus.Debugf("adding finalizer %s to resource", finalizer)
48+
logrus.Debugf("Adding finalizer \"%s\" to %s", finalizer, helm.ResourceString(o))
5249
finalizers := append(pendingFinalizers, finalizer)
5350
o.SetFinalizers(finalizers)
5451
err := r.Client.Update(context.TODO(), o)
5552
return reconcile.Result{}, err
5653
}
5754
if deleted {
5855
if !contains(pendingFinalizers, finalizer) {
59-
logrus.Info("resouce is terminated, skipping reconciliation")
56+
logrus.Infof("Resource %s is terminated, skipping reconciliation", helm.ResourceString(o))
6057
return reconcile.Result{}, nil
6158
}
6259

@@ -76,24 +73,19 @@ func (r *helmOperatorReconciler) Reconcile(request reconcile.Request) (reconcile
7673
return reconcile.Result{}, err
7774
}
7875

79-
lastResourceVersion, ok := r.getLastResourceVersion(request.NamespacedName)
80-
if ok && o.GetResourceVersion() == lastResourceVersion {
81-
logrus.Infof("skipping %s because resource version has not changed", request.NamespacedName)
82-
return reconcile.Result{RequeueAfter: r.ResyncPeriod}, nil
83-
}
84-
85-
updatedResource, err := r.Installer.InstallRelease(o)
76+
updatedResource, needsUpdate, err := r.Installer.ReconcileRelease(o)
8677
if err != nil {
87-
logrus.Errorf(err.Error())
78+
logrus.Errorf("Failed to reconcile release for %s: %s", helm.ResourceString(o), err)
8879
return reconcile.Result{}, err
8980
}
9081

91-
err = r.Client.Update(context.TODO(), updatedResource)
92-
if err != nil {
93-
logrus.Errorf(err.Error())
94-
return reconcile.Result{}, fmt.Errorf("failed to update custom resource status: %v", err)
82+
if needsUpdate {
83+
err = r.Client.Update(context.TODO(), updatedResource)
84+
if err != nil {
85+
logrus.Errorf("Failed to update resource status for %s: %s", helm.ResourceString(o), err)
86+
return reconcile.Result{}, err
87+
}
9588
}
96-
r.setLastResourceVersion(request.NamespacedName, o.GetResourceVersion())
9789

9890
return reconcile.Result{RequeueAfter: r.ResyncPeriod}, nil
9991
}
@@ -106,16 +98,3 @@ func contains(l []string, s string) bool {
10698
}
10799
return false
108100
}
109-
110-
func (r *helmOperatorReconciler) getLastResourceVersion(n types.NamespacedName) (string, bool) {
111-
r.mutex.RLock()
112-
defer r.mutex.RUnlock()
113-
v, ok := r.lastResourceVersions[n]
114-
return v, ok
115-
}
116-
117-
func (r *helmOperatorReconciler) setLastResourceVersion(n types.NamespacedName, v string) {
118-
r.mutex.Lock()
119-
defer r.mutex.Unlock()
120-
r.lastResourceVersions[n] = v
121-
}

helm-app-operator/pkg/helm/engine.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ func (o *OwnerRefEngine) Render(chart *chart.Chart, values chartutil.Values) (ma
3434
if !strings.HasSuffix(fileName, ".yaml") {
3535
continue
3636
}
37-
logrus.Infof("adding ownerrefs to file: %s", fileName)
37+
logrus.Debugf("adding ownerrefs to file: %s", fileName)
3838
withOwner, err := o.addOwnerRefs(renderedFile)
3939
if err != nil {
4040
return nil, err
4141
}
4242
if withOwner == "" {
43-
logrus.Infof("skipping empty template: %s", fileName)
43+
logrus.Debugf("skipping empty template: %s", fileName)
4444
continue
4545
}
4646
ownedRenderedFiles[fileName] = withOwner

0 commit comments

Comments
 (0)