Skip to content

Commit

Permalink
Feature: fix-main and update logging (#5)
Browse files Browse the repository at this point in the history
* Feature: fix-main and update logging

* chg: fixed main.go

* chg: config_test update

* hotfix: config_test possibly fixed

* chg: config_test

* chg: fixed it
  • Loading branch information
bossjones authored Jan 25, 2018
1 parent 7de4074 commit 8f154cc
Show file tree
Hide file tree
Showing 8 changed files with 466 additions and 112 deletions.
5 changes: 4 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ username := bossjones
container_name := go-chatbot-lab
BIN_NAME := go-chatbot-lab
SOURCES := $(shell find . \( -name vendor \) -prune -o -name '*.go')
VERSION := $(shell grep "const Version " version.go | sed -E 's/.*"(.+)"$$/\1/')
# VERSION := $(shell grep "const Version " version.go | sed -E 's/.*"(.+)"$$/\1/')
VERSION := $(shell git describe --tags --dirty)
GIT_SHA := $(shell git rev-parse HEAD)
GIT_DIRTY := $(shell test -n "`git status --porcelain`" && echo "+CHANGES" || true)
GIT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
Expand Down Expand Up @@ -93,6 +94,8 @@ get-deps:
update:
glide update

glide-install-update: get-deps update

install-tools:
@which golint || go get -u github.com/golang/lint/golint
@which cover || go get golang.org/x/tools/cmd/cover
Expand Down
86 changes: 78 additions & 8 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,11 @@ import (
"strconv"
"strings"

log "github.com/behance/go-logging/log"
logUtils "github.com/bossjones/go-chatbot-lab/shared/log-utils"
)

// Config -
type Config struct {
// ********************************************
ConfigFile string `json:"configFile"`
// "name": "chatbot",
Name string `json:"name"`
Expand Down Expand Up @@ -50,9 +49,12 @@ type Config struct {
IsContainer bool `json:"isContainer"`
// "ssl-cert-location": "/etc/chatbot",
SSLCertLocation string `json:"ssl-cert-location"`
// ********************************************
// "log-level": "debugging level"
Debug bool `json:"logLevel"`
}

var chatLog = logUtils.NewLogger()

// NewConfig -
func NewConfig(file string) (Config, error) {
c := Config{}
Expand Down Expand Up @@ -85,6 +87,7 @@ func (c *Config) LoadFromEnv() {
setValueFromEnv(&c.KVttl, "CHATBOT_KV_TTL")
setBoolValueFromEnv(&c.IsContainer, "CHATBOT_IS_CONTAINER")
setValueFromEnv(&c.SSLCertLocation, "CHATBOT_SSL_CERT_LOCATION")
setBoolValueFromEnv(&c.Debug, "CHATBOT_DEBUG")
}

// LoadFromConfigFile -
Expand All @@ -93,12 +96,12 @@ func (c *Config) LoadFromConfigFile(configFile string) error {
c.ConfigFile = configFile
jsonSrc, err := ioutil.ReadFile(c.ConfigFile)
if err != nil {
log.Warn("Error reading config.", "error", err)
chatLog.Warn("Error reading config.", "error", err)
return err
}
err = json.Unmarshal(jsonSrc, &c)
if err != nil {
log.Warn("Error parsing config.", "error", err)
chatLog.Warn("Error parsing config.", "error", err)

return err
}
Expand Down Expand Up @@ -149,7 +152,7 @@ func setSliceValueFromEnv(field *[]string, envVar string) {
apps := make([]string, 0)
err := json.Unmarshal([]byte(env), &apps)
if err != nil {
log.Error("Error parsing slice in config.", "variable", envVar, "value", env)
chatLog.Error("Error parsing slice in config.", "variable", envVar, "value", env)
}
*field = apps
}
Expand All @@ -161,9 +164,76 @@ func setSliceValueFromEnv(field *[]string, envVar string) {
// var err error
// *field, err = strconv.Atoi(env)
// if err != nil {
// log.Error("Invalid environment variable", "var", envVar, "value", env)
// chatLog.Error("Invalid environment variable", "var", envVar, "value", env)
// }
// }
// }

// //Validate checks config values for obvious problems.
// func (c *Config) Validate() error {
// var e error
// if _, err := strconv.Atoi(c.APIServerPort); err != nil {
// e = errors.New(APIServerPortErr + c.APIServerPort)
// }
// if !strings.Contains("sqlite3,mysql", c.DBEngine) {
// e = errors.New(DBEngineErr + c.DBEngine)
// }
// if c.DBPath == "" {
// e = errors.New(DBPathErr + c.DBPath)
// }
// //mysql needs usernmae password and database
// if c.DBEngine != "sqlite3" && c.DBUsername == "" {
// e = errors.New(DBUsernameErr + c.DBUsername)
// }
// if c.DBEngine != "sqlite3" && c.DBPassword == "" {
// e = errors.New(DBPasswordErr + c.DBPassword)
// }
// if c.DBEngine != "sqlite3" && c.DBDatabase == "" {
// e = errors.New(DBDatabaseErr + c.DBDatabase)
// }
// if c.MarathonMaster == "" {
// e = errors.New(MarathonMasterErr + c.MarathonMaster)
// }
// if c.MesosMaster == "" {
// e = errors.New(MesosMasterErr + c.MesosMaster)
// }
// if c.MesosAuthenticationPrincipal != "" && c.MesosAuthenticationSecretFile == "" {
// e = errors.New("Cannot have empty Mesos authentication file if principal is specified")
// }
// if c.MarathonAuthenticationPrincipal != "" && c.MarathonAuthenticationSecretFile == "" {
// e = errors.New("Cannot have empty Marathon authentication file if principal is specified")
// }
// if c.MarathonAuthenticationPrincipal != "" && c.MarathonUser != "" {
// e = errors.New("Cannot specify both MarathonUser and MarathonPrincipal")
// }
// if c.KVServer == "" {
// e = errors.New(KVServerErr + c.KVServer)
// }
// rangeVals := strings.Split(c.ProxyPortRange, ":")
// if len(rangeVals) != 2 {
// e = errors.New(ProxyPortRangeFormatErr + c.ProxyPortRange)
// } else {
// if _, err := strconv.Atoi(rangeVals[0]); err != nil {
// e = errors.New(ProxyPortRangeMinErr + c.ProxyPortRange)
// }
// if _, err := strconv.Atoi(rangeVals[1]); err != nil {
// e = errors.New(ProxyPortRangeMaxErr + c.ProxyPortRange)
// }
// }
// if !strings.Contains("json-file journald", c.AppLogDriver) {
// e = errors.New(LogErr + c.AppLogDriver)
// }
// if c.AquaEnabled && c.AquaEndpoint == "" {
// e = errors.New(AquaErr)
// }
// for _, param := range c.AllowedDockerRunParams {
// if strings.ContainsAny(param, "[]\"") {
// e = errors.New(
// "FD_ALLOWED_DOCKER_RUN_PARAMS should be a comma-separated list of param names; no brackets or quotes. E.g.:\n" +
// " label,l,read-only,work-dir,w,network,net\n")
// }
// }
// return e
// }

func setBoolValueFromEnv(field *bool, envVar string) {
Expand All @@ -172,7 +242,7 @@ func setBoolValueFromEnv(field *bool, envVar string) {
var err error
*field, err = strconv.ParseBool(env)
if err != nil {
log.Error("Invalid environment variable", "var", envVar, "value", env)
chatLog.Error("Invalid environment variable", "var", envVar, "value", env)
}
}
}
98 changes: 46 additions & 52 deletions config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,43 @@ import (
"os"
"reflect"

log "github.com/behance/go-logging/log"
. "github.com/bossjones/go-chatbot-lab/config"
logUtils "github.com/bossjones/go-chatbot-lab/shared/log-utils"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)

var chatLog = logUtils.NewLogger()

func setenv(key, val string) {
err := os.Setenv(key, val)
if err != nil {
chatLog.Error("Setenv Error", "err", err)
}
}

func unsetenv(key string) {
err := os.Unsetenv(key)
if err != nil {
chatLog.Error("Unsetenv Error", "err", err)
}
}

var _ = Describe("Config", func() {
var (
configFile string
c *Config
)

BeforeEach(func() {
log.SetLevel(log.PanicLevel)
configFile = "./sampleconfig.json"
c = &Config{}
})

Describe("Reading sample config file", func() {
It("should read the file", func() {

err := c.LoadFromConfigFile(configFile)
log.Error(err)

Expect(err).NotTo(HaveOccurred())
Expect(err).ToNot(HaveOccurred())
})
It("it should parse json correctly", func() {
var noValue string
Expand All @@ -46,59 +58,41 @@ var _ = Describe("Config", func() {
})

})
Describe("Reading from ENV", func() {
It("should read a var", func() {
os.Setenv("CHATBOT_HOST", "a-server-name")
c, err := NewConfig("")

Expect(err).NotTo(HaveOccurred())
Expect(c.Host).To(Equal("a-server-name"))
Describe("LoadFromEnv", func() {
BeforeEach(func() {
setenv("CHATBOT_HOST", "a-server-name")
setenv("CHATBOT_COMMANDS", `["app1:img1","app1:img2"]`)
setenv("CHATBOT_IS_CONTAINER", "false")
})
It("should read bool vars", func() {
os.Setenv("CHATBOT_IS_CONTAINER", "false")
c, err := NewConfig("")

Expect(err).NotTo(HaveOccurred())
It("reads ENV vals", func() {
c.LoadFromEnv()
Expect(c.Host).To(Equal("a-server-name"))
Expect(c.IsContainer).To(Equal(false))
})
// It("should read proxy template resource", func() {
// os.Setenv("CHATBOT_PROXY_TEMPLATE_RESOURCE", "/my/path/to.template")
// c, err := NewConfig("")

// Expect(err).NotTo(HaveOccurred())
// Expect(c.ProxyTemplateResource).To(Equal("/my/path/to.template"))
// })
It("should read a slice var", func() {
os.Setenv("CHATBOT_COMMANDS", `["app1:img1","app1:img2"]`)
c, err := NewConfig("")

Expect(err).NotTo(HaveOccurred())
Expect(len(c.Commands)).To(Equal(2))
Expect(c.Commands[0]).To(Equal("app1:img1"))
Expect(c.Commands[1]).To(Equal("app1:img2"))
})
It("should fail to read a bad slice var", func() {
os.Setenv("CHATBOT_COMMANDS", `"app1:img1","app1:img2"`) //missing []
c, _ := NewConfig("")
Expect(len(c.Commands)).To(Equal(0))

AfterEach(func() {
unsetenv("CHATBOT_HOST")
unsetenv("CHATBOT_COMMANDS")
unsetenv("CHATBOT_IS_CONTAINER")
})
})

Describe("String", func() {
It("Returns the Config without DockerPassword", func() {
config := Config{
Name: "scarlett",
BrainType: "redis",
}

safeConfig := config.String()

Expect(safeConfig).To(ContainSubstring(`BrainType: redis`))
Expect(safeConfig).To(ContainSubstring(`Name: scarlett`))
})
// It("should read marathon variables", func() {
// os.Setenv("CHATBOT_MARATHON_EVENT_HANDLER", "true")
// os.Setenv("CHATBOT_MARATHON_MASTER", "marathon-master")
// os.Setenv("CHATBOT_MARATHON_MASTER_PROTOCOL", "marathon-master-protocol")
// os.Setenv("CHATBOT_MARATHON_USER", "marathon-user")
// os.Setenv("CHATBOT_MARATHON_PASSWORD", "marathon-password")
// os.Setenv("CHATBOT_MARATHON_AUTH_PRINCIPAL", "marathon-auth-principal")
// os.Setenv("CHATBOT_MARATHON_SECRET_FILE", "marathon-secret-file")
// c, err := NewConfig("")

// Expect(err).NotTo(HaveOccurred())
// Expect(c.MarathonEventHandler).To(BeTrue())
// Expect(c.MarathonMaster).To(Equal("marathon-master"))
// Expect(c.MarathonMasterProtocol).To(Equal("marathon-master-protocol"))
// Expect(c.MarathonUser).To(Equal("marathon-user"))
// Expect(c.MarathonPassword).To(Equal("marathon-password"))
// Expect(c.MarathonAuthPrincipal).To(Equal("marathon-auth-principal"))
// Expect(c.MarathonSecretFile).To(Equal("marathon-secret-file"))
// })
})
})
36 changes: 22 additions & 14 deletions glide.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 8f154cc

Please sign in to comment.