diff --git a/test/extended/images/redirect.go b/test/extended/images/redirect.go new file mode 100644 index 000000000000..9ae2da4141c7 --- /dev/null +++ b/test/extended/images/redirect.go @@ -0,0 +1,182 @@ +package images + +import ( + "context" + "crypto/tls" + "encoding/json" + "fmt" + "net/http" + "net/http/httputil" + "strings" + + g "github.com/onsi/ginkgo" + o "github.com/onsi/gomega" + configv1 "github.com/openshift/api/config/v1" + imageapi "github.com/openshift/api/image/v1" + imageregistry "github.com/openshift/client-go/imageregistry/clientset/versioned" + exutil "github.com/openshift/origin/test/extended/util" + "github.com/openshift/origin/test/extended/util/imageregistryutil" + kapi "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/kubernetes/pkg/credentialprovider" + "k8s.io/kubernetes/test/e2e/framework" + k8simage "k8s.io/kubernetes/test/utils/image" +) + +var _ = g.Describe("[sig-imageregistry] Image redirect", func() { + defer g.GinkgoRecover() + + routeNamespace := "openshift-image-registry" + routeName := "test-image-redirect" + var oc *exutil.CLI + var ns string + + g.BeforeEach(func() { + oc.AdminRouteClient().RouteV1().Routes(routeNamespace).Delete(context.TODO(), routeName, metav1.DeleteOptions{}) + _, err := imageregistryutil.ExposeImageRegistry(context.TODO(), oc.AdminRouteClient(), routeName) + o.Expect(err).NotTo(o.HaveOccurred()) + }) + + g.AfterEach(func() { + oc.AdminRouteClient().RouteV1().Routes(routeNamespace).Delete(context.TODO(), routeName, metav1.DeleteOptions{}) + if g.CurrentGinkgoTestDescription().Failed && len(ns) > 0 { + exutil.DumpPodLogsStartingWithInNamespace("", ns, oc) + } + }) + + oc = exutil.NewCLI("image-redirect") + + g.It("should redirect an image pull on GCP", func() { + ctx := context.TODO() + infrastructure, err := oc.AdminConfigClient().ConfigV1().Infrastructures().Get(ctx, "cluster", metav1.GetOptions{}) + o.Expect(err).NotTo(o.HaveOccurred()) + if infrastructure.Status.PlatformStatus == nil { + g.Fail("missing platform") + } + if infrastructure.Status.PlatformStatus.Type != configv1.GCPPlatformType { + g.Skip("only run on GCP") + } + imageRegistryConfigClient, err := imageregistry.NewForConfig(oc.AdminConfig()) + o.Expect(err).NotTo(o.HaveOccurred()) + imageRegistryConfig, err := imageRegistryConfigClient.ImageregistryV1().Configs().Get(ctx, "cluster", metav1.GetOptions{}) + o.Expect(err).NotTo(o.HaveOccurred()) + if imageRegistryConfig.Spec.DisableRedirect { + g.Skip("only run when using redirect") + } + if imageRegistryConfig.Spec.Storage.GCS == nil { + g.Skip("only run when using GCS") + } + + ns = oc.Namespace() + client := oc.ImageClient().ImageV1() + + // import tools:latest into this namespace - working around a pull through bug with referenced docker images + // https://bugzilla.redhat.com/show_bug.cgi?id=1843253 + _, err = client.ImageStreamTags(ns).Create(context.Background(), &imageapi.ImageStreamTag{ + ObjectMeta: metav1.ObjectMeta{Name: "1:tools"}, + Tag: &imageapi.TagReference{ + From: &kapi.ObjectReference{Kind: "ImageStreamTag", Namespace: "openshift", Name: "tools:latest"}, + }, + }, metav1.CreateOptions{}) + o.Expect(err).ToNot(o.HaveOccurred()) + + isi, err := client.ImageStreamImports(ns).Create(context.Background(), &imageapi.ImageStreamImport{ + ObjectMeta: metav1.ObjectMeta{ + Name: "1", + }, + Spec: imageapi.ImageStreamImportSpec{ + Import: true, + Repository: &imageapi.RepositoryImportSpec{ + From: kapi.ObjectReference{Kind: "DockerImage", Name: strings.Split(k8simage.GetE2EImage(k8simage.Agnhost), "/")[0]}, + ReferencePolicy: imageapi.TagReferencePolicy{ + Type: imageapi.LocalTagReferencePolicy, + }, + }, + Images: []imageapi.ImageImportSpec{ + { + From: kapi.ObjectReference{Kind: "DockerImage", Name: k8simage.GetE2EImage(k8simage.Agnhost)}, + To: &kapi.LocalObjectReference{Name: "mysql"}, + }, + }, + }, + }, metav1.CreateOptions{}) + o.Expect(err).ToNot(o.HaveOccurred()) + + for i, img := range isi.Status.Images { + o.Expect(img.Status.Status).To(o.Equal("Success"), fmt.Sprintf("imagestreamimport status for spec.image[%d] (message: %s)", i, img.Status.Message)) + } + imageLayer := "" + for _, img := range isi.Status.Images { + if img.Image != nil { + if len(img.Image.DockerImageLayers) > 0 { + imageLayer = img.Image.DockerImageLayers[len(img.Image.DockerImageLayers)-1].Name + } + } + } + + // I've now got an imported image, I need to do something equivalent to + // curl -v -H "Authorization: Basic $BUILD02" https://registry.build02.ci.openshift.org/v2/openshift/tests/blobs/sha256:b46897b86ca27977cf8e71c558d5893166db6b9b944298510265660dc17b3e44 + route, err := oc.AdminRouteClient().RouteV1().Routes(routeNamespace).Get(context.TODO(), routeName, metav1.GetOptions{}) + o.Expect(err).ToNot(o.HaveOccurred()) + url := fmt.Sprintf("https://%s/v2/%s/1/blobs/%s", + route.Status.Ingress[0].Host, + oc.Namespace(), + imageLayer, + ) + + // get the token to use to pull the data from the registry. + imageRegistryToken := "" + sa, err := oc.KubeClient().CoreV1().ServiceAccounts(oc.Namespace()).Get(ctx, "builder", metav1.GetOptions{}) + o.Expect(err).NotTo(o.HaveOccurred()) + o.Expect(sa.ImagePullSecrets).NotTo(o.BeEmpty()) + pullSecretName := sa.ImagePullSecrets[0].Name + pullSecret, err := oc.KubeClient().CoreV1().Secrets(oc.Namespace()).Get(ctx, pullSecretName, metav1.GetOptions{}) + o.Expect(err).NotTo(o.HaveOccurred()) + dockerCfg := credentialprovider.DockerConfig{} + err = json.Unmarshal(pullSecret.Data[".dockercfg"], &dockerCfg) + o.Expect(err).NotTo(o.HaveOccurred()) + for _, auth := range dockerCfg { + imageRegistryToken = auth.Password // these should all have the same value + break + } + framework.Logf("using token: %q", imageRegistryToken) + + // create a custom http client so we can reliably detect the redirects + httpClient := http.Client{ + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: true, // this token will be gone shortly and if someone can intercept the router in a CI cluster, they can intercept a lot. + }, + }, + // this prevents the client from automatically following redirects + CheckRedirect: func(req *http.Request, via []*http.Request) error { + return http.ErrUseLastResponse + }, + } + request, err := http.NewRequest("GET", url, nil) + o.Expect(err).NotTo(o.HaveOccurred()) + request.Header.Set("Authorization", "Bearer "+imageRegistryToken) + request.Header.Set("Accept", "application/vnd.docker.distribution.manifest.v2+json") + + response, err := httpClient.Do(request) + o.Expect(err).NotTo(o.HaveOccurred()) + + // only dump the body if we didn't get a 200-series. If we got a 200 series, chances are that it will be quite large. + dumpBody := false + if response.StatusCode > 299 || response.StatusCode < 200 { + dumpBody = true + } + bodyDump, err := httputil.DumpResponse(response, dumpBody) + o.Expect(err).NotTo(o.HaveOccurred()) + framework.Logf("response: %v", string(bodyDump)) + o.Expect(response.StatusCode).To( + o.Equal(http.StatusTemporaryRedirect), + fmt.Sprintf("GET from %s must be %v for performance reasons; got %v", url, http.StatusTemporaryRedirect, response.StatusCode), + ) + + redirectLocation := response.Header["Location"][0] + if !strings.Contains(redirectLocation, "storage.googleapis.com") { + g.Fail(fmt.Sprintf("expected redirect to google storage, but got %v", response.Header["Location"])) + } + }) +}) diff --git a/test/extended/util/annotate/generated/zz_generated.annotations.go b/test/extended/util/annotate/generated/zz_generated.annotations.go index 4945e17143ea..5280494fa9f3 100644 --- a/test/extended/util/annotate/generated/zz_generated.annotations.go +++ b/test/extended/util/annotate/generated/zz_generated.annotations.go @@ -1555,6 +1555,8 @@ var annotations = map[string]string{ "[Top Level] [sig-etcd][Feature:DisasterRecovery][Disruptive] [Feature:EtcdRecovery] Cluster should restore itself after quorum loss": "[Feature:EtcdRecovery] Cluster should restore itself after quorum loss [Serial]", + "[Top Level] [sig-imageregistry] Image redirect should redirect an image pull on GCP": "should redirect an image pull on GCP [Suite:openshift/conformance/parallel]", + "[Top Level] [sig-imageregistry][Feature:ImageAppend] Image append should create images by appending them": "should create images by appending them [Skipped:Disconnected] [Suite:openshift/conformance/parallel]", "[Top Level] [sig-imageregistry][Feature:ImageExtract] Image extract should extract content from an image": "should extract content from an image [Skipped:Disconnected] [Suite:openshift/conformance/parallel]", diff --git a/test/extended/util/imageregistryutil/expose_imageregistry.go b/test/extended/util/imageregistryutil/expose_imageregistry.go new file mode 100644 index 000000000000..da206a972598 --- /dev/null +++ b/test/extended/util/imageregistryutil/expose_imageregistry.go @@ -0,0 +1,60 @@ +package imageregistryutil + +import ( + "context" + "fmt" + "time" + + routev1 "github.com/openshift/api/route/v1" + routeclient "github.com/openshift/client-go/route/clientset/versioned" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/apimachinery/pkg/util/wait" +) + +func ExposeImageRegistry(ctx context.Context, routeClient routeclient.Interface, routeName string) (*routev1.Route, error) { + route, err := routeClient.RouteV1().Routes("openshift-image-registry").Create(ctx, &routev1.Route{ + ObjectMeta: metav1.ObjectMeta{ + Name: routeName, + }, + Spec: routev1.RouteSpec{ + To: routev1.RouteTargetReference{ + Kind: "Service", + Name: "image-registry", + }, + Port: &routev1.RoutePort{ + TargetPort: intstr.FromInt(5000), + }, + TLS: &routev1.TLSConfig{ + Termination: routev1.TLSTerminationPassthrough, + InsecureEdgeTerminationPolicy: routev1.InsecureEdgeTerminationPolicyRedirect, + }, + }, + }, metav1.CreateOptions{}) + if err != nil { + return nil, err + } + + err = wait.PollImmediate(1*time.Second, 30*time.Second, func() (bool, error) { + route, err = routeClient.RouteV1().Routes("openshift-image-registry").Get(ctx, routeName, metav1.GetOptions{}) + if err != nil { + return false, err + } + + for _, ingress := range route.Status.Ingress { + if len(ingress.Host) > 0 { + return true, nil + } + } + return false, nil + }) + if err != nil { + return nil, fmt.Errorf("failed to get route host: %w", err) + } + + // in CI we observe a gap between the route having status and the route actually being exposed consistently. + // this results in a 503 for 4 seconds observed so far. I'm choosing 30 seconds more or less at random. + time.Sleep(30 * time.Second) + + return route, nil +} diff --git a/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/clientset.go b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/clientset.go new file mode 100644 index 000000000000..8868cb4ee08a --- /dev/null +++ b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/clientset.go @@ -0,0 +1,81 @@ +// Code generated by client-gen. DO NOT EDIT. + +package versioned + +import ( + "fmt" + + imageregistryv1 "github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1" + 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 + ImageregistryV1() imageregistryv1.ImageregistryV1Interface +} + +// Clientset contains the clients for groups. Each group has exactly one +// version included in a Clientset. +type Clientset struct { + *discovery.DiscoveryClient + imageregistryV1 *imageregistryv1.ImageregistryV1Client +} + +// ImageregistryV1 retrieves the ImageregistryV1Client +func (c *Clientset) ImageregistryV1() imageregistryv1.ImageregistryV1Interface { + return c.imageregistryV1 +} + +// 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. +// If config's RateLimiter is not set and QPS and Burst are acceptable, +// NewForConfig will generate a rate-limiter in configShallowCopy. +func NewForConfig(c *rest.Config) (*Clientset, error) { + configShallowCopy := *c + if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { + if configShallowCopy.Burst <= 0 { + return nil, fmt.Errorf("burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0") + } + configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst) + } + var cs Clientset + var err error + cs.imageregistryV1, err = imageregistryv1.NewForConfig(&configShallowCopy) + if err != nil { + return nil, err + } + + cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) + if err != nil { + 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.imageregistryV1 = imageregistryv1.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.imageregistryV1 = imageregistryv1.New(c) + + cs.DiscoveryClient = discovery.NewDiscoveryClient(c) + return &cs +} diff --git a/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/doc.go b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/doc.go new file mode 100644 index 000000000000..0e0c2a8900e2 --- /dev/null +++ b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/doc.go @@ -0,0 +1,4 @@ +// Code generated by client-gen. DO NOT EDIT. + +// This package has the automatically generated clientset. +package versioned diff --git a/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/scheme/doc.go b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/scheme/doc.go new file mode 100644 index 000000000000..14db57a58f8d --- /dev/null +++ b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/scheme/doc.go @@ -0,0 +1,4 @@ +// Code generated by client-gen. DO NOT EDIT. + +// This package contains the scheme of the automatically generated clientset. +package scheme diff --git a/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/scheme/register.go b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/scheme/register.go new file mode 100644 index 000000000000..687270145169 --- /dev/null +++ b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/scheme/register.go @@ -0,0 +1,40 @@ +// Code generated by client-gen. DO NOT EDIT. + +package scheme + +import ( + imageregistryv1 "github.com/openshift/api/imageregistry/v1" + 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" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" +) + +var Scheme = runtime.NewScheme() +var Codecs = serializer.NewCodecFactory(Scheme) +var ParameterCodec = runtime.NewParameterCodec(Scheme) +var localSchemeBuilder = runtime.SchemeBuilder{ + imageregistryv1.AddToScheme, +} + +// 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/kubernetes/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. +var AddToScheme = localSchemeBuilder.AddToScheme + +func init() { + v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) + utilruntime.Must(AddToScheme(Scheme)) +} diff --git a/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1/config.go b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1/config.go new file mode 100644 index 000000000000..9a0770113363 --- /dev/null +++ b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1/config.go @@ -0,0 +1,168 @@ +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + "time" + + v1 "github.com/openshift/api/imageregistry/v1" + scheme "github.com/openshift/client-go/imageregistry/clientset/versioned/scheme" + metav1 "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" +) + +// ConfigsGetter has a method to return a ConfigInterface. +// A group's client should implement this interface. +type ConfigsGetter interface { + Configs() ConfigInterface +} + +// ConfigInterface has methods to work with Config resources. +type ConfigInterface interface { + Create(ctx context.Context, config *v1.Config, opts metav1.CreateOptions) (*v1.Config, error) + Update(ctx context.Context, config *v1.Config, opts metav1.UpdateOptions) (*v1.Config, error) + UpdateStatus(ctx context.Context, config *v1.Config, opts metav1.UpdateOptions) (*v1.Config, error) + Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.Config, error) + List(ctx context.Context, opts metav1.ListOptions) (*v1.ConfigList, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Config, err error) + ConfigExpansion +} + +// configs implements ConfigInterface +type configs struct { + client rest.Interface +} + +// newConfigs returns a Configs +func newConfigs(c *ImageregistryV1Client) *configs { + return &configs{ + client: c.RESTClient(), + } +} + +// Get takes name of the config, and returns the corresponding config object, and an error if there is any. +func (c *configs) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.Config, err error) { + result = &v1.Config{} + err = c.client.Get(). + Resource("configs"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of Configs that match those selectors. +func (c *configs) List(ctx context.Context, opts metav1.ListOptions) (result *v1.ConfigList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1.ConfigList{} + err = c.client.Get(). + Resource("configs"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested configs. +func (c *configs) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Resource("configs"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a config and creates it. Returns the server's representation of the config, and an error, if there is any. +func (c *configs) Create(ctx context.Context, config *v1.Config, opts metav1.CreateOptions) (result *v1.Config, err error) { + result = &v1.Config{} + err = c.client.Post(). + Resource("configs"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(config). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a config and updates it. Returns the server's representation of the config, and an error, if there is any. +func (c *configs) Update(ctx context.Context, config *v1.Config, opts metav1.UpdateOptions) (result *v1.Config, err error) { + result = &v1.Config{} + err = c.client.Put(). + Resource("configs"). + Name(config.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(config). + Do(ctx). + 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 *configs) UpdateStatus(ctx context.Context, config *v1.Config, opts metav1.UpdateOptions) (result *v1.Config, err error) { + result = &v1.Config{} + err = c.client.Put(). + Resource("configs"). + Name(config.Name). + SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(config). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the config and deletes it. Returns an error if one occurs. +func (c *configs) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { + return c.client.Delete(). + Resource("configs"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *configs) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Resource("configs"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched config. +func (c *configs) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Config, err error) { + result = &v1.Config{} + err = c.client.Patch(pt). + Resource("configs"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1/doc.go b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1/doc.go new file mode 100644 index 000000000000..225e6b2be34f --- /dev/null +++ b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1/doc.go @@ -0,0 +1,4 @@ +// Code generated by client-gen. DO NOT EDIT. + +// This package has the automatically generated typed clients. +package v1 diff --git a/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1/generated_expansion.go b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1/generated_expansion.go new file mode 100644 index 000000000000..fec71671f4ed --- /dev/null +++ b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1/generated_expansion.go @@ -0,0 +1,7 @@ +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +type ConfigExpansion interface{} + +type ImagePrunerExpansion interface{} diff --git a/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1/imagepruner.go b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1/imagepruner.go new file mode 100644 index 000000000000..834e6a448b55 --- /dev/null +++ b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1/imagepruner.go @@ -0,0 +1,168 @@ +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + "time" + + v1 "github.com/openshift/api/imageregistry/v1" + scheme "github.com/openshift/client-go/imageregistry/clientset/versioned/scheme" + metav1 "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" +) + +// ImagePrunersGetter has a method to return a ImagePrunerInterface. +// A group's client should implement this interface. +type ImagePrunersGetter interface { + ImagePruners() ImagePrunerInterface +} + +// ImagePrunerInterface has methods to work with ImagePruner resources. +type ImagePrunerInterface interface { + Create(ctx context.Context, imagePruner *v1.ImagePruner, opts metav1.CreateOptions) (*v1.ImagePruner, error) + Update(ctx context.Context, imagePruner *v1.ImagePruner, opts metav1.UpdateOptions) (*v1.ImagePruner, error) + UpdateStatus(ctx context.Context, imagePruner *v1.ImagePruner, opts metav1.UpdateOptions) (*v1.ImagePruner, error) + Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.ImagePruner, error) + List(ctx context.Context, opts metav1.ListOptions) (*v1.ImagePrunerList, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ImagePruner, err error) + ImagePrunerExpansion +} + +// imagePruners implements ImagePrunerInterface +type imagePruners struct { + client rest.Interface +} + +// newImagePruners returns a ImagePruners +func newImagePruners(c *ImageregistryV1Client) *imagePruners { + return &imagePruners{ + client: c.RESTClient(), + } +} + +// Get takes name of the imagePruner, and returns the corresponding imagePruner object, and an error if there is any. +func (c *imagePruners) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.ImagePruner, err error) { + result = &v1.ImagePruner{} + err = c.client.Get(). + Resource("imagepruners"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of ImagePruners that match those selectors. +func (c *imagePruners) List(ctx context.Context, opts metav1.ListOptions) (result *v1.ImagePrunerList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1.ImagePrunerList{} + err = c.client.Get(). + Resource("imagepruners"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested imagePruners. +func (c *imagePruners) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Resource("imagepruners"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a imagePruner and creates it. Returns the server's representation of the imagePruner, and an error, if there is any. +func (c *imagePruners) Create(ctx context.Context, imagePruner *v1.ImagePruner, opts metav1.CreateOptions) (result *v1.ImagePruner, err error) { + result = &v1.ImagePruner{} + err = c.client.Post(). + Resource("imagepruners"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(imagePruner). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a imagePruner and updates it. Returns the server's representation of the imagePruner, and an error, if there is any. +func (c *imagePruners) Update(ctx context.Context, imagePruner *v1.ImagePruner, opts metav1.UpdateOptions) (result *v1.ImagePruner, err error) { + result = &v1.ImagePruner{} + err = c.client.Put(). + Resource("imagepruners"). + Name(imagePruner.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(imagePruner). + Do(ctx). + 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 *imagePruners) UpdateStatus(ctx context.Context, imagePruner *v1.ImagePruner, opts metav1.UpdateOptions) (result *v1.ImagePruner, err error) { + result = &v1.ImagePruner{} + err = c.client.Put(). + Resource("imagepruners"). + Name(imagePruner.Name). + SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(imagePruner). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the imagePruner and deletes it. Returns an error if one occurs. +func (c *imagePruners) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { + return c.client.Delete(). + Resource("imagepruners"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *imagePruners) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Resource("imagepruners"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched imagePruner. +func (c *imagePruners) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ImagePruner, err error) { + result = &v1.ImagePruner{} + err = c.client.Patch(pt). + Resource("imagepruners"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1/imageregistry_client.go b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1/imageregistry_client.go new file mode 100644 index 000000000000..bf48ba02cb8a --- /dev/null +++ b/vendor/github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1/imageregistry_client.go @@ -0,0 +1,78 @@ +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "github.com/openshift/api/imageregistry/v1" + "github.com/openshift/client-go/imageregistry/clientset/versioned/scheme" + rest "k8s.io/client-go/rest" +) + +type ImageregistryV1Interface interface { + RESTClient() rest.Interface + ConfigsGetter + ImagePrunersGetter +} + +// ImageregistryV1Client is used to interact with features provided by the imageregistry.operator.openshift.io group. +type ImageregistryV1Client struct { + restClient rest.Interface +} + +func (c *ImageregistryV1Client) Configs() ConfigInterface { + return newConfigs(c) +} + +func (c *ImageregistryV1Client) ImagePruners() ImagePrunerInterface { + return newImagePruners(c) +} + +// NewForConfig creates a new ImageregistryV1Client for the given config. +func NewForConfig(c *rest.Config) (*ImageregistryV1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientFor(&config) + if err != nil { + return nil, err + } + return &ImageregistryV1Client{client}, nil +} + +// NewForConfigOrDie creates a new ImageregistryV1Client for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *ImageregistryV1Client { + client, err := NewForConfig(c) + if err != nil { + panic(err) + } + return client +} + +// New creates a new ImageregistryV1Client for the given RESTClient. +func New(c rest.Interface) *ImageregistryV1Client { + return &ImageregistryV1Client{c} +} + +func setConfigDefaults(config *rest.Config) error { + gv := v1.SchemeGroupVersion + config.GroupVersion = &gv + config.APIPath = "/apis" + config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() + + 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 *ImageregistryV1Client) RESTClient() rest.Interface { + if c == nil { + return nil + } + return c.restClient +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 4afa54cd44fe..5afabf46b0b6 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -763,6 +763,9 @@ github.com/openshift/client-go/config/listers/config/v1 github.com/openshift/client-go/image/clientset/versioned github.com/openshift/client-go/image/clientset/versioned/scheme github.com/openshift/client-go/image/clientset/versioned/typed/image/v1 +github.com/openshift/client-go/imageregistry/clientset/versioned +github.com/openshift/client-go/imageregistry/clientset/versioned/scheme +github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1 github.com/openshift/client-go/network/clientset/versioned/scheme github.com/openshift/client-go/network/clientset/versioned/typed/network/v1 github.com/openshift/client-go/oauth/clientset/versioned