summaryrefslogtreecommitdiff
path: root/service/env
diff options
context:
space:
mode:
authorWolfy-J <[email protected]>2018-07-26 17:47:46 +0300
committerGitHub <[email protected]>2018-07-26 17:47:46 +0300
commit3bed6a4ff255a5cb16fc4ad5f9faa62a068ef723 (patch)
treefcd055b054d57efcb7a8289724e334460169a25f /service/env
parent0f8e2bab6888f1b27ed2bd1b91ac6b2677f03450 (diff)
parenta2c1861165c9f61f8ece133f2edecb9aadfabe26 (diff)
Merge pull request #32 from spiral/feature/env-manager
Feature/env manager
Diffstat (limited to 'service/env')
-rw-r--r--service/env/config.go16
-rw-r--r--service/env/config_test.go29
-rw-r--r--service/env/provider.go8
-rw-r--r--service/env/service.go30
-rw-r--r--service/env/service_test.go24
5 files changed, 107 insertions, 0 deletions
diff --git a/service/env/config.go b/service/env/config.go
new file mode 100644
index 00000000..d0ba686b
--- /dev/null
+++ b/service/env/config.go
@@ -0,0 +1,16 @@
+package env
+
+import (
+ "github.com/spiral/roadrunner/service"
+)
+
+// Config defines set of env values for RR workers.
+type Config struct {
+ // values to set as worker _ENV.
+ Values map[string]string
+}
+
+// Hydrate must populate Config values using given Config source. Must return error if Config is not valid.
+func (c *Config) Hydrate(cfg service.Config) error {
+ return cfg.Unmarshal(&c.Values)
+}
diff --git a/service/env/config_test.go b/service/env/config_test.go
new file mode 100644
index 00000000..3ae2afbc
--- /dev/null
+++ b/service/env/config_test.go
@@ -0,0 +1,29 @@
+package env
+
+import (
+ "encoding/json"
+ "github.com/spiral/roadrunner/service"
+ "github.com/stretchr/testify/assert"
+ "testing"
+)
+
+type mockCfg struct{ cfg string }
+
+func (cfg *mockCfg) Get(name string) service.Config { return nil }
+func (cfg *mockCfg) Unmarshal(out interface{}) error { return json.Unmarshal([]byte(cfg.cfg), out) }
+
+func Test_Config_Hydrate(t *testing.T) {
+ cfg := &mockCfg{`{"key":"value"}`}
+ c := &Config{}
+
+ assert.NoError(t, c.Hydrate(cfg))
+ assert.Len(t, c.Values, 1)
+}
+
+func Test_Config_Hydrate_Empty(t *testing.T) {
+ cfg := &mockCfg{`{}`}
+ c := &Config{}
+
+ assert.NoError(t, c.Hydrate(cfg))
+ assert.Len(t, c.Values, 0)
+}
diff --git a/service/env/provider.go b/service/env/provider.go
new file mode 100644
index 00000000..2918f18c
--- /dev/null
+++ b/service/env/provider.go
@@ -0,0 +1,8 @@
+package env
+
+// Provider aggregates list of environment variables. This interface can be used in custom implementation to drive
+// values from external sources.
+type Provider interface {
+ // GetEnv must return list of env variables.
+ GetEnv() (map[string]string, error)
+}
diff --git a/service/env/service.go b/service/env/service.go
new file mode 100644
index 00000000..9fb110c3
--- /dev/null
+++ b/service/env/service.go
@@ -0,0 +1,30 @@
+package env
+
+// ID contains default svc name.
+const ID = "env"
+
+// Service provides ability to map _ENV values from config file.
+type Service struct {
+ // values is default set of values.
+ values map[string]string
+}
+
+// NewService creates new env service instance for given rr version.
+func NewService(version string) *Service {
+ return &Service{values: map[string]string{"rr": version}}
+}
+
+// Init must return configure svc and return true if svc hasStatus enabled. Must return error in case of
+// misconfiguration. Services must not be used without proper configuration pushed first.
+func (s *Service) Init(cfg *Config) (bool, error) {
+ for k, v := range cfg.Values {
+ s.values[k] = v
+ }
+
+ return true, nil
+}
+
+// GetEnv must return list of env variables.
+func (s *Service) GetEnv() (map[string]string, error) {
+ return s.values, nil
+}
diff --git a/service/env/service_test.go b/service/env/service_test.go
new file mode 100644
index 00000000..f25e56c7
--- /dev/null
+++ b/service/env/service_test.go
@@ -0,0 +1,24 @@
+package env
+
+import (
+ "github.com/stretchr/testify/assert"
+ "testing"
+)
+
+func Test_NewService(t *testing.T) {
+ s := NewService("version")
+ assert.Len(t, s.values, 1)
+}
+
+func Test_Extend(t *testing.T) {
+ s := NewService("version")
+
+ s.Init(&Config{Values: map[string]string{"key": "value"}})
+ assert.Len(t, s.values, 2)
+
+ values, err := s.GetEnv()
+ assert.NoError(t, err)
+ assert.Len(t, values, 2)
+ assert.Equal(t, "version", values["rr"])
+ assert.Equal(t, "value", values["key"])
+}