blob: 99ad198ce3cd49498820ac5f3801a994e2f87a4c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package wskenv
import (
"os"
"reflect"
"strings"
/** Fixes #797
"github.com/apache/openwhisk-wskdeploy/wski18n"
"github.com/apache/openwhisk-wskdeploy/wskprint"
**/)
// Test if a string
func isValidEnvironmentVar(value string) bool {
// A valid Env. variable should start with or contain '$' (dollar) char.
//
// If the value is a single Env. variable, it should start with a '$' (dollar) char
// and have at least 1 additional character after it, e.g. $ENV_VAR
// If the value is a concatenation of a string and a Env. variable, it should contain '$' (dollar)
// and have a string following which is surrounded with '{' and '}', e.g. xxx${ENV_VAR}xxx.
if value != "" && strings.HasPrefix(value, "$") && len(value) > 1 {
return true
}
if value != "" && strings.Contains(value, "${") && strings.Count(value, "{") == strings.Count(value, "}") {
return true
}
return false
}
// Get the env variable value by key.
// Get the env variable if the key is start by $
// Replace all occurrences of env. variables in the input string
func InterpolateStringWithEnvVar(key interface{}) interface{} {
// Assure the key itself is not nil
if key == nil {
return nil
}
if reflect.TypeOf(key).String() == "string" {
keystr := key.(string)
if isValidEnvironmentVar(keystr) {
// retrieve the value of the env. var. from the host system.
var thisValue string
//split the string with ${}
//test if the substr is a environment var
//if it is, replace it with the value
f := func(c rune) bool {
return c == '$' || c == '{' || c == '}'
}
for _, substr := range strings.FieldsFunc(keystr, f) {
//if the substr is a $${ENV_VAR}
// return ${ENV_VAR}
if strings.Contains(keystr, "$${"+substr+"}") {
keystr = strings.Replace(keystr, "$${"+substr+"}", "${"+substr+"}", -1)
//if the substr is a $ENV_VAR
// return interpolated string using env. variable
} else if strings.Contains(keystr, "$"+substr) {
thisValue = os.Getenv(substr)
// TODO(920) disabling the warning for now, since we want to get rid of it eventually
// TODO(920) please add/remove this based on what we decide in issue #920
/** Fixes #797
if thisValue == "" {
warningString := wski18n.T(
wski18n.ID_WARN_MISSING_ENVIRONMENT_VARIABLE,
map[string]interface{}{
wski18n.KEY_VALUE: keystr})
wskprint.PrintOpenWhiskWarning(warningString)
}
**/
keystr = strings.Replace(keystr, "$"+substr, thisValue, -1)
//if the substr is a ${ENV_VAR}
// return interpolated string using env. variable
} else if strings.Contains(keystr, "${"+substr+"}") {
thisValue = os.Getenv(substr)
// TODO(920) disabling the warning for now, since we want to get rid of it eventually
// TODO(920) please add/remove this based on what we decide in issue #920
/** Fixes #797
if thisValue == "" {
warningString := wski18n.T(
wski18n.ID_WARN_MISSING_ENVIRONMENT_VARIABLE,
map[string]interface{}{
wski18n.KEY_VALUE: keystr})
wskprint.PrintOpenWhiskWarning(warningString)
}
**/
keystr = strings.Replace(keystr, "${"+substr+"}", thisValue, -1)
}
}
return keystr
}
// The key was not a valid env. variable, simply return it as the value itself (of type string)
return keystr
}
return key
}
// Convert a string name with environment variables into
// the new string with env variables replaced
func ConvertSingleName(theName string) string {
if len(theName) != 0 {
theNameEnv := InterpolateStringWithEnvVar(theName)
if str, ok := theNameEnv.(string); ok {
return str
} else {
return theName
}
}
return theName
}
func GetEnvVarName(name string) string {
name = strings.Replace(name, "$", "", 1)
name = strings.Replace(name, "{", "", -1)
name = strings.Replace(name, "}", "", -1)
return name
}