istio
139 строк · 4.3 Кб
1/*
2Copyright 2018 The Kubernetes Authors.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17package k8sresourcelock
18
19import (
20"context"
21"encoding/json"
22"errors"
23"fmt"
24
25coordinationv1 "k8s.io/api/coordination/v1"
26corev1 "k8s.io/api/core/v1"
27metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28coordinationv1client "k8s.io/client-go/kubernetes/typed/coordination/v1"
29)
30
31type LeaseLock struct {
32// LeaseMeta should contain a Name and a Namespace of a
33// LeaseMeta object that the LeaderElector will attempt to lead.
34LeaseMeta metav1.ObjectMeta
35Client coordinationv1client.LeasesGetter
36LockConfig ResourceLockConfig
37lease *coordinationv1.Lease
38}
39
40// Get returns the election record from a Lease spec
41func (ll *LeaseLock) Get(ctx context.Context) (*LeaderElectionRecord, []byte, error) {
42var err error
43ll.lease, err = ll.Client.Leases(ll.LeaseMeta.Namespace).Get(ctx, ll.LeaseMeta.Name, metav1.GetOptions{})
44if err != nil {
45return nil, nil, err
46}
47record := LeaseSpecToLeaderElectionRecord(&ll.lease.Spec)
48recordByte, err := json.Marshal(*record)
49if err != nil {
50return nil, nil, err
51}
52return record, recordByte, nil
53}
54
55// Create attempts to create a Lease
56func (ll *LeaseLock) Create(ctx context.Context, ler LeaderElectionRecord) error {
57var err error
58ll.lease, err = ll.Client.Leases(ll.LeaseMeta.Namespace).Create(ctx, &coordinationv1.Lease{
59ObjectMeta: metav1.ObjectMeta{
60Name: ll.LeaseMeta.Name,
61Namespace: ll.LeaseMeta.Namespace,
62},
63Spec: LeaderElectionRecordToLeaseSpec(&ler),
64}, metav1.CreateOptions{})
65return err
66}
67
68// Update will update an existing Lease spec.
69func (ll *LeaseLock) Update(ctx context.Context, ler LeaderElectionRecord) error {
70if ll.lease == nil {
71return errors.New("lease not initialized, call get or create first")
72}
73ll.lease.Spec = LeaderElectionRecordToLeaseSpec(&ler)
74
75lease, err := ll.Client.Leases(ll.LeaseMeta.Namespace).Update(ctx, ll.lease, metav1.UpdateOptions{})
76if err != nil {
77return err
78}
79
80ll.lease = lease
81return nil
82}
83
84// RecordEvent in leader election while adding meta-data
85func (ll *LeaseLock) RecordEvent(s string) {
86if ll.LockConfig.EventRecorder == nil {
87return
88}
89events := fmt.Sprintf("%v %v", ll.LockConfig.Identity, s)
90ll.LockConfig.EventRecorder.Eventf(&coordinationv1.Lease{ObjectMeta: ll.lease.ObjectMeta}, corev1.EventTypeNormal, "LeaderElection", events)
91}
92
93// Describe is used to convert details on current resource lock
94// into a string
95func (ll *LeaseLock) Describe() string {
96return fmt.Sprintf("%v/%v", ll.LeaseMeta.Namespace, ll.LeaseMeta.Name)
97}
98
99// Identity returns the Identity of the lock
100func (ll *LeaseLock) Identity() string {
101return ll.LockConfig.Identity
102}
103
104// Key returns the Key of the lock
105func (ll *LeaseLock) Key() string {
106return ll.LockConfig.Key
107}
108
109func LeaseSpecToLeaderElectionRecord(spec *coordinationv1.LeaseSpec) *LeaderElectionRecord {
110var r LeaderElectionRecord
111if spec.HolderIdentity != nil {
112r.HolderIdentity = *spec.HolderIdentity
113}
114if spec.LeaseDurationSeconds != nil {
115r.LeaseDurationSeconds = int(*spec.LeaseDurationSeconds)
116}
117if spec.LeaseTransitions != nil {
118r.LeaderTransitions = int(*spec.LeaseTransitions)
119}
120if spec.AcquireTime != nil {
121r.AcquireTime = metav1.Time{Time: spec.AcquireTime.Time}
122}
123if spec.RenewTime != nil {
124r.RenewTime = metav1.Time{Time: spec.RenewTime.Time}
125}
126return &r
127}
128
129func LeaderElectionRecordToLeaseSpec(ler *LeaderElectionRecord) coordinationv1.LeaseSpec {
130leaseDurationSeconds := int32(ler.LeaseDurationSeconds)
131leaseTransitions := int32(ler.LeaderTransitions)
132return coordinationv1.LeaseSpec{
133HolderIdentity: &ler.HolderIdentity,
134LeaseDurationSeconds: &leaseDurationSeconds,
135AcquireTime: &metav1.MicroTime{Time: ler.AcquireTime.Time},
136RenewTime: &metav1.MicroTime{Time: ler.RenewTime.Time},
137LeaseTransitions: &leaseTransitions,
138}
139}
140