mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-12-19 11:30:24 +00:00
e46099a504
Signed-off-by: Huamin Chen <hchen@redhat.com>
132 lines
5.3 KiB
Go
132 lines
5.3 KiB
Go
/*
|
|
Copyright 2016 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
// Package dynamic provides a client interface to arbitrary Kubernetes
|
|
// APIs that exposes common high level operations and exposes common
|
|
// metadata.
|
|
package deprecated_dynamic
|
|
|
|
import (
|
|
"strings"
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
"k8s.io/apimachinery/pkg/types"
|
|
"k8s.io/apimachinery/pkg/watch"
|
|
"k8s.io/client-go/dynamic"
|
|
restclient "k8s.io/client-go/rest"
|
|
)
|
|
|
|
// Interface is a Kubernetes client that allows you to access metadata
|
|
// and manipulate metadata of a Kubernetes API group.
|
|
type Interface interface {
|
|
// Resource returns an API interface to the specified resource for this client's
|
|
// group and version. If resource is not a namespaced resource, then namespace
|
|
// is ignored. The ResourceInterface inherits the parameter codec of this client.
|
|
Resource(resource *metav1.APIResource, namespace string) ResourceInterface
|
|
}
|
|
|
|
// ResourceInterface is an API interface to a specific resource under a
|
|
// dynamic client.
|
|
type ResourceInterface interface {
|
|
// List returns a list of objects for this resource.
|
|
List(opts metav1.ListOptions) (runtime.Object, error)
|
|
// Get gets the resource with the specified name.
|
|
Get(name string, opts metav1.GetOptions) (*unstructured.Unstructured, error)
|
|
// Delete deletes the resource with the specified name.
|
|
Delete(name string, opts *metav1.DeleteOptions) error
|
|
// DeleteCollection deletes a collection of objects.
|
|
DeleteCollection(deleteOptions *metav1.DeleteOptions, listOptions metav1.ListOptions) error
|
|
// Create creates the provided resource.
|
|
Create(obj *unstructured.Unstructured) (*unstructured.Unstructured, error)
|
|
// Update updates the provided resource.
|
|
Update(obj *unstructured.Unstructured) (*unstructured.Unstructured, error)
|
|
// Watch returns a watch.Interface that watches the resource.
|
|
Watch(opts metav1.ListOptions) (watch.Interface, error)
|
|
// Patch patches the provided resource.
|
|
Patch(name string, pt types.PatchType, data []byte) (*unstructured.Unstructured, error)
|
|
}
|
|
|
|
// Client is a Kubernetes client that allows you to access metadata
|
|
// and manipulate metadata of a Kubernetes API group, and implements Interface.
|
|
type Client struct {
|
|
version schema.GroupVersion
|
|
delegate dynamic.Interface
|
|
}
|
|
|
|
// NewClient returns a new client based on the passed in config. The
|
|
// codec is ignored, as the dynamic client uses it's own codec.
|
|
func NewClient(conf *restclient.Config, version schema.GroupVersion) (*Client, error) {
|
|
delegate, err := dynamic.NewForConfig(conf)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &Client{version: version, delegate: delegate}, nil
|
|
}
|
|
|
|
// Resource returns an API interface to the specified resource for this client's
|
|
// group and version. If resource is not a namespaced resource, then namespace
|
|
// is ignored. The ResourceInterface inherits the parameter codec of c.
|
|
func (c *Client) Resource(resource *metav1.APIResource, namespace string) ResourceInterface {
|
|
resourceTokens := strings.SplitN(resource.Name, "/", 2)
|
|
subresources := []string{}
|
|
if len(resourceTokens) > 1 {
|
|
subresources = strings.Split(resourceTokens[1], "/")
|
|
}
|
|
|
|
if len(namespace) == 0 {
|
|
return oldResourceShim(c.delegate.Resource(c.version.WithResource(resourceTokens[0])), subresources)
|
|
}
|
|
return oldResourceShim(c.delegate.Resource(c.version.WithResource(resourceTokens[0])).Namespace(namespace), subresources)
|
|
}
|
|
|
|
// the old interfaces used the wrong type for lists. this fixes that
|
|
func oldResourceShim(in dynamic.ResourceInterface, subresources []string) ResourceInterface {
|
|
return oldResourceShimType{ResourceInterface: in, subresources: subresources}
|
|
}
|
|
|
|
type oldResourceShimType struct {
|
|
dynamic.ResourceInterface
|
|
subresources []string
|
|
}
|
|
|
|
func (s oldResourceShimType) Create(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) {
|
|
return s.ResourceInterface.Create(obj, metav1.CreateOptions{}, s.subresources...)
|
|
}
|
|
|
|
func (s oldResourceShimType) Update(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) {
|
|
return s.ResourceInterface.Update(obj, metav1.UpdateOptions{}, s.subresources...)
|
|
}
|
|
|
|
func (s oldResourceShimType) Delete(name string, opts *metav1.DeleteOptions) error {
|
|
return s.ResourceInterface.Delete(name, opts, s.subresources...)
|
|
}
|
|
|
|
func (s oldResourceShimType) Get(name string, opts metav1.GetOptions) (*unstructured.Unstructured, error) {
|
|
return s.ResourceInterface.Get(name, opts, s.subresources...)
|
|
}
|
|
|
|
func (s oldResourceShimType) List(opts metav1.ListOptions) (runtime.Object, error) {
|
|
return s.ResourceInterface.List(opts)
|
|
}
|
|
|
|
func (s oldResourceShimType) Patch(name string, pt types.PatchType, data []byte) (*unstructured.Unstructured, error) {
|
|
return s.ResourceInterface.Patch(name, pt, data, metav1.UpdateOptions{}, s.subresources...)
|
|
}
|