Skip to content

Commit 867f3c8

Browse files
committed
Added support for loading binding providers at runtime using go-plugin
1 parent 892d904 commit 867f3c8

44 files changed

Lines changed: 6148 additions & 13 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,5 @@
2525
/docs/.hugo_build.lock
2626
/docs/designs/
2727

28+
go.work
29+
go.work.sum

Makefile

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,13 @@ MAKEFLAGS += --no-builtin-rules
1010
OPENRUN_HOME := `pwd`
1111
INPUT := $(word 2,$(MAKECMDGOALS))
1212
INPUT2 := $(word 3,$(MAKECMDGOALS))
13-
GO_PACKAGES = $$(go list ./... | grep -v '/ui/')
14-
GO_COVER_PACKAGES = $$(go list ./... | grep -v '/ui/' | paste -sd, -)
15-
GO_LINT_PACKAGES = $$(module=$$(go list -m); go list ./... | grep -v '/ui/' | awk -v module="$$module" '{ sub("^" module, "."); print }')
13+
# GOWORK=off: package lists are computed in module mode so a local go.work
14+
# (used for pkg/binding development) does not change what gets built/linted.
15+
# In workspace mode `go list -m` returns every workspace module and
16+
# `go list ./...` crosses into the nested pkg/binding module.
17+
GO_PACKAGES = $$(GOWORK=off go list ./... | grep -v '/ui/')
18+
GO_COVER_PACKAGES = $$(GOWORK=off go list ./... | grep -v '/ui/' | paste -sd, -)
19+
GO_LINT_PACKAGES = $$(module=$$(GOWORK=off go list -m); GOWORK=off go list ./... | grep -v '/ui/' | awk -v module="$$module" '{ sub("^" module, "."); print }')
1620

1721
ARCH := $(shell uname -m)
1822
TARGET_DIR := dist/linux/$(ARCH)
@@ -49,10 +53,12 @@ covtest: covunit covint ## Run all tests with coverage
4953
unit: ## Run unit tests
5054
> packages="$(GO_PACKAGES)"
5155
> go test $$packages
56+
> cd pkg/binding && GOWORK=off go test ./...
5257

5358
lint: ## Run lint
5459
> packages="$(GO_LINT_PACKAGES)"
5560
> golangci-lint run $$packages
61+
> cd pkg/binding && GOWORK=off golangci-lint run ./...
5662

5763
covunit: ## Run unit tests with coverage
5864
> rm -rf $(OPENRUN_HOME)/coverage/unit && mkdir -p $(OPENRUN_HOME)/coverage/unit

cmd/openrun/client_cmds.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ func getClientCommands(clientConfig *types.ClientConfig) ([]*cli.Command, error)
1717
commands = append(commands, initPrettyPrintCommand(flags, clientConfig))
1818
commands = append(commands, initSyncCommand(flags, clientConfig))
1919
commands = append(commands, initServiceCommand(flags, clientConfig))
20+
commands = append(commands, initProviderCommand(flags, clientConfig))
2021
commands = append(commands, initBindingCommand(flags, clientConfig))
2122
commands = append(commands, initSecretCommand(flags, clientConfig))
2223
commands = append(commands, initParamCommand(flags, clientConfig))

cmd/openrun/provider_cmds.go

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
// Copyright (c) ClaceIO, LLC
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package main
5+
6+
import (
7+
"cmp"
8+
"encoding/json"
9+
"fmt"
10+
"net/url"
11+
"strconv"
12+
"strings"
13+
14+
"github.com/openrundev/openrun/internal/types"
15+
"github.com/urfave/cli/v2"
16+
)
17+
18+
const (
19+
SOURCE_URL_FLAG = "source-url"
20+
PROVIDER_VERSION_FLAG = "version"
21+
)
22+
23+
func initProviderCommand(commonFlags []cli.Flag, clientConfig *types.ClientConfig) *cli.Command {
24+
return &cli.Command{
25+
Name: "provider",
26+
Usage: "Manage out-of-process binding providers",
27+
Subcommands: []*cli.Command{
28+
providerInstallCommand(commonFlags, clientConfig),
29+
providerUninstallCommand(commonFlags, clientConfig),
30+
providerListCommand(commonFlags, clientConfig),
31+
},
32+
}
33+
}
34+
35+
func providerInstallCommand(commonFlags []cli.Flag, clientConfig *types.ClientConfig) *cli.Command {
36+
flags := make([]cli.Flag, 0, len(commonFlags)+2)
37+
flags = append(flags, commonFlags...)
38+
flags = append(flags, newStringFlag(SOURCE_URL_FLAG, "", "The provider binary source: an http(s) url (supports {version}, {os} and {arch} placeholders) or a server-local file path", ""))
39+
flags = append(flags, newStringFlag(PROVIDER_VERSION_FLAG, "", "The provider version to install", ""))
40+
41+
return &cli.Command{
42+
Name: "install",
43+
Usage: "Install (or update) an out-of-process binding provider",
44+
Flags: flags,
45+
ArgsUsage: "<provider_name>",
46+
UsageText: `args: <provider_name>
47+
48+
The provider binary is downloaded (or copied), verified, registered in the
49+
metadata database and its service types become available for service create.
50+
51+
Examples:
52+
openrun provider install mongodb --source-url https://github.com/openrundev/openrun-bindings/releases/download/mongodb%2F{version}/openrun-binding-mongodb-{os}-{arch} --version v0.1.0
53+
openrun provider install redis --source-url /tmp/openrun-binding-redis
54+
`,
55+
Action: func(cCtx *cli.Context) error {
56+
if cCtx.NArg() != 1 {
57+
return fmt.Errorf("expected one arg: <provider_name>")
58+
}
59+
request := types.ProviderInstallRequest{
60+
Name: cCtx.Args().First(),
61+
SourceURL: cCtx.String(SOURCE_URL_FLAG),
62+
Version: cCtx.String(PROVIDER_VERSION_FLAG),
63+
}
64+
if request.SourceURL == "" {
65+
return fmt.Errorf("--%s is required", SOURCE_URL_FLAG)
66+
}
67+
68+
client := newHttpClient(clientConfig)
69+
var response types.BindingProvider
70+
if err := client.Post("/_openrun/provider", url.Values{}, &request, &response); err != nil {
71+
return err
72+
}
73+
74+
printStdout(cCtx, "Provider %s %s installed, service types: %s\n",
75+
response.Name, response.Version, strings.Join(response.ServiceTypes, ", "))
76+
return nil
77+
},
78+
}
79+
}
80+
81+
func providerUninstallCommand(commonFlags []cli.Flag, clientConfig *types.ClientConfig) *cli.Command {
82+
flags := make([]cli.Flag, 0, len(commonFlags)+1)
83+
flags = append(flags, commonFlags...)
84+
flags = append(flags, newBoolFlag("force", "", "Uninstall even if services of the provider's types exist", false))
85+
86+
return &cli.Command{
87+
Name: "uninstall",
88+
Usage: "Uninstall an out-of-process binding provider",
89+
Flags: flags,
90+
ArgsUsage: "<provider_name>",
91+
Action: func(cCtx *cli.Context) error {
92+
if cCtx.NArg() != 1 {
93+
return fmt.Errorf("expected one arg: <provider_name>")
94+
}
95+
name := cCtx.Args().First()
96+
97+
values := url.Values{}
98+
values.Add("name", name)
99+
values.Add("force", strconv.FormatBool(cCtx.Bool("force")))
100+
101+
client := newHttpClient(clientConfig)
102+
var response map[string]any
103+
if err := client.Delete("/_openrun/provider", values, &response); err != nil {
104+
return err
105+
}
106+
107+
printStdout(cCtx, "Provider %s uninstalled\n", name)
108+
return nil
109+
},
110+
}
111+
}
112+
113+
func providerListCommand(commonFlags []cli.Flag, clientConfig *types.ClientConfig) *cli.Command {
114+
flags := make([]cli.Flag, 0, len(commonFlags)+1)
115+
flags = append(flags, commonFlags...)
116+
flags = append(flags, newStringFlag("format", "f", "The display format. Valid options are table, basic, csv, json, jsonl and jsonl_pretty", ""))
117+
118+
return &cli.Command{
119+
Name: "list",
120+
Usage: "List installed binding providers",
121+
Flags: flags,
122+
Action: func(cCtx *cli.Context) error {
123+
client := newHttpClient(clientConfig)
124+
var response []types.BindingProvider
125+
if err := client.Get("/_openrun/providers", url.Values{}, &response); err != nil {
126+
return err
127+
}
128+
129+
printProviderList(cCtx, response, cmp.Or(cCtx.String("format"), clientConfig.Client.DefaultFormat))
130+
return nil
131+
},
132+
}
133+
}
134+
135+
func printProviderList(cCtx *cli.Context, providers []types.BindingProvider, format string) {
136+
switch format {
137+
case FORMAT_JSON:
138+
enc := json.NewEncoder(cCtx.App.Writer)
139+
enc.SetIndent("", " ")
140+
enc.Encode(providers) //nolint:errcheck
141+
case FORMAT_JSONL:
142+
enc := json.NewEncoder(cCtx.App.Writer)
143+
for _, p := range providers {
144+
enc.Encode(p) //nolint:errcheck
145+
}
146+
case FORMAT_JSONL_PRETTY:
147+
enc := json.NewEncoder(cCtx.App.Writer)
148+
enc.SetIndent("", " ")
149+
for _, p := range providers {
150+
enc.Encode(p) //nolint:errcheck
151+
}
152+
case FORMAT_CSV:
153+
for _, p := range providers {
154+
printStdout(cCtx, "%s,%s,%s\n", p.Name, p.Version, strings.Join(p.ServiceTypes, " "))
155+
}
156+
default:
157+
formatStr := "%-20s %-15s %-30s %-s\n"
158+
printStdout(cCtx, formatStr, "Name", "Version", "ServiceTypes", "SourceURL")
159+
for _, p := range providers {
160+
printStdout(cCtx, formatStr, p.Name, p.Version, strings.Join(p.ServiceTypes, ", "), p.SourceURL)
161+
}
162+
}
163+
}

go.mod

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@ require (
2626
github.com/google/go-containerregistry v0.21.3
2727
github.com/gorilla/securecookie v1.1.2
2828
github.com/gorilla/sessions v1.4.0
29+
github.com/hashicorp/go-hclog v1.6.3
2930
github.com/hashicorp/vault/api v1.15.0
3031
github.com/jackc/pgx/v5 v5.9.2
3132
github.com/jackc/pgxlisten v0.0.0-20241106001234-1d6f6656415c
3233
github.com/markbates/goth v1.80.0
3334
github.com/moby/buildkit v0.28.1
35+
github.com/openrundev/openrun/pkg/binding v0.0.0-00010101000000-000000000000
3436
github.com/pkg/profile v1.7.0
3537
github.com/rs/zerolog v1.33.0
3638
github.com/russellhaering/gosaml2 v0.11.0
@@ -96,6 +98,7 @@ require (
9698
github.com/dustin/go-humanize v1.0.1 // indirect
9799
github.com/emicklei/go-restful/v3 v3.12.2 // indirect
98100
github.com/emirpasic/gods v1.18.1 // indirect
101+
github.com/fatih/color v1.16.0 // indirect
99102
github.com/felixge/fgprof v0.9.5 // indirect
100103
github.com/felixge/httpsnoop v1.0.4 // indirect
101104
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
@@ -120,6 +123,7 @@ require (
120123
github.com/go-openapi/swag/yamlutils v0.25.4 // indirect
121124
github.com/gogo/protobuf v1.3.2 // indirect
122125
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
126+
github.com/golang/protobuf v1.5.4 // indirect
123127
github.com/google/gnostic-models v0.7.0 // indirect
124128
github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 // indirect
125129
github.com/google/uuid v1.6.0 // indirect
@@ -129,13 +133,15 @@ require (
129133
github.com/hashicorp/errwrap v1.1.0 // indirect
130134
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
131135
github.com/hashicorp/go-multierror v1.1.1 // indirect
136+
github.com/hashicorp/go-plugin v1.7.0 // indirect
132137
github.com/hashicorp/go-retryablehttp v0.7.8 // indirect
133138
github.com/hashicorp/go-rootcerts v1.0.2 // indirect
134139
github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8 // indirect
135140
github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect
136141
github.com/hashicorp/go-sockaddr v1.0.7 // indirect
137142
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
138143
github.com/hashicorp/hcl v1.0.0 // indirect
144+
github.com/hashicorp/yamux v0.1.2 // indirect
139145
github.com/huandu/xstrings v1.5.0 // indirect
140146
github.com/jackc/pgpassfile v1.0.0 // indirect
141147
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
@@ -164,6 +170,7 @@ require (
164170
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
165171
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
166172
github.com/ncruces/go-strftime v0.1.9 // indirect
173+
github.com/oklog/run v1.1.0 // indirect
167174
github.com/opencontainers/go-digest v1.0.0 // indirect
168175
github.com/opencontainers/image-spec v1.1.1 // indirect
169176
github.com/pjbgf/sha1cd v0.6.0 // indirect
@@ -230,3 +237,5 @@ require (
230237
)
231238

232239
replace cloud.google.com/go/compute/metadata => cloud.google.com/go/compute/metadata v0.2.3
240+
241+
replace github.com/openrundev/openrun/pkg/binding => ./pkg/binding

go.sum

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ github.com/benbjohnson/hashfs v0.2.2 h1:vFZtksphM5LcnMRFctj49jCUkCc7wp3NP6INyfjk
6565
github.com/benbjohnson/hashfs v0.2.2/go.mod h1:7OMXaMVo1YkfiIPxKrl7OXkUTUgWjmsAKyR+E6xDIRM=
6666
github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q=
6767
github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
68+
github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw=
69+
github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c=
6870
github.com/caddyserver/certmagic v0.21.4 h1:e7VobB8rffHv8ZZpSiZtEwnLDHUwLVYLWzWSa1FfKI0=
6971
github.com/caddyserver/certmagic v0.21.4/go.mod h1:swUXjQ1T9ZtMv95qj7/InJvWLXURU85r+CfG0T+ZbDE=
7072
github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
@@ -126,6 +128,7 @@ github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc
126128
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
127129
github.com/evanw/esbuild v0.24.0 h1:GZ78naTLp7FKr+K7eNuM/SLs5maeiHYRPsTg6kmdsSE=
128130
github.com/evanw/esbuild v0.24.0/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48=
131+
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
129132
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
130133
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
131134
github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=
@@ -246,6 +249,8 @@ github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB1
246249
github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
247250
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
248251
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
252+
github.com/hashicorp/go-plugin v1.7.0 h1:YghfQH/0QmPNc/AZMTFE3ac8fipZyZECHdDPshfk+mA=
253+
github.com/hashicorp/go-plugin v1.7.0/go.mod h1:BExt6KEaIYx804z8k4gRzRLEvxKVb+kn0NMcihqOqb8=
249254
github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48=
250255
github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw=
251256
github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=
@@ -262,6 +267,8 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
262267
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
263268
github.com/hashicorp/vault/api v1.15.0 h1:O24FYQCWwhwKnF7CuSqP30S51rTV7vz1iACXE/pj5DA=
264269
github.com/hashicorp/vault/api v1.15.0/go.mod h1:+5YTO09JGn0u+b6ySD/LLVf8WkJCPLAL2Vkmrn2+CM8=
270+
github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8=
271+
github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns=
265272
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
266273
github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI=
267274
github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
@@ -281,6 +288,8 @@ github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da h1:FjHUJJ7oBW4G/9
281288
github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4=
282289
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
283290
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
291+
github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94=
292+
github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8=
284293
github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I=
285294
github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60=
286295
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
@@ -311,8 +320,12 @@ github.com/markbates/goth v1.80.0 h1:NnvatczZDzOs1hn9Ug+dVYf2Viwwkp/ZDX5K+GLjan8
311320
github.com/markbates/goth v1.80.0/go.mod h1:4/GYHo+W6NWisrMPZnq0Yr2Q70UntNLn7KXEFhrIdAY=
312321
github.com/mattermost/xml-roundtrip-validator v0.1.0 h1:RXbVD2UAl7A7nOTR4u7E3ILa4IbtvKBHw64LDsmu9hU=
313322
github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To=
323+
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
324+
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
314325
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
315326
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
327+
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
328+
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
316329
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
317330
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
318331
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
@@ -351,6 +364,8 @@ github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J
351364
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
352365
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
353366
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
367+
github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA=
368+
github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU=
354369
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
355370
github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
356371
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -415,6 +430,7 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P
415430
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
416431
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
417432
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
433+
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
418434
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
419435
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
420436
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
@@ -504,13 +520,18 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h
504520
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
505521
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
506522
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
523+
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
524+
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
507525
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
508526
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
509527
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
510528
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
511529
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
530+
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
531+
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
512532
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
513533
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
534+
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
514535
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
515536
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
516537
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

0 commit comments

Comments
 (0)