Merge pull request #9004 from baude/existsoptions

Add binding options for container|pod exists
This commit is contained in:
OpenShift Merge Robot
2021-01-19 08:47:37 -05:00
committed by GitHub
15 changed files with 326 additions and 27 deletions

View File

@ -341,13 +341,15 @@ func Wait(ctx context.Context, nameOrID string, options *WaitOptions) (int32, er
// Exists is a quick, light-weight way to determine if a given container
// exists in local storage. The nameOrID can be a container name
// or a partial/full ID.
func Exists(ctx context.Context, nameOrID string, external bool) (bool, error) {
func Exists(ctx context.Context, nameOrID string, options *ExistsOptions) (bool, error) {
conn, err := bindings.GetClient(ctx)
if err != nil {
return false, err
}
params := url.Values{}
params.Set("external", strconv.FormatBool(external))
params, err := options.ToParams()
if err != nil {
return false, err
}
response, err := conn.DoRequest(nil, http.MethodGet, "/containers/%s/exists", params, nil, nameOrID)
if err != nil {
return false, err

View File

@ -237,3 +237,10 @@ type ExecStartAndAttachOptions struct {
// If false, stdout will not be attached
AttachInput *bool
}
//go:generate go run ../generator/generator.go ExistsOptions
// ExistsOptions are optional options for checking if a container exists
type ExistsOptions struct {
// External checks for containers created outside of Podman
External *bool
}

View File

@ -0,0 +1,104 @@
package containers
import (
"net/url"
"reflect"
"strconv"
"strings"
jsoniter "github.com/json-iterator/go"
"github.com/pkg/errors"
)
/*
This file is generated automatically by go generate. Do not edit.
*/
// Changed
func (o *ExistsOptions) Changed(fieldName string) bool {
r := reflect.ValueOf(o)
value := reflect.Indirect(r).FieldByName(fieldName)
return !value.IsNil()
}
// ToParams
func (o *ExistsOptions) ToParams() (url.Values, error) {
params := url.Values{}
if o == nil {
return params, nil
}
json := jsoniter.ConfigCompatibleWithStandardLibrary
s := reflect.ValueOf(o)
if reflect.Ptr == s.Kind() {
s = s.Elem()
}
sType := s.Type()
for i := 0; i < s.NumField(); i++ {
fieldName := sType.Field(i).Name
if !o.Changed(fieldName) {
continue
}
fieldName = strings.ToLower(fieldName)
f := s.Field(i)
if reflect.Ptr == f.Kind() {
f = f.Elem()
}
switch f.Kind() {
case reflect.Bool:
params.Set(fieldName, strconv.FormatBool(f.Bool()))
case reflect.String:
params.Set(fieldName, f.String())
case reflect.Int, reflect.Int64:
// f.Int() is always an int64
params.Set(fieldName, strconv.FormatInt(f.Int(), 10))
case reflect.Uint, reflect.Uint64:
// f.Uint() is always an uint64
params.Set(fieldName, strconv.FormatUint(f.Uint(), 10))
case reflect.Slice:
typ := reflect.TypeOf(f.Interface()).Elem()
switch typ.Kind() {
case reflect.String:
sl := f.Slice(0, f.Len())
s, ok := sl.Interface().([]string)
if !ok {
return nil, errors.New("failed to convert to string slice")
}
for _, val := range s {
params.Add(fieldName, val)
}
default:
return nil, errors.Errorf("unknown slice type %s", f.Kind().String())
}
case reflect.Map:
lowerCaseKeys := make(map[string][]string)
iter := f.MapRange()
for iter.Next() {
lowerCaseKeys[iter.Key().Interface().(string)] = iter.Value().Interface().([]string)
}
s, err := json.MarshalToString(lowerCaseKeys)
if err != nil {
return nil, err
}
params.Set(fieldName, s)
}
}
return params, nil
}
// WithExternal
func (o *ExistsOptions) WithExternal(value bool) *ExistsOptions {
v := &value
o.External = v
return o
}
// GetExternal
func (o *ExistsOptions) GetExternal() bool {
var external bool
if o.External == nil {
return external
}
return *o.External
}

View File

@ -18,7 +18,7 @@ import (
// Exists a lightweight way to determine if an image exists in local storage. It returns a
// boolean response.
func Exists(ctx context.Context, nameOrID string) (bool, error) {
func Exists(ctx context.Context, nameOrID string, options *ExistsOptions) (bool, error) {
conn, err := bindings.GetClient(ctx)
if err != nil {
return false, err

View File

@ -193,3 +193,8 @@ type PullOptions struct {
type BuildOptions struct {
imagebuildah.BuildOptions
}
//go:generate go run ../generator/generator.go ExistsOptions
// ExistsOptions are optional options for checking if an image exists
type ExistsOptions struct {
}

View File

@ -0,0 +1,88 @@
package images
import (
"net/url"
"reflect"
"strconv"
"strings"
jsoniter "github.com/json-iterator/go"
"github.com/pkg/errors"
)
/*
This file is generated automatically by go generate. Do not edit.
*/
// Changed
func (o *ExistsOptions) Changed(fieldName string) bool {
r := reflect.ValueOf(o)
value := reflect.Indirect(r).FieldByName(fieldName)
return !value.IsNil()
}
// ToParams
func (o *ExistsOptions) ToParams() (url.Values, error) {
params := url.Values{}
if o == nil {
return params, nil
}
json := jsoniter.ConfigCompatibleWithStandardLibrary
s := reflect.ValueOf(o)
if reflect.Ptr == s.Kind() {
s = s.Elem()
}
sType := s.Type()
for i := 0; i < s.NumField(); i++ {
fieldName := sType.Field(i).Name
if !o.Changed(fieldName) {
continue
}
fieldName = strings.ToLower(fieldName)
f := s.Field(i)
if reflect.Ptr == f.Kind() {
f = f.Elem()
}
switch f.Kind() {
case reflect.Bool:
params.Set(fieldName, strconv.FormatBool(f.Bool()))
case reflect.String:
params.Set(fieldName, f.String())
case reflect.Int, reflect.Int64:
// f.Int() is always an int64
params.Set(fieldName, strconv.FormatInt(f.Int(), 10))
case reflect.Uint, reflect.Uint64:
// f.Uint() is always an uint64
params.Set(fieldName, strconv.FormatUint(f.Uint(), 10))
case reflect.Slice:
typ := reflect.TypeOf(f.Interface()).Elem()
switch typ.Kind() {
case reflect.String:
sl := f.Slice(0, f.Len())
s, ok := sl.Interface().([]string)
if !ok {
return nil, errors.New("failed to convert to string slice")
}
for _, val := range s {
params.Add(fieldName, val)
}
default:
return nil, errors.Errorf("unknown slice type %s", f.Kind().String())
}
case reflect.Map:
lowerCaseKeys := make(map[string][]string)
iter := f.MapRange()
for iter.Next() {
lowerCaseKeys[iter.Key().Interface().(string)] = iter.Value().Interface().([]string)
}
s, err := json.MarshalToString(lowerCaseKeys)
if err != nil {
return nil, err
}
params.Set(fieldName, s)
}
}
return params, nil
}

View File

@ -38,7 +38,7 @@ func CreatePodFromSpec(ctx context.Context, s *specgen.PodSpecGenerator, options
}
// Exists is a lightweight method to determine if a pod exists in local storage
func Exists(ctx context.Context, nameOrID string) (bool, error) {
func Exists(ctx context.Context, nameOrID string, options *ExistsOptions) (bool, error) {
conn, err := bindings.GetClient(ctx)
if err != nil {
return false, err

View File

@ -70,3 +70,8 @@ type StatsOptions struct {
type RemoveOptions struct {
Force *bool
}
//go:generate go run ../generator/generator.go ExistsOptions
// ExistsOptions are optional options for checking if a pod exists
type ExistsOptions struct {
}

View File

@ -0,0 +1,88 @@
package pods
import (
"net/url"
"reflect"
"strconv"
"strings"
jsoniter "github.com/json-iterator/go"
"github.com/pkg/errors"
)
/*
This file is generated automatically by go generate. Do not edit.
*/
// Changed
func (o *ExistsOptions) Changed(fieldName string) bool {
r := reflect.ValueOf(o)
value := reflect.Indirect(r).FieldByName(fieldName)
return !value.IsNil()
}
// ToParams
func (o *ExistsOptions) ToParams() (url.Values, error) {
params := url.Values{}
if o == nil {
return params, nil
}
json := jsoniter.ConfigCompatibleWithStandardLibrary
s := reflect.ValueOf(o)
if reflect.Ptr == s.Kind() {
s = s.Elem()
}
sType := s.Type()
for i := 0; i < s.NumField(); i++ {
fieldName := sType.Field(i).Name
if !o.Changed(fieldName) {
continue
}
fieldName = strings.ToLower(fieldName)
f := s.Field(i)
if reflect.Ptr == f.Kind() {
f = f.Elem()
}
switch f.Kind() {
case reflect.Bool:
params.Set(fieldName, strconv.FormatBool(f.Bool()))
case reflect.String:
params.Set(fieldName, f.String())
case reflect.Int, reflect.Int64:
// f.Int() is always an int64
params.Set(fieldName, strconv.FormatInt(f.Int(), 10))
case reflect.Uint, reflect.Uint64:
// f.Uint() is always an uint64
params.Set(fieldName, strconv.FormatUint(f.Uint(), 10))
case reflect.Slice:
typ := reflect.TypeOf(f.Interface()).Elem()
switch typ.Kind() {
case reflect.String:
sl := f.Slice(0, f.Len())
s, ok := sl.Interface().([]string)
if !ok {
return nil, errors.New("failed to convert to string slice")
}
for _, val := range s {
params.Add(fieldName, val)
}
default:
return nil, errors.Errorf("unknown slice type %s", f.Kind().String())
}
case reflect.Map:
lowerCaseKeys := make(map[string][]string)
iter := f.MapRange()
for iter.Next() {
lowerCaseKeys[iter.Key().Interface().(string)] = iter.Value().Interface().([]string)
}
s, err := json.MarshalToString(lowerCaseKeys)
if err != nil {
return nil, err
}
params.Set(fieldName, s)
}
}
return params, nil
}

View File

@ -406,7 +406,7 @@ var _ = Describe("Podman containers ", func() {
It("podman bogus container does not exist in local storage", func() {
// Bogus container existence check should fail
containerExists, err := containers.Exists(bt.conn, "foobar", false)
containerExists, err := containers.Exists(bt.conn, "foobar", nil)
Expect(err).To(BeNil())
Expect(containerExists).To(BeFalse())
})
@ -416,7 +416,7 @@ var _ = Describe("Podman containers ", func() {
var name = "top"
_, err := bt.RunTopContainer(&name, bindings.PFalse, nil)
Expect(err).To(BeNil())
containerExists, err := containers.Exists(bt.conn, name, false)
containerExists, err := containers.Exists(bt.conn, name, nil)
Expect(err).To(BeNil())
Expect(containerExists).To(BeTrue())
})
@ -426,7 +426,7 @@ var _ = Describe("Podman containers ", func() {
var name = "top"
cid, err := bt.RunTopContainer(&name, bindings.PFalse, nil)
Expect(err).To(BeNil())
containerExists, err := containers.Exists(bt.conn, cid, false)
containerExists, err := containers.Exists(bt.conn, cid, nil)
Expect(err).To(BeNil())
Expect(containerExists).To(BeTrue())
})
@ -436,7 +436,7 @@ var _ = Describe("Podman containers ", func() {
var name = "top"
cid, err := bt.RunTopContainer(&name, bindings.PFalse, nil)
Expect(err).To(BeNil())
containerExists, err := containers.Exists(bt.conn, cid[0:12], false)
containerExists, err := containers.Exists(bt.conn, cid[0:12], nil)
Expect(err).To(BeNil())
Expect(containerExists).To(BeTrue())
})
@ -456,7 +456,7 @@ var _ = Describe("Podman containers ", func() {
Expect(err).To(BeNil())
err = containers.Kill(bt.conn, name, "SIGINT", nil)
Expect(err).To(BeNil())
_, err = containers.Exists(bt.conn, name, false)
_, err = containers.Exists(bt.conn, name, nil)
Expect(err).To(BeNil())
})
@ -467,7 +467,7 @@ var _ = Describe("Podman containers ", func() {
Expect(err).To(BeNil())
err = containers.Kill(bt.conn, cid, "SIGTERM", nil)
Expect(err).To(BeNil())
_, err = containers.Exists(bt.conn, cid, false)
_, err = containers.Exists(bt.conn, cid, nil)
Expect(err).To(BeNil())
})

View File

@ -194,17 +194,17 @@ var _ = Describe("Podman images", func() {
It("Image Exists", func() {
// exists on bogus image should be false, with no error
exists, err := images.Exists(bt.conn, "foobar")
exists, err := images.Exists(bt.conn, "foobar", nil)
Expect(err).To(BeNil())
Expect(exists).To(BeFalse())
// exists with shortname should be true
exists, err = images.Exists(bt.conn, alpine.shortName)
exists, err = images.Exists(bt.conn, alpine.shortName, nil)
Expect(err).To(BeNil())
Expect(exists).To(BeTrue())
// exists with fqname should be true
exists, err = images.Exists(bt.conn, alpine.name)
exists, err = images.Exists(bt.conn, alpine.name, nil)
Expect(err).To(BeNil())
Expect(exists).To(BeTrue())
})
@ -213,7 +213,7 @@ var _ = Describe("Podman images", func() {
// load an image
_, errs := images.Remove(bt.conn, []string{alpine.name}, nil)
Expect(len(errs)).To(BeZero())
exists, err := images.Exists(bt.conn, alpine.name)
exists, err := images.Exists(bt.conn, alpine.name, nil)
Expect(err).To(BeNil())
Expect(exists).To(BeFalse())
f, err := os.Open(filepath.Join(ImageCacheDir, alpine.tarballName))
@ -222,7 +222,7 @@ var _ = Describe("Podman images", func() {
names, err := images.Load(bt.conn, f)
Expect(err).To(BeNil())
Expect(names.Names[0]).To(Equal(alpine.name))
exists, err = images.Exists(bt.conn, alpine.name)
exists, err = images.Exists(bt.conn, alpine.name, nil)
Expect(err).To(BeNil())
Expect(exists).To(BeTrue())
@ -231,7 +231,7 @@ var _ = Describe("Podman images", func() {
Expect(err).To(BeNil())
_, errs = images.Remove(bt.conn, []string{alpine.name}, nil)
Expect(len(errs)).To(BeZero())
exists, err = images.Exists(bt.conn, alpine.name)
exists, err = images.Exists(bt.conn, alpine.name, nil)
Expect(err).To(BeNil())
Expect(exists).To(BeFalse())
names, err = images.Load(bt.conn, f)
@ -243,7 +243,7 @@ var _ = Describe("Podman images", func() {
Expect(err).To(BeNil())
_, errs = images.Remove(bt.conn, []string{alpine.name}, nil)
Expect(len(errs)).To(BeZero())
exists, err = images.Exists(bt.conn, alpine.name)
exists, err = images.Exists(bt.conn, alpine.name, nil)
Expect(err).To(BeNil())
Expect(exists).To(BeFalse())
})
@ -266,7 +266,7 @@ var _ = Describe("Podman images", func() {
// load an image
_, errs := images.Remove(bt.conn, []string{alpine.name}, nil)
Expect(len(errs)).To(BeZero())
exists, err := images.Exists(bt.conn, alpine.name)
exists, err := images.Exists(bt.conn, alpine.name, nil)
Expect(err).To(BeNil())
Expect(exists).To(BeFalse())
f, err := os.Open(filepath.Join(ImageCacheDir, alpine.tarballName))
@ -277,7 +277,7 @@ var _ = Describe("Podman images", func() {
options := new(images.ImportOptions).WithMessage(testMessage).WithChanges(changes).WithReference(alpine.name)
_, err = images.Import(bt.conn, f, options)
Expect(err).To(BeNil())
exists, err = images.Exists(bt.conn, alpine.name)
exists, err = images.Exists(bt.conn, alpine.name, nil)
Expect(err).To(BeNil())
Expect(exists).To(BeTrue())
data, err := images.GetImage(bt.conn, alpine.name, nil)
@ -357,7 +357,7 @@ var _ = Describe("Podman images", func() {
Expect(err).NotTo(HaveOccurred())
Expect(len(pulledImages)).To(Equal(1))
exists, err := images.Exists(bt.conn, rawImage)
exists, err := images.Exists(bt.conn, rawImage, nil)
Expect(err).NotTo(HaveOccurred())
Expect(exists).To(BeTrue())

View File

@ -157,12 +157,12 @@ var _ = Describe("Podman pods", func() {
// The test validates if the exists responds
It("exists pod", func() {
response, err := pods.Exists(bt.conn, "dummyName")
response, err := pods.Exists(bt.conn, "dummyName", nil)
Expect(err).To(BeNil())
Expect(response).To(BeFalse())
// Should exit with no error and response should be true
response, err = pods.Exists(bt.conn, "newpod")
response, err = pods.Exists(bt.conn, "newpod", nil)
Expect(err).To(BeNil())
Expect(response).To(BeTrue())
})
@ -338,7 +338,7 @@ var _ = Describe("Podman pods", func() {
_, err := pods.CreatePodFromSpec(bt.conn, &ps, nil)
Expect(err).To(BeNil())
exists, err := pods.Exists(bt.conn, "foobar")
exists, err := pods.Exists(bt.conn, "foobar", nil)
Expect(err).To(BeNil())
Expect(exists).To(BeTrue())
})

View File

@ -31,7 +31,7 @@ func (ic *ContainerEngine) ContainerRunlabel(ctx context.Context, label string,
}
func (ic *ContainerEngine) ContainerExists(ctx context.Context, nameOrID string, options entities.ContainerExistsOptions) (*entities.BoolReport, error) {
exists, err := containers.Exists(ic.ClientCtx, nameOrID, options.External)
exists, err := containers.Exists(ic.ClientCtx, nameOrID, new(containers.ExistsOptions).WithExternal(options.External))
return &entities.BoolReport{Value: exists}, err
}

View File

@ -22,7 +22,7 @@ import (
)
func (ir *ImageEngine) Exists(_ context.Context, nameOrID string) (*entities.BoolReport, error) {
found, err := images.Exists(ir.ClientCtx, nameOrID)
found, err := images.Exists(ir.ClientCtx, nameOrID, nil)
return &entities.BoolReport{Value: found}, err
}

View File

@ -12,7 +12,7 @@ import (
)
func (ic *ContainerEngine) PodExists(ctx context.Context, nameOrID string) (*entities.BoolReport, error) {
exists, err := pods.Exists(ic.ClientCtx, nameOrID)
exists, err := pods.Exists(ic.ClientCtx, nameOrID, nil)
return &entities.BoolReport{Value: exists}, err
}