Skip to content

Commit

Permalink
Merge pull request #9004 from baude/existsoptions
Browse files Browse the repository at this point in the history
Add binding options for container|pod exists
  • Loading branch information
openshift-merge-robot authored Jan 19, 2021
2 parents 9a10f20 + 4ccb072 commit 8c6df5e
Show file tree
Hide file tree
Showing 15 changed files with 326 additions and 27 deletions.
8 changes: 5 additions & 3 deletions pkg/bindings/containers/containers.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 7 additions & 0 deletions pkg/bindings/containers/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
104 changes: 104 additions & 0 deletions pkg/bindings/containers/types_exists_options.go
Original file line number Diff line number Diff line change
@@ -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
}
2 changes: 1 addition & 1 deletion pkg/bindings/images/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions pkg/bindings/images/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
}
88 changes: 88 additions & 0 deletions pkg/bindings/images/types_exists_options.go
Original file line number Diff line number Diff line change
@@ -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
}
2 changes: 1 addition & 1 deletion pkg/bindings/pods/pods.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions pkg/bindings/pods/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
}
88 changes: 88 additions & 0 deletions pkg/bindings/pods/types_exists_options.go
Original file line number Diff line number Diff line change
@@ -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
}
Loading

0 comments on commit 8c6df5e

Please sign in to comment.