Skip to content

Commit b7c13da

Browse files
author
Chanwit Kaewkasi
authored
Merge pull request #405 from weaveworks/fix-inputs-tmpl
re-implement input references with template
2 parents 2201c2d + 3fc7f09 commit b7c13da

2 files changed

Lines changed: 67 additions & 49 deletions

File tree

controllers/tf_controller_outputs.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,22 @@ func (r *TerraformReconciler) outputsMayBeDrifted(ctx context.Context, terraform
4040
return true, nil
4141
}
4242

43+
keysInSecret := []string{}
44+
for k, _ := range outputsSecret.Data {
45+
keysInSecret = append(keysInSecret, k)
46+
}
47+
sort.Strings(keysInSecret)
48+
49+
keysInSpec := terraform.Spec.WriteOutputsToSecret.Outputs
50+
if len(keysInSpec) == 0 {
51+
keysInSpec = terraform.Status.AvailableOutputs
52+
}
53+
sort.Strings(keysInSpec)
54+
55+
if strings.Join(keysInSecret, ",") != strings.Join(keysInSpec, ",") {
56+
return true, nil
57+
}
58+
4359
return false, err
4460
}
4561

runner/server.go

Lines changed: 51 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -400,13 +400,8 @@ func (r *TerraformRunnerServer) GenerateVarsForTF(ctx context.Context, req *Gene
400400

401401
vars := map[string]*apiextensionsv1.JSON{}
402402

403-
log.Info("mapping the Spec.Values")
404-
if terraform.Spec.Values != nil {
405-
vars["values"] = terraform.Spec.Values
406-
}
407-
403+
inputs := map[string]interface{}{}
408404
if len(terraform.Spec.ReadInputsFromSecrets) > 0 {
409-
inputs := map[string]interface{}{}
410405
for _, readSpec := range terraform.Spec.ReadInputsFromSecrets {
411406
secret := corev1.Secret{}
412407
err := r.Get(ctx, types.NamespacedName{Namespace: terraform.Namespace, Name: readSpec.Name}, &secret)
@@ -415,32 +410,31 @@ func (r *TerraformRunnerServer) GenerateVarsForTF(ctx context.Context, req *Gene
415410
return nil, err
416411
}
417412

418-
for key, value := range secret.Data {
419-
var jsonValue interface{}
420-
err := json.Unmarshal(value, &jsonValue)
421-
if err != nil {
422-
log.Error(err, "unable to unmarshal secret data", "secret", readSpec.Name, "key", key)
423-
return nil, err
424-
}
425-
inputs[key] = jsonValue
413+
// outputs are always strings
414+
data := map[string]interface{}{}
415+
for k, v := range secret.Data {
416+
data[k] = string(v)
426417
}
418+
419+
inputs[readSpec.As] = data
427420
}
421+
}
428422

429-
if b, err := json.Marshal(inputs); err != nil {
430-
log.Error(err, "unable to marshal inputs")
423+
log.Info("mapping the Spec.Values")
424+
if terraform.Spec.Values != nil {
425+
tmpl, err := template.New("values").Parse(string(terraform.Spec.Values.Raw))
426+
if err != nil {
427+
log.Error(err, "unable to parse values as template")
431428
return nil, err
432-
} else {
433-
vars["inputs"] = &apiextensionsv1.JSON{Raw: b}
434429
}
435430

436-
if err := os.WriteFile("generated_var_inputs.tf", []byte(`
437-
variable "inputs" {
438-
type = map(any)
439-
}
440-
`), 0644); err != nil {
441-
log.Error(err, "unable to write inputs variable file")
431+
var buf bytes.Buffer
432+
if err := tmpl.Execute(&buf, inputs); err != nil {
433+
log.Error(err, "unable to execute values template")
442434
return nil, err
443435
}
436+
437+
vars["values"] = &apiextensionsv1.JSON{Raw: buf.Bytes()}
444438
}
445439

446440
log.Info("mapping the Spec.Vars")
@@ -539,7 +533,7 @@ variable "inputs" {
539533
}
540534

541535
varFilePath := filepath.Join(req.WorkingDir, "generated.auto.tfvars.json")
542-
if err := ioutil.WriteFile(varFilePath, jsonBytes, 0644); err != nil {
536+
if err := os.WriteFile(varFilePath, jsonBytes, 0644); err != nil {
543537
err = fmt.Errorf("error generating var file: %s", err)
544538
log.Error(err, "unable to write the data to file", "filePath", varFilePath)
545539
return nil, err
@@ -1108,45 +1102,53 @@ func (r *TerraformRunnerServer) WriteOutputs(ctx context.Context, req *WriteOutp
11081102
var outputSecret corev1.Secret
11091103

11101104
drift := true
1105+
create := true
11111106
if err := r.Client.Get(ctx, objectKey, &outputSecret); err == nil {
11121107
// if everything is there, we don't write anything
11131108
if reflect.DeepEqual(outputSecret.Data, req.Data) {
11141109
drift = false
11151110
} else {
1116-
if err := r.Client.Delete(ctx, &outputSecret); err != nil {
1117-
log.Error(err, "unable to delete secret")
1118-
return nil, err
1119-
}
1111+
// found, but need update
1112+
create = false
11201113
}
11211114
} else if apierrors.IsNotFound(err) == false {
11221115
log.Error(err, "unable to get output secret")
11231116
return nil, err
11241117
}
11251118

11261119
if drift {
1127-
vTrue := true
1128-
outputSecret = corev1.Secret{
1129-
ObjectMeta: metav1.ObjectMeta{
1130-
Name: req.SecretName,
1131-
Namespace: req.Namespace,
1132-
OwnerReferences: []metav1.OwnerReference{
1133-
{
1134-
APIVersion: infrav1.GroupVersion.Version + "/" + infrav1.GroupVersion.Version,
1135-
Kind: infrav1.TerraformKind,
1136-
Name: req.Name,
1137-
UID: types.UID(req.Uuid),
1138-
Controller: &vTrue,
1120+
if create {
1121+
vTrue := true
1122+
outputSecret = corev1.Secret{
1123+
ObjectMeta: metav1.ObjectMeta{
1124+
Name: req.SecretName,
1125+
Namespace: req.Namespace,
1126+
OwnerReferences: []metav1.OwnerReference{
1127+
{
1128+
APIVersion: infrav1.GroupVersion.Group + "/" + infrav1.GroupVersion.Version,
1129+
Kind: infrav1.TerraformKind,
1130+
Name: req.Name,
1131+
UID: types.UID(req.Uuid),
1132+
Controller: &vTrue,
1133+
},
11391134
},
11401135
},
1141-
},
1142-
Type: corev1.SecretTypeOpaque,
1143-
Data: req.Data,
1144-
}
1136+
Type: corev1.SecretTypeOpaque,
1137+
Data: req.Data,
1138+
}
11451139

1146-
err := r.Client.Create(ctx, &outputSecret)
1147-
if err != nil {
1148-
log.Error(err, "unable to create secret")
1149-
return nil, err
1140+
err := r.Client.Create(ctx, &outputSecret)
1141+
if err != nil {
1142+
log.Error(err, "unable to create secret")
1143+
return nil, err
1144+
}
1145+
} else {
1146+
outputSecret.Data = req.Data
1147+
err := r.Client.Update(ctx, &outputSecret)
1148+
if err != nil {
1149+
log.Error(err, "unable to update secret")
1150+
return nil, err
1151+
}
11501152
}
11511153

11521154
return &WriteOutputsReply{Message: "ok", Changed: true}, nil

0 commit comments

Comments
 (0)