wskenv/environment.go (60 lines of code) (raw):

/* * 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 }