mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
provisioning: escape literal '$' with '$$' to avoid interpolation (#18045)
fixes #17986
This commit is contained in:
parent
7ec87ee76b
commit
76d08989f0
@ -45,6 +45,8 @@ datasources:
|
|||||||
password: $PASSWORD
|
password: $PASSWORD
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If you have a literal `$` in your value and want to avoid interpolation, `$$` can be used.
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
## Configuration Management Tools
|
## Configuration Management Tools
|
||||||
|
@ -14,6 +14,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/util/errutil"
|
"github.com/grafana/grafana/pkg/util/errutil"
|
||||||
)
|
)
|
||||||
@ -185,8 +186,14 @@ func transformMap(i map[interface{}]interface{}) interface{} {
|
|||||||
|
|
||||||
// interpolateValue returns final value after interpolation. At the moment only env var interpolation is done
|
// interpolateValue returns final value after interpolation. At the moment only env var interpolation is done
|
||||||
// here but in the future something like interpolation from file could be also done here.
|
// here but in the future something like interpolation from file could be also done here.
|
||||||
|
// For a literal '$', '$$' can be used to avoid interpolation.
|
||||||
func interpolateValue(val string) string {
|
func interpolateValue(val string) string {
|
||||||
return os.ExpandEnv(val)
|
parts := strings.Split(val, "$$")
|
||||||
|
interpolated := make([]string, len(parts))
|
||||||
|
for i, v := range parts {
|
||||||
|
interpolated[i] = os.ExpandEnv(v)
|
||||||
|
}
|
||||||
|
return strings.Join(interpolated, "$")
|
||||||
}
|
}
|
||||||
|
|
||||||
type interpolated struct {
|
type interpolated struct {
|
||||||
|
@ -1,16 +1,18 @@
|
|||||||
package values
|
package values
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/smartystreets/goconvey/convey"
|
|
||||||
"gopkg.in/yaml.v2"
|
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
. "github.com/smartystreets/goconvey/convey"
|
||||||
|
"gopkg.in/yaml.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestValues(t *testing.T) {
|
func TestValues(t *testing.T) {
|
||||||
Convey("Values", t, func() {
|
Convey("Values", t, func() {
|
||||||
os.Setenv("INT", "1")
|
os.Setenv("INT", "1")
|
||||||
os.Setenv("STRING", "test")
|
os.Setenv("STRING", "test")
|
||||||
|
os.Setenv("EMPTYSTRING", "")
|
||||||
os.Setenv("BOOL", "true")
|
os.Setenv("BOOL", "true")
|
||||||
|
|
||||||
Convey("IntValue", func() {
|
Convey("IntValue", func() {
|
||||||
@ -61,6 +63,24 @@ func TestValues(t *testing.T) {
|
|||||||
So(d.Val.Value(), ShouldEqual, "")
|
So(d.Val.Value(), ShouldEqual, "")
|
||||||
So(d.Val.Raw, ShouldEqual, "")
|
So(d.Val.Raw, ShouldEqual, "")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Convey("empty var should have empty value", func() {
|
||||||
|
unmarshalingTest(`val: $EMPTYSTRING`, d)
|
||||||
|
So(d.Val.Value(), ShouldEqual, "")
|
||||||
|
So(d.Val.Raw, ShouldEqual, "$EMPTYSTRING")
|
||||||
|
})
|
||||||
|
|
||||||
|
Convey("$$ should be a literal $", func() {
|
||||||
|
unmarshalingTest(`val: $$`, d)
|
||||||
|
So(d.Val.Value(), ShouldEqual, "$")
|
||||||
|
So(d.Val.Raw, ShouldEqual, "$$")
|
||||||
|
})
|
||||||
|
|
||||||
|
Convey("$$ should be a literal $ and not expanded within a string", func() {
|
||||||
|
unmarshalingTest(`val: mY,Passwo$$rd`, d)
|
||||||
|
So(d.Val.Value(), ShouldEqual, "mY,Passwo$rd")
|
||||||
|
So(d.Val.Raw, ShouldEqual, "mY,Passwo$$rd")
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Convey("BoolValue", func() {
|
Convey("BoolValue", func() {
|
||||||
@ -199,6 +219,7 @@ func TestValues(t *testing.T) {
|
|||||||
Reset(func() {
|
Reset(func() {
|
||||||
os.Unsetenv("INT")
|
os.Unsetenv("INT")
|
||||||
os.Unsetenv("STRING")
|
os.Unsetenv("STRING")
|
||||||
|
os.Unsetenv("EMPTYSTRING")
|
||||||
os.Unsetenv("BOOL")
|
os.Unsetenv("BOOL")
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user