-
Notifications
You must be signed in to change notification settings - Fork 67
/
utils_provider.go
117 lines (99 loc) · 3.26 KB
/
utils_provider.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Gardener contributors
//
// SPDX-License-Identifier: Apache-2.0
package utils
import (
"strings"
"golang.org/x/xerrors"
"k8s.io/apimachinery/pkg/runtime/schema"
"github.com/gardener/controller-manager-library/pkg/resources"
"github.com/gardener/controller-manager-library/pkg/utils"
api "github.com/gardener/external-dns-management/pkg/apis/dns/v1alpha1"
"github.com/gardener/external-dns-management/pkg/dns/provider/errors"
)
var DNSProviderType = (*api.DNSProvider)(nil)
type DNSProviderObject struct {
resources.Object
}
func (this *DNSProviderObject) DNSProvider() *api.DNSProvider {
return this.Data().(*api.DNSProvider)
}
func DNSProviderKey(namespace, name string) resources.ObjectKey {
return resources.NewKey(schema.GroupKind{Group: api.GroupName, Kind: api.DNSProviderKind}, namespace, name)
}
func (this *DNSProviderObject) Spec() *api.DNSProviderSpec {
return &this.DNSProvider().Spec
}
func (this *DNSProviderObject) StatusField() interface{} {
return &this.DNSProvider().Status
}
func (this *DNSProviderObject) Status() *api.DNSProviderStatus {
return &this.DNSProvider().Status
}
func (this *DNSProviderObject) TypeCode() string {
return this.DNSProvider().Spec.Type
}
func (this *DNSProviderObject) SetStateWithError(_ string, err error) bool {
type causer interface {
error
Cause() error
}
message := err.Error()
handlerErrorMsg := ""
for {
var cause error
if xerr, ok := err.(xerrors.Wrapper); ok {
cause = xerr.Unwrap()
} else if cerr, ok := err.(causer); ok {
cause = cerr.Cause()
}
if cause == nil || cause == err {
break
}
if errors.IsHandlerError(cause) {
handlerErrorMsg = cause.Error()
break
}
err = cause
}
if handlerErrorMsg != "" {
prefix := message
if len(message) > len(handlerErrorMsg) && strings.HasSuffix(message, handlerErrorMsg) {
prefix = message[:len(message)-len(handlerErrorMsg)]
}
return this.SetState(api.STATE_ERROR, message, prefix)
}
return this.SetState(api.STATE_ERROR, message)
}
func (this *DNSProviderObject) SetState(state, message string, commonMessagePrefix ...string) bool {
mod := &utils.ModificationState{}
status := &this.DNSProvider().Status
if len(commonMessagePrefix) != 1 || status.Message == nil || !strings.HasPrefix(*status.Message, commonMessagePrefix[0]) {
// only update if prefix has changed. This avoids race conditions (state update <-> reconcilie) if message
// contains time stamps or correlation ids
mod.AssureStringPtrValue(&status.Message, message)
}
mod.AssureStringValue(&status.State, state)
mod.AssureInt64Value(&status.ObservedGeneration, this.DNSProvider().Generation)
return mod.IsModified()
}
func (this *DNSProviderObject) SetSelection(included, excluded utils.StringSet, target *api.DNSSelectionStatus) bool {
modified := false
old_inc := utils.NewStringSetByArray(target.Included)
if !old_inc.Equals(included) {
modified = true
target.Included = included.AsArray()
}
old_exc := utils.NewStringSetByArray(target.Excluded)
if !old_exc.Equals(excluded) {
modified = true
target.Excluded = excluded.AsArray()
}
return modified
}
func DNSProvider(o resources.Object) *DNSProviderObject {
if o.IsA(DNSProviderType) {
return &DNSProviderObject{o}
}
return nil
}