@@ -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