diff --git a/Makefile b/Makefile index 85b9d6522..331d352e3 100644 --- a/Makefile +++ b/Makefile @@ -50,6 +50,7 @@ go-mod-cache: go.sum go.sum: go.mod @echo "--> Ensure dependencies have not been modified" @go mod verify + @go mod tidy clean: rm -rf snapcraft-local.yaml build/ @@ -125,8 +126,9 @@ test_sim_benchmark_invariants: # Don't move it into tools - this will be gone once gaia has moved into the new repo runsim: $(BINDIR)/runsim -$(BINDIR)/runsim: contrib/runsim/main.go contrib/runsim/notification.go - go install github.com/cosmos/cosmos-sdk/contrib/runsim +$(BINDIR)/runsim: + go get github.com/cosmos/tools/cmd/runsim/ + go mod tidy SIM_NUM_BLOCKS ?= 500 SIM_BLOCK_SIZE ?= 200 diff --git a/contrib/devtools/Makefile b/contrib/devtools/Makefile index e4487c402..f414f943b 100644 --- a/contrib/devtools/Makefile +++ b/contrib/devtools/Makefile @@ -52,7 +52,9 @@ CLOG = $(TOOLS_DESTDIR)/clog all: tools tools: tools-stamp -tools-stamp: $(STATIK) $(GOIMPORTS) $(CLOG) + go mod tidy + +tools-stamp: $(STATIK) $(GOIMPORTS) touch $@ $(GOLANGCI_LINT): $(mkfile_dir)/install-golangci-lint.sh @@ -65,7 +67,7 @@ $(GOIMPORTS): go get golang.org/x/tools/cmd/goimports@v0.0.0-20190628034336-212fb13d595e $(CLOG): - $(call go_install,alessio,clog,1) + go get github.com/cosmos/tools/cmd/clog/ golangci-lint: $(GOLANGCI_LINT) diff --git a/contrib/runsim/main.go b/contrib/runsim/main.go deleted file mode 100644 index cb7c94c19..000000000 --- a/contrib/runsim/main.go +++ /dev/null @@ -1,356 +0,0 @@ -package main - -import ( - "bufio" - "flag" - "fmt" - "io" - "io/ioutil" - "log" - "os" - "os/exec" - "os/signal" - "path/filepath" - "runtime" - "strconv" - "strings" - "sync" - "syscall" - "time" -) - -const ( - GithubConfigSep = "," - SlackConfigSep = "," -) - -var ( - // default seeds - seeds = []int{ - 1, 2, 4, 7, 32, 123, 124, 582, 1893, 2989, - 3012, 4728, 37827, 981928, 87821, 891823782, - 989182, 89182391, 11, 22, 44, 77, 99, 2020, - 3232, 123123, 124124, 582582, 18931893, - 29892989, 30123012, 47284728, 7601778, 8090485, - 977367484, 491163361, 424254581, 673398983, - } - seedOverrideList = "" - - // goroutine-safe process map - procs map[int]*os.Process - mutex *sync.Mutex - - // results channel - results chan bool - - // command line arguments and options - jobs = runtime.GOMAXPROCS(0) - pkgName string - blocks string - period string - testname string - genesis string - exitOnFail bool - githubConfig string - logObjKey string - slackConfig string - - // integration with Slack and Github - slackToken string - slackChannel string - slackThread string - - // logs temporary directory - tempdir string -) - -func init() { - log.SetPrefix("") - log.SetFlags(0) - - runsimLogfile, err := os.OpenFile("sim_log_file", os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666) - if err != nil { - log.Printf("ERROR: opening log file: %v", err.Error()) - } else { - log.SetOutput(io.MultiWriter(os.Stdout, runsimLogfile)) - } - - procs = map[int]*os.Process{} - mutex = &sync.Mutex{} - - flag.IntVar(&jobs, "j", jobs, "Number of parallel processes") - flag.StringVar(&genesis, "g", "", "Genesis file") - flag.StringVar(&seedOverrideList, "seeds", "", "run the supplied comma-separated list of seeds instead of defaults") - flag.BoolVar(&exitOnFail, "e", false, "Exit on fail during multi-sim, print error") - flag.StringVar(&logObjKey, "log", "", "S3 object key for log files") - flag.StringVar(&githubConfig, "github", "", "Report results to Github's PR") - flag.StringVar(&slackConfig, "slack", "", "Report results to slack channel") - - flag.Usage = func() { - _, _ = fmt.Fprintf(flag.CommandLine.Output(), - `Usage: %s [-j maxprocs] [-seeds comma-separated-seed-list] [-rev git-commmit-hash] [-g genesis.json] [-e] [-github token,pr-url] [-slack token,channel,thread] [package] [blocks] [period] [testname] -Run simulations in parallel`, filepath.Base(os.Args[0])) - flag.PrintDefaults() - } -} - -func main() { - var err error - - flag.Parse() - if flag.NArg() != 4 { - log.Fatal("wrong number of arguments") - } - - if githubConfig != "" { - opts := strings.Split(githubConfig, GithubConfigSep) - if len(opts) != 2 { - log.Fatal("incorrect github config string format") - } - } - - if slackConfig != "" { - opts := strings.Split(slackConfig, SlackConfigSep) - if len(opts) != 3 { - log.Fatal("incorrect slack config string format") - } - slackToken, slackChannel, slackThread = opts[0], opts[1], opts[2] - } - - seedOverrideList = strings.TrimSpace(seedOverrideList) - if seedOverrideList != "" { - seeds, err = makeSeedList(seedOverrideList) - if err != nil { - log.Fatal(err) - } - } - - queue := make(chan int, len(seeds)) - for _, seed := range seeds { - queue <- seed - } - close(queue) - - // jobs cannot be > len(seeds) - if jobs > len(seeds) { - jobs = len(seeds) - } - results = make(chan bool, len(seeds)) - - // setup signal handling - sigs := make(chan os.Signal, 1) - signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) - - go func() { - _ = <-sigs - fmt.Println() - - // drain the queue - log.Printf("Draining seeds queue...") - for seed := range queue { - log.Printf("%d", seed) - } - log.Printf("Kill all remaining processes...") - killAllProcs() - os.Exit(1) - }() - - // initialise common test parameters - pkgName = flag.Arg(0) - blocks = flag.Arg(1) - period = flag.Arg(2) - testname = flag.Arg(3) - tempdir, err = ioutil.TempDir("", "") - if err != nil { - log.Fatal(err) - } - - // set up worker pool - log.Printf("Allocating %d workers...", jobs) - wg := sync.WaitGroup{} - for workerID := 0; workerID < jobs; workerID++ { - wg.Add(1) - - go func(workerID int) { - defer wg.Done() - worker(workerID, queue) - }(workerID) - } - - // idiomatic hack required to use wg.Wait() with select - waitCh := make(chan struct{}) - go func() { - defer close(waitCh) - wg.Wait() - }() - -wait: - for { - select { - case <-waitCh: - break wait - case <-time.After(1 * time.Minute): - fmt.Println(".") - } - } - - // analyse results and exit with 1 on first error - close(results) - for rc := range results { - if !rc { - os.Exit(1) - } - } - if slackConfigSupplied() { - seedStrings := make([]string, len(seeds)) - for i, seed := range seeds { - seedStrings[i] = fmt.Sprintf("%d", seed) - } - slackMessage(slackToken, slackChannel, &slackThread, fmt.Sprintf("Finished running simulation for seeds: %s", strings.Join(seedStrings, " "))) - } - os.Exit(0) -} - -func buildCommand(testName, blocks, period, genesis string, seed int) string { - return fmt.Sprintf("go test %s -run %s -SimulationEnabled=true "+ - "-SimulationNumBlocks=%s -SimulationGenesis=%s "+ - "-SimulationVerbose=true -SimulationCommit=true -SimulationSeed=%d -SimulationPeriod=%s -v -timeout 24h", - pkgName, testName, blocks, genesis, seed, period) -} - -func makeCmd(cmdStr string) *exec.Cmd { - cmdSlice := strings.Split(cmdStr, " ") - return exec.Command(cmdSlice[0], cmdSlice[1:]...) -} - -func makeFilename(seed int) string { - return fmt.Sprintf("app-simulation-seed-%d-date-%s", seed, time.Now().Format("01-02-2006_150405")) -} - -func makeFailSlackMsg(seed int, stdoutKey, stderrKey, bucket string, logsPushed bool) string { - if logsPushed { - return fmt.Sprintf("*Seed %s: FAILED*. ** **\nTo reproduce run: ```\n%s\n```", - strconv.Itoa(seed), bucket, stdoutKey, bucket, stderrKey, buildCommand(testname, blocks, period, genesis, seed)) - } - return fmt.Sprintf("*Seed %s: FAILED*. \nTo reproduce run: ```\n%s\n```\n*Could not upload logs:* ```\n%s\n```", - strconv.Itoa(seed), buildCommand(testname, blocks, period, genesis, seed), bucket) -} - -func worker(id int, seeds <-chan int) { - log.Printf("[W%d] Worker is up and running", id) - for seed := range seeds { - stdOut, stdErr, err := spawnProc(id, seed) - if err != nil { - results <- false - log.Printf("[W%d] Seed %d: FAILED", id, seed) - log.Printf("To reproduce run: %s", buildCommand(testname, blocks, period, genesis, seed)) - if slackConfigSupplied() { - objKeys, bucket, err := pushLogs(stdOut, stdErr, logObjKey) - if err != nil { - slackMessage(slackToken, slackChannel, nil, makeFailSlackMsg(seed, "", "", err.Error(), false)) - } - slackMessage(slackToken, slackChannel, nil, makeFailSlackMsg(seed, objKeys[0], objKeys[1], *bucket, true)) - } - if exitOnFail { - log.Printf("\bERROR OUTPUT \n\n%s", err) - panic("halting simulations") - } - } - log.Printf("[W%d] Seed %d: OK", id, seed) - if slackConfigSupplied() { - _, _, err = pushLogs(stdOut, stdErr, logObjKey) - if err != nil { - log.Printf("%v", err) - } - } - } - log.Printf("[W%d] no seeds left, shutting down", id) -} - -func spawnProc(workerID int, seed int) (*os.File, *os.File, error) { - stderrFile, _ := os.Create(filepath.Join(tempdir, makeFilename(seed)+".stderr")) - stdoutFile, _ := os.Create(filepath.Join(tempdir, makeFilename(seed)+".stdout")) - s := buildCommand(testname, blocks, period, genesis, seed) - cmd := makeCmd(s) - cmd.Stdout = stdoutFile - - var err error - var stderr io.ReadCloser - if !exitOnFail { - cmd.Stderr = stderrFile - } else { - stderr, err = cmd.StderrPipe() - if err != nil { - return nil, nil, err - } - } - sc := bufio.NewScanner(stderr) - - err = cmd.Start() - if err != nil { - log.Printf("couldn't start %q", s) - return nil, nil, err - } - log.Printf("[W%d] Spawned simulation with pid %d [seed=%d stdout=%s stderr=%s]", - workerID, cmd.Process.Pid, seed, stdoutFile.Name(), stderrFile.Name()) - pushProcess(cmd.Process) - defer popProcess(cmd.Process) - - err = cmd.Wait() - if err != nil { - fmt.Printf("%s\n", err) - } - if exitOnFail { - for sc.Scan() { - fmt.Printf("stderr: %s\n", sc.Text()) - } - } - return stdoutFile, stderrFile, err -} - -func pushProcess(proc *os.Process) { - mutex.Lock() - defer mutex.Unlock() - procs[proc.Pid] = proc -} - -func popProcess(proc *os.Process) { - mutex.Lock() - defer mutex.Unlock() - if _, ok := procs[proc.Pid]; ok { - delete(procs, proc.Pid) - } -} - -func killAllProcs() { - mutex.Lock() - defer mutex.Unlock() - for _, proc := range procs { - checkSignal(proc, syscall.SIGTERM) - checkSignal(proc, syscall.SIGKILL) - } -} - -func checkSignal(proc *os.Process, signal syscall.Signal) { - if err := proc.Signal(signal); err != nil { - log.Printf("Failed to send %s to PID %d", signal, proc.Pid) - } -} - -func makeSeedList(seeds string) ([]int, error) { - strSeedsLst := strings.Split(seeds, ",") - if len(strSeedsLst) == 0 { - return nil, fmt.Errorf("seeds was empty") - } - intSeeds := make([]int, len(strSeedsLst)) - for i, seedstr := range strSeedsLst { - intSeed, err := strconv.Atoi(strings.TrimSpace(seedstr)) - if err != nil { - return nil, fmt.Errorf("cannot convert seed to integer: %v", err) - } - intSeeds[i] = intSeed - } - return intSeeds, nil -} - -func slackConfigSupplied() bool { return slackConfig != "" } diff --git a/contrib/runsim/notification.go b/contrib/runsim/notification.go deleted file mode 100644 index 09bb1e528..000000000 --- a/contrib/runsim/notification.go +++ /dev/null @@ -1,244 +0,0 @@ -package main - -import ( - "fmt" - "log" - "os" - "path/filepath" - "strings" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/s3" - "github.com/nlopes/slack" -) - -const ( - logBucketPrefix = "sim-logs-" - awsRegion = "us-east-1" -) - -func awsErrHandler(err error) error { - if awsErr, ok := err.(awserr.Error); ok { - switch awsErr.Code() { - default: - return awsErr - } - } - return err -} - -func makeObjKey(objKeyPrefix string, fileName string) string { - return fmt.Sprintf("%s/%s", objKeyPrefix, fileName) -} - -// putObjects attempts to upload to an S3 bucket the content of each file from fileHandles. -// File descriptors have their read offset set to 0 to ensure all the content is uploaded. -// Each file will become an S3 bucket object that can be accessed via its object key. -// -// Function returns the list of object keys and an error, if any. -func putObjects(svc *s3.S3, objKeyPrefix string, bucketName string, fileHandles ...*os.File) ([]string, error) { - objKeys := make([]string, len(fileHandles)) - for index, fileHandle := range fileHandles { - _, _ = fileHandle.Seek(0, 0) - objKey := makeObjKey(objKeyPrefix, filepath.Base(fileHandle.Name())) - stdOutObjInput := &s3.PutObjectInput{ - Body: aws.ReadSeekCloser(fileHandle), - Bucket: aws.String(bucketName), - Key: aws.String(objKey), - } - _, err := svc.PutObject(stdOutObjInput) - if err != nil { - return nil, awsErrHandler(err) - } - objKeys[index] = objKey - } - return objKeys, nil -} - -func pushLogs(stdOut *os.File, stdErr *os.File, folderName string) ([]string, *string, error) { - var logBucket *string - - sessionS3 := s3.New(session.Must(session.NewSession(&aws.Config{ - Region: aws.String(awsRegion), - }))) - listBucketsOutput, err := sessionS3.ListBuckets(&s3.ListBucketsInput{}) - if err != nil { - return nil, nil, awsErrHandler(err) - } - for _, bucket := range listBucketsOutput.Buckets { - if strings.Contains(*bucket.Name, logBucketPrefix) { - logBucket = bucket.Name - objKeys, err := putObjects(sessionS3, folderName, *logBucket, stdOut, stdErr) - if err != nil { - return nil, nil, err - } - return objKeys, bucket.Name, nil - } - } - return nil, nil, nil -} - -func slackMessage(token string, channel string, threadTS *string, message string) { - client := slack.New(token) - if threadTS != nil { - _, _, err := client.PostMessage(channel, slack.MsgOptionText(message, false), slack.MsgOptionTS(*threadTS)) - if err != nil { - log.Printf("ERROR: %v", err) - } - } else { - _, _, err := client.PostMessage(channel, slack.MsgOptionText(message, false)) - if err != nil { - log.Printf("ERROR: %v", err) - } - } -} - -//type GithubPayload struct { -// Issue struct { -// Number int `json:"number"` -// Pull struct { -// Url string `json:"url,omitempty"` -// } `json:"pull_request,omitempty"` -// } `json:"issue"` -// -// Comment struct { -// Body string `json:"body"` -// } `json:"comment"` -// -// Repository struct { -// Name string `json:"name"` -// Owner struct { -// Login string `json:"login"` -// } `json:"owner"` -// } `json:"repository"` -//} -// -//type PullRequestDetails struct { -// Head struct { -// Ref string `json:"ref"` -// Sha string `json:"sha"` -// } `json:"head"` -//} - -//func createCheckRun(client *github.Client, payload GithubPayload, pr PullRequestDetails) error { -// var opt github.CreateCheckRunOptions -// opt.Name = "Test Check" -// opt.HeadBranch = pr.Head.Ref -// opt.HeadSHA = pr.Head.Sha -// -// checkRUn, resp, err := client.Checks.CreateCheckRun(context.Background(), payload.Repository.Owner.Login, payload.Repository.Name, opt) -// log.Printf("%v", resp) -// log.Printf("%v", checkRUn) -// if err != nil { -// log.Printf("ERROR: CreateCheckRun: %v", err.Error()) -// return err -// } -// return err -//} -// -//func getPrDetails(prUrl string) (*PullRequestDetails, error) { -// request, err := http.Get(prUrl) -// if err != nil { -// return nil, err -// } -// -// var details PullRequestDetails -// if err := json.NewDecoder(request.Body).Decode(&details); err != nil { -// return nil, err -// } -// -// return &details, nil -//} -// -//func updateCheckRun(client *github.Client, payload GithubPayload, pr PullRequestDetails) error { -// status := "completed" -// conclusion := "success" -// var opt github.UpdateCheckRunOptions -// opt.Name = "Test Check" -// opt.Status = &status -// opt.Conclusion = &conclusion -// ts := github.Timestamp{Time: time.Now()} -// opt.CompletedAt = &ts -// -// updatedCheck, resp, err := client.Checks.UpdateCheckRun(context.Background(), payload.Repository.Owner.Login, payload.Repository.Name, 136693316, opt) -// log.Printf("%v", updatedCheck) -// log.Printf("%v", resp) -// if err != nil { -// log.Printf("ERROR: UpdateCheckRun: %v", err.Error()) -// return err -// } -// return nil -//} - -//func githubCheckHandler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { -// response := events.APIGatewayProxyResponse{StatusCode: 200} -// var comment GithubPayload -// if err := json.NewDecoder(bytes.NewBufferString(request.Body)).Decode(&comment); err != nil { -// response.StatusCode = 500 -// response.Body = err.Error() -// return response, err -// } -// -// itr, err := ghinstallation.NewKeyFromFile(http.DefaultTransport, 30867, 997580, "github-integration/gaia-sim.2019-05-16.private-key.pem") -// if err != nil { -// response.StatusCode = 500 -// response.Body = err.Error() -// log.Printf("AuthError: %v", err) -// return response, err -// } -// client := github.NewClient(&http.Client{Transport: itr}) -// message := "App comment" -// issue := new(github.IssueComment) -// issue.Body = &message -// -// if comment.Comment.Body == "Start sim" && comment.Issue.Pull.Url != "" { -// prDetails, err := getPrDetails(comment.Issue.Pull.Url) -// if err != nil { -// response.StatusCode = 500 -// response.Body = err.Error() -// log.Printf("ERROR: getPrDetails: %v", err.Error()) -// return response, err -// } -// log.Printf("%v", prDetails) -// -// if err := createCheckRun(client, comment, *prDetails); err != nil { -// response.StatusCode = 500 -// response.Body = err.Error() -// return response, err -// } -// -// comments, resp, err := client.Issues.CreateComment(context.Background(), -// comment.Repository.Owner.Login, comment.Repository.Name, comment.Issue.Number, issue) -// -// log.Printf("%v", resp) -// log.Printf("%v", comments) -// if err != nil { -// log.Printf("ERROR: CreateComment: %v", err.Error()) -// response.StatusCode = 500 -// response.Body = err.Error() -// return response, err -// } -// } -// -// if comment.Comment.Body == "Update check" && comment.Issue.Pull.Url != "" { -// prDetails, err := getPrDetails(comment.Issue.Pull.Url) -// if err != nil { -// response.StatusCode = 500 -// response.Body = err.Error() -// log.Printf("ERROR: getPrDetails: %v", err.Error()) -// return response, err -// } -// log.Printf("%v", prDetails) -// -// if err := updateCheckRun(client, comment, *prDetails); err != nil { -// response.StatusCode = 500 -// response.Body = err.Error() -// log.Printf("ERROR: getPrDetails: %v", err.Error()) -// return response, err -// } -// } -// -// return response, nil -//} diff --git a/devtools-stamp b/devtools-stamp deleted file mode 100644 index e69de29bb..000000000 diff --git a/go.mod b/go.mod index 54d5f43d6..3b94e3cea 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,6 @@ module github.com/cosmos/cosmos-sdk require ( - github.com/aws/aws-sdk-go v1.20.11 github.com/bartekn/go-bip39 v0.0.0-20171116152956-a05967ea095d github.com/bgentry/speakeasy v0.1.0 github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d @@ -15,10 +14,7 @@ require ( github.com/golang/snappy v0.0.1 // indirect github.com/gorilla/mux v1.7.0 github.com/gorilla/websocket v1.4.0 // indirect - github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5 // indirect - github.com/lusis/slack-test v0.0.0-20190426140909-c40012f20018 // indirect github.com/mattn/go-isatty v0.0.6 - github.com/nlopes/slack v0.5.0 github.com/pelletier/go-toml v1.2.0 github.com/pkg/errors v0.8.1 github.com/prometheus/client_golang v0.9.2 // indirect diff --git a/go.sum b/go.sum index fe4a3153d..7dc66583a 100644 --- a/go.sum +++ b/go.sum @@ -7,8 +7,6 @@ github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBA github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aws/aws-sdk-go v1.20.11 h1:xDc2f/8KmwPW7WkuB0kDUCEP4jpx1PIMMMZkav6cbU4= -github.com/aws/aws-sdk-go v1.20.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/bartekn/go-bip39 v0.0.0-20171116152956-a05967ea095d h1:1aAija9gr0Hyv4KfQcRcwlmFIrhkDmIj2dz5bkg/s/8= github.com/bartekn/go-bip39 v0.0.0-20171116152956-a05967ea095d/go.mod h1:icNx/6QdFblhsEjZehARqbNumymUT/ydwlLojFdv7Sk= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= @@ -84,8 +82,6 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= @@ -96,10 +92,6 @@ github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5 h1:AsEBgzv3DhuYHI/GiQh2HxvTP71HCCE9E/tzGUzGdtU= -github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5/go.mod h1:c2mYKRyMb1BPkO5St0c/ps62L4S0W2NAkaTXj9qEI+0= -github.com/lusis/slack-test v0.0.0-20190426140909-c40012f20018 h1:MNApn+Z+fIT4NPZopPfCc1obT6aY3SVM6DOctz1A9ZU= -github.com/lusis/slack-test v0.0.0-20190426140909-c40012f20018/go.mod h1:sFlOUpQL1YcjhFVXhg1CG8ZASEs/Mf1oVb6H75JL/zg= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-isatty v0.0.6 h1:SrwhHcpV4nWrMGdNcC2kXpMfcBVYGDuTArqyhocJgvA= @@ -110,8 +102,6 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nlopes/slack v0.5.0 h1:NbIae8Kd0NpqaEI3iUrsuS0KbcEDhzhc939jLW5fNm0= -github.com/nlopes/slack v0.5.0/go.mod h1:jVI4BBK3lSktibKahxBF74txcK2vyvkza1z/+rRnVAM= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=