mirror of https://github.com/rancher/wrangler.git
125 lines
2.4 KiB
Go
125 lines
2.4 KiB
Go
package summary
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/rancher/wrangler/v3/pkg/data"
|
|
unstructured2 "github.com/rancher/wrangler/v3/pkg/unstructured"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
)
|
|
|
|
type Summary struct {
|
|
State string `json:"state,omitempty"`
|
|
Error bool `json:"error,omitempty"`
|
|
Transitioning bool `json:"transitioning,omitempty"`
|
|
Message []string `json:"message,omitempty"`
|
|
Attributes map[string]interface{} `json:"-"`
|
|
Relationships []Relationship `json:"-"`
|
|
}
|
|
|
|
type Relationship struct {
|
|
Name string
|
|
Namespace string
|
|
ControlledBy bool
|
|
Kind string
|
|
APIVersion string
|
|
Inbound bool
|
|
Type string
|
|
Selector *metav1.LabelSelector
|
|
}
|
|
|
|
func (s Summary) String() string {
|
|
if !s.Transitioning && !s.Error {
|
|
return s.State
|
|
}
|
|
var msg string
|
|
if s.Transitioning {
|
|
msg = "[progressing"
|
|
}
|
|
if s.Error {
|
|
if len(msg) > 0 {
|
|
msg += ",error]"
|
|
} else {
|
|
msg = "error]"
|
|
}
|
|
} else {
|
|
msg += "]"
|
|
}
|
|
if len(s.Message) > 0 {
|
|
msg = msg + " " + strings.Join(s.Message, ", ")
|
|
}
|
|
return msg
|
|
}
|
|
|
|
func (s Summary) IsReady() bool {
|
|
return !s.Error && !s.Transitioning
|
|
}
|
|
|
|
func (s *Summary) DeepCopy() *Summary {
|
|
v := *s
|
|
return &v
|
|
}
|
|
|
|
func (s *Summary) DeepCopyInto(v *Summary) {
|
|
*v = *s
|
|
}
|
|
|
|
func dedupMessage(messages []string) []string {
|
|
seen := map[string]bool{}
|
|
var result []string
|
|
|
|
for _, message := range messages {
|
|
message = strings.TrimSpace(message)
|
|
if message == "" {
|
|
continue
|
|
}
|
|
if seen[message] {
|
|
continue
|
|
}
|
|
seen[message] = true
|
|
result = append(result, message)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
func Summarize(runtimeObj runtime.Object) Summary {
|
|
var (
|
|
obj data.Object
|
|
err error
|
|
summary Summary
|
|
)
|
|
|
|
if s, ok := runtimeObj.(*SummarizedObject); ok {
|
|
return s.Summary
|
|
}
|
|
|
|
unstr, ok := runtimeObj.(*unstructured.Unstructured)
|
|
if !ok {
|
|
unstr, err = unstructured2.ToUnstructured(runtimeObj)
|
|
if err != nil {
|
|
return summary
|
|
}
|
|
}
|
|
|
|
if unstr != nil {
|
|
obj = unstr.Object
|
|
}
|
|
|
|
conditions := getConditions(obj)
|
|
|
|
for _, summarizer := range Summarizers {
|
|
summary = summarizer(obj, conditions, summary)
|
|
}
|
|
|
|
if summary.State == "" {
|
|
summary.State = "active"
|
|
}
|
|
|
|
summary.State = strings.ToLower(summary.State)
|
|
summary.Message = dedupMessage(summary.Message)
|
|
return summary
|
|
}
|