2023-05-15 09:34:05 +00:00
package mutator
import (
"context"
"fmt"
"os"
2023-05-16 16:35:39 +00:00
"github.com/databricks/cli/bundle"
"github.com/databricks/cli/bundle/config/variable"
2023-05-15 09:34:05 +00:00
)
const bundleVarPrefix = "BUNDLE_VAR_"
type setVariables struct { }
func SetVariables ( ) bundle . Mutator {
return & setVariables { }
}
func ( m * setVariables ) Name ( ) string {
return "SetVariables"
}
func setVariable ( v * variable . Variable , name string ) error {
// case: variable already has value initialized, so skip
if v . HasValue ( ) {
return nil
}
// case: read and set variable value from process environment
envVarName := bundleVarPrefix + name
if val , ok := os . LookupEnv ( envVarName ) ; ok {
err := v . Set ( val )
if err != nil {
return fmt . Errorf ( ` failed to assign value "%s" to variable %s from environment variable %s with error: %w ` , val , name , envVarName , err )
}
return nil
}
// case: Set the variable to its default value
if v . HasDefault ( ) {
err := v . Set ( * v . Default )
if err != nil {
return fmt . Errorf ( ` failed to assign default value from config "%s" to variable %s with error: %w ` , * v . Default , name , err )
}
return nil
}
// We should have had a value to set for the variable at this point.
// TODO: use cmdio to request values for unassigned variables if current
2023-05-16 16:35:39 +00:00
// terminal is a tty. Tracked in https://github.com/databricks/cli/issues/379
2023-05-15 09:34:05 +00:00
return fmt . Errorf ( ` no value assigned to required variable %s. Assignment can be done through the "--var" flag or by setting the %s environment variable ` , name , bundleVarPrefix + name )
}
func ( m * setVariables ) Apply ( ctx context . Context , b * bundle . Bundle ) ( [ ] bundle . Mutator , error ) {
for name , variable := range b . Config . Variables {
err := setVariable ( variable , name )
if err != nil {
return nil , err
}
}
return nil , nil
}