mirror of
https://github.com/docker/cli.git
synced 2026-11-12 07:43:42 -04:00
Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7178075fda | ||
|
|
744938f0b9 | ||
|
|
1d5e206fc2 | ||
|
|
31d6292458 |
+15
-9
@@ -68,6 +68,17 @@ func runCA(dockerCli command.Cli, flags *pflag.FlagSet, opts caOptions) error {
|
||||
return displayTrustRoot(dockerCli.Out(), swarmInspect)
|
||||
}
|
||||
|
||||
if flags.Changed(flagExternalCA) && len(opts.externalCA.Value()) > 0 && !flags.Changed(flagCACert) {
|
||||
return fmt.Errorf(
|
||||
"rotating to an external CA requires the `--%s` flag to specify the external CA's cert - "+
|
||||
"to add an external CA with the current root CA certificate, use the `update` command instead", flagCACert)
|
||||
}
|
||||
|
||||
if flags.Changed(flagCACert) && len(opts.externalCA.Value()) == 0 && !flags.Changed(flagCAKey) {
|
||||
return fmt.Errorf("the --%s flag requires that a --%s flag and/or --%s flag be provided as well",
|
||||
flagCACert, flagCAKey, flagExternalCA)
|
||||
}
|
||||
|
||||
updateSwarmSpec(&swarmInspect.Spec, flags, opts)
|
||||
if err := client.SwarmUpdate(ctx, swarmInspect.Version, swarmInspect.Spec, swarm.UpdateFlags{}); err != nil {
|
||||
return err
|
||||
@@ -80,20 +91,15 @@ func runCA(dockerCli command.Cli, flags *pflag.FlagSet, opts caOptions) error {
|
||||
}
|
||||
|
||||
func updateSwarmSpec(spec *swarm.Spec, flags *pflag.FlagSet, opts caOptions) {
|
||||
opts.mergeSwarmSpecCAFlags(spec, flags)
|
||||
caCert := opts.rootCACert.Contents()
|
||||
caKey := opts.rootCAKey.Contents()
|
||||
opts.mergeSwarmSpecCAFlags(spec, flags, caCert)
|
||||
|
||||
spec.CAConfig.SigningCACert = caCert
|
||||
spec.CAConfig.SigningCAKey = caKey
|
||||
|
||||
if caCert != "" {
|
||||
spec.CAConfig.SigningCACert = caCert
|
||||
}
|
||||
if caKey != "" {
|
||||
spec.CAConfig.SigningCAKey = caKey
|
||||
}
|
||||
if caKey == "" && caCert == "" {
|
||||
spec.CAConfig.ForceRotate++
|
||||
spec.CAConfig.SigningCACert = ""
|
||||
spec.CAConfig.SigningCAKey = ""
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+202
-56
@@ -13,6 +13,28 @@ import (
|
||||
is "gotest.tools/assert/cmp"
|
||||
)
|
||||
|
||||
const (
|
||||
cert = `
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIBuDCCAV4CCQDOqUYOWdqMdjAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJVUzEL
|
||||
MAkGA1UECAwCQ0ExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDzANBgNVBAoMBkRv
|
||||
Y2tlcjEPMA0GA1UECwwGRG9ja2VyMQ0wCwYDVQQDDARUZXN0MCAXDTE4MDcwMjIx
|
||||
MjkxOFoYDzMwMTcxMTAyMjEyOTE4WjBjMQswCQYDVQQGEwJVUzELMAkGA1UECAwC
|
||||
Q0ExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDzANBgNVBAoMBkRvY2tlcjEPMA0G
|
||||
A1UECwwGRG9ja2VyMQ0wCwYDVQQDDARUZXN0MFkwEwYHKoZIzj0CAQYIKoZIzj0D
|
||||
AQcDQgAEgvvZl5Vqpr1e+g5IhoU6TZHgRau+BZETVFTmqyWYajA/mooRQ1MZTozu
|
||||
s9ZZZA8tzUhIqS36gsFuyIZ4YiAlyjAKBggqhkjOPQQDAwNIADBFAiBQ7pCPQrj8
|
||||
8zaItMf0pk8j1NU5XrFqFEZICzvjzUJQBAIhAKq2gFwoTn8KH+cAAXZpAGJPmOsT
|
||||
zsBT8gBAOHhNA6/2
|
||||
-----END CERTIFICATE-----`
|
||||
key = `
|
||||
-----BEGIN EC PRIVATE KEY-----
|
||||
MHcCAQEEICyheZpw70pbgO4hEuwhZTETWyTpNJmJ3TyFaWT6WTRkoAoGCCqGSM49
|
||||
AwEHoUQDQgAEgvvZl5Vqpr1e+g5IhoU6TZHgRau+BZETVFTmqyWYajA/mooRQ1MZ
|
||||
Tozus9ZZZA8tzUhIqS36gsFuyIZ4YiAlyg==
|
||||
-----END EC PRIVATE KEY-----`
|
||||
)
|
||||
|
||||
func swarmSpecWithFullCAConfig() *swarm.Spec {
|
||||
return &swarm.Spec{
|
||||
CAConfig: swarm.CAConfig{
|
||||
@@ -37,51 +59,79 @@ func TestDisplayTrustRootNoRoot(t *testing.T) {
|
||||
assert.Error(t, err, "No CA information available")
|
||||
}
|
||||
|
||||
type invalidCATestCases struct {
|
||||
args []string
|
||||
errorMsg string
|
||||
}
|
||||
|
||||
func writeFile(data string) (string, error) {
|
||||
tmpfile, err := ioutil.TempFile("", "testfile")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
_, err = tmpfile.Write([]byte(data))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
tmpfile.Close()
|
||||
return tmpfile.Name(), nil
|
||||
}
|
||||
|
||||
func TestDisplayTrustRootInvalidFlags(t *testing.T) {
|
||||
// we need an actual PEMfile to test
|
||||
tmpfile, err := ioutil.TempFile("", "pemfile")
|
||||
tmpfile, err := writeFile(cert)
|
||||
assert.NilError(t, err)
|
||||
defer os.Remove(tmpfile.Name())
|
||||
tmpfile.Write([]byte(`
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIBajCCARCgAwIBAgIUe0+jYWhxN8fFOByC7yveIYgvx1kwCgYIKoZIzj0EAwIw
|
||||
EzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMTcwNjI3MTUxNDAwWhcNMzcwNjIyMTUx
|
||||
NDAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH
|
||||
A0IABGgbOZLd7b4b262+6m4ignIecbAZKim6djNiIS1Kl5IHciXYn7gnSpsayjn7
|
||||
GQABpgkdPeM9TEQowmtR1qSnORujQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
|
||||
Af8EBTADAQH/MB0GA1UdDgQWBBQ6Rtcn823/fxRZyheRDFpDzuBMpTAKBggqhkjO
|
||||
PQQDAgNIADBFAiEAqD3Kb2rgsy6NoTk+zEgcUi/aGBCsvQDG3vML1PXN8j0CIBjj
|
||||
4nDj+GmHXcnKa8wXx70Z8OZEpRQIiKDDLmcXuslp
|
||||
-----END CERTIFICATE-----
|
||||
`))
|
||||
tmpfile.Close()
|
||||
defer os.Remove(tmpfile)
|
||||
|
||||
errorTestCases := [][]string{
|
||||
errorTestCases := []invalidCATestCases{
|
||||
{
|
||||
"--ca-cert=" + tmpfile.Name(),
|
||||
args: []string{"--ca-cert=" + tmpfile},
|
||||
errorMsg: "flag requires the `--rotate` flag to update the CA",
|
||||
},
|
||||
{
|
||||
"--ca-key=" + tmpfile.Name(),
|
||||
args: []string{"--ca-key=" + tmpfile},
|
||||
errorMsg: "flag requires the `--rotate` flag to update the CA",
|
||||
},
|
||||
{ // to make sure we're not erroring because we didn't provide a CA key along with the CA cert
|
||||
|
||||
"--ca-cert=" + tmpfile.Name(),
|
||||
"--ca-key=" + tmpfile.Name(),
|
||||
args: []string{
|
||||
"--ca-cert=" + tmpfile,
|
||||
"--ca-key=" + tmpfile,
|
||||
},
|
||||
errorMsg: "flag requires the `--rotate` flag to update the CA",
|
||||
},
|
||||
{
|
||||
"--cert-expiry=2160h0m0s",
|
||||
args: []string{"--cert-expiry=2160h0m0s"},
|
||||
errorMsg: "flag requires the `--rotate` flag to update the CA",
|
||||
},
|
||||
{
|
||||
"--external-ca=protocol=cfssl,url=https://some.com/https/url",
|
||||
args: []string{"--external-ca=protocol=cfssl,url=https://some.com/https/url"},
|
||||
errorMsg: "flag requires the `--rotate` flag to update the CA",
|
||||
},
|
||||
{ // to make sure we're not erroring because we didn't provide a CA cert and external CA
|
||||
|
||||
"--ca-cert=" + tmpfile.Name(),
|
||||
"--external-ca=protocol=cfssl,url=https://some.com/https/url",
|
||||
args: []string{
|
||||
"--ca-cert=" + tmpfile,
|
||||
"--external-ca=protocol=cfssl,url=https://some.com/https/url",
|
||||
},
|
||||
errorMsg: "flag requires the `--rotate` flag to update the CA",
|
||||
},
|
||||
{
|
||||
args: []string{
|
||||
"--rotate",
|
||||
"--external-ca=protocol=cfssl,url=https://some.com/https/url",
|
||||
},
|
||||
errorMsg: "rotating to an external CA requires the `--ca-cert` flag to specify the external CA's cert - " +
|
||||
"to add an external CA with the current root CA certificate, use the `update` command instead",
|
||||
},
|
||||
{
|
||||
args: []string{
|
||||
"--rotate",
|
||||
"--ca-cert=" + tmpfile,
|
||||
},
|
||||
errorMsg: "the --ca-cert flag requires that a --ca-key flag and/or --external-ca flag be provided as well",
|
||||
},
|
||||
}
|
||||
|
||||
for _, args := range errorTestCases {
|
||||
for _, testCase := range errorTestCases {
|
||||
cmd := newCACommand(
|
||||
test.NewFakeCli(&fakeClient{
|
||||
swarmInspectFunc: func() (swarm.Swarm, error) {
|
||||
@@ -94,9 +144,9 @@ PQQDAgNIADBFAiEAqD3Kb2rgsy6NoTk+zEgcUi/aGBCsvQDG3vML1PXN8j0CIBjj
|
||||
}, nil
|
||||
},
|
||||
}))
|
||||
assert.Check(t, cmd.Flags().Parse(args))
|
||||
assert.Check(t, cmd.Flags().Parse(testCase.args))
|
||||
cmd.SetOutput(ioutil.Discard)
|
||||
assert.ErrorContains(t, cmd.Execute(), "flag requires the `--rotate` flag to update the CA")
|
||||
assert.ErrorContains(t, cmd.Execute(), testCase.errorMsg)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,43 +162,139 @@ func TestDisplayTrustRoot(t *testing.T) {
|
||||
assert.Check(t, is.Equal(trustRoot+"\n", buffer.String()))
|
||||
}
|
||||
|
||||
type swarmUpdateRecorder struct {
|
||||
spec swarm.Spec
|
||||
}
|
||||
|
||||
func (s *swarmUpdateRecorder) swarmUpdate(sp swarm.Spec, _ swarm.UpdateFlags) error {
|
||||
s.spec = sp
|
||||
return nil
|
||||
}
|
||||
|
||||
func swarmInspectFuncWithFullCAConfig() (swarm.Swarm, error) {
|
||||
return swarm.Swarm{
|
||||
ClusterInfo: swarm.ClusterInfo{
|
||||
Spec: *swarmSpecWithFullCAConfig(),
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
func TestUpdateSwarmSpecDefaultRotate(t *testing.T) {
|
||||
spec := swarmSpecWithFullCAConfig()
|
||||
flags := newCACommand(nil).Flags()
|
||||
updateSwarmSpec(spec, flags, caOptions{})
|
||||
s := &swarmUpdateRecorder{}
|
||||
cli := test.NewFakeCli(&fakeClient{
|
||||
swarmInspectFunc: swarmInspectFuncWithFullCAConfig,
|
||||
swarmUpdateFunc: s.swarmUpdate,
|
||||
})
|
||||
cmd := newCACommand(cli)
|
||||
cmd.SetArgs([]string{"--rotate", "--detach"})
|
||||
cmd.SetOutput(cli.OutBuffer())
|
||||
assert.NilError(t, cmd.Execute())
|
||||
|
||||
expected := swarmSpecWithFullCAConfig()
|
||||
expected.CAConfig.ForceRotate = 2
|
||||
expected.CAConfig.SigningCACert = ""
|
||||
expected.CAConfig.SigningCAKey = ""
|
||||
assert.Check(t, is.DeepEqual(expected, spec))
|
||||
assert.Check(t, is.DeepEqual(*expected, s.spec))
|
||||
}
|
||||
|
||||
func TestUpdateSwarmSpecPartial(t *testing.T) {
|
||||
spec := swarmSpecWithFullCAConfig()
|
||||
flags := newCACommand(nil).Flags()
|
||||
updateSwarmSpec(spec, flags, caOptions{
|
||||
rootCACert: PEMFile{contents: "cacert"},
|
||||
func TestUpdateSwarmSpecCertAndKey(t *testing.T) {
|
||||
certfile, err := writeFile(cert)
|
||||
assert.NilError(t, err)
|
||||
defer os.Remove(certfile)
|
||||
|
||||
keyfile, err := writeFile(key)
|
||||
assert.NilError(t, err)
|
||||
defer os.Remove(keyfile)
|
||||
|
||||
s := &swarmUpdateRecorder{}
|
||||
cli := test.NewFakeCli(&fakeClient{
|
||||
swarmInspectFunc: swarmInspectFuncWithFullCAConfig,
|
||||
swarmUpdateFunc: s.swarmUpdate,
|
||||
})
|
||||
cmd := newCACommand(cli)
|
||||
cmd.SetArgs([]string{
|
||||
"--rotate",
|
||||
"--detach",
|
||||
"--ca-cert=" + certfile,
|
||||
"--ca-key=" + keyfile,
|
||||
"--cert-expiry=3m"})
|
||||
cmd.SetOutput(cli.OutBuffer())
|
||||
assert.NilError(t, cmd.Execute())
|
||||
|
||||
expected := swarmSpecWithFullCAConfig()
|
||||
expected.CAConfig.SigningCACert = "cacert"
|
||||
assert.Check(t, is.DeepEqual(expected, spec))
|
||||
}
|
||||
|
||||
func TestUpdateSwarmSpecFullFlags(t *testing.T) {
|
||||
flags := newCACommand(nil).Flags()
|
||||
flags.Lookup(flagCertExpiry).Changed = true
|
||||
spec := swarmSpecWithFullCAConfig()
|
||||
updateSwarmSpec(spec, flags, caOptions{
|
||||
rootCACert: PEMFile{contents: "cacert"},
|
||||
rootCAKey: PEMFile{contents: "cakey"},
|
||||
swarmCAOptions: swarmCAOptions{nodeCertExpiry: 3 * time.Minute},
|
||||
})
|
||||
|
||||
expected := swarmSpecWithFullCAConfig()
|
||||
expected.CAConfig.SigningCACert = "cacert"
|
||||
expected.CAConfig.SigningCAKey = "cakey"
|
||||
expected.CAConfig.SigningCACert = cert
|
||||
expected.CAConfig.SigningCAKey = key
|
||||
expected.CAConfig.NodeCertExpiry = 3 * time.Minute
|
||||
assert.Check(t, is.DeepEqual(expected, spec))
|
||||
assert.Check(t, is.DeepEqual(*expected, s.spec))
|
||||
}
|
||||
|
||||
func TestUpdateSwarmSpecCertAndExternalCA(t *testing.T) {
|
||||
certfile, err := writeFile(cert)
|
||||
assert.NilError(t, err)
|
||||
defer os.Remove(certfile)
|
||||
|
||||
s := &swarmUpdateRecorder{}
|
||||
cli := test.NewFakeCli(&fakeClient{
|
||||
swarmInspectFunc: swarmInspectFuncWithFullCAConfig,
|
||||
swarmUpdateFunc: s.swarmUpdate,
|
||||
})
|
||||
cmd := newCACommand(cli)
|
||||
cmd.SetArgs([]string{
|
||||
"--rotate",
|
||||
"--detach",
|
||||
"--ca-cert=" + certfile,
|
||||
"--external-ca=protocol=cfssl,url=https://some.external.ca"})
|
||||
cmd.SetOutput(cli.OutBuffer())
|
||||
assert.NilError(t, cmd.Execute())
|
||||
|
||||
expected := swarmSpecWithFullCAConfig()
|
||||
expected.CAConfig.SigningCACert = cert
|
||||
expected.CAConfig.SigningCAKey = ""
|
||||
expected.CAConfig.ExternalCAs = []*swarm.ExternalCA{
|
||||
{
|
||||
Protocol: swarm.ExternalCAProtocolCFSSL,
|
||||
URL: "https://some.external.ca",
|
||||
CACert: cert,
|
||||
Options: make(map[string]string),
|
||||
},
|
||||
}
|
||||
assert.Check(t, is.DeepEqual(*expected, s.spec))
|
||||
}
|
||||
|
||||
func TestUpdateSwarmSpecCertAndKeyAndExternalCA(t *testing.T) {
|
||||
certfile, err := writeFile(cert)
|
||||
assert.NilError(t, err)
|
||||
defer os.Remove(certfile)
|
||||
|
||||
keyfile, err := writeFile(key)
|
||||
assert.NilError(t, err)
|
||||
defer os.Remove(keyfile)
|
||||
|
||||
s := &swarmUpdateRecorder{}
|
||||
cli := test.NewFakeCli(&fakeClient{
|
||||
swarmInspectFunc: swarmInspectFuncWithFullCAConfig,
|
||||
swarmUpdateFunc: s.swarmUpdate,
|
||||
})
|
||||
cmd := newCACommand(cli)
|
||||
cmd.SetArgs([]string{
|
||||
"--rotate",
|
||||
"--detach",
|
||||
"--ca-cert=" + certfile,
|
||||
"--ca-key=" + keyfile,
|
||||
"--external-ca=protocol=cfssl,url=https://some.external.ca"})
|
||||
cmd.SetOutput(cli.OutBuffer())
|
||||
assert.NilError(t, cmd.Execute())
|
||||
|
||||
expected := swarmSpecWithFullCAConfig()
|
||||
expected.CAConfig.SigningCACert = cert
|
||||
expected.CAConfig.SigningCAKey = key
|
||||
expected.CAConfig.ExternalCAs = []*swarm.ExternalCA{
|
||||
{
|
||||
Protocol: swarm.ExternalCAProtocolCFSSL,
|
||||
URL: "https://some.external.ca",
|
||||
CACert: cert,
|
||||
Options: make(map[string]string),
|
||||
},
|
||||
}
|
||||
assert.Check(t, is.DeepEqual(*expected, s.spec))
|
||||
}
|
||||
|
||||
@@ -230,7 +230,7 @@ func addSwarmFlags(flags *pflag.FlagSet, opts *swarmOptions) {
|
||||
addSwarmCAFlags(flags, &opts.swarmCAOptions)
|
||||
}
|
||||
|
||||
func (opts *swarmOptions) mergeSwarmSpec(spec *swarm.Spec, flags *pflag.FlagSet) {
|
||||
func (opts *swarmOptions) mergeSwarmSpec(spec *swarm.Spec, flags *pflag.FlagSet, caCert string) {
|
||||
if flags.Changed(flagTaskHistoryLimit) {
|
||||
spec.Orchestration.TaskHistoryRetentionLimit = &opts.taskHistoryLimit
|
||||
}
|
||||
@@ -246,7 +246,7 @@ func (opts *swarmOptions) mergeSwarmSpec(spec *swarm.Spec, flags *pflag.FlagSet)
|
||||
if flags.Changed(flagAutolock) {
|
||||
spec.EncryptionConfig.AutoLockManagers = opts.autolock
|
||||
}
|
||||
opts.mergeSwarmSpecCAFlags(spec, flags)
|
||||
opts.mergeSwarmSpecCAFlags(spec, flags, caCert)
|
||||
}
|
||||
|
||||
type swarmCAOptions struct {
|
||||
@@ -254,17 +254,20 @@ type swarmCAOptions struct {
|
||||
externalCA ExternalCAOption
|
||||
}
|
||||
|
||||
func (opts *swarmCAOptions) mergeSwarmSpecCAFlags(spec *swarm.Spec, flags *pflag.FlagSet) {
|
||||
func (opts *swarmCAOptions) mergeSwarmSpecCAFlags(spec *swarm.Spec, flags *pflag.FlagSet, caCert string) {
|
||||
if flags.Changed(flagCertExpiry) {
|
||||
spec.CAConfig.NodeCertExpiry = opts.nodeCertExpiry
|
||||
}
|
||||
if flags.Changed(flagExternalCA) {
|
||||
spec.CAConfig.ExternalCAs = opts.externalCA.Value()
|
||||
for _, ca := range spec.CAConfig.ExternalCAs {
|
||||
ca.CACert = caCert
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (opts *swarmOptions) ToSpec(flags *pflag.FlagSet) swarm.Spec {
|
||||
var spec swarm.Spec
|
||||
opts.mergeSwarmSpec(&spec, flags)
|
||||
opts.mergeSwarmSpec(&spec, flags, "")
|
||||
return spec
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ func runUpdate(dockerCli command.Cli, flags *pflag.FlagSet, opts swarmOptions) e
|
||||
|
||||
prevAutoLock := swarmInspect.Spec.EncryptionConfig.AutoLockManagers
|
||||
|
||||
opts.mergeSwarmSpec(&swarmInspect.Spec, flags)
|
||||
opts.mergeSwarmSpec(&swarmInspect.Spec, flags, swarmInspect.ClusterInfo.TLSInfo.TrustRoot)
|
||||
|
||||
curAutoLock := swarmInspect.Spec.EncryptionConfig.AutoLockManagers
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
"github.com/docker/docker/api/types"
|
||||
"github.com/docker/docker/api/types/swarm"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
// Import builders to get the builder function as package function
|
||||
. "github.com/docker/cli/internal/test/builders"
|
||||
"gotest.tools/assert"
|
||||
@@ -82,6 +83,9 @@ func TestSwarmUpdateErrors(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSwarmUpdate(t *testing.T) {
|
||||
swarmInfo := Swarm()
|
||||
swarmInfo.ClusterInfo.TLSInfo.TrustRoot = "trustroot"
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
@@ -105,6 +109,9 @@ func TestSwarmUpdate(t *testing.T) {
|
||||
flagAutolock: "true",
|
||||
flagQuiet: "true",
|
||||
},
|
||||
swarmInspectFunc: func() (swarm.Swarm, error) {
|
||||
return *swarmInfo, nil
|
||||
},
|
||||
swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error {
|
||||
if *swarm.Orchestration.TaskHistoryRetentionLimit != 10 {
|
||||
return errors.Errorf("historyLimit not correctly set")
|
||||
@@ -123,7 +130,7 @@ func TestSwarmUpdate(t *testing.T) {
|
||||
if swarm.CAConfig.NodeCertExpiry != certExpiryDuration {
|
||||
return errors.Errorf("certExpiry not correctly set")
|
||||
}
|
||||
if len(swarm.CAConfig.ExternalCAs) != 1 {
|
||||
if len(swarm.CAConfig.ExternalCAs) != 1 || swarm.CAConfig.ExternalCAs[0].CACert != "trustroot" {
|
||||
return errors.Errorf("externalCA not correctly set")
|
||||
}
|
||||
if *swarm.Raft.KeepOldSnapshots != 10 {
|
||||
|
||||
+3
-3
@@ -7,7 +7,7 @@ github.com/coreos/etcd v3.2.1
|
||||
github.com/cpuguy83/go-md2man v1.0.8
|
||||
github.com/davecgh/go-spew 346938d642f2ec3594ed81d874461961cd0faa76
|
||||
github.com/docker/distribution 83389a148052d74ac602f5f1d62f86ff2f3c4aa5
|
||||
github.com/docker/docker 0d029b0a42fd682f6b0b5c35e9c1762c6b0173cb https://github.com/docker/engine
|
||||
github.com/docker/docker 371b590ace0d4a329cd6a3328d31d33c4f77a780 https://github.com/docker/engine
|
||||
github.com/docker/docker-credential-helpers 5241b46610f2491efdf9d1c85f1ddf5b02f6d962
|
||||
# the docker/go package contains a customized version of canonical/json
|
||||
# and is used by Notary. The package is periodically rebased on current Go versions.
|
||||
@@ -16,7 +16,7 @@ github.com/docker/go-connections 7beb39f0b969b075d1325fecb092faf27fd357b6
|
||||
github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
|
||||
github.com/docker/go-metrics d466d4f6fd960e01820085bd7e1a24426ee7ef18
|
||||
github.com/docker/go-units 9e638d38cf6977a37a8ea0078f3ee75a7cdb2dd1
|
||||
github.com/docker/swarmkit edd5641391926a50bc5f7040e20b7efc05003c26
|
||||
github.com/docker/swarmkit 199cf49cd99690135d99e52a1907ec82e8113c4f
|
||||
github.com/emicklei/go-restful ff4f55a206334ef123e4f79bbf348980da81ca46
|
||||
github.com/emicklei/go-restful-swagger12 dcef7f55730566d41eae5db10e7d6981829720f6
|
||||
github.com/flynn-archive/go-shlex 3f9db97f856818214da2e1057f8ad84803971cff
|
||||
@@ -91,6 +91,6 @@ k8s.io/client-go kubernetes-1.8.14
|
||||
k8s.io/kubernetes v1.8.14
|
||||
k8s.io/kube-openapi 0c329704159e3b051aafac400b15baacf2a94a04
|
||||
vbom.ml/util 928aaa586d7718c70f4090ddf83f2b34c16fdc8d
|
||||
github.com/containerd/console 9290d21dc56074581f619579c43d970b4514bc08
|
||||
github.com/containerd/console 5d1b48d6114b8c9666f0c8b916f871af97b0a761
|
||||
github.com/tonistiigi/units 29de085e9400559bd68aea2e7bc21566e7b8281d
|
||||
github.com/google/shlex 6f45313302b9c56850fc17f99e40caebce98c716
|
||||
|
||||
+4
@@ -262,10 +262,14 @@ func (ec *EpollConsole) Shutdown(close func(int) error) error {
|
||||
|
||||
// signalRead signals that the console is readable.
|
||||
func (ec *EpollConsole) signalRead() {
|
||||
ec.readc.L.Lock()
|
||||
ec.readc.Signal()
|
||||
ec.readc.L.Unlock()
|
||||
}
|
||||
|
||||
// signalWrite signals that the console is writable.
|
||||
func (ec *EpollConsole) signalWrite() {
|
||||
ec.writec.L.Lock()
|
||||
ec.writec.Signal()
|
||||
ec.writec.L.Unlock()
|
||||
}
|
||||
|
||||
+6
-6
@@ -37,7 +37,7 @@ github.com/mitchellh/hashstructure 2bca23e0e452137f789efbc8610126fd8b94f73b
|
||||
#get libnetwork packages
|
||||
|
||||
# When updating, also update LIBNETWORK_COMMIT in hack/dockerfile/install/proxy accordingly
|
||||
github.com/docker/libnetwork 430c00a6a6b3dfdd774f21e1abd4ad6b0216c629
|
||||
github.com/docker/libnetwork d00ceed44cc447c77f25cdf5d59e83163bdcb4c9
|
||||
github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
|
||||
github.com/armon/go-radix e39d623f12e8e41c7b5529e9a9dd67a1e2261f80
|
||||
github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec
|
||||
@@ -114,18 +114,18 @@ github.com/googleapis/gax-go v2.0.0
|
||||
google.golang.org/genproto 694d95ba50e67b2e363f3483057db5d4910c18f9
|
||||
|
||||
# containerd
|
||||
github.com/containerd/containerd 08f7ee9828af1783dc98cc5cc1739e915697c667
|
||||
github.com/containerd/containerd b41633746ed4833f52c3c071e8edcfa2713e5677
|
||||
github.com/containerd/fifo 3d5202aec260678c48179c56f40e6f38a095738c
|
||||
github.com/containerd/continuity d3c23511c1bf5851696cba83143d9cbcd666869b
|
||||
github.com/containerd/cgroups fe281dd265766145e943a034aa41086474ea6130
|
||||
github.com/containerd/console 9290d21dc56074581f619579c43d970b4514bc08
|
||||
github.com/containerd/console 5d1b48d6114b8c9666f0c8b916f871af97b0a761
|
||||
github.com/containerd/go-runc f271fa2021de855d4d918dbef83c5fe19db1bdd
|
||||
github.com/containerd/typeurl f6943554a7e7e88b3c14aad190bf05932da84788
|
||||
github.com/stevvooe/ttrpc d4528379866b0ce7e9d71f3eb96f0582fc374577
|
||||
github.com/containerd/typeurl a93fcdb778cd272c6e9b3028b2f42d813e785d40
|
||||
github.com/containerd/ttrpc 94dde388801693c54f88a6596f713b51a8b30b2d
|
||||
github.com/gogo/googleapis 08a7655d27152912db7aaf4f983275eaf8d128ef
|
||||
|
||||
# cluster
|
||||
github.com/docker/swarmkit edd5641391926a50bc5f7040e20b7efc05003c26
|
||||
github.com/docker/swarmkit 199cf49cd99690135d99e52a1907ec82e8113c4f
|
||||
github.com/gogo/protobuf v1.0.0
|
||||
github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a
|
||||
github.com/fernet/fernet-go 1b2437bc582b3cfbb341ee5a29f8ef5b42912ff2
|
||||
|
||||
+261
@@ -2014,6 +2014,10 @@ func sozObjects(x uint64) (n int) {
|
||||
|
||||
type NodeCheckFunc func(t1, t2 *Node) bool
|
||||
|
||||
type EventNode interface {
|
||||
IsEventNode() bool
|
||||
}
|
||||
|
||||
type EventCreateNode struct {
|
||||
Node *Node
|
||||
Checks []NodeCheckFunc
|
||||
@@ -2033,6 +2037,14 @@ func (e EventCreateNode) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateNode) IsEventCreate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateNode) IsEventNode() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventUpdateNode struct {
|
||||
Node *Node
|
||||
OldNode *Node
|
||||
@@ -2053,6 +2065,14 @@ func (e EventUpdateNode) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateNode) IsEventUpdate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateNode) IsEventNode() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventDeleteNode struct {
|
||||
Node *Node
|
||||
Checks []NodeCheckFunc
|
||||
@@ -2071,6 +2091,15 @@ func (e EventDeleteNode) Matches(apiEvent go_events.Event) bool {
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteNode) IsEventDelete() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteNode) IsEventNode() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (m *Node) CopyStoreObject() StoreObject {
|
||||
return m.Copy()
|
||||
}
|
||||
@@ -2261,6 +2290,10 @@ func (indexer NodeCustomIndexer) FromObject(obj interface{}) (bool, [][]byte, er
|
||||
|
||||
type ServiceCheckFunc func(t1, t2 *Service) bool
|
||||
|
||||
type EventService interface {
|
||||
IsEventService() bool
|
||||
}
|
||||
|
||||
type EventCreateService struct {
|
||||
Service *Service
|
||||
Checks []ServiceCheckFunc
|
||||
@@ -2280,6 +2313,14 @@ func (e EventCreateService) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateService) IsEventCreate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateService) IsEventService() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventUpdateService struct {
|
||||
Service *Service
|
||||
OldService *Service
|
||||
@@ -2300,6 +2341,14 @@ func (e EventUpdateService) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateService) IsEventUpdate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateService) IsEventService() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventDeleteService struct {
|
||||
Service *Service
|
||||
Checks []ServiceCheckFunc
|
||||
@@ -2318,6 +2367,15 @@ func (e EventDeleteService) Matches(apiEvent go_events.Event) bool {
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteService) IsEventDelete() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteService) IsEventService() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (m *Service) CopyStoreObject() StoreObject {
|
||||
return m.Copy()
|
||||
}
|
||||
@@ -2478,6 +2536,10 @@ func (indexer ServiceCustomIndexer) FromObject(obj interface{}) (bool, [][]byte,
|
||||
|
||||
type TaskCheckFunc func(t1, t2 *Task) bool
|
||||
|
||||
type EventTask interface {
|
||||
IsEventTask() bool
|
||||
}
|
||||
|
||||
type EventCreateTask struct {
|
||||
Task *Task
|
||||
Checks []TaskCheckFunc
|
||||
@@ -2497,6 +2559,14 @@ func (e EventCreateTask) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateTask) IsEventCreate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateTask) IsEventTask() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventUpdateTask struct {
|
||||
Task *Task
|
||||
OldTask *Task
|
||||
@@ -2517,6 +2587,14 @@ func (e EventUpdateTask) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateTask) IsEventUpdate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateTask) IsEventTask() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventDeleteTask struct {
|
||||
Task *Task
|
||||
Checks []TaskCheckFunc
|
||||
@@ -2535,6 +2613,15 @@ func (e EventDeleteTask) Matches(apiEvent go_events.Event) bool {
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteTask) IsEventDelete() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteTask) IsEventTask() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (m *Task) CopyStoreObject() StoreObject {
|
||||
return m.Copy()
|
||||
}
|
||||
@@ -2738,6 +2825,10 @@ func (indexer TaskCustomIndexer) FromObject(obj interface{}) (bool, [][]byte, er
|
||||
|
||||
type NetworkCheckFunc func(t1, t2 *Network) bool
|
||||
|
||||
type EventNetwork interface {
|
||||
IsEventNetwork() bool
|
||||
}
|
||||
|
||||
type EventCreateNetwork struct {
|
||||
Network *Network
|
||||
Checks []NetworkCheckFunc
|
||||
@@ -2757,6 +2848,14 @@ func (e EventCreateNetwork) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateNetwork) IsEventCreate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateNetwork) IsEventNetwork() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventUpdateNetwork struct {
|
||||
Network *Network
|
||||
OldNetwork *Network
|
||||
@@ -2777,6 +2876,14 @@ func (e EventUpdateNetwork) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateNetwork) IsEventUpdate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateNetwork) IsEventNetwork() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventDeleteNetwork struct {
|
||||
Network *Network
|
||||
Checks []NetworkCheckFunc
|
||||
@@ -2795,6 +2902,15 @@ func (e EventDeleteNetwork) Matches(apiEvent go_events.Event) bool {
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteNetwork) IsEventDelete() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteNetwork) IsEventNetwork() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (m *Network) CopyStoreObject() StoreObject {
|
||||
return m.Copy()
|
||||
}
|
||||
@@ -2955,6 +3071,10 @@ func (indexer NetworkCustomIndexer) FromObject(obj interface{}) (bool, [][]byte,
|
||||
|
||||
type ClusterCheckFunc func(t1, t2 *Cluster) bool
|
||||
|
||||
type EventCluster interface {
|
||||
IsEventCluster() bool
|
||||
}
|
||||
|
||||
type EventCreateCluster struct {
|
||||
Cluster *Cluster
|
||||
Checks []ClusterCheckFunc
|
||||
@@ -2974,6 +3094,14 @@ func (e EventCreateCluster) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateCluster) IsEventCreate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateCluster) IsEventCluster() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventUpdateCluster struct {
|
||||
Cluster *Cluster
|
||||
OldCluster *Cluster
|
||||
@@ -2994,6 +3122,14 @@ func (e EventUpdateCluster) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateCluster) IsEventUpdate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateCluster) IsEventCluster() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventDeleteCluster struct {
|
||||
Cluster *Cluster
|
||||
Checks []ClusterCheckFunc
|
||||
@@ -3012,6 +3148,15 @@ func (e EventDeleteCluster) Matches(apiEvent go_events.Event) bool {
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteCluster) IsEventDelete() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteCluster) IsEventCluster() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (m *Cluster) CopyStoreObject() StoreObject {
|
||||
return m.Copy()
|
||||
}
|
||||
@@ -3172,6 +3317,10 @@ func (indexer ClusterCustomIndexer) FromObject(obj interface{}) (bool, [][]byte,
|
||||
|
||||
type SecretCheckFunc func(t1, t2 *Secret) bool
|
||||
|
||||
type EventSecret interface {
|
||||
IsEventSecret() bool
|
||||
}
|
||||
|
||||
type EventCreateSecret struct {
|
||||
Secret *Secret
|
||||
Checks []SecretCheckFunc
|
||||
@@ -3191,6 +3340,14 @@ func (e EventCreateSecret) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateSecret) IsEventCreate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateSecret) IsEventSecret() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventUpdateSecret struct {
|
||||
Secret *Secret
|
||||
OldSecret *Secret
|
||||
@@ -3211,6 +3368,14 @@ func (e EventUpdateSecret) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateSecret) IsEventUpdate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateSecret) IsEventSecret() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventDeleteSecret struct {
|
||||
Secret *Secret
|
||||
Checks []SecretCheckFunc
|
||||
@@ -3229,6 +3394,15 @@ func (e EventDeleteSecret) Matches(apiEvent go_events.Event) bool {
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteSecret) IsEventDelete() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteSecret) IsEventSecret() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (m *Secret) CopyStoreObject() StoreObject {
|
||||
return m.Copy()
|
||||
}
|
||||
@@ -3389,6 +3563,10 @@ func (indexer SecretCustomIndexer) FromObject(obj interface{}) (bool, [][]byte,
|
||||
|
||||
type ConfigCheckFunc func(t1, t2 *Config) bool
|
||||
|
||||
type EventConfig interface {
|
||||
IsEventConfig() bool
|
||||
}
|
||||
|
||||
type EventCreateConfig struct {
|
||||
Config *Config
|
||||
Checks []ConfigCheckFunc
|
||||
@@ -3408,6 +3586,14 @@ func (e EventCreateConfig) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateConfig) IsEventCreate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateConfig) IsEventConfig() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventUpdateConfig struct {
|
||||
Config *Config
|
||||
OldConfig *Config
|
||||
@@ -3428,6 +3614,14 @@ func (e EventUpdateConfig) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateConfig) IsEventUpdate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateConfig) IsEventConfig() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventDeleteConfig struct {
|
||||
Config *Config
|
||||
Checks []ConfigCheckFunc
|
||||
@@ -3446,6 +3640,15 @@ func (e EventDeleteConfig) Matches(apiEvent go_events.Event) bool {
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteConfig) IsEventDelete() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteConfig) IsEventConfig() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (m *Config) CopyStoreObject() StoreObject {
|
||||
return m.Copy()
|
||||
}
|
||||
@@ -3606,6 +3809,10 @@ func (indexer ConfigCustomIndexer) FromObject(obj interface{}) (bool, [][]byte,
|
||||
|
||||
type ResourceCheckFunc func(t1, t2 *Resource) bool
|
||||
|
||||
type EventResource interface {
|
||||
IsEventResource() bool
|
||||
}
|
||||
|
||||
type EventCreateResource struct {
|
||||
Resource *Resource
|
||||
Checks []ResourceCheckFunc
|
||||
@@ -3625,6 +3832,14 @@ func (e EventCreateResource) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateResource) IsEventCreate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateResource) IsEventResource() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventUpdateResource struct {
|
||||
Resource *Resource
|
||||
OldResource *Resource
|
||||
@@ -3645,6 +3860,14 @@ func (e EventUpdateResource) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateResource) IsEventUpdate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateResource) IsEventResource() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventDeleteResource struct {
|
||||
Resource *Resource
|
||||
Checks []ResourceCheckFunc
|
||||
@@ -3663,6 +3886,15 @@ func (e EventDeleteResource) Matches(apiEvent go_events.Event) bool {
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteResource) IsEventDelete() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteResource) IsEventResource() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (m *Resource) CopyStoreObject() StoreObject {
|
||||
return m.Copy()
|
||||
}
|
||||
@@ -3829,6 +4061,10 @@ func (indexer ResourceCustomIndexer) FromObject(obj interface{}) (bool, [][]byte
|
||||
|
||||
type ExtensionCheckFunc func(t1, t2 *Extension) bool
|
||||
|
||||
type EventExtension interface {
|
||||
IsEventExtension() bool
|
||||
}
|
||||
|
||||
type EventCreateExtension struct {
|
||||
Extension *Extension
|
||||
Checks []ExtensionCheckFunc
|
||||
@@ -3848,6 +4084,14 @@ func (e EventCreateExtension) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateExtension) IsEventCreate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventCreateExtension) IsEventExtension() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventUpdateExtension struct {
|
||||
Extension *Extension
|
||||
OldExtension *Extension
|
||||
@@ -3868,6 +4112,14 @@ func (e EventUpdateExtension) Matches(apiEvent go_events.Event) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateExtension) IsEventUpdate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventUpdateExtension) IsEventExtension() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type EventDeleteExtension struct {
|
||||
Extension *Extension
|
||||
Checks []ExtensionCheckFunc
|
||||
@@ -3886,6 +4138,15 @@ func (e EventDeleteExtension) Matches(apiEvent go_events.Event) bool {
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteExtension) IsEventDelete() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (e EventDeleteExtension) IsEventExtension() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (m *Extension) CopyStoreObject() StoreObject {
|
||||
return m.Copy()
|
||||
}
|
||||
|
||||
+15
@@ -38,6 +38,21 @@ type Event interface {
|
||||
Matches(events.Event) bool
|
||||
}
|
||||
|
||||
// EventCreate is an interface implemented by every creation event type
|
||||
type EventCreate interface {
|
||||
IsEventCreate() bool
|
||||
}
|
||||
|
||||
// EventUpdate is an interface impelemented by every update event type
|
||||
type EventUpdate interface {
|
||||
IsEventUpdate() bool
|
||||
}
|
||||
|
||||
// EventDelete is an interface implemented by every delete event type
|
||||
type EventDelete interface {
|
||||
IsEventDelete()
|
||||
}
|
||||
|
||||
func customIndexer(kind string, annotations *Annotations) (bool, [][]byte, error) {
|
||||
var converted [][]byte
|
||||
|
||||
|
||||
Reference in New Issue
Block a user