diff --git a/samples/memcached-api-server/Dockerfile.controller b/samples/memcached-api-server/Dockerfile.controller new file mode 100644 index 00000000000..31d2baeb7d0 --- /dev/null +++ b/samples/memcached-api-server/Dockerfile.controller @@ -0,0 +1,35 @@ +# Instructions to install API using the installer +# Build and test the controller-manager +FROM golang:1.9.3 as builder + +ENV TEST_ASSET_DIR /usr/local/bin +ENV TEST_ASSET_KUBECTL $TEST_ASSET_DIR/kubectl +ENV TEST_ASSET_KUBE_APISERVER $TEST_ASSET_DIR/kube-apiserver +ENV TEST_ASSET_ETCD $TEST_ASSET_DIR/etcd + +# Download test framework binaries +ENV TEST_ASSET_URL https://storage.googleapis.com/k8s-c10s-test-binaries +RUN curl ${TEST_ASSET_URL}/etcd-Linux-x86_64 --output $TEST_ASSET_ETCD +RUN curl ${TEST_ASSET_URL}/kube-apiserver-Linux-x86_64 --output $TEST_ASSET_KUBE_APISERVER +RUN curl https://storage.googleapis.com/kubernetes-release/release/v1.9.2/bin/linux/amd64/kubectl --output $TEST_ASSET_KUBECTL +RUN chmod +x $TEST_ASSET_ETCD +RUN chmod +x $TEST_ASSET_KUBE_APISERVER +RUN chmod +x $TEST_ASSET_KUBECTL + +# Copy in the go src +WORKDIR /go/src/github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server +COPY pkg/ pkg/ +COPY cmd/ cmd/ +COPY vendor/ vendor/ + +# Build and test the API code +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o controller-manager ./cmd/controller-manager/main.go +RUN go test ./pkg/... ./cmd/... + +# Copy the controller-manager into a thin image +FROM scratch +# RUN apk --no-cache add ca-certificates +WORKDIR /root/ +COPY --from=builder /go/src/github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/controller-manager . +ENTRYPOINT ["./controller-manager"] +CMD ["--install-crds=false"] diff --git a/samples/memcached-api-server/Gopkg.lock b/samples/memcached-api-server/Gopkg.lock new file mode 100644 index 00000000000..cff492b53e7 --- /dev/null +++ b/samples/memcached-api-server/Gopkg.lock @@ -0,0 +1,586 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + name = "cloud.google.com/go" + packages = ["compute/metadata"] + revision = "29f476ffa9c4cd4fd14336b6043090ac1ad76733" + version = "v0.21.0" + +[[projects]] + name = "github.com/PuerkitoBio/purell" + packages = ["."] + revision = "0bcb03f4b4d0a9428594752bd2a3b9aa0a9d4bd4" + version = "v1.1.0" + +[[projects]] + name = "github.com/PuerkitoBio/urlesc" + packages = ["."] + revision = "de5bf2ad457846296e2031421a34e2568e304e35" + +[[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 = "2810ccc68e0ca445fa81ebfa03fbf70aca5c41ae" + version = "v2.7.0" + +[[projects]] + name = "github.com/ghodss/yaml" + packages = ["."] + revision = "0ca9ea5df5451ffdf184b4428c902747c2c11cd7" + version = "v1.0.0" + +[[projects]] + name = "github.com/go-openapi/jsonpointer" + packages = ["."] + revision = "3a0015ad55fa9873f41605d3e8f28cd279c32ab2" + +[[projects]] + name = "github.com/go-openapi/jsonreference" + packages = ["."] + revision = "3fb327e6747da3043567ee86abd02bb6376b6be2" + +[[projects]] + name = "github.com/go-openapi/spec" + packages = ["."] + revision = "bcff419492eeeb01f76e77d2ebc714dc97b607f5" + +[[projects]] + name = "github.com/go-openapi/swag" + packages = ["."] + revision = "811b1089cde9dad18d4d0c2d09fbdbf28dbd27a5" + +[[projects]] + name = "github.com/gogo/protobuf" + packages = [ + "proto", + "sortkeys" + ] + revision = "1adfc126b41513cc696b209667c8656ea7aac67c" + version = "v1.0.0" + +[[projects]] + name = "github.com/golang/glog" + packages = ["."] + revision = "23def4e6c14b4da8ac2ed8007337bc5eb5007998" + +[[projects]] + name = "github.com/golang/groupcache" + packages = ["lru"] + revision = "66deaeb636dff1ac7d938ce666d090556056a4b0" + +[[projects]] + name = "github.com/golang/protobuf" + packages = [ + "proto", + "ptypes", + "ptypes/any", + "ptypes/duration", + "ptypes/timestamp" + ] + revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265" + version = "v1.1.0" + +[[projects]] + 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]] + name = "github.com/hashicorp/golang-lru" + packages = [ + ".", + "simplelru" + ] + revision = "0fb14efe8c47ae851c0034ed7a448854d3d34cf3" + +[[projects]] + name = "github.com/howeyc/gopass" + packages = ["."] + revision = "bf9dde6d0d2c004a008c27aaee91170c786f6db8" + +[[projects]] + name = "github.com/imdario/mergo" + packages = ["."] + revision = "9d5f1277e9a8ed20c3684bda8fde67c05628518c" + version = "v0.3.4" + +[[projects]] + name = "github.com/json-iterator/go" + packages = ["."] + revision = "ca39e5af3ece67bbcda3d0f4f56a8e24d9f2dad4" + version = "1.1.3" + +[[projects]] + branch = "master" + name = "github.com/kubernetes-sigs/kubebuilder" + packages = [ + "pkg/config", + "pkg/controller", + "pkg/controller/eventhandlers", + "pkg/controller/informers", + "pkg/controller/metrics", + "pkg/controller/predicates", + "pkg/controller/types", + "pkg/inject/args", + "pkg/inject/run", + "pkg/install", + "pkg/signals", + "pkg/test" + ] + revision = "b8eff8fb451a72262ba9913ff065b0fa505f269a" + +[[projects]] + name = "github.com/mailru/easyjson" + packages = [ + "buffer", + "jlexer", + "jwriter" + ] + revision = "8b799c424f57fa123fc63a99d6383bc6e4c02578" + +[[projects]] + name = "github.com/modern-go/concurrent" + packages = ["."] + revision = "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94" + version = "1.0.3" + +[[projects]] + name = "github.com/modern-go/reflect2" + packages = ["."] + revision = "1df9eeb2bb81f327b96228865c5687bc2194af3f" + version = "1.0.0" + +[[projects]] + name = "github.com/onsi/ginkgo" + packages = [ + ".", + "config", + "internal/codelocation", + "internal/containernode", + "internal/failer", + "internal/leafnodes", + "internal/remote", + "internal/spec", + "internal/spec_iterator", + "internal/specrunner", + "internal/suite", + "internal/testingtproxy", + "internal/writer", + "reporters", + "reporters/stenographer", + "reporters/stenographer/support/go-colorable", + "reporters/stenographer/support/go-isatty", + "types" + ] + revision = "fa5fabab2a1bfbd924faf4c067d07ae414e2aedf" + version = "v1.5.0" + +[[projects]] + name = "github.com/onsi/gomega" + packages = [ + ".", + "format", + "gbytes", + "gexec", + "internal/assertion", + "internal/asyncassertion", + "internal/oraclematcher", + "internal/testingtsupport", + "matchers", + "matchers/support/goraph/bipartitegraph", + "matchers/support/goraph/edge", + "matchers/support/goraph/node", + "matchers/support/goraph/util", + "types" + ] + revision = "62bff4df71bdbc266561a0caee19f0594b17c240" + version = "v1.4.0" + +[[projects]] + name = "github.com/spf13/pflag" + packages = ["."] + revision = "583c0c0531f06d5278b7d917446061adc344b5cd" + version = "v1.0.1" + +[[projects]] + name = "golang.org/x/crypto" + packages = ["ssh/terminal"] + revision = "4ec37c66abab2c7e02ae775328b2ff001c3f025a" + +[[projects]] + name = "golang.org/x/net" + packages = [ + "context", + "context/ctxhttp", + "html", + "html/atom", + "html/charset", + "http/httpguts", + "http2", + "http2/hpack", + "idna", + "lex/httplex" + ] + revision = "640f4622ab692b87c2f3a94265e6f579fe38263d" + +[[projects]] + name = "golang.org/x/oauth2" + packages = [ + ".", + "google", + "internal", + "jws", + "jwt" + ] + revision = "cdc340f7c179dbbfa4afd43b7614e8fcadde4269" + +[[projects]] + name = "golang.org/x/sys" + packages = [ + "unix", + "windows" + ] + revision = "7db1c3b1a98089d0071c84f646ff5c96aad43682" + +[[projects]] + name = "golang.org/x/text" + packages = [ + "collate", + "collate/build", + "encoding", + "encoding/charmap", + "encoding/htmlindex", + "encoding/internal", + "encoding/internal/identifier", + "encoding/japanese", + "encoding/korean", + "encoding/simplifiedchinese", + "encoding/traditionalchinese", + "encoding/unicode", + "internal/colltab", + "internal/gen", + "internal/tag", + "internal/triegen", + "internal/ucd", + "internal/utf8internal", + "language", + "runes", + "secure/bidirule", + "transform", + "unicode/bidi", + "unicode/cldr", + "unicode/norm", + "unicode/rangetable", + "width" + ] + revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" + version = "v0.3.0" + +[[projects]] + name = "golang.org/x/time" + packages = ["rate"] + revision = "fbb02b2291d28baffd63558aa44b4b56f178d650" + +[[projects]] + name = "google.golang.org/appengine" + packages = [ + ".", + "internal", + "internal/app_identity", + "internal/base", + "internal/datastore", + "internal/log", + "internal/modules", + "internal/remote_api", + "internal/urlfetch", + "urlfetch" + ] + revision = "150dc57a1b433e64154302bdc40b6bb8aefa313a" + version = "v1.0.0" + +[[projects]] + name = "gopkg.in/inf.v0" + packages = ["."] + revision = "d2d2541c53f18d2a059457998ce2876cc8e67cbf" + version = "v0.9.1" + +[[projects]] + name = "gopkg.in/yaml.v2" + packages = ["."] + revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" + version = "v2.2.1" + +[[projects]] + name = "k8s.io/api" + packages = [ + "admissionregistration/v1alpha1", + "admissionregistration/v1beta1", + "apps/v1", + "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", + "events/v1beta1", + "extensions/v1beta1", + "networking/v1", + "policy/v1beta1", + "rbac/v1", + "rbac/v1alpha1", + "rbac/v1beta1", + "scheduling/v1alpha1", + "settings/v1alpha1", + "storage/v1", + "storage/v1alpha1", + "storage/v1beta1" + ] + revision = "73d903622b7391f3312dcbac6483fed484e185f8" + version = "kubernetes-1.10.0" + +[[projects]] + name = "k8s.io/apiextensions-apiserver" + packages = [ + "pkg/apis/apiextensions", + "pkg/apis/apiextensions/v1beta1", + "pkg/client/clientset/clientset/scheme", + "pkg/client/clientset/clientset/typed/apiextensions/v1beta1" + ] + revision = "4347b330d0ff094db860f2f75fa725b4f4b53618" + version = "kubernetes-1.10.1" + +[[projects]] + name = "k8s.io/apimachinery" + packages = [ + "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/v1beta1", + "pkg/conversion", + "pkg/conversion/queryparams", + "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/mergepatch", + "pkg/util/net", + "pkg/util/runtime", + "pkg/util/sets", + "pkg/util/strategicpatch", + "pkg/util/validation", + "pkg/util/validation/field", + "pkg/util/wait", + "pkg/util/yaml", + "pkg/version", + "pkg/watch", + "third_party/forked/golang/json", + "third_party/forked/golang/reflect" + ] + revision = "302974c03f7e50f16561ba237db776ab93594ef6" + version = "kubernetes-1.10.0" + +[[projects]] + name = "k8s.io/client-go" + packages = [ + "discovery", + "informers", + "informers/admissionregistration", + "informers/admissionregistration/v1alpha1", + "informers/admissionregistration/v1beta1", + "informers/apps", + "informers/apps/v1", + "informers/apps/v1beta1", + "informers/apps/v1beta2", + "informers/autoscaling", + "informers/autoscaling/v1", + "informers/autoscaling/v2beta1", + "informers/batch", + "informers/batch/v1", + "informers/batch/v1beta1", + "informers/batch/v2alpha1", + "informers/certificates", + "informers/certificates/v1beta1", + "informers/core", + "informers/core/v1", + "informers/events", + "informers/events/v1beta1", + "informers/extensions", + "informers/extensions/v1beta1", + "informers/internalinterfaces", + "informers/networking", + "informers/networking/v1", + "informers/policy", + "informers/policy/v1beta1", + "informers/rbac", + "informers/rbac/v1", + "informers/rbac/v1alpha1", + "informers/rbac/v1beta1", + "informers/scheduling", + "informers/scheduling/v1alpha1", + "informers/settings", + "informers/settings/v1alpha1", + "informers/storage", + "informers/storage/v1", + "informers/storage/v1alpha1", + "informers/storage/v1beta1", + "kubernetes", + "kubernetes/scheme", + "kubernetes/typed/admissionregistration/v1alpha1", + "kubernetes/typed/admissionregistration/v1beta1", + "kubernetes/typed/apps/v1", + "kubernetes/typed/apps/v1beta1", + "kubernetes/typed/apps/v1beta2", + "kubernetes/typed/authentication/v1", + "kubernetes/typed/authentication/v1beta1", + "kubernetes/typed/authorization/v1", + "kubernetes/typed/authorization/v1beta1", + "kubernetes/typed/autoscaling/v1", + "kubernetes/typed/autoscaling/v2beta1", + "kubernetes/typed/batch/v1", + "kubernetes/typed/batch/v1beta1", + "kubernetes/typed/batch/v2alpha1", + "kubernetes/typed/certificates/v1beta1", + "kubernetes/typed/core/v1", + "kubernetes/typed/events/v1beta1", + "kubernetes/typed/extensions/v1beta1", + "kubernetes/typed/networking/v1", + "kubernetes/typed/policy/v1beta1", + "kubernetes/typed/rbac/v1", + "kubernetes/typed/rbac/v1alpha1", + "kubernetes/typed/rbac/v1beta1", + "kubernetes/typed/scheduling/v1alpha1", + "kubernetes/typed/settings/v1alpha1", + "kubernetes/typed/storage/v1", + "kubernetes/typed/storage/v1alpha1", + "kubernetes/typed/storage/v1beta1", + "listers/admissionregistration/v1alpha1", + "listers/admissionregistration/v1beta1", + "listers/apps/v1", + "listers/apps/v1beta1", + "listers/apps/v1beta2", + "listers/autoscaling/v1", + "listers/autoscaling/v2beta1", + "listers/batch/v1", + "listers/batch/v1beta1", + "listers/batch/v2alpha1", + "listers/certificates/v1beta1", + "listers/core/v1", + "listers/events/v1beta1", + "listers/extensions/v1beta1", + "listers/networking/v1", + "listers/policy/v1beta1", + "listers/rbac/v1", + "listers/rbac/v1alpha1", + "listers/rbac/v1beta1", + "listers/scheduling/v1alpha1", + "listers/settings/v1alpha1", + "listers/storage/v1", + "listers/storage/v1alpha1", + "listers/storage/v1beta1", + "pkg/apis/clientauthentication", + "pkg/apis/clientauthentication/v1alpha1", + "pkg/version", + "plugin/pkg/client/auth/exec", + "plugin/pkg/client/auth/gcp", + "rest", + "rest/watch", + "third_party/forked/golang/template", + "tools/auth", + "tools/cache", + "tools/clientcmd", + "tools/clientcmd/api", + "tools/clientcmd/api/latest", + "tools/clientcmd/api/v1", + "tools/metrics", + "tools/pager", + "tools/record", + "tools/reference", + "transport", + "util/buffer", + "util/cert", + "util/flowcontrol", + "util/homedir", + "util/integer", + "util/jsonpath", + "util/retry", + "util/workqueue" + ] + revision = "989be4278f353e42f26c416c53757d16fcff77db" + version = "kubernetes-1.10.1" + +[[projects]] + name = "k8s.io/kube-aggregator" + packages = [ + "pkg/apis/apiregistration", + "pkg/apis/apiregistration/v1", + "pkg/apis/apiregistration/v1beta1", + "pkg/client/clientset_generated/clientset/scheme", + "pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1" + ] + revision = "9ff2dd4f28cb99cf6bbc68cb2beb3e9cd7e8ee56" + version = "kubernetes-1.10.1" + +[[projects]] + name = "k8s.io/kube-openapi" + packages = ["pkg/util/proto"] + revision = "f08db293d3ef80052d6513ece19792642a289fea" + +[[projects]] + name = "sigs.k8s.io/testing_frameworks" + packages = [ + "integration", + "integration/internal" + ] + revision = "f53464b8b84b4507805a0b033a8377b225163fea" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "39c2664cdfc97e9427da2a2a6192f7f3e8bf9a0dee4839d85137b2491c0314d0" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/samples/memcached-api-server/Gopkg.toml b/samples/memcached-api-server/Gopkg.toml new file mode 100644 index 00000000000..5b17e5a4809 --- /dev/null +++ b/samples/memcached-api-server/Gopkg.toml @@ -0,0 +1,185 @@ + +# Users add deps lines here + +[prune] + go-tests = true + #unused-packages = true + +# Note: Stanzas below are generated by Kubebuilder and may be rewritten when +# upgrading kubebuilder versions. + +# DO NOT MODIFY BELOW THIS LINE. + +[[override]] +name="cloud.google.com/go" +version="v0.21.0" + +[[override]] +name="github.com/PuerkitoBio/purell" +version="v1.1.0" + +[[override]] +name="github.com/PuerkitoBio/urlesc" +revision="de5bf2ad457846296e2031421a34e2568e304e35" + +[[override]] +name="github.com/davecgh/go-spew" +version="v1.1.0" + +[[override]] +name="github.com/emicklei/go-restful" +version="v2.7.0" + +[[override]] +name="github.com/ghodss/yaml" +version="v1.0.0" + +[[override]] +name="github.com/go-openapi/jsonpointer" +revision="3a0015ad55fa9873f41605d3e8f28cd279c32ab2" + +[[override]] +name="github.com/go-openapi/jsonreference" +revision="3fb327e6747da3043567ee86abd02bb6376b6be2" + +[[override]] +name="github.com/go-openapi/spec" +revision="bcff419492eeeb01f76e77d2ebc714dc97b607f5" + +[[override]] +name="github.com/go-openapi/swag" +revision="811b1089cde9dad18d4d0c2d09fbdbf28dbd27a5" + +[[override]] +name="github.com/gogo/protobuf" +version="v1.0.0" + +[[override]] +name="github.com/golang/glog" +revision="23def4e6c14b4da8ac2ed8007337bc5eb5007998" + +[[override]] +name="github.com/golang/groupcache" +revision="66deaeb636dff1ac7d938ce666d090556056a4b0" + +[[override]] +name="github.com/golang/protobuf" +version="v1.1.0" + +[[override]] +name="github.com/google/gofuzz" +revision="24818f796faf91cd76ec7bddd72458fbced7a6c1" + +[[override]] +name="github.com/googleapis/gnostic" +version="v0.1.0" + +[[override]] +name="github.com/hashicorp/golang-lru" +revision="0fb14efe8c47ae851c0034ed7a448854d3d34cf3" + +[[override]] +name="github.com/howeyc/gopass" +revision="bf9dde6d0d2c004a008c27aaee91170c786f6db8" + +[[override]] +name="github.com/imdario/mergo" +version="v0.3.4" + +[[override]] +name="github.com/json-iterator/go" +version="1.1.3" + +[[override]] +name="github.com/mailru/easyjson" +revision="8b799c424f57fa123fc63a99d6383bc6e4c02578" + +[[override]] +name="github.com/modern-go/concurrent" +version="1.0.3" + +[[override]] +name="github.com/modern-go/reflect2" +version="1.0.0" + +[[override]] +name="github.com/onsi/ginkgo" +version="v1.4.0" + +[[override]] +name="github.com/onsi/gomega" +version="v1.3.0" + +[[override]] +name="github.com/spf13/pflag" +version="v1.0.1" + +[[override]] +name="golang.org/x/crypto" +revision="4ec37c66abab2c7e02ae775328b2ff001c3f025a" + +[[override]] +name="golang.org/x/net" +revision="640f4622ab692b87c2f3a94265e6f579fe38263d" + +[[override]] +name="golang.org/x/oauth2" +revision="cdc340f7c179dbbfa4afd43b7614e8fcadde4269" + +[[override]] +name="golang.org/x/sys" +revision="7db1c3b1a98089d0071c84f646ff5c96aad43682" + +[[override]] +name="golang.org/x/text" +version="v0.3.0" + +[[override]] +name="golang.org/x/time" +revision="fbb02b2291d28baffd63558aa44b4b56f178d650" + +[[override]] +name="google.golang.org/appengine" +version="v1.0.0" + +[[override]] +name="gopkg.in/inf.v0" +version="v0.9.1" + +[[override]] +name="gopkg.in/yaml.v2" +version="v2.2.1" + +[[override]] +name="k8s.io/api" +version="kubernetes-1.10.0" + +[[override]] +name="k8s.io/apiextensions-apiserver" +version="kubernetes-1.10.1" + +[[override]] +name="k8s.io/apimachinery" +version="kubernetes-1.10.0" + +[[override]] +name="k8s.io/client-go" +version="kubernetes-1.10.1" + +[[override]] +name="k8s.io/kube-aggregator" +version="kubernetes-1.10.1" + +[[override]] +name="k8s.io/kube-openapi" +revision="f08db293d3ef80052d6513ece19792642a289fea" + +[[override]] +name="sigs.k8s.io/testing_frameworks" +revision="f53464b8b84b4507805a0b033a8377b225163fea" + +[[override]] +name = "github.com/kubernetes-sigs/kubebuilder" +branch="master" + + diff --git a/samples/memcached-api-server/README.md b/samples/memcached-api-server/README.md new file mode 100644 index 00000000000..dfd92ccc6c5 --- /dev/null +++ b/samples/memcached-api-server/README.md @@ -0,0 +1,2 @@ +# memcached-api-server +An example for extending Kubernetes API. diff --git a/samples/memcached-api-server/cmd/controller-manager/main.go b/samples/memcached-api-server/cmd/controller-manager/main.go new file mode 100644 index 00000000000..15825aa3989 --- /dev/null +++ b/samples/memcached-api-server/cmd/controller-manager/main.go @@ -0,0 +1,49 @@ +package main + +import ( + "flag" + "log" + + // Import auth/gcp to connect to GKE clusters remotely + _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" + + configlib "github.com/kubernetes-sigs/kubebuilder/pkg/config" + "github.com/kubernetes-sigs/kubebuilder/pkg/inject/run" + "github.com/kubernetes-sigs/kubebuilder/pkg/install" + "github.com/kubernetes-sigs/kubebuilder/pkg/signals" + extensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + + "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/inject" + "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/inject/args" +) + +var installCRDs = flag.Bool("install-crds", true, "install the CRDs used by the controller as part of startup") + +// Controller-manager main. +func main() { + flag.Parse() + + stopCh := signals.SetupSignalHandler() + + config := configlib.GetConfigOrDie() + + if *installCRDs { + if err := install.NewInstaller(config).Install(&InstallStrategy{crds: inject.Injector.CRDs}); err != nil { + log.Fatalf("Could not create CRDs: %v", err) + } + } + + // Start the controllers + if err := inject.RunAll(run.RunArguments{Stop: stopCh}, args.CreateInjectArgs(config)); err != nil { + log.Fatalf("%v", err) + } +} + +type InstallStrategy struct { + install.EmptyInstallStrategy + crds []*extensionsv1beta1.CustomResourceDefinition +} + +func (s *InstallStrategy) GetCRDs() []*extensionsv1beta1.CustomResourceDefinition { + return s.crds +} diff --git a/samples/memcached-api-server/hack/boilerplate.go.txt b/samples/memcached-api-server/hack/boilerplate.go.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/samples/memcached-api-server/hack/doc.go b/samples/memcached-api-server/hack/doc.go new file mode 100644 index 00000000000..2b23797ae56 --- /dev/null +++ b/samples/memcached-api-server/hack/doc.go @@ -0,0 +1,6 @@ + + + + +package hack + diff --git a/samples/memcached-api-server/hack/sample/memcached.yaml b/samples/memcached-api-server/hack/sample/memcached.yaml new file mode 100644 index 00000000000..dfbd41250e7 --- /dev/null +++ b/samples/memcached-api-server/hack/sample/memcached.yaml @@ -0,0 +1,6 @@ +apiVersion: myapps.memcached.example.com/v1alpha1 +kind: Memcached +metadata: + name: memcached-example +spec: + size: 1 diff --git a/samples/memcached-api-server/pkg/apis/doc.go b/samples/memcached-api-server/pkg/apis/doc.go new file mode 100644 index 00000000000..d81b4396137 --- /dev/null +++ b/samples/memcached-api-server/pkg/apis/doc.go @@ -0,0 +1,8 @@ + + + +// +// +domain=memcached.example.com + +package apis + diff --git a/samples/memcached-api-server/pkg/apis/myapps/doc.go b/samples/memcached-api-server/pkg/apis/myapps/doc.go new file mode 100644 index 00000000000..3334790139c --- /dev/null +++ b/samples/memcached-api-server/pkg/apis/myapps/doc.go @@ -0,0 +1,9 @@ + + + + +// +k8s:deepcopy-gen=package,register +// +groupName=myapps.memcached.example.com + +// Package api is the internal version of the API. +package myapps diff --git a/samples/memcached-api-server/pkg/apis/myapps/v1alpha1/doc.go b/samples/memcached-api-server/pkg/apis/myapps/v1alpha1/doc.go new file mode 100644 index 00000000000..9fb7228c9ee --- /dev/null +++ b/samples/memcached-api-server/pkg/apis/myapps/v1alpha1/doc.go @@ -0,0 +1,10 @@ +// Api versions allow the api contract for a resource to be changed while keeping +// backward compatibility by support multiple concurrent versions +// of the same resource + +// +k8s:openapi-gen=true +// +k8s:deepcopy-gen=package,register +// +k8s:conversion-gen=github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/apis/myapps +// +k8s:defaulter-gen=TypeMeta +// +groupName=myapps.memcached.example.com +package v1alpha1 // import "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/apis/myapps/v1alpha1" diff --git a/samples/memcached-api-server/pkg/apis/myapps/v1alpha1/memcached_types.go b/samples/memcached-api-server/pkg/apis/myapps/v1alpha1/memcached_types.go new file mode 100644 index 00000000000..bcd06c4c86c --- /dev/null +++ b/samples/memcached-api-server/pkg/apis/myapps/v1alpha1/memcached_types.go @@ -0,0 +1,36 @@ +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// EDIT THIS FILE! +// Created by "kubebuilder create resource" for you to implement the Memcached resource schema definition +// as a go struct. +// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. + +// MemcachedSpec defines the desired state of Memcached +type MemcachedSpec struct { + // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster + Size int32 `json:"size"` +} + +// MemcachedStatus defines the observed state of Memcached +type MemcachedStatus struct { + // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster + Nodes []string `json:"nodes,omitempty"` +} + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Memcached +// +k8s:openapi-gen=true +// +kubebuilder:resource:path=memcacheds +type Memcached struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec MemcachedSpec `json:"spec,omitempty"` + Status MemcachedStatus `json:"status,omitempty"` +} diff --git a/samples/memcached-api-server/pkg/apis/myapps/v1alpha1/memcached_types_test.go b/samples/memcached-api-server/pkg/apis/myapps/v1alpha1/memcached_types_test.go new file mode 100644 index 00000000000..4200b45da4f --- /dev/null +++ b/samples/memcached-api-server/pkg/apis/myapps/v1alpha1/memcached_types_test.go @@ -0,0 +1,67 @@ +package v1alpha1_test + +import ( + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + . "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/apis/myapps/v1alpha1" + . "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/client/clientset/versioned/typed/myapps/v1alpha1" +) + +// EDIT THIS FILE! +// Created by "kubebuilder create resource" for you to implement the Memcached resource tests + +var _ = Describe("Memcached", func() { + var instance Memcached + var expected Memcached + var client MemcachedInterface + + BeforeEach(func() { + instance = Memcached{} + instance.Name = "instance-1" + + expected = instance + }) + + AfterEach(func() { + client.Delete(instance.Name, &metav1.DeleteOptions{}) + }) + + // INSERT YOUR CODE HERE - add more "Describe" tests + + // Automatically created storage tests + Describe("when sending a storage request", func() { + Context("for a valid config", func() { + It("should provide CRUD access to the object", func() { + client = cs.MyappsV1alpha1().Memcacheds("default") + + By("returning success from the create request") + actual, err := client.Create(&instance) + Expect(err).ShouldNot(HaveOccurred()) + + By("defaulting the expected fields") + Expect(actual.Spec).To(Equal(expected.Spec)) + + By("returning the item for list requests") + result, err := client.List(metav1.ListOptions{}) + Expect(err).ShouldNot(HaveOccurred()) + Expect(result.Items).To(HaveLen(1)) + Expect(result.Items[0].Spec).To(Equal(expected.Spec)) + + By("returning the item for get requests") + actual, err = client.Get(instance.Name, metav1.GetOptions{}) + Expect(err).ShouldNot(HaveOccurred()) + Expect(actual.Spec).To(Equal(expected.Spec)) + + By("deleting the item for delete requests") + err = client.Delete(instance.Name, &metav1.DeleteOptions{}) + Expect(err).ShouldNot(HaveOccurred()) + result, err = client.List(metav1.ListOptions{}) + Expect(err).ShouldNot(HaveOccurred()) + Expect(result.Items).To(HaveLen(0)) + }) + }) + }) +}) diff --git a/samples/memcached-api-server/pkg/apis/myapps/v1alpha1/v1alpha1_suite_test.go b/samples/memcached-api-server/pkg/apis/myapps/v1alpha1/v1alpha1_suite_test.go new file mode 100644 index 00000000000..511c0958d69 --- /dev/null +++ b/samples/memcached-api-server/pkg/apis/myapps/v1alpha1/v1alpha1_suite_test.go @@ -0,0 +1,36 @@ +package v1alpha1_test + +import ( + "testing" + + "github.com/kubernetes-sigs/kubebuilder/pkg/test" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "k8s.io/client-go/rest" + + "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/client/clientset/versioned" + "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/inject" +) + +var testenv *test.TestEnvironment +var config *rest.Config +var cs *versioned.Clientset + +func TestV1alpha1(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecsWithDefaultAndCustomReporters(t, "v1 Suite", []Reporter{test.NewlineReporter{}}) +} + +var _ = BeforeSuite(func() { + testenv = &test.TestEnvironment{CRDs: inject.Injector.CRDs} + + var err error + config, err = testenv.Start() + Expect(err).NotTo(HaveOccurred()) + + cs = versioned.NewForConfigOrDie(config) +}) + +var _ = AfterSuite(func() { + testenv.Stop() +}) diff --git a/samples/memcached-api-server/pkg/controller/doc.go b/samples/memcached-api-server/pkg/controller/doc.go new file mode 100644 index 00000000000..b0b429f8999 --- /dev/null +++ b/samples/memcached-api-server/pkg/controller/doc.go @@ -0,0 +1 @@ +package controller diff --git a/samples/memcached-api-server/pkg/controller/memcached/controller.go b/samples/memcached-api-server/pkg/controller/memcached/controller.go new file mode 100644 index 00000000000..a77b7787b26 --- /dev/null +++ b/samples/memcached-api-server/pkg/controller/memcached/controller.go @@ -0,0 +1,213 @@ +package memcached + +import ( + "fmt" + "log" + + "github.com/kubernetes-sigs/kubebuilder/pkg/controller" + "github.com/kubernetes-sigs/kubebuilder/pkg/controller/types" + + myappsv1alpha1 "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/apis/myapps/v1alpha1" + myappsv1alpha1client "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/client/clientset/versioned/typed/myapps/v1alpha1" + myappsv1alpha1informer "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/client/informers/externalversions/myapps/v1alpha1" + myappsv1alpha1lister "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/client/listers/myapps/v1alpha1" + "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/inject/args" + "github.com/kubernetes-sigs/kubebuilder/pkg/controller/eventhandlers" + appsv1 "k8s.io/api/apps/v1" + "k8s.io/api/core/v1" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" +) + +// EDIT THIS FILE +// This files was created by "kubebuilder create resource" for you to edit. +// Controller implementation logic for Memcached resources goes here. + +func (bc *MemcachedController) Reconcile(k types.ReconcileKey) error { + + mc, err := bc.memcachedLister.Memcacheds(k.Namespace).Get(k.Name) + if err != nil { + if apierrors.IsNotFound(err) { + log.Printf("custom resource mc doesn't exist in queue for key: %s", k.Name) + return nil + } + return err + } + + // check if this deployment already exists + dp, err := bc.KubernetesInformers.Apps().V1().Deployments().Lister().Deployments(mc.Namespace).Get(mc.Name) + if apierrors.IsNotFound(err) { + // did not find any deployment corresponding to this mc, so lets create one + dp, err = bc.KubernetesClientSet.AppsV1().Deployments(mc.Namespace).Create(deploymentForMemcached(mc)) + if err != nil { + log.Printf("error in creating deployment: %v", err) + } + } + if err != nil { + log.Printf("error either listing or creating deployment: %v", err) + return err + } + + if !metav1.IsControlledBy(dp, mc) { + log.Printf("deployment: +%v is not controlled by +%v", dp, mc) + return fmt.Errorf("found orphaned deploymend...dep is not controlled by mc") + } + // by now we have dp pointing to the deployment corresponding to mc + + if dp.Spec.Replicas != nil && *dp.Spec.Replicas != mc.Spec.Size { + dp, err = bc.KubernetesClientSet.AppsV1().Deployments(mc.Namespace).Update(deploymentForMemcached(mc)) + if err != nil { + return err + } + } + + // Update the Memcached status with the pod names + labelSelector := labels.SelectorFromSet(labelsForMemcached(mc.Name)) + pods, err := bc.KubernetesInformers.Core().V1().Pods().Lister().Pods(mc.Namespace).List(labelSelector) + if err != nil { + return fmt.Errorf("failed to list pods: %v", err) + } + podNames := getPodNames(pods) + + log.Printf("got the pods names: %v", podNames) + + err = bc.updateMemcachedStatus(mc, podNames) + if err != nil { + return fmt.Errorf("failed to update mc with pod-names: %v", err) + } + + return nil +} + +func (bc *MemcachedController) updateMemcachedStatus(mc *myappsv1alpha1.Memcached, nodes []string) error { + mcCopy := mc.DeepCopy() + mcCopy.Status.Nodes = nodes + + _, err := bc.memcachedclient.Memcacheds(mc.Namespace).Update(mcCopy) + return err +} + +// +controller:group=myapps,version=v1alpha1,kind=Memcached,resource=memcacheds +// +informers:group=apps,version=v1,kind=Deployment +// +rbac:rbac:groups=apps,resources=Deployment,verbs=get;list;watch;create;update;patch;delete +// +informers:group=apps,version=v1,kind=ReplicaSet +// +rbac:rbac:groups=apps,resources=ReplicaSet,verbs=get;list;watch +// +informers:group=core,version=v1,kind=Pod +// +rbac:rbac:groups="",resources=Pod,verbs=get;list;watch +type MemcachedController struct { + args.InjectArgs + + // INSERT ADDITIONAL FIELDS HERE + memcachedLister myappsv1alpha1lister.MemcachedLister + memcachedclient myappsv1alpha1client.MyappsV1alpha1Interface +} + +// ProvideController provides a controller that will be run at startup. Kubebuilder will use codegeneration +// to automatically register this controller in the inject package +func ProvideController(arguments args.InjectArgs) (*controller.GenericController, error) { + // INSERT INITIALIZATIONS FOR ADDITIONAL FIELDS HERE + bc := &MemcachedController{ + InjectArgs: arguments, + memcachedLister: arguments.ControllerManager.GetInformerProvider(&myappsv1alpha1.Memcached{}).(myappsv1alpha1informer.MemcachedInformer).Lister(), + memcachedclient: arguments.Clientset.MyappsV1alpha1(), + } + + // Create a new controller that will call MemcachedController.Reconcile on changes to Memcacheds + gc := &controller.GenericController{ + Name: "MemcachedController", + Reconcile: bc.Reconcile, + InformerRegistry: arguments.ControllerManager, + } + if err := gc.Watch(&myappsv1alpha1.Memcached{}); err != nil { + return gc, err + } + if err := gc.WatchControllerOf(&v1.Pod{}, eventhandlers.Path{bc.LookupRS, bc.LookupDeployment, bc.LookupMemcached}); err != nil { + return gc, err + } + + return gc, nil +} + +func (bc *MemcachedController) LookupRS(r types.ReconcileKey) (interface{}, error) { + log.Printf("looking up ReplicaSet %+v", r) + return bc.KubernetesInformers.Apps().V1().ReplicaSets().Lister().ReplicaSets(r.Namespace).Get(r.Name) +} + +func (bc *MemcachedController) LookupDeployment(r types.ReconcileKey) (interface{}, error) { + log.Printf("looking up deployment %+v", r) + return bc.KubernetesInformers.Apps().V1().Deployments().Lister().Deployments(r.Namespace).Get(r.Name) +} + +func (bc *MemcachedController) LookupMemcached(r types.ReconcileKey) (interface{}, error) { + log.Printf("looking up MC: %+v", r) + return bc.Informers.Myapps().V1alpha1().Memcacheds().Lister().Memcacheds(r.Namespace).Get(r.Name) +} + +// deploymentForMemcached returns a memcached Deployment object +func deploymentForMemcached(m *myappsv1alpha1.Memcached) *appsv1.Deployment { + ls := labelsForMemcached(m.Name) + replicas := m.Spec.Size + + dep := &appsv1.Deployment{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "apps/v1", + Kind: "Deployment", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: m.Name, + Namespace: m.Namespace, + }, + Spec: appsv1.DeploymentSpec{ + Replicas: &replicas, + Selector: &metav1.LabelSelector{ + MatchLabels: ls, + }, + Template: v1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: ls, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{{ + Image: "memcached:1.4.36-alpine", + Name: "memcached", + Command: []string{"memcached", "-m=64", "-o", "modern", "-v"}, + Ports: []v1.ContainerPort{{ + ContainerPort: 11211, + Name: "memcached", + }}, + }}, + }, + }, + }, + } + addOwnerRefToObject(dep, *metav1.NewControllerRef(m, schema.GroupVersionKind{ + Group: myappsv1alpha1.SchemeGroupVersion.Group, + Version: myappsv1alpha1.SchemeGroupVersion.Version, + Kind: "Memcached", + })) + return dep +} + +// labelsForMemcached returns the labels for selecting the resources +// belonging to the given memcached CR name. +func labelsForMemcached(name string) map[string]string { + return map[string]string{"app": "memcached", "memcached_cr": name} +} + +// addOwnerRefToObject appends the desired OwnerReference to the object +func addOwnerRefToObject(obj metav1.Object, ownerRef metav1.OwnerReference) { + obj.SetOwnerReferences(append(obj.GetOwnerReferences(), ownerRef)) +} + +// getPodNames returns the pod names of the array of pods passed in +func getPodNames(pods []*v1.Pod) []string { + var podNames []string + for _, pod := range pods { + podNames = append(podNames, pod.Name) + } + return podNames +} diff --git a/samples/memcached-api-server/pkg/controller/memcached/controller_test.go b/samples/memcached-api-server/pkg/controller/memcached/controller_test.go new file mode 100644 index 00000000000..fad37ac4f95 --- /dev/null +++ b/samples/memcached-api-server/pkg/controller/memcached/controller_test.go @@ -0,0 +1,60 @@ +package memcached_test + +import ( + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + + "github.com/kubernetes-sigs/kubebuilder/pkg/controller/types" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + . "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/apis/myapps/v1alpha1" + . "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/client/clientset/versioned/typed/myapps/v1alpha1" +) + +// EDIT THIS FILE! +// Created by "kubebuilder create resource" for you to implement controller logic tests + +var _ = Describe("Memcached controller", func() { + var instance Memcached + var expectedKey types.ReconcileKey + var client MemcachedInterface + + BeforeEach(func() { + instance = Memcached{} + instance.Name = "instance-1" + expectedKey = types.ReconcileKey{ + Namespace: "default", + Name: "instance-1", + } + }) + + AfterEach(func() { + client.Delete(instance.Name, &metav1.DeleteOptions{}) + }) + + Describe("when creating a new object", func() { + It("invoke the reconcile method", func() { + after := make(chan struct{}) + ctrl.AfterReconcile = func(key types.ReconcileKey, err error) { + defer func() { + // Recover in case the key is reconciled multiple times + defer func() { recover() }() + close(after) + }() + defer GinkgoRecover() + Expect(key).To(Equal(expectedKey)) + Expect(err).ToNot(HaveOccurred()) + } + + // Create the instance + client = cs.MyappsV1alpha1().Memcacheds("default") + _, err := client.Create(&instance) + Expect(err).ShouldNot(HaveOccurred()) + + // Wait for reconcile to happen + Eventually(after, "10s", "100ms").Should(BeClosed()) + + // INSERT YOUR CODE HERE - test conditions post reconcile + }) + }) +}) diff --git a/samples/memcached-api-server/pkg/controller/memcached/memcached_suite_test.go b/samples/memcached-api-server/pkg/controller/memcached/memcached_suite_test.go new file mode 100644 index 00000000000..9252261b4f4 --- /dev/null +++ b/samples/memcached-api-server/pkg/controller/memcached/memcached_suite_test.go @@ -0,0 +1,59 @@ +package memcached_test + +import ( + "testing" + + "github.com/kubernetes-sigs/kubebuilder/pkg/controller" + "github.com/kubernetes-sigs/kubebuilder/pkg/inject/run" + "github.com/kubernetes-sigs/kubebuilder/pkg/test" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + + "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/client/clientset/versioned" + "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/inject" + "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/inject/args" +) + +var ( + testenv *test.TestEnvironment + config *rest.Config + cs *versioned.Clientset + ks *kubernetes.Clientset + shutdown chan struct{} + ctrl *controller.GenericController +) + +func TestBee(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecsWithDefaultAndCustomReporters(t, "Memcached Suite", []Reporter{test.NewlineReporter{}}) +} + +var _ = BeforeSuite(func() { + testenv = &test.TestEnvironment{CRDs: inject.Injector.CRDs} + var err error + config, err = testenv.Start() + Expect(err).NotTo(HaveOccurred()) + cs = versioned.NewForConfigOrDie(config) + ks = kubernetes.NewForConfigOrDie(config) + + shutdown = make(chan struct{}) + arguments := args.CreateInjectArgs(config) + go func() { + defer GinkgoRecover() + Expect(inject.RunAll(run.RunArguments{Stop: shutdown}, arguments)). + To(BeNil()) + }() + + // Wait for RunAll to create the controllers and then set the reference + defer GinkgoRecover() + Eventually(func() interface{} { return arguments.ControllerManager.GetController("MemcachedController") }). + Should(Not(BeNil())) + ctrl = arguments.ControllerManager.GetController("MemcachedController") +}) + +var _ = AfterSuite(func() { + close(shutdown) + testenv.Stop() +}) diff --git a/samples/memcached-api-server/pkg/doc.go b/samples/memcached-api-server/pkg/doc.go new file mode 100644 index 00000000000..4054dc323fd --- /dev/null +++ b/samples/memcached-api-server/pkg/doc.go @@ -0,0 +1,6 @@ + + + + +package pkg + diff --git a/samples/memcached-api-server/pkg/inject/args/args.go b/samples/memcached-api-server/pkg/inject/args/args.go new file mode 100644 index 00000000000..c6332c22e89 --- /dev/null +++ b/samples/memcached-api-server/pkg/inject/args/args.go @@ -0,0 +1,29 @@ +package args + +import ( + "time" + + "github.com/kubernetes-sigs/kubebuilder/pkg/inject/args" + "k8s.io/client-go/rest" + + "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/client/clientset/versioned" + "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/client/informers/externalversions" +) + +// InjectArgs are the arguments need to initialize controllers +type InjectArgs struct { + args.InjectArgs + + Clientset *versioned.Clientset + Informers externalversions.SharedInformerFactory +} + +// CreateInjectArgs returns new controller args +func CreateInjectArgs(config *rest.Config) InjectArgs { + cs := versioned.NewForConfigOrDie(config) + return InjectArgs{ + InjectArgs: args.CreateInjectArgs(config), + Clientset: cs, + Informers: externalversions.NewSharedInformerFactory(cs, 2*time.Minute), + } +} diff --git a/samples/memcached-api-server/pkg/inject/doc.go b/samples/memcached-api-server/pkg/inject/doc.go new file mode 100644 index 00000000000..cf5a519b9a5 --- /dev/null +++ b/samples/memcached-api-server/pkg/inject/doc.go @@ -0,0 +1,6 @@ + + + + +package inject + diff --git a/samples/memcached-api-server/pkg/inject/inject.go b/samples/memcached-api-server/pkg/inject/inject.go new file mode 100644 index 00000000000..adee1f5afed --- /dev/null +++ b/samples/memcached-api-server/pkg/inject/inject.go @@ -0,0 +1,29 @@ +package inject + +import ( + injectargs "github.com/kubernetes-sigs/kubebuilder/pkg/inject/args" + "github.com/kubernetes-sigs/kubebuilder/pkg/inject/run" + + "github.com/kubernetes-sigs/kubebuilder/samples/memcached-api-server/pkg/inject/args" +) + +var ( + // Inject is used to add items to the Injector + Inject []func(args.InjectArgs) error + + // Injector runs items + Injector injectargs.Injector +) + +// RunAll starts all of the informers and Controllers +func RunAll(rargs run.RunArguments, iargs args.InjectArgs) error { + // Run functions to initialize injector + for _, i := range Inject { + if err := i(iargs); err != nil { + return err + } + } + Injector.Run(rargs) + <-rargs.Stop + return nil +}