mirror of
https://github.com/rancher/types.git
synced 2025-04-27 18:25:05 +00:00
The namespace package contains constants that need to be used globally so moving to types to other go modules can depend on it.
119 lines
2.5 KiB
Go
119 lines
2.5 KiB
Go
package namespace
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
|
|
v1 "k8s.io/api/core/v1"
|
|
)
|
|
|
|
const (
|
|
statusAnn = "cattle.io/status"
|
|
GlobalNamespace = "cattle-global-data"
|
|
NodeTemplateGlobalNamespace = "cattle-global-nt"
|
|
)
|
|
|
|
func SetNamespaceCondition(namespace *v1.Namespace, d time.Duration, conditionType string, conditionStatus bool, message string) error {
|
|
annotations := namespace.ObjectMeta.Annotations
|
|
if annotations == nil {
|
|
annotations = map[string]string{}
|
|
}
|
|
ann := annotations[statusAnn]
|
|
conditionStatusStr := "False"
|
|
if conditionStatus {
|
|
conditionStatusStr = "True"
|
|
}
|
|
bAnn, err := GenerateConditionAnnotation(ann, d, conditionType, conditionStatusStr, message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
annotations[statusAnn] = bAnn
|
|
|
|
namespace.ObjectMeta.Annotations = annotations
|
|
|
|
return nil
|
|
}
|
|
|
|
func GenerateConditionAnnotation(ann string, d time.Duration, conditionType string, conditionStatus string, message string) (string, error) {
|
|
status := &status{}
|
|
if ann != "" {
|
|
err := json.Unmarshal([]byte(ann), status)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
}
|
|
if status.Conditions == nil {
|
|
status.Conditions = []condition{}
|
|
}
|
|
|
|
var idx int
|
|
found := false
|
|
for i, c := range status.Conditions {
|
|
if c.Type == conditionType {
|
|
idx = i
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
|
|
conditionMessage := ""
|
|
if conditionStatus != "True" {
|
|
conditionMessage = message
|
|
}
|
|
|
|
cond := condition{
|
|
Type: conditionType,
|
|
Status: conditionStatus,
|
|
Message: conditionMessage,
|
|
LastUpdateTime: time.Now().Add(d).Format(time.RFC3339),
|
|
}
|
|
|
|
if found {
|
|
status.Conditions[idx] = cond
|
|
} else {
|
|
status.Conditions = append(status.Conditions, cond)
|
|
}
|
|
|
|
bAnn, err := json.Marshal(status)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return string(bAnn), nil
|
|
}
|
|
|
|
func IsNamespaceConditionSet(namespace *v1.Namespace, conditionType string, conditionStatus bool) (bool, error) {
|
|
if namespace.ObjectMeta.Annotations == nil {
|
|
return false, nil
|
|
}
|
|
ann := namespace.ObjectMeta.Annotations[statusAnn]
|
|
if ann == "" {
|
|
return false, nil
|
|
}
|
|
status := &status{}
|
|
err := json.Unmarshal([]byte(ann), status)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
conditionStatusStr := "False"
|
|
if conditionStatus {
|
|
conditionStatusStr = "True"
|
|
}
|
|
for _, c := range status.Conditions {
|
|
if c.Type == conditionType && c.Status == conditionStatusStr {
|
|
return true, nil
|
|
}
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
type status struct {
|
|
Conditions []condition
|
|
}
|
|
|
|
type condition struct {
|
|
Type string
|
|
Status string
|
|
Message string
|
|
LastUpdateTime string
|
|
}
|