Skip to content

Commit b203174

Browse files
author
Chanwit Kaewkasi
authored
Merge pull request #651 from weaveworks/fix-logging-outputs-bump-v0.14.4
Fix logging outputs and bump v0.14.4
2 parents fda60c8 + badc76b commit b203174

File tree

6 files changed

+147
-121
lines changed

6 files changed

+147
-121
lines changed

charts/tf-controller/Chart.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ apiVersion: v2
22
name: tf-controller
33
description: The Helm chart for Weave GitOps Terraform Controller
44
type: application
5-
version: 0.11.3-lts
6-
appVersion: "v0.14.3"
5+
version: 0.11.4-lts
6+
appVersion: "v0.14.4"

charts/tf-controller/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Weave GitOps Terraform Controller
22

3-
![Version: 0.11.3-lts](https://img.shields.io/badge/Version-0.11.3--lts-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v0.14.3](https://img.shields.io/badge/AppVersion-v0.14.3-informational?style=flat-square)
3+
![Version: 0.11.4-lts](https://img.shields.io/badge/Version-0.11.4--lts-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v0.14.4](https://img.shields.io/badge/AppVersion-v0.14.4-informational?style=flat-square)
44

55
The Helm chart for Weave GitOps Terraform Controller
66

@@ -69,7 +69,7 @@ __Note__: If you need to use the `imagePullSecrets` it would be best to set `ser
6969
| rbac.create | bool | `true` | If `true`, create and use RBAC resources |
7070
| replicaCount | int | `1` | Number of TF-Controller pods to deploy |
7171
| resources | object | `{"limits":{"cpu":"1000m","memory":"1Gi"},"requests":{"cpu":"200m","memory":"64Mi"}}` | Resource limits and requests |
72-
| runner | object | `{"creationTimeout":"5m0s","grpc":{"maxMessageSize":4},"image":{"repository":"ghcr.io/weaveworks/tf-runner","tag":"v0.14.3"},"serviceAccount":{"allowedNamespaces":[],"annotations":{},"create":true,"name":""}}` | Runner-specific configurations |
72+
| runner | object | `{"creationTimeout":"5m0s","grpc":{"maxMessageSize":4},"image":{"repository":"ghcr.io/weaveworks/tf-runner","tag":"v0.14.4"},"serviceAccount":{"allowedNamespaces":[],"annotations":{},"create":true,"name":""}}` | Runner-specific configurations |
7373
| runner.creationTimeout | string | `"5m0s"` | Timeout for runner-creation (Controller) |
7474
| runner.grpc.maxMessageSize | int | `4` | Maximum GRPC message size (Controller) |
7575
| runner.image.repository | string | `"ghcr.io/weaveworks/tf-runner"` | Runner image repository |

charts/tf-controller/values.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ image:
2727
pullPolicy: IfNotPresent
2828
# -- Overrides the image tag whose default is the chart appVersion.
2929
# @default -- `.Chart.AppVersion`
30-
tag: "v0.14.3"
30+
tag: "v0.14.4"
3131
# -- Controller image pull secret
3232
imagePullSecrets: []
3333
# -- Resource limits and requests
@@ -108,7 +108,7 @@ runner:
108108
repository: ghcr.io/weaveworks/tf-runner
109109
# -- Runner image tag
110110
# @default -- `.Chart.AppVersion`
111-
tag: "v0.14.3"
111+
tag: "v0.14.4"
112112
grpc:
113113
# -- Maximum GRPC message size (Controller)
114114
maxMessageSize: 4

config/manager/kustomization.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ generatorOptions:
88
images:
99
- name: weaveworks/tf-controller
1010
newName: ghcr.io/weaveworks/tf-controller
11-
newTag: v0.14.3
11+
newTag: v0.14.4

runner/server.go

-114
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,11 @@ import (
1717
"io/ioutil"
1818
corev1 "k8s.io/api/core/v1"
1919
apierrors "k8s.io/apimachinery/pkg/api/errors"
20-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2120
"k8s.io/apimachinery/pkg/runtime"
2221
"k8s.io/apimachinery/pkg/types"
2322
"os"
2423
"os/exec"
2524
"path/filepath"
26-
"reflect"
2725
ctrl "sigs.k8s.io/controller-runtime"
2826
"sigs.k8s.io/controller-runtime/pkg/client"
2927
"strings"
@@ -588,118 +586,6 @@ func (r *TerraformRunnerServer) GetInventory(ctx context.Context, req *GetInvent
588586
return &GetInventoryReply{Inventories: getInventoryFromTerraformModule(state.Values.RootModule)}, nil
589587
}
590588

591-
func (r *TerraformRunnerServer) Output(ctx context.Context, req *OutputRequest) (*OutputReply, error) {
592-
log := ctrl.LoggerFrom(ctx, "instance-id", r.InstanceID).WithName(loggerName)
593-
log.Info("creating outputs")
594-
if req.TfInstance != r.InstanceID {
595-
err := fmt.Errorf("no TF instance found")
596-
log.Error(err, "no terraform")
597-
return nil, err
598-
}
599-
600-
outputs, err := r.tf.Output(ctx)
601-
if err != nil {
602-
log.Error(err, "unable to get outputs")
603-
return nil, err
604-
}
605-
606-
outputReply := &OutputReply{Outputs: map[string]*OutputMeta{}}
607-
for k, v := range outputs {
608-
outputReply.Outputs[k] = &OutputMeta{
609-
Sensitive: v.Sensitive,
610-
Type: v.Type,
611-
Value: v.Value,
612-
}
613-
}
614-
return outputReply, nil
615-
}
616-
617-
func (r *TerraformRunnerServer) WriteOutputs(ctx context.Context, req *WriteOutputsRequest) (*WriteOutputsReply, error) {
618-
log := ctrl.LoggerFrom(ctx, "instance-id", r.InstanceID).WithName(loggerName)
619-
log.Info("write outputs to secret")
620-
621-
objectKey := types.NamespacedName{Namespace: req.Namespace, Name: req.SecretName}
622-
var outputSecret corev1.Secret
623-
624-
drift := true
625-
create := true
626-
if err := r.Client.Get(ctx, objectKey, &outputSecret); err == nil {
627-
// if everything is there, we don't write anything
628-
if reflect.DeepEqual(outputSecret.Data, req.Data) {
629-
drift = false
630-
} else {
631-
// found, but need update
632-
create = false
633-
}
634-
} else if apierrors.IsNotFound(err) == false {
635-
log.Error(err, "unable to get output secret")
636-
return nil, err
637-
}
638-
639-
if drift {
640-
if create {
641-
vTrue := true
642-
outputSecret = corev1.Secret{
643-
ObjectMeta: metav1.ObjectMeta{
644-
Name: req.SecretName,
645-
Namespace: req.Namespace,
646-
OwnerReferences: []metav1.OwnerReference{
647-
{
648-
APIVersion: infrav1.GroupVersion.Group + "/" + infrav1.GroupVersion.Version,
649-
Kind: infrav1.TerraformKind,
650-
Name: req.Name,
651-
UID: types.UID(req.Uuid),
652-
Controller: &vTrue,
653-
},
654-
},
655-
},
656-
Type: corev1.SecretTypeOpaque,
657-
Data: req.Data,
658-
}
659-
660-
err := r.Client.Create(ctx, &outputSecret)
661-
if err != nil {
662-
log.Error(err, "unable to create secret")
663-
return nil, err
664-
}
665-
} else {
666-
outputSecret.Data = req.Data
667-
err := r.Client.Update(ctx, &outputSecret)
668-
if err != nil {
669-
log.Error(err, "unable to update secret")
670-
return nil, err
671-
}
672-
}
673-
674-
return &WriteOutputsReply{Message: "ok", Changed: true}, nil
675-
}
676-
677-
return &WriteOutputsReply{Message: "ok", Changed: false}, nil
678-
}
679-
680-
func (r *TerraformRunnerServer) GetOutputs(ctx context.Context, req *GetOutputsRequest) (*GetOutputsReply, error) {
681-
log := ctrl.LoggerFrom(ctx, "instance-id", r.InstanceID).WithName(loggerName)
682-
log.Info("get outputs")
683-
outputKey := types.NamespacedName{Namespace: req.Namespace, Name: req.SecretName}
684-
outputSecret := corev1.Secret{}
685-
err := r.Client.Get(ctx, outputKey, &outputSecret)
686-
if err != nil {
687-
err = fmt.Errorf("error getting terraform output for health checks: %s", err)
688-
log.Error(err, "unable to check terraform health")
689-
return nil, err
690-
}
691-
692-
outputs := map[string]string{}
693-
// parse map[string][]byte to map[string]string for go template parsing
694-
if len(outputSecret.Data) > 0 {
695-
for k, v := range outputSecret.Data {
696-
outputs[k] = string(v)
697-
}
698-
}
699-
700-
return &GetOutputsReply{Outputs: outputs}, nil
701-
}
702-
703589
func (r *TerraformRunnerServer) FinalizeSecrets(ctx context.Context, req *FinalizeSecretsRequest) (*FinalizeSecretsReply, error) {
704590
log := ctrl.LoggerFrom(ctx, "instance-id", r.InstanceID).WithName(loggerName)
705591
log.Info("finalize the output secrets")

runner/server_outputs.go

+140
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package runner
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"io"
7+
"reflect"
8+
9+
"github.com/hashicorp/terraform-exec/tfexec"
10+
infrav1 "github.com/weaveworks/tf-controller/api/v1alpha1"
11+
corev1 "k8s.io/api/core/v1"
12+
apierrors "k8s.io/apimachinery/pkg/api/errors"
13+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
"k8s.io/apimachinery/pkg/types"
15+
ctrl "sigs.k8s.io/controller-runtime"
16+
)
17+
18+
func (r *TerraformRunnerServer) tfOutput(ctx context.Context, opts ...tfexec.OutputOption) (map[string]tfexec.OutputMeta, error) {
19+
log := ctrl.LoggerFrom(ctx, "instance-id", r.InstanceID).WithName(loggerName)
20+
21+
// This is the only place where we disable the logger
22+
r.tf.SetStdout(io.Discard)
23+
r.tf.SetStderr(io.Discard)
24+
25+
defer r.initLogger(log)
26+
27+
return r.tf.Output(ctx, opts...)
28+
}
29+
30+
func (r *TerraformRunnerServer) Output(ctx context.Context, req *OutputRequest) (*OutputReply, error) {
31+
log := ctrl.LoggerFrom(ctx, "instance-id", r.InstanceID).WithName(loggerName)
32+
log.Info("creating outputs")
33+
if req.TfInstance != r.InstanceID {
34+
err := fmt.Errorf("no TF instance found")
35+
log.Error(err, "no terraform")
36+
return nil, err
37+
}
38+
39+
outputs, err := r.tfOutput(ctx)
40+
if err != nil {
41+
log.Error(err, "unable to get outputs")
42+
return nil, err
43+
}
44+
45+
outputReply := &OutputReply{Outputs: map[string]*OutputMeta{}}
46+
for k, v := range outputs {
47+
outputReply.Outputs[k] = &OutputMeta{
48+
Sensitive: v.Sensitive,
49+
Type: v.Type,
50+
Value: v.Value,
51+
}
52+
}
53+
return outputReply, nil
54+
}
55+
56+
func (r *TerraformRunnerServer) WriteOutputs(ctx context.Context, req *WriteOutputsRequest) (*WriteOutputsReply, error) {
57+
log := ctrl.LoggerFrom(ctx, "instance-id", r.InstanceID).WithName(loggerName)
58+
log.Info("write outputs to secret")
59+
60+
objectKey := types.NamespacedName{Namespace: req.Namespace, Name: req.SecretName}
61+
var outputSecret corev1.Secret
62+
63+
drift := true
64+
create := true
65+
if err := r.Client.Get(ctx, objectKey, &outputSecret); err == nil {
66+
// if everything is there, we don't write anything
67+
if reflect.DeepEqual(outputSecret.Data, req.Data) {
68+
drift = false
69+
} else {
70+
// found, but need update
71+
create = false
72+
}
73+
} else if apierrors.IsNotFound(err) == false {
74+
log.Error(err, "unable to get output secret")
75+
return nil, err
76+
}
77+
78+
if drift {
79+
if create {
80+
vTrue := true
81+
outputSecret = corev1.Secret{
82+
ObjectMeta: metav1.ObjectMeta{
83+
Name: req.SecretName,
84+
Namespace: req.Namespace,
85+
OwnerReferences: []metav1.OwnerReference{
86+
{
87+
APIVersion: infrav1.GroupVersion.Group + "/" + infrav1.GroupVersion.Version,
88+
Kind: infrav1.TerraformKind,
89+
Name: req.Name,
90+
UID: types.UID(req.Uuid),
91+
Controller: &vTrue,
92+
},
93+
},
94+
},
95+
Type: corev1.SecretTypeOpaque,
96+
Data: req.Data,
97+
}
98+
99+
err := r.Client.Create(ctx, &outputSecret)
100+
if err != nil {
101+
log.Error(err, "unable to create secret")
102+
return nil, err
103+
}
104+
} else {
105+
outputSecret.Data = req.Data
106+
err := r.Client.Update(ctx, &outputSecret)
107+
if err != nil {
108+
log.Error(err, "unable to update secret")
109+
return nil, err
110+
}
111+
}
112+
113+
return &WriteOutputsReply{Message: "ok", Changed: true}, nil
114+
}
115+
116+
return &WriteOutputsReply{Message: "ok", Changed: false}, nil
117+
}
118+
119+
func (r *TerraformRunnerServer) GetOutputs(ctx context.Context, req *GetOutputsRequest) (*GetOutputsReply, error) {
120+
log := ctrl.LoggerFrom(ctx, "instance-id", r.InstanceID).WithName(loggerName)
121+
log.Info("get outputs")
122+
outputKey := types.NamespacedName{Namespace: req.Namespace, Name: req.SecretName}
123+
outputSecret := corev1.Secret{}
124+
err := r.Client.Get(ctx, outputKey, &outputSecret)
125+
if err != nil {
126+
err = fmt.Errorf("error getting terraform output for health checks: %s", err)
127+
log.Error(err, "unable to check terraform health")
128+
return nil, err
129+
}
130+
131+
outputs := map[string]string{}
132+
// parse map[string][]byte to map[string]string for go template parsing
133+
if len(outputSecret.Data) > 0 {
134+
for k, v := range outputSecret.Data {
135+
outputs[k] = string(v)
136+
}
137+
}
138+
139+
return &GetOutputsReply{Outputs: outputs}, nil
140+
}

0 commit comments

Comments
 (0)