mirror of https://github.com/containers/podman.git
Merge pull request #17154 from vrothberg/fix-flake
fix bud-multiple-platform-with-base-as-default-arg flake
This commit is contained in:
commit
0768680b98
6
go.mod
6
go.mod
|
@ -12,12 +12,12 @@ require (
|
||||||
github.com/containernetworking/cni v1.1.2
|
github.com/containernetworking/cni v1.1.2
|
||||||
github.com/containernetworking/plugins v1.2.0
|
github.com/containernetworking/plugins v1.2.0
|
||||||
github.com/containers/buildah v1.28.1-0.20221221082547-8403b6ebc13d
|
github.com/containers/buildah v1.28.1-0.20221221082547-8403b6ebc13d
|
||||||
github.com/containers/common v0.50.2-0.20230117154327-37d31888e634
|
github.com/containers/common v0.50.2-0.20230118142943-edca0cc051c8
|
||||||
github.com/containers/conmon v2.0.20+incompatible
|
github.com/containers/conmon v2.0.20+incompatible
|
||||||
github.com/containers/image/v5 v5.23.1-0.20230116122250-3d22f4e96c53
|
github.com/containers/image/v5 v5.23.1-0.20230116122250-3d22f4e96c53
|
||||||
github.com/containers/ocicrypt v1.1.7-0.20230115130455-e0cec6f7be0d
|
github.com/containers/ocicrypt v1.1.7-0.20230115130455-e0cec6f7be0d
|
||||||
github.com/containers/psgo v1.8.0
|
github.com/containers/psgo v1.8.0
|
||||||
github.com/containers/storage v1.45.0
|
github.com/containers/storage v1.45.1
|
||||||
github.com/coreos/go-systemd/v22 v22.5.0
|
github.com/coreos/go-systemd/v22 v22.5.0
|
||||||
github.com/coreos/stream-metadata-go v0.0.0-20210225230131-70edb9eb47b3
|
github.com/coreos/stream-metadata-go v0.0.0-20210225230131-70edb9eb47b3
|
||||||
github.com/cyphar/filepath-securejoin v0.2.3
|
github.com/cyphar/filepath-securejoin v0.2.3
|
||||||
|
@ -41,7 +41,7 @@ require (
|
||||||
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6
|
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6
|
||||||
github.com/nxadm/tail v1.4.8
|
github.com/nxadm/tail v1.4.8
|
||||||
github.com/onsi/ginkgo v1.16.5
|
github.com/onsi/ginkgo v1.16.5
|
||||||
github.com/onsi/gomega v1.24.2
|
github.com/onsi/gomega v1.25.0
|
||||||
github.com/opencontainers/go-digest v1.0.0
|
github.com/opencontainers/go-digest v1.0.0
|
||||||
github.com/opencontainers/image-spec v1.1.0-rc2
|
github.com/opencontainers/image-spec v1.1.0-rc2
|
||||||
github.com/opencontainers/runc v1.1.4
|
github.com/opencontainers/runc v1.1.4
|
||||||
|
|
12
go.sum
12
go.sum
|
@ -264,8 +264,8 @@ github.com/containernetworking/plugins v1.2.0 h1:SWgg3dQG1yzUo4d9iD8cwSVh1VqI+bP
|
||||||
github.com/containernetworking/plugins v1.2.0/go.mod h1:/VjX4uHecW5vVimFa1wkG4s+r/s9qIfPdqlLF4TW8c4=
|
github.com/containernetworking/plugins v1.2.0/go.mod h1:/VjX4uHecW5vVimFa1wkG4s+r/s9qIfPdqlLF4TW8c4=
|
||||||
github.com/containers/buildah v1.28.1-0.20221221082547-8403b6ebc13d h1:OyqOrN7QTtA7g5ZgQkV5lChAn5cVQB0dnVqjNd93DuQ=
|
github.com/containers/buildah v1.28.1-0.20221221082547-8403b6ebc13d h1:OyqOrN7QTtA7g5ZgQkV5lChAn5cVQB0dnVqjNd93DuQ=
|
||||||
github.com/containers/buildah v1.28.1-0.20221221082547-8403b6ebc13d/go.mod h1:PAftqTiRApPwzIaY42fDm/FRqOuLgd+ZZtVzIu3/eco=
|
github.com/containers/buildah v1.28.1-0.20221221082547-8403b6ebc13d/go.mod h1:PAftqTiRApPwzIaY42fDm/FRqOuLgd+ZZtVzIu3/eco=
|
||||||
github.com/containers/common v0.50.2-0.20230117154327-37d31888e634 h1:9DJigXQ0vvwqmnQd/MknvBRv5xRkM31PxcNQfoqgh58=
|
github.com/containers/common v0.50.2-0.20230118142943-edca0cc051c8 h1:zKqt9gf25e5RJOSxZtl4HPgLoAFTloC3SKMagjo50dI=
|
||||||
github.com/containers/common v0.50.2-0.20230117154327-37d31888e634/go.mod h1:ibwXFof4GdMlP4ndvEeLAImvYlZ7cGt8Bm7bJRaPvWE=
|
github.com/containers/common v0.50.2-0.20230118142943-edca0cc051c8/go.mod h1:C9NaZjFA4hLxMQrEKQld+5yLlJdFHsjvXMLO8rF73fM=
|
||||||
github.com/containers/conmon v2.0.20+incompatible h1:YbCVSFSCqFjjVwHTPINGdMX1F6JXHGTUje2ZYobNrkg=
|
github.com/containers/conmon v2.0.20+incompatible h1:YbCVSFSCqFjjVwHTPINGdMX1F6JXHGTUje2ZYobNrkg=
|
||||||
github.com/containers/conmon v2.0.20+incompatible/go.mod h1:hgwZ2mtuDrppv78a/cOBNiCm6O0UMWGx1mu7P00nu5I=
|
github.com/containers/conmon v2.0.20+incompatible/go.mod h1:hgwZ2mtuDrppv78a/cOBNiCm6O0UMWGx1mu7P00nu5I=
|
||||||
github.com/containers/image/v5 v5.23.1-0.20230116122250-3d22f4e96c53 h1:xXPmSOWBg/4df+XubFTCDDLwRhsJcuEs5wJbND6kNMI=
|
github.com/containers/image/v5 v5.23.1-0.20230116122250-3d22f4e96c53 h1:xXPmSOWBg/4df+XubFTCDDLwRhsJcuEs5wJbND6kNMI=
|
||||||
|
@ -281,8 +281,8 @@ github.com/containers/psgo v1.8.0 h1:2loGekmGAxM9ir5OsXWEfGwFxorMPYnc6gEDsGFQvhY
|
||||||
github.com/containers/psgo v1.8.0/go.mod h1:T8ZxnX3Ur4RvnhxFJ7t8xJ1F48RhiZB4rSrOaR/qGHc=
|
github.com/containers/psgo v1.8.0/go.mod h1:T8ZxnX3Ur4RvnhxFJ7t8xJ1F48RhiZB4rSrOaR/qGHc=
|
||||||
github.com/containers/storage v1.37.0/go.mod h1:kqeJeS0b7DO2ZT1nVWs0XufrmPFbgV3c+Q/45RlH6r4=
|
github.com/containers/storage v1.37.0/go.mod h1:kqeJeS0b7DO2ZT1nVWs0XufrmPFbgV3c+Q/45RlH6r4=
|
||||||
github.com/containers/storage v1.43.0/go.mod h1:uZ147thiIFGdVTjMmIw19knttQnUCl3y9zjreHrg11s=
|
github.com/containers/storage v1.43.0/go.mod h1:uZ147thiIFGdVTjMmIw19knttQnUCl3y9zjreHrg11s=
|
||||||
github.com/containers/storage v1.45.0 h1:UoCtlZf1eYi9zPl7XfhdCrifIpQABogomH1Gh0lsU70=
|
github.com/containers/storage v1.45.1 h1:hsItObigGLm77Dn4ebUxQ68EfE6nMrwGcIdMRqzgclI=
|
||||||
github.com/containers/storage v1.45.0/go.mod h1:OdRUYHrq1HP6iAo79VxqtYuJzC5j4eA2I60jKOoCT7g=
|
github.com/containers/storage v1.45.1/go.mod h1:OdRUYHrq1HP6iAo79VxqtYuJzC5j4eA2I60jKOoCT7g=
|
||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
|
github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
|
||||||
|
@ -739,8 +739,8 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT
|
||||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||||
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
||||||
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
||||||
github.com/onsi/gomega v1.24.2 h1:J/tulyYK6JwBldPViHJReihxxZ+22FHs0piGjQAvoUE=
|
github.com/onsi/gomega v1.25.0 h1:Vw7br2PCDYijJHSfBOWhov+8cAnUf8MfMaIOV323l6Y=
|
||||||
github.com/onsi/gomega v1.24.2/go.mod h1:gs3J10IS7Z7r7eXRoNJIrNqU4ToQukCJhFtKrWgHWnk=
|
github.com/onsi/gomega v1.25.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM=
|
||||||
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
|
|
|
@ -16,6 +16,7 @@ import (
|
||||||
"github.com/containers/image/v5/docker/reference"
|
"github.com/containers/image/v5/docker/reference"
|
||||||
"github.com/containers/image/v5/pkg/compression"
|
"github.com/containers/image/v5/pkg/compression"
|
||||||
"github.com/containers/image/v5/signature"
|
"github.com/containers/image/v5/signature"
|
||||||
|
"github.com/containers/image/v5/signature/signer"
|
||||||
storageTransport "github.com/containers/image/v5/storage"
|
storageTransport "github.com/containers/image/v5/storage"
|
||||||
"github.com/containers/image/v5/types"
|
"github.com/containers/image/v5/types"
|
||||||
encconfig "github.com/containers/ocicrypt/config"
|
encconfig "github.com/containers/ocicrypt/config"
|
||||||
|
@ -99,6 +100,9 @@ type CopyOptions struct {
|
||||||
PolicyAllowStorage bool
|
PolicyAllowStorage bool
|
||||||
// SignaturePolicyPath to overwrite the default one.
|
// SignaturePolicyPath to overwrite the default one.
|
||||||
SignaturePolicyPath string
|
SignaturePolicyPath string
|
||||||
|
// If non-empty, asks for signatures to be added during the copy
|
||||||
|
// using the provided signers.
|
||||||
|
Signers []*signer.Signer
|
||||||
// If non-empty, asks for a signature to be added during the copy, and
|
// If non-empty, asks for a signature to be added during the copy, and
|
||||||
// specifies a key ID.
|
// specifies a key ID.
|
||||||
SignBy string
|
SignBy string
|
||||||
|
@ -299,6 +303,7 @@ func (r *Runtime) newCopier(options *CopyOptions) (*copier, error) {
|
||||||
c.imageCopyOptions.OciEncryptLayers = options.OciEncryptLayers
|
c.imageCopyOptions.OciEncryptLayers = options.OciEncryptLayers
|
||||||
c.imageCopyOptions.OciDecryptConfig = options.OciDecryptConfig
|
c.imageCopyOptions.OciDecryptConfig = options.OciDecryptConfig
|
||||||
c.imageCopyOptions.RemoveSignatures = options.RemoveSignatures
|
c.imageCopyOptions.RemoveSignatures = options.RemoveSignatures
|
||||||
|
c.imageCopyOptions.Signers = options.Signers
|
||||||
c.imageCopyOptions.SignBy = options.SignBy
|
c.imageCopyOptions.SignBy = options.SignBy
|
||||||
c.imageCopyOptions.SignPassphrase = options.SignPassphrase
|
c.imageCopyOptions.SignPassphrase = options.SignPassphrase
|
||||||
c.imageCopyOptions.SignBySigstorePrivateKeyFile = options.SignBySigstorePrivateKeyFile
|
c.imageCopyOptions.SignBySigstorePrivateKeyFile = options.SignBySigstorePrivateKeyFile
|
||||||
|
|
|
@ -452,6 +452,7 @@ func (m *ManifestList) Push(ctx context.Context, destination string, options *Ma
|
||||||
ImageListSelection: options.ImageListSelection,
|
ImageListSelection: options.ImageListSelection,
|
||||||
Instances: options.Instances,
|
Instances: options.Instances,
|
||||||
ReportWriter: options.Writer,
|
ReportWriter: options.Writer,
|
||||||
|
Signers: options.Signers,
|
||||||
SignBy: options.SignBy,
|
SignBy: options.SignBy,
|
||||||
SignPassphrase: options.SignPassphrase,
|
SignPassphrase: options.SignPassphrase,
|
||||||
SignBySigstorePrivateKeyFile: options.SignBySigstorePrivateKeyFile,
|
SignBySigstorePrivateKeyFile: options.SignBySigstorePrivateKeyFile,
|
||||||
|
|
|
@ -15,6 +15,7 @@ import (
|
||||||
"github.com/containers/image/v5/image"
|
"github.com/containers/image/v5/image"
|
||||||
"github.com/containers/image/v5/manifest"
|
"github.com/containers/image/v5/manifest"
|
||||||
"github.com/containers/image/v5/signature"
|
"github.com/containers/image/v5/signature"
|
||||||
|
"github.com/containers/image/v5/signature/signer"
|
||||||
is "github.com/containers/image/v5/storage"
|
is "github.com/containers/image/v5/storage"
|
||||||
"github.com/containers/image/v5/transports"
|
"github.com/containers/image/v5/transports"
|
||||||
"github.com/containers/image/v5/transports/alltransports"
|
"github.com/containers/image/v5/transports/alltransports"
|
||||||
|
@ -61,6 +62,7 @@ type PushOptions struct {
|
||||||
ImageListSelection cp.ImageListSelection // set to either CopySystemImage, CopyAllImages, or CopySpecificImages
|
ImageListSelection cp.ImageListSelection // set to either CopySystemImage, CopyAllImages, or CopySpecificImages
|
||||||
Instances []digest.Digest // instances to copy if ImageListSelection == CopySpecificImages
|
Instances []digest.Digest // instances to copy if ImageListSelection == CopySpecificImages
|
||||||
ReportWriter io.Writer // will be used to log the writing of the list and any blobs
|
ReportWriter io.Writer // will be used to log the writing of the list and any blobs
|
||||||
|
Signers []*signer.Signer // if non-empty, asks for signatures to be added during the copy using the provided signers.
|
||||||
SignBy string // fingerprint of GPG key to use to sign images
|
SignBy string // fingerprint of GPG key to use to sign images
|
||||||
SignPassphrase string // passphrase to use when signing with the key ID from SignBy.
|
SignPassphrase string // passphrase to use when signing with the key ID from SignBy.
|
||||||
SignBySigstorePrivateKeyFile string // if non-empty, asks for a signature to be added during the copy, using a sigstore private key file at the provided path.
|
SignBySigstorePrivateKeyFile string // if non-empty, asks for a signature to be added during the copy, using a sigstore private key file at the provided path.
|
||||||
|
@ -244,6 +246,7 @@ func (l *list) Push(ctx context.Context, dest types.ImageReference, options Push
|
||||||
DestinationCtx: options.SystemContext,
|
DestinationCtx: options.SystemContext,
|
||||||
ReportWriter: options.ReportWriter,
|
ReportWriter: options.ReportWriter,
|
||||||
RemoveSignatures: options.RemoveSignatures,
|
RemoveSignatures: options.RemoveSignatures,
|
||||||
|
Signers: options.Signers,
|
||||||
SignBy: options.SignBy,
|
SignBy: options.SignBy,
|
||||||
SignPassphrase: options.SignPassphrase,
|
SignPassphrase: options.SignPassphrase,
|
||||||
SignBySigstorePrivateKeyFile: options.SignBySigstorePrivateKeyFile,
|
SignBySigstorePrivateKeyFile: options.SignBySigstorePrivateKeyFile,
|
||||||
|
|
|
@ -497,26 +497,16 @@ func (r *Runtime) copySingleImageFromRegistry(ctx context.Context, imageName str
|
||||||
|
|
||||||
customPlatform := len(options.Architecture)+len(options.OS)+len(options.Variant) > 0
|
customPlatform := len(options.Architecture)+len(options.OS)+len(options.Variant) > 0
|
||||||
if customPlatform && pullPolicy != config.PullPolicyAlways && pullPolicy != config.PullPolicyNever {
|
if customPlatform && pullPolicy != config.PullPolicyAlways && pullPolicy != config.PullPolicyNever {
|
||||||
// Unless the specified platform matches the local image, we
|
// Unless the pull policy is always/never, we must
|
||||||
// must pessimistically assume that the local image has an
|
// pessimistically assume that the local image has an invalid
|
||||||
// invalid architecture (see containers/podman/issues/10682).
|
// architecture (see containers/podman/issues/10682). Hence,
|
||||||
// Hence, whenever the user requests a custom platform, set the
|
// whenever the user requests a custom platform, set the pull
|
||||||
// pull policy to "newer" to make sure we're pulling down the
|
// policy to "newer" to make sure we're pulling down the
|
||||||
// correct image.
|
// correct image.
|
||||||
//
|
//
|
||||||
// NOTE that this is will even override --pull={false,never}.
|
// NOTE that this is will even override --pull={false,never}.
|
||||||
localImageMatches := false
|
pullPolicy = config.PullPolicyNewer
|
||||||
if localImage != nil {
|
logrus.Debugf("Enforcing pull policy to %q to pull custom platform (arch: %q, os: %q, variant: %q) - local image may mistakenly specify wrong platform", pullPolicy, options.Architecture, options.OS, options.Variant)
|
||||||
_, matches, err := localImage.matchesPlatform(ctx, options.OS, options.Architecture, options.Variant)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
localImageMatches = matches
|
|
||||||
}
|
|
||||||
if !localImageMatches {
|
|
||||||
pullPolicy = config.PullPolicyNewer
|
|
||||||
logrus.Debugf("Enforcing pull policy to %q to pull custom platform (arch: %q, os: %q, variant: %q) - local image may mistakenly specify wrong platform", pullPolicy, options.Architecture, options.OS, options.Variant)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if pullPolicy == config.PullPolicyNever {
|
if pullPolicy == config.PullPolicyNever {
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
1.45.0
|
1.45.1
|
||||||
|
|
|
@ -300,7 +300,11 @@ func getRootlessStorageOpts(rootlessUID int, systemOpts StoreOptions) (StoreOpti
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if opts.GraphDriverName == "" {
|
if opts.GraphDriverName == "" {
|
||||||
opts.GraphDriverName = "vfs"
|
if len(systemOpts.GraphDriverPriority) == 0 {
|
||||||
|
opts.GraphDriverName = "vfs"
|
||||||
|
} else {
|
||||||
|
opts.GraphDriverPriority = systemOpts.GraphDriverPriority
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if os.Getenv("STORAGE_OPTS") != "" {
|
if os.Getenv("STORAGE_OPTS") != "" {
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
## 1.25.0
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- add `MustPassRepeatedly(int)` to asyncAssertion (#619) [4509f72]
|
||||||
|
- compare unwrapped errors using DeepEqual (#617) [aaeaa5d]
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
- Bump golang.org/x/net from 0.4.0 to 0.5.0 (#614) [c7cfea4]
|
||||||
|
- Bump github.com/onsi/ginkgo/v2 from 2.6.1 to 2.7.0 (#615) [71b8adb]
|
||||||
|
- Docs: Fix typo "MUltiple" -> "Multiple" (#616) [9351dda]
|
||||||
|
- clean up go.sum [cd1dc1d]
|
||||||
|
|
||||||
## 1.24.2
|
## 1.24.2
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|
|
@ -22,7 +22,7 @@ import (
|
||||||
"github.com/onsi/gomega/types"
|
"github.com/onsi/gomega/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
const GOMEGA_VERSION = "1.24.2"
|
const GOMEGA_VERSION = "1.25.0"
|
||||||
|
|
||||||
const nilGomegaPanic = `You are trying to make an assertion, but haven't registered Gomega's fail handler.
|
const nilGomegaPanic = `You are trying to make an assertion, but haven't registered Gomega's fail handler.
|
||||||
If you're using Ginkgo then you probably forgot to put your assertion in an It().
|
If you're using Ginkgo then you probably forgot to put your assertion in an It().
|
||||||
|
@ -360,6 +360,16 @@ You can also pass additional arugments to functions that take a Gomega. The onl
|
||||||
g.Expect(elements).To(ConsistOf(expected))
|
g.Expect(elements).To(ConsistOf(expected))
|
||||||
}).WithContext(ctx).WithArguments("/names", "Joe", "Jane", "Sam").Should(Succeed())
|
}).WithContext(ctx).WithArguments("/names", "Joe", "Jane", "Sam").Should(Succeed())
|
||||||
|
|
||||||
|
You can ensure that you get a number of consecutive successful tries before succeeding using `MustPassRepeatedly(int)`. For Example:
|
||||||
|
|
||||||
|
int count := 0
|
||||||
|
Eventually(func() bool {
|
||||||
|
count++
|
||||||
|
return count > 2
|
||||||
|
}).MustPassRepeatedly(2).Should(BeTrue())
|
||||||
|
// Because we had to wait for 2 calls that returned true
|
||||||
|
Expect(count).To(Equal(3))
|
||||||
|
|
||||||
Finally, in addition to passing timeouts and a context to Eventually you can be more explicit with Eventually's chaining configuration methods:
|
Finally, in addition to passing timeouts and a context to Eventually you can be more explicit with Eventually's chaining configuration methods:
|
||||||
|
|
||||||
Eventually(..., "1s", "2s", ctx).Should(...)
|
Eventually(..., "1s", "2s", ctx).Should(...)
|
||||||
|
|
|
@ -55,21 +55,23 @@ type AsyncAssertion struct {
|
||||||
actual interface{}
|
actual interface{}
|
||||||
argsToForward []interface{}
|
argsToForward []interface{}
|
||||||
|
|
||||||
timeoutInterval time.Duration
|
timeoutInterval time.Duration
|
||||||
pollingInterval time.Duration
|
pollingInterval time.Duration
|
||||||
ctx context.Context
|
mustPassRepeatedly int
|
||||||
offset int
|
ctx context.Context
|
||||||
g *Gomega
|
offset int
|
||||||
|
g *Gomega
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAsyncAssertion(asyncType AsyncAssertionType, actualInput interface{}, g *Gomega, timeoutInterval time.Duration, pollingInterval time.Duration, ctx context.Context, offset int) *AsyncAssertion {
|
func NewAsyncAssertion(asyncType AsyncAssertionType, actualInput interface{}, g *Gomega, timeoutInterval time.Duration, pollingInterval time.Duration, mustPassRepeatedly int, ctx context.Context, offset int) *AsyncAssertion {
|
||||||
out := &AsyncAssertion{
|
out := &AsyncAssertion{
|
||||||
asyncType: asyncType,
|
asyncType: asyncType,
|
||||||
timeoutInterval: timeoutInterval,
|
timeoutInterval: timeoutInterval,
|
||||||
pollingInterval: pollingInterval,
|
pollingInterval: pollingInterval,
|
||||||
offset: offset,
|
mustPassRepeatedly: mustPassRepeatedly,
|
||||||
ctx: ctx,
|
offset: offset,
|
||||||
g: g,
|
ctx: ctx,
|
||||||
|
g: g,
|
||||||
}
|
}
|
||||||
|
|
||||||
out.actual = actualInput
|
out.actual = actualInput
|
||||||
|
@ -115,6 +117,11 @@ func (assertion *AsyncAssertion) WithArguments(argsToForward ...interface{}) typ
|
||||||
return assertion
|
return assertion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (assertion *AsyncAssertion) MustPassRepeatedly(count int) types.AsyncAssertion {
|
||||||
|
assertion.mustPassRepeatedly = count
|
||||||
|
return assertion
|
||||||
|
}
|
||||||
|
|
||||||
func (assertion *AsyncAssertion) Should(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool {
|
func (assertion *AsyncAssertion) Should(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool {
|
||||||
assertion.g.THelper()
|
assertion.g.THelper()
|
||||||
vetOptionalDescription("Asynchronous assertion", optionalDescription...)
|
vetOptionalDescription("Asynchronous assertion", optionalDescription...)
|
||||||
|
@ -202,6 +209,13 @@ You can learn more at https://onsi.github.io/gomega/#eventually
|
||||||
`, assertion.asyncType, t, t.NumIn(), numProvided, have, assertion.asyncType)
|
`, assertion.asyncType, t, t.NumIn(), numProvided, have, assertion.asyncType)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (assertion *AsyncAssertion) invalidMustPassRepeatedlyError(reason string) error {
|
||||||
|
return fmt.Errorf(`Invalid use of MustPassRepeatedly with %s %s
|
||||||
|
|
||||||
|
You can learn more at https://onsi.github.io/gomega/#eventually
|
||||||
|
`, assertion.asyncType, reason)
|
||||||
|
}
|
||||||
|
|
||||||
func (assertion *AsyncAssertion) buildActualPoller() (func() (interface{}, error), error) {
|
func (assertion *AsyncAssertion) buildActualPoller() (func() (interface{}, error), error) {
|
||||||
if !assertion.actualIsFunc {
|
if !assertion.actualIsFunc {
|
||||||
return func() (interface{}, error) { return assertion.actual, nil }, nil
|
return func() (interface{}, error) { return assertion.actual, nil }, nil
|
||||||
|
@ -257,6 +271,13 @@ func (assertion *AsyncAssertion) buildActualPoller() (func() (interface{}, error
|
||||||
return nil, assertion.argumentMismatchError(actualType, len(inValues))
|
return nil, assertion.argumentMismatchError(actualType, len(inValues))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if assertion.mustPassRepeatedly != 1 && assertion.asyncType != AsyncAssertionTypeEventually {
|
||||||
|
return nil, assertion.invalidMustPassRepeatedlyError("it can only be used with Eventually")
|
||||||
|
}
|
||||||
|
if assertion.mustPassRepeatedly < 1 {
|
||||||
|
return nil, assertion.invalidMustPassRepeatedlyError("parameter can't be < 1")
|
||||||
|
}
|
||||||
|
|
||||||
return func() (actual interface{}, err error) {
|
return func() (actual interface{}, err error) {
|
||||||
var values []reflect.Value
|
var values []reflect.Value
|
||||||
assertionFailure = nil
|
assertionFailure = nil
|
||||||
|
@ -396,6 +417,8 @@ func (assertion *AsyncAssertion) match(matcher types.GomegaMatcher, desiredMatch
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Used to count the number of times in a row a step passed
|
||||||
|
passedRepeatedlyCount := 0
|
||||||
for {
|
for {
|
||||||
var nextPoll <-chan time.Time = nil
|
var nextPoll <-chan time.Time = nil
|
||||||
var isTryAgainAfterError = false
|
var isTryAgainAfterError = false
|
||||||
|
@ -413,13 +436,18 @@ func (assertion *AsyncAssertion) match(matcher types.GomegaMatcher, desiredMatch
|
||||||
|
|
||||||
if err == nil && matches == desiredMatch {
|
if err == nil && matches == desiredMatch {
|
||||||
if assertion.asyncType == AsyncAssertionTypeEventually {
|
if assertion.asyncType == AsyncAssertionTypeEventually {
|
||||||
return true
|
passedRepeatedlyCount += 1
|
||||||
|
if passedRepeatedlyCount == assertion.mustPassRepeatedly {
|
||||||
|
return true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if !isTryAgainAfterError {
|
} else if !isTryAgainAfterError {
|
||||||
if assertion.asyncType == AsyncAssertionTypeConsistently {
|
if assertion.asyncType == AsyncAssertionTypeConsistently {
|
||||||
fail("Failed")
|
fail("Failed")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
// Reset the consecutive pass count
|
||||||
|
passedRepeatedlyCount = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
if oracleMatcherSaysStop {
|
if oracleMatcherSaysStop {
|
||||||
|
|
|
@ -109,7 +109,7 @@ func (g *Gomega) makeAsyncAssertion(asyncAssertionType AsyncAssertionType, offse
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NewAsyncAssertion(asyncAssertionType, actual, g, timeoutInterval, pollingInterval, ctx, offset)
|
return NewAsyncAssertion(asyncAssertionType, actual, g, timeoutInterval, pollingInterval, 1, ctx, offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *Gomega) SetDefaultEventuallyTimeout(t time.Duration) {
|
func (g *Gomega) SetDefaultEventuallyTimeout(t time.Duration) {
|
||||||
|
|
|
@ -25,7 +25,17 @@ func (matcher *MatchErrorMatcher) Match(actual interface{}) (success bool, err e
|
||||||
expected := matcher.Expected
|
expected := matcher.Expected
|
||||||
|
|
||||||
if isError(expected) {
|
if isError(expected) {
|
||||||
return reflect.DeepEqual(actualErr, expected) || errors.Is(actualErr, expected.(error)), nil
|
// first try the built-in errors.Is
|
||||||
|
if errors.Is(actualErr, expected.(error)) {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
// if not, try DeepEqual along the error chain
|
||||||
|
for unwrapped := actualErr; unwrapped != nil; unwrapped = errors.Unwrap(unwrapped) {
|
||||||
|
if reflect.DeepEqual(unwrapped, expected) {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if isString(expected) {
|
if isString(expected) {
|
||||||
|
|
|
@ -75,6 +75,7 @@ type AsyncAssertion interface {
|
||||||
ProbeEvery(interval time.Duration) AsyncAssertion
|
ProbeEvery(interval time.Duration) AsyncAssertion
|
||||||
WithContext(ctx context.Context) AsyncAssertion
|
WithContext(ctx context.Context) AsyncAssertion
|
||||||
WithArguments(argsToForward ...interface{}) AsyncAssertion
|
WithArguments(argsToForward ...interface{}) AsyncAssertion
|
||||||
|
MustPassRepeatedly(count int) AsyncAssertion
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assertions are returned by Ω and Expect and enable assertions against Gomega matchers
|
// Assertions are returned by Ω and Expect and enable assertions against Gomega matchers
|
||||||
|
|
|
@ -118,7 +118,7 @@ github.com/containers/buildah/pkg/rusage
|
||||||
github.com/containers/buildah/pkg/sshagent
|
github.com/containers/buildah/pkg/sshagent
|
||||||
github.com/containers/buildah/pkg/util
|
github.com/containers/buildah/pkg/util
|
||||||
github.com/containers/buildah/util
|
github.com/containers/buildah/util
|
||||||
# github.com/containers/common v0.50.2-0.20230117154327-37d31888e634
|
# github.com/containers/common v0.50.2-0.20230118142943-edca0cc051c8
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
github.com/containers/common/libimage
|
github.com/containers/common/libimage
|
||||||
github.com/containers/common/libimage/define
|
github.com/containers/common/libimage/define
|
||||||
|
@ -269,7 +269,7 @@ github.com/containers/psgo/internal/dev
|
||||||
github.com/containers/psgo/internal/host
|
github.com/containers/psgo/internal/host
|
||||||
github.com/containers/psgo/internal/proc
|
github.com/containers/psgo/internal/proc
|
||||||
github.com/containers/psgo/internal/process
|
github.com/containers/psgo/internal/process
|
||||||
# github.com/containers/storage v1.45.0
|
# github.com/containers/storage v1.45.1
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
github.com/containers/storage
|
github.com/containers/storage
|
||||||
github.com/containers/storage/drivers
|
github.com/containers/storage/drivers
|
||||||
|
@ -582,7 +582,7 @@ github.com/onsi/ginkgo/reporters/stenographer
|
||||||
github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable
|
github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable
|
||||||
github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty
|
github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty
|
||||||
github.com/onsi/ginkgo/types
|
github.com/onsi/ginkgo/types
|
||||||
# github.com/onsi/gomega v1.24.2
|
# github.com/onsi/gomega v1.25.0
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
github.com/onsi/gomega
|
github.com/onsi/gomega
|
||||||
github.com/onsi/gomega/format
|
github.com/onsi/gomega/format
|
||||||
|
|
Loading…
Reference in New Issue