mirror of
https://github.com/kubernetes/client-go.git
synced 2025-06-27 07:28:14 +00:00
Merge pull request #124012 from Jefftree/le-controller
Coordinated Leader Election Kubernetes-commit: 5f5c02da51cd3146f30c6ee56013c983f4999d9c
This commit is contained in:
commit
4536e5a391
@ -19,17 +19,20 @@ limitations under the License.
|
|||||||
package v1
|
package v1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
coordinationv1 "k8s.io/api/coordination/v1"
|
||||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// LeaseSpecApplyConfiguration represents a declarative configuration of the LeaseSpec type for use
|
// LeaseSpecApplyConfiguration represents a declarative configuration of the LeaseSpec type for use
|
||||||
// with apply.
|
// with apply.
|
||||||
type LeaseSpecApplyConfiguration struct {
|
type LeaseSpecApplyConfiguration struct {
|
||||||
HolderIdentity *string `json:"holderIdentity,omitempty"`
|
HolderIdentity *string `json:"holderIdentity,omitempty"`
|
||||||
LeaseDurationSeconds *int32 `json:"leaseDurationSeconds,omitempty"`
|
LeaseDurationSeconds *int32 `json:"leaseDurationSeconds,omitempty"`
|
||||||
AcquireTime *v1.MicroTime `json:"acquireTime,omitempty"`
|
AcquireTime *v1.MicroTime `json:"acquireTime,omitempty"`
|
||||||
RenewTime *v1.MicroTime `json:"renewTime,omitempty"`
|
RenewTime *v1.MicroTime `json:"renewTime,omitempty"`
|
||||||
LeaseTransitions *int32 `json:"leaseTransitions,omitempty"`
|
LeaseTransitions *int32 `json:"leaseTransitions,omitempty"`
|
||||||
|
Strategy *coordinationv1.CoordinatedLeaseStrategy `json:"strategy,omitempty"`
|
||||||
|
PreferredHolder *string `json:"preferredHolder,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// LeaseSpecApplyConfiguration constructs a declarative configuration of the LeaseSpec type for use with
|
// LeaseSpecApplyConfiguration constructs a declarative configuration of the LeaseSpec type for use with
|
||||||
@ -77,3 +80,19 @@ func (b *LeaseSpecApplyConfiguration) WithLeaseTransitions(value int32) *LeaseSp
|
|||||||
b.LeaseTransitions = &value
|
b.LeaseTransitions = &value
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithStrategy sets the Strategy field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the Strategy field is set to the value of the last call.
|
||||||
|
func (b *LeaseSpecApplyConfiguration) WithStrategy(value coordinationv1.CoordinatedLeaseStrategy) *LeaseSpecApplyConfiguration {
|
||||||
|
b.Strategy = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithPreferredHolder sets the PreferredHolder field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the PreferredHolder field is set to the value of the last call.
|
||||||
|
func (b *LeaseSpecApplyConfiguration) WithPreferredHolder(value string) *LeaseSpecApplyConfiguration {
|
||||||
|
b.PreferredHolder = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
255
applyconfigurations/coordination/v1alpha1/leasecandidate.go
Normal file
255
applyconfigurations/coordination/v1alpha1/leasecandidate.go
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
/*
|
||||||
|
Copyright 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Code generated by applyconfiguration-gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
coordinationv1alpha1 "k8s.io/api/coordination/v1alpha1"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
types "k8s.io/apimachinery/pkg/types"
|
||||||
|
managedfields "k8s.io/apimachinery/pkg/util/managedfields"
|
||||||
|
internal "k8s.io/client-go/applyconfigurations/internal"
|
||||||
|
v1 "k8s.io/client-go/applyconfigurations/meta/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// LeaseCandidateApplyConfiguration represents a declarative configuration of the LeaseCandidate type for use
|
||||||
|
// with apply.
|
||||||
|
type LeaseCandidateApplyConfiguration struct {
|
||||||
|
v1.TypeMetaApplyConfiguration `json:",inline"`
|
||||||
|
*v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"`
|
||||||
|
Spec *LeaseCandidateSpecApplyConfiguration `json:"spec,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// LeaseCandidate constructs a declarative configuration of the LeaseCandidate type for use with
|
||||||
|
// apply.
|
||||||
|
func LeaseCandidate(name, namespace string) *LeaseCandidateApplyConfiguration {
|
||||||
|
b := &LeaseCandidateApplyConfiguration{}
|
||||||
|
b.WithName(name)
|
||||||
|
b.WithNamespace(namespace)
|
||||||
|
b.WithKind("LeaseCandidate")
|
||||||
|
b.WithAPIVersion("coordination.k8s.io/v1alpha1")
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExtractLeaseCandidate extracts the applied configuration owned by fieldManager from
|
||||||
|
// leaseCandidate. If no managedFields are found in leaseCandidate for fieldManager, a
|
||||||
|
// LeaseCandidateApplyConfiguration is returned with only the Name, Namespace (if applicable),
|
||||||
|
// APIVersion and Kind populated. It is possible that no managed fields were found for because other
|
||||||
|
// field managers have taken ownership of all the fields previously owned by fieldManager, or because
|
||||||
|
// the fieldManager never owned fields any fields.
|
||||||
|
// leaseCandidate must be a unmodified LeaseCandidate API object that was retrieved from the Kubernetes API.
|
||||||
|
// ExtractLeaseCandidate provides a way to perform a extract/modify-in-place/apply workflow.
|
||||||
|
// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously
|
||||||
|
// applied if another fieldManager has updated or force applied any of the previously applied fields.
|
||||||
|
// Experimental!
|
||||||
|
func ExtractLeaseCandidate(leaseCandidate *coordinationv1alpha1.LeaseCandidate, fieldManager string) (*LeaseCandidateApplyConfiguration, error) {
|
||||||
|
return extractLeaseCandidate(leaseCandidate, fieldManager, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExtractLeaseCandidateStatus is the same as ExtractLeaseCandidate except
|
||||||
|
// that it extracts the status subresource applied configuration.
|
||||||
|
// Experimental!
|
||||||
|
func ExtractLeaseCandidateStatus(leaseCandidate *coordinationv1alpha1.LeaseCandidate, fieldManager string) (*LeaseCandidateApplyConfiguration, error) {
|
||||||
|
return extractLeaseCandidate(leaseCandidate, fieldManager, "status")
|
||||||
|
}
|
||||||
|
|
||||||
|
func extractLeaseCandidate(leaseCandidate *coordinationv1alpha1.LeaseCandidate, fieldManager string, subresource string) (*LeaseCandidateApplyConfiguration, error) {
|
||||||
|
b := &LeaseCandidateApplyConfiguration{}
|
||||||
|
err := managedfields.ExtractInto(leaseCandidate, internal.Parser().Type("io.k8s.api.coordination.v1alpha1.LeaseCandidate"), fieldManager, b, subresource)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
b.WithName(leaseCandidate.Name)
|
||||||
|
b.WithNamespace(leaseCandidate.Namespace)
|
||||||
|
|
||||||
|
b.WithKind("LeaseCandidate")
|
||||||
|
b.WithAPIVersion("coordination.k8s.io/v1alpha1")
|
||||||
|
return b, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithKind sets the Kind field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the Kind field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithKind(value string) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.Kind = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the APIVersion field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithAPIVersion(value string) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.APIVersion = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithName sets the Name field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the Name field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithName(value string) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.ensureObjectMetaApplyConfigurationExists()
|
||||||
|
b.Name = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithGenerateName sets the GenerateName field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the GenerateName field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithGenerateName(value string) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.ensureObjectMetaApplyConfigurationExists()
|
||||||
|
b.GenerateName = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithNamespace sets the Namespace field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the Namespace field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithNamespace(value string) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.ensureObjectMetaApplyConfigurationExists()
|
||||||
|
b.Namespace = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithUID sets the UID field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the UID field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithUID(value types.UID) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.ensureObjectMetaApplyConfigurationExists()
|
||||||
|
b.UID = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the ResourceVersion field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithResourceVersion(value string) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.ensureObjectMetaApplyConfigurationExists()
|
||||||
|
b.ResourceVersion = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithGeneration sets the Generation field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the Generation field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithGeneration(value int64) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.ensureObjectMetaApplyConfigurationExists()
|
||||||
|
b.Generation = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the CreationTimestamp field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithCreationTimestamp(value metav1.Time) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.ensureObjectMetaApplyConfigurationExists()
|
||||||
|
b.CreationTimestamp = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the DeletionTimestamp field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.ensureObjectMetaApplyConfigurationExists()
|
||||||
|
b.DeletionTimestamp = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.ensureObjectMetaApplyConfigurationExists()
|
||||||
|
b.DeletionGracePeriodSeconds = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithLabels puts the entries into the Labels field in the declarative configuration
|
||||||
|
// and returns the receiver, so that objects can be build by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the entries provided by each call will be put on the Labels field,
|
||||||
|
// overwriting an existing map entries in Labels field with the same key.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithLabels(entries map[string]string) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.ensureObjectMetaApplyConfigurationExists()
|
||||||
|
if b.Labels == nil && len(entries) > 0 {
|
||||||
|
b.Labels = make(map[string]string, len(entries))
|
||||||
|
}
|
||||||
|
for k, v := range entries {
|
||||||
|
b.Labels[k] = v
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAnnotations puts the entries into the Annotations field in the declarative configuration
|
||||||
|
// and returns the receiver, so that objects can be build by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the entries provided by each call will be put on the Annotations field,
|
||||||
|
// overwriting an existing map entries in Annotations field with the same key.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithAnnotations(entries map[string]string) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.ensureObjectMetaApplyConfigurationExists()
|
||||||
|
if b.Annotations == nil && len(entries) > 0 {
|
||||||
|
b.Annotations = make(map[string]string, len(entries))
|
||||||
|
}
|
||||||
|
for k, v := range entries {
|
||||||
|
b.Annotations[k] = v
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration
|
||||||
|
// and returns the receiver, so that objects can be build by chaining "With" function invocations.
|
||||||
|
// If called multiple times, values provided by each call will be appended to the OwnerReferences field.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.ensureObjectMetaApplyConfigurationExists()
|
||||||
|
for i := range values {
|
||||||
|
if values[i] == nil {
|
||||||
|
panic("nil value passed to WithOwnerReferences")
|
||||||
|
}
|
||||||
|
b.OwnerReferences = append(b.OwnerReferences, *values[i])
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithFinalizers adds the given value to the Finalizers field in the declarative configuration
|
||||||
|
// and returns the receiver, so that objects can be build by chaining "With" function invocations.
|
||||||
|
// If called multiple times, values provided by each call will be appended to the Finalizers field.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithFinalizers(values ...string) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.ensureObjectMetaApplyConfigurationExists()
|
||||||
|
for i := range values {
|
||||||
|
b.Finalizers = append(b.Finalizers, values[i])
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) ensureObjectMetaApplyConfigurationExists() {
|
||||||
|
if b.ObjectMetaApplyConfiguration == nil {
|
||||||
|
b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithSpec sets the Spec field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the Spec field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) WithSpec(value *LeaseCandidateSpecApplyConfiguration) *LeaseCandidateApplyConfiguration {
|
||||||
|
b.Spec = value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetName retrieves the value of the Name field in the declarative configuration.
|
||||||
|
func (b *LeaseCandidateApplyConfiguration) GetName() *string {
|
||||||
|
b.ensureObjectMetaApplyConfigurationExists()
|
||||||
|
return b.Name
|
||||||
|
}
|
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
Copyright 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Code generated by applyconfiguration-gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
coordinationv1 "k8s.io/api/coordination/v1"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// LeaseCandidateSpecApplyConfiguration represents a declarative configuration of the LeaseCandidateSpec type for use
|
||||||
|
// with apply.
|
||||||
|
type LeaseCandidateSpecApplyConfiguration struct {
|
||||||
|
LeaseName *string `json:"leaseName,omitempty"`
|
||||||
|
PingTime *v1.MicroTime `json:"pingTime,omitempty"`
|
||||||
|
RenewTime *v1.MicroTime `json:"renewTime,omitempty"`
|
||||||
|
BinaryVersion *string `json:"binaryVersion,omitempty"`
|
||||||
|
EmulationVersion *string `json:"emulationVersion,omitempty"`
|
||||||
|
PreferredStrategies []coordinationv1.CoordinatedLeaseStrategy `json:"preferredStrategies,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// LeaseCandidateSpecApplyConfiguration constructs a declarative configuration of the LeaseCandidateSpec type for use with
|
||||||
|
// apply.
|
||||||
|
func LeaseCandidateSpec() *LeaseCandidateSpecApplyConfiguration {
|
||||||
|
return &LeaseCandidateSpecApplyConfiguration{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithLeaseName sets the LeaseName field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the LeaseName field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateSpecApplyConfiguration) WithLeaseName(value string) *LeaseCandidateSpecApplyConfiguration {
|
||||||
|
b.LeaseName = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithPingTime sets the PingTime field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the PingTime field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateSpecApplyConfiguration) WithPingTime(value v1.MicroTime) *LeaseCandidateSpecApplyConfiguration {
|
||||||
|
b.PingTime = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithRenewTime sets the RenewTime field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the RenewTime field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateSpecApplyConfiguration) WithRenewTime(value v1.MicroTime) *LeaseCandidateSpecApplyConfiguration {
|
||||||
|
b.RenewTime = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithBinaryVersion sets the BinaryVersion field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the BinaryVersion field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateSpecApplyConfiguration) WithBinaryVersion(value string) *LeaseCandidateSpecApplyConfiguration {
|
||||||
|
b.BinaryVersion = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithEmulationVersion sets the EmulationVersion field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the EmulationVersion field is set to the value of the last call.
|
||||||
|
func (b *LeaseCandidateSpecApplyConfiguration) WithEmulationVersion(value string) *LeaseCandidateSpecApplyConfiguration {
|
||||||
|
b.EmulationVersion = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithPreferredStrategies adds the given value to the PreferredStrategies field in the declarative configuration
|
||||||
|
// and returns the receiver, so that objects can be build by chaining "With" function invocations.
|
||||||
|
// If called multiple times, values provided by each call will be appended to the PreferredStrategies field.
|
||||||
|
func (b *LeaseCandidateSpecApplyConfiguration) WithPreferredStrategies(values ...coordinationv1.CoordinatedLeaseStrategy) *LeaseCandidateSpecApplyConfiguration {
|
||||||
|
for i := range values {
|
||||||
|
b.PreferredStrategies = append(b.PreferredStrategies, values[i])
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
@ -19,17 +19,20 @@ limitations under the License.
|
|||||||
package v1beta1
|
package v1beta1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
coordinationv1 "k8s.io/api/coordination/v1"
|
||||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// LeaseSpecApplyConfiguration represents a declarative configuration of the LeaseSpec type for use
|
// LeaseSpecApplyConfiguration represents a declarative configuration of the LeaseSpec type for use
|
||||||
// with apply.
|
// with apply.
|
||||||
type LeaseSpecApplyConfiguration struct {
|
type LeaseSpecApplyConfiguration struct {
|
||||||
HolderIdentity *string `json:"holderIdentity,omitempty"`
|
HolderIdentity *string `json:"holderIdentity,omitempty"`
|
||||||
LeaseDurationSeconds *int32 `json:"leaseDurationSeconds,omitempty"`
|
LeaseDurationSeconds *int32 `json:"leaseDurationSeconds,omitempty"`
|
||||||
AcquireTime *v1.MicroTime `json:"acquireTime,omitempty"`
|
AcquireTime *v1.MicroTime `json:"acquireTime,omitempty"`
|
||||||
RenewTime *v1.MicroTime `json:"renewTime,omitempty"`
|
RenewTime *v1.MicroTime `json:"renewTime,omitempty"`
|
||||||
LeaseTransitions *int32 `json:"leaseTransitions,omitempty"`
|
LeaseTransitions *int32 `json:"leaseTransitions,omitempty"`
|
||||||
|
Strategy *coordinationv1.CoordinatedLeaseStrategy `json:"strategy,omitempty"`
|
||||||
|
PreferredHolder *string `json:"preferredHolder,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// LeaseSpecApplyConfiguration constructs a declarative configuration of the LeaseSpec type for use with
|
// LeaseSpecApplyConfiguration constructs a declarative configuration of the LeaseSpec type for use with
|
||||||
@ -77,3 +80,19 @@ func (b *LeaseSpecApplyConfiguration) WithLeaseTransitions(value int32) *LeaseSp
|
|||||||
b.LeaseTransitions = &value
|
b.LeaseTransitions = &value
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithStrategy sets the Strategy field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the Strategy field is set to the value of the last call.
|
||||||
|
func (b *LeaseSpecApplyConfiguration) WithStrategy(value coordinationv1.CoordinatedLeaseStrategy) *LeaseSpecApplyConfiguration {
|
||||||
|
b.Strategy = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithPreferredHolder sets the PreferredHolder field in the declarative configuration to the given value
|
||||||
|
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
|
||||||
|
// If called multiple times, the PreferredHolder field is set to the value of the last call.
|
||||||
|
func (b *LeaseSpecApplyConfiguration) WithPreferredHolder(value string) *LeaseSpecApplyConfiguration {
|
||||||
|
b.PreferredHolder = &value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
@ -4356,6 +4356,54 @@ var schemaYAML = typed.YAMLObject(`types:
|
|||||||
- name: leaseTransitions
|
- name: leaseTransitions
|
||||||
type:
|
type:
|
||||||
scalar: numeric
|
scalar: numeric
|
||||||
|
- name: preferredHolder
|
||||||
|
type:
|
||||||
|
scalar: string
|
||||||
|
- name: renewTime
|
||||||
|
type:
|
||||||
|
namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime
|
||||||
|
- name: strategy
|
||||||
|
type:
|
||||||
|
scalar: string
|
||||||
|
- name: io.k8s.api.coordination.v1alpha1.LeaseCandidate
|
||||||
|
map:
|
||||||
|
fields:
|
||||||
|
- name: apiVersion
|
||||||
|
type:
|
||||||
|
scalar: string
|
||||||
|
- name: kind
|
||||||
|
type:
|
||||||
|
scalar: string
|
||||||
|
- name: metadata
|
||||||
|
type:
|
||||||
|
namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta
|
||||||
|
default: {}
|
||||||
|
- name: spec
|
||||||
|
type:
|
||||||
|
namedType: io.k8s.api.coordination.v1alpha1.LeaseCandidateSpec
|
||||||
|
default: {}
|
||||||
|
- name: io.k8s.api.coordination.v1alpha1.LeaseCandidateSpec
|
||||||
|
map:
|
||||||
|
fields:
|
||||||
|
- name: binaryVersion
|
||||||
|
type:
|
||||||
|
scalar: string
|
||||||
|
- name: emulationVersion
|
||||||
|
type:
|
||||||
|
scalar: string
|
||||||
|
- name: leaseName
|
||||||
|
type:
|
||||||
|
scalar: string
|
||||||
|
default: ""
|
||||||
|
- name: pingTime
|
||||||
|
type:
|
||||||
|
namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime
|
||||||
|
- name: preferredStrategies
|
||||||
|
type:
|
||||||
|
list:
|
||||||
|
elementType:
|
||||||
|
scalar: string
|
||||||
|
elementRelationship: atomic
|
||||||
- name: renewTime
|
- name: renewTime
|
||||||
type:
|
type:
|
||||||
namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime
|
namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime
|
||||||
@ -4391,9 +4439,15 @@ var schemaYAML = typed.YAMLObject(`types:
|
|||||||
- name: leaseTransitions
|
- name: leaseTransitions
|
||||||
type:
|
type:
|
||||||
scalar: numeric
|
scalar: numeric
|
||||||
|
- name: preferredHolder
|
||||||
|
type:
|
||||||
|
scalar: string
|
||||||
- name: renewTime
|
- name: renewTime
|
||||||
type:
|
type:
|
||||||
namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime
|
namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime
|
||||||
|
- name: strategy
|
||||||
|
type:
|
||||||
|
scalar: string
|
||||||
- name: io.k8s.api.core.v1.AWSElasticBlockStoreVolumeSource
|
- name: io.k8s.api.core.v1.AWSElasticBlockStoreVolumeSource
|
||||||
map:
|
map:
|
||||||
fields:
|
fields:
|
||||||
|
@ -36,6 +36,7 @@ import (
|
|||||||
certificatesv1alpha1 "k8s.io/api/certificates/v1alpha1"
|
certificatesv1alpha1 "k8s.io/api/certificates/v1alpha1"
|
||||||
certificatesv1beta1 "k8s.io/api/certificates/v1beta1"
|
certificatesv1beta1 "k8s.io/api/certificates/v1beta1"
|
||||||
coordinationv1 "k8s.io/api/coordination/v1"
|
coordinationv1 "k8s.io/api/coordination/v1"
|
||||||
|
coordinationv1alpha1 "k8s.io/api/coordination/v1alpha1"
|
||||||
coordinationv1beta1 "k8s.io/api/coordination/v1beta1"
|
coordinationv1beta1 "k8s.io/api/coordination/v1beta1"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
discoveryv1 "k8s.io/api/discovery/v1"
|
discoveryv1 "k8s.io/api/discovery/v1"
|
||||||
@ -87,6 +88,7 @@ import (
|
|||||||
applyconfigurationscertificatesv1alpha1 "k8s.io/client-go/applyconfigurations/certificates/v1alpha1"
|
applyconfigurationscertificatesv1alpha1 "k8s.io/client-go/applyconfigurations/certificates/v1alpha1"
|
||||||
applyconfigurationscertificatesv1beta1 "k8s.io/client-go/applyconfigurations/certificates/v1beta1"
|
applyconfigurationscertificatesv1beta1 "k8s.io/client-go/applyconfigurations/certificates/v1beta1"
|
||||||
applyconfigurationscoordinationv1 "k8s.io/client-go/applyconfigurations/coordination/v1"
|
applyconfigurationscoordinationv1 "k8s.io/client-go/applyconfigurations/coordination/v1"
|
||||||
|
applyconfigurationscoordinationv1alpha1 "k8s.io/client-go/applyconfigurations/coordination/v1alpha1"
|
||||||
applyconfigurationscoordinationv1beta1 "k8s.io/client-go/applyconfigurations/coordination/v1beta1"
|
applyconfigurationscoordinationv1beta1 "k8s.io/client-go/applyconfigurations/coordination/v1beta1"
|
||||||
applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1"
|
applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1"
|
||||||
applyconfigurationsdiscoveryv1 "k8s.io/client-go/applyconfigurations/discovery/v1"
|
applyconfigurationsdiscoveryv1 "k8s.io/client-go/applyconfigurations/discovery/v1"
|
||||||
@ -613,6 +615,12 @@ func ForKind(kind schema.GroupVersionKind) interface{} {
|
|||||||
case coordinationv1.SchemeGroupVersion.WithKind("LeaseSpec"):
|
case coordinationv1.SchemeGroupVersion.WithKind("LeaseSpec"):
|
||||||
return &applyconfigurationscoordinationv1.LeaseSpecApplyConfiguration{}
|
return &applyconfigurationscoordinationv1.LeaseSpecApplyConfiguration{}
|
||||||
|
|
||||||
|
// Group=coordination.k8s.io, Version=v1alpha1
|
||||||
|
case coordinationv1alpha1.SchemeGroupVersion.WithKind("LeaseCandidate"):
|
||||||
|
return &applyconfigurationscoordinationv1alpha1.LeaseCandidateApplyConfiguration{}
|
||||||
|
case coordinationv1alpha1.SchemeGroupVersion.WithKind("LeaseCandidateSpec"):
|
||||||
|
return &applyconfigurationscoordinationv1alpha1.LeaseCandidateSpecApplyConfiguration{}
|
||||||
|
|
||||||
// Group=coordination.k8s.io, Version=v1beta1
|
// Group=coordination.k8s.io, Version=v1beta1
|
||||||
case coordinationv1beta1.SchemeGroupVersion.WithKind("Lease"):
|
case coordinationv1beta1.SchemeGroupVersion.WithKind("Lease"):
|
||||||
return &applyconfigurationscoordinationv1beta1.LeaseApplyConfiguration{}
|
return &applyconfigurationscoordinationv1beta1.LeaseApplyConfiguration{}
|
||||||
|
2
go.mod
2
go.mod
@ -25,7 +25,7 @@ require (
|
|||||||
golang.org/x/time v0.3.0
|
golang.org/x/time v0.3.0
|
||||||
google.golang.org/protobuf v1.34.2
|
google.golang.org/protobuf v1.34.2
|
||||||
gopkg.in/evanphx/json-patch.v4 v4.12.0
|
gopkg.in/evanphx/json-patch.v4 v4.12.0
|
||||||
k8s.io/api v0.0.0-20240724031224-63e21d3bdab9
|
k8s.io/api v0.0.0-20240725200553-fb1fc3084c0e
|
||||||
k8s.io/apimachinery v0.0.0-20240720202316-95b78024e3fe
|
k8s.io/apimachinery v0.0.0-20240720202316-95b78024e3fe
|
||||||
k8s.io/klog/v2 v2.130.1
|
k8s.io/klog/v2 v2.130.1
|
||||||
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340
|
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340
|
||||||
|
4
go.sum
4
go.sum
@ -156,8 +156,8 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
|||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
k8s.io/api v0.0.0-20240724031224-63e21d3bdab9 h1:DsdxdppkdprdzZ/IwMZY+uNpvEcKtpJpKQRgll5PXto=
|
k8s.io/api v0.0.0-20240725200553-fb1fc3084c0e h1:zSGnlOF57ubuWLnmPjHd1c9XRaXJeXdcVsszq+wm17o=
|
||||||
k8s.io/api v0.0.0-20240724031224-63e21d3bdab9/go.mod h1:ytlEzqC2wOTwYET71W7+J+k7O2V7vrDuzmNLBSpgT+k=
|
k8s.io/api v0.0.0-20240725200553-fb1fc3084c0e/go.mod h1:ytlEzqC2wOTwYET71W7+J+k7O2V7vrDuzmNLBSpgT+k=
|
||||||
k8s.io/apimachinery v0.0.0-20240720202316-95b78024e3fe h1:V9MwpYUwbKlfLKVrhpVuKWiat/LBIhm1pGB9/xdHm5Q=
|
k8s.io/apimachinery v0.0.0-20240720202316-95b78024e3fe h1:V9MwpYUwbKlfLKVrhpVuKWiat/LBIhm1pGB9/xdHm5Q=
|
||||||
k8s.io/apimachinery v0.0.0-20240720202316-95b78024e3fe/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
|
k8s.io/apimachinery v0.0.0-20240720202316-95b78024e3fe/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
|
||||||
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
|
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
|
||||||
|
@ -20,6 +20,7 @@ package coordination
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
v1 "k8s.io/client-go/informers/coordination/v1"
|
v1 "k8s.io/client-go/informers/coordination/v1"
|
||||||
|
v1alpha1 "k8s.io/client-go/informers/coordination/v1alpha1"
|
||||||
v1beta1 "k8s.io/client-go/informers/coordination/v1beta1"
|
v1beta1 "k8s.io/client-go/informers/coordination/v1beta1"
|
||||||
internalinterfaces "k8s.io/client-go/informers/internalinterfaces"
|
internalinterfaces "k8s.io/client-go/informers/internalinterfaces"
|
||||||
)
|
)
|
||||||
@ -28,6 +29,8 @@ import (
|
|||||||
type Interface interface {
|
type Interface interface {
|
||||||
// V1 provides access to shared informers for resources in V1.
|
// V1 provides access to shared informers for resources in V1.
|
||||||
V1() v1.Interface
|
V1() v1.Interface
|
||||||
|
// V1alpha1 provides access to shared informers for resources in V1alpha1.
|
||||||
|
V1alpha1() v1alpha1.Interface
|
||||||
// V1beta1 provides access to shared informers for resources in V1beta1.
|
// V1beta1 provides access to shared informers for resources in V1beta1.
|
||||||
V1beta1() v1beta1.Interface
|
V1beta1() v1beta1.Interface
|
||||||
}
|
}
|
||||||
@ -48,6 +51,11 @@ func (g *group) V1() v1.Interface {
|
|||||||
return v1.New(g.factory, g.namespace, g.tweakListOptions)
|
return v1.New(g.factory, g.namespace, g.tweakListOptions)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// V1alpha1 returns a new v1alpha1.Interface.
|
||||||
|
func (g *group) V1alpha1() v1alpha1.Interface {
|
||||||
|
return v1alpha1.New(g.factory, g.namespace, g.tweakListOptions)
|
||||||
|
}
|
||||||
|
|
||||||
// V1beta1 returns a new v1beta1.Interface.
|
// V1beta1 returns a new v1beta1.Interface.
|
||||||
func (g *group) V1beta1() v1beta1.Interface {
|
func (g *group) V1beta1() v1beta1.Interface {
|
||||||
return v1beta1.New(g.factory, g.namespace, g.tweakListOptions)
|
return v1beta1.New(g.factory, g.namespace, g.tweakListOptions)
|
||||||
|
45
informers/coordination/v1alpha1/interface.go
Normal file
45
informers/coordination/v1alpha1/interface.go
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
Copyright 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Code generated by informer-gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
internalinterfaces "k8s.io/client-go/informers/internalinterfaces"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Interface provides access to all the informers in this group version.
|
||||||
|
type Interface interface {
|
||||||
|
// LeaseCandidates returns a LeaseCandidateInformer.
|
||||||
|
LeaseCandidates() LeaseCandidateInformer
|
||||||
|
}
|
||||||
|
|
||||||
|
type version struct {
|
||||||
|
factory internalinterfaces.SharedInformerFactory
|
||||||
|
namespace string
|
||||||
|
tweakListOptions internalinterfaces.TweakListOptionsFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
// New returns a new Interface.
|
||||||
|
func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface {
|
||||||
|
return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
|
||||||
|
}
|
||||||
|
|
||||||
|
// LeaseCandidates returns a LeaseCandidateInformer.
|
||||||
|
func (v *version) LeaseCandidates() LeaseCandidateInformer {
|
||||||
|
return &leaseCandidateInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
|
||||||
|
}
|
90
informers/coordination/v1alpha1/leasecandidate.go
Normal file
90
informers/coordination/v1alpha1/leasecandidate.go
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
Copyright 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Code generated by informer-gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
time "time"
|
||||||
|
|
||||||
|
coordinationv1alpha1 "k8s.io/api/coordination/v1alpha1"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
watch "k8s.io/apimachinery/pkg/watch"
|
||||||
|
internalinterfaces "k8s.io/client-go/informers/internalinterfaces"
|
||||||
|
kubernetes "k8s.io/client-go/kubernetes"
|
||||||
|
v1alpha1 "k8s.io/client-go/listers/coordination/v1alpha1"
|
||||||
|
cache "k8s.io/client-go/tools/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
// LeaseCandidateInformer provides access to a shared informer and lister for
|
||||||
|
// LeaseCandidates.
|
||||||
|
type LeaseCandidateInformer interface {
|
||||||
|
Informer() cache.SharedIndexInformer
|
||||||
|
Lister() v1alpha1.LeaseCandidateLister
|
||||||
|
}
|
||||||
|
|
||||||
|
type leaseCandidateInformer struct {
|
||||||
|
factory internalinterfaces.SharedInformerFactory
|
||||||
|
tweakListOptions internalinterfaces.TweakListOptionsFunc
|
||||||
|
namespace string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewLeaseCandidateInformer constructs a new informer for LeaseCandidate type.
|
||||||
|
// Always prefer using an informer factory to get a shared informer instead of getting an independent
|
||||||
|
// one. This reduces memory footprint and number of connections to the server.
|
||||||
|
func NewLeaseCandidateInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
|
||||||
|
return NewFilteredLeaseCandidateInformer(client, namespace, resyncPeriod, indexers, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFilteredLeaseCandidateInformer constructs a new informer for LeaseCandidate type.
|
||||||
|
// Always prefer using an informer factory to get a shared informer instead of getting an independent
|
||||||
|
// one. This reduces memory footprint and number of connections to the server.
|
||||||
|
func NewFilteredLeaseCandidateInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
|
||||||
|
return cache.NewSharedIndexInformer(
|
||||||
|
&cache.ListWatch{
|
||||||
|
ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
|
||||||
|
if tweakListOptions != nil {
|
||||||
|
tweakListOptions(&options)
|
||||||
|
}
|
||||||
|
return client.CoordinationV1alpha1().LeaseCandidates(namespace).List(context.TODO(), options)
|
||||||
|
},
|
||||||
|
WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
|
||||||
|
if tweakListOptions != nil {
|
||||||
|
tweakListOptions(&options)
|
||||||
|
}
|
||||||
|
return client.CoordinationV1alpha1().LeaseCandidates(namespace).Watch(context.TODO(), options)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&coordinationv1alpha1.LeaseCandidate{},
|
||||||
|
resyncPeriod,
|
||||||
|
indexers,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *leaseCandidateInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
|
||||||
|
return NewFilteredLeaseCandidateInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *leaseCandidateInformer) Informer() cache.SharedIndexInformer {
|
||||||
|
return f.factory.InformerFor(&coordinationv1alpha1.LeaseCandidate{}, f.defaultInformer)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *leaseCandidateInformer) Lister() v1alpha1.LeaseCandidateLister {
|
||||||
|
return v1alpha1.NewLeaseCandidateLister(f.Informer().GetIndexer())
|
||||||
|
}
|
@ -38,6 +38,7 @@ import (
|
|||||||
certificatesv1alpha1 "k8s.io/api/certificates/v1alpha1"
|
certificatesv1alpha1 "k8s.io/api/certificates/v1alpha1"
|
||||||
certificatesv1beta1 "k8s.io/api/certificates/v1beta1"
|
certificatesv1beta1 "k8s.io/api/certificates/v1beta1"
|
||||||
coordinationv1 "k8s.io/api/coordination/v1"
|
coordinationv1 "k8s.io/api/coordination/v1"
|
||||||
|
coordinationv1alpha1 "k8s.io/api/coordination/v1alpha1"
|
||||||
coordinationv1beta1 "k8s.io/api/coordination/v1beta1"
|
coordinationv1beta1 "k8s.io/api/coordination/v1beta1"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
discoveryv1 "k8s.io/api/discovery/v1"
|
discoveryv1 "k8s.io/api/discovery/v1"
|
||||||
@ -198,6 +199,10 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource
|
|||||||
case coordinationv1.SchemeGroupVersion.WithResource("leases"):
|
case coordinationv1.SchemeGroupVersion.WithResource("leases"):
|
||||||
return &genericInformer{resource: resource.GroupResource(), informer: f.Coordination().V1().Leases().Informer()}, nil
|
return &genericInformer{resource: resource.GroupResource(), informer: f.Coordination().V1().Leases().Informer()}, nil
|
||||||
|
|
||||||
|
// Group=coordination.k8s.io, Version=v1alpha1
|
||||||
|
case coordinationv1alpha1.SchemeGroupVersion.WithResource("leasecandidates"):
|
||||||
|
return &genericInformer{resource: resource.GroupResource(), informer: f.Coordination().V1alpha1().LeaseCandidates().Informer()}, nil
|
||||||
|
|
||||||
// Group=coordination.k8s.io, Version=v1beta1
|
// Group=coordination.k8s.io, Version=v1beta1
|
||||||
case coordinationv1beta1.SchemeGroupVersion.WithResource("leases"):
|
case coordinationv1beta1.SchemeGroupVersion.WithResource("leases"):
|
||||||
return &genericInformer{resource: resource.GroupResource(), informer: f.Coordination().V1beta1().Leases().Informer()}, nil
|
return &genericInformer{resource: resource.GroupResource(), informer: f.Coordination().V1beta1().Leases().Informer()}, nil
|
||||||
|
@ -45,6 +45,7 @@ import (
|
|||||||
certificatesv1alpha1 "k8s.io/client-go/kubernetes/typed/certificates/v1alpha1"
|
certificatesv1alpha1 "k8s.io/client-go/kubernetes/typed/certificates/v1alpha1"
|
||||||
certificatesv1beta1 "k8s.io/client-go/kubernetes/typed/certificates/v1beta1"
|
certificatesv1beta1 "k8s.io/client-go/kubernetes/typed/certificates/v1beta1"
|
||||||
coordinationv1 "k8s.io/client-go/kubernetes/typed/coordination/v1"
|
coordinationv1 "k8s.io/client-go/kubernetes/typed/coordination/v1"
|
||||||
|
coordinationv1alpha1 "k8s.io/client-go/kubernetes/typed/coordination/v1alpha1"
|
||||||
coordinationv1beta1 "k8s.io/client-go/kubernetes/typed/coordination/v1beta1"
|
coordinationv1beta1 "k8s.io/client-go/kubernetes/typed/coordination/v1beta1"
|
||||||
corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
|
corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||||
discoveryv1 "k8s.io/client-go/kubernetes/typed/discovery/v1"
|
discoveryv1 "k8s.io/client-go/kubernetes/typed/discovery/v1"
|
||||||
@ -102,6 +103,7 @@ type Interface interface {
|
|||||||
CertificatesV1() certificatesv1.CertificatesV1Interface
|
CertificatesV1() certificatesv1.CertificatesV1Interface
|
||||||
CertificatesV1beta1() certificatesv1beta1.CertificatesV1beta1Interface
|
CertificatesV1beta1() certificatesv1beta1.CertificatesV1beta1Interface
|
||||||
CertificatesV1alpha1() certificatesv1alpha1.CertificatesV1alpha1Interface
|
CertificatesV1alpha1() certificatesv1alpha1.CertificatesV1alpha1Interface
|
||||||
|
CoordinationV1alpha1() coordinationv1alpha1.CoordinationV1alpha1Interface
|
||||||
CoordinationV1beta1() coordinationv1beta1.CoordinationV1beta1Interface
|
CoordinationV1beta1() coordinationv1beta1.CoordinationV1beta1Interface
|
||||||
CoordinationV1() coordinationv1.CoordinationV1Interface
|
CoordinationV1() coordinationv1.CoordinationV1Interface
|
||||||
CoreV1() corev1.CoreV1Interface
|
CoreV1() corev1.CoreV1Interface
|
||||||
@ -159,6 +161,7 @@ type Clientset struct {
|
|||||||
certificatesV1 *certificatesv1.CertificatesV1Client
|
certificatesV1 *certificatesv1.CertificatesV1Client
|
||||||
certificatesV1beta1 *certificatesv1beta1.CertificatesV1beta1Client
|
certificatesV1beta1 *certificatesv1beta1.CertificatesV1beta1Client
|
||||||
certificatesV1alpha1 *certificatesv1alpha1.CertificatesV1alpha1Client
|
certificatesV1alpha1 *certificatesv1alpha1.CertificatesV1alpha1Client
|
||||||
|
coordinationV1alpha1 *coordinationv1alpha1.CoordinationV1alpha1Client
|
||||||
coordinationV1beta1 *coordinationv1beta1.CoordinationV1beta1Client
|
coordinationV1beta1 *coordinationv1beta1.CoordinationV1beta1Client
|
||||||
coordinationV1 *coordinationv1.CoordinationV1Client
|
coordinationV1 *coordinationv1.CoordinationV1Client
|
||||||
coreV1 *corev1.CoreV1Client
|
coreV1 *corev1.CoreV1Client
|
||||||
@ -297,6 +300,11 @@ func (c *Clientset) CertificatesV1alpha1() certificatesv1alpha1.CertificatesV1al
|
|||||||
return c.certificatesV1alpha1
|
return c.certificatesV1alpha1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CoordinationV1alpha1 retrieves the CoordinationV1alpha1Client
|
||||||
|
func (c *Clientset) CoordinationV1alpha1() coordinationv1alpha1.CoordinationV1alpha1Interface {
|
||||||
|
return c.coordinationV1alpha1
|
||||||
|
}
|
||||||
|
|
||||||
// CoordinationV1beta1 retrieves the CoordinationV1beta1Client
|
// CoordinationV1beta1 retrieves the CoordinationV1beta1Client
|
||||||
func (c *Clientset) CoordinationV1beta1() coordinationv1beta1.CoordinationV1beta1Interface {
|
func (c *Clientset) CoordinationV1beta1() coordinationv1beta1.CoordinationV1beta1Interface {
|
||||||
return c.coordinationV1beta1
|
return c.coordinationV1beta1
|
||||||
@ -580,6 +588,10 @@ func NewForConfigAndClient(c *rest.Config, httpClient *http.Client) (*Clientset,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
cs.coordinationV1alpha1, err = coordinationv1alpha1.NewForConfigAndClient(&configShallowCopy, httpClient)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
cs.coordinationV1beta1, err = coordinationv1beta1.NewForConfigAndClient(&configShallowCopy, httpClient)
|
cs.coordinationV1beta1, err = coordinationv1beta1.NewForConfigAndClient(&configShallowCopy, httpClient)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -746,6 +758,7 @@ func New(c rest.Interface) *Clientset {
|
|||||||
cs.certificatesV1 = certificatesv1.New(c)
|
cs.certificatesV1 = certificatesv1.New(c)
|
||||||
cs.certificatesV1beta1 = certificatesv1beta1.New(c)
|
cs.certificatesV1beta1 = certificatesv1beta1.New(c)
|
||||||
cs.certificatesV1alpha1 = certificatesv1alpha1.New(c)
|
cs.certificatesV1alpha1 = certificatesv1alpha1.New(c)
|
||||||
|
cs.coordinationV1alpha1 = coordinationv1alpha1.New(c)
|
||||||
cs.coordinationV1beta1 = coordinationv1beta1.New(c)
|
cs.coordinationV1beta1 = coordinationv1beta1.New(c)
|
||||||
cs.coordinationV1 = coordinationv1.New(c)
|
cs.coordinationV1 = coordinationv1.New(c)
|
||||||
cs.coreV1 = corev1.New(c)
|
cs.coreV1 = corev1.New(c)
|
||||||
|
@ -69,6 +69,8 @@ import (
|
|||||||
fakecertificatesv1beta1 "k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake"
|
fakecertificatesv1beta1 "k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake"
|
||||||
coordinationv1 "k8s.io/client-go/kubernetes/typed/coordination/v1"
|
coordinationv1 "k8s.io/client-go/kubernetes/typed/coordination/v1"
|
||||||
fakecoordinationv1 "k8s.io/client-go/kubernetes/typed/coordination/v1/fake"
|
fakecoordinationv1 "k8s.io/client-go/kubernetes/typed/coordination/v1/fake"
|
||||||
|
coordinationv1alpha1 "k8s.io/client-go/kubernetes/typed/coordination/v1alpha1"
|
||||||
|
fakecoordinationv1alpha1 "k8s.io/client-go/kubernetes/typed/coordination/v1alpha1/fake"
|
||||||
coordinationv1beta1 "k8s.io/client-go/kubernetes/typed/coordination/v1beta1"
|
coordinationv1beta1 "k8s.io/client-go/kubernetes/typed/coordination/v1beta1"
|
||||||
fakecoordinationv1beta1 "k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake"
|
fakecoordinationv1beta1 "k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake"
|
||||||
corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
|
corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||||
@ -323,6 +325,11 @@ func (c *Clientset) CertificatesV1alpha1() certificatesv1alpha1.CertificatesV1al
|
|||||||
return &fakecertificatesv1alpha1.FakeCertificatesV1alpha1{Fake: &c.Fake}
|
return &fakecertificatesv1alpha1.FakeCertificatesV1alpha1{Fake: &c.Fake}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CoordinationV1alpha1 retrieves the CoordinationV1alpha1Client
|
||||||
|
func (c *Clientset) CoordinationV1alpha1() coordinationv1alpha1.CoordinationV1alpha1Interface {
|
||||||
|
return &fakecoordinationv1alpha1.FakeCoordinationV1alpha1{Fake: &c.Fake}
|
||||||
|
}
|
||||||
|
|
||||||
// CoordinationV1beta1 retrieves the CoordinationV1beta1Client
|
// CoordinationV1beta1 retrieves the CoordinationV1beta1Client
|
||||||
func (c *Clientset) CoordinationV1beta1() coordinationv1beta1.CoordinationV1beta1Interface {
|
func (c *Clientset) CoordinationV1beta1() coordinationv1beta1.CoordinationV1beta1Interface {
|
||||||
return &fakecoordinationv1beta1.FakeCoordinationV1beta1{Fake: &c.Fake}
|
return &fakecoordinationv1beta1.FakeCoordinationV1beta1{Fake: &c.Fake}
|
||||||
|
@ -41,6 +41,7 @@ import (
|
|||||||
certificatesv1alpha1 "k8s.io/api/certificates/v1alpha1"
|
certificatesv1alpha1 "k8s.io/api/certificates/v1alpha1"
|
||||||
certificatesv1beta1 "k8s.io/api/certificates/v1beta1"
|
certificatesv1beta1 "k8s.io/api/certificates/v1beta1"
|
||||||
coordinationv1 "k8s.io/api/coordination/v1"
|
coordinationv1 "k8s.io/api/coordination/v1"
|
||||||
|
coordinationv1alpha1 "k8s.io/api/coordination/v1alpha1"
|
||||||
coordinationv1beta1 "k8s.io/api/coordination/v1beta1"
|
coordinationv1beta1 "k8s.io/api/coordination/v1beta1"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
discoveryv1 "k8s.io/api/discovery/v1"
|
discoveryv1 "k8s.io/api/discovery/v1"
|
||||||
@ -103,6 +104,7 @@ var localSchemeBuilder = runtime.SchemeBuilder{
|
|||||||
certificatesv1.AddToScheme,
|
certificatesv1.AddToScheme,
|
||||||
certificatesv1beta1.AddToScheme,
|
certificatesv1beta1.AddToScheme,
|
||||||
certificatesv1alpha1.AddToScheme,
|
certificatesv1alpha1.AddToScheme,
|
||||||
|
coordinationv1alpha1.AddToScheme,
|
||||||
coordinationv1beta1.AddToScheme,
|
coordinationv1beta1.AddToScheme,
|
||||||
coordinationv1.AddToScheme,
|
coordinationv1.AddToScheme,
|
||||||
corev1.AddToScheme,
|
corev1.AddToScheme,
|
||||||
|
@ -41,6 +41,7 @@ import (
|
|||||||
certificatesv1alpha1 "k8s.io/api/certificates/v1alpha1"
|
certificatesv1alpha1 "k8s.io/api/certificates/v1alpha1"
|
||||||
certificatesv1beta1 "k8s.io/api/certificates/v1beta1"
|
certificatesv1beta1 "k8s.io/api/certificates/v1beta1"
|
||||||
coordinationv1 "k8s.io/api/coordination/v1"
|
coordinationv1 "k8s.io/api/coordination/v1"
|
||||||
|
coordinationv1alpha1 "k8s.io/api/coordination/v1alpha1"
|
||||||
coordinationv1beta1 "k8s.io/api/coordination/v1beta1"
|
coordinationv1beta1 "k8s.io/api/coordination/v1beta1"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
discoveryv1 "k8s.io/api/discovery/v1"
|
discoveryv1 "k8s.io/api/discovery/v1"
|
||||||
@ -103,6 +104,7 @@ var localSchemeBuilder = runtime.SchemeBuilder{
|
|||||||
certificatesv1.AddToScheme,
|
certificatesv1.AddToScheme,
|
||||||
certificatesv1beta1.AddToScheme,
|
certificatesv1beta1.AddToScheme,
|
||||||
certificatesv1alpha1.AddToScheme,
|
certificatesv1alpha1.AddToScheme,
|
||||||
|
coordinationv1alpha1.AddToScheme,
|
||||||
coordinationv1beta1.AddToScheme,
|
coordinationv1beta1.AddToScheme,
|
||||||
coordinationv1.AddToScheme,
|
coordinationv1.AddToScheme,
|
||||||
corev1.AddToScheme,
|
corev1.AddToScheme,
|
||||||
|
107
kubernetes/typed/coordination/v1alpha1/coordination_client.go
Normal file
107
kubernetes/typed/coordination/v1alpha1/coordination_client.go
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
Copyright 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Code generated by client-gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
v1alpha1 "k8s.io/api/coordination/v1alpha1"
|
||||||
|
"k8s.io/client-go/kubernetes/scheme"
|
||||||
|
rest "k8s.io/client-go/rest"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CoordinationV1alpha1Interface interface {
|
||||||
|
RESTClient() rest.Interface
|
||||||
|
LeaseCandidatesGetter
|
||||||
|
}
|
||||||
|
|
||||||
|
// CoordinationV1alpha1Client is used to interact with features provided by the coordination.k8s.io group.
|
||||||
|
type CoordinationV1alpha1Client struct {
|
||||||
|
restClient rest.Interface
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CoordinationV1alpha1Client) LeaseCandidates(namespace string) LeaseCandidateInterface {
|
||||||
|
return newLeaseCandidates(c, namespace)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewForConfig creates a new CoordinationV1alpha1Client for the given config.
|
||||||
|
// NewForConfig is equivalent to NewForConfigAndClient(c, httpClient),
|
||||||
|
// where httpClient was generated with rest.HTTPClientFor(c).
|
||||||
|
func NewForConfig(c *rest.Config) (*CoordinationV1alpha1Client, error) {
|
||||||
|
config := *c
|
||||||
|
if err := setConfigDefaults(&config); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
httpClient, err := rest.HTTPClientFor(&config)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return NewForConfigAndClient(&config, httpClient)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewForConfigAndClient creates a new CoordinationV1alpha1Client for the given config and http client.
|
||||||
|
// Note the http client provided takes precedence over the configured transport values.
|
||||||
|
func NewForConfigAndClient(c *rest.Config, h *http.Client) (*CoordinationV1alpha1Client, error) {
|
||||||
|
config := *c
|
||||||
|
if err := setConfigDefaults(&config); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
client, err := rest.RESTClientForConfigAndClient(&config, h)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &CoordinationV1alpha1Client{client}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewForConfigOrDie creates a new CoordinationV1alpha1Client for the given config and
|
||||||
|
// panics if there is an error in the config.
|
||||||
|
func NewForConfigOrDie(c *rest.Config) *CoordinationV1alpha1Client {
|
||||||
|
client, err := NewForConfig(c)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return client
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a new CoordinationV1alpha1Client for the given RESTClient.
|
||||||
|
func New(c rest.Interface) *CoordinationV1alpha1Client {
|
||||||
|
return &CoordinationV1alpha1Client{c}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setConfigDefaults(config *rest.Config) error {
|
||||||
|
gv := v1alpha1.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 *CoordinationV1alpha1Client) RESTClient() rest.Interface {
|
||||||
|
if c == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return c.restClient
|
||||||
|
}
|
20
kubernetes/typed/coordination/v1alpha1/doc.go
Normal file
20
kubernetes/typed/coordination/v1alpha1/doc.go
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
Copyright 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Code generated by client-gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
// This package has the automatically generated typed clients.
|
||||||
|
package v1alpha1
|
20
kubernetes/typed/coordination/v1alpha1/fake/doc.go
Normal file
20
kubernetes/typed/coordination/v1alpha1/fake/doc.go
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
Copyright 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Code generated by client-gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
// Package fake has the automatically generated clients.
|
||||||
|
package fake
|
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
Copyright 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Code generated by client-gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
package fake
|
||||||
|
|
||||||
|
import (
|
||||||
|
v1alpha1 "k8s.io/client-go/kubernetes/typed/coordination/v1alpha1"
|
||||||
|
rest "k8s.io/client-go/rest"
|
||||||
|
testing "k8s.io/client-go/testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
type FakeCoordinationV1alpha1 struct {
|
||||||
|
*testing.Fake
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *FakeCoordinationV1alpha1) LeaseCandidates(namespace string) v1alpha1.LeaseCandidateInterface {
|
||||||
|
return &FakeLeaseCandidates{c, namespace}
|
||||||
|
}
|
||||||
|
|
||||||
|
// RESTClient returns a RESTClient that is used to communicate
|
||||||
|
// with API server by this client implementation.
|
||||||
|
func (c *FakeCoordinationV1alpha1) RESTClient() rest.Interface {
|
||||||
|
var ret *rest.RESTClient
|
||||||
|
return ret
|
||||||
|
}
|
@ -0,0 +1,160 @@
|
|||||||
|
/*
|
||||||
|
Copyright 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Code generated by client-gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
package fake
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
json "encoding/json"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
v1alpha1 "k8s.io/api/coordination/v1alpha1"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
labels "k8s.io/apimachinery/pkg/labels"
|
||||||
|
types "k8s.io/apimachinery/pkg/types"
|
||||||
|
watch "k8s.io/apimachinery/pkg/watch"
|
||||||
|
coordinationv1alpha1 "k8s.io/client-go/applyconfigurations/coordination/v1alpha1"
|
||||||
|
testing "k8s.io/client-go/testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// FakeLeaseCandidates implements LeaseCandidateInterface
|
||||||
|
type FakeLeaseCandidates struct {
|
||||||
|
Fake *FakeCoordinationV1alpha1
|
||||||
|
ns string
|
||||||
|
}
|
||||||
|
|
||||||
|
var leasecandidatesResource = v1alpha1.SchemeGroupVersion.WithResource("leasecandidates")
|
||||||
|
|
||||||
|
var leasecandidatesKind = v1alpha1.SchemeGroupVersion.WithKind("LeaseCandidate")
|
||||||
|
|
||||||
|
// Get takes name of the leaseCandidate, and returns the corresponding leaseCandidate object, and an error if there is any.
|
||||||
|
func (c *FakeLeaseCandidates) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.LeaseCandidate, err error) {
|
||||||
|
emptyResult := &v1alpha1.LeaseCandidate{}
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewGetActionWithOptions(leasecandidatesResource, c.ns, name, options), emptyResult)
|
||||||
|
|
||||||
|
if obj == nil {
|
||||||
|
return emptyResult, err
|
||||||
|
}
|
||||||
|
return obj.(*v1alpha1.LeaseCandidate), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// List takes label and field selectors, and returns the list of LeaseCandidates that match those selectors.
|
||||||
|
func (c *FakeLeaseCandidates) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.LeaseCandidateList, err error) {
|
||||||
|
emptyResult := &v1alpha1.LeaseCandidateList{}
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewListActionWithOptions(leasecandidatesResource, leasecandidatesKind, c.ns, opts), emptyResult)
|
||||||
|
|
||||||
|
if obj == nil {
|
||||||
|
return emptyResult, err
|
||||||
|
}
|
||||||
|
|
||||||
|
label, _, _ := testing.ExtractFromListOptions(opts)
|
||||||
|
if label == nil {
|
||||||
|
label = labels.Everything()
|
||||||
|
}
|
||||||
|
list := &v1alpha1.LeaseCandidateList{ListMeta: obj.(*v1alpha1.LeaseCandidateList).ListMeta}
|
||||||
|
for _, item := range obj.(*v1alpha1.LeaseCandidateList).Items {
|
||||||
|
if label.Matches(labels.Set(item.Labels)) {
|
||||||
|
list.Items = append(list.Items, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Watch returns a watch.Interface that watches the requested leaseCandidates.
|
||||||
|
func (c *FakeLeaseCandidates) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
|
||||||
|
return c.Fake.
|
||||||
|
InvokesWatch(testing.NewWatchActionWithOptions(leasecandidatesResource, c.ns, opts))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create takes the representation of a leaseCandidate and creates it. Returns the server's representation of the leaseCandidate, and an error, if there is any.
|
||||||
|
func (c *FakeLeaseCandidates) Create(ctx context.Context, leaseCandidate *v1alpha1.LeaseCandidate, opts v1.CreateOptions) (result *v1alpha1.LeaseCandidate, err error) {
|
||||||
|
emptyResult := &v1alpha1.LeaseCandidate{}
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewCreateActionWithOptions(leasecandidatesResource, c.ns, leaseCandidate, opts), emptyResult)
|
||||||
|
|
||||||
|
if obj == nil {
|
||||||
|
return emptyResult, err
|
||||||
|
}
|
||||||
|
return obj.(*v1alpha1.LeaseCandidate), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update takes the representation of a leaseCandidate and updates it. Returns the server's representation of the leaseCandidate, and an error, if there is any.
|
||||||
|
func (c *FakeLeaseCandidates) Update(ctx context.Context, leaseCandidate *v1alpha1.LeaseCandidate, opts v1.UpdateOptions) (result *v1alpha1.LeaseCandidate, err error) {
|
||||||
|
emptyResult := &v1alpha1.LeaseCandidate{}
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewUpdateActionWithOptions(leasecandidatesResource, c.ns, leaseCandidate, opts), emptyResult)
|
||||||
|
|
||||||
|
if obj == nil {
|
||||||
|
return emptyResult, err
|
||||||
|
}
|
||||||
|
return obj.(*v1alpha1.LeaseCandidate), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete takes name of the leaseCandidate and deletes it. Returns an error if one occurs.
|
||||||
|
func (c *FakeLeaseCandidates) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
|
||||||
|
_, err := c.Fake.
|
||||||
|
Invokes(testing.NewDeleteActionWithOptions(leasecandidatesResource, c.ns, name, opts), &v1alpha1.LeaseCandidate{})
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteCollection deletes a collection of objects.
|
||||||
|
func (c *FakeLeaseCandidates) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
|
||||||
|
action := testing.NewDeleteCollectionActionWithOptions(leasecandidatesResource, c.ns, opts, listOpts)
|
||||||
|
|
||||||
|
_, err := c.Fake.Invokes(action, &v1alpha1.LeaseCandidateList{})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Patch applies the patch and returns the patched leaseCandidate.
|
||||||
|
func (c *FakeLeaseCandidates) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.LeaseCandidate, err error) {
|
||||||
|
emptyResult := &v1alpha1.LeaseCandidate{}
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewPatchSubresourceActionWithOptions(leasecandidatesResource, c.ns, name, pt, data, opts, subresources...), emptyResult)
|
||||||
|
|
||||||
|
if obj == nil {
|
||||||
|
return emptyResult, err
|
||||||
|
}
|
||||||
|
return obj.(*v1alpha1.LeaseCandidate), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply takes the given apply declarative configuration, applies it and returns the applied leaseCandidate.
|
||||||
|
func (c *FakeLeaseCandidates) Apply(ctx context.Context, leaseCandidate *coordinationv1alpha1.LeaseCandidateApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.LeaseCandidate, err error) {
|
||||||
|
if leaseCandidate == nil {
|
||||||
|
return nil, fmt.Errorf("leaseCandidate provided to Apply must not be nil")
|
||||||
|
}
|
||||||
|
data, err := json.Marshal(leaseCandidate)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
name := leaseCandidate.Name
|
||||||
|
if name == nil {
|
||||||
|
return nil, fmt.Errorf("leaseCandidate.Name must be provided to Apply")
|
||||||
|
}
|
||||||
|
emptyResult := &v1alpha1.LeaseCandidate{}
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewPatchSubresourceActionWithOptions(leasecandidatesResource, c.ns, *name, types.ApplyPatchType, data, opts.ToPatchOptions()), emptyResult)
|
||||||
|
|
||||||
|
if obj == nil {
|
||||||
|
return emptyResult, err
|
||||||
|
}
|
||||||
|
return obj.(*v1alpha1.LeaseCandidate), err
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
Copyright 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Code generated by client-gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
type LeaseCandidateExpansion interface{}
|
69
kubernetes/typed/coordination/v1alpha1/leasecandidate.go
Normal file
69
kubernetes/typed/coordination/v1alpha1/leasecandidate.go
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
Copyright 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Code generated by client-gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
v1alpha1 "k8s.io/api/coordination/v1alpha1"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
types "k8s.io/apimachinery/pkg/types"
|
||||||
|
watch "k8s.io/apimachinery/pkg/watch"
|
||||||
|
coordinationv1alpha1 "k8s.io/client-go/applyconfigurations/coordination/v1alpha1"
|
||||||
|
gentype "k8s.io/client-go/gentype"
|
||||||
|
scheme "k8s.io/client-go/kubernetes/scheme"
|
||||||
|
)
|
||||||
|
|
||||||
|
// LeaseCandidatesGetter has a method to return a LeaseCandidateInterface.
|
||||||
|
// A group's client should implement this interface.
|
||||||
|
type LeaseCandidatesGetter interface {
|
||||||
|
LeaseCandidates(namespace string) LeaseCandidateInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
// LeaseCandidateInterface has methods to work with LeaseCandidate resources.
|
||||||
|
type LeaseCandidateInterface interface {
|
||||||
|
Create(ctx context.Context, leaseCandidate *v1alpha1.LeaseCandidate, opts v1.CreateOptions) (*v1alpha1.LeaseCandidate, error)
|
||||||
|
Update(ctx context.Context, leaseCandidate *v1alpha1.LeaseCandidate, opts v1.UpdateOptions) (*v1alpha1.LeaseCandidate, error)
|
||||||
|
Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
|
||||||
|
DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
|
||||||
|
Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.LeaseCandidate, error)
|
||||||
|
List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.LeaseCandidateList, error)
|
||||||
|
Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
|
||||||
|
Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.LeaseCandidate, err error)
|
||||||
|
Apply(ctx context.Context, leaseCandidate *coordinationv1alpha1.LeaseCandidateApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.LeaseCandidate, err error)
|
||||||
|
LeaseCandidateExpansion
|
||||||
|
}
|
||||||
|
|
||||||
|
// leaseCandidates implements LeaseCandidateInterface
|
||||||
|
type leaseCandidates struct {
|
||||||
|
*gentype.ClientWithListAndApply[*v1alpha1.LeaseCandidate, *v1alpha1.LeaseCandidateList, *coordinationv1alpha1.LeaseCandidateApplyConfiguration]
|
||||||
|
}
|
||||||
|
|
||||||
|
// newLeaseCandidates returns a LeaseCandidates
|
||||||
|
func newLeaseCandidates(c *CoordinationV1alpha1Client, namespace string) *leaseCandidates {
|
||||||
|
return &leaseCandidates{
|
||||||
|
gentype.NewClientWithListAndApply[*v1alpha1.LeaseCandidate, *v1alpha1.LeaseCandidateList, *coordinationv1alpha1.LeaseCandidateApplyConfiguration](
|
||||||
|
"leasecandidates",
|
||||||
|
c.RESTClient(),
|
||||||
|
scheme.ParameterCodec,
|
||||||
|
namespace,
|
||||||
|
func() *v1alpha1.LeaseCandidate { return &v1alpha1.LeaseCandidate{} },
|
||||||
|
func() *v1alpha1.LeaseCandidateList { return &v1alpha1.LeaseCandidateList{} }),
|
||||||
|
}
|
||||||
|
}
|
27
listers/coordination/v1alpha1/expansion_generated.go
Normal file
27
listers/coordination/v1alpha1/expansion_generated.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
Copyright 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Code generated by lister-gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
// LeaseCandidateListerExpansion allows custom methods to be added to
|
||||||
|
// LeaseCandidateLister.
|
||||||
|
type LeaseCandidateListerExpansion interface{}
|
||||||
|
|
||||||
|
// LeaseCandidateNamespaceListerExpansion allows custom methods to be added to
|
||||||
|
// LeaseCandidateNamespaceLister.
|
||||||
|
type LeaseCandidateNamespaceListerExpansion interface{}
|
70
listers/coordination/v1alpha1/leasecandidate.go
Normal file
70
listers/coordination/v1alpha1/leasecandidate.go
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
Copyright 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Code generated by lister-gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
v1alpha1 "k8s.io/api/coordination/v1alpha1"
|
||||||
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
|
"k8s.io/client-go/listers"
|
||||||
|
"k8s.io/client-go/tools/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
// LeaseCandidateLister helps list LeaseCandidates.
|
||||||
|
// All objects returned here must be treated as read-only.
|
||||||
|
type LeaseCandidateLister interface {
|
||||||
|
// List lists all LeaseCandidates in the indexer.
|
||||||
|
// Objects returned here must be treated as read-only.
|
||||||
|
List(selector labels.Selector) (ret []*v1alpha1.LeaseCandidate, err error)
|
||||||
|
// LeaseCandidates returns an object that can list and get LeaseCandidates.
|
||||||
|
LeaseCandidates(namespace string) LeaseCandidateNamespaceLister
|
||||||
|
LeaseCandidateListerExpansion
|
||||||
|
}
|
||||||
|
|
||||||
|
// leaseCandidateLister implements the LeaseCandidateLister interface.
|
||||||
|
type leaseCandidateLister struct {
|
||||||
|
listers.ResourceIndexer[*v1alpha1.LeaseCandidate]
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewLeaseCandidateLister returns a new LeaseCandidateLister.
|
||||||
|
func NewLeaseCandidateLister(indexer cache.Indexer) LeaseCandidateLister {
|
||||||
|
return &leaseCandidateLister{listers.New[*v1alpha1.LeaseCandidate](indexer, v1alpha1.Resource("leasecandidate"))}
|
||||||
|
}
|
||||||
|
|
||||||
|
// LeaseCandidates returns an object that can list and get LeaseCandidates.
|
||||||
|
func (s *leaseCandidateLister) LeaseCandidates(namespace string) LeaseCandidateNamespaceLister {
|
||||||
|
return leaseCandidateNamespaceLister{listers.NewNamespaced[*v1alpha1.LeaseCandidate](s.ResourceIndexer, namespace)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// LeaseCandidateNamespaceLister helps list and get LeaseCandidates.
|
||||||
|
// All objects returned here must be treated as read-only.
|
||||||
|
type LeaseCandidateNamespaceLister interface {
|
||||||
|
// List lists all LeaseCandidates in the indexer for a given namespace.
|
||||||
|
// Objects returned here must be treated as read-only.
|
||||||
|
List(selector labels.Selector) (ret []*v1alpha1.LeaseCandidate, err error)
|
||||||
|
// Get retrieves the LeaseCandidate from the indexer for a given namespace and name.
|
||||||
|
// Objects returned here must be treated as read-only.
|
||||||
|
Get(name string) (*v1alpha1.LeaseCandidate, error)
|
||||||
|
LeaseCandidateNamespaceListerExpansion
|
||||||
|
}
|
||||||
|
|
||||||
|
// leaseCandidateNamespaceLister implements the LeaseCandidateNamespaceLister
|
||||||
|
// interface.
|
||||||
|
type leaseCandidateNamespaceLister struct {
|
||||||
|
listers.ResourceIndexer[*v1alpha1.LeaseCandidate]
|
||||||
|
}
|
@ -159,6 +159,10 @@ type LeaderElectionConfig struct {
|
|||||||
|
|
||||||
// Name is the name of the resource lock for debugging
|
// Name is the name of the resource lock for debugging
|
||||||
Name string
|
Name string
|
||||||
|
|
||||||
|
// Coordinated will use the Coordinated Leader Election feature
|
||||||
|
// WARNING: Coordinated leader election is ALPHA.
|
||||||
|
Coordinated bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// LeaderCallbacks are callbacks that are triggered during certain
|
// LeaderCallbacks are callbacks that are triggered during certain
|
||||||
@ -249,7 +253,11 @@ func (le *LeaderElector) acquire(ctx context.Context) bool {
|
|||||||
desc := le.config.Lock.Describe()
|
desc := le.config.Lock.Describe()
|
||||||
klog.Infof("attempting to acquire leader lease %v...", desc)
|
klog.Infof("attempting to acquire leader lease %v...", desc)
|
||||||
wait.JitterUntil(func() {
|
wait.JitterUntil(func() {
|
||||||
succeeded = le.tryAcquireOrRenew(ctx)
|
if !le.config.Coordinated {
|
||||||
|
succeeded = le.tryAcquireOrRenew(ctx)
|
||||||
|
} else {
|
||||||
|
succeeded = le.tryCoordinatedRenew(ctx)
|
||||||
|
}
|
||||||
le.maybeReportTransition()
|
le.maybeReportTransition()
|
||||||
if !succeeded {
|
if !succeeded {
|
||||||
klog.V(4).Infof("failed to acquire lease %v", desc)
|
klog.V(4).Infof("failed to acquire lease %v", desc)
|
||||||
@ -272,7 +280,11 @@ func (le *LeaderElector) renew(ctx context.Context) {
|
|||||||
timeoutCtx, timeoutCancel := context.WithTimeout(ctx, le.config.RenewDeadline)
|
timeoutCtx, timeoutCancel := context.WithTimeout(ctx, le.config.RenewDeadline)
|
||||||
defer timeoutCancel()
|
defer timeoutCancel()
|
||||||
err := wait.PollImmediateUntil(le.config.RetryPeriod, func() (bool, error) {
|
err := wait.PollImmediateUntil(le.config.RetryPeriod, func() (bool, error) {
|
||||||
return le.tryAcquireOrRenew(timeoutCtx), nil
|
if !le.config.Coordinated {
|
||||||
|
return le.tryAcquireOrRenew(timeoutCtx), nil
|
||||||
|
} else {
|
||||||
|
return le.tryCoordinatedRenew(timeoutCtx), nil
|
||||||
|
}
|
||||||
}, timeoutCtx.Done())
|
}, timeoutCtx.Done())
|
||||||
|
|
||||||
le.maybeReportTransition()
|
le.maybeReportTransition()
|
||||||
@ -315,6 +327,81 @@ func (le *LeaderElector) release() bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// tryCoordinatedRenew checks if it acquired a lease and tries to renew the
|
||||||
|
// lease if it has already been acquired. Returns true on success else returns
|
||||||
|
// false.
|
||||||
|
func (le *LeaderElector) tryCoordinatedRenew(ctx context.Context) bool {
|
||||||
|
now := metav1.NewTime(le.clock.Now())
|
||||||
|
leaderElectionRecord := rl.LeaderElectionRecord{
|
||||||
|
HolderIdentity: le.config.Lock.Identity(),
|
||||||
|
LeaseDurationSeconds: int(le.config.LeaseDuration / time.Second),
|
||||||
|
RenewTime: now,
|
||||||
|
AcquireTime: now,
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1. obtain the electionRecord
|
||||||
|
oldLeaderElectionRecord, oldLeaderElectionRawRecord, err := le.config.Lock.Get(ctx)
|
||||||
|
if err != nil {
|
||||||
|
if !errors.IsNotFound(err) {
|
||||||
|
klog.Errorf("error retrieving resource lock %v: %v", le.config.Lock.Describe(), err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
klog.Infof("lease lock not found: %v", le.config.Lock.Describe())
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Record obtained, check the Identity & Time
|
||||||
|
if !bytes.Equal(le.observedRawRecord, oldLeaderElectionRawRecord) {
|
||||||
|
le.setObservedRecord(oldLeaderElectionRecord)
|
||||||
|
|
||||||
|
le.observedRawRecord = oldLeaderElectionRawRecord
|
||||||
|
}
|
||||||
|
|
||||||
|
hasExpired := le.observedTime.Add(time.Second * time.Duration(oldLeaderElectionRecord.LeaseDurationSeconds)).Before(now.Time)
|
||||||
|
if hasExpired {
|
||||||
|
klog.Infof("lock has expired: %v", le.config.Lock.Describe())
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if !le.IsLeader() {
|
||||||
|
klog.V(6).Infof("lock is held by %v and has not yet expired: %v", oldLeaderElectionRecord.HolderIdentity, le.config.Lock.Describe())
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2b. If the lease has been marked as "end of term", don't renew it
|
||||||
|
if le.IsLeader() && oldLeaderElectionRecord.PreferredHolder != "" {
|
||||||
|
klog.V(4).Infof("lock is marked as 'end of term': %v", le.config.Lock.Describe())
|
||||||
|
// TODO: Instead of letting lease expire, the holder may deleted it directly
|
||||||
|
// This will not be compatible with all controllers, so it needs to be opt-in behavior.
|
||||||
|
// We must ensure all code guarded by this lease has successfully completed
|
||||||
|
// prior to releasing or there may be two processes
|
||||||
|
// simultaneously acting on the critical path.
|
||||||
|
// Usually once this returns false, the process is terminated..
|
||||||
|
// xref: OnStoppedLeading
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. We're going to try to update. The leaderElectionRecord is set to it's default
|
||||||
|
// here. Let's correct it before updating.
|
||||||
|
if le.IsLeader() {
|
||||||
|
leaderElectionRecord.AcquireTime = oldLeaderElectionRecord.AcquireTime
|
||||||
|
leaderElectionRecord.LeaderTransitions = oldLeaderElectionRecord.LeaderTransitions
|
||||||
|
leaderElectionRecord.Strategy = oldLeaderElectionRecord.Strategy
|
||||||
|
le.metrics.slowpathExercised(le.config.Name)
|
||||||
|
} else {
|
||||||
|
leaderElectionRecord.LeaderTransitions = oldLeaderElectionRecord.LeaderTransitions + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// update the lock itself
|
||||||
|
if err = le.config.Lock.Update(ctx, leaderElectionRecord); err != nil {
|
||||||
|
klog.Errorf("Failed to update lock: %v", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
le.setObservedRecord(&leaderElectionRecord)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
// tryAcquireOrRenew tries to acquire a leader lease if it is not already acquired,
|
// tryAcquireOrRenew tries to acquire a leader lease if it is not already acquired,
|
||||||
// else it tries to renew the lease if it has already been acquired. Returns true
|
// else it tries to renew the lease if it has already been acquired. Returns true
|
||||||
// on success else returns false.
|
// on success else returns false.
|
||||||
|
@ -25,6 +25,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp"
|
"github.com/google/go-cmp/cmp"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
coordinationv1 "k8s.io/api/coordination/v1"
|
coordinationv1 "k8s.io/api/coordination/v1"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/equality"
|
"k8s.io/apimachinery/pkg/api/equality"
|
||||||
@ -37,8 +38,6 @@ import (
|
|||||||
rl "k8s.io/client-go/tools/leaderelection/resourcelock"
|
rl "k8s.io/client-go/tools/leaderelection/resourcelock"
|
||||||
"k8s.io/client-go/tools/record"
|
"k8s.io/client-go/tools/record"
|
||||||
"k8s.io/utils/clock"
|
"k8s.io/utils/clock"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func createLockObject(t *testing.T, objectType, namespace, name string, record *rl.LeaderElectionRecord) (obj runtime.Object) {
|
func createLockObject(t *testing.T, objectType, namespace, name string, record *rl.LeaderElectionRecord) (obj runtime.Object) {
|
||||||
@ -353,6 +352,147 @@ func testTryAcquireOrRenew(t *testing.T, objectType string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestTryCoordinatedRenew(t *testing.T) {
|
||||||
|
objectType := "leases"
|
||||||
|
clock := clock.RealClock{}
|
||||||
|
future := clock.Now().Add(1000 * time.Hour)
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
observedRecord rl.LeaderElectionRecord
|
||||||
|
observedTime time.Time
|
||||||
|
retryAfter time.Duration
|
||||||
|
reactors []Reactor
|
||||||
|
expectedEvents []string
|
||||||
|
|
||||||
|
expectSuccess bool
|
||||||
|
transitionLeader bool
|
||||||
|
outHolder string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "don't acquire from led, acked object",
|
||||||
|
reactors: []Reactor{
|
||||||
|
{
|
||||||
|
verb: "get",
|
||||||
|
reaction: func(action fakeclient.Action) (handled bool, ret runtime.Object, err error) {
|
||||||
|
return true, createLockObject(t, objectType, action.GetNamespace(), action.(fakeclient.GetAction).GetName(), &rl.LeaderElectionRecord{HolderIdentity: "bing"}), nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
observedTime: future,
|
||||||
|
|
||||||
|
expectSuccess: false,
|
||||||
|
outHolder: "bing",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "renew already acquired object",
|
||||||
|
reactors: []Reactor{
|
||||||
|
{
|
||||||
|
verb: "get",
|
||||||
|
reaction: func(action fakeclient.Action) (handled bool, ret runtime.Object, err error) {
|
||||||
|
return true, createLockObject(t, objectType, action.GetNamespace(), action.(fakeclient.GetAction).GetName(), &rl.LeaderElectionRecord{HolderIdentity: "baz"}), nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
verb: "update",
|
||||||
|
reaction: func(action fakeclient.Action) (handled bool, ret runtime.Object, err error) {
|
||||||
|
return true, action.(fakeclient.CreateAction).GetObject(), nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
observedTime: future,
|
||||||
|
observedRecord: rl.LeaderElectionRecord{HolderIdentity: "baz"},
|
||||||
|
|
||||||
|
expectSuccess: true,
|
||||||
|
outHolder: "baz",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := range tests {
|
||||||
|
test := &tests[i]
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
// OnNewLeader is called async so we have to wait for it.
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
wg.Add(1)
|
||||||
|
var reportedLeader string
|
||||||
|
var lock rl.Interface
|
||||||
|
|
||||||
|
objectMeta := metav1.ObjectMeta{Namespace: "foo", Name: "bar"}
|
||||||
|
recorder := record.NewFakeRecorder(100)
|
||||||
|
resourceLockConfig := rl.ResourceLockConfig{
|
||||||
|
Identity: "baz",
|
||||||
|
EventRecorder: recorder,
|
||||||
|
}
|
||||||
|
c := &fake.Clientset{}
|
||||||
|
for _, reactor := range test.reactors {
|
||||||
|
c.AddReactor(reactor.verb, objectType, reactor.reaction)
|
||||||
|
}
|
||||||
|
c.AddReactor("*", "*", func(action fakeclient.Action) (bool, runtime.Object, error) {
|
||||||
|
t.Errorf("unreachable action. testclient called too many times: %+v", action)
|
||||||
|
return true, nil, fmt.Errorf("unreachable action")
|
||||||
|
})
|
||||||
|
|
||||||
|
lock = &rl.LeaseLock{
|
||||||
|
LeaseMeta: objectMeta,
|
||||||
|
LockConfig: resourceLockConfig,
|
||||||
|
Client: c.CoordinationV1(),
|
||||||
|
}
|
||||||
|
lec := LeaderElectionConfig{
|
||||||
|
Lock: lock,
|
||||||
|
LeaseDuration: 10 * time.Second,
|
||||||
|
Callbacks: LeaderCallbacks{
|
||||||
|
OnNewLeader: func(l string) {
|
||||||
|
defer wg.Done()
|
||||||
|
reportedLeader = l
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Coordinated: true,
|
||||||
|
}
|
||||||
|
observedRawRecord := GetRawRecordOrDie(t, objectType, test.observedRecord)
|
||||||
|
le := &LeaderElector{
|
||||||
|
config: lec,
|
||||||
|
observedRecord: test.observedRecord,
|
||||||
|
observedRawRecord: observedRawRecord,
|
||||||
|
observedTime: test.observedTime,
|
||||||
|
clock: clock,
|
||||||
|
metrics: globalMetricsFactory.newLeaderMetrics(),
|
||||||
|
}
|
||||||
|
if test.expectSuccess != le.tryCoordinatedRenew(context.Background()) {
|
||||||
|
if test.retryAfter != 0 {
|
||||||
|
time.Sleep(test.retryAfter)
|
||||||
|
if test.expectSuccess != le.tryCoordinatedRenew(context.Background()) {
|
||||||
|
t.Errorf("unexpected result of tryCoordinatedRenew: [succeeded=%v]", !test.expectSuccess)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
t.Errorf("unexpected result of gryCoordinatedRenew: [succeeded=%v]", !test.expectSuccess)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
le.observedRecord.AcquireTime = metav1.Time{}
|
||||||
|
le.observedRecord.RenewTime = metav1.Time{}
|
||||||
|
if le.observedRecord.HolderIdentity != test.outHolder {
|
||||||
|
t.Errorf("expected holder:\n\t%+v\ngot:\n\t%+v", test.outHolder, le.observedRecord.HolderIdentity)
|
||||||
|
}
|
||||||
|
if len(test.reactors) != len(c.Actions()) {
|
||||||
|
t.Errorf("wrong number of api interactions")
|
||||||
|
}
|
||||||
|
if test.transitionLeader && le.observedRecord.LeaderTransitions != 1 {
|
||||||
|
t.Errorf("leader should have transitioned but did not")
|
||||||
|
}
|
||||||
|
if !test.transitionLeader && le.observedRecord.LeaderTransitions != 0 {
|
||||||
|
t.Errorf("leader should not have transitioned but did")
|
||||||
|
}
|
||||||
|
|
||||||
|
le.maybeReportTransition()
|
||||||
|
wg.Wait()
|
||||||
|
if reportedLeader != test.outHolder {
|
||||||
|
t.Errorf("reported leader was not the new leader. expected %q, got %q", test.outHolder, reportedLeader)
|
||||||
|
}
|
||||||
|
assertEqualEvents(t, test.expectedEvents, recorder.Events)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Will test leader election using lease as the resource
|
// Will test leader election using lease as the resource
|
||||||
func TestTryAcquireOrRenewLeases(t *testing.T) {
|
func TestTryAcquireOrRenewLeases(t *testing.T) {
|
||||||
testTryAcquireOrRenew(t, "leases")
|
testTryAcquireOrRenew(t, "leases")
|
||||||
|
202
tools/leaderelection/leasecandidate.go
Normal file
202
tools/leaderelection/leasecandidate.go
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2024 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 leaderelection
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"reflect"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
v1 "k8s.io/api/coordination/v1"
|
||||||
|
v1alpha1 "k8s.io/api/coordination/v1alpha1"
|
||||||
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/fields"
|
||||||
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
|
"k8s.io/client-go/informers"
|
||||||
|
"k8s.io/client-go/kubernetes"
|
||||||
|
coordinationv1alpha1client "k8s.io/client-go/kubernetes/typed/coordination/v1alpha1"
|
||||||
|
"k8s.io/client-go/tools/cache"
|
||||||
|
"k8s.io/client-go/util/workqueue"
|
||||||
|
"k8s.io/klog/v2"
|
||||||
|
"k8s.io/utils/clock"
|
||||||
|
)
|
||||||
|
|
||||||
|
const requeueInterval = 5 * time.Minute
|
||||||
|
|
||||||
|
type CacheSyncWaiter interface {
|
||||||
|
WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type LeaseCandidate struct {
|
||||||
|
leaseClient coordinationv1alpha1client.LeaseCandidateInterface
|
||||||
|
leaseCandidateInformer cache.SharedIndexInformer
|
||||||
|
informerFactory informers.SharedInformerFactory
|
||||||
|
hasSynced cache.InformerSynced
|
||||||
|
|
||||||
|
// At most there will be one item in this Queue (since we only watch one item)
|
||||||
|
queue workqueue.TypedRateLimitingInterface[int]
|
||||||
|
|
||||||
|
name string
|
||||||
|
namespace string
|
||||||
|
|
||||||
|
// controller lease
|
||||||
|
leaseName string
|
||||||
|
|
||||||
|
clock clock.Clock
|
||||||
|
|
||||||
|
binaryVersion, emulationVersion string
|
||||||
|
preferredStrategies []v1.CoordinatedLeaseStrategy
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCandidate creates new LeaseCandidate controller that creates a
|
||||||
|
// LeaseCandidate object if it does not exist and watches changes
|
||||||
|
// to the corresponding object and renews if PingTime is set.
|
||||||
|
// WARNING: This is an ALPHA feature. Ensure that the CoordinatedLeaderElection
|
||||||
|
// feature gate is on.
|
||||||
|
func NewCandidate(clientset kubernetes.Interface,
|
||||||
|
candidateNamespace string,
|
||||||
|
candidateName string,
|
||||||
|
targetLease string,
|
||||||
|
binaryVersion, emulationVersion string,
|
||||||
|
preferredStrategies []v1.CoordinatedLeaseStrategy,
|
||||||
|
) (*LeaseCandidate, CacheSyncWaiter, error) {
|
||||||
|
fieldSelector := fields.OneTermEqualSelector("metadata.name", candidateName).String()
|
||||||
|
// A separate informer factory is required because this must start before informerFactories
|
||||||
|
// are started for leader elected components
|
||||||
|
informerFactory := informers.NewSharedInformerFactoryWithOptions(
|
||||||
|
clientset, 5*time.Minute,
|
||||||
|
informers.WithTweakListOptions(func(options *metav1.ListOptions) {
|
||||||
|
options.FieldSelector = fieldSelector
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
leaseCandidateInformer := informerFactory.Coordination().V1alpha1().LeaseCandidates().Informer()
|
||||||
|
|
||||||
|
lc := &LeaseCandidate{
|
||||||
|
leaseClient: clientset.CoordinationV1alpha1().LeaseCandidates(candidateNamespace),
|
||||||
|
leaseCandidateInformer: leaseCandidateInformer,
|
||||||
|
informerFactory: informerFactory,
|
||||||
|
name: candidateName,
|
||||||
|
namespace: candidateNamespace,
|
||||||
|
leaseName: targetLease,
|
||||||
|
clock: clock.RealClock{},
|
||||||
|
binaryVersion: binaryVersion,
|
||||||
|
emulationVersion: emulationVersion,
|
||||||
|
preferredStrategies: preferredStrategies,
|
||||||
|
}
|
||||||
|
lc.queue = workqueue.NewTypedRateLimitingQueueWithConfig(workqueue.DefaultTypedControllerRateLimiter[int](), workqueue.TypedRateLimitingQueueConfig[int]{Name: "leasecandidate"})
|
||||||
|
|
||||||
|
h, err := leaseCandidateInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
|
||||||
|
UpdateFunc: func(oldObj, newObj interface{}) {
|
||||||
|
if leasecandidate, ok := newObj.(*v1alpha1.LeaseCandidate); ok {
|
||||||
|
if leasecandidate.Spec.PingTime != nil && leasecandidate.Spec.PingTime.After(leasecandidate.Spec.RenewTime.Time) {
|
||||||
|
lc.enqueueLease()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
lc.hasSynced = h.HasSynced
|
||||||
|
|
||||||
|
return lc, informerFactory, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *LeaseCandidate) Run(ctx context.Context) {
|
||||||
|
defer c.queue.ShutDown()
|
||||||
|
|
||||||
|
go c.informerFactory.Start(ctx.Done())
|
||||||
|
if !cache.WaitForNamedCacheSync("leasecandidateclient", ctx.Done(), c.hasSynced) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.enqueueLease()
|
||||||
|
go c.runWorker(ctx)
|
||||||
|
<-ctx.Done()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *LeaseCandidate) runWorker(ctx context.Context) {
|
||||||
|
for c.processNextWorkItem(ctx) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *LeaseCandidate) processNextWorkItem(ctx context.Context) bool {
|
||||||
|
key, shutdown := c.queue.Get()
|
||||||
|
if shutdown {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
defer c.queue.Done(key)
|
||||||
|
|
||||||
|
err := c.ensureLease(ctx)
|
||||||
|
if err == nil {
|
||||||
|
c.queue.AddAfter(key, requeueInterval)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
utilruntime.HandleError(err)
|
||||||
|
c.queue.AddRateLimited(key)
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *LeaseCandidate) enqueueLease() {
|
||||||
|
c.queue.Add(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensureLease creates the lease if it does not exist and renew it if it exists. Returns the lease and
|
||||||
|
// a bool (true if this call created the lease), or any error that occurs.
|
||||||
|
func (c *LeaseCandidate) ensureLease(ctx context.Context) error {
|
||||||
|
lease, err := c.leaseClient.Get(ctx, c.name, metav1.GetOptions{})
|
||||||
|
if apierrors.IsNotFound(err) {
|
||||||
|
klog.V(2).Infof("Creating lease candidate")
|
||||||
|
// lease does not exist, create it.
|
||||||
|
leaseToCreate := c.newLeaseCandidate()
|
||||||
|
if _, err := c.leaseClient.Create(ctx, leaseToCreate, metav1.CreateOptions{}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
klog.V(2).Infof("Created lease candidate")
|
||||||
|
return nil
|
||||||
|
} else if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
klog.V(2).Infof("lease candidate exists. Renewing.")
|
||||||
|
clone := lease.DeepCopy()
|
||||||
|
clone.Spec.RenewTime = &metav1.MicroTime{Time: c.clock.Now()}
|
||||||
|
_, err = c.leaseClient.Update(ctx, clone, metav1.UpdateOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *LeaseCandidate) newLeaseCandidate() *v1alpha1.LeaseCandidate {
|
||||||
|
lc := &v1alpha1.LeaseCandidate{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: c.name,
|
||||||
|
Namespace: c.namespace,
|
||||||
|
},
|
||||||
|
Spec: v1alpha1.LeaseCandidateSpec{
|
||||||
|
LeaseName: c.leaseName,
|
||||||
|
BinaryVersion: c.binaryVersion,
|
||||||
|
EmulationVersion: c.emulationVersion,
|
||||||
|
PreferredStrategies: c.preferredStrategies,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
lc.Spec.RenewTime = &metav1.MicroTime{Time: c.clock.Now()}
|
||||||
|
return lc
|
||||||
|
}
|
142
tools/leaderelection/leasecandidate_test.go
Normal file
142
tools/leaderelection/leasecandidate_test.go
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2024 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 leaderelection
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
v1 "k8s.io/api/coordination/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
|
"k8s.io/client-go/kubernetes/fake"
|
||||||
|
)
|
||||||
|
|
||||||
|
type testcase struct {
|
||||||
|
candidateName, candidateNamespace, leaseName string
|
||||||
|
binaryVersion, emulationVersion string
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLeaseCandidateCreation(t *testing.T) {
|
||||||
|
tc := testcase{
|
||||||
|
candidateName: "foo",
|
||||||
|
candidateNamespace: "default",
|
||||||
|
leaseName: "lease",
|
||||||
|
binaryVersion: "1.30.0",
|
||||||
|
emulationVersion: "1.30.0",
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
client := fake.NewSimpleClientset()
|
||||||
|
candidate, _, err := NewCandidate(
|
||||||
|
client,
|
||||||
|
tc.candidateNamespace,
|
||||||
|
tc.candidateName,
|
||||||
|
tc.leaseName,
|
||||||
|
tc.binaryVersion,
|
||||||
|
tc.emulationVersion,
|
||||||
|
[]v1.CoordinatedLeaseStrategy{v1.OldestEmulationVersion},
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
go candidate.Run(ctx)
|
||||||
|
err = pollForLease(ctx, tc, client, nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLeaseCandidateAck(t *testing.T) {
|
||||||
|
tc := testcase{
|
||||||
|
candidateName: "foo",
|
||||||
|
candidateNamespace: "default",
|
||||||
|
leaseName: "lease",
|
||||||
|
binaryVersion: "1.30.0",
|
||||||
|
emulationVersion: "1.30.0",
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
client := fake.NewSimpleClientset()
|
||||||
|
|
||||||
|
candidate, _, err := NewCandidate(
|
||||||
|
client,
|
||||||
|
tc.candidateNamespace,
|
||||||
|
tc.candidateName,
|
||||||
|
tc.leaseName,
|
||||||
|
tc.binaryVersion,
|
||||||
|
tc.emulationVersion,
|
||||||
|
[]v1.CoordinatedLeaseStrategy{v1.OldestEmulationVersion},
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
go candidate.Run(ctx)
|
||||||
|
err = pollForLease(ctx, tc, client, nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update PingTime and verify that the client renews
|
||||||
|
ensureAfter := &metav1.MicroTime{Time: time.Now()}
|
||||||
|
lc, err := client.CoordinationV1alpha1().LeaseCandidates(tc.candidateNamespace).Get(ctx, tc.candidateName, metav1.GetOptions{})
|
||||||
|
if err == nil {
|
||||||
|
if lc.Spec.PingTime == nil {
|
||||||
|
c := lc.DeepCopy()
|
||||||
|
c.Spec.PingTime = &metav1.MicroTime{Time: time.Now()}
|
||||||
|
_, err = client.CoordinationV1alpha1().LeaseCandidates(tc.candidateNamespace).Update(ctx, c, metav1.UpdateOptions{})
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = pollForLease(ctx, tc, client, ensureAfter)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func pollForLease(ctx context.Context, tc testcase, client *fake.Clientset, t *metav1.MicroTime) error {
|
||||||
|
return wait.PollUntilContextTimeout(ctx, 100*time.Millisecond, 10*time.Second, true, func(ctx context.Context) (done bool, err error) {
|
||||||
|
lc, err := client.CoordinationV1alpha1().LeaseCandidates(tc.candidateNamespace).Get(ctx, tc.candidateName, metav1.GetOptions{})
|
||||||
|
if err != nil {
|
||||||
|
if errors.IsNotFound(err) {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
return true, err
|
||||||
|
}
|
||||||
|
if lc.Spec.BinaryVersion == tc.binaryVersion &&
|
||||||
|
lc.Spec.EmulationVersion == tc.emulationVersion &&
|
||||||
|
lc.Spec.LeaseName == tc.leaseName &&
|
||||||
|
lc.Spec.RenewTime != nil {
|
||||||
|
// Ensure that if a time is provided, the renewTime occurred after the provided time.
|
||||||
|
if t != nil && t.After(lc.Spec.RenewTime.Time) {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
}
|
@ -19,14 +19,15 @@ package resourcelock
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
|
||||||
restclient "k8s.io/client-go/rest"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
v1 "k8s.io/api/coordination/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
coordinationv1 "k8s.io/client-go/kubernetes/typed/coordination/v1"
|
coordinationv1 "k8s.io/client-go/kubernetes/typed/coordination/v1"
|
||||||
corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
|
corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||||
|
restclient "k8s.io/client-go/rest"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -114,11 +115,13 @@ type LeaderElectionRecord struct {
|
|||||||
// attempt to acquire leases with empty identities and will wait for the full lease
|
// attempt to acquire leases with empty identities and will wait for the full lease
|
||||||
// interval to expire before attempting to reacquire. This value is set to empty when
|
// interval to expire before attempting to reacquire. This value is set to empty when
|
||||||
// a client voluntarily steps down.
|
// a client voluntarily steps down.
|
||||||
HolderIdentity string `json:"holderIdentity"`
|
HolderIdentity string `json:"holderIdentity"`
|
||||||
LeaseDurationSeconds int `json:"leaseDurationSeconds"`
|
LeaseDurationSeconds int `json:"leaseDurationSeconds"`
|
||||||
AcquireTime metav1.Time `json:"acquireTime"`
|
AcquireTime metav1.Time `json:"acquireTime"`
|
||||||
RenewTime metav1.Time `json:"renewTime"`
|
RenewTime metav1.Time `json:"renewTime"`
|
||||||
LeaderTransitions int `json:"leaderTransitions"`
|
LeaderTransitions int `json:"leaderTransitions"`
|
||||||
|
Strategy v1.CoordinatedLeaseStrategy `json:"strategy"`
|
||||||
|
PreferredHolder string `json:"preferredHolder"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// EventRecorder records a change in the ResourceLock.
|
// EventRecorder records a change in the ResourceLock.
|
||||||
|
@ -122,6 +122,12 @@ func LeaseSpecToLeaderElectionRecord(spec *coordinationv1.LeaseSpec) *LeaderElec
|
|||||||
if spec.RenewTime != nil {
|
if spec.RenewTime != nil {
|
||||||
r.RenewTime = metav1.Time{Time: spec.RenewTime.Time}
|
r.RenewTime = metav1.Time{Time: spec.RenewTime.Time}
|
||||||
}
|
}
|
||||||
|
if spec.PreferredHolder != nil {
|
||||||
|
r.PreferredHolder = *spec.PreferredHolder
|
||||||
|
}
|
||||||
|
if spec.Strategy != nil {
|
||||||
|
r.Strategy = *spec.Strategy
|
||||||
|
}
|
||||||
return &r
|
return &r
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -129,11 +135,18 @@ func LeaseSpecToLeaderElectionRecord(spec *coordinationv1.LeaseSpec) *LeaderElec
|
|||||||
func LeaderElectionRecordToLeaseSpec(ler *LeaderElectionRecord) coordinationv1.LeaseSpec {
|
func LeaderElectionRecordToLeaseSpec(ler *LeaderElectionRecord) coordinationv1.LeaseSpec {
|
||||||
leaseDurationSeconds := int32(ler.LeaseDurationSeconds)
|
leaseDurationSeconds := int32(ler.LeaseDurationSeconds)
|
||||||
leaseTransitions := int32(ler.LeaderTransitions)
|
leaseTransitions := int32(ler.LeaderTransitions)
|
||||||
return coordinationv1.LeaseSpec{
|
spec := coordinationv1.LeaseSpec{
|
||||||
HolderIdentity: &ler.HolderIdentity,
|
HolderIdentity: &ler.HolderIdentity,
|
||||||
LeaseDurationSeconds: &leaseDurationSeconds,
|
LeaseDurationSeconds: &leaseDurationSeconds,
|
||||||
AcquireTime: &metav1.MicroTime{Time: ler.AcquireTime.Time},
|
AcquireTime: &metav1.MicroTime{Time: ler.AcquireTime.Time},
|
||||||
RenewTime: &metav1.MicroTime{Time: ler.RenewTime.Time},
|
RenewTime: &metav1.MicroTime{Time: ler.RenewTime.Time},
|
||||||
LeaseTransitions: &leaseTransitions,
|
LeaseTransitions: &leaseTransitions,
|
||||||
}
|
}
|
||||||
|
if ler.PreferredHolder != "" {
|
||||||
|
spec.PreferredHolder = &ler.PreferredHolder
|
||||||
|
}
|
||||||
|
if ler.Strategy != "" {
|
||||||
|
spec.Strategy = &ler.Strategy
|
||||||
|
}
|
||||||
|
return spec
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user