diff options
author | Valery Piashchynski <[email protected]> | 2020-10-13 13:55:20 +0300 |
---|---|---|
committer | Valery Piashchynski <[email protected]> | 2020-10-13 13:55:20 +0300 |
commit | 0dc44d54cfcc9dd3fa09a41136f35a9a8d26b994 (patch) | |
tree | ffcb65010bebe9f5b5436192979e64b2402a6ec0 /_old | |
parent | 08d6b6b7f773f83b286cd48c1a0fbec9a62fb42b (diff) |
Initial commit of RR 2.0v2.0.0-alpha1
Diffstat (limited to '_old')
-rw-r--r-- | _old/.dockerignore | 10 | ||||
-rw-r--r-- | _old/.gitignore | 8 | ||||
-rw-r--r-- | _old/.rr.yaml | 193 | ||||
-rw-r--r-- | _old/CHANGELOG.md | 356 | ||||
-rw-r--r-- | _old/LICENSE | 21 | ||||
-rw-r--r-- | _old/Makefile | 28 | ||||
-rw-r--r-- | _old/README.md | 118 | ||||
-rwxr-xr-x | _old/build.sh | 71 | ||||
-rw-r--r-- | _old/composer.json | 43 | ||||
-rw-r--r-- | _old/container.go | 371 | ||||
-rw-r--r-- | _old/container_test.go | 533 | ||||
-rw-r--r-- | _old/entry.go | 59 | ||||
-rw-r--r-- | _old/entry_test.go | 16 | ||||
-rw-r--r-- | _old/go.mod | 28 | ||||
-rw-r--r-- | _old/go.sum | 449 | ||||
-rw-r--r-- | _old/phpstan.neon.dist | 5 |
16 files changed, 1330 insertions, 979 deletions
diff --git a/_old/.dockerignore b/_old/.dockerignore new file mode 100644 index 00000000..b817b3c8 --- /dev/null +++ b/_old/.dockerignore @@ -0,0 +1,10 @@ +.dockerignore +.git +.gitignore +.editorconfig +.github +/src +/tests +/bin +composer.json +vendor_php diff --git a/_old/.gitignore b/_old/.gitignore new file mode 100644 index 00000000..e75a6fdb --- /dev/null +++ b/_old/.gitignore @@ -0,0 +1,8 @@ +../.idea +composer.lock +vendor +vendor_php +builds/ +tests/vendor/ +.rr-sample.yaml +psr-worker.php
\ No newline at end of file diff --git a/_old/.rr.yaml b/_old/.rr.yaml new file mode 100644 index 00000000..6ee6fedb --- /dev/null +++ b/_old/.rr.yaml @@ -0,0 +1,193 @@ +# defines environment variables for all underlying php processes +env: + key: value + +# rpc bus allows php application and external clients to talk to rr services. +rpc: + # enable rpc server + enable: true + + # rpc connection DSN. Supported TCP and Unix sockets. + listen: tcp://127.0.0.1:6001 + +metrics: + # prometheus client address (path /metrics added automatically) + address: localhost:2112 + + # list of metrics to collect from application + collect: + # metric name + app_metric: + # type [gauge, counter, histogram, summary] + type: histogram + + # short description + help: "Custom application metric" + + # metric groups/tags + labels: ["type"] + + # for histogram only + buckets: [0.1, 0.2, 0.3, 1.0] + +# http plugins configuration. +http: + # http host to listen. + address: 0.0.0.0:8080 + + ssl: + # custom https port (default 443) + port: 443 + + # force redirect to https connection + redirect: true + + # ssl cert + cert: server.crt + + # ssl private key + key: server.key + + # rootCA certificate + rootCa: root.crt + + # HTTP plugins provides FastCGI as frontend + fcgi: + # FastCGI connection DSN. Supported TCP and Unix sockets. + address: tcp://0.0.0.0:6920 + + # HTTP plugins provides HTTP2 transport + http2: + # enable HTTP/2, only with TSL + enabled: true + + # enable H2C on TCP connections + h2c: true + + # max transfer channels + maxConcurrentStreams: 128 + + # max POST request size, including file uploads in MB. + maxRequestSize: 200 + + # file upload configuration. + uploads: + # list of file extensions which are forbidden for uploading. + forbid: [".php", ".exe", ".bat"] + + # cidr blocks which can set ip using X-Real-Ip or X-Forwarded-For + trustedSubnets: ["10.0.0.0/8", "127.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "::1/128", "fc00::/7", "fe80::/10"] + + # http worker pool configuration. + workers: + # php worker command. + command: "php psr-worker.php pipes" + + # connection method (pipes, tcp://:9000, unix://socket.unix). default "pipes" + relay: "pipes" + + # user under which process will be started + user: "" + + # worker pool configuration. + pool: + # number of workers to be serving. + numWorkers: 4 + + # maximum jobs per worker, 0 - unlimited. + maxJobs: 0 + + # for how long worker is allowed to be bootstrapped. + allocateTimeout: 60 + + # amount of time given to worker to gracefully destruct itself. + destroyTimeout: 60 + +# Additional HTTP headers and CORS control. +headers: + # Middleware to handle CORS requests, https://www.w3.org/TR/cors/ + cors: + # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin + allowedOrigin: "*" + + # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers + allowedHeaders: "*" + + # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods + allowedMethods: "GET,POST,PUT,DELETE" + + # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials + allowCredentials: true + + # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers + exposedHeaders: "Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma" + + # Max allowed age in seconds + maxAge: 600 + + # Automatically add headers to every request passed to PHP. + request: + "Example-Request-Header": "Value" + + # Automatically add headers to every response. + response: + "X-Powered-By": "RoadRunner" + +# monitors rr server(s) +limit: + # check worker state each second + interval: 1 + + # custom watch configuration for each plugins + services: + # monitor http workers + http: + # maximum allowed memory consumption per worker (soft) + maxMemory: 100 + + # maximum time to live for the worker (soft) + TTL: 0 + + # maximum allowed amount of time worker can spend in idle before being removed (for weak db connections, soft) + idleTTL: 0 + + # max_execution_time (brutal) + execTTL: 60 + +# static file serving. remove this section to disable static file serving. +static: + # root directory for static file (http would not serve .php and .htaccess files). + dir: "public" + + # list of extensions for forbid for serving. + forbid: [".php", ".htaccess"] + + # Automatically add headers to every request. + request: + "Example-Request-Header": "Value" + + # Automatically add headers to every response. + response: + "X-Powered-By": "RoadRunner" + +# health plugins configuration +health: + # http host to serve health requests. + address: localhost:2113 + +# reload can reset rr servers when files change +reload: + # refresh internval (default 1s) + interval: 1s + + # file extensions to watch, defaults to [.php] + patterns: [".php"] + + # list of services to watch + services: + http: + # list of dirs, "" root + dirs: [""] + + # include sub directories + recursive: true
\ No newline at end of file diff --git a/_old/CHANGELOG.md b/_old/CHANGELOG.md new file mode 100644 index 00000000..4c58de9b --- /dev/null +++ b/_old/CHANGELOG.md @@ -0,0 +1,356 @@ +CHANGELOG +========= + +v1.8.3 (02.09.2020) +------------------- +- Fix superfluous response.WriteHeader issue. +- Proper handle of `broken pipe` error on Linux and Windows. +- PCI DSS compliant upgrade (thanks @antonydevanchi). +- Fix HSTS header (thanks @antonydevanchi). +- Add Request and Response headers to static files (thanks @siad007). +- Add user_namespaces check when running RR worker from a particular user. + +v1.8.2 (06.06.2020) +------------------- +- Bugfix release + +v1.8.1 (23.05.2020) +------------------- +- Update goridge version to 2.4.4 +- Fix code warnings from phpstan +- Improve RPC +- Create templates for the Bug reporting and Feature requests +- Move docker images from golang-alpine to regular golang images +- Add support for the CloudFlare CF-Connecting-IP and True-Client-IP headers (thanks @vsychov) +- Add support for the Root CA via the `rootCa` .rr.yaml option +- See the full milestone here: [link](https://github.com/spiral/roadrunner/milestone/11?closed=1) + +v1.8.0 (05.05.2020) +------------------- +- Update goridge version to 2.4.0 +- Update PHP version to the 7.2 (currently minimum supported) +- See the full milestone here: [link](https://github.com/spiral/roadrunner/milestone/10?closed=1) + +v1.7.1 (22.04.2020) +------------------- +- Syscall usage optimized. Now the data is packing and sending via 1 (or 2 in some cases) send_socket calls, instead of 2-3 (by @vvval) +- Unix sockets in Windows (AF_UNIX) now supported. +- Systemd unit file now in the root of the repository. Feel free to read the [docs](https://roadrunner.dev/docs/beep-beep-systemd) about running RR as daemon on Linux based systems. +- Added ability to run the worker process from the particular user on Linux-based systems. Make sure, that the user have the permissions to run the script. See the [config](https://roadrunner.dev/docs/intro-config), option `user`. +- Fixed: vendor directory conflict with golang part of the application. Now php uses vendor_php directory for the dependencies. +- Goridge updated to version 2.3.2. +- Deprecated Zend dependency replaced with Laminas-diactoros. +- See the full log: [Milestone](https://github.com/spiral/roadrunner/milestone/9?closed=1) + +v1.7.0 (23.03.2020) +------------------- +- Replaced std encoding/json package with the https://github.com/json-iterator/go + +v1.6.4 (14.03.2020) +------------------- +- Fixed bug with RR getting unreasonable without config +- Fixed bug with local paths in panic messages +- Fixed NPE bug with empty `http` config and enabled `gzip` plugin + +v1.6.3 (10.03.2020) +------------------- +- Fixed bug with UB when the plugin is failing during start +- Better signals handling +- Rotate ports in tests +- Added BORS to repository [https://bors.tech/], so, now you can use commands from it, like `bors d=@some_user`, `bors try`, or `bors r+` +- Reverted change with `musl-gcc`. We reverted `CGO_ENABLED=0`, so, CGO turned off for all targets and `netgo`, `osuser` etc.. system-dependent packages are not statically linked. Also separate `musl` binary provided. +- macOS temporarily removed from CI +- Added curl dependency to download rr (@dkarlovi) + +v1.6.2 (23.02.2020) +------------------- +- added reload module to handle file changes + +v1.6.1 (17.02.2020) +------------------- +- When you run ./rr server -d (debug mode), also pprof server will be launched on :6061 port (this is default golang port for pprof) with the default endpoints (see: https://golang.org/pkg/net/http/pprof/) +- Added LDFLAGS "-s" to build.sh --> https://spiralscout.com/blog/golang-software-testing-tips + +v1.6.0 (11.02.2020) +------------------- +- Moved to GitHub Actions, thanks to @tarampampam +- New GZIP handler, thanks to @wppd +- Tests stabilization and fix REQUEST_URI for requests through FastCGI, thanks to @marliotto +- Golang modules update and new RPC method to register metrics from the application, thanks to @48d90782 +- Deadlock on timer update in error buffer [bugfix], thanks to @camohob + +v1.5.3 (23.12.2019) +------------------- +- metric and RPC ports are rotated in tests to avoid false positive +- massive test and source cleanup (more error handlers) by @ValeryPiashchynski +- "Server closed" error has been suppressed +- added the ability to specify any config value via JSON flag `-j` +- minor improvements in Travis pipeline +- bump the minimum TLS version to TLS 1.2 +- added `Strict-Transport-Security` header for TLS requests + +v1.5.2 (05.12.2019) +------------------- +- added support for symfony/console 5.0 by @coxa +- added support for HTTP2 trailers by @filakhtov + +v1.5.1 (22.10.2019) +------------------- +- bugfix: do not halt stop sequence in case of service error + +v1.5.0 (12.10.2019) +------------------- +- initial code style fixes by @ScullWM +- added health service for better integration with Kubernetes by @awprice +- added support for payloads in GET methods by @moeinpaki +- dropped support of PHP 7.0 version (you can still use new server binary) + +v1.4.8 (06.09.2019) +------------------- +- bugfix in proxy IP resolution by @spudro228 +- `rr get` can now skip binary download if version did not change by + @drefixs +- bugfix in `rr init-config` and with linux binary download by + @Hunternnm +- `$_SERVER['REQUEST_URI']` is now being set + +v1.4.7 (29.07.2019) +------------------- +- added support for H2C over TCP by @Alex-Bond + +v1.4.6 (01.07.2019) +------------------- +- Worker is not final (to allow mocking) +- MatricsInterface added + +v1.4.5 (27.06.2019) +------------------- +- added metrics server with Prometheus backend +- ability to push metrics from the application +- expose http service metrics +- expose limit service metrics +- expose generic golang metrics +- HttpClient and Worker marked final + +v1.4.4 (25.06.2019) +------------------- +- added "headers" service with the ability to specify request, response and CORS headers by @ovr +- added FastCGI support for HTTP service by @ovr +- added ability to include multiple config files using `include` directive in the configuration + +v1.4.3 (03.06.2019) +------------------- +- fixed dependency with Zend Diactoros by @dkuhnert +- minor refactoring of error reporting by @lda + +v1.4.2 (22.05.2019) +------------------- +- bugfix: incorrect RPC method for stop command +- bugfix: incorrect archive extension in /vendor/bin/rr get on linux machines + +v1.4.1 (15.05.2019) +------------------- +- constrain service renamed to "limit" to equalize the definition with sample config + +v1.4.0 (05.05.2019) +------------------- +- launch of official website https://roadrunner.dev/ +- ENV variables in configs (automatic RR_ mapping and manual definition using "${ENV_NAME}" value) +- the ability to safely remove the worker from the pool in runtime +- minor performance improvements +- `real ip` resolution using X-Real-Ip and X-Forwarded-For (+cidr verification) +- automatic worker lifecycle manager (controller, see [sample config](https://github.com/spiral/roadrunner/blob/master/.rr.yaml)) + - maxMemory (graceful stop) + - ttl (graceful stop) + - idleTTL (graceful stop) + - execTTL (brute, max_execution_time) +- the ability to stop rr using `rr stop` +- `maxRequest` option has been deprecated in favor of `maxRequestSize` +- `/vendor/bin/rr get` to download rr server binary (symfony/console) by @Alex-Bond +- `/vendor/bin/rr init` to init rr config by @Alex-Bond +- quick builds are no longer supported +- PSR-12 +- strict_types=1 added to all php files + +v1.3.7 (21.03.2019) +------------------- +- bugfix: Request field ordering with same names #136 + +v1.3.6 (21.03.2019) +------------------- +- bugfix: pool did not wait for slow workers to complete while running concurrent load with http:reset command being invoked + +v1.3.5 (14.02.2019) +------------------- +- new console flag `l` to define log formatting + * **color|default** - colorized output + * **plain** - disable all colorization + * **json** - output as json +- new console flag `w` to specify work dir +- added ability to work without config file when at least one `overwrite` option has been specified +- pool config now sets `numWorkers` equal to number of cores by default (this section can be omitted now) + +v1.3.4 (02.02.2019) +------------------- +- bugfix: invalid content type detection for urlencoded form requests with custom encoding by @Alex-Bond + +v1.3.3 (31.01.2019) +------------------- +- added HttpClient for faster integrations with non PSR-7 frameworks by @Alex-Bond + +v1.3.2 (11.01.2019) +------------------- +- `_SERVER` now exposes headers with HTTP_ prefix (fixing Lravel integration) by @Alex-Bond +- fixed bug causing body payload not being received for custom HTTP methods by @Alex-Bond + +v1.3.1 (11.01.2019) +------------------- +- fixed bug causing static_pool crash when multiple reset requests received at the same time +- added `always` directive to static service config to always service files of specific extension +- added `vendor/bin/rr-build` command to easier compile custom RoadRunner builds + +v1.3.0 (05.01.2019) +------------------- +- added support for zend/diactros 1.0 and 2.0 +- removed `http-interop/http-factory-diactoros` +- added `strict_types=1` +- added elapsed time into debug log +- ability to redefine config via flags (example: `rr serve -v -d -o http.workers.pool.numWorkers=1`) +- fixed bug causing child processes die before parent rr (annoying error on windows "worker exit status ....") +- improved stop sequence and graceful exit +- `env.Environment` has been spitted into `env.Setter` and `env.Getter` +- added `env.Copy` method +- config management has been moved out from root command into `utils` +- spf13/viper dependency has been bumped up to 1.3.1 +- more tests +- new travis configuration + +v1.2.8 (26.12.2018) +------------------- +- bugfix #76 error_log redirect has been disabled after `http:reset` command + +v1.2.7 (20.12.2018) +------------------- +- #67 bugfix, invalid protocol version while using HTTP/2 with new http-interop by @bognerf +- #66 added HTTP_USER_AGENT value and tests for it +- typo fix in static service by @Alex-Bond +- added PHP 7.3 to travis +- less ambiguous error when invalid data found in a pipe(`invalid prefix (checksum)` => `invalid data found in the buffer (possible echo)`) + +v1.2.6 (18.10.2018) +------------------- +- bugfix: ignored `stopping` value during http server shutdown +- debug log now split message into individual lines + +v1.2.5 (13.10.2018) +------ +- decoupled from Zend Diactoros via PSR-17 factory (by @1ma) +- `Verbose` flag for cli renamed to `verbose` (by @ruudk) +- bugfix: HTTP protocol version mismatch on PHP end + +v1.2.4 (30.09.2018) +------ +- minor performance improvements (reduced number of syscalls) +- worker factory connection is now exposed to PHP using RR_RELAY env +- HTTPS support +- HTTP/2 and HTTP/2 Support +- Removed `disable` flag of static service + +v1.2.3 (29.09.2018) +------ +- reduced verbosity +- worker list has been extracted from http service and now available for other rr based services +- built using Go 1.11 + +v1.2.2 (23.09.2018) +------ +- new project directory structure +- introduces DefaultsConfig, allows to keep config files smaller +- better worker pool destruction while working with long running processes +- added more php versions to travis config +- `Spiral\RoadRunner\Exceptions\RoadRunnerException` is marked as deprecated in favor of `Spiral\RoadRunner\Exception\RoadRunnerException` +- improved test coverage + +v1.2.1 (21.09.2018) +------ +- added RR_HTTP env variable to php processes run under http service +- bugfix: ignored `--config` option +- added shorthand for config `-c` +- rr now changes working dir to the config location (allows relating paths for php scripts) + +v1.2.0 (10.09.2018) +------- +- added an ability to request `*logrus.Logger`, `logrus.StdLogger`, `logrus.FieldLogger` dependency +in container +- added ability to set env values using `env.Environment` +- `env.Provider` renamed to `env.Environment` +- rr does not throw a warning when service config is missing, instead debug level is used +- rr server config now support default value set (shorter configs) +- debug handlers have been moved from root command and now can be defined for each service separately +- bugfix: panic when using debug mode without http service registered +- `rr.Verbose` and `rr.Debug`is not public +- rpc service now exposes it's addressed to underlying workers to simplify the connection +- env service construction has been simplified in order to unify it with other services +- more tests + +v1.1.1 (26.07.2018) +------- +- added support for custom env variables +- added env service +- added env provider to provide ability to define env variables from any source +- container can resolve values by interface now + +v1.1.0 (08.07.2018) +------- +- bugfix: Wrong values for $_SERVER['REQUEST_TIME'] and $_SERVER['REQUEST_TIME_FLOAT'] +- rr now resolves remoteAddr (IP-address) +- improvements in the error buffer +- support for custom configs and dependency injection for services +- support for net/http native middlewares +- better debugger +- config pre-processing now allows seconds for http service timeouts +- support for non-serving services + +v1.0.5 (30.06.2018) +------- +- docker compatible logging (forcing TTY output for logrus) + +v1.0.4 (25.06.2018) +------- +- changes in server shutdown sequence + +v1.0.3 (23.06.2018) +------- +- rr would provide error log from workers in realtime now +- even better service shutdown +- safer unix socket allocation +- minor CS + +v1.0.2 (19.06.2018) +------- +- more validations for user configs + +v1.0.1 (15.06.2018) +------- +- Makefile added + +v1.0.0 (14.06.2018) +------ +- higher performance +- worker.State.Updated() has been removed in order to improve overall performance +- staticPool can automatically replace workers killed from outside +- server would not attempt to rebuild static pool in case of reoccurring failure +- PSR-7 server +- file uploads +- service container and plugin based model +- RPC server +- better control over worker state, move events +- static files server +- hot code reload, interactive workers console +- support for future streaming responses +- much higher tests coverage +- less dependencies +- yaml/json configs (thx viper) +- CLI application server +- middleware and event listeners support +- psr7 library for php diff --git a/_old/LICENSE b/_old/LICENSE new file mode 100644 index 00000000..d968467f --- /dev/null +++ b/_old/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Spiral Scout + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/_old/Makefile b/_old/Makefile new file mode 100644 index 00000000..d7e85f90 --- /dev/null +++ b/_old/Makefile @@ -0,0 +1,28 @@ +build: + @./build.sh +all: + @./build.sh all +clean: + rm -rf rr +install: all + cp rr /usr/local/bin/rr +uninstall: + rm -f /usr/local/bin/rr +test: + composer update + go test -v -race -cover + go test -v -race -cover ./util + go test -v -race -cover ./service + go test -v -race -cover ./service/env + go test -v -race -cover ./service/rpc + go test -v -race -cover ./service/http + go test -v -race -cover ./service/static + go test -v -race -cover ./service/limit + go test -v -race -cover ./service/headers + go test -v -race -cover ./service/metrics + go test -v -race -cover ./service/health + go test -v -race -cover ./service/gzip + go test -v -race -cover ./service/reload +lint: + go fmt ./... + golint ./...
\ No newline at end of file diff --git a/_old/README.md b/_old/README.md new file mode 100644 index 00000000..edf575ce --- /dev/null +++ b/_old/README.md @@ -0,0 +1,118 @@ +<p align="center"> + <img src="https://user-images.githubusercontent.com/796136/50286124-6f7f3780-046f-11e9-9f45-e8fedd4f786d.png" height="75px" alt="RoadRunner"> +</p> +<p align="center"> + <a href="https://packagist.org/packages/spiral/roadrunner"><img src="https://poser.pugx.org/spiral/roadrunner/version"></a> + <a href="https://pkg.go.dev/github.com/spiral/roadrunner?tab=doc"><img src="https://godoc.org/github.com/spiral/roadrunner?status.svg"></a> + <a href="https://github.com/spiral/roadrunner/actions"><img src="https://github.com/spiral/roadrunner/workflows/CI/badge.svg" alt=""></a> + <a href="https://goreportcard.com/report/github.com/spiral/roadrunner"><img src="https://goreportcard.com/badge/github.com/spiral/roadrunner"></a> + <a href="https://scrutinizer-ci.com/g/spiral/roadrunner/?branch=master"><img src="https://scrutinizer-ci.com/g/spiral/roadrunner/badges/quality-score.png"></a> + <a href="https://codecov.io/gh/spiral/roadrunner/"><img src="https://codecov.io/gh/spiral/roadrunner/branch/master/graph/badge.svg"></a> + <a href="https://lgtm.com/projects/g/spiral/roadrunner/alerts/"><img alt="Total alerts" src="https://img.shields.io/lgtm/alerts/g/spiral/roadrunner.svg?logo=lgtm&logoWidth=18"/></a> + <a href="https://discord.gg/TFeEmCs"><img src="https://img.shields.io/badge/discord-chat-magenta.svg"></a> +</p> + +RoadRunner is an open-source (MIT licensed) high-performance PHP application server, load balancer, and process manager. +It supports running as a service with the ability to extend its functionality on a per-project basis. + +RoadRunner includes PSR-7/PSR-17 compatible HTTP and HTTP/2 server and can be used to replace classic Nginx+FPM setup with much greater performance and flexibility. + +<p align="center"> + <a href="https://roadrunner.dev/"><b>Official Website</b></a> | + <a href="https://roadrunner.dev/docs"><b>Documentation</b></a> +</p> + +Features: +-------- +- Production-ready +- PCI DSS compliant +- PSR-7 HTTP server (file uploads, error handling, static files, hot reload, middlewares, event listeners) +- HTTPS and HTTP/2 support (including HTTP/2 Push, H2C) +- Fully customizable server, FastCGI support +- Flexible environment configuration +- No external PHP dependencies (64bit version required), drop-in (based on [Goridge](https://github.com/spiral/goridge)) +- Load balancer, process manager and task pipeline +- Frontend agnostic ([Queue](https://github.com/spiral/jobs), PSR-7, [GRPC](https://github.com/spiral/php-grpc), etc) +- Integrated metrics (Prometheus) +- Works over TCP, UNIX sockets and standard pipes +- Automatic worker replacement and safe PHP process destruction +- Worker create/allocate/destroy timeouts +- Max jobs per worker +- Worker lifecycle management (controller) + - maxMemory (graceful stop) + - TTL (graceful stop) + - idleTTL (graceful stop) + - execTTL (brute, max_execution_time) +- Payload context and body +- Protocol, worker and job level error management (including PHP errors) +- Very fast (~250k rpc calls per second on Ryzen 1700X using 16 threads) +- Integrations with Symfony, [Laravel](https://github.com/spiral/roadrunner-laravel), Slim, CakePHP, Zend Expressive +- Application server for [Spiral](https://github.com/spiral/framework) +- Automatic reloading on file changes +- Works on Windows (Unix sockets (AF_UNIX) supported on Windows 10) + +Installation: +-------- +To install: + +``` +$ composer require spiral/roadrunner +$ ./vendor/bin/rr get-binary +``` + +> For getting roadrunner binary file you can use our docker image: `spiralscout/roadrunner:X.X.X` (more information about image and tags can be found [here](https://hub.docker.com/r/spiralscout/roadrunner/)) + +Extensions: +-------- +| Extension | Current Status +| --- | --- +spiral/jobs | [![Latest Stable Version](https://poser.pugx.org/spiral/jobs/version)](https://packagist.org/packages/spiral/jobs) [![Build Status](https://travis-ci.org/spiral/jobs.svg?branch=master)](https://travis-ci.org/spiral/jobs) [![Codecov](https://codecov.io/gh/spiral/jobs/branch/master/graph/badge.svg)](https://codecov.io/gh/spiral/jobs/) +spiral/php-grpc | [![Latest Stable Version](https://poser.pugx.org/spiral/php-grpc/version)](https://packagist.org/packages/spiral/php-grpc) [![Build Status](https://travis-ci.org/spiral/php-grpc.svg?branch=master)](https://travis-ci.org/spiral/php-grpc) [![Codecov](https://codecov.io/gh/spiral/php-grpc/branch/master/graph/badge.svg)](https://codecov.io/gh/spiral/php-grpc/) +spiral/broadcast | [![Latest Stable Version](https://poser.pugx.org/spiral/broadcast/version)](https://packagist.org/packages/spiral/broadcast) [![Build Status](https://travis-ci.org/spiral/broadcast.svg?branch=master)](https://travis-ci.org/spiral/broadcast) [![Codecov](https://codecov.io/gh/spiral/broadcast/branch/master/graph/badge.svg)](https://codecov.io/gh/spiral/broadcast/) +spiral/broadcast-ws | [![Latest Stable Version](https://poser.pugx.org/spiral/broadcast-ws/version)](https://packagist.org/packages/spiral/broadcast-ws) [![Build Status](https://travis-ci.org/spiral/broadcast-ws.svg?branch=master)](https://travis-ci.org/spiral/broadcast-ws) [![Codecov](https://codecov.io/gh/spiral/broadcast-ws/branch/master/graph/badge.svg)](https://codecov.io/gh/spiral/broadcast-ws/) + +Example: +-------- + +```php +<?php +// worker.php +ini_set('display_errors', 'stderr'); +include "vendor/autoload.php"; + +$relay = new Spiral\Goridge\StreamRelay(STDIN, STDOUT); +$psr7 = new Spiral\RoadRunner\PSR7Client(new Spiral\RoadRunner\Worker($relay)); + +while ($req = $psr7->acceptRequest()) { + try { + $resp = new \Zend\Diactoros\Response(); + $resp->getBody()->write("hello world"); + + $psr7->respond($resp); + } catch (\Throwable $e) { + $psr7->getWorker()->error((string)$e); + } +} +``` + +Configuration can be located in `.rr.yaml` file ([full sample](https://github.com/spiral/roadrunner/blob/master/.rr.yaml)): + +```yaml +http: + address: 0.0.0.0:8080 + workers.command: "php worker.php" +``` + +> Read more in [Documentation](https://roadrunner.dev/docs). + +Run: +---- +To run application server: + +``` +$ ./rr serve -v -d +``` + +License: +-------- +The MIT License (MIT). Please see [`LICENSE`](LICENSE) for more information. Maintained by [Spiral Scout](https://spiralscout.com). diff --git a/_old/build.sh b/_old/build.sh new file mode 100755 index 00000000..77c13fff --- /dev/null +++ b/_old/build.sh @@ -0,0 +1,71 @@ +#!/bin/bash +cd $(dirname "${BASH_SOURCE[0]}") +OD="$(pwd)" + +# Pushes application version into the build information. +RR_VERSION=1.8.3 + +# Hardcode some values to the core package +LDFLAGS="$LDFLAGS -X github.com/spiral/roadrunner/cmd/rr/cmd.Version=${RR_VERSION}" +LDFLAGS="$LDFLAGS -X github.com/spiral/roadrunner/cmd/rr/cmd.BuildTime=$(date +%FT%T%z)" +# remove debug info from binary as well as string and symbol tables +LDFLAGS="$LDFLAGS -s" + +build() { + echo Packaging "$1" Build + bdir=roadrunner-${RR_VERSION}-$2-$3 + rm -rf builds/"$bdir" && mkdir -p builds/"$bdir" + GOOS=$2 GOARCH=$3 ./build.sh + + if [ "$2" == "windows" ]; then + mv rr builds/"$bdir"/rr.exe + else + mv rr builds/"$bdir" + fi + + cp README.md builds/"$bdir" + cp CHANGELOG.md builds/"$bdir" + cp LICENSE builds/"$bdir" + cd builds + + if [ "$2" == "linux" ]; then + tar -zcf "$bdir".tar.gz "$bdir" + else + zip -r -q "$bdir".zip "$bdir" + fi + + rm -rf "$bdir" + cd .. +} + +# For musl build you should have musl-gcc installed. If not, please, use: +# go build -a -ldflags "-linkmode external -extldflags '-static' -s" +build_musl() { + echo Packaging "$2" Build + bdir=roadrunner-${RR_VERSION}-$1-$2-$3 + rm -rf builds/"$bdir" && mkdir -p builds/"$bdir" + CC=musl-gcc GOARCH=amd64 go build -trimpath -ldflags "$LDFLAGS" -o "$OD/rr" cmd/rr/main.go + + mv rr builds/"$bdir" + + cp README.md builds/"$bdir" + cp CHANGELOG.md builds/"$bdir" + cp LICENSE builds/"$bdir" + cd builds + zip -r -q "$bdir".zip "$bdir" + + rm -rf "$bdir" + cd .. +} + +if [ "$1" == "all" ]; then + rm -rf builds/ + build "Windows" "windows" "amd64" + build "Mac" "darwin" "amd64" + build "Linux" "linux" "amd64" + build "FreeBSD" "freebsd" "amd64" + build_musl "unknown" "musl" "amd64" + exit +fi + +CGO_ENABLED=0 go build -trimpath -ldflags "$LDFLAGS" -o "$OD/rr" cmd/rr/main.go diff --git a/_old/composer.json b/_old/composer.json new file mode 100644 index 00000000..6b817a2e --- /dev/null +++ b/_old/composer.json @@ -0,0 +1,43 @@ +{ + "name": "spiral/roadrunner", + "type": "server", + "description": "High-performance PHP application server, load-balancer and process manager written in Golang", + "license": "MIT", + "authors": [ + { + "name": "Anton Titov / Wolfy-J", + "email": "[email protected]" + }, + { + "name": "RoadRunner Community", + "homepage": "https://github.com/spiral/roadrunner/graphs/contributors" + } + ], + "require": { + "php": "^7.2", + "ext-json": "*", + "ext-curl": "*", + "spiral/goridge": "^2.4.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "symfony/console": "^2.5.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "laminas/laminas-diactoros": "^1.3 || ^2.0" + }, + "config": { + "vendor-dir": "vendor_php" + }, + "require-dev": { + "phpstan/phpstan": "~0.12" + }, + "scripts": { + "analyze": "phpstan analyze -c ./phpstan.neon.dist --no-progress --ansi" + }, + "autoload": { + "psr-4": { + "Spiral\\RoadRunner\\": "src/" + } + }, + "bin": [ + "bin/rr" + ] +} diff --git a/_old/container.go b/_old/container.go deleted file mode 100644 index daab7339..00000000 --- a/_old/container.go +++ /dev/null @@ -1,371 +0,0 @@ -package _old - -import ( - "fmt" - "github.com/pkg/errors" - "github.com/sirupsen/logrus" - "reflect" - "sync" -) - -var errNoConfig = fmt.Errorf("no config has been provided") -var errTempFix223 = fmt.Errorf("temporary error for fix #223") // meant no error here, just shutdown the server - -// InitMethod contains name of the method to be automatically invoked while service initialization. Must return -// (bool, error). Container can be requested as well. Config can be requested in a form -// of service.Config or pointer to service specific config struct (automatically unmarshalled), config argument must -// implement service.HydrateConfig. -const InitMethod = "Init" - -// Service can serve. Services can provide Init method which must return (bool, error) signature and might accept -// other services and/or configs as dependency. -type Service interface { - // Serve serves. - Serve() error - - // Detach stops the service. - Stop() -} - -// Container controls all internal RR services and provides plugin based system. -type Container interface { - // Register add new service to the container under given name. - Register(name string, service interface{}) - - // Reconfigure configures all underlying services with given configuration. - Init(cfg Config) error - - // Check if svc has been registered. - Has(service string) bool - - // get returns svc instance by it's name or nil if svc not found. Method returns current service status - // as second value. - Get(service string) (svc interface{}, status int) - - // Serve all configured services. Non blocking. - Serve() error - - // Close all active services. - Stop() - - // List service names. - List() []string -} - -// Config provides ability to slice configuration sections and unmarshal configuration data into -// given structure. -type Config interface { - // get nested config section (sub-map), returns nil if section not found. - Get(service string) Config - - // Unmarshal unmarshal config data into given struct. - Unmarshal(out interface{}) error -} - -// HydrateConfig provides ability to automatically hydrate config with values using -// service.Config as the source. -type HydrateConfig interface { - // Hydrate must populate config values using given config source. - // Must return error if config is not valid. - Hydrate(cfg Config) error -} - -// DefaultsConfig declares ability to be initated without config data provided. -type DefaultsConfig interface { - // InitDefaults allows to init blank config with pre-defined set of default values. - InitDefaults() error -} - -type container struct { - log logrus.FieldLogger - mu sync.Mutex - services []*entry - errc chan struct { - name string - err error - } -} - -// NewContainer creates new service container. -func NewContainer(log logrus.FieldLogger) Container { - return &container{ - log: log, - services: make([]*entry, 0), - errc: make(chan struct { - name string - err error - }, 1), - } -} - -// Register add new service to the container under given name. -func (c *container) Register(name string, service interface{}) { - c.mu.Lock() - defer c.mu.Unlock() - - c.services = append(c.services, &entry{ - name: name, - svc: service, - status: StatusInactive, - }) -} - -// Check hasStatus svc has been registered. -func (c *container) Has(target string) bool { - c.mu.Lock() - defer c.mu.Unlock() - - for _, e := range c.services { - if e.name == target { - return true - } - } - - return false -} - -// get returns svc instance by it's name or nil if svc not found. -func (c *container) Get(target string) (svc interface{}, status int) { - c.mu.Lock() - defer c.mu.Unlock() - - for _, e := range c.services { - if e.name == target { - return e.svc, e.getStatus() - } - } - - return nil, StatusUndefined -} - -// Init configures all underlying services with given configuration. -func (c *container) Init(cfg Config) error { - for _, e := range c.services { - if e.getStatus() >= StatusOK { - return fmt.Errorf("service [%s] has already been configured", e.name) - } - - // inject service dependencies - if ok, err := c.initService(e.svc, cfg.Get(e.name)); err != nil { - // soft error (skipping) - if err == errNoConfig { - c.log.Debugf("[%s]: disabled", e.name) - continue - } - - return errors.Wrap(err, fmt.Sprintf("[%s]", e.name)) - } else if ok { - e.setStatus(StatusOK) - } else { - c.log.Debugf("[%s]: disabled", e.name) - } - } - - return nil -} - -// Serve all configured services. Non blocking. -func (c *container) Serve() error { - var running = 0 - for _, e := range c.services { - if e.hasStatus(StatusOK) && e.canServe() { - running++ - c.log.Debugf("[%s]: started", e.name) - go func(e *entry) { - e.setStatus(StatusServing) - defer e.setStatus(StatusStopped) - if err := e.svc.(Service).Serve(); err != nil { - c.errc <- struct { - name string - err error - }{name: e.name, err: errors.Wrap(err, fmt.Sprintf("[%s]", e.name))} - } else { - c.errc <- struct { - name string - err error - }{name: e.name, err: errTempFix223} - } - }(e) - } - } - - // simple handler to handle empty configs - if running == 0 { - return nil - } - - for fail := range c.errc { - if fail.err == errTempFix223 { - // if we call stop, then stop all plugins - break - } else { - c.log.Errorf("[%s]: %s", fail.name, fail.err) - c.Stop() - return fail.err - } - } - - return nil -} - -// Detach sends stop command to all running services. -func (c *container) Stop() { - for _, e := range c.services { - if e.hasStatus(StatusServing) { - e.setStatus(StatusStopping) - e.svc.(Service).Stop() - e.setStatus(StatusStopped) - - c.log.Debugf("[%s]: stopped", e.name) - } - } -} - -// List all service names. -func (c *container) List() []string { - names := make([]string, 0, len(c.services)) - for _, e := range c.services { - names = append(names, e.name) - } - - return names -} - -// calls Init method with automatically resolved arguments. -func (c *container) initService(s interface{}, segment Config) (bool, error) { - r := reflect.TypeOf(s) - - m, ok := r.MethodByName(InitMethod) - if !ok { - // no Init method is presented, assuming service does not need initialization. - return true, nil - } - - if err := c.verifySignature(m); err != nil { - return false, err - } - - // hydrating - values, err := c.resolveValues(s, m, segment) - if err != nil { - return false, err - } - - // initiating service - out := m.Func.Call(values) - - if out[1].IsNil() { - return out[0].Bool(), nil - } - - return out[0].Bool(), out[1].Interface().(error) -} - -// resolveValues returns slice of call arguments for service Init method. -func (c *container) resolveValues(s interface{}, m reflect.Method, cfg Config) (values []reflect.Value, err error) { - for i := 0; i < m.Type.NumIn(); i++ { - v := m.Type.In(i) - - switch { - case v.ConvertibleTo(reflect.ValueOf(s).Type()): // service itself - values = append(values, reflect.ValueOf(s)) - - case v.Implements(reflect.TypeOf((*Container)(nil)).Elem()): // container - values = append(values, reflect.ValueOf(c)) - - case v.Implements(reflect.TypeOf((*logrus.StdLogger)(nil)).Elem()), - v.Implements(reflect.TypeOf((*logrus.FieldLogger)(nil)).Elem()), - v.ConvertibleTo(reflect.ValueOf(c.log).Type()): // logger - values = append(values, reflect.ValueOf(c.log)) - - case v.Implements(reflect.TypeOf((*HydrateConfig)(nil)).Elem()): // injectable config - sc := reflect.New(v.Elem()) - - if dsc, ok := sc.Interface().(DefaultsConfig); ok { - err := dsc.InitDefaults() - if err != nil { - return nil, err - } - if cfg == nil { - values = append(values, sc) - continue - } - - } else if cfg == nil { - return nil, errNoConfig - } - - if err := sc.Interface().(HydrateConfig).Hydrate(cfg); err != nil { - return nil, err - } - - values = append(values, sc) - - case v.Implements(reflect.TypeOf((*Config)(nil)).Elem()): // generic config section - if cfg == nil { - return nil, errNoConfig - } - - values = append(values, reflect.ValueOf(cfg)) - - default: // dependency on other service (resolution to nil if service can't be found) - value, err := c.resolveValue(v) - if err != nil { - return nil, err - } - - values = append(values, value) - } - } - - return -} - -// verifySignature checks if Init method has valid signature -func (c *container) verifySignature(m reflect.Method) error { - if m.Type.NumOut() != 2 { - return fmt.Errorf("method Init must have exact 2 return values") - } - - if m.Type.Out(0).Kind() != reflect.Bool { - return fmt.Errorf("first return value of Init method must be bool type") - } - - if !m.Type.Out(1).Implements(reflect.TypeOf((*error)(nil)).Elem()) { - return fmt.Errorf("second return value of Init method value must be error type") - } - - return nil -} - -func (c *container) resolveValue(v reflect.Type) (reflect.Value, error) { - value := reflect.Value{} - for _, e := range c.services { - if !e.hasStatus(StatusOK) { - continue - } - - if v.Kind() == reflect.Interface && reflect.TypeOf(e.svc).Implements(v) { - if value.IsValid() { - return value, fmt.Errorf("disambiguous dependency `%s`", v) - } - - value = reflect.ValueOf(e.svc) - } - - if v.ConvertibleTo(reflect.ValueOf(e.svc).Type()) { - if value.IsValid() { - return value, fmt.Errorf("disambiguous dependency `%s`", v) - } - - value = reflect.ValueOf(e.svc) - } - } - - if !value.IsValid() { - // placeholder (make sure to check inside the method) - value = reflect.New(v).Elem() - } - - return value, nil -} diff --git a/_old/container_test.go b/_old/container_test.go deleted file mode 100644 index 2f860c41..00000000 --- a/_old/container_test.go +++ /dev/null @@ -1,533 +0,0 @@ -package _old - -import ( - "errors" - json "github.com/json-iterator/go" - "github.com/sirupsen/logrus" - "github.com/sirupsen/logrus/hooks/test" - "github.com/stretchr/testify/assert" - "sync" - "testing" - "time" -) - -type testService struct { - mu sync.Mutex - waitForServe chan interface{} - delay time.Duration - ok bool - cfg Config - c Container - cfgE, serveE error - done chan interface{} -} - -func (t *testService) Init(cfg Config, c Container) (enabled bool, err error) { - t.cfg = cfg - t.c = c - t.done = make(chan interface{}) - return t.ok, t.cfgE -} - -func (t *testService) Serve() error { - time.Sleep(t.delay) - - if t.serveE != nil { - return t.serveE - } - - if c := t.waitChan(); c != nil { - close(c) - t.setChan(nil) - } - - <-t.done - return nil -} - -func (t *testService) Stop() { - close(t.done) -} - -func (t *testService) waitChan() chan interface{} { - t.mu.Lock() - defer t.mu.Unlock() - - return t.waitForServe -} - -func (t *testService) setChan(c chan interface{}) { - t.mu.Lock() - defer t.mu.Unlock() - - t.waitForServe = c -} - -type testCfg struct{ cfg string } - -func (cfg *testCfg) Get(name string) Config { - vars := make(map[string]interface{}) - j := json.ConfigCompatibleWithStandardLibrary - err := j.Unmarshal([]byte(cfg.cfg), &vars) - if err != nil { - panic("error unmarshalling the cfg.cfg value") - } - - v, ok := vars[name] - if !ok { - return nil - } - - d, _ := j.Marshal(v) - return &testCfg{cfg: string(d)} -} -func (cfg *testCfg) Unmarshal(out interface{}) error { - j := json.ConfigCompatibleWithStandardLibrary - return j.Unmarshal([]byte(cfg.cfg), out) -} - -// Config defines RPC service config. -type dConfig struct { - // Indicates if RPC connection is enabled. - Value string -} - -// Hydrate must populate Config values using given Config source. Must return error if Config is not valid. -func (c *dConfig) Hydrate(cfg Config) error { - return cfg.Unmarshal(c) -} - -// InitDefaults allows to init blank config with pre-defined set of default values. -func (c *dConfig) InitDefaults() error { - c.Value = "default" - - return nil -} - -type dService struct { - Cfg *dConfig -} - -func (s *dService) Init(cfg *dConfig) (bool, error) { - s.Cfg = cfg - return true, nil -} - -func TestContainer_Register(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - c := NewContainer(logger) - c.Register("test", &testService{}) - - assert.Equal(t, 0, len(hook.Entries)) -} - -func TestContainer_Has(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - c := NewContainer(logger) - c.Register("test", &testService{}) - - assert.Equal(t, 0, len(hook.Entries)) - - assert.True(t, c.Has("test")) - assert.False(t, c.Has("another")) -} - -func TestContainer_List(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - c := NewContainer(logger) - c.Register("test", &testService{}) - - assert.Equal(t, 0, len(hook.Entries)) - assert.Equal(t, 1, len(c.List())) - - assert.True(t, c.Has("test")) - assert.False(t, c.Has("another")) -} - -func TestContainer_Get(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - c := NewContainer(logger) - c.Register("test", &testService{}) - assert.Equal(t, 0, len(hook.Entries)) - - s, st := c.Get("test") - assert.IsType(t, &testService{}, s) - assert.Equal(t, StatusInactive, st) - - s, st = c.Get("another") - assert.Nil(t, s) - assert.Equal(t, StatusUndefined, st) -} - -func TestContainer_Stop_NotStarted(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - c := NewContainer(logger) - c.Register("test", &testService{}) - assert.Equal(t, 0, len(hook.Entries)) - - c.Stop() -} - -func TestContainer_Configure(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - svc := &testService{ok: true} - - c := NewContainer(logger) - c.Register("test", svc) - assert.Equal(t, 0, len(hook.Entries)) - - assert.NoError(t, c.Init(&testCfg{`{"test":"something"}`})) - - s, st := c.Get("test") - assert.IsType(t, &testService{}, s) - assert.Equal(t, StatusOK, st) -} - -func TestContainer_Init_Default(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - svc := &dService{} - - c := NewContainer(logger) - c.Register("test", svc) - assert.Equal(t, 0, len(hook.Entries)) - - assert.NoError(t, c.Init(&testCfg{`{}`})) - - s, st := c.Get("test") - assert.IsType(t, &dService{}, s) - assert.Equal(t, StatusOK, st) - - assert.Equal(t, "default", svc.Cfg.Value) -} - -func TestContainer_Init_Default_Overwrite(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - svc := &dService{} - - c := NewContainer(logger) - c.Register("test", svc) - assert.Equal(t, 0, len(hook.Entries)) - - assert.NoError(t, c.Init(&testCfg{`{"test":{"value": "something"}}`})) - - s, st := c.Get("test") - assert.IsType(t, &dService{}, s) - assert.Equal(t, StatusOK, st) - - assert.Equal(t, "something", svc.Cfg.Value) -} - -func TestContainer_ConfigureNull(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - svc := &testService{ok: true} - - c := NewContainer(logger) - c.Register("test", svc) - assert.Equal(t, 0, len(hook.Entries)) - - assert.NoError(t, c.Init(&testCfg{`{"another":"something"}`})) - assert.Equal(t, 1, len(hook.Entries)) - - s, st := c.Get("test") - assert.IsType(t, &testService{}, s) - assert.Equal(t, StatusInactive, st) -} - -func TestContainer_ConfigureDisabled(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - svc := &testService{ok: false} - - c := NewContainer(logger) - c.Register("test", svc) - assert.Equal(t, 0, len(hook.Entries)) - - assert.NoError(t, c.Init(&testCfg{`{"test":"something"}`})) - assert.Equal(t, 1, len(hook.Entries)) - - s, st := c.Get("test") - assert.IsType(t, &testService{}, s) - assert.Equal(t, StatusInactive, st) -} - -func TestContainer_ConfigureError(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - svc := &testService{ - ok: false, - cfgE: errors.New("configure error"), - } - - c := NewContainer(logger) - c.Register("test", svc) - assert.Equal(t, 0, len(hook.Entries)) - - err := c.Init(&testCfg{`{"test":"something"}`}) - assert.Error(t, err) - assert.Contains(t, err.Error(), "configure error") - assert.Contains(t, err.Error(), "test") - - s, st := c.Get("test") - assert.IsType(t, &testService{}, s) - assert.Equal(t, StatusInactive, st) -} - -func TestContainer_ConfigureTwice(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - svc := &testService{ok: true} - - c := NewContainer(logger) - c.Register("test", svc) - assert.Equal(t, 0, len(hook.Entries)) - - assert.NoError(t, c.Init(&testCfg{`{"test":"something"}`})) - assert.Error(t, c.Init(&testCfg{`{"test":"something"}`})) -} - -// bug #276 test -func TestContainer_ServeEmptyContainer(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - svc := &testService{ok: true} - - c := NewContainer(logger) - c.Register("test", svc) - assert.Equal(t, 0, len(hook.Entries)) - - go assert.NoError(t, c.Serve()) - - time.Sleep(time.Millisecond * 500) - - c.Stop() -} - -func TestContainer_Serve(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - svc := &testService{ - ok: true, - waitForServe: make(chan interface{}), - } - - c := NewContainer(logger) - c.Register("test", svc) - assert.Equal(t, 0, len(hook.Entries)) - assert.NoError(t, c.Init(&testCfg{`{"test":"something"}`})) - - go func() { - assert.NoError(t, c.Serve()) - }() - - <-svc.waitChan() - - s, st := c.Get("test") - assert.IsType(t, &testService{}, s) - assert.Equal(t, StatusServing, st) - - c.Stop() - - s, st = c.Get("test") - assert.IsType(t, &testService{}, s) - assert.Equal(t, StatusStopped, st) -} - -func TestContainer_ServeError(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - svc := &testService{ - ok: true, - waitForServe: make(chan interface{}), - serveE: errors.New("serve error"), - } - - c := NewContainer(logger) - c.Register("test", svc) - assert.Equal(t, 0, len(hook.Entries)) - assert.NoError(t, c.Init(&testCfg{`{"test":"something"}`})) - - err := c.Serve() - assert.Error(t, err) - assert.Contains(t, err.Error(), "serve error") - assert.Contains(t, err.Error(), "test") - - s, st := c.Get("test") - assert.IsType(t, &testService{}, s) - assert.Equal(t, StatusStopped, st) -} - -func TestContainer_ServeErrorMultiple(t *testing.T) { - logger, hook := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - svc := &testService{ - ok: true, - delay: time.Millisecond * 10, - waitForServe: make(chan interface{}), - serveE: errors.New("serve error"), - } - - svc2 := &testService{ - ok: true, - waitForServe: make(chan interface{}), - } - - c := NewContainer(logger) - c.Register("test2", svc2) - c.Register("test", svc) - assert.Equal(t, 0, len(hook.Entries)) - assert.NoError(t, c.Init(&testCfg{`{"test":"something", "test2":"something-else"}`})) - - err := c.Serve() - assert.Error(t, err) - assert.Contains(t, err.Error(), "serve error") - assert.Contains(t, err.Error(), "test") - - s, st := c.Get("test") - assert.IsType(t, &testService{}, s) - assert.Equal(t, StatusStopped, st) - - s, st = c.Get("test2") - assert.IsType(t, &testService{}, s) - assert.Equal(t, StatusStopped, st) -} - -type testInitA struct{} - -func (t *testInitA) Init() error { - return nil -} - -type testInitB struct{} - -func (t *testInitB) Init() (int, error) { - return 0, nil -} - -func TestContainer_InitErrorA(t *testing.T) { - logger, _ := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - c := NewContainer(logger) - c.Register("test", &testInitA{}) - - assert.Error(t, c.Init(&testCfg{`{"test":"something", "test2":"something-else"}`})) -} - -func TestContainer_InitErrorB(t *testing.T) { - logger, _ := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - c := NewContainer(logger) - c.Register("test", &testInitB{}) - - assert.Error(t, c.Init(&testCfg{`{"test":"something", "test2":"something-else"}`})) -} - -type testInitC struct{} - -func (r *testInitC) Test() bool { - return true -} - -func TestContainer_NoInit(t *testing.T) { - logger, _ := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - c := NewContainer(logger) - c.Register("test", &testInitC{}) - - assert.NoError(t, c.Init(&testCfg{`{"test":"something", "test2":"something-else"}`})) -} - -type testInitD struct { - c *testInitC //nolint:golint,unused,structcheck -} - -type DCfg struct { - V string -} - -// Hydrate must populate Config values using given Config source. Must return error if Config is not valid. -func (c *DCfg) Hydrate(cfg Config) error { - if err := cfg.Unmarshal(c); err != nil { - return err - } - if c.V == "fail" { - return errors.New("failed config") - } - - return nil -} - -func (t *testInitD) Init(r *testInitC, c Container, cfg *DCfg) (bool, error) { - if r == nil { - return false, errors.New("unable to find testInitC") - } - - if c == nil { - return false, errors.New("unable to find Container") - } - - if cfg.V != "ok" { - return false, errors.New("invalid config") - } - - return false, nil -} - -func TestContainer_InitDependency(t *testing.T) { - logger, _ := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - c := NewContainer(logger) - c.Register("test", &testInitC{}) - c.Register("test2", &testInitD{}) - - assert.NoError(t, c.Init(&testCfg{`{"test":"something", "test2":{"v":"ok"}}`})) -} - -func TestContainer_InitDependencyFail(t *testing.T) { - logger, _ := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - c := NewContainer(logger) - c.Register("test", &testInitC{}) - c.Register("test2", &testInitD{}) - - assert.Error(t, c.Init(&testCfg{`{"test":"something", "test2":{"v":"fail"}}`})) -} - -func TestContainer_InitDependencyEmpty(t *testing.T) { - logger, _ := test.NewNullLogger() - logger.SetLevel(logrus.DebugLevel) - - c := NewContainer(logger) - c.Register("test2", &testInitD{}) - - assert.Contains(t, c.Init(&testCfg{`{"test2":{"v":"ok"}}`}).Error(), "testInitC") -} diff --git a/_old/entry.go b/_old/entry.go deleted file mode 100644 index 0b2ad33e..00000000 --- a/_old/entry.go +++ /dev/null @@ -1,59 +0,0 @@ -package _old - -import ( - "sync" -) - -const ( - // StatusUndefined when service bus can not find the service. - StatusUndefined = iota - - // StatusInactive when service has been registered in container. - StatusInactive - - // StatusOK when service has been properly configured. - StatusOK - - // StatusServing when service is currently done. - StatusServing - - // StatusStopping when service is currently stopping. - StatusStopping - - // StatusStopped when service being stopped. - StatusStopped -) - -// entry creates association between service instance and given name. -type entry struct { - name string - svc interface{} - mu sync.Mutex - status int -} - -// status returns service status -func (e *entry) getStatus() int { - e.mu.Lock() - defer e.mu.Unlock() - - return e.status -} - -// setStarted indicates that service hasStatus status. -func (e *entry) setStatus(status int) { - e.mu.Lock() - defer e.mu.Unlock() - e.status = status -} - -// hasStatus checks if entry in specific status -func (e *entry) hasStatus(status int) bool { - return e.getStatus() == status -} - -// canServe returns true is service can serve. -func (e *entry) canServe() bool { - _, ok := e.svc.(Service) - return ok -} diff --git a/_old/entry_test.go b/_old/entry_test.go deleted file mode 100644 index 24538561..00000000 --- a/_old/entry_test.go +++ /dev/null @@ -1,16 +0,0 @@ -package _old - -import ( - "github.com/stretchr/testify/assert" - "testing" -) - -func TestEntry_CanServeFalse(t *testing.T) { - e := &entry{svc: nil} - assert.False(t, e.canServe()) -} - -func TestEntry_CanServeTrue(t *testing.T) { - e := &entry{svc: &testService{}} - assert.True(t, e.canServe()) -} diff --git a/_old/go.mod b/_old/go.mod new file mode 100644 index 00000000..0060343d --- /dev/null +++ b/_old/go.mod @@ -0,0 +1,28 @@ +module github.com/spiral/roadrunner + +go 1.14 + +require ( + github.com/NYTimes/gziphandler v1.1.1 + github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect + github.com/buger/goterm v0.0.0-20181115115552-c206103e1f37 + github.com/cenkalti/backoff/v4 v4.0.0 + github.com/dustin/go-humanize v1.0.0 + github.com/go-ole/go-ole v1.2.4 // indirect + github.com/json-iterator/go v1.1.10 + github.com/mattn/go-colorable v0.1.7 // indirect + github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d + github.com/olekukonko/tablewriter v0.0.4 + github.com/pkg/errors v0.9.1 + github.com/prometheus/client_golang v1.7.1 + github.com/shirou/gopsutil v2.20.7+incompatible + github.com/sirupsen/logrus v1.6.0 + github.com/spf13/cobra v1.0.0 + github.com/spf13/viper v1.7.1 + github.com/spiral/goridge/v2 v2.4.5 + github.com/stretchr/testify v1.6.1 + github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a + github.com/yookoala/gofast v0.4.0 + golang.org/x/net v0.0.0-20200222125558-5a598a2470a0 + golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 +) diff --git a/_old/go.sum b/_old/go.sum new file mode 100644 index 00000000..9a487c66 --- /dev/null +++ b/_old/go.sum @@ -0,0 +1,449 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= +github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +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/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/buger/goterm v0.0.0-20181115115552-c206103e1f37 h1:uxxtrnACqI9zK4ENDMf0WpXfUsHP5V8liuq5QdgDISU= +github.com/buger/goterm v0.0.0-20181115115552-c206103e1f37/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U= +github.com/cenkalti/backoff/v4 v4.0.0 h1:6VeaLF9aI+MAUQ95106HwWzYZgJJpZ4stumjj6RFYAU= +github.com/cenkalti/backoff/v4 v4.0.0/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-ini/ini v1.38.1/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= +github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-restit/lzjson v0.0.0-20161206095556-efe3c53acc68/go.mod h1:7vXSKQt83WmbPeyVjCfNT9YDJ5BUFmcwFsEjI9SCvYM= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +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.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +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/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +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/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shirou/gopsutil v2.20.7+incompatible h1:Ymv4OD12d6zm+2yONe39VSmp2XooJe8za7ngOLW/o/w= +github.com/shirou/gopsutil v2.20.7+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spiral/goridge/v2 v2.4.5 h1:rg4lLEJLrEh1Wj6G1qTsYVbYiQvig6mOR1F9GyDIGm8= +github.com/spiral/goridge/v2 v2.4.5/go.mod h1:C/EZKFPON9lypi8QO7I5ObgVmrIzTmhZqFz/tmypcGc= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/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 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a h1:0R4NLDRDZX6JcmhJgXi5E4b8Wg84ihbmUKp/GvSPEzc= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yookoala/gofast v0.4.0 h1:dLBjghcsbbZNOEHN8N1X/gh9S6srmJed4WQfG7DlKwo= +github.com/yookoala/gofast v0.4.0/go.mod h1:rfbkoKaQG1bnuTUZcmV3vAlnfpF4FTq8WbQJf2vcpg8= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +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-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +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-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a h1:gOpx8G595UYyvj8UK4+OFyY4rx037g3fmfhe5SasG3U= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/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-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0 h1:MsuvTghUPjX762sGLnGsxC3HM0B5r83wEtYcYR8/vRs= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +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-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180726210403-bfb5194568d3/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +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-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384 h1:TFlARGu6Czu1z7q93HTxcP1P+/ZFC/IKythI5RzrnRg= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +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/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.38.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c= +gopkg.in/yaml.v2 v2.2.5/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-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/_old/phpstan.neon.dist b/_old/phpstan.neon.dist new file mode 100644 index 00000000..c9ffb648 --- /dev/null +++ b/_old/phpstan.neon.dist @@ -0,0 +1,5 @@ +parameters: + level: 'max' + checkMissingIterableValueType: false + paths: + - src |