-
Notifications
You must be signed in to change notification settings - Fork 91
/
operator.go
110 lines (90 loc) · 3 KB
/
operator.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
package operator
import (
"bytes"
"encoding/json"
"fmt"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"github.com/openshift/library-go/pkg/operator/resource/resourcemerge"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
"gopkg.in/yaml.v2"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/informers/core/v1"
coreclientv1 "k8s.io/client-go/kubernetes/typed/core/v1"
"github.com/openshift/cluster-osin-operator/pkg/boilerplate/operator"
)
const (
targetNamespaceName = "kube-system"
targetConfigMap = "cluster-config-v1"
targtKubeAPIServerOperatorConfig = "instance"
)
var kubeAPIServerOperatorConfigGVR = schema.GroupVersionResource{
Group: "kubeapiserver.operator.openshift.io",
Version: "v1alpha1",
Resource: "kubeapiserveroperatorconfigs",
}
type osinOperator struct {
configMap coreclientv1.ConfigMapsGetter
kubeAPIServerOperatorConfig dynamic.ResourceInterface
}
func NewOsinOperator(cmi v1.ConfigMapInformer, cm coreclientv1.ConfigMapsGetter, dynamicClient dynamic.Interface) operator.Runner {
c := &osinOperator{
configMap: cm,
kubeAPIServerOperatorConfig: dynamicClient.Resource(kubeAPIServerOperatorConfigGVR),
}
return operator.New("OsinOperator", c,
operator.WithInformer(cmi, operator.FilterByNames(targetConfigMap)),
)
}
func (c osinOperator) Key() (metav1.Object, error) {
return c.configMap.ConfigMaps(targetNamespaceName).Get(targetConfigMap, metav1.GetOptions{})
}
func (c osinOperator) Sync(obj metav1.Object) error {
configMap := obj.(*corev1.ConfigMap)
installConfig := configMap.Data["install-config"]
if len(installConfig) == 0 {
return fmt.Errorf("no data: %#v", configMap)
}
ic := &InstallConfig{}
if err := yaml.Unmarshal([]byte(installConfig), ic); err != nil {
return err
}
apiServerOperatorConfig, err := c.kubeAPIServerOperatorConfig.Get(targtKubeAPIServerOperatorConfig, metav1.GetOptions{})
if err != nil {
return err
}
apiServerOperatorConfigBytes, err := apiServerOperatorConfig.MarshalJSON()
if err != nil {
return err
}
apiURL := getAPIServerURL(ic)
expectedOAuthConfig := map[string]interface{}{
"spec": map[string]interface{}{
"unsupportedConfigOverrides": map[string]interface{}{
"oauthConfig": map[string]interface{}{
"masterPublicURL": apiURL,
"masterURL": apiURL,
"masterCA": "/etc/kubernetes/static-pod-resources/configmaps/client-ca/ca-bundle.crt",
},
},
},
}
expectedOAuthConfigBytes, err := json.Marshal(expectedOAuthConfig)
if err != nil {
return err
}
mergedBytes, err := resourcemerge.MergeProcessConfig(nil, apiServerOperatorConfigBytes, expectedOAuthConfigBytes)
if err != nil {
return err
}
if bytes.Equal(mergedBytes, apiServerOperatorConfigBytes) {
return nil
}
out := &unstructured.Unstructured{}
if err := out.UnmarshalJSON(mergedBytes); err != nil {
return err
}
_, updateErr := c.kubeAPIServerOperatorConfig.Update(out)
return updateErr
}