diff --git a/example/play/Gopkg.lock b/example/play/Gopkg.lock new file mode 100644 index 0000000000..0734663e05 --- /dev/null +++ b/example/play/Gopkg.lock @@ -0,0 +1,225 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + name = "github.com/PuerkitoBio/purell" + packages = ["."] + revision = "0bcb03f4b4d0a9428594752bd2a3b9aa0a9d4bd4" + version = "v1.1.0" + +[[projects]] + branch = "master" + name = "github.com/PuerkitoBio/urlesc" + packages = ["."] + revision = "de5bf2ad457846296e2031421a34e2568e304e35" + +[[projects]] + branch = "master" + name = "github.com/coreos/operator-sdk" + packages = ["pkg/sdk","pkg/sdk/handler","pkg/sdk/informer","pkg/sdk/types"] + revision = "ada848f3670b4957f27f29b50e4bb6f7a8402945" + +[[projects]] + name = "github.com/davecgh/go-spew" + packages = ["spew"] + revision = "346938d642f2ec3594ed81d874461961cd0faa76" + version = "v1.1.0" + +[[projects]] + name = "github.com/emicklei/go-restful" + packages = [".","log"] + revision = "26b41036311f2da8242db402557a0dbd09dc83da" + version = "v2.6.0" + +[[projects]] + name = "github.com/emicklei/go-restful-swagger12" + packages = ["."] + revision = "dcef7f55730566d41eae5db10e7d6981829720f6" + version = "1.0.1" + +[[projects]] + name = "github.com/ghodss/yaml" + packages = ["."] + revision = "0ca9ea5df5451ffdf184b4428c902747c2c11cd7" + version = "v1.0.0" + +[[projects]] + branch = "master" + name = "github.com/go-openapi/jsonpointer" + packages = ["."] + revision = "779f45308c19820f1a69e9a4cd965f496e0da10f" + +[[projects]] + branch = "master" + name = "github.com/go-openapi/jsonreference" + packages = ["."] + revision = "36d33bfe519efae5632669801b180bf1a245da3b" + +[[projects]] + branch = "master" + name = "github.com/go-openapi/spec" + packages = ["."] + revision = "81ece4e11fc275587f168735dd1276f5fd7badd2" + +[[projects]] + branch = "master" + name = "github.com/go-openapi/swag" + packages = ["."] + revision = "84f4bee7c0a6db40e3166044c7983c1c32125429" + +[[projects]] + name = "github.com/gogo/protobuf" + packages = ["proto","sortkeys"] + revision = "1adfc126b41513cc696b209667c8656ea7aac67c" + version = "v1.0.0" + +[[projects]] + branch = "master" + name = "github.com/golang/glog" + packages = ["."] + revision = "23def4e6c14b4da8ac2ed8007337bc5eb5007998" + +[[projects]] + name = "github.com/golang/protobuf" + packages = ["proto","ptypes","ptypes/any","ptypes/duration","ptypes/timestamp"] + revision = "925541529c1fa6821df4e44ce2723319eb2be768" + version = "v1.0.0" + +[[projects]] + branch = "master" + name = "github.com/google/btree" + packages = ["."] + revision = "e89373fe6b4a7413d7acd6da1725b83ef713e6e4" + +[[projects]] + branch = "master" + name = "github.com/google/gofuzz" + packages = ["."] + revision = "24818f796faf91cd76ec7bddd72458fbced7a6c1" + +[[projects]] + name = "github.com/googleapis/gnostic" + packages = ["OpenAPIv2","compiler","extensions"] + revision = "ee43cbb60db7bd22502942cccbc39059117352ab" + version = "v0.1.0" + +[[projects]] + branch = "master" + name = "github.com/gregjones/httpcache" + packages = [".","diskcache"] + revision = "2bcd89a1743fd4b373f7370ce8ddc14dfbd18229" + +[[projects]] + branch = "master" + name = "github.com/hashicorp/golang-lru" + packages = [".","simplelru"] + revision = "0fb14efe8c47ae851c0034ed7a448854d3d34cf3" + +[[projects]] + name = "github.com/json-iterator/go" + packages = ["."] + revision = "28452fcdec4e44348d2af0d91d1e9e38da3a9e0a" + version = "1.0.5" + +[[projects]] + name = "github.com/juju/ratelimit" + packages = ["."] + revision = "59fac5042749a5afb9af70e813da1dd5474f0167" + version = "1.0.1" + +[[projects]] + branch = "master" + name = "github.com/mailru/easyjson" + packages = ["buffer","jlexer","jwriter"] + revision = "32fa128f234d041f196a9f3e0fea5ac9772c08e1" + +[[projects]] + branch = "master" + name = "github.com/petar/GoLLRB" + packages = ["llrb"] + revision = "53be0d36a84c2a886ca057d34b6aa4468df9ccb4" + +[[projects]] + name = "github.com/peterbourgon/diskv" + packages = ["."] + revision = "5f041e8faa004a95c88a202771f4cc3e991971e6" + version = "v2.0.1" + +[[projects]] + name = "github.com/sirupsen/logrus" + packages = ["."] + revision = "d682213848ed68c0a260ca37d6dd5ace8423f5ba" + version = "v1.0.4" + +[[projects]] + name = "github.com/spf13/pflag" + packages = ["."] + revision = "e57e3eeb33f795204c1ca35f56c44f83227c6e66" + version = "v1.0.0" + +[[projects]] + branch = "master" + name = "golang.org/x/crypto" + packages = ["ssh/terminal"] + revision = "d9133f5469342136e669e85192a26056b587f503" + +[[projects]] + branch = "master" + name = "golang.org/x/net" + packages = ["context","http2","http2/hpack","idna","lex/httplex"] + revision = "2fb46b16b8dda405028c50f7c7f0f9dd1fa6bfb1" + +[[projects]] + branch = "master" + name = "golang.org/x/sys" + packages = ["unix","windows"] + revision = "37707fdb30a5b38865cfb95e5aab41707daec7fd" + +[[projects]] + branch = "master" + name = "golang.org/x/text" + packages = ["collate","collate/build","internal/colltab","internal/gen","internal/tag","internal/triegen","internal/ucd","language","secure/bidirule","transform","unicode/bidi","unicode/cldr","unicode/norm","unicode/rangetable","width"] + revision = "e19ae1496984b1c655b8044a65c0300a3c878dd3" + +[[projects]] + name = "gopkg.in/inf.v0" + packages = ["."] + revision = "3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4" + version = "v0.9.0" + +[[projects]] + branch = "v2" + name = "gopkg.in/yaml.v2" + packages = ["."] + revision = "d670f9405373e636a5a2765eea47fac0c9bc91a4" + +[[projects]] + name = "k8s.io/api" + packages = ["admissionregistration/v1alpha1","apps/v1beta1","apps/v1beta2","authentication/v1","authentication/v1beta1","authorization/v1","authorization/v1beta1","autoscaling/v1","autoscaling/v2beta1","batch/v1","batch/v1beta1","batch/v2alpha1","certificates/v1beta1","core/v1","extensions/v1beta1","networking/v1","policy/v1beta1","rbac/v1","rbac/v1alpha1","rbac/v1beta1","scheduling/v1alpha1","settings/v1alpha1","storage/v1","storage/v1beta1"] + revision = "4df58c811fe2e65feb879227b2b245e4dc26e7ad" + version = "kubernetes-1.8.2" + +[[projects]] + name = "k8s.io/apimachinery" + packages = ["pkg/api/equality","pkg/api/errors","pkg/api/meta","pkg/api/resource","pkg/apis/meta/internalversion","pkg/apis/meta/v1","pkg/apis/meta/v1/unstructured","pkg/apis/meta/v1alpha1","pkg/conversion","pkg/conversion/queryparams","pkg/conversion/unstructured","pkg/fields","pkg/labels","pkg/runtime","pkg/runtime/schema","pkg/runtime/serializer","pkg/runtime/serializer/json","pkg/runtime/serializer/protobuf","pkg/runtime/serializer/recognizer","pkg/runtime/serializer/streaming","pkg/runtime/serializer/versioning","pkg/selection","pkg/types","pkg/util/cache","pkg/util/clock","pkg/util/diff","pkg/util/errors","pkg/util/framer","pkg/util/intstr","pkg/util/json","pkg/util/net","pkg/util/runtime","pkg/util/sets","pkg/util/validation","pkg/util/validation/field","pkg/util/wait","pkg/util/yaml","pkg/version","pkg/watch","third_party/forked/golang/reflect"] + revision = "019ae5ada31de202164b118aee88ee2d14075c31" + version = "kubernetes-1.8.0" + +[[projects]] + name = "k8s.io/client-go" + packages = ["discovery","discovery/fake","kubernetes/scheme","pkg/version","rest","rest/watch","testing","tools/cache","tools/clientcmd/api","tools/metrics","tools/pager","transport","util/cert","util/flowcontrol","util/integer","util/workqueue"] + revision = "35ccd4336052e7d73018b1382413534936f34eee" + version = "kubernetes-1.8.2" + +[[projects]] + branch = "master" + name = "k8s.io/kube-openapi" + packages = ["pkg/common"] + revision = "275e2ce91dec4c05a4094a7b1daee5560b555ac9" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "69b629673d66cb41597c8e999d40acb417b556e2bb0ed2c82acbbb94d117f136" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/example/play/Gopkg.toml b/example/play/Gopkg.toml new file mode 100644 index 0000000000..f5696064c7 --- /dev/null +++ b/example/play/Gopkg.toml @@ -0,0 +1,33 @@ + +# Gopkg.toml example +# +# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" + +[[constraint]] + name = "github.com/sirupsen/logrus" + version = "1.0.4" + +[[constraint]] + name = "k8s.io/api" + version = "kubernetes-1.8.2" + +[[constraint]] + name = "k8s.io/client-go" + version = "kubernetes-1.8.2" diff --git a/example/play/cmd/play/main.go b/example/play/cmd/play/main.go new file mode 100644 index 0000000000..7ea40bbae7 --- /dev/null +++ b/example/play/cmd/play/main.go @@ -0,0 +1,16 @@ +package main + +import ( + "context" + + sdk "github.com/coreos/operator-sdk/pkg/sdk" + api "github.com/coreos/play/pkg/apis/play/v1alpha1" + stub "github.com/coreos/play/pkg/apis/stub" +) + +func main() { + namespace := "default" + sdk.Watch(api.PlayServicePlural, namespace, api.PlayService) + sdk.Handle(&stub.Handler{}) + sdk.Run(context.TODO()) +} diff --git a/example/play/config/config.yaml b/example/play/config/config.yaml new file mode 100644 index 0000000000..9bf8932029 --- /dev/null +++ b/example/play/config/config.yaml @@ -0,0 +1,5 @@ +--- +project-path: $GOPTH/src/github.com/example.com/play +api-group: play/example.com/v1 +kind: PlayService + diff --git a/example/play/deploy/play/operator.yaml b/example/play/deploy/play/operator.yaml new file mode 100644 index 0000000000..5cf9f0003c --- /dev/null +++ b/example/play/deploy/play/operator.yaml @@ -0,0 +1,24 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: playservices.play.example.com +spec: + group: play.example.com + names: + kind: PlayService + listKind: PlayServiceList + plural: playservices + singular: playservice + scope: Namespaced + version: v1alpha1 +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: play-operator +spec: + replicas: 1 + spec: + containers: + - name: play-operator + image: quay.io/coreos/play-operator:latest diff --git a/example/play/pkg/apis/play/v1alpha1/doc.go b/example/play/pkg/apis/play/v1alpha1/doc.go new file mode 100644 index 0000000000..bf31429760 --- /dev/null +++ b/example/play/pkg/apis/play/v1alpha1/doc.go @@ -0,0 +1,3 @@ +// +k8s:deepcopy-gen=package +// +groupName=play.example.com +package v1alpha1 diff --git a/example/play/pkg/apis/play/v1alpha1/register.go b/example/play/pkg/apis/play/v1alpha1/register.go new file mode 100644 index 0000000000..ba3f0582b9 --- /dev/null +++ b/example/play/pkg/apis/play/v1alpha1/register.go @@ -0,0 +1,30 @@ +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +const ( + PlayServiceKind = "PlayService" + PlayServicePlural = "playservices" + groupName = "play.example.com" +) + +var ( + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + AddToScheme = SchemeBuilder.AddToSchemes + // SchemeGroupVersion is the group version used to register these objects. + SchemeGroupVersion = schema.GroupVersion{Group: groupName, Version: "v1alpha1"} +) + +// addKnownTypes adds the set of types defined in this package to the supplied scheme. +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &PlayService{}, + &PlayServiceList{}, + ) + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/example/play/pkg/apis/play/v1alpha1/types.go b/example/play/pkg/apis/play/v1alpha1/types.go new file mode 100644 index 0000000000..58f75ce2a3 --- /dev/null +++ b/example/play/pkg/apis/play/v1alpha1/types.go @@ -0,0 +1,32 @@ +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +type PlayServiceList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata"` + Items []PlayService `json:"items"` +} + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +type PlayService struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata"` + Spec PlayServiceSpec `json:"spec"` + Status PlayServiceStatus `json:"status,omitempty"` +} + +type PlayServiceSpec struct { + Replica int32 `json:"replica,omitempty"` + // Fills me +} + +type PlayServiceStatus struct { + // Fills me +} diff --git a/example/play/pkg/apis/play/v1alpha1/zz_generated.deepcopy.go b/example/play/pkg/apis/play/v1alpha1/zz_generated.deepcopy.go new file mode 100644 index 0000000000..0d2d0e0dc3 --- /dev/null +++ b/example/play/pkg/apis/play/v1alpha1/zz_generated.deepcopy.go @@ -0,0 +1,135 @@ +// +build !ignore_autogenerated + +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/ +// This file was autogenerated by deepcopy-gen. Do not edit it manually! + +package v1alpha1 + +import ( + conversion "k8s.io/apimachinery/pkg/conversion" + runtime "k8s.io/apimachinery/pkg/runtime" + reflect "reflect" +) + +// GetGeneratedDeepCopyFuncs returns the generated funcs, since we aren't registering them. +// +// Deprecated: deepcopy registration will go away when static deepcopy is fully implemented. +func GetGeneratedDeepCopyFuncs() []conversion.GeneratedDeepCopyFunc { + return []conversion.GeneratedDeepCopyFunc{ + {Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*PlayService).DeepCopyInto(out.(*PlayService)) + return nil + }, InType: reflect.TypeOf(&PlayService{})}, + {Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*PlayServiceList).DeepCopyInto(out.(*PlayServiceList)) + return nil + }, InType: reflect.TypeOf(&PlayServiceList{})}, + {Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*PlayServiceSpec).DeepCopyInto(out.(*PlayServiceSpec)) + return nil + }, InType: reflect.TypeOf(&PlayServiceSpec{})}, + {Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*PlayServiceStatus).DeepCopyInto(out.(*PlayServiceStatus)) + return nil + }, InType: reflect.TypeOf(&PlayServiceStatus{})}, + } +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PlayService) DeepCopyInto(out *PlayService) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlayService. +func (in *PlayService) DeepCopy() *PlayService { + if in == nil { + return nil + } + out := new(PlayService) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *PlayService) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { + return nil + } +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PlayServiceList) DeepCopyInto(out *PlayServiceList) { + *out = *in + out.TypeMeta = in.TypeMeta + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]PlayService, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlayServiceList. +func (in *PlayServiceList) DeepCopy() *PlayServiceList { + if in == nil { + return nil + } + out := new(PlayServiceList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *PlayServiceList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { + return nil + } +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PlayServiceSpec) DeepCopyInto(out *PlayServiceSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlayServiceSpec. +func (in *PlayServiceSpec) DeepCopy() *PlayServiceSpec { + if in == nil { + return nil + } + out := new(PlayServiceSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PlayServiceStatus) DeepCopyInto(out *PlayServiceStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlayServiceStatus. +func (in *PlayServiceStatus) DeepCopy() *PlayServiceStatus { + if in == nil { + return nil + } + out := new(PlayServiceStatus) + in.DeepCopyInto(out) + return out +} diff --git a/example/play/pkg/client/client.go b/example/play/pkg/client/client.go new file mode 100644 index 0000000000..cddcd408ba --- /dev/null +++ b/example/play/pkg/client/client.go @@ -0,0 +1,42 @@ +package client + +import ( + "net" + "os" + + "github.com/coreos/play/pkg/generated/clientset/versioned" + "k8s.io/client-go/rest" +) + +func MustNewInCluster() versioned.Interface { + cfg, err := InClusterConfig() + if err != nil { + panic(err) + } + return MustNew(cfg) +} + +// MustNew create a new vault client based on the Kubernetes client configuration passed in +func MustNew(cfg *rest.Config) versioned.Interface { + return versioned.NewForConfigOrDie(cfg) +} + +func InClusterConfig() (*rest.Config, error) { + // Work around https://github.com/kubernetes/kubernetes/issues/40973 + // See https://github.com/coreos/etcd-operator/issues/731#issuecomment-283804819 + if len(os.Getenv("KUBERNETES_SERVICE_HOST")) == 0 { + addrs, err := net.LookupHost("kubernetes.default.svc") + if err != nil { + panic(err) + } + os.Setenv("KUBERNETES_SERVICE_HOST", addrs[0]) + } + if len(os.Getenv("KUBERNETES_SERVICE_PORT")) == 0 { + os.Setenv("KUBERNETES_SERVICE_PORT", "443") + } + cfg, err := rest.InClusterConfig() + if err != nil { + return nil, err + } + return cfg, nil +} diff --git a/example/play/pkg/generated/clientset/versioned/clientset.go b/example/play/pkg/generated/clientset/versioned/clientset.go new file mode 100644 index 0000000000..56c69df46a --- /dev/null +++ b/example/play/pkg/generated/clientset/versioned/clientset.go @@ -0,0 +1,86 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/package versioned + +import ( + playv1alpha1 "github.com/coreos/play/pkg/generated/clientset/versioned/typed/play/v1alpha1" + glog "github.com/golang/glog" + discovery "k8s.io/client-go/discovery" + rest "k8s.io/client-go/rest" + flowcontrol "k8s.io/client-go/util/flowcontrol" +) + +type Interface interface { + Discovery() discovery.DiscoveryInterface + PlayV1alpha1() playv1alpha1.PlayV1alpha1Interface + // Deprecated: please explicitly pick a version if possible. + Play() playv1alpha1.PlayV1alpha1Interface +} + +// Clientset contains the clients for groups. Each group has exactly one +// version included in a Clientset. +type Clientset struct { + *discovery.DiscoveryClient + playV1alpha1 *playv1alpha1.PlayV1alpha1Client +} + +// PlayV1alpha1 retrieves the PlayV1alpha1Client +func (c *Clientset) PlayV1alpha1() playv1alpha1.PlayV1alpha1Interface { + return c.playV1alpha1 +} + +// Deprecated: Play retrieves the default version of PlayClient. +// Please explicitly pick a version. +func (c *Clientset) Play() playv1alpha1.PlayV1alpha1Interface { + return c.playV1alpha1 +} + +// Discovery retrieves the DiscoveryClient +func (c *Clientset) Discovery() discovery.DiscoveryInterface { + if c == nil { + return nil + } + return c.DiscoveryClient +} + +// NewForConfig creates a new Clientset for the given config. +func NewForConfig(c *rest.Config) (*Clientset, error) { + configShallowCopy := *c + if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { + configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst) + } + var cs Clientset + var err error + cs.playV1alpha1, err = playv1alpha1.NewForConfig(&configShallowCopy) + if err != nil { + return nil, err + } + + cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) + if err != nil { + glog.Errorf("failed to create the DiscoveryClient: %v", err) + return nil, err + } + return &cs, nil +} + +// NewForConfigOrDie creates a new Clientset for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *Clientset { + var cs Clientset + cs.playV1alpha1 = playv1alpha1.NewForConfigOrDie(c) + + cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) + return &cs +} + +// New creates a new Clientset for the given RESTClient. +func New(c rest.Interface) *Clientset { + var cs Clientset + cs.playV1alpha1 = playv1alpha1.New(c) + + cs.DiscoveryClient = discovery.NewDiscoveryClient(c) + return &cs +} diff --git a/example/play/pkg/generated/clientset/versioned/doc.go b/example/play/pkg/generated/clientset/versioned/doc.go new file mode 100644 index 0000000000..f0b967dc79 --- /dev/null +++ b/example/play/pkg/generated/clientset/versioned/doc.go @@ -0,0 +1,6 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/ // This package has the automatically generated clientset. +package versioned diff --git a/example/play/pkg/generated/clientset/versioned/fake/clientset_generated.go b/example/play/pkg/generated/clientset/versioned/fake/clientset_generated.go new file mode 100644 index 0000000000..fa4aaf7ec7 --- /dev/null +++ b/example/play/pkg/generated/clientset/versioned/fake/clientset_generated.go @@ -0,0 +1,59 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/package fake + +import ( + clientset "github.com/coreos/play/pkg/generated/clientset/versioned" + playv1alpha1 "github.com/coreos/play/pkg/generated/clientset/versioned/typed/play/v1alpha1" + fakeplayv1alpha1 "github.com/coreos/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/fake" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/discovery" + fakediscovery "k8s.io/client-go/discovery/fake" + "k8s.io/client-go/testing" +) + +// NewSimpleClientset returns a clientset that will respond with the provided objects. +// It's backed by a very simple object tracker that processes creates, updates and deletions as-is, +// without applying any validations and/or defaults. It shouldn't be considered a replacement +// for a real clientset and is mostly useful in simple unit tests. +func NewSimpleClientset(objects ...runtime.Object) *Clientset { + o := testing.NewObjectTracker(scheme, codecs.UniversalDecoder()) + for _, obj := range objects { + if err := o.Add(obj); err != nil { + panic(err) + } + } + + fakePtr := testing.Fake{} + fakePtr.AddReactor("*", "*", testing.ObjectReaction(o)) + fakePtr.AddWatchReactor("*", testing.DefaultWatchReactor(watch.NewFake(), nil)) + + return &Clientset{fakePtr, &fakediscovery.FakeDiscovery{Fake: &fakePtr}} +} + +// Clientset implements clientset.Interface. Meant to be embedded into a +// struct to get a default implementation. This makes faking out just the method +// you want to test easier. +type Clientset struct { + testing.Fake + discovery *fakediscovery.FakeDiscovery +} + +func (c *Clientset) Discovery() discovery.DiscoveryInterface { + return c.discovery +} + +var _ clientset.Interface = &Clientset{} + +// PlayV1alpha1 retrieves the PlayV1alpha1Client +func (c *Clientset) PlayV1alpha1() playv1alpha1.PlayV1alpha1Interface { + return &fakeplayv1alpha1.FakePlayV1alpha1{Fake: &c.Fake} +} + +// Play retrieves the PlayV1alpha1Client +func (c *Clientset) Play() playv1alpha1.PlayV1alpha1Interface { + return &fakeplayv1alpha1.FakePlayV1alpha1{Fake: &c.Fake} +} diff --git a/example/play/pkg/generated/clientset/versioned/fake/doc.go b/example/play/pkg/generated/clientset/versioned/fake/doc.go new file mode 100644 index 0000000000..efe87ec1fa --- /dev/null +++ b/example/play/pkg/generated/clientset/versioned/fake/doc.go @@ -0,0 +1,6 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/ // This package has the automatically generated fake clientset. +package fake diff --git a/example/play/pkg/generated/clientset/versioned/fake/register.go b/example/play/pkg/generated/clientset/versioned/fake/register.go new file mode 100644 index 0000000000..b0ffb0ae84 --- /dev/null +++ b/example/play/pkg/generated/clientset/versioned/fake/register.go @@ -0,0 +1,41 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/package fake + +import ( + playv1alpha1 "github.com/coreos/play/pkg/apis/play/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + schema "k8s.io/apimachinery/pkg/runtime/schema" + serializer "k8s.io/apimachinery/pkg/runtime/serializer" +) + +var scheme = runtime.NewScheme() +var codecs = serializer.NewCodecFactory(scheme) +var parameterCodec = runtime.NewParameterCodec(scheme) + +func init() { + v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) + AddToScheme(scheme) +} + +// AddToScheme adds all types of this clientset into the given scheme. This allows composition +// of clientsets, like in: +// +// import ( +// "k8s.io/client-go/kubernetes" +// clientsetscheme "k8s.io/client-go/kuberentes/scheme" +// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" +// ) +// +// kclientset, _ := kubernetes.NewForConfig(c) +// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// +// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types +// correctly. +func AddToScheme(scheme *runtime.Scheme) { + playv1alpha1.AddToScheme(scheme) + +} diff --git a/example/play/pkg/generated/clientset/versioned/scheme/doc.go b/example/play/pkg/generated/clientset/versioned/scheme/doc.go new file mode 100644 index 0000000000..06cd4dca79 --- /dev/null +++ b/example/play/pkg/generated/clientset/versioned/scheme/doc.go @@ -0,0 +1,6 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/ // This package contains the scheme of the automatically generated clientset. +package scheme diff --git a/example/play/pkg/generated/clientset/versioned/scheme/register.go b/example/play/pkg/generated/clientset/versioned/scheme/register.go new file mode 100644 index 0000000000..6a6a20289c --- /dev/null +++ b/example/play/pkg/generated/clientset/versioned/scheme/register.go @@ -0,0 +1,41 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/package scheme + +import ( + playv1alpha1 "github.com/coreos/play/pkg/apis/play/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + schema "k8s.io/apimachinery/pkg/runtime/schema" + serializer "k8s.io/apimachinery/pkg/runtime/serializer" +) + +var Scheme = runtime.NewScheme() +var Codecs = serializer.NewCodecFactory(Scheme) +var ParameterCodec = runtime.NewParameterCodec(Scheme) + +func init() { + v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) + AddToScheme(Scheme) +} + +// AddToScheme adds all types of this clientset into the given scheme. This allows composition +// of clientsets, like in: +// +// import ( +// "k8s.io/client-go/kubernetes" +// clientsetscheme "k8s.io/client-go/kuberentes/scheme" +// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" +// ) +// +// kclientset, _ := kubernetes.NewForConfig(c) +// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// +// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types +// correctly. +func AddToScheme(scheme *runtime.Scheme) { + playv1alpha1.AddToScheme(scheme) + +} diff --git a/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/doc.go b/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/doc.go new file mode 100644 index 0000000000..5450f8978f --- /dev/null +++ b/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/doc.go @@ -0,0 +1,6 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/ // This package has the automatically generated typed clients. +package v1alpha1 diff --git a/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/fake/doc.go b/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/fake/doc.go new file mode 100644 index 0000000000..41968ee1b5 --- /dev/null +++ b/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/fake/doc.go @@ -0,0 +1,6 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/ // Package fake has the automatically generated clients. +package fake diff --git a/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/fake/fake_play_client.go b/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/fake/fake_play_client.go new file mode 100644 index 0000000000..2811b3d4d4 --- /dev/null +++ b/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/fake/fake_play_client.go @@ -0,0 +1,26 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/package fake + +import ( + v1alpha1 "github.com/coreos/play/pkg/generated/clientset/versioned/typed/play/v1alpha1" + rest "k8s.io/client-go/rest" + testing "k8s.io/client-go/testing" +) + +type FakePlayV1alpha1 struct { + *testing.Fake +} + +func (c *FakePlayV1alpha1) PlayServices(namespace string) v1alpha1.PlayServiceInterface { + return &FakePlayServices{c, namespace} +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *FakePlayV1alpha1) RESTClient() rest.Interface { + var ret *rest.RESTClient + return ret +} diff --git a/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/fake/fake_playservice.go b/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/fake/fake_playservice.go new file mode 100644 index 0000000000..22bfd3930f --- /dev/null +++ b/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/fake/fake_playservice.go @@ -0,0 +1,126 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/package fake + +import ( + v1alpha1 "github.com/coreos/play/pkg/apis/play/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakePlayServices implements PlayServiceInterface +type FakePlayServices struct { + Fake *FakePlayV1alpha1 + ns string +} + +var playservicesResource = schema.GroupVersionResource{Group: "play.example.com", Version: "v1alpha1", Resource: "playservices"} + +var playservicesKind = schema.GroupVersionKind{Group: "play.example.com", Version: "v1alpha1", Kind: "PlayService"} + +// Get takes name of the playService, and returns the corresponding playService object, and an error if there is any. +func (c *FakePlayServices) Get(name string, options v1.GetOptions) (result *v1alpha1.PlayService, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(playservicesResource, c.ns, name), &v1alpha1.PlayService{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.PlayService), err +} + +// List takes label and field selectors, and returns the list of PlayServices that match those selectors. +func (c *FakePlayServices) List(opts v1.ListOptions) (result *v1alpha1.PlayServiceList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(playservicesResource, playservicesKind, c.ns, opts), &v1alpha1.PlayServiceList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1alpha1.PlayServiceList{} + for _, item := range obj.(*v1alpha1.PlayServiceList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested playServices. +func (c *FakePlayServices) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(playservicesResource, c.ns, opts)) + +} + +// Create takes the representation of a playService and creates it. Returns the server's representation of the playService, and an error, if there is any. +func (c *FakePlayServices) Create(playService *v1alpha1.PlayService) (result *v1alpha1.PlayService, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(playservicesResource, c.ns, playService), &v1alpha1.PlayService{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.PlayService), err +} + +// Update takes the representation of a playService and updates it. Returns the server's representation of the playService, and an error, if there is any. +func (c *FakePlayServices) Update(playService *v1alpha1.PlayService) (result *v1alpha1.PlayService, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(playservicesResource, c.ns, playService), &v1alpha1.PlayService{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.PlayService), err +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *FakePlayServices) UpdateStatus(playService *v1alpha1.PlayService) (*v1alpha1.PlayService, error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateSubresourceAction(playservicesResource, "status", c.ns, playService), &v1alpha1.PlayService{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.PlayService), err +} + +// Delete takes name of the playService and deletes it. Returns an error if one occurs. +func (c *FakePlayServices) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(playservicesResource, c.ns, name), &v1alpha1.PlayService{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakePlayServices) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(playservicesResource, c.ns, listOptions) + + _, err := c.Fake.Invokes(action, &v1alpha1.PlayServiceList{}) + return err +} + +// Patch applies the patch and returns the patched playService. +func (c *FakePlayServices) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.PlayService, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(playservicesResource, c.ns, name, data, subresources...), &v1alpha1.PlayService{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.PlayService), err +} diff --git a/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/generated_expansion.go b/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/generated_expansion.go new file mode 100644 index 0000000000..acc3c97f40 --- /dev/null +++ b/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/generated_expansion.go @@ -0,0 +1,7 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/package v1alpha1 + +type PlayServiceExpansion interface{} diff --git a/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/play_client.go b/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/play_client.go new file mode 100644 index 0000000000..4fd6154953 --- /dev/null +++ b/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/play_client.go @@ -0,0 +1,76 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/package v1alpha1 + +import ( + v1alpha1 "github.com/coreos/play/pkg/apis/play/v1alpha1" + "github.com/coreos/play/pkg/generated/clientset/versioned/scheme" + serializer "k8s.io/apimachinery/pkg/runtime/serializer" + rest "k8s.io/client-go/rest" +) + +type PlayV1alpha1Interface interface { + RESTClient() rest.Interface + PlayServicesGetter +} + +// PlayV1alpha1Client is used to interact with features provided by the play.example.com group. +type PlayV1alpha1Client struct { + restClient rest.Interface +} + +func (c *PlayV1alpha1Client) PlayServices(namespace string) PlayServiceInterface { + return newPlayServices(c, namespace) +} + +// NewForConfig creates a new PlayV1alpha1Client for the given config. +func NewForConfig(c *rest.Config) (*PlayV1alpha1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientFor(&config) + if err != nil { + return nil, err + } + return &PlayV1alpha1Client{client}, nil +} + +// NewForConfigOrDie creates a new PlayV1alpha1Client for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *PlayV1alpha1Client { + client, err := NewForConfig(c) + if err != nil { + panic(err) + } + return client +} + +// New creates a new PlayV1alpha1Client for the given RESTClient. +func New(c rest.Interface) *PlayV1alpha1Client { + return &PlayV1alpha1Client{c} +} + +func setConfigDefaults(config *rest.Config) error { + gv := v1alpha1.SchemeGroupVersion + config.GroupVersion = &gv + config.APIPath = "/apis" + config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} + + if config.UserAgent == "" { + config.UserAgent = rest.DefaultKubernetesUserAgent() + } + + return nil +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *PlayV1alpha1Client) RESTClient() rest.Interface { + if c == nil { + return nil + } + return c.restClient +} diff --git a/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/playservice.go b/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/playservice.go new file mode 100644 index 0000000000..e617cc0c72 --- /dev/null +++ b/example/play/pkg/generated/clientset/versioned/typed/play/v1alpha1/playservice.go @@ -0,0 +1,160 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/package v1alpha1 + +import ( + v1alpha1 "github.com/coreos/play/pkg/apis/play/v1alpha1" + scheme "github.com/coreos/play/pkg/generated/clientset/versioned/scheme" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// PlayServicesGetter has a method to return a PlayServiceInterface. +// A group's client should implement this interface. +type PlayServicesGetter interface { + PlayServices(namespace string) PlayServiceInterface +} + +// PlayServiceInterface has methods to work with PlayService resources. +type PlayServiceInterface interface { + Create(*v1alpha1.PlayService) (*v1alpha1.PlayService, error) + Update(*v1alpha1.PlayService) (*v1alpha1.PlayService, error) + UpdateStatus(*v1alpha1.PlayService) (*v1alpha1.PlayService, error) + Delete(name string, options *v1.DeleteOptions) error + DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error + Get(name string, options v1.GetOptions) (*v1alpha1.PlayService, error) + List(opts v1.ListOptions) (*v1alpha1.PlayServiceList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.PlayService, err error) + PlayServiceExpansion +} + +// playServices implements PlayServiceInterface +type playServices struct { + client rest.Interface + ns string +} + +// newPlayServices returns a PlayServices +func newPlayServices(c *PlayV1alpha1Client, namespace string) *playServices { + return &playServices{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the playService, and returns the corresponding playService object, and an error if there is any. +func (c *playServices) Get(name string, options v1.GetOptions) (result *v1alpha1.PlayService, err error) { + result = &v1alpha1.PlayService{} + err = c.client.Get(). + Namespace(c.ns). + Resource("playservices"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of PlayServices that match those selectors. +func (c *playServices) List(opts v1.ListOptions) (result *v1alpha1.PlayServiceList, err error) { + result = &v1alpha1.PlayServiceList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("playservices"). + VersionedParams(&opts, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested playServices. +func (c *playServices) Watch(opts v1.ListOptions) (watch.Interface, error) { + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("playservices"). + VersionedParams(&opts, scheme.ParameterCodec). + Watch() +} + +// Create takes the representation of a playService and creates it. Returns the server's representation of the playService, and an error, if there is any. +func (c *playServices) Create(playService *v1alpha1.PlayService) (result *v1alpha1.PlayService, err error) { + result = &v1alpha1.PlayService{} + err = c.client.Post(). + Namespace(c.ns). + Resource("playservices"). + Body(playService). + Do(). + Into(result) + return +} + +// Update takes the representation of a playService and updates it. Returns the server's representation of the playService, and an error, if there is any. +func (c *playServices) Update(playService *v1alpha1.PlayService) (result *v1alpha1.PlayService, err error) { + result = &v1alpha1.PlayService{} + err = c.client.Put(). + Namespace(c.ns). + Resource("playservices"). + Name(playService.Name). + Body(playService). + Do(). + Into(result) + return +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). + +func (c *playServices) UpdateStatus(playService *v1alpha1.PlayService) (result *v1alpha1.PlayService, err error) { + result = &v1alpha1.PlayService{} + err = c.client.Put(). + Namespace(c.ns). + Resource("playservices"). + Name(playService.Name). + SubResource("status"). + Body(playService). + Do(). + Into(result) + return +} + +// Delete takes name of the playService and deletes it. Returns an error if one occurs. +func (c *playServices) Delete(name string, options *v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("playservices"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *playServices) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("playservices"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched playService. +func (c *playServices) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.PlayService, err error) { + result = &v1alpha1.PlayService{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("playservices"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/example/play/pkg/generated/informers/externalversions/factory.go b/example/play/pkg/generated/informers/externalversions/factory.go new file mode 100644 index 0000000000..ad4f9a8375 --- /dev/null +++ b/example/play/pkg/generated/informers/externalversions/factory.go @@ -0,0 +1,107 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/ +// This file was automatically generated by informer-gen + +package externalversions + +import ( + versioned "github.com/coreos/play/pkg/generated/clientset/versioned" + internalinterfaces "github.com/coreos/play/pkg/generated/informers/externalversions/internalinterfaces" + play "github.com/coreos/play/pkg/generated/informers/externalversions/play" + runtime "k8s.io/apimachinery/pkg/runtime" + schema "k8s.io/apimachinery/pkg/runtime/schema" + cache "k8s.io/client-go/tools/cache" + reflect "reflect" + sync "sync" + time "time" +) + +type sharedInformerFactory struct { + client versioned.Interface + lock sync.Mutex + defaultResync time.Duration + + informers map[reflect.Type]cache.SharedIndexInformer + // startedInformers is used for tracking which informers have been started. + // This allows Start() to be called multiple times safely. + startedInformers map[reflect.Type]bool +} + +// NewSharedInformerFactory constructs a new instance of sharedInformerFactory +func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory { + return &sharedInformerFactory{ + client: client, + defaultResync: defaultResync, + informers: make(map[reflect.Type]cache.SharedIndexInformer), + startedInformers: make(map[reflect.Type]bool), + } +} + +// Start initializes all requested informers. +func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) { + f.lock.Lock() + defer f.lock.Unlock() + + for informerType, informer := range f.informers { + if !f.startedInformers[informerType] { + go informer.Run(stopCh) + f.startedInformers[informerType] = true + } + } +} + +// WaitForCacheSync waits for all started informers' cache were synced. +func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool { + informers := func() map[reflect.Type]cache.SharedIndexInformer { + f.lock.Lock() + defer f.lock.Unlock() + + informers := map[reflect.Type]cache.SharedIndexInformer{} + for informerType, informer := range f.informers { + if f.startedInformers[informerType] { + informers[informerType] = informer + } + } + return informers + }() + + res := map[reflect.Type]bool{} + for informType, informer := range informers { + res[informType] = cache.WaitForCacheSync(stopCh, informer.HasSynced) + } + return res +} + +// InternalInformerFor returns the SharedIndexInformer for obj using an internal +// client. +func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer { + f.lock.Lock() + defer f.lock.Unlock() + + informerType := reflect.TypeOf(obj) + informer, exists := f.informers[informerType] + if exists { + return informer + } + informer = newFunc(f.client, f.defaultResync) + f.informers[informerType] = informer + + return informer +} + +// SharedInformerFactory provides shared informers for resources in all known +// API group versions. +type SharedInformerFactory interface { + internalinterfaces.SharedInformerFactory + ForResource(resource schema.GroupVersionResource) (GenericInformer, error) + WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool + + Play() play.Interface +} + +func (f *sharedInformerFactory) Play() play.Interface { + return play.New(f) +} diff --git a/example/play/pkg/generated/informers/externalversions/generic.go b/example/play/pkg/generated/informers/externalversions/generic.go new file mode 100644 index 0000000000..c18bedd7e4 --- /dev/null +++ b/example/play/pkg/generated/informers/externalversions/generic.go @@ -0,0 +1,50 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/ +// This file was automatically generated by informer-gen + +package externalversions + +import ( + "fmt" + v1alpha1 "github.com/coreos/play/pkg/apis/play/v1alpha1" + schema "k8s.io/apimachinery/pkg/runtime/schema" + cache "k8s.io/client-go/tools/cache" +) + +// GenericInformer is type of SharedIndexInformer which will locate and delegate to other +// sharedInformers based on type +type GenericInformer interface { + Informer() cache.SharedIndexInformer + Lister() cache.GenericLister +} + +type genericInformer struct { + informer cache.SharedIndexInformer + resource schema.GroupResource +} + +// Informer returns the SharedIndexInformer. +func (f *genericInformer) Informer() cache.SharedIndexInformer { + return f.informer +} + +// Lister returns the GenericLister. +func (f *genericInformer) Lister() cache.GenericLister { + return cache.NewGenericLister(f.Informer().GetIndexer(), f.resource) +} + +// ForResource gives generic access to a shared informer of the matching type +// TODO extend this to unknown resources with a client pool +func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) { + switch resource { + // Group=Play, Version=V1alpha1 + case v1alpha1.SchemeGroupVersion.WithResource("playservices"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Play().V1alpha1().PlayServices().Informer()}, nil + + } + + return nil, fmt.Errorf("no informer found for %v", resource) +} diff --git a/example/play/pkg/generated/informers/externalversions/internalinterfaces/factory_interfaces.go b/example/play/pkg/generated/informers/externalversions/internalinterfaces/factory_interfaces.go new file mode 100644 index 0000000000..215145979f --- /dev/null +++ b/example/play/pkg/generated/informers/externalversions/internalinterfaces/factory_interfaces.go @@ -0,0 +1,23 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/ +// This file was automatically generated by informer-gen + +package internalinterfaces + +import ( + versioned "github.com/coreos/play/pkg/generated/clientset/versioned" + runtime "k8s.io/apimachinery/pkg/runtime" + cache "k8s.io/client-go/tools/cache" + time "time" +) + +type NewInformerFunc func(versioned.Interface, time.Duration) cache.SharedIndexInformer + +// SharedInformerFactory a small interface to allow for adding an informer without an import cycle +type SharedInformerFactory interface { + Start(stopCh <-chan struct{}) + InformerFor(obj runtime.Object, newFunc NewInformerFunc) cache.SharedIndexInformer +} diff --git a/example/play/pkg/generated/informers/externalversions/play/interface.go b/example/play/pkg/generated/informers/externalversions/play/interface.go new file mode 100644 index 0000000000..c99effa537 --- /dev/null +++ b/example/play/pkg/generated/informers/externalversions/play/interface.go @@ -0,0 +1,33 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/ +// This file was automatically generated by informer-gen + +package play + +import ( + internalinterfaces "github.com/coreos/play/pkg/generated/informers/externalversions/internalinterfaces" + v1alpha1 "github.com/coreos/play/pkg/generated/informers/externalversions/play/v1alpha1" +) + +// Interface provides access to each of this group's versions. +type Interface interface { + // V1alpha1 provides access to shared informers for resources in V1alpha1. + V1alpha1() v1alpha1.Interface +} + +type group struct { + internalinterfaces.SharedInformerFactory +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory) Interface { + return &group{f} +} + +// V1alpha1 returns a new v1alpha1.Interface. +func (g *group) V1alpha1() v1alpha1.Interface { + return v1alpha1.New(g.SharedInformerFactory) +} diff --git a/example/play/pkg/generated/informers/externalversions/play/v1alpha1/interface.go b/example/play/pkg/generated/informers/externalversions/play/v1alpha1/interface.go new file mode 100644 index 0000000000..6b61931b71 --- /dev/null +++ b/example/play/pkg/generated/informers/externalversions/play/v1alpha1/interface.go @@ -0,0 +1,32 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/ +// This file was automatically generated by informer-gen + +package v1alpha1 + +import ( + internalinterfaces "github.com/coreos/play/pkg/generated/informers/externalversions/internalinterfaces" +) + +// Interface provides access to all the informers in this group version. +type Interface interface { + // PlayServices returns a PlayServiceInformer. + PlayServices() PlayServiceInformer +} + +type version struct { + internalinterfaces.SharedInformerFactory +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory) Interface { + return &version{f} +} + +// PlayServices returns a PlayServiceInformer. +func (v *version) PlayServices() PlayServiceInformer { + return &playServiceInformer{factory: v.SharedInformerFactory} +} diff --git a/example/play/pkg/generated/informers/externalversions/play/v1alpha1/playservice.go b/example/play/pkg/generated/informers/externalversions/play/v1alpha1/playservice.go new file mode 100644 index 0000000000..ddd2fce207 --- /dev/null +++ b/example/play/pkg/generated/informers/externalversions/play/v1alpha1/playservice.go @@ -0,0 +1,62 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/ +// This file was automatically generated by informer-gen + +package v1alpha1 + +import ( + play_v1alpha1 "github.com/coreos/play/pkg/apis/play/v1alpha1" + versioned "github.com/coreos/play/pkg/generated/clientset/versioned" + internalinterfaces "github.com/coreos/play/pkg/generated/informers/externalversions/internalinterfaces" + v1alpha1 "github.com/coreos/play/pkg/generated/listers/play/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + cache "k8s.io/client-go/tools/cache" + time "time" +) + +// PlayServiceInformer provides access to a shared informer and lister for +// PlayServices. +type PlayServiceInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1alpha1.PlayServiceLister +} + +type playServiceInformer struct { + factory internalinterfaces.SharedInformerFactory +} + +// NewPlayServiceInformer constructs a new informer for PlayService type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewPlayServiceInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options v1.ListOptions) (runtime.Object, error) { + return client.PlayV1alpha1().PlayServices(namespace).List(options) + }, + WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { + return client.PlayV1alpha1().PlayServices(namespace).Watch(options) + }, + }, + &play_v1alpha1.PlayService{}, + resyncPeriod, + indexers, + ) +} + +func defaultPlayServiceInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewPlayServiceInformer(client, v1.NamespaceAll, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) +} + +func (f *playServiceInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&play_v1alpha1.PlayService{}, defaultPlayServiceInformer) +} + +func (f *playServiceInformer) Lister() v1alpha1.PlayServiceLister { + return v1alpha1.NewPlayServiceLister(f.Informer().GetIndexer()) +} diff --git a/example/play/pkg/generated/listers/play/v1alpha1/expansion_generated.go b/example/play/pkg/generated/listers/play/v1alpha1/expansion_generated.go new file mode 100644 index 0000000000..0798941809 --- /dev/null +++ b/example/play/pkg/generated/listers/play/v1alpha1/expansion_generated.go @@ -0,0 +1,16 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/ +// This file was automatically generated by lister-gen + +package v1alpha1 + +// PlayServiceListerExpansion allows custom methods to be added to +// PlayServiceLister. +type PlayServiceListerExpansion interface{} + +// PlayServiceNamespaceListerExpansion allows custom methods to be added to +// PlayServiceNamespaceLister. +type PlayServiceNamespaceListerExpansion interface{} diff --git a/example/play/pkg/generated/listers/play/v1alpha1/playservice.go b/example/play/pkg/generated/listers/play/v1alpha1/playservice.go new file mode 100644 index 0000000000..c12858832c --- /dev/null +++ b/example/play/pkg/generated/listers/play/v1alpha1/playservice.go @@ -0,0 +1,83 @@ +/* +Copyright 2018 The play-operator Authors + +Commercial software license. +*/ +// This file was automatically generated by lister-gen + +package v1alpha1 + +import ( + v1alpha1 "github.com/coreos/play/pkg/apis/play/v1alpha1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// PlayServiceLister helps list PlayServices. +type PlayServiceLister interface { + // List lists all PlayServices in the indexer. + List(selector labels.Selector) (ret []*v1alpha1.PlayService, err error) + // PlayServices returns an object that can list and get PlayServices. + PlayServices(namespace string) PlayServiceNamespaceLister + PlayServiceListerExpansion +} + +// playServiceLister implements the PlayServiceLister interface. +type playServiceLister struct { + indexer cache.Indexer +} + +// NewPlayServiceLister returns a new PlayServiceLister. +func NewPlayServiceLister(indexer cache.Indexer) PlayServiceLister { + return &playServiceLister{indexer: indexer} +} + +// List lists all PlayServices in the indexer. +func (s *playServiceLister) List(selector labels.Selector) (ret []*v1alpha1.PlayService, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.PlayService)) + }) + return ret, err +} + +// PlayServices returns an object that can list and get PlayServices. +func (s *playServiceLister) PlayServices(namespace string) PlayServiceNamespaceLister { + return playServiceNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// PlayServiceNamespaceLister helps list and get PlayServices. +type PlayServiceNamespaceLister interface { + // List lists all PlayServices in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v1alpha1.PlayService, err error) + // Get retrieves the PlayService from the indexer for a given namespace and name. + Get(name string) (*v1alpha1.PlayService, error) + PlayServiceNamespaceListerExpansion +} + +// playServiceNamespaceLister implements the PlayServiceNamespaceLister +// interface. +type playServiceNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all PlayServices in the indexer for a given namespace. +func (s playServiceNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.PlayService, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.PlayService)) + }) + return ret, err +} + +// Get retrieves the PlayService from the indexer for a given namespace and name. +func (s playServiceNamespaceLister) Get(name string) (*v1alpha1.PlayService, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1alpha1.Resource("playservice"), name) + } + return obj.(*v1alpha1.PlayService), nil +} diff --git a/example/play/pkg/stub/handler.go b/example/play/pkg/stub/handler.go new file mode 100644 index 0000000000..56d14cf06e --- /dev/null +++ b/example/play/pkg/stub/handler.go @@ -0,0 +1,11 @@ +package stub + +import "github.com/coreos/operator-sdk/pkg/sdk/types" + +type Handler struct { + // Fill me +} + +func (h *Handler) Handle(ctx types.Context, event types.Event) { + // Fill me +} diff --git a/example/play/tmp/build/build.sh b/example/play/tmp/build/build.sh new file mode 100644 index 0000000000..6452b0f755 --- /dev/null +++ b/example/play/tmp/build/build.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +if ! which go > /dev/null; then + echo "golang needs to be installed" + exit 1 +fi + +BIN_DIR="$(pwd)/_output/bin" +mkdir -p ${bin_dir} || true +# set some environment variables +PROJECT_NAME="play" +REPO_PATH="github.com/coreos/${PROJECT_NAME}" +BUILD_PATH="${REPO_PATH}/cmd/${PROJECT_NAME}" +echo "building "${PROJECT_NAME}"..." +GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o ${BIN_DIR}/${PROJECT_NAME} $BUILD_PATH diff --git a/example/play/tmp/codegen/boilerplate.go.txt b/example/play/tmp/codegen/boilerplate.go.txt new file mode 100644 index 0000000000..0143b60cbf --- /dev/null +++ b/example/play/tmp/codegen/boilerplate.go.txt @@ -0,0 +1,5 @@ +/* +Copyright YEAR The play-operator Authors + +Commercial software license. +*/ \ No newline at end of file diff --git a/example/play/tmp/codegen/update-generated.sh b/example/play/tmp/codegen/update-generated.sh new file mode 100755 index 0000000000..53162b3019 --- /dev/null +++ b/example/play/tmp/codegen/update-generated.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +DOCKER_REPO_ROOT="/go/src/github.com/coreos/play" +IMAGE=${IMAGE:-"gcr.io/coreos-k8s-scale-testing/codegen"} + +docker run --rm \ + -v "$PWD":"$DOCKER_REPO_ROOT" \ + -w "$DOCKER_REPO_ROOT" \ + "$IMAGE" \ + "/go/src/k8s.io/code-generator/generate-groups.sh" \ + "all" \ + "github.com/coreos/play/pkg/generated" \ + "github.com/coreos/play/pkg/apis" \ + "play:v1alpha1" \ + --go-header-file "./hack/codegen/boilerplate.go.txt" \ + $@ +. \ No newline at end of file diff --git a/example/play/tmp/codegen/verify-generated.sh b/example/play/tmp/codegen/verify-generated.sh new file mode 100755 index 0000000000..29201fdb80 --- /dev/null +++ b/example/play/tmp/codegen/verify-generated.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + + +if ! output=$(./hack/codegen/update-generated.sh --verify-only 2>&1); then + echo "FAILURE: verification of codegen failed:" + echo "${output}" + exit 1 +fi + +echo "Verified generated code ===" \ No newline at end of file