From f7aa396a970d365790c11fd90ba7748d079727a4 Mon Sep 17 00:00:00 2001 From: Alexander Korelskiy Date: Tue, 17 Nov 2020 15:34:05 +0300 Subject: [PATCH 1/3] Add go mod support, use docker multistage build --- .buildkite/pipeline.yml | 9 -- .gitignore | 12 -- Dockerfile | 18 +-- README.md | 4 +- build.sh | 25 --- deploy/allocation_follower.json.tpl | 82 ---------- deploy/config.hcl.tpl | 9 -- go.mod | 19 +++ go.sum | 171 ++++++++++++++++++++ vendor/vendor.json | 235 ---------------------------- 10 files changed, 198 insertions(+), 386 deletions(-) delete mode 100644 .buildkite/pipeline.yml delete mode 100644 .gitignore delete mode 100644 build.sh delete mode 100644 deploy/allocation_follower.json.tpl delete mode 100644 deploy/config.hcl.tpl create mode 100644 go.mod create mode 100644 go.sum delete mode 100644 vendor/vendor.json diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml deleted file mode 100644 index 6d101b8..0000000 --- a/.buildkite/pipeline.yml +++ /dev/null @@ -1,9 +0,0 @@ -steps: - - label: ':hammer: Build Nomad Follower' - command: 'chmod +x build.sh && ./build.sh -n cluster_network -s $BUILDKITE_COMMIT -b $BUILDKITE_BRANCH -t $BUILDKITE_TAG' - plugins: - docker-login#v2.0.0: - username: devopsintralox - password-env: DOCKER_LOGIN_PASSWORD - agents: - genpurpose: "true" \ No newline at end of file diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 7e1b691..0000000 --- a/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -vendor/github.com/ -vendor/golang.org/ -allocationFollower/vendor/github.com/ -allocationFollower/vendor/golang.org/ -forwardingService/vendor/github.com/ -forwardingService/vendor/golang.org/ -forwardingService/vendor/gopkg.in/natefinch/lumberjack.v2/chown.go -forwardingService/vendor/gopkg.in/ -allocationFollower/vendor/gopkg.in/ -allocationFollower/debug -vendor/gopkg.in/ -debug diff --git a/Dockerfile b/Dockerfile index c5af47f..2739049 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,7 @@ -FROM golang:1.10.0-alpine3.7 +FROM golang:1.14-alpine AS builder +ADD . /build +RUN cd /build && go install -mod=mod -RUN apk add --update --no-cache git - -ADD . /go/src/github.com/adragoset/nomad_follower - -RUN set -ex \ - && go get github.com/kardianos/govendor \ - && cd /go/src/github.com/adragoset/nomad_follower \ - && govendor sync \ - && go install - -CMD nomad_follower \ No newline at end of file +FROM alpine:latest +COPY --from=builder /go/bin/nomad_follower . +CMD ["./nomad_follower"] diff --git a/README.md b/README.md index 66e406f..dd6fe57 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ Log forwarder for aggregating allocation logs from nomad worker agents. ## Running the application Run the application on each worker in a nomad cluster. nomad_follower will follow all allocations on the worker and tail the allocation logs to the aggregate log file. -```docker pull devopsintralox/nomad_follower:latest``` +```docker pull sas1024/nomad_follower:latest``` -```docker run -v log_folder:/log -e LOG_FILE="/logs/nomad-forwarder.log" devopsintralox/nomad_follower:latest``` +```docker run -v log_folder:/log -e LOG_FILE="/logs/nomad-forwarder.log" sas1024/nomad_follower:latest``` nomad_follower will stop following completed allocations and will start following new allocations as they become available. diff --git a/build.sh b/build.sh deleted file mode 100644 index 659a989..0000000 --- a/build.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -while getopts ":n:s:b:t:" opt; do - case $opt in - s) SHA1="$OPTARG" - ;; - b) BRANCH="$OPTARG" - ;; - t) TAG="$OPTARG" - ;; - n) NET="$OPTARG" - ;; - \?) echo "Invalid option -$OPTARG" >&2 - ;; - esac -done -echo docker build -t devopsintralox/nomad_follower:${SHA1} --network=${NET} . -docker build -t devopsintralox/nomad_follower:${SHA1} --network=${NET} . -docker push devopsintralox/nomad_follower:${SHA1} -if [ "${TAG}" != "" ]; then - docker tag devopsintralox/nomad_follower:${SHA1} devopsintralox/nomad_follower:${TAG} - docker push devopsintralox/nomad_follower:${TAG} -else - docker tag devopsintralox/nomad_follower:${SHA1} devopsintralox/nomad_follower:${BRANCH} - docker push devopsintralox/nomad_follower:${BRANCH} -fi \ No newline at end of file diff --git a/deploy/allocation_follower.json.tpl b/deploy/allocation_follower.json.tpl deleted file mode 100644 index d7958a0..0000000 --- a/deploy/allocation_follower.json.tpl +++ /dev/null @@ -1,82 +0,0 @@ -{ - "Job": { - "Datacenters": ["[[.dataCenter]]"], - "ID": "log-follower-[[.environment]]", - "Name": "log-follower-[[.environment]]", - "Region": "[[.region]]", - "Type": "system", - "TaskGroups": [ - { - "Name": "service", - "Count": 1, - "RestartPolicy": { - "Attempts": 2, - "Delay": 15000000000, - "Interval": 60000000000, - "Mode": "delay" - }, - "Tasks": [ - { - "Name": "log-forwarder", - "KillTimeout": 5000000000, - "LogConfig": { - "MaxFileSizeMB": 10, - "MaxFiles": 10 - }, - "Driver": "docker", - "Config": { - "image": "npdsoftwaredev/nomad_follower:[[.containerRef]]", - "network_mode": "cluster_network" - }, - "Resources": { - "CPU": 200, - "MemoryMB": 350, - "Networks": [ - { - "MBits": 100 - } - ] - }, - "Artifacts": [ - { - "GetterSource":"[[.repoPath]]//deploy", - "RelativeDest":"repo", - "GetterOptions": { - "sshkey": "[[.githubsshkey]]", - "ref": "[[.repoRef]]" - } - } - ], - "Templates": [ - { - "SourcePath": "repo/config.hcl.tpl", - "DestPath": "local/config.env", - "Envvars": true, - "ChangeMode": "restart" - }, - { - - "EmbeddedTmpl": "{{ with secret \"/secret/cluster/root/certificates\" }}{{ .Data.root.cert }}{{ end }}", - "DestPath": "local/ca.pem", - "ChangeMode": "restart" - }, - { - "EmbeddedTmpl": "{{ with secret \"/secret/cluster/nomad/certificates\" }}{{ .Data.nomad_cli.cert }}{{ end }}", - "DestPath": "local/cert.pem", - "ChangeMode": "restart" - }, - { - "EmbeddedTmpl": "{{ with secret \"/secret/cluster/nomad/certificates\" }}{{ .Data.nomad_cli.key }}{{ end }}", - "DestPath": "local/key.pem", - "ChangeMode": "restart" - } - ], - "Vault": { - "Policies": ["deploy_infrastructure_components"] - } - } - ] - } - ] - } -} diff --git a/deploy/config.hcl.tpl b/deploy/config.hcl.tpl deleted file mode 100644 index 8ffb39d..0000000 --- a/deploy/config.hcl.tpl +++ /dev/null @@ -1,9 +0,0 @@ -NOMAD_ADDR=https://192.168.85.1:4646 -NOMAD_REGION={{ env "NOMAD_REGION" }} -NOMAD_NAMESPACE=default -NOMAD_CACERT=/local/ca.pem -NOMAD_CLIENT_CERT=/local/cert.pem -NOMAD_CLIENT_KEY=/local/key.pem -NOMAD_SKIP_VERIFY=false -LOG_FILE=/logs/nomad-forwarder.log - diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e08fcba --- /dev/null +++ b/go.mod @@ -0,0 +1,19 @@ +module github.com/sas1024/nomad_follower + +go 1.14 + +require ( + github.com/dmwilcox/fuzzytime v0.0.0-20191010161914-05ea0010feac + github.com/docker/go-units v0.4.0 // indirect + github.com/hashicorp/nomad/api v0.0.0-20201116174134-7a6db5f4836c + github.com/hashicorp/vault/api v1.0.4 + github.com/kr/pretty v0.2.1 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect + github.com/mitchellh/mapstructure v1.3.3 + github.com/stretchr/testify v1.6.1 // indirect + golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392 // indirect + golang.org/x/net v0.0.0-20190923162816-aa69164e4478 // indirect + golang.org/x/text v0.3.2 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3 + gopkg.in/yaml.v2 v2.3.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..0ff4b0f --- /dev/null +++ b/go.sum @@ -0,0 +1,171 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dmwilcox/fuzzytime v0.0.0-20191010161914-05ea0010feac h1:TenyRmfQ/UAdE6OHtFxPHyc1bQwHfg8nBdc/VfXDbLQ= +github.com/dmwilcox/fuzzytime v0.0.0-20191010161914-05ea0010feac/go.mod h1:fUUPWDEEtZ74jLp6Z5D4VpZyD7xrnklYnP/lCUn1Mzg= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= +github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/cronexpr v1.1.0 h1:dnNsWtH0V2ReN7JccYe8m//Bj14+PjJDntR1dz0Cixk= +github.com/hashicorp/cronexpr v1.1.0/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= +github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= +github.com/hashicorp/go-retryablehttp v0.5.4 h1:1BZvpawXoJCWX6pNtow9+rpEj+3itIlutiqnntI6jOE= +github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.1 h1:DMo4fmknnz0E0evoNYnV48RjWndOsmd6OW+09R3cEP8= +github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0= +github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/nomad/api v0.0.0-20201116174134-7a6db5f4836c h1:rOrft1/La/JrAcx71y/Svwa/1sS/RjOriIwtwgF4Bt8= +github.com/hashicorp/nomad/api v0.0.0-20201116174134-7a6db5f4836c/go.mod h1:vYHP9jMXk4/T2qNUbWlQ1OHCA1hHLil3nvqSmz8mtgc= +github.com/hashicorp/vault/api v1.0.4 h1:j08Or/wryXT4AcHj1oCbMd7IijXcKzYUGw59LGu9onU= +github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= +github.com/hashicorp/vault/sdk v0.1.13 h1:mOEPeOhT7jl0J4AMl1E705+BcmeRs1VmKNb9F0sMLy8= +github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392 h1:ACG4HJsFiNMf47Y4PeRoebLNy/2lXT9EtprMuTFWt1M= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3 h1:AFxeG48hTWHhDTQDk/m2gorfVHUEa9vo3tp3D7TzwjI= +gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/square/go-jose.v2 v2.3.1 h1:SK5KegNXmKmqE342YYN2qPHEnUYeoMiXXl1poUlI+o4= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/vendor.json b/vendor/vendor.json deleted file mode 100644 index 7570cee..0000000 --- a/vendor/vendor.json +++ /dev/null @@ -1,235 +0,0 @@ -{ - "comment": "", - "ignore": "test", - "package": [ - { - "checksumSHA1": "CfLsyVELWof4pl156D1TQZG++zg=", - "path": "github.com/armon/go-metrics", - "revision": "783273d703149aaeb9897cf58613d5af48861c25", - "revisionTime": "2018-02-21T18:27:44Z" - }, - { - "checksumSHA1": "Trm5WjeuqeUTACF4GXE9FuIj92I=", - "path": "github.com/gorhill/cronexpr", - "revision": "d520615e531a6bf3fb69406b9eba718261285ec8", - "revisionTime": "2016-12-05T14:13:22Z" - }, - { - "checksumSHA1": "TyROg1M78m4jlRlUQk70gtUv2E4=", - "path": "github.com/hashicorp/consul/api", - "revision": "844a5fe8c0646f454021f49245d8b4049b696b6e", - "revisionTime": "2018-03-14T11:03:21Z" - }, - { - "checksumSHA1": "pP0b9eRHl4ZFD4zTcWxTZH4CPq0=", - "path": "github.com/hashicorp/errwrap", - "revision": "7554cd9344cec97297fa6649b055a8c98c2a1e55", - "revisionTime": "2014-10-28T05:47:10Z" - }, - { - "checksumSHA1": "YjdpDMKisJYSzBacXs7OakIm/Yg=", - "path": "github.com/hashicorp/go-cleanhttp", - "revision": "d5fe4b57a186c716b0e00b8c301cbd9b4182694d", - "revisionTime": "2017-12-18T14:54:08Z" - }, - { - "checksumSHA1": "QPhspQeMCzyjSloKRdjN6ETCuwM=", - "path": "github.com/hashicorp/go-immutable-radix", - "revision": "7f3cd4390caab3250a57f30efdb2a65dd7649ecf", - "revisionTime": "2018-01-29T17:09:00Z" - }, - { - "checksumSHA1": "Ur9RwaNKnOkCClhztzHPhOR5uAM=", - "path": "github.com/hashicorp/go-msgpack/codec", - "revision": "fa3f63826f7c23912c15263591e65d54d080b458", - "revisionTime": "2015-05-18T23:42:57Z" - }, - { - "checksumSHA1": "uK1chQA/LitAGOl/EuU2bhvaI5s=", - "path": "github.com/hashicorp/go-multierror", - "revision": "b7773ae218740a7be65057fc60b366a49b538a44", - "revisionTime": "2017-12-04T18:29:08Z" - }, - { - "checksumSHA1": "x4M2uMULc5qiKQNN6CPioGNXAnk=", - "path": "github.com/hashicorp/go-rootcerts", - "revision": "6bb64b370b90e7ef1fa532be9e591a81c3493e00", - "revisionTime": "2016-05-03T14:34:40Z" - }, - { - "checksumSHA1": "5kq+dVEDWdtDMfINluiR0iECNFY=", - "path": "github.com/hashicorp/go-version", - "revision": "4fe82ae3040f80a03d04d2cccb5606a626b8e1ee", - "revisionTime": "2017-11-29T15:08:20Z" - }, - { - "checksumSHA1": "sZBC82LlCP+qEu9/4rzKzgfEdIc=", - "path": "github.com/hashicorp/golang-lru", - "revision": "0fb14efe8c47ae851c0034ed7a448854d3d34cf3", - "revisionTime": "2018-02-01T23:52:37Z" - }, - { - "checksumSHA1": "BBPs41SjdH2T+Kos+L4KbjmDsJk=", - "path": "github.com/hashicorp/golang-lru/simplelru", - "revision": "0fb14efe8c47ae851c0034ed7a448854d3d34cf3", - "revisionTime": "2018-02-01T23:52:37Z" - }, - { - "checksumSHA1": "35UiDOE3TlLfiuF+EFu5HB2dGF8=", - "path": "github.com/hashicorp/hcl", - "revision": "23c074d0eceb2b8a5bfdbb271ab780cde70f05a8", - "revisionTime": "2017-10-17T18:19:29Z" - }, - { - "checksumSHA1": "7QpzuLg3aKDJWPD2kUz1Jw+JJfU=", - "path": "github.com/hashicorp/hcl/hcl/ast", - "revision": "23c074d0eceb2b8a5bfdbb271ab780cde70f05a8", - "revisionTime": "2017-10-17T18:19:29Z" - }, - { - "checksumSHA1": "L4y20agIjw5hXzu6B4KVIkT7iMs=", - "path": "github.com/hashicorp/hcl/hcl/parser", - "revision": "23c074d0eceb2b8a5bfdbb271ab780cde70f05a8", - "revisionTime": "2017-10-17T18:19:29Z" - }, - { - "checksumSHA1": "GI1HB6yTRPgBmRcT8MdSDU5XhHc=", - "path": "github.com/hashicorp/hcl/hcl/scanner", - "revision": "23c074d0eceb2b8a5bfdbb271ab780cde70f05a8", - "revisionTime": "2017-10-17T18:19:29Z" - }, - { - "checksumSHA1": "Vb22K5JK1GTX5xLJyrLrROoA7FQ=", - "path": "github.com/hashicorp/hcl/hcl/strconv", - "revision": "23c074d0eceb2b8a5bfdbb271ab780cde70f05a8", - "revisionTime": "2017-10-17T18:19:29Z" - }, - { - "checksumSHA1": "dljEjBgEewtuvGQ64XBvHB3iUkg=", - "path": "github.com/hashicorp/hcl/hcl/token", - "revision": "23c074d0eceb2b8a5bfdbb271ab780cde70f05a8", - "revisionTime": "2017-10-17T18:19:29Z" - }, - { - "checksumSHA1": "+Y/a0ePZ1i7E0NpQvtm1rc6RQT0=", - "path": "github.com/hashicorp/hcl/json/parser", - "revision": "23c074d0eceb2b8a5bfdbb271ab780cde70f05a8", - "revisionTime": "2017-10-17T18:19:29Z" - }, - { - "checksumSHA1": "kw2I3QA57jE9QR6FyqlCUk0bdkY=", - "path": "github.com/hashicorp/hcl/json/scanner", - "revision": "23c074d0eceb2b8a5bfdbb271ab780cde70f05a8", - "revisionTime": "2017-10-17T18:19:29Z" - }, - { - "checksumSHA1": "knLekryOag5SGOV4jX8nwudBCDo=", - "path": "github.com/hashicorp/hcl/json/token", - "revision": "23c074d0eceb2b8a5bfdbb271ab780cde70f05a8", - "revisionTime": "2017-10-17T18:19:29Z" - }, - { - "checksumSHA1": "Qrz7cOPSDxSCSOsqMRTMAThXxwQ=", - "path": "github.com/hashicorp/nomad/acl", - "revision": "499cad6a76ecbf5860f4d3f69d730d35d60bd47b", - "revisionTime": "2018-08-20T23:21:13Z" - }, - { - "checksumSHA1": "dmtWghQ1Vsi/Eu2x3e1mF6p5pQA=", - "path": "github.com/hashicorp/nomad/api", - "revision": "499cad6a76ecbf5860f4d3f69d730d35d60bd47b", - "revisionTime": "2018-08-20T23:21:13Z" - }, - { - "checksumSHA1": "6WKFd2EIeFAPc8u6oXSBHmCoOdc=", - "path": "github.com/hashicorp/nomad/api/contexts", - "revision": "499cad6a76ecbf5860f4d3f69d730d35d60bd47b", - "revisionTime": "2018-08-20T23:21:13Z" - }, - { - "checksumSHA1": "9XjFYzxuINU48//TjgSiv0NnrHY=", - "path": "github.com/hashicorp/nomad/helper", - "revision": "499cad6a76ecbf5860f4d3f69d730d35d60bd47b", - "revisionTime": "2018-08-20T23:21:13Z" - }, - { - "checksumSHA1": "/abSFQm1CgU95LBKztd9PaZ4zS0=", - "path": "github.com/hashicorp/nomad/helper/args", - "revision": "499cad6a76ecbf5860f4d3f69d730d35d60bd47b", - "revisionTime": "2018-08-20T23:21:13Z" - }, - { - "checksumSHA1": "6iI12V74fnwcDj5qi5pax+h34b0=", - "path": "github.com/hashicorp/nomad/helper/flatmap", - "revision": "499cad6a76ecbf5860f4d3f69d730d35d60bd47b", - "revisionTime": "2018-08-20T23:21:13Z" - }, - { - "checksumSHA1": "UQF8iQ6GxD14xIdmuUfPZUuM4QE=", - "path": "github.com/hashicorp/nomad/helper/uuid", - "revision": "499cad6a76ecbf5860f4d3f69d730d35d60bd47b", - "revisionTime": "2018-08-20T23:21:13Z" - }, - { - "checksumSHA1": "qxFjJMDHlvVxyMQGvU2p1nOMtXs=", - "path": "github.com/hashicorp/nomad/nomad/structs", - "revision": "499cad6a76ecbf5860f4d3f69d730d35d60bd47b", - "revisionTime": "2018-08-20T23:21:13Z" - }, - { - "checksumSHA1": "mz0v+h518B+gJLa9fRXQxCcipS4=", - "path": "github.com/hashicorp/raft", - "revision": "a3fb4581fb07b16ecf1c3361580d4bdb17de9d98", - "revisionTime": "2018-02-12T22:15:04Z" - }, - { - "checksumSHA1": "VekPhuqRHPZvUETrS5XFzPLQjJs=", - "path": "github.com/hashicorp/serf/coordinate", - "revision": "3b250ce4404edb266330f53fcfc8ad0d0dacfae7", - "revisionTime": "2018-02-27T18:58:07Z" - }, - { - "checksumSHA1": "0KEW8rTy68uL5wqgzVYyh0NcAb8=", - "path": "github.com/mitchellh/copystructure", - "revision": "d23ffcb85de31694d6ccaa23ccb4a03e55c1303f", - "revisionTime": "2017-05-25T01:39:02Z" - }, - { - "checksumSHA1": "Gr3d0m9SkMFfiBgpVn/Wh12PBFI=", - "path": "github.com/mitchellh/go-homedir", - "revision": "b8bc1bf767474819792c23f32d8286a45736f1c6", - "revisionTime": "2016-12-03T19:45:07Z" - }, - { - "checksumSHA1": "PmrVkTlwHzFghS8HHmXhz1glCHQ=", - "path": "github.com/mitchellh/hashstructure", - "revision": "2bca23e0e452137f789efbc8610126fd8b94f73b", - "revisionTime": "2017-06-09T04:59:27Z" - }, - { - "checksumSHA1": "Ugrf39oCjAQJq1SFf1Ee3lq+SIg=", - "path": "github.com/mitchellh/reflectwalk", - "revision": "63d60e9d0dbc60cf9164e6510889b0db6683d98c", - "revisionTime": "2017-07-26T20:21:17Z" - }, - { - "checksumSHA1": "XlHkzwFZkQjftIeIDN9Kz3HbqIw=", - "path": "github.com/ugorji/go/codec", - "revision": "02537d3a3e32ef636a53519265d211bd208ca488", - "revisionTime": "2018-03-07T15:23:41Z" - }, - { - "checksumSHA1": "ppPg0bIlBAVJy0Pn13BfBnkp9V4=", - "path": "golang.org/x/crypto/blake2b", - "revision": "21652f85b0fdddb6c2b6b77a5beca5c5a908174a", - "revisionTime": "2018-03-14T17:20:41Z" - }, - { - "checksumSHA1": "2FnVZ1894IO0AC4WA2UCvzlGOTQ=", - "path": "gopkg.in/natefinch/lumberjack.v2", - "revision": "a96e63847dc3c67d17befa69c303767e2f84e54f", - "revisionTime": "2017-05-31T16:03:50Z" - } - ], - "rootPath": "github.com/adragoset/nomad_follower" -} From e5484f8234fbf9605c8bc2305d52888cdb2edec9 Mon Sep 17 00:00:00 2001 From: Alexander Korelskiy Date: Tue, 17 Nov 2020 17:23:20 +0300 Subject: [PATCH 2/3] Add logging by service tag, improve documentation --- README.md | 25 ++++++++++++------------- allocationFollower.go | 26 ++++++++++++++------------ example_logging.nomad | 31 +++++++++++++++++++++++++++++++ followedAllocation.go | 39 +++++++++++++++++++++++++-------------- service.go | 9 ++++++++- 5 files changed, 90 insertions(+), 40 deletions(-) create mode 100644 example_logging.nomad diff --git a/README.md b/README.md index dd6fe57..b774987 100644 --- a/README.md +++ b/README.md @@ -2,18 +2,17 @@ Log forwarder for aggregating allocation logs from nomad worker agents. ## Running the application -Run the application on each worker in a nomad cluster. nomad_follower will follow all allocations on the worker and tail the allocation logs to the aggregate log file. - -```docker pull sas1024/nomad_follower:latest``` - -```docker run -v log_folder:/log -e LOG_FILE="/logs/nomad-forwarder.log" sas1024/nomad_follower:latest``` - -nomad_follower will stop following completed allocations and will start following new allocations as they become available. - -nomad_follower can be deployed with nomad in a system task group along with a log collector. The aggregate log file can then be shared with the log collector by writing the aggregate log file into the shared allocation folder. - -nomad_follower formats log entries as json formatted logs. It will convert string formatted logs to json formatted logs by passing the log entry in the ```message``` key. - -nomad_follower adds a ```service_name``` key that contains the listed service names for a task. +Run the application on each worker in a nomad cluster. +``` +docker pull sas1024/nomad_follower:latest +docker run -v log_folder:/log -e LOG_TAG="logging" "-e LOG_FILE="/log/nomad-forwarder.log" sas1024/nomad_follower:latest +``` + +nomad_follower: + - will follow all allocations if it contains service tag ```nomad_follower``` (can be changed with `LOG_TAG` environment variable) on the worker and tail the allocation logs to the aggregate log file. + - will stop following completed allocations and will start following new allocations as they become available. + - can be deployed with nomad in a system task group along with a log collector. The aggregate log file can then be shared with the log collector by writing the aggregate log file into the shared allocation folder. + - formats log entries as json formatted logs. It will convert string formatted logs to json formatted logs by passing the log entry in the ```message``` key. + - adds a ```service_name``` key that contains the listed service names for a task. Using nomad_follower prevents the cluster operator from having to run a log collector in every task group for every task on a worker while still allowing nomad to handle the logs for each allocation. diff --git a/allocationFollower.go b/allocationFollower.go index 17b8fe6..3ba2f24 100644 --- a/allocationFollower.go +++ b/allocationFollower.go @@ -13,18 +13,18 @@ import ( var SaveFormatVersion = 1 type SavePoint struct { - NodeID string `json:"node_id"` - SaveFormatVersion int `json:"save_format_version"` - SavedAllocs map[string]SavedAlloc `json:"saved_allocs"` + NodeID string `json:"node_id"` + SaveFormatVersion int `json:"save_format_version"` + SavedAllocs map[string]SavedAlloc `json:"saved_allocs"` } type SavedAlloc struct { - ID string `json:"alloc_id"` + ID string `json:"alloc_id"` SavedTasks map[string]SavedTask `json:"saved_tasks"` } type SavedTask struct { - Key string `json:"key"` + Key string `json:"key"` StdOutOffsets map[string]int64 `json:"stdout_offsets"` StdErrOffsets map[string]int64 `json:"stderr_offsets"` } @@ -38,16 +38,18 @@ type AllocationFollower struct { Quit chan bool Ticker *time.Ticker log Logger + logTag string } //NewAllocationFollower Creates a new allocation follower -func NewAllocationFollower(nomad NomadConfig, logger Logger) (a *AllocationFollower, e error) { +func NewAllocationFollower(nomad NomadConfig, logger Logger, logTag string) (a *AllocationFollower, e error) { return &AllocationFollower{ Allocations: make(map[string]*FollowedAllocation), - Nomad: nomad, - NodeID: "", - Quit: make(chan bool), - log: logger, + Nomad: nomad, + NodeID: "", + Quit: make(chan bool), + log: logger, + logTag: logTag, }, nil } @@ -73,7 +75,7 @@ func (a *AllocationFollower) SetNodeID() error { } //Start registers and de registers allocation followers -func (a *AllocationFollower) Start(duration time.Duration, savePath string) (<-chan string) { +func (a *AllocationFollower) Start(duration time.Duration, savePath string) <-chan string { logContext := "AllocationFollower.Start" a.Ticker = time.NewTicker(duration) a.OutChan = make(chan string) @@ -238,7 +240,7 @@ func (a *AllocationFollower) collectAllocations(save *SavePoint) error { runState := alloc.DesiredStatus == "run" || alloc.ClientStatus == "running" if record == nil && runState { // handle new alloc records w/ potentially saved state - falloc := NewFollowedAllocation(alloc, a.Nomad, a.OutChan, a.log) + falloc := NewFollowedAllocation(alloc, a.Nomad, a.OutChan, a.log, a.logTag) if save != nil { a.log.Debug("AllocationFollower.collectAllocations", "Restoring saved allocations") savedAlloc := save.SavedAllocs[alloc.ID] diff --git a/example_logging.nomad b/example_logging.nomad new file mode 100644 index 0000000..8205de8 --- /dev/null +++ b/example_logging.nomad @@ -0,0 +1,31 @@ +job "random-logger-example" { + datacenters = ["dc1"] + type = "service" + + group "random" { + count = 1 + + task "random" { + driver = "docker" + config { + image = "chentex/random-logger" + port_map { + http = 8088 + } + } + resources { + network { + port "http" {} + } + } + service { + tags = [ + "nomad_follower", + "test" + ] + name = "random" + port = "http" + } + } + } +} diff --git a/followedAllocation.go b/followedAllocation.go index 8957707..01889c1 100644 --- a/followedAllocation.go +++ b/followedAllocation.go @@ -2,6 +2,7 @@ package main import ( "fmt" + nomadApi "github.com/hashicorp/nomad/api" ) @@ -13,17 +14,19 @@ type FollowedAllocation struct { Quit chan struct{} Tasks []*FollowedTask log Logger + logTag string } //NewFollowedAllocation creates a new followed allocation -func NewFollowedAllocation(alloc *nomadApi.Allocation, nomad NomadConfig, outChan chan string, logger Logger) *FollowedAllocation { +func NewFollowedAllocation(alloc *nomadApi.Allocation, nomad NomadConfig, outChan chan string, logger Logger, logTag string) *FollowedAllocation { return &FollowedAllocation{ - Alloc: alloc, - Nomad: nomad, + Alloc: alloc, + Nomad: nomad, OutputChan: outChan, - Quit: make(chan struct{}), - Tasks: make([]*FollowedTask, 0), - log: logger, + Quit: make(chan struct{}), + Tasks: make([]*FollowedTask, 0), + log: logger, + logTag: logTag, } } @@ -38,15 +41,23 @@ func (f *FollowedAllocation) Start(save *SavedAlloc) { for _, tg := range f.Alloc.Job.TaskGroups { for _, task := range tg.Tasks { ft := NewFollowedTask(f.Alloc, *tg.Name, task, f.Nomad, f.Quit, f.OutputChan, f.log) - if save != nil { - f.log.Debug("FollowedAllocation.Start", "Restoring saved allocation data") - key := fmt.Sprintf("%s:%s", *tg.Name, task.Name) - savedTask := save.SavedTasks[key] - ft.Start(&savedTask) - } else { - ft.Start(nil) + skip := true + for _, s := range ft.logTemplate.ServiceTags { + if s == f.logTag { + skip = false + } + } + if !skip { + if save != nil { + f.log.Debug("FollowedAllocation.Start", "Restoring saved allocation data") + key := fmt.Sprintf("%s:%s", *tg.Name, task.Name) + savedTask := save.SavedTasks[key] + ft.Start(&savedTask) + } else { + ft.Start(nil) + } + f.Tasks = append(f.Tasks, ft) } - f.Tasks = append(f.Tasks, ft) } } } diff --git a/service.go b/service.go index 92ae801..739f14e 100644 --- a/service.go +++ b/service.go @@ -15,6 +15,8 @@ var DEFAULT_CIRCUIT_BREAK = 60 * time.Second var DEFAULT_LOG_FILE = "nomad.log" var DEFAULT_SAVE_FILE = "nomad-follower.json" +var DEFAULT_LOG_TAG = "nomad_follower" + var MAX_LOG_SIZE = 50 var MAX_LOG_BACKUPS = 1 var MAX_LOG_AGE = 1 @@ -45,6 +47,11 @@ func main() { saveFile = DEFAULT_SAVE_FILE } + logTag := os.Getenv("LOG_TAG") + if logTag == "" { + logTag = DEFAULT_LOG_TAG + } + createLogFile(logFile, logger) fileLogger := log.New(&lumberjack.Logger{ Filename: logFile, @@ -70,7 +77,7 @@ func main() { ) } - af, err := NewAllocationFollower(nomadConfig, logger) + af, err := NewAllocationFollower(nomadConfig, logger, logTag) if err != nil { logger.Errorf("main", "Error creating Allocation Follower: %s", err) return From 5fffd895f51d402038a3a7c6d5b8c7eac06245f7 Mon Sep 17 00:00:00 2001 From: Alexander Korelskiy Date: Thu, 19 Nov 2020 14:35:12 +0300 Subject: [PATCH 3/3] Add job meta and task meta logging --- followedTask.go | 52 ++++++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/followedTask.go b/followedTask.go index 3b03cc3..7ce03c0 100644 --- a/followedTask.go +++ b/followedTask.go @@ -30,17 +30,19 @@ var BACKOFF_DELAY = 8 // ouput is preserved under the 'message' field and JSON log output is nested // under the 'data' field. type NomadLog struct { - AllocId string `json:"alloc_id"` - JobName string `json:"job_name"` - NodeName string `json:"node_name"` - ServiceName string `json:"service_name"` - ServiceTags []string `json:"service_tags"` + AllocId string `json:"alloc_id"` + JobName string `json:"job_name"` + JobMeta map[string]string `json:"job_meta"` + NodeName string `json:"node_name"` + ServiceName string `json:"service_name"` + ServiceTags []string `json:"service_tags"` ServiceTagMap map[string]string `json:"service_tag_map"` - TaskName string `json:"task_name"` + TaskMeta map[string]string `json:"task_meta"` + TaskName string `json:"task_name"` // these all set at log time - Timestamp string `json:"timestamp"` - Message string `json:"message"` - Data map[string]interface{} `json:"data"` + Timestamp string `json:"timestamp"` + Message string `json:"message"` + Data map[string]interface{} `json:"data"` } func (n *NomadLog) ToJSON() (string, error) { @@ -69,26 +71,26 @@ type FollowedTask struct { func NewFollowedTask(alloc *nomadApi.Allocation, taskGroup string, task *nomadApi.Task, nomad NomadConfig, quit chan struct{}, output chan string, logger Logger) *FollowedTask { logTemplate := createLogTemplate(alloc, task) return &FollowedTask{ - Alloc: alloc, - TaskGroup: taskGroup, - Task: task, - Nomad: nomad, - Quit: quit, - OutputChan: output, - log: logger, + Alloc: alloc, + TaskGroup: taskGroup, + Task: task, + Nomad: nomad, + Quit: quit, + OutputChan: output, + log: logger, logTemplate: logTemplate, } } type StreamState struct { - MultiLineBuf []string + MultiLineBuf []string LastTimestamp string - ConsecErrors uint - FileOffsets map[string]int64 + ConsecErrors uint + FileOffsets map[string]int64 // internal use only initialBufferCap int - quit chan struct{} - allocFS *nomadApi.AllocFS + quit chan struct{} + allocFS *nomadApi.AllocFS } func (s *StreamState) BufAdd(msg string) { @@ -167,7 +169,7 @@ func (ft *FollowedTask) Start(save *SavedTask) { //config.WaitTime = 5 * time.Minute //client, err := nomadApi.NewClient(config) //if err != nil { - //ft.ErrorChan <- fmt.Sprintf("{ \"message\":\"%s\"}", err) + //ft.ErrorChan <- fmt.Sprintf("{ \"message\":\"%s\"}", err) //} //fs := client.AllocFS() @@ -256,7 +258,6 @@ func (ft *FollowedTask) Start(save *SavedTask) { ft.outState.ConsecErrors += 1 } - case errErr := <-stdErrErr: ft.log.Debugf( logContext, @@ -295,6 +296,7 @@ func createLogTemplate(alloc *nomadApi.Allocation, task *nomadApi.Task) NomadLog tmpl.AllocId = alloc.ID tmpl.JobName = *alloc.Job.Name + tmpl.JobMeta = alloc.Job.Meta tmpl.NodeName = alloc.NodeName tmpl.ServiceTags = make([]string, 0) tmpl.ServiceTagMap = make(map[string]string) @@ -304,6 +306,7 @@ func createLogTemplate(alloc *nomadApi.Allocation, task *nomadApi.Task) NomadLog tmpl.ServiceName = service.Name tmpl.ServiceTags = service.Tags tmpl.ServiceTagMap = getServiceTagMap(service) + tmpl.TaskMeta = task.Meta } else { for _, tg := range alloc.Job.TaskGroups { if len(tg.Services) == 0 { @@ -315,6 +318,7 @@ func createLogTemplate(alloc *nomadApi.Allocation, task *nomadApi.Task) NomadLog tmpl.ServiceName = service.Name tmpl.ServiceTags = service.Tags tmpl.ServiceTagMap = getServiceTagMap(service) + tmpl.TaskMeta = t.Meta } } } @@ -324,7 +328,7 @@ func createLogTemplate(alloc *nomadApi.Allocation, task *nomadApi.Task) NomadLog return tmpl } -func getServiceTagMap(service nomadApi.Service) (map[string]string) { +func getServiceTagMap(service nomadApi.Service) map[string]string { var serviceTagMap = make(map[string]string) for _, t := range service.Tags {