gardener: github.com/gardener/gardener/pkg/client/kubernetes Index | Files | Directories

package kubernetes

import "github.com/gardener/gardener/pkg/client/kubernetes"

Index

Package Files

admissionplugins.go applier.go chartapplier.go chartoptions.go client.go clientset.go manifestoptions.go options.go pods.go runtime_client.go scaling.go types.go

Constants

const KubeConfig = "kubeconfig"

KubeConfig is the key to the kubeconfig

Variables

var (
    DefaultMergeFuncs = MergeFuncs{
        corev1.SchemeGroupVersion.WithKind("Service").GroupKind(): func(newObj, oldObj *unstructured.Unstructured) {
            newSvcType, found, _ := unstructured.NestedString(newObj.Object, "spec", "type")
            if !found {
                newSvcType = string(corev1.ServiceTypeClusterIP)
                _ = unstructured.SetNestedField(newObj.Object, newSvcType, "spec", "type")
            }

            oldSvcType, found, _ := unstructured.NestedString(oldObj.Object, "spec", "type")
            if !found {
                oldSvcType = string(corev1.ServiceTypeClusterIP)
            }

            switch newSvcType {
            case string(corev1.ServiceTypeLoadBalancer), string(corev1.ServiceTypeNodePort):
                oldPorts, found, _ := unstructured.NestedSlice(oldObj.Object, "spec", "ports")
                if !found {

                    break
                }

                newPorts, found, _ := unstructured.NestedSlice(newObj.Object, "spec", "ports")
                if !found {

                    break
                }

                ports := make([]interface{}, 0, len(newPorts))
                for _, newPort := range newPorts {
                    np := newPort.(map[string]interface{})
                    npName, _, _ := unstructured.NestedString(np, "name")
                    npPort, _ := nestedFloat64OrInt64(np, "port")
                    nodePort, ok := nestedFloat64OrInt64(np, "nodePort")

                    for _, oldPortObj := range oldPorts {
                        op := oldPortObj.(map[string]interface{})
                        opName, _, _ := unstructured.NestedString(op, "name")
                        opPort, _ := nestedFloat64OrInt64(op, "port")

                        if (opName == npName || opPort == npPort) && (!ok || nodePort == 0) {
                            np["nodePort"] = op["nodePort"]
                        }
                    }

                    ports = append(ports, np)
                }

                _ = unstructured.SetNestedSlice(newObj.Object, ports, "spec", "ports")

            case string(corev1.ServiceTypeExternalName):

                return
            }

            if oldSvcType != string(corev1.ServiceTypeExternalName) {
                newClusterIP, _, _ := unstructured.NestedString(newObj.Object, "spec", "clusterIP")
                if newClusterIP != corev1.ClusterIPNone || newSvcType != string(corev1.ServiceTypeClusterIP) {
                    oldClusterIP, _, _ := unstructured.NestedString(oldObj.Object, "spec", "clusterIP")
                    _ = unstructured.SetNestedField(newObj.Object, oldClusterIP, "spec", "clusterIP")
                }
            }

            newETP, _, _ := unstructured.NestedString(newObj.Object, "spec", "externalTrafficPolicy")
            oldETP, _, _ := unstructured.NestedString(oldObj.Object, "spec", "externalTrafficPolicy")

            if oldSvcType == string(corev1.ServiceTypeLoadBalancer) &&
                newSvcType == string(corev1.ServiceTypeLoadBalancer) &&
                newETP == string(corev1.ServiceExternalTrafficPolicyTypeLocal) &&
                oldETP == string(corev1.ServiceExternalTrafficPolicyTypeLocal) {
                newHealthCheckPort, _ := nestedFloat64OrInt64(newObj.Object, "spec", "healthCheckNodePort")
                if newHealthCheckPort == 0 {
                    oldHealthCheckPort, _ := nestedFloat64OrInt64(oldObj.Object, "spec", "healthCheckNodePort")
                    _ = unstructured.SetNestedField(newObj.Object, oldHealthCheckPort, "spec", "healthCheckNodePort")
                }
            }

        },
        corev1.SchemeGroupVersion.WithKind("ServiceAccount").GroupKind(): func(newObj, oldObj *unstructured.Unstructured) {

            newObj.Object["secrets"] = oldObj.Object["secrets"]
            newObj.Object["imagePullSecrets"] = oldObj.Object["imagePullSecrets"]
        },
        {Group: "autoscaling.k8s.io", Kind: "VerticalPodAutoscaler"}: func(newObj, oldObj *unstructured.Unstructured) {

            newObj.Object["status"] = oldObj.Object["status"]
        },
    }

    DeploymentKeepReplicasMergeFunc = MergeFunc(func(newObj, oldObj *unstructured.Unstructured) {
        oldReplicas, ok := nestedFloat64OrInt64(oldObj.Object, "spec", "replicas")
        if !ok {
            return
        }
        _ = unstructured.SetNestedField(newObj.Object, oldReplicas, "spec", "replicas")
    })
)

DefaultMergeFuncs contains options for common k8s objects, e.g. Service, ServiceAccount.

var (
    // GardenScheme is the scheme used in the Garden cluster.
    GardenScheme = runtime.NewScheme()
    // SeedScheme is the scheme used in the Seed cluster.
    SeedScheme = runtime.NewScheme()
    // ShootScheme is the scheme used in the Shoot cluster.
    ShootScheme = runtime.NewScheme()
    // PlantScheme is the scheme used in the Plant cluster
    PlantScheme = runtime.NewScheme()

    // DefaultDeleteOptions use foreground propagation policy and grace period of 60 seconds.
    DefaultDeleteOptions = []client.DeleteOption{
        client.PropagationPolicy(metav1.DeletePropagationForeground),
        client.GracePeriodSeconds(60),
    }
    // ForceDeleteOptions use background propagation policy and grace period of 0 seconds.
    ForceDeleteOptions = []client.DeleteOption{
        client.PropagationPolicy(metav1.DeletePropagationBackground),
        client.GracePeriodSeconds(0),
    }
)
var ForceNamespace = forceNamespace{}

ForceNamespace can be used for native chart objects do not come with a Release.Namespace option and leave the namespace field empty.

var (
    // UseCachedRuntimeClients is a flag for enabling cached controller-runtime clients (defaults to false).
    // If enabled, the client returned by Interface.Client() will be backed by a cache, otherwise it will be the same
    // client that will be returned by Interface.DirectClient().
    UseCachedRuntimeClients = false
)
var Values = func(values interface{}) ValueOption { return &withValue{values} }

Values applies values to ApplyOptions or DeleteOptions.

func GetAdmissionPluginsForVersion Uses

func GetAdmissionPluginsForVersion(v string) []gardencorev1beta1.AdmissionPlugin

GetAdmissionPluginsForVersion returns the set of default admission plugins for the given Kubernetes version. If the given Kubernetes version does not explicitly define admission plugins the set of names for the next available version will be returned (e.g., for version X not defined the set of version X-1 will be returned).

func GetPodLogs Uses

func GetPodLogs(podInterface corev1client.PodInterface, name string, options *corev1.PodLogOptions) ([]byte, error)

GetPodLogs retrieves the pod logs of the pod of the given name with the given options.

func NewDirectClient Uses

func NewDirectClient(config *rest.Config, options client.Options) (client.Client, error)

NewDirectClient creates a new client.Client which can be used to talk to the API directly (without a cache).

func NewDirectClientFromBytes Uses

func NewDirectClientFromBytes(kubeconfig []byte, fns ...ConfigFunc) (client.Client, error)

NewDirectClientFromBytes creates a new controller runtime Client struct for a given kubeconfig byte slice.

func NewDirectClientFromSecret Uses

func NewDirectClientFromSecret(secret *corev1.Secret, fns ...ConfigFunc) (client.Client, error)

NewDirectClientFromSecret creates a new controller runtime Client struct for a given secret.

func NewDirectClientWithConfig Uses

func NewDirectClientWithConfig(fns ...ConfigFunc) (client.Client, error)

NewDirectClientWithConfig returns a new controller runtime client from a config.

func NewRuntimeCache Uses

func NewRuntimeCache(config *rest.Config, options cache.Options) (cache.Cache, error)

NewRuntimeCache creates a new cache.Cache with the given config and options. It can be used for creating new controller-runtime clients with caches.

func NewRuntimeClientWithCache Uses

func NewRuntimeClientWithCache(config *rest.Config, options client.Options, stopCh <-chan struct{}) (client.Client, error)

NewRuntimeClientWithCache creates a new client.client with the given config and options. The client uses a new cache, which will be started immediately using the given stop channel.

func RESTConfigFromClientConnectionConfiguration Uses

func RESTConfigFromClientConnectionConfiguration(cfg *componentbaseconfig.ClientConnectionConfiguration, kubeconfig []byte) (*rest.Config, error)

RESTConfigFromClientConnectionConfiguration creates a *rest.Config from a componentbaseconfig.ClientConnectionConfiguration & the configured kubeconfig

func ScaleDeployment Uses

func ScaleDeployment(ctx context.Context, c client.Client, key client.ObjectKey, replicas int32) error

ScaleDeployment scales a Deployment.

func ScaleEtcd Uses

func ScaleEtcd(ctx context.Context, c client.Client, key client.ObjectKey, replicas int) error

ScaleEtcd scales a Etcd resource.

func ScaleStatefulSet Uses

func ScaleStatefulSet(ctx context.Context, c client.Client, key client.ObjectKey, replicas int32) error

ScaleStatefulSet scales a StatefulSet.

func ValidateConfig Uses

func ValidateConfig(config clientcmdapi.Config) error

ValidateConfig validates that the auth info of a given kubeconfig doesn't have unsupported fields.

type Applier Uses

type Applier interface {
    ApplyManifest(ctx context.Context, unstructured UnstructuredReader, options MergeFuncs) error
    DeleteManifest(ctx context.Context, unstructured UnstructuredReader, opts ...DeleteManifestOption) error
}

Applier is an interface which describes declarative operations to apply multiple Kubernetes objects.

func NewApplier Uses

func NewApplier(c client.Client, restMapper meta.RESTMapper) Applier

NewApplier constructs a new Applier from the given client.

func NewApplierForConfig Uses

func NewApplierForConfig(config *rest.Config) (Applier, error)

NewApplierForConfig creates a new Applier for the given rest.Config. Use NewApplier if you already have a client and RESTMapper at hand, as this will create a new direct client.

type ApplyOption Uses

type ApplyOption interface {
    // MutateApplyOptions applies this configuration to the given apply options.
    MutateApplyOptions(opts *ApplyOptions)
}

ApplyOption is some configuration that modifies options for a apply request.

type ApplyOptions Uses

type ApplyOptions struct {
    // Values to pass to chart.
    Values interface{}

    // Additional MergeFunctions.
    MergeFuncs MergeFuncs

    // Forces the namespace for chart objects when applying the chart, this is because sometimes native chart
    // objects do not come with a Release.Namespace option and leave the namespace field empty
    ForceNamespace bool
}

ApplyOptions contains options for apply requests

type ChartApplier Uses

type ChartApplier interface {
    chartrenderer.Interface
    Apply(ctx context.Context, chartPath, namespace, name string, opts ...ApplyOption) error
    Delete(ctx context.Context, chartPath, namespace, name string, opts ...DeleteOption) error
}

ChartApplier is an interface that describes needed methods that render and apply Helm charts in Kubernetes clusters.

func NewChartApplier Uses

func NewChartApplier(renderer chartrenderer.Interface, applier Applier) ChartApplier

NewChartApplier returns a new chart applier.

func NewChartApplierForConfig Uses

func NewChartApplierForConfig(config *rest.Config) (ChartApplier, error)

NewChartApplierForConfig returns a new chart applier based on the given REST config.

type ConfigFunc Uses

type ConfigFunc func(config *config) error

ConfigFunc is a function that mutates a Config struct. It implements the functional options pattern. See https://github.com/tmrts/go-patterns/blob/master/idiom/functional-options.md.

func WithCacheResyncPeriod Uses

func WithCacheResyncPeriod(resync time.Duration) ConfigFunc

WithCacheResyncPeriod returns a ConfigFunc that set the client's cache's resync period to the given duration.

func WithClientConnectionOptions Uses

func WithClientConnectionOptions(cfg baseconfig.ClientConnectionConfiguration) ConfigFunc

WithClientConnectionOptions returns a ConfigFunc that transfers settings from the passed ClientConnectionConfiguration. The kubeconfig location in ClientConnectionConfiguration is disregarded, though!

func WithClientOptions Uses

func WithClientOptions(opt client.Options) ConfigFunc

WithClientOptions returns a ConfigFunc that sets the passed Options on the config object.

func WithRESTConfig Uses

func WithRESTConfig(restConfig *rest.Config) ConfigFunc

WithRESTConfig returns a ConfigFunc that sets the passed rest.Config on the config object.

type DeleteManifestOption Uses

type DeleteManifestOption interface {
    // MutateDeleteOptions applies this configuration to the given delete options.
    MutateDeleteManifestOptions(opts *DeleteManifestOptions)
}

DeleteManifestOption is some configuration that modifies options for a delete request.

type DeleteManifestOptions Uses

type DeleteManifestOptions struct {
    // TolerateErrorFuncs are functions for which errors are tolerated.
    TolerateErrorFuncs []TolerateErrorFunc
}

DeleteOptions contains options for delete requests

type DeleteOption Uses

type DeleteOption interface {
    // MutateDeleteOptions applies this configuration to the given delete options.
    MutateDeleteOptions(opts *DeleteOptions)
}

DeleteOption is some configuration that modifies options for a delete request.

type DeleteOptions Uses

type DeleteOptions struct {
    // Values to pass to chart.
    Values interface{}

    // Forces the namespace for chart objects when applying the chart, this is because sometimes native chart
    // objects do not come with a Release.Namespace option and leave the namespace field empty
    ForceNamespace bool

    // TolerateErrorFuncs are functions for which errors are tolerated.
    TolerateErrorFuncs []TolerateErrorFunc
}

DeleteOptions contains options for delete requests

type Interface Uses

type Interface interface {
    RESTConfig() *rest.Config
    RESTMapper() meta.RESTMapper
    RESTClient() rest.Interface

    // Client returns the ClientSet's controller-runtime client. This client should be used by default, as it carries
    // a cache, which uses SharedIndexInformers to keep up-to-date.
    Client() client.Client
    // DirectClient returns a controller-runtime client, which can be used to talk to the API server directly
    // (without using a cache).
    DirectClient() client.Client
    // Cache returns the ClientSet's controller-runtime cache. It can be used to get Informers for arbitrary objects.
    Cache() cache.Cache

    // Applier returns an Applier which uses the ClientSet's client.
    Applier() Applier
    // ChartRenderer returns a ChartRenderer populated with the cluster's Capabilities.
    ChartRenderer() chartrenderer.Interface
    // ChartApplier returns a ChartApplier using the ClientSet's ChartRenderer and Applier.
    ChartApplier() ChartApplier

    Kubernetes() kubernetesclientset.Interface
    GardenCore() gardencoreclientset.Interface
    APIExtension() apiextensionsclientset.Interface
    APIRegistration() apiregistrationclientset.Interface

    // Deprecated: Use `Client()` and utils instead.
    ForwardPodPort(string, string, int, int) (chan struct{}, error)
    CheckForwardPodPort(string, string, int, int) error

    // Version returns the server version of the targeted Kubernetes cluster.
    Version() string

    // Start starts the cache of the ClientSet's controller-runtime client and returns immediately.
    // It must be called first before using the client to retrieve objects from the API server.
    Start(stopCh <-chan struct{})
    // WaitForCacheSync waits for the cache of the ClientSet's controller-runtime client to be synced.
    WaitForCacheSync(stopCh <-chan struct{}) bool
}

Interface is used to wrap the interactions with a Kubernetes cluster (which are performed with the help of kubernetes/client-go) in order to allow the implementation of several Kubernetes versions.

func NewClientFromBytes Uses

func NewClientFromBytes(kubeconfig []byte, fns ...ConfigFunc) (Interface, error)

NewClientFromBytes creates a new Client struct for a given kubeconfig byte slice.

func NewClientFromFile Uses

func NewClientFromFile(masterURL, kubeconfigPath string, fns ...ConfigFunc) (Interface, error)

NewClientFromFile creates a new Client struct for a given kubeconfig. The kubeconfig will be read from the filesystem at location <kubeconfigPath>. If given, <masterURL> overrides the master URL in the kubeconfig. If no filepath is given, the in-cluster configuration will be taken into account.

func NewClientFromSecret Uses

func NewClientFromSecret(ctx context.Context, c client.Client, namespace, secretName string, fns ...ConfigFunc) (Interface, error)

NewClientFromSecret creates a new Client struct for a given kubeconfig stored as a Secret in an existing Kubernetes cluster. This cluster will be accessed by the <k8sClient>. It will read the Secret <secretName> in <namespace>. The Secret must contain a field "kubeconfig" which will be used.

func NewClientFromSecretObject Uses

func NewClientFromSecretObject(secret *corev1.Secret, fns ...ConfigFunc) (Interface, error)

NewClientFromSecretObject creates a new Client struct for a given Kubernetes Secret object. The Secret must contain a field "kubeconfig" which will be used.

func NewWithConfig Uses

func NewWithConfig(fns ...ConfigFunc) (Interface, error)

NewWithConfig returns a new Kubernetes base client.

type MergeFunc Uses

type MergeFunc func(newObj, oldObj *unstructured.Unstructured)

MergeFunc determines how oldOj is merged into new oldObj.

type MergeFuncs Uses

type MergeFuncs map[schema.GroupKind]MergeFunc

MergeFuncs can be used modify the default merge functions for ApplyOptions:

Apply(ctx, "chart", "my-ns", "my-release", MergeFuncs{

corev1.SchemeGroupVersion.WithKind("Service").GroupKind(): func(newObj, oldObj *unstructured.Unstructured) {
	newObj.SetAnnotations(map[string]string{"foo":"bar"})
}

})

func CopyApplierOptions Uses

func CopyApplierOptions(in MergeFuncs) MergeFuncs

CopyApplierOptions returns a copies of the provided applier options.

func (MergeFuncs) MutateApplyOptions Uses

func (m MergeFuncs) MutateApplyOptions(opts *ApplyOptions)

MutateApplyOptions applies this configuration to the given apply options.

type PodExecutor Uses

type PodExecutor interface {
    Execute(ctx context.Context, namespace, name, containerName, command, commandArg string) (io.Reader, error)
}

PodExecutor is the pod executor interface

func NewPodExecutor Uses

func NewPodExecutor(config *rest.Config) PodExecutor

NewPodExecutor returns a podExecutor

type TolerateErrorFunc Uses

type TolerateErrorFunc func(err error) bool

TolerateErrorFunc is a function for which err is tolerated.

func (TolerateErrorFunc) MutateDeleteManifestOptions Uses

func (t TolerateErrorFunc) MutateDeleteManifestOptions(opts *DeleteManifestOptions)

func (TolerateErrorFunc) MutateDeleteOptions Uses

func (t TolerateErrorFunc) MutateDeleteOptions(opts *DeleteOptions)

type UnstructuredReader Uses

type UnstructuredReader interface {
    Read() (*unstructured.Unstructured, error)
}

UnstructuredReader an interface that all manifest readers should implement

func NewManifestReader Uses

func NewManifestReader(manifest []byte) UnstructuredReader

NewManifestReader initializes a reader for yaml manifests

func NewNamespaceSettingReader Uses

func NewNamespaceSettingReader(mReader UnstructuredReader, namespace string) UnstructuredReader

NewNamespaceSettingReader initializes a reader for yaml manifests with support for setting the namespace

func NewObjectReferenceReader Uses

func NewObjectReferenceReader(objectReference *corev1.ObjectReference) UnstructuredReader

NewObjectReferenceReader initializes a reader from ObjectReference

type ValueOption Uses

type ValueOption interface {
    ApplyOption
    DeleteOption
}

ValueOption contains value options for Apply and Delete.

Directories

PathSynopsis
test

Package kubernetes imports 55 packages (graph) and is imported by 56 packages. Updated 2020-07-03. Refresh now. Tools for package owners.