* Copyright (c) 2025 Huawei Technologies Co., Ltd.
* openFuyao is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package utils
import (
"fmt"
"reflect"
"time"
_ "time/tzdata"
"gopkg.openfuyao.cn/cluster-api-provider-bke/api/bkecommon/v1beta1"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func IsChanClosed(channel interface{}) bool {
chanType := reflect.TypeOf(channel)
if chanType.Kind() != reflect.Chan {
panic("only channels error!")
}
caseRecv := reflect.SelectCase{
Dir: reflect.SelectRecv,
Chan: reflect.ValueOf(channel),
}
caseDefault := reflect.SelectCase{Dir: reflect.SelectDefault}
index, _, ok := reflect.Select([]reflect.SelectCase{caseRecv, caseDefault})
return index == 0 && !ok
}
func ConvertToChinaTime(createTimestamp metav1.Time) (string, error) {
chinaTimeZone, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
return "", fmt.Errorf("error loading location: %w", err)
}
chinaTime := createTimestamp.In(chinaTimeZone)
return chinaTime.Format("2006-01-02 15:04:05"), nil
}
func ExtractAddons(cluster v1beta1.BKECluster) ([]string, error) {
if cluster.Spec.ClusterConfig == nil {
return nil, fmt.Errorf("cluster config is nil")
}
originAddons := cluster.Spec.ClusterConfig.Addons
addons := make([]string, len(originAddons))
for i, addon := range originAddons {
addons[i] = addon.Name
}
return addons, nil
}
func FindExtraNodes(bcNode []v1beta1.Node, realNode []v1.Node) []v1beta1.Node {
extraNodes := make([]v1beta1.Node, 0)
nodeMap := make(map[string]bool)
for _, node := range realNode {
var ip string
for _, addr := range node.Status.Addresses {
if addr.Type == v1.NodeInternalIP {
ip = addr.Address
break
}
}
nodeMap[ip] = true
}
for _, node := range bcNode {
if !nodeMap[node.IP] {
extraNodes = append(extraNodes, node)
}
}
return extraNodes
}