Upgrade github.com/testcontainers/testcontainers-go
This commit is contained in:
7
vendor/github.com/testcontainers/testcontainers-go/.gitignore
generated
vendored
7
vendor/github.com/testcontainers/testcontainers-go/.gitignore
generated
vendored
@ -1,2 +1,9 @@
|
||||
# Generated by golang tooling
|
||||
debug.test
|
||||
vendor
|
||||
|
||||
# Generated docs
|
||||
site/
|
||||
.direnv/
|
||||
src/mkdocs-codeinclude-plugin
|
||||
src/pip-delete-this-directory.txt
|
||||
|
2
vendor/github.com/testcontainers/testcontainers-go/.travis.yml
generated
vendored
2
vendor/github.com/testcontainers/testcontainers-go/.travis.yml
generated
vendored
@ -1,6 +1,6 @@
|
||||
language: go
|
||||
go:
|
||||
- 1.11.4
|
||||
- 1.14.x
|
||||
|
||||
install: true
|
||||
|
||||
|
14
vendor/github.com/testcontainers/testcontainers-go/Pipfile
generated
vendored
Normal file
14
vendor/github.com/testcontainers/testcontainers-go/Pipfile
generated
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
[[source]]
|
||||
name = "pypi"
|
||||
url = "https://pypi.org/simple"
|
||||
verify_ssl = true
|
||||
|
||||
[dev-packages]
|
||||
|
||||
[packages]
|
||||
mkdocs = "*"
|
||||
mkdocs-material = "*"
|
||||
mkdocs-markdownextradata-plugin = "*"
|
||||
|
||||
[requires]
|
||||
python_version = "3.7"
|
177
vendor/github.com/testcontainers/testcontainers-go/Pipfile.lock
generated
vendored
Normal file
177
vendor/github.com/testcontainers/testcontainers-go/Pipfile.lock
generated
vendored
Normal file
@ -0,0 +1,177 @@
|
||||
{
|
||||
"_meta": {
|
||||
"hash": {
|
||||
"sha256": "39d6d886946223291b5b9c8ee4769e8c9eec313f1e82a02a21dacc890d507fe3"
|
||||
},
|
||||
"pipfile-spec": 6,
|
||||
"requires": {
|
||||
"python_version": "3.7"
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
"name": "pypi",
|
||||
"url": "https://pypi.org/simple",
|
||||
"verify_ssl": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"default": {
|
||||
"click": {
|
||||
"hashes": [
|
||||
"sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a",
|
||||
"sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"
|
||||
],
|
||||
"version": "==7.1.2"
|
||||
},
|
||||
"importlib-metadata": {
|
||||
"hashes": [
|
||||
"sha256:2a688cbaa90e0cc587f1df48bdc97a6eadccdcd9c35fb3f976a09e3b5016d90f",
|
||||
"sha256:34513a8a0c4962bc66d35b359558fd8a5e10cd472d37aec5f66858addef32c1e"
|
||||
],
|
||||
"markers": "python_version < '3.8'",
|
||||
"version": "==1.6.0"
|
||||
},
|
||||
"jinja2": {
|
||||
"hashes": [
|
||||
"sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0",
|
||||
"sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"
|
||||
],
|
||||
"version": "==2.11.2"
|
||||
},
|
||||
"livereload": {
|
||||
"hashes": [
|
||||
"sha256:78d55f2c268a8823ba499305dcac64e28ddeb9a92571e12d543cd304faf5817b",
|
||||
"sha256:89254f78d7529d7ea0a3417d224c34287ebfe266b05e67e51facaf82c27f0f66"
|
||||
],
|
||||
"version": "==2.6.1"
|
||||
},
|
||||
"markdown": {
|
||||
"hashes": [
|
||||
"sha256:1fafe3f1ecabfb514a5285fca634a53c1b32a81cb0feb154264d55bf2ff22c17",
|
||||
"sha256:c467cd6233885534bf0fe96e62e3cf46cfc1605112356c4f9981512b8174de59"
|
||||
],
|
||||
"version": "==3.2.2"
|
||||
},
|
||||
"markupsafe": {
|
||||
"hashes": [
|
||||
"sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
|
||||
"sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
|
||||
"sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
|
||||
"sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
|
||||
"sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
|
||||
"sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
|
||||
"sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
|
||||
"sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
|
||||
"sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
|
||||
"sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
|
||||
"sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
|
||||
"sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
|
||||
"sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
|
||||
"sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
|
||||
"sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
|
||||
"sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
|
||||
"sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
|
||||
"sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
|
||||
"sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
|
||||
"sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
|
||||
"sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
|
||||
"sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
|
||||
"sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
|
||||
"sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
|
||||
"sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
|
||||
"sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
|
||||
"sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
|
||||
"sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
|
||||
"sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
|
||||
"sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
|
||||
"sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
|
||||
"sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
|
||||
"sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"
|
||||
],
|
||||
"version": "==1.1.1"
|
||||
},
|
||||
"mkdocs": {
|
||||
"hashes": [
|
||||
"sha256:17d34329aad75d5de604b9ed4e31df3a4d235afefdc46ce7b1964fddb2e1e939",
|
||||
"sha256:8cc8b38325456b9e942c981a209eaeb1e9f3f77b493ad755bfef889b9c8d356a"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==1.0.4"
|
||||
},
|
||||
"mkdocs-markdownextradata-plugin": {
|
||||
"hashes": [
|
||||
"sha256:64d1c966b288d653f51f7531c03204eb988d0d77e56055c9d703d99105259a36"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.0.5"
|
||||
},
|
||||
"mkdocs-material": {
|
||||
"hashes": [
|
||||
"sha256:524debb6ee8ee89cee08886f2a67c3c3875c0ee9579c598d7448cbd2607cd3b7",
|
||||
"sha256:62ae84082fa9f077c86b7db63e7bedf392005041b451defc850f8d0887a11e91"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==3.2.0"
|
||||
},
|
||||
"pygments": {
|
||||
"hashes": [
|
||||
"sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44",
|
||||
"sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"
|
||||
],
|
||||
"version": "==2.6.1"
|
||||
},
|
||||
"pymdown-extensions": {
|
||||
"hashes": [
|
||||
"sha256:5bf93d1ccd8281948cd7c559eb363e59b179b5373478e8a7195cf4b78e3c11b6",
|
||||
"sha256:8f415b21ee86d80bb2c3676f4478b274d0a8ccb13af672a4c86b9ffd22bd005c"
|
||||
],
|
||||
"version": "==7.1"
|
||||
},
|
||||
"pyyaml": {
|
||||
"hashes": [
|
||||
"sha256:1adecc22f88d38052fb787d959f003811ca858b799590a5eaa70e63dca50308c",
|
||||
"sha256:436bc774ecf7c103814098159fbb84c2715d25980175292c648f2da143909f95",
|
||||
"sha256:460a5a4248763f6f37ea225d19d5c205677d8d525f6a83357ca622ed541830c2",
|
||||
"sha256:5a22a9c84653debfbf198d02fe592c176ea548cccce47553f35f466e15cf2fd4",
|
||||
"sha256:7a5d3f26b89d688db27822343dfa25c599627bc92093e788956372285c6298ad",
|
||||
"sha256:9372b04a02080752d9e6f990179a4ab840227c6e2ce15b95e1278456664cf2ba",
|
||||
"sha256:a5dcbebee834eaddf3fa7366316b880ff4062e4bcc9787b78c7fbb4a26ff2dd1",
|
||||
"sha256:aee5bab92a176e7cd034e57f46e9df9a9862a71f8f37cad167c6fc74c65f5b4e",
|
||||
"sha256:c51f642898c0bacd335fc119da60baae0824f2cde95b0330b56c0553439f0673",
|
||||
"sha256:c68ea4d3ba1705da1e0d85da6684ac657912679a649e8868bd850d2c299cce13",
|
||||
"sha256:e23d0cc5299223dcc37885dae624f382297717e459ea24053709675a976a3e19"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==5.1"
|
||||
},
|
||||
"six": {
|
||||
"hashes": [
|
||||
"sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
|
||||
"sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
|
||||
],
|
||||
"version": "==1.14.0"
|
||||
},
|
||||
"tornado": {
|
||||
"hashes": [
|
||||
"sha256:0fe2d45ba43b00a41cd73f8be321a44936dc1aba233dee979f17a042b83eb6dc",
|
||||
"sha256:22aed82c2ea340c3771e3babc5ef220272f6fd06b5108a53b4976d0d722bcd52",
|
||||
"sha256:2c027eb2a393d964b22b5c154d1a23a5f8727db6fda837118a776b29e2b8ebc6",
|
||||
"sha256:5217e601700f24e966ddab689f90b7ea4bd91ff3357c3600fa1045e26d68e55d",
|
||||
"sha256:5618f72e947533832cbc3dec54e1dffc1747a5cb17d1fd91577ed14fa0dc081b",
|
||||
"sha256:5f6a07e62e799be5d2330e68d808c8ac41d4a259b9cea61da4101b83cb5dc673",
|
||||
"sha256:c58d56003daf1b616336781b26d184023ea4af13ae143d9dda65e31e534940b9",
|
||||
"sha256:c952975c8ba74f546ae6de2e226ab3cc3cc11ae47baf607459a6728585bb542a",
|
||||
"sha256:c98232a3ac391f5faea6821b53db8db461157baa788f5d6222a193e9456e1740"
|
||||
],
|
||||
"version": "==6.0.4"
|
||||
},
|
||||
"zipp": {
|
||||
"hashes": [
|
||||
"sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b",
|
||||
"sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"
|
||||
],
|
||||
"version": "==3.1.0"
|
||||
}
|
||||
},
|
||||
"develop": {}
|
||||
}
|
106
vendor/github.com/testcontainers/testcontainers-go/README.md
generated
vendored
106
vendor/github.com/testcontainers/testcontainers-go/README.md
generated
vendored
@ -1,7 +1,10 @@
|
||||
[](https://travis-ci.org/testcontainers/testcontainers-go)
|
||||
[](https://goreportcard.com/report/github.com/testcontainers/testcontainers-go)
|
||||
[](https://godoc.org/github.com/testcontainers/testcontainers-go)
|
||||
|
||||
|
||||
When I was working on a Zipkin PR I discovered a nice Java library called
|
||||
[testcontainers](https://www.testcontainers.org/).
|
||||
[Testcontainers](https://www.testcontainers.org/).
|
||||
|
||||
It provides an easy and clean API over the go docker sdk to run, terminate and
|
||||
connect to containers in your tests.
|
||||
@ -9,8 +12,7 @@ connect to containers in your tests.
|
||||
I found myself comfortable programmatically writing the containers I need to run
|
||||
an integration/smoke tests. So I started porting this library in Go.
|
||||
|
||||
|
||||
This is the API I have defined:
|
||||
This is an example:
|
||||
|
||||
```go
|
||||
package main
|
||||
@ -62,99 +64,7 @@ To clean your environment you can defer the container termination `defer
|
||||
nginxC.Terminate(ctx, t)`. `t` is `*testing.T` and it is used to notify is the
|
||||
`defer` failed marking the test as failed.
|
||||
|
||||
## Documentation
|
||||
|
||||
## Build from Dockerfile
|
||||
|
||||
Testcontainers-go gives you the ability to build an image and run a container from a Dockerfile.
|
||||
|
||||
You can do so by specifying a `Context` (the filepath to the build context on your local filesystem)
|
||||
and optionally a `Dockerfile` (defaults to "Dockerfile") like so:
|
||||
|
||||
```go
|
||||
req := ContainerRequest{
|
||||
FromDockerfile: testcontainers.FromDockerfile{
|
||||
Context: "/path/to/build/context",
|
||||
Dockerfile: "CustomDockerfile",
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
### Dynamic Build Context
|
||||
|
||||
If you would like to send a build context that you created in code (maybe you have a dynamic Dockerfile), you can
|
||||
send the build context as an `io.Reader` since the Docker Daemon accepts is as a tar file, you can use the [tar](https://golang.org/pkg/archive/tar/) package to create your context.
|
||||
|
||||
|
||||
To do this you would use the `ContextArchive` attribute in the `FromDockerfile` struct.
|
||||
|
||||
```go
|
||||
var buf bytes.Buffer
|
||||
tarWriter := tar.NewWriter(&buf)
|
||||
// ... add some files
|
||||
if err := tarWriter.Close(); err != nil {
|
||||
// do something with err
|
||||
}
|
||||
reader := bytes.NewReader(buf.Bytes())
|
||||
fromDockerfile := testcontainers.FromDockerfile{
|
||||
ContextArchive: reader,
|
||||
}
|
||||
```
|
||||
|
||||
**Please Note** if you specify a `ContextArchive` this will cause testcontainers to ignore the path passed
|
||||
in to `Context`
|
||||
|
||||
## Sending a CMD to a Container
|
||||
|
||||
If you would like to send a CMD (command) to a container, you can pass it in to the container request via the `Cmd` field...
|
||||
|
||||
```go
|
||||
req := ContainerRequest{
|
||||
Image: "alpine",
|
||||
WaitingFor: wait.ForAll(
|
||||
wait.ForLog("command override!"),
|
||||
),
|
||||
Cmd: []string{"echo", "command override!"},
|
||||
}
|
||||
```
|
||||
|
||||
## Following Container Logs
|
||||
|
||||
If you wish to follow container logs, you can set up `LogConsumer`s. The log following functionality follows
|
||||
a producer-consumer model. You will need to explicitly start and stop the producer. As logs are written to either
|
||||
`stdout`, or `stderr` (`stdin` is not supported) they will be forwarded (produced) to any associated `LogConsumer`s. You can associate `LogConsumer`s
|
||||
with the `.FollowOutput` function.
|
||||
|
||||
**Please note** if you start the producer you should always stop it explicitly.
|
||||
|
||||
for example, this consumer will just add logs to a slice
|
||||
|
||||
```go
|
||||
type TestLogConsumer struct {
|
||||
Msgs []string
|
||||
}
|
||||
|
||||
func (g *TestLogConsumer) Accept(l Log) {
|
||||
g.Msgs = append(g.Msgs, string(l.Content))
|
||||
}
|
||||
```
|
||||
|
||||
this can be used like so:
|
||||
```go
|
||||
g := TestLogConsumer{
|
||||
Msgs: []string{},
|
||||
}
|
||||
|
||||
err := c.StartLogProducer(ctx)
|
||||
if err != nil {
|
||||
// do something with err
|
||||
}
|
||||
|
||||
c.FollowOutput(&g)
|
||||
|
||||
// some stuff happens...
|
||||
|
||||
err = c.StopLogProducer()
|
||||
if err != nil {
|
||||
// do something with err
|
||||
}
|
||||
```
|
||||
The documentation lives in [./docs](./docs) and it is rendered at
|
||||
[golang.testcontainers.org](https://golang.testcontainers.org).
|
||||
|
269
vendor/github.com/testcontainers/testcontainers-go/compose.go
generated
vendored
Normal file
269
vendor/github.com/testcontainers/testcontainers-go/compose.go
generated
vendored
Normal file
@ -0,0 +1,269 @@
|
||||
package testcontainers
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
const (
|
||||
envProjectName = "COMPOSE_PROJECT_NAME"
|
||||
envComposeFile = "COMPOSE_FILE"
|
||||
)
|
||||
|
||||
// DockerCompose defines the contract for running Docker Compose
|
||||
type DockerCompose interface {
|
||||
Down() ExecError
|
||||
Invoke() ExecError
|
||||
WithCommand([]string) DockerCompose
|
||||
WithEnv(map[string]string) DockerCompose
|
||||
}
|
||||
|
||||
// LocalDockerCompose represents a Docker Compose execution using local binary
|
||||
// docker-compose or docker-compose.exe, depending on the underlying platform
|
||||
type LocalDockerCompose struct {
|
||||
Executable string
|
||||
ComposeFilePaths []string
|
||||
absComposeFilePaths []string
|
||||
Identifier string
|
||||
Cmd []string
|
||||
Env map[string]string
|
||||
Services map[string]interface{}
|
||||
}
|
||||
|
||||
// NewLocalDockerCompose returns an instance of the local Docker Compose, using an
|
||||
// array of Docker Compose file paths and an identifier for the Compose execution.
|
||||
//
|
||||
// It will iterate through the array adding '-f compose-file-path' flags to the local
|
||||
// Docker Compose execution. The identifier represents the name of the execution,
|
||||
// which will define the name of the underlying Docker network and the name of the
|
||||
// running Compose services.
|
||||
func NewLocalDockerCompose(filePaths []string, identifier string) *LocalDockerCompose {
|
||||
dc := &LocalDockerCompose{}
|
||||
|
||||
dc.Executable = "docker-compose"
|
||||
if runtime.GOOS == "windows" {
|
||||
dc.Executable = "docker-compose.exe"
|
||||
}
|
||||
|
||||
dc.ComposeFilePaths = filePaths
|
||||
|
||||
dc.absComposeFilePaths = make([]string, len(filePaths))
|
||||
for i, cfp := range dc.ComposeFilePaths {
|
||||
abs, _ := filepath.Abs(cfp)
|
||||
dc.absComposeFilePaths[i] = abs
|
||||
}
|
||||
|
||||
dc.validate()
|
||||
|
||||
dc.Identifier = strings.ToLower(identifier)
|
||||
|
||||
return dc
|
||||
}
|
||||
|
||||
// Down executes docker-compose down
|
||||
func (dc *LocalDockerCompose) Down() ExecError {
|
||||
return executeCompose(dc, []string{"down"})
|
||||
}
|
||||
|
||||
func (dc *LocalDockerCompose) getDockerComposeEnvironment() map[string]string {
|
||||
environment := map[string]string{}
|
||||
|
||||
composeFileEnvVariableValue := ""
|
||||
for _, abs := range dc.absComposeFilePaths {
|
||||
composeFileEnvVariableValue += abs + string(os.PathListSeparator)
|
||||
}
|
||||
|
||||
environment[envProjectName] = dc.Identifier
|
||||
environment[envComposeFile] = composeFileEnvVariableValue
|
||||
|
||||
return environment
|
||||
}
|
||||
|
||||
// Invoke invokes the docker compose
|
||||
func (dc *LocalDockerCompose) Invoke() ExecError {
|
||||
return executeCompose(dc, dc.Cmd)
|
||||
}
|
||||
|
||||
// WithCommand assigns the command
|
||||
func (dc *LocalDockerCompose) WithCommand(cmd []string) DockerCompose {
|
||||
dc.Cmd = cmd
|
||||
return dc
|
||||
}
|
||||
|
||||
// WithEnv assigns the environment
|
||||
func (dc *LocalDockerCompose) WithEnv(env map[string]string) DockerCompose {
|
||||
dc.Env = env
|
||||
return dc
|
||||
}
|
||||
|
||||
// validate checks if the files to be run in the compose are valid YAML files, setting up
|
||||
// references to all services in them
|
||||
func (dc *LocalDockerCompose) validate() error {
|
||||
type compose struct {
|
||||
Services map[string]interface{}
|
||||
}
|
||||
|
||||
for _, abs := range dc.absComposeFilePaths {
|
||||
c := compose{}
|
||||
|
||||
yamlFile, err := ioutil.ReadFile(abs)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = yaml.Unmarshal(yamlFile, &c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
dc.Services = c.Services
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// ExecError is super struct that holds any information about an execution error, so the client code
|
||||
// can handle the result
|
||||
type ExecError struct {
|
||||
Command []string
|
||||
Error error
|
||||
Stdout error
|
||||
Stderr error
|
||||
}
|
||||
|
||||
// execute executes a program with arguments and environment variables inside a specific directory
|
||||
func execute(
|
||||
dirContext string, environment map[string]string, binary string, args []string) ExecError {
|
||||
|
||||
var errStdout, errStderr error
|
||||
|
||||
cmd := exec.Command(binary, args...)
|
||||
cmd.Dir = dirContext
|
||||
cmd.Env = os.Environ()
|
||||
|
||||
for key, value := range environment {
|
||||
cmd.Env = append(cmd.Env, key+"="+value)
|
||||
}
|
||||
|
||||
stdoutIn, _ := cmd.StdoutPipe()
|
||||
stderrIn, _ := cmd.StderrPipe()
|
||||
|
||||
stdout := newCapturingPassThroughWriter(os.Stdout)
|
||||
stderr := newCapturingPassThroughWriter(os.Stderr)
|
||||
|
||||
err := cmd.Start()
|
||||
if err != nil {
|
||||
execCmd := []string{"Starting command", dirContext, binary}
|
||||
execCmd = append(execCmd, args...)
|
||||
|
||||
return ExecError{
|
||||
// add information about the CMD and arguments used
|
||||
Command: execCmd,
|
||||
Error: err,
|
||||
Stderr: errStderr,
|
||||
Stdout: errStdout,
|
||||
}
|
||||
}
|
||||
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(1)
|
||||
|
||||
go func() {
|
||||
_, errStdout = io.Copy(stdout, stdoutIn)
|
||||
wg.Done()
|
||||
}()
|
||||
|
||||
_, errStderr = io.Copy(stderr, stderrIn)
|
||||
wg.Wait()
|
||||
|
||||
err = cmd.Wait()
|
||||
|
||||
execCmd := []string{"Reading std", dirContext, binary}
|
||||
execCmd = append(execCmd, args...)
|
||||
|
||||
return ExecError{
|
||||
Command: execCmd,
|
||||
Error: err,
|
||||
Stderr: errStderr,
|
||||
Stdout: errStdout,
|
||||
}
|
||||
}
|
||||
|
||||
func executeCompose(dc *LocalDockerCompose, args []string) ExecError {
|
||||
if which(dc.Executable) != nil {
|
||||
return ExecError{
|
||||
Command: []string{dc.Executable},
|
||||
Error: fmt.Errorf("Local Docker Compose not found. Is %s on the PATH?", dc.Executable),
|
||||
}
|
||||
}
|
||||
|
||||
environment := dc.getDockerComposeEnvironment()
|
||||
for k, v := range dc.Env {
|
||||
environment[k] = v
|
||||
}
|
||||
|
||||
cmds := []string{}
|
||||
pwd := "."
|
||||
if len(dc.absComposeFilePaths) > 0 {
|
||||
pwd, _ = filepath.Split(dc.absComposeFilePaths[0])
|
||||
|
||||
for _, abs := range dc.absComposeFilePaths {
|
||||
cmds = append(cmds, "-f", abs)
|
||||
}
|
||||
} else {
|
||||
cmds = append(cmds, "-f", "docker-compose.yml")
|
||||
}
|
||||
cmds = append(cmds, args...)
|
||||
|
||||
execErr := execute(pwd, environment, dc.Executable, cmds)
|
||||
err := execErr.Error
|
||||
if err != nil {
|
||||
args := strings.Join(dc.Cmd, " ")
|
||||
return ExecError{
|
||||
Command: []string{dc.Executable},
|
||||
Error: fmt.Errorf("Local Docker compose exited abnormally whilst running %s: [%v]. %s", dc.Executable, args, err.Error()),
|
||||
}
|
||||
}
|
||||
|
||||
return execErr
|
||||
}
|
||||
|
||||
// capturingPassThroughWriter is a writer that remembers
|
||||
// data written to it and passes it to w
|
||||
type capturingPassThroughWriter struct {
|
||||
buf bytes.Buffer
|
||||
w io.Writer
|
||||
}
|
||||
|
||||
// newCapturingPassThroughWriter creates new capturingPassThroughWriter
|
||||
func newCapturingPassThroughWriter(w io.Writer) *capturingPassThroughWriter {
|
||||
return &capturingPassThroughWriter{
|
||||
w: w,
|
||||
}
|
||||
}
|
||||
|
||||
func (w *capturingPassThroughWriter) Write(d []byte) (int, error) {
|
||||
w.buf.Write(d)
|
||||
return w.w.Write(d)
|
||||
}
|
||||
|
||||
// Bytes returns bytes written to the writer
|
||||
func (w *capturingPassThroughWriter) Bytes() []byte {
|
||||
return w.buf.Bytes()
|
||||
}
|
||||
|
||||
// Which checks if a binary is present in PATH
|
||||
func which(binary string) error {
|
||||
_, err := exec.LookPath(binary)
|
||||
|
||||
return err
|
||||
}
|
44
vendor/github.com/testcontainers/testcontainers-go/container.go
generated
vendored
44
vendor/github.com/testcontainers/testcontainers-go/container.go
generated
vendored
@ -2,12 +2,14 @@ package testcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/docker/docker/api/types/container"
|
||||
"io"
|
||||
|
||||
"github.com/docker/docker/api/types/container"
|
||||
|
||||
"github.com/docker/docker/pkg/archive"
|
||||
"github.com/docker/go-connections/nat"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/testcontainers/testcontainers-go/wait"
|
||||
)
|
||||
|
||||
@ -24,6 +26,7 @@ type DeprecatedContainer interface {
|
||||
type ContainerProvider interface {
|
||||
CreateContainer(context.Context, ContainerRequest) (Container, error) // create a container without starting it
|
||||
RunContainer(context.Context, ContainerRequest) (Container, error) // create a container and start it
|
||||
Health(context.Context) error
|
||||
}
|
||||
|
||||
// Container allows getting info about and controlling a single container instance
|
||||
@ -45,6 +48,7 @@ type Container interface {
|
||||
Networks(context.Context) ([]string, error) // get container networks
|
||||
NetworkAliases(context.Context) (map[string][]string, error) // get container network aliases for a network
|
||||
Exec(ctx context.Context, cmd []string) (int, error)
|
||||
ContainerIP(context.Context) (string, error) // get container ip
|
||||
}
|
||||
|
||||
// ImageBuildInfo defines what is needed to build an image
|
||||
@ -65,24 +69,26 @@ type FromDockerfile struct {
|
||||
// ContainerRequest represents the parameters used to get a running container
|
||||
type ContainerRequest struct {
|
||||
FromDockerfile
|
||||
Image string
|
||||
Env map[string]string
|
||||
ExposedPorts []string // allow specifying protocol info
|
||||
Cmd []string
|
||||
Labels map[string]string
|
||||
BindMounts map[string]string
|
||||
VolumeMounts map[string]string
|
||||
Tmpfs map[string]string
|
||||
RegistryCred string
|
||||
WaitingFor wait.Strategy
|
||||
Name string // for specifying container name
|
||||
Privileged bool // for starting privileged container
|
||||
Networks []string // for specifying network names
|
||||
NetworkAliases map[string][]string // for specifying network aliases
|
||||
SkipReaper bool // indicates whether we skip setting up a reaper for this
|
||||
ReaperImage string // alternative reaper image
|
||||
AutoRemove bool // if set to true, the container will be removed from the host when stopped
|
||||
NetworkMode container.NetworkMode
|
||||
Image string
|
||||
Entrypoint []string
|
||||
Env map[string]string
|
||||
ExposedPorts []string // allow specifying protocol info
|
||||
Cmd []string
|
||||
Labels map[string]string
|
||||
BindMounts map[string]string
|
||||
VolumeMounts map[string]string
|
||||
Tmpfs map[string]string
|
||||
RegistryCred string
|
||||
WaitingFor wait.Strategy
|
||||
Name string // for specifying container name
|
||||
Privileged bool // for starting privileged container
|
||||
Networks []string // for specifying network names
|
||||
NetworkAliases map[string][]string // for specifying network aliases
|
||||
SkipReaper bool // indicates whether we skip setting up a reaper for this
|
||||
ReaperImage string // alternative reaper image
|
||||
AutoRemove bool // if set to true, the container will be removed from the host when stopped
|
||||
NetworkMode container.NetworkMode
|
||||
AlwaysPullImage bool // Always pull image
|
||||
}
|
||||
|
||||
// ProviderType is an enum for the possible providers
|
||||
|
103
vendor/github.com/testcontainers/testcontainers-go/docker.go
generated
vendored
103
vendor/github.com/testcontainers/testcontainers-go/docker.go
generated
vendored
@ -15,6 +15,8 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/cenkalti/backoff"
|
||||
"github.com/docker/docker/errdefs"
|
||||
|
||||
"github.com/docker/docker/api/types"
|
||||
"github.com/docker/docker/api/types/container"
|
||||
"github.com/docker/docker/api/types/mount"
|
||||
@ -22,8 +24,8 @@ import (
|
||||
"github.com/docker/docker/client"
|
||||
"github.com/docker/go-connections/nat"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/pkg/errors"
|
||||
uuid "github.com/satori/go.uuid"
|
||||
|
||||
"github.com/testcontainers/testcontainers-go/wait"
|
||||
)
|
||||
@ -241,6 +243,16 @@ func (c *DockerContainer) Networks(ctx context.Context) ([]string, error) {
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// ContainerIP gets the IP address of the primary network within the container.
|
||||
func (c *DockerContainer) ContainerIP(ctx context.Context) (string, error) {
|
||||
inspect, err := c.inspectContainer(ctx)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return inspect.NetworkSettings.IPAddress, nil
|
||||
}
|
||||
|
||||
// NetworkAliases gets the aliases of the container for the networks it is attached to.
|
||||
func (c *DockerContainer) NetworkAliases(ctx context.Context) (map[string][]string, error) {
|
||||
inspect, err := c.inspectContainer(ctx)
|
||||
@ -382,11 +394,9 @@ type DockerNetwork struct {
|
||||
}
|
||||
|
||||
// Remove is used to remove the network. It is usually triggered by as defer function.
|
||||
func (n *DockerNetwork) Remove(_ context.Context) error {
|
||||
if n.terminationSignal != nil {
|
||||
n.terminationSignal <- true
|
||||
}
|
||||
return nil
|
||||
func (n *DockerNetwork) Remove(ctx context.Context) error {
|
||||
|
||||
return n.provider.client.NetworkRemove(ctx, n.ID)
|
||||
}
|
||||
|
||||
// DockerProvider implements the ContainerProvider interface
|
||||
@ -412,8 +422,8 @@ func NewDockerProvider() (*DockerProvider, error) {
|
||||
|
||||
// BuildImage will build and image from context and Dockerfile, then return the tag
|
||||
func (p *DockerProvider) BuildImage(ctx context.Context, img ImageBuildInfo) (string, error) {
|
||||
repo := uuid.NewV4()
|
||||
tag := uuid.NewV4()
|
||||
repo := uuid.New()
|
||||
tag := uuid.New()
|
||||
|
||||
repoTag := fmt.Sprintf("%s:%s", repo, tag)
|
||||
|
||||
@ -462,7 +472,7 @@ func (p *DockerProvider) CreateContainer(ctx context.Context, req ContainerReque
|
||||
req.Labels = make(map[string]string)
|
||||
}
|
||||
|
||||
sessionID := uuid.NewV4()
|
||||
sessionID := uuid.New()
|
||||
|
||||
var termSignal chan bool
|
||||
if !req.SkipReaper {
|
||||
@ -493,36 +503,35 @@ func (p *DockerProvider) CreateContainer(ctx context.Context, req ContainerReque
|
||||
}
|
||||
} else {
|
||||
tag = req.Image
|
||||
_, _, err = p.client.ImageInspectWithRaw(ctx, tag)
|
||||
if err != nil {
|
||||
if client.IsErrNotFound(err) {
|
||||
pullOpt := types.ImagePullOptions{}
|
||||
if req.RegistryCred != "" {
|
||||
pullOpt.RegistryAuth = req.RegistryCred
|
||||
}
|
||||
var pull io.ReadCloser
|
||||
err := backoff.Retry(func() error {
|
||||
var err error
|
||||
pull, err = p.client.ImagePull(ctx, tag, pullOpt)
|
||||
return err
|
||||
}, backoff.NewExponentialBackOff())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer pull.Close()
|
||||
var shouldPullImage bool
|
||||
|
||||
// download of docker image finishes at EOF of the pull request
|
||||
_, err = ioutil.ReadAll(pull)
|
||||
if err != nil {
|
||||
if req.AlwaysPullImage {
|
||||
shouldPullImage = true // If requested always attempt to pull image
|
||||
} else {
|
||||
_, _, err = p.client.ImageInspectWithRaw(ctx, tag)
|
||||
if err != nil {
|
||||
if client.IsErrNotFound(err) {
|
||||
shouldPullImage = true
|
||||
} else {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
}
|
||||
}
|
||||
|
||||
if shouldPullImage {
|
||||
pullOpt := types.ImagePullOptions{}
|
||||
if req.RegistryCred != "" {
|
||||
pullOpt.RegistryAuth = req.RegistryCred
|
||||
}
|
||||
|
||||
if err := p.attemptToPullImage(ctx, tag, pullOpt); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dockerInput := &container.Config{
|
||||
Entrypoint: req.Entrypoint,
|
||||
Image: tag,
|
||||
Env: env,
|
||||
ExposedPorts: exposedPortSet,
|
||||
@ -592,6 +601,37 @@ func (p *DockerProvider) CreateContainer(ctx context.Context, req ContainerReque
|
||||
return c, nil
|
||||
}
|
||||
|
||||
// attemptToPullImage tries to pull the image while respecting the ctx cancellations.
|
||||
// Besides, if the image cannot be pulled due to ErrorNotFound then no need to retry but terminate immediately.
|
||||
func (p *DockerProvider) attemptToPullImage(ctx context.Context, tag string, pullOpt types.ImagePullOptions) error {
|
||||
var (
|
||||
err error
|
||||
pull io.ReadCloser
|
||||
)
|
||||
err = backoff.Retry(func() error {
|
||||
pull, err = p.client.ImagePull(ctx, tag, pullOpt)
|
||||
if _, ok := err.(errdefs.ErrNotFound); ok {
|
||||
return backoff.Permanent(err)
|
||||
}
|
||||
return err
|
||||
}, backoff.WithContext(backoff.NewExponentialBackOff(), ctx))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer pull.Close()
|
||||
|
||||
// download of docker image finishes at EOF of the pull request
|
||||
_, err = ioutil.ReadAll(pull)
|
||||
return err
|
||||
}
|
||||
|
||||
// Helth measure the healthiness of the provider. Right now we leverage the
|
||||
// docker-client ping endpoint to see if the daemon is reachable.
|
||||
func (p *DockerProvider) Health(ctx context.Context) (err error) {
|
||||
_, err = p.client.Ping(ctx)
|
||||
return
|
||||
}
|
||||
|
||||
// RunContainer takes a RequestContainer as input and it runs a container via the docker sdk
|
||||
func (p *DockerProvider) RunContainer(ctx context.Context, req ContainerRequest) (Container, error) {
|
||||
c, err := p.CreateContainer(ctx, req)
|
||||
@ -661,7 +701,7 @@ func (p *DockerProvider) CreateNetwork(ctx context.Context, req NetworkRequest)
|
||||
Labels: req.Labels,
|
||||
}
|
||||
|
||||
sessionID := uuid.NewV4()
|
||||
sessionID := uuid.New()
|
||||
|
||||
var termSignal chan bool
|
||||
if !req.SkipReaper {
|
||||
@ -690,6 +730,7 @@ func (p *DockerProvider) CreateNetwork(ctx context.Context, req NetworkRequest)
|
||||
Driver: req.Driver,
|
||||
Name: req.Name,
|
||||
terminationSignal: termSignal,
|
||||
provider: p,
|
||||
}
|
||||
|
||||
return n, nil
|
||||
|
20
vendor/github.com/testcontainers/testcontainers-go/generic.go
generated
vendored
20
vendor/github.com/testcontainers/testcontainers-go/generic.go
generated
vendored
@ -13,6 +13,26 @@ type GenericContainerRequest struct {
|
||||
ProviderType ProviderType // which provider to use, Docker if empty
|
||||
}
|
||||
|
||||
// GenericNetworkRequest represents parameters to a generic network
|
||||
type GenericNetworkRequest struct {
|
||||
NetworkRequest // embedded request for provider
|
||||
ProviderType ProviderType // which provider to use, Docker if empty
|
||||
}
|
||||
|
||||
// GenericNetwork creates a generic network with parameters
|
||||
func GenericNetwork(ctx context.Context, req GenericNetworkRequest) (Network, error) {
|
||||
provider, err := req.ProviderType.GetProvider()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
network, err := provider.CreateNetwork(ctx, req.NetworkRequest)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to create network")
|
||||
}
|
||||
|
||||
return network, nil
|
||||
}
|
||||
|
||||
// GenericContainer creates a generic container with parameters
|
||||
func GenericContainer(ctx context.Context, req GenericContainerRequest) (Container, error) {
|
||||
provider, err := req.ProviderType.GetProvider()
|
||||
|
15
vendor/github.com/testcontainers/testcontainers-go/go.mod
generated
vendored
15
vendor/github.com/testcontainers/testcontainers-go/go.mod
generated
vendored
@ -1,6 +1,6 @@
|
||||
module github.com/testcontainers/testcontainers-go
|
||||
|
||||
replace github.com/docker/docker => github.com/docker/engine v0.0.0-20190717161051-705d9623b7c1
|
||||
go 1.13
|
||||
|
||||
require (
|
||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect
|
||||
@ -8,14 +8,15 @@ require (
|
||||
github.com/Microsoft/hcsshim v0.8.6 // indirect
|
||||
github.com/cenkalti/backoff v2.2.1+incompatible
|
||||
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc // indirect
|
||||
github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible // indirect
|
||||
github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible
|
||||
github.com/docker/docker v0.7.3-0.20190506211059-b20a14b54661
|
||||
github.com/docker/go-connections v0.4.0
|
||||
github.com/docker/go-units v0.3.3 // indirect
|
||||
github.com/gin-gonic/gin v1.5.0
|
||||
github.com/go-redis/redis v6.15.7+incompatible
|
||||
github.com/gin-gonic/gin v1.6.3
|
||||
github.com/go-redis/redis v6.15.8+incompatible
|
||||
github.com/go-sql-driver/mysql v1.5.0
|
||||
github.com/gogo/protobuf v1.2.0 // indirect
|
||||
github.com/google/uuid v1.1.1
|
||||
github.com/gorilla/context v1.1.1 // indirect
|
||||
github.com/gorilla/mux v1.6.2 // indirect
|
||||
github.com/kr/pretty v0.1.0 // indirect
|
||||
@ -26,12 +27,14 @@ require (
|
||||
github.com/opencontainers/image-spec v1.0.1 // indirect
|
||||
github.com/opencontainers/runc v0.1.1 // indirect
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/satori/go.uuid v1.2.0
|
||||
github.com/sirupsen/logrus v1.2.0 // indirect
|
||||
github.com/stretchr/testify v1.6.1
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c // indirect
|
||||
google.golang.org/grpc v1.17.0 // indirect
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
|
||||
gopkg.in/yaml.v2 v2.3.0
|
||||
gotest.tools v0.0.0-20181223230014-1083505acf35
|
||||
)
|
||||
|
||||
go 1.13
|
||||
replace github.com/docker/docker => github.com/docker/engine v0.0.0-20190717161051-705d9623b7c1
|
||||
|
75
vendor/github.com/testcontainers/testcontainers-go/go.sum
generated
vendored
75
vendor/github.com/testcontainers/testcontainers-go/go.sum
generated
vendored
@ -25,18 +25,22 @@ github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||
github.com/gin-gonic/gin v1.5.0 h1:fi+bqFAx/oLK54somfCtEZs9HeH1LHVoEPUgARpTqyc=
|
||||
github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do=
|
||||
github.com/go-playground/locales v0.12.1 h1:2FITxuFt/xuCNP1Acdhv62OzaCiviiE4kotfhkmOqEc=
|
||||
github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM=
|
||||
github.com/go-playground/universal-translator v0.16.0 h1:X++omBR/4cE2MNg91AoC3rmGrCjJ8eAeUP/K/EKx4DM=
|
||||
github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY=
|
||||
github.com/go-redis/redis v6.15.6+incompatible h1:H9evprGPLI8+ci7fxQx6WNZHJSb7be8FqJQRhdQZ5Sg=
|
||||
github.com/go-redis/redis v6.15.6+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
|
||||
github.com/gin-gonic/gin v1.6.2 h1:88crIK23zO6TqlQBt+f9FrPJNKm9ZEr7qjp9vl/d5TM=
|
||||
github.com/gin-gonic/gin v1.6.2/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
|
||||
github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
|
||||
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
|
||||
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
|
||||
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
|
||||
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
|
||||
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
|
||||
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
|
||||
github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY=
|
||||
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
|
||||
github.com/go-redis/redis v6.15.7+incompatible h1:3skhDh95XQMpnqeqNftPkQD9jL9e5e36z/1SUm6dy1U=
|
||||
github.com/go-redis/redis v6.15.7+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
|
||||
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
|
||||
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||
github.com/go-redis/redis v6.15.8+incompatible h1:BKZuG6mCnRj5AOaWJXoCgf6rqTYnYJLe4en2hxT7r9o=
|
||||
github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
|
||||
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
|
||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/gogo/protobuf v1.2.0 h1:xU6/SpYbvkNYiptHJYEDRseDLvYE7wSqhYYNy0QSUzI=
|
||||
@ -45,18 +49,21 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
||||
github.com/golang/protobuf v1.2.0/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.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
|
||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
|
||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||
github.com/gorilla/mux v1.6.2 h1:Pgr17XVTNXAk3q/r4CpKzC5xBM/qW1uVLV+IhRZpIIk=
|
||||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
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/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=
|
||||
@ -65,11 +72,13 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
|
||||
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/leodido/go-urn v1.1.0 h1:Sm1gr51B1kKyfD2BlRcLSiEkffoG96g6TPv6eRoEiB8=
|
||||
github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
|
||||
github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg=
|
||||
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
|
||||
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
|
||||
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
|
||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c h1:nXxl5PrvVm2L/wCy8dQu6DMTwH4oIuGN8GJDAlqDdVE=
|
||||
github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
|
||||
@ -86,25 +95,27 @@ github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJ
|
||||
github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
||||
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
|
||||
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.0 h1:J8lpUdobwIeCI7OiSxHqEwJUKvJwicL5+3v1oe2Yb4k=
|
||||
github.com/pkg/errors v0.9.0/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/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
|
||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||
github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.6.0 h1:jlIyCplCJFULU/01vCkhKuTyc3OorI3bJFuw6obfgho=
|
||||
github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
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/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
|
||||
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
|
||||
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
|
||||
@ -122,16 +133,17 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ
|
||||
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-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb h1:pf3XwC90UUdNPYWZdFjhGBE7DUFuK3Ct1zWmZ65QN30=
|
||||
golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ=
|
||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg=
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/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.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 h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180810170437-e96c4e24768d/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
|
||||
@ -143,15 +155,18 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
|
||||
gopkg.in/go-playground/validator.v9 v9.29.1 h1:SvGtYmN60a5CVKTOzMSyfzWDeZRxRuGvRQyEAKbw1xc=
|
||||
gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
|
||||
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.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gotest.tools v0.0.0-20181223230014-1083505acf35 h1:zpdCK+REwbk+rqjJmHhiCN6iBIigrZ39glqSF0P3KF0=
|
||||
gotest.tools v0.0.0-20181223230014-1083505acf35/go.mod h1:R//lfYlUuTOTfblYI3lGoAAAebUdzjvbmQsuB7Ykd90=
|
||||
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
|
39
vendor/github.com/testcontainers/testcontainers-go/mkdocs.yml
generated
vendored
Normal file
39
vendor/github.com/testcontainers/testcontainers-go/mkdocs.yml
generated
vendored
Normal file
@ -0,0 +1,39 @@
|
||||
site_name: Testcontainers-Go
|
||||
plugins:
|
||||
- search
|
||||
- markdownextradata
|
||||
theme:
|
||||
name: 'material'
|
||||
palette:
|
||||
primary: 'blue'
|
||||
accent: 'teal'
|
||||
font: false
|
||||
logo: 'logo.svg'
|
||||
favicon: 'favicon.ico'
|
||||
extra_css:
|
||||
- 'css/extra.css'
|
||||
repo_name: 'testcontainers-go'
|
||||
repo_url: 'https://github.com/testcontainers/testcontainers-go'
|
||||
markdown_extensions:
|
||||
- admonition
|
||||
- codehilite:
|
||||
linenums: False
|
||||
- pymdownx.superfences
|
||||
- pymdownx.snippets
|
||||
nav:
|
||||
- Home: index.md
|
||||
- Quickstart:
|
||||
- quickstart/gotest.md
|
||||
- Features:
|
||||
- features/creating_container.md
|
||||
- features/garbage_collector.md
|
||||
- features/build_from_dockerfile.md
|
||||
- features/docker_compose.md
|
||||
- features/follow_logs.md
|
||||
- features/override_container_command.md
|
||||
- Contributing:
|
||||
- contributing.md
|
||||
- contributing_docs.md
|
||||
- Getting help: getting_help.md
|
||||
extra:
|
||||
latest_version: 1.14.1
|
25
vendor/github.com/testcontainers/testcontainers-go/reaper.go
generated
vendored
25
vendor/github.com/testcontainers/testcontainers-go/reaper.go
generated
vendored
@ -4,8 +4,11 @@ import (
|
||||
"bufio"
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/docker/go-connections/nat"
|
||||
"github.com/testcontainers/testcontainers-go/wait"
|
||||
"net"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
@ -19,6 +22,9 @@ const (
|
||||
ReaperDefaultImage = "quay.io/testcontainers/ryuk:0.2.3"
|
||||
)
|
||||
|
||||
var reaper *Reaper // We would like to create reaper only once
|
||||
var mutex sync.Mutex
|
||||
|
||||
// ReaperProvider represents a provider for the reaper to run itself with
|
||||
// The ContainerProvider interface should usually satisfy this as well, so it is pluggable
|
||||
type ReaperProvider interface {
|
||||
@ -34,16 +40,24 @@ type Reaper struct {
|
||||
|
||||
// NewReaper creates a Reaper with a sessionID to identify containers and a provider to use
|
||||
func NewReaper(ctx context.Context, sessionID string, provider ReaperProvider, reaperImageName string) (*Reaper, error) {
|
||||
r := &Reaper{
|
||||
mutex.Lock()
|
||||
defer mutex.Unlock()
|
||||
// If reaper already exists re-use it
|
||||
if reaper != nil {
|
||||
return reaper, nil
|
||||
}
|
||||
|
||||
// Otherwise create a new one
|
||||
reaper = &Reaper{
|
||||
Provider: provider,
|
||||
SessionID: sessionID,
|
||||
}
|
||||
|
||||
// TODO: reuse reaper if there already is one
|
||||
listeningPort := nat.Port("8080/tcp")
|
||||
|
||||
req := ContainerRequest{
|
||||
Image: reaperImage(reaperImageName),
|
||||
ExposedPorts: []string{"8080"},
|
||||
ExposedPorts: []string{string(listeningPort)},
|
||||
Labels: map[string]string{
|
||||
TestcontainerLabel: "true",
|
||||
TestcontainerLabelIsReaper: "true",
|
||||
@ -53,6 +67,7 @@ func NewReaper(ctx context.Context, sessionID string, provider ReaperProvider, r
|
||||
"/var/run/docker.sock": "/var/run/docker.sock",
|
||||
},
|
||||
AutoRemove: true,
|
||||
WaitingFor: wait.ForListeningPort(listeningPort),
|
||||
}
|
||||
|
||||
c, err := provider.RunContainer(ctx, req)
|
||||
@ -64,9 +79,9 @@ func NewReaper(ctx context.Context, sessionID string, provider ReaperProvider, r
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
r.Endpoint = endpoint
|
||||
reaper.Endpoint = endpoint
|
||||
|
||||
return r, nil
|
||||
return reaper, nil
|
||||
}
|
||||
|
||||
func reaperImage(reaperImageName string) string {
|
||||
|
4
vendor/github.com/testcontainers/testcontainers-go/requirements.txt
generated
vendored
Normal file
4
vendor/github.com/testcontainers/testcontainers-go/requirements.txt
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
mkdocs==1.0.4
|
||||
mkdocs-material==4.6.0
|
||||
mkdocs-markdownextradata-plugin==0.1.1
|
||||
markdown>=3.1,<3.2
|
1
vendor/github.com/testcontainers/testcontainers-go/runtime.txt
generated
vendored
Normal file
1
vendor/github.com/testcontainers/testcontainers-go/runtime.txt
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
3.7
|
22
vendor/github.com/testcontainers/testcontainers-go/testing.go
generated
vendored
Normal file
22
vendor/github.com/testcontainers/testcontainers-go/testing.go
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
package testcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// SkipIfProviderIsNotHealthy is a utility function capable of skipping tests
|
||||
// if the provider is not healthy, or running at all.
|
||||
// This is a function designed to be used in your test, when Docker is not mandatory for CI/CD.
|
||||
// In this way tests that depend on testcontainers won't run if the provider is provisioned correctly.
|
||||
func SkipIfProviderIsNotHealthy(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
provider, err := ProviderDocker.GetProvider()
|
||||
if err != nil {
|
||||
t.Skipf("Docker is not running. TestContainers can't perform is work without it: %s", err)
|
||||
}
|
||||
err = provider.Health(ctx)
|
||||
if err != nil {
|
||||
t.Skipf("Docker is not running. TestContainers can't perform is work without it: %s", err)
|
||||
}
|
||||
}
|
9
vendor/github.com/testcontainers/testcontainers-go/wait/errors.go
generated
vendored
Normal file
9
vendor/github.com/testcontainers/testcontainers-go/wait/errors.go
generated
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
// +build !windows
|
||||
|
||||
package wait
|
||||
|
||||
import "syscall"
|
||||
|
||||
func isConnRefusedErr(err error) bool {
|
||||
return err == syscall.ECONNREFUSED
|
||||
}
|
9
vendor/github.com/testcontainers/testcontainers-go/wait/errors_windows.go
generated
vendored
Normal file
9
vendor/github.com/testcontainers/testcontainers-go/wait/errors_windows.go
generated
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
package wait
|
||||
|
||||
import (
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
func isConnRefusedErr(err error) bool {
|
||||
return err == windows.WSAECONNREFUSED
|
||||
}
|
6
vendor/github.com/testcontainers/testcontainers-go/wait/host_port.go
generated
vendored
6
vendor/github.com/testcontainers/testcontainers-go/wait/host_port.go
generated
vendored
@ -6,7 +6,6 @@ import (
|
||||
"net"
|
||||
"os"
|
||||
"strconv"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
@ -74,7 +73,7 @@ func (hp *HostPortStrategy) WaitUntilReady(ctx context.Context, target StrategyT
|
||||
if err != nil {
|
||||
if v, ok := err.(*net.OpError); ok {
|
||||
if v2, ok := (v.Err).(*os.SyscallError); ok {
|
||||
if v2.Err == syscall.ECONNREFUSED && ctx.Err() == nil {
|
||||
if isConnRefusedErr(v2.Err) {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
continue
|
||||
}
|
||||
@ -90,6 +89,9 @@ func (hp *HostPortStrategy) WaitUntilReady(ctx context.Context, target StrategyT
|
||||
//internal check
|
||||
command := buildInternalCheckCommand(hp.Port.Int())
|
||||
for {
|
||||
if ctx.Err() != nil {
|
||||
return ctx.Err()
|
||||
}
|
||||
exitCode, err := target.Exec(ctx, []string{"/bin/sh", "-c", command})
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "host port waiting failed")
|
||||
|
15
vendor/github.com/testcontainers/testcontainers-go/wait/sql.go
generated
vendored
15
vendor/github.com/testcontainers/testcontainers-go/wait/sql.go
generated
vendored
@ -4,16 +4,18 @@ import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"github.com/docker/go-connections/nat"
|
||||
"time"
|
||||
|
||||
"github.com/docker/go-connections/nat"
|
||||
)
|
||||
|
||||
//ForSQL constructs a new waitForSql strategy for the given driver
|
||||
func ForSQL(port nat.Port, driver string, url func(nat.Port) string) *waitForSql {
|
||||
return &waitForSql{
|
||||
Port: port,
|
||||
URL: url,
|
||||
Driver: driver,
|
||||
Port: port,
|
||||
URL: url,
|
||||
Driver: driver,
|
||||
startupTimeout: defaultStartupTimeout(),
|
||||
}
|
||||
}
|
||||
|
||||
@ -31,11 +33,8 @@ func (w *waitForSql) Timeout(duration time.Duration) *waitForSql {
|
||||
}
|
||||
|
||||
//WaitUntilReady repeatedly tries to run "SELECT 1" query on the given port using sql and driver.
|
||||
// If the it doesn't succeed until the timeout value which defaults to 10 seconds, it will return an error
|
||||
// If the it doesn't succeed until the timeout value which defaults to 60 seconds, it will return an error
|
||||
func (w *waitForSql) WaitUntilReady(ctx context.Context, target StrategyTarget) (err error) {
|
||||
if w.startupTimeout == 0 {
|
||||
w.startupTimeout = time.Second * 10
|
||||
}
|
||||
ctx, cancel := context.WithTimeout(ctx, w.startupTimeout)
|
||||
defer cancel()
|
||||
|
||||
|
Reference in New Issue
Block a user