From 7e019b0529291e9d1886ebcefa857645b3e9c1f0 Mon Sep 17 00:00:00 2001 From: Piotr Zduniak Date: Sun, 1 Feb 2015 21:01:19 +0100 Subject: [PATCH 1/9] Added slack alerts support --- env/config.go | 6 ++++++ main.go | 14 +++++++++++++- models/email.go | 2 ++ setup/setup.go | 28 ++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/env/config.go b/env/config.go index 311dd89..2ca5ddd 100644 --- a/env/config.go +++ b/env/config.go @@ -24,4 +24,10 @@ type Flags struct { YubiCloudKey string LogglyToken string + + SlackURL string + SlackLevels string + SlackChannel string + SlackIcon string + SlackUsername string } diff --git a/main.go b/main.go index 60244ee..ead3bd2 100644 --- a/main.go +++ b/main.go @@ -65,7 +65,7 @@ var ( // YubiCloud params yubiCloudID = flag.String("yubicloud_id", "", "YubiCloud API id") yubiCloudKey = flag.String("yubicloud_key", "", "YubiCloud API key") - // Loggly URL + // loggly logglyToken = flag.String("loggly_token", "", "Loggly token") // etcd etcdAddress = flag.String("etcd_address", "", "etcd peer addresses split by commas") @@ -73,6 +73,12 @@ var ( etcdCertFile = flag.String("etcd_cert_file", "", "etcd path to client cert file") etcdKeyFile = flag.String("etcd_key_file", "", "etcd path to client key file") etcdPath = flag.String("etcd_path", "settings/", "Path of the keys") + // slack + slackURL = flag.String("slack_url", "", "URL of the Slack Incoming webhook") + slackLevels = flag.String("slack_level", "warning", "minimal level required to have messages sent to slack") + slackChannel = flag.String("slack_channel", "#api-logs", "channel to which Slack bot will send messages") + slackIcon = flag.String("slack_icon", ":ghost:", "emoji icon of the Slack bot") + slackUsername = flag.String("slack_username", "API", "username of the Slack bot") ) func main() { @@ -103,6 +109,12 @@ func main() { YubiCloudKey: *yubiCloudKey, LogglyToken: *logglyToken, + + SlackURL: *slackURL, + SlackLevels: *slackLevels, + SlackChannel: *slackChannel, + SlackIcon: *slackIcon, + SlackUsername: *slackUsername, } // Generate a mux diff --git a/models/email.go b/models/email.go index 206536a..ac6839c 100644 --- a/models/email.go +++ b/models/email.go @@ -31,6 +31,8 @@ type Email struct { // Snippet string //Preview Encrypted `json:"preview" gorethink:"preview"` + Headers []string `json:"headers" gorethink:"headers"` + // ThreadID Thread string `json:"thread" gorethink:"thread"` diff --git a/setup/setup.go b/setup/setup.go index d42f469..9862e0c 100644 --- a/setup/setup.go +++ b/setup/setup.go @@ -13,6 +13,7 @@ import ( "github.com/Sirupsen/logrus" "github.com/apcera/nats" "github.com/dancannon/gorethink" + "github.com/johntdyer/slackrus" "github.com/pzduniak/glogrus" "github.com/segmentio/go-loggly" "github.com/zenazn/goji/web" @@ -59,6 +60,33 @@ func PrepareMux(flags *env.Flags) *web.Mux { }) } + if flags.SlackURL != "" { + var level []logrus.Level + + switch flags.SlackLevels { + case "debug": + level = slackrus.LevelThreshold(logrus.DebugLevel) + case "error": + level = slackrus.LevelThreshold(logrus.ErrorLevel) + case "fatal": + level = slackrus.LevelThreshold(logrus.FatalLevel) + case "info": + level = slackrus.LevelThreshold(logrus.InfoLevel) + case "panic": + level = slackrus.LevelThreshold(logrus.PanicLevel) + case "warn": + level = slackrus.LevelThreshold(logrus.WarnLevel) + } + + log.Hooks.Add(&slackrus.SlackrusHook{ + HookURL: flags.SlackURL, + AcceptedLevels: level, + Channel: flags.SlackChannel, + IconEmoji: flags.SlackIcon, + Username: flags.SlackUsername, + }) + } + // Pass it to the environment package env.Log = log From 1e5ce6a12608e99e538c0122624aacf01046a09b Mon Sep 17 00:00:00 2001 From: Piotr Zduniak Date: Sun, 1 Feb 2015 21:05:36 +0100 Subject: [PATCH 2/9] Fixed the build --- setup/setup.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/setup/setup.go b/setup/setup.go index 9862e0c..8e4b8c6 100644 --- a/setup/setup.go +++ b/setup/setup.go @@ -106,10 +106,10 @@ func PrepareMux(flags *env.Flags) *web.Mux { // Set up the database rethinkOpts := gorethink.ConnectOpts{ - Address: flags.RethinkDBAddress, - AuthKey: flags.RethinkDBKey, - MaxIdle: 10, - IdleTimeout: time.Second * 10, + Address: flags.RethinkDBAddress, + AuthKey: flags.RethinkDBKey, + MaxIdle: 10, + Timeout: time.Second * 10, } err = db.Setup(rethinkOpts) if err != nil { From b0eb93e6829ef5f80123dd2f3489f0d58135cb4d Mon Sep 17 00:00:00 2001 From: Piotr Zduniak Date: Sun, 1 Feb 2015 21:08:32 +0100 Subject: [PATCH 3/9] fixed tests --- routes/init_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/routes/init_test.go b/routes/init_test.go index c7b461b..227cfbb 100644 --- a/routes/init_test.go +++ b/routes/init_test.go @@ -36,10 +36,10 @@ func init() { // Connect to the RethinkDB server rdbSession, err := gorethink.Connect(gorethink.ConnectOpts{ - Address: env.Config.RethinkDBAddress, - AuthKey: env.Config.RethinkDBKey, - MaxIdle: 10, - IdleTimeout: time.Second * 10, + Address: env.Config.RethinkDBAddress, + AuthKey: env.Config.RethinkDBKey, + MaxIdle: 10, + Timeout: time.Second * 10, }) if err != nil { panic("connecting to RethinkDB should not return an error, got " + err.Error()) From ddeeed1f4f30f68074c378938148614e0556a1db Mon Sep 17 00:00:00 2001 From: Piotr Zduniak Date: Sun, 1 Feb 2015 21:51:25 +0100 Subject: [PATCH 4/9] New deployment flow --- .drone.yml | 9 ++++----- fabfile.py | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 fabfile.py diff --git a/.drone.yml b/.drone.yml index 61947ff..1956af8 100644 --- a/.drone.yml +++ b/.drone.yml @@ -6,17 +6,16 @@ services: - apcera/gnatsd - dockerfile/rethinkdb script: + - pip install fabric - go get -t -v ./... - go get golang.org/x/tools/cmd/cover - go get github.com/mattn/goveralls - GOMAXPROCS=4 go test -v github.com/lavab/api/setup - GOMAXPROCS=4 go test -v -covermode=count -coverprofile=coverage.out github.com/lavab/api/routes - /var/cache/drone/bin/goveralls -coverprofile=coverage.out -service=lavadrone -repotoken $COVERALLS_TOKEN - - "if [ \"$DRONE_BRANCH\" = \"master\" ]; then export CONTAINER_NAME=api-master; export CONTAINER_PORT=10000; fi" - - "if [ \"$DRONE_BRANCH\" = \"staging\" ]; then export CONTAINER_NAME=api-staging; export CONTAINER_PORT=10001; fi" - - "if [ \"$DRONE_BRANCH\" = \"develop\" ]; then export CONTAINER_NAME=api-develop; export CONTAINER_PORT=10002; fi" - - "if [ -n \"$CONTAINER_NAME\" ]; then chmod +x ./.drone/build.sh && ./.drone/build.sh; fi" - - "if [ -n \"$CONTAINER_NAME\" ]; then ssh -p 36412 root@lisa.lavaboom.io \"/opt/deploy/$CONTAINER_NAME.sh\"; fi" + - "if [ \"$DRONE_BRANCH\" = \"master\" ]; then fab -H marge.lavaboom.io:36104 deploy; fi" + - "if [ \"$DRONE_BRANCH\" = \"staging\" ]; then fab -H lisa.lavaboom.io:36412 deploy; fi" + - "if [ \"$DRONE_BRANCH\" = \"develop\" ]; then fab -H bart.lavaboom.io:36467 deploy; fi" notify: slack: - webhook_url: $$SLACK_URL diff --git a/fabfile.py b/fabfile.py new file mode 100644 index 0000000..b869329 --- /dev/null +++ b/fabfile.py @@ -0,0 +1,19 @@ +import os, random, string +from fabric.api import run, env + +def deploy(): + branch = os.getenv('DRONE_BRANCH', 'master') + commit = os.getenv('DRONE_COMMIT', 'master') + tmp_dir = '/tmp/' + ''.join(random.choice(string.lowercase) for i in xrange(10)) + + with cd(tmp_dir): + run('git clone git@github.com:lavab/api.git') + with cd('api'): + run('docker build -t registry.lavaboom.io/lavaboom/api-' + branch + ' .') + + run('git clone git@github.com:lavab/docker.git') + with cd('docker/runners'): + run('docker rm -f api-' + branch) + run('./api-' + branch + '.sh') + + run('rm -r ' + tmp_dir) \ No newline at end of file From 40339eff173edc9662a70924f3a969951b7708a1 Mon Sep 17 00:00:00 2001 From: Piotr Zduniak Date: Sun, 1 Feb 2015 22:16:43 +0100 Subject: [PATCH 5/9] whoops --- fabfile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fabfile.py b/fabfile.py index b869329..1e9634e 100644 --- a/fabfile.py +++ b/fabfile.py @@ -1,5 +1,5 @@ import os, random, string -from fabric.api import run, env +from fabric.api import run, env, cd def deploy(): branch = os.getenv('DRONE_BRANCH', 'master') @@ -10,7 +10,7 @@ def deploy(): run('git clone git@github.com:lavab/api.git') with cd('api'): run('docker build -t registry.lavaboom.io/lavaboom/api-' + branch + ' .') - + run('git clone git@github.com:lavab/docker.git') with cd('docker/runners'): run('docker rm -f api-' + branch) From 57d0d1a88e435d1c7ea011e42ded405c8a3e0d1b Mon Sep 17 00:00:00 2001 From: Piotr Zduniak Date: Sun, 1 Feb 2015 22:18:52 +0100 Subject: [PATCH 6/9] whoopsie, didn't add git checkout --- fabfile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fabfile.py b/fabfile.py index 1e9634e..2b346d6 100644 --- a/fabfile.py +++ b/fabfile.py @@ -9,6 +9,7 @@ def deploy(): with cd(tmp_dir): run('git clone git@github.com:lavab/api.git') with cd('api'): + run('git checkout ' + commit) run('docker build -t registry.lavaboom.io/lavaboom/api-' + branch + ' .') run('git clone git@github.com:lavab/docker.git') From fd4100e71cb7834ff876a66cc5410a37d303bd25 Mon Sep 17 00:00:00 2001 From: Piotr Zduniak Date: Sun, 1 Feb 2015 22:33:04 +0100 Subject: [PATCH 7/9] added ssh key support --- fabfile.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fabfile.py b/fabfile.py index 2b346d6..fc6431b 100644 --- a/fabfile.py +++ b/fabfile.py @@ -1,6 +1,8 @@ import os, random, string from fabric.api import run, env, cd +env.key_filename = os.getenv('HOME', '/root') + '/.ssh/id_rsa' + def deploy(): branch = os.getenv('DRONE_BRANCH', 'master') commit = os.getenv('DRONE_COMMIT', 'master') From 1d2e61a5c54fa2355d8660f6a37e239b988b235a Mon Sep 17 00:00:00 2001 From: Piotr Zduniak Date: Sun, 1 Feb 2015 22:41:30 +0100 Subject: [PATCH 8/9] Forgot about mkdir --- fabfile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fabfile.py b/fabfile.py index fc6431b..ccba6ee 100644 --- a/fabfile.py +++ b/fabfile.py @@ -8,6 +8,7 @@ def deploy(): commit = os.getenv('DRONE_COMMIT', 'master') tmp_dir = '/tmp/' + ''.join(random.choice(string.lowercase) for i in xrange(10)) + run('mkdir ' + tmp_dir) with cd(tmp_dir): run('git clone git@github.com:lavab/api.git') with cd('api'): From e2ce572d9616fd1b72a3477db556fe3e6bcd6deb Mon Sep 17 00:00:00 2001 From: Piotr Zduniak Date: Sun, 1 Feb 2015 22:53:21 +0100 Subject: [PATCH 9/9] Added error permitting to docker rm -f --- fabfile.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fabfile.py b/fabfile.py index ccba6ee..4193997 100644 --- a/fabfile.py +++ b/fabfile.py @@ -1,5 +1,5 @@ import os, random, string -from fabric.api import run, env, cd +from fabric.api import run, env, cd, settings env.key_filename = os.getenv('HOME', '/root') + '/.ssh/id_rsa' @@ -16,8 +16,9 @@ def deploy(): run('docker build -t registry.lavaboom.io/lavaboom/api-' + branch + ' .') run('git clone git@github.com:lavab/docker.git') - with cd('docker/runners'): + with settings(warn_only=True): run('docker rm -f api-' + branch) + with cd('docker/runners'): run('./api-' + branch + '.sh') run('rm -r ' + tmp_dir) \ No newline at end of file