/
cr-manager.go
128 lines (106 loc) · 3.97 KB
/
cr-manager.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
package aaq_operator
import (
"context"
"kubevirt.io/application-aware-quota/pkg/util"
aaqcluster "kubevirt.io/application-aware-quota/pkg/aaq-operator/resources/cluster"
aaqnamespaced "kubevirt.io/application-aware-quota/pkg/aaq-operator/resources/namespaced"
"sigs.k8s.io/controller-runtime/pkg/client"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
rbacv1 "k8s.io/api/rbac/v1"
schedulingv1 "k8s.io/api/scheduling/v1"
extv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
"k8s.io/apimachinery/pkg/types"
aaqv1 "kubevirt.io/application-aware-quota/staging/src/kubevirt.io/application-aware-quota-api/pkg/apis/core/v1alpha1"
sdkapi "kubevirt.io/controller-lifecycle-operator-sdk/api"
"kubevirt.io/controller-lifecycle-operator-sdk/pkg/sdk"
)
// Status provides AAQ status sub-resource
func (r *ReconcileAAQ) Status(cr client.Object) *sdkapi.Status {
return &cr.(*aaqv1.AAQ).Status.Status
}
// Create creates new AAQ resource
func (r *ReconcileAAQ) Create() client.Object {
return &aaqv1.AAQ{}
}
// GetDependantResourcesListObjects provides slice of List resources corresponding to AAQ-dependant resource types
func (r *ReconcileAAQ) GetDependantResourcesListObjects() []client.ObjectList {
return []client.ObjectList{
&extv1.CustomResourceDefinitionList{},
&rbacv1.ClusterRoleBindingList{},
&rbacv1.ClusterRoleList{},
&appsv1.DeploymentList{},
&corev1.ServiceList{},
&rbacv1.RoleBindingList{},
&rbacv1.RoleList{},
&corev1.ServiceAccountList{},
}
}
// IsCreating checks whether operator config is missing (which means it is create-type reconciliation)
func (r *ReconcileAAQ) IsCreating(_ client.Object) (bool, error) {
configMap, err := r.getConfigMap()
if err != nil {
return true, nil
}
return configMap == nil, nil
}
func (r *ReconcileAAQ) getNamespacedArgs(cr *aaqv1.AAQ) *aaqnamespaced.FactoryArgs {
result := *r.namespacedArgs
if cr != nil {
if cr.Spec.ImagePullPolicy != "" {
result.PullPolicy = string(cr.Spec.ImagePullPolicy)
}
if cr.Spec.PriorityClass != nil && string(*cr.Spec.PriorityClass) != "" {
result.PriorityClassName = string(*cr.Spec.PriorityClass)
} else {
result.PriorityClassName = util.AAQPriorityClass
}
// Verify the priority class name exists.
priorityClass := &schedulingv1.PriorityClass{}
if err := r.client.Get(context.TODO(), types.NamespacedName{Name: result.PriorityClassName}, priorityClass); err != nil {
// Any error we cannot determine if priority class exists.
result.PriorityClassName = ""
}
result.InfraNodePlacement = &cr.Spec.Infra
result.Client = r.client
}
return &result
}
// GetAllResources provides slice of resources AAQ depends on
func (r *ReconcileAAQ) GetAllResources(crObject client.Object) ([]client.Object, error) {
cr := crObject.(*aaqv1.AAQ)
var resources []client.Object
if sdk.DeployClusterResources() {
crs, err := aaqcluster.CreateAllStaticResources(r.clusterArgs)
if err != nil {
sdk.MarkCrFailedHealing(cr, r.Status(cr), "CreateResources", "Unable to create all resources", r.recorder)
return nil, err
}
resources = append(resources, crs...)
}
nsrs, err := aaqnamespaced.CreateAllResources(r.getNamespacedArgs(cr))
if err != nil {
sdk.MarkCrFailedHealing(cr, r.Status(cr), "CreateNamespaceResources", "Unable to create all namespaced resources", r.recorder)
return nil, err
}
resources = append(resources, nsrs...)
drs, err := aaqcluster.CreateAllDynamicResources(r.clusterArgs)
if err != nil {
sdk.MarkCrFailedHealing(cr, r.Status(cr), "CreateDynamicResources", "Unable to create all dynamic resources", r.recorder)
return nil, err
}
resources = append(resources, drs...)
certs := r.getCertificateDefinitions(cr)
for _, cert := range certs {
if cert.SignerSecret != nil {
resources = append(resources, cert.SignerSecret)
}
if cert.CertBundleConfigmap != nil {
resources = append(resources, cert.CertBundleConfigmap)
}
if cert.TargetSecret != nil {
resources = append(resources, cert.TargetSecret)
}
}
return resources, nil
}