This repository has been archived by the owner on Dec 11, 2023. It is now read-only.
/
resource.go
146 lines (120 loc) · 3.32 KB
/
resource.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package deployment
import (
"github.com/giantswarm/apiextensions/v3/pkg/clientset/versioned"
"github.com/giantswarm/microerror"
"github.com/giantswarm/micrologger"
"github.com/giantswarm/tenantcluster/v4/pkg/tenantcluster"
v1 "k8s.io/api/apps/v1"
"k8s.io/client-go/kubernetes"
"github.com/giantswarm/kvm-operator/service/controller/key"
)
const (
// Name is the identifier of the resource.
Name = "deployment"
)
// Config represents the configuration used to create a new deployment resource.
type Config struct {
DNSServers string
G8sClient versioned.Interface
K8sClient kubernetes.Interface
Logger micrologger.Logger
NTPServers string
TenantCluster tenantcluster.Interface
}
// Resource implements the deployment resource.
type Resource struct {
dnsServers string
g8sClient versioned.Interface
k8sClient kubernetes.Interface
logger micrologger.Logger
ntpServers string
tenantCluster tenantcluster.Interface
}
// New creates a new configured deployment resource.
func New(config Config) (*Resource, error) {
if config.DNSServers == "" {
return nil, microerror.Maskf(invalidConfigError, "%T.DNSServers must not be empty", config)
}
if config.G8sClient == nil {
return nil, microerror.Maskf(invalidConfigError, "%T.G8sClient must not be empty", config)
}
if config.K8sClient == nil {
return nil, microerror.Maskf(invalidConfigError, "%T.K8sClient must not be empty", config)
}
if config.Logger == nil {
return nil, microerror.Maskf(invalidConfigError, "%T.Logger must not be empty", config)
}
if config.TenantCluster == nil {
return nil, microerror.Maskf(invalidConfigError, "%T.TenantCluster must not be empty", config)
}
newResource := &Resource{
dnsServers: config.DNSServers,
g8sClient: config.G8sClient,
k8sClient: config.K8sClient,
logger: config.Logger,
ntpServers: config.NTPServers,
tenantCluster: config.TenantCluster,
}
return newResource, nil
}
func (r *Resource) Name() string {
return Name
}
func allNumbersEqual(numbers ...int32) bool {
if len(numbers) == 0 {
return false
}
first := numbers[0]
for _, n := range numbers {
if n != first {
return false
}
}
return true
}
func containsDeployment(list []*v1.Deployment, item *v1.Deployment) bool {
for _, l := range list {
if l.Name == item.Name {
return true
}
}
return false
}
func getDeploymentByName(list []*v1.Deployment, name string) (*v1.Deployment, error) {
for _, l := range list {
if l.Name == name {
return l, nil
}
}
return nil, microerror.Mask(notFoundError)
}
func isAnnotationModified(a, b *v1.Deployment, annotation string) bool {
aVersion := a.GetAnnotations()[annotation]
if aVersion == "" {
return true
}
bVersion := b.GetAnnotations()[annotation]
if bVersion == "" {
return true
}
return aVersion != bVersion
}
func isDeploymentModified(a, b *v1.Deployment) bool {
if isAnnotationModified(a, b, key.VersionBundleVersionAnnotation) {
return true
}
if isAnnotationModified(a, b, key.ReleaseVersionAnnotation) {
return true
}
return false
}
func toDeployments(v interface{}) ([]*v1.Deployment, error) {
if v == nil {
return nil, nil
}
deployments, ok := v.([]*v1.Deployment)
if !ok {
return nil, microerror.Maskf(wrongTypeError, "expected '%T', got '%T'", []*v1.Deployment{}, v)
}
return deployments, nil
}