Skip to content

Commit

Permalink
Add binding options for container|pod exists
Browse files Browse the repository at this point in the history
It turns out an options was added to container exists so it makes sense
to have pods and container exists calls have an optional structure for
options.

Signed-off-by: baude <[email protected]>
  • Loading branch information
baude committed Jan 18, 2021
1 parent 5b3c7a5 commit 4ccb072
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 4ccb072

Please sign in to comment.