pkg/provider/branch/cooldown/cooldown.go (59 lines of code) (raw):
// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may
// not use this file except in compliance with the License. A copy of the
// License is located at
//
// http://aws.amazon.com/apache2.0/
//
// or in the "license" file accompanying this file. This file 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 cooldown
import (
"fmt"
"strconv"
"sync"
"time"
"github.com/aws/amazon-vpc-resource-controller-k8s/pkg/config"
"github.com/aws/amazon-vpc-resource-controller-k8s/pkg/k8s"
"github.com/go-logr/logr"
)
// Global variable for CoolDownPeriod allows packages to Get and Set the coolDown period
var coolDown *cooldown
type cooldown struct {
mu sync.RWMutex
// CoolDownPeriod is the period to wait before deleting the branch ENI for propagation of ip tables rule for deleted pod
coolDownPeriod time.Duration
}
type CoolDown interface {
GetCoolDownPeriod() time.Duration
SetCoolDownPeriod(time.Duration)
}
const (
DefaultCoolDownPeriod = time.Second * 60
MinimalCoolDownPeriod = time.Second * 30
)
// Initialize coolDown period by setting the value in configmap or to default
func InitCoolDownPeriod(k8sApi k8s.K8sWrapper, log logr.Logger) {
coolDown = &cooldown{}
coolDownPeriod, err := GetVpcCniConfigMapCoolDownPeriodOrDefault(k8sApi, log)
if err != nil {
log.Info("setting coolDown period to default", "cool down period", coolDownPeriod)
}
coolDown.SetCoolDownPeriod(coolDownPeriod)
}
func GetCoolDown() CoolDown {
return coolDown
}
func GetVpcCniConfigMapCoolDownPeriodOrDefault(k8sApi k8s.K8sWrapper, log logr.Logger) (time.Duration, error) {
vpcCniConfigMap, err := k8sApi.GetConfigMap(config.VpcCniConfigMapName, config.KubeSystemNamespace)
if err == nil && vpcCniConfigMap.Data != nil {
if val, ok := vpcCniConfigMap.Data[config.BranchENICooldownPeriodKey]; ok {
coolDownPeriodInt, err := strconv.Atoi(val)
if err != nil {
log.Error(err, "failed to parse branch ENI coolDown period", "cool down period", val)
} else {
return time.Second * time.Duration(coolDownPeriodInt), nil
}
}
}
// If configmap not found, or configmap data not found, or error in parsing coolDown period, return default coolDown period and error
return DefaultCoolDownPeriod, fmt.Errorf("failed to get cool down period:%v", err)
}
func (c *cooldown) GetCoolDownPeriod() time.Duration {
if c.coolDownPeriod < 30*time.Second {
return MinimalCoolDownPeriod
}
return c.coolDownPeriod
}
func (c *cooldown) SetCoolDownPeriod(newCoolDownPeriod time.Duration) {
c.mu.Lock()
defer c.mu.Unlock()
c.coolDownPeriod = newCoolDownPeriod
}