Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit b1297c0

Browse files
committedJun 16, 2020
Allow user workload monitoring configuration configmap to be created in
openshift-user-workload-monitoring namespace
1 parent 50285e2 commit b1297c0

17 files changed

+653
-298
lines changed
 

‎CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44

55
- [#714](https://github.com/openshift/cluster-monitoring-operator/pull/714) Validate new/updated PrometheusRule custom resources against the prometheus-operator rule validation API.
66
- [#799](https://github.com/openshift/cluster-monitoring-operator/pull/799) Rules federation support.
7+
- [#804](https://github.com/openshift/cluster-monitoring-operator/pull/804) Allow user workload monitoring configuration ConfigMap to be created in openshift-user-workload-monitoring namespace.

‎cmd/operator/main.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@ func Main() int {
155155
return 1
156156
}
157157

158-
o, err := cmo.New(config, *releaseVersion, *namespace, *namespaceUserWorkload, *namespaceSelector, *configMapName, *remoteWrite, images.asMap(), telemetryConfig.Matches)
158+
userWorkloadConfigMapName := "user-workload-monitoring-config"
159+
o, err := cmo.New(config, *releaseVersion, *namespace, *namespaceUserWorkload, *namespaceSelector, *configMapName, userWorkloadConfigMapName, *remoteWrite, images.asMap(), telemetryConfig.Matches)
159160
if err != nil {
160161
fmt.Fprint(os.Stderr, err)
161162
return 1

‎examples/config/config.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ prometheusK8s:
1111
cpu: 200m
1212
memory: 2Gi
1313
alertmanagerMain:
14+
volumeClaimTemplate:
15+
spec:
16+
resources:
17+
requests:
18+
storage: 15Gi
1419
baseImage: quay.io/prometheus/alertmanager
1520
externalUrl: https://monitoring-demo.staging.core-os.net/alertmanager
1621
resources:

‎examples/user-workload/1q

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
apiVersion: v1
2+
kind: ConfigMap
3+
metadata:
4+
name: user-workload-monitoring-config
5+
namespace: openshift-user-workload-monitoring
6+
data:
7+
config.yaml: |
8+
prometheusOperator:
9+
resources:
10+
requests:
11+
cpu: 200m
12+
memory: 2Gi
13+
prometheus:
14+
retention: 24h
15+
resources:
16+
requests:
17+
cpu: 200m
18+
memory: 2Gi
19+
thanos:
20+
resources:
21+
requests:
22+
cpu: 20m
23+
memory: 50Mi
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
apiVersion: v1
2+
kind: ConfigMap
3+
metadata:
4+
name: user-workload-monitoring-config
5+
namespace: openshift-user-workload-monitoring
6+
data:
7+
config.yaml: |
8+
prometheusOperator:
9+
resources:
10+
requests:
11+
cpu: 200m
12+
memory: 2Gi
13+
prometheus:
14+
retention: 24h
15+
resources:
16+
requests:
17+
cpu: 200m
18+
memory: 2Gi
19+
thanosRuler:
20+
resources:
21+
requests:
22+
cpu: 20m
23+
memory: 50Mi

‎pkg/manifests/config.go

+141-73
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,28 @@ type Config struct {
3131
RemoteWrite bool `json:"-"`
3232
Platform configv1.PlatformType `json:"-"`
3333

34-
PrometheusOperatorConfig *PrometheusOperatorConfig `json:"prometheusOperator"`
35-
PrometheusOperatorUserWorkloadConfig *PrometheusOperatorConfig `json:"prometheusOperatorUserWorkload"`
36-
37-
PrometheusK8sConfig *PrometheusK8sConfig `json:"prometheusK8s"`
38-
PrometheusUserWorkloadConfig *PrometheusK8sConfig `json:"prometheusUserWorkload"`
34+
ClusterMonitoringConfiguration *ClusterMonitoringConfiguration `json:"-"`
35+
UserWorkloadConfiguration *UserWorkloadConfiguration `json:"-"`
36+
}
3937

40-
AlertmanagerMainConfig *AlertmanagerMainConfig `json:"alertmanagerMain"`
41-
KubeStateMetricsConfig *KubeStateMetricsConfig `json:"kubeStateMetrics"`
42-
OpenShiftMetricsConfig *OpenShiftStateMetricsConfig `json:"openshiftStateMetrics"`
43-
GrafanaConfig *GrafanaConfig `json:"grafana"`
44-
EtcdConfig *EtcdConfig `json:"-"`
45-
HTTPConfig *HTTPConfig `json:"http"`
46-
TelemeterClientConfig *TelemeterClientConfig `json:"telemeterClient"`
47-
K8sPrometheusAdapter *K8sPrometheusAdapter `json:"k8sPrometheusAdapter"`
48-
UserWorkloadConfig *UserWorkloadConfig `json:"techPreviewUserWorkload"`
49-
ThanosRulerConfig *ThanosRulerConfig `json:"thanosRuler"`
50-
ThanosQuerierConfig *ThanosQuerierConfig `json:"thanosQuerier"`
38+
type ClusterMonitoringConfiguration struct {
39+
PrometheusOperatorConfig *PrometheusOperatorConfig `json:"prometheusOperator"`
40+
PrometheusK8sConfig *PrometheusK8sConfig `json:"prometheusK8s"`
41+
AlertmanagerMainConfig *AlertmanagerMainConfig `json:"alertmanagerMain"`
42+
KubeStateMetricsConfig *KubeStateMetricsConfig `json:"kubeStateMetrics"`
43+
OpenShiftMetricsConfig *OpenShiftStateMetricsConfig `json:"openshiftStateMetrics"`
44+
GrafanaConfig *GrafanaConfig `json:"grafana"`
45+
EtcdConfig *EtcdConfig `json:"-"`
46+
HTTPConfig *HTTPConfig `json:"http"`
47+
TelemeterClientConfig *TelemeterClientConfig `json:"telemeterClient"`
48+
K8sPrometheusAdapter *K8sPrometheusAdapter `json:"k8sPrometheusAdapter"`
49+
ThanosQuerierConfig *ThanosQuerierConfig `json:"thanosQuerier"`
50+
UserWorkloadEnabled *bool `json:"enableUserWorkload"`
51+
// TODO: Remove in 4.7 release.
52+
PrometheusUserWorkloadConfig *PrometheusK8sConfig `json:"prometheusUserWorkload"`
53+
PrometheusOperatorUserWorkloadConfig *PrometheusOperatorConfig `json:"prometheusOperatorUserWorkload"`
54+
ThanosRulerConfig *ThanosRulerConfig `json:"thanosRuler"`
55+
UserWorkloadConfig *UserWorkloadConfig `json:"techPreviewUserWorkload"`
5156
}
5257

5358
type Images struct {
@@ -75,11 +80,13 @@ type HTTPConfig struct {
7580
}
7681

7782
type PrometheusOperatorConfig struct {
83+
LogLevel string `json:"logLevel"`
7884
NodeSelector map[string]string `json:"nodeSelector"`
7985
Tolerations []v1.Toleration `json:"tolerations"`
8086
}
8187

8288
type PrometheusK8sConfig struct {
89+
LogLevel string `json:"logLevel"`
8390
Retention string `json:"retention"`
8491
NodeSelector map[string]string `json:"nodeSelector"`
8592
Tolerations []v1.Toleration `json:"tolerations"`
@@ -100,6 +107,7 @@ type AlertmanagerMainConfig struct {
100107
}
101108

102109
type ThanosRulerConfig struct {
110+
LogLevel string `json:"logLevel"`
103111
NodeSelector map[string]string `json:"nodeSelector"`
104112
Tolerations []v1.Toleration `json:"tolerations"`
105113
Resources *v1.ResourceRequirements `json:"resources"`
@@ -150,15 +158,6 @@ type UserWorkloadConfig struct {
150158
Enabled *bool `json:"enabled"`
151159
}
152160

153-
// IsEnabled returns the underlying value of the `Enabled` boolean pointer.
154-
// It defaults to false if the pointer is nil.
155-
func (c *UserWorkloadConfig) IsEnabled() bool {
156-
if c.Enabled == nil {
157-
return false
158-
}
159-
return *c.Enabled
160-
}
161-
162161
type TelemeterClientConfig struct {
163162
ClusterID string `json:"clusterID"`
164163
Enabled *bool `json:"enabled"`
@@ -184,14 +183,15 @@ func (cfg *TelemeterClientConfig) IsEnabled() bool {
184183

185184
func NewConfig(content io.Reader) (*Config, error) {
186185
c := Config{}
187-
188-
err := k8syaml.NewYAMLOrJSONDecoder(content, 100).Decode(&c)
186+
cmc := ClusterMonitoringConfiguration{}
187+
err := k8syaml.NewYAMLOrJSONDecoder(content, 4096).Decode(&cmc)
189188
if err != nil {
190189
return nil, err
191190
}
192-
191+
c.ClusterMonitoringConfiguration = &cmc
193192
res := &c
194193
res.applyDefaults()
194+
c.UserWorkloadConfiguration = NewDefaultUserWorkloadMonitoringConfig()
195195

196196
return res, nil
197197
}
@@ -200,58 +200,65 @@ func (c *Config) applyDefaults() {
200200
if c.Images == nil {
201201
c.Images = &Images{}
202202
}
203-
if c.PrometheusOperatorConfig == nil {
204-
c.PrometheusOperatorConfig = &PrometheusOperatorConfig{}
203+
if c.ClusterMonitoringConfiguration == nil {
204+
c.ClusterMonitoringConfiguration = &ClusterMonitoringConfiguration{}
205+
}
206+
if c.ClusterMonitoringConfiguration.PrometheusOperatorConfig == nil {
207+
c.ClusterMonitoringConfiguration.PrometheusOperatorConfig = &PrometheusOperatorConfig{}
205208
}
206-
if c.PrometheusOperatorUserWorkloadConfig == nil {
207-
c.PrometheusOperatorUserWorkloadConfig = &PrometheusOperatorConfig{}
209+
if c.ClusterMonitoringConfiguration.PrometheusOperatorUserWorkloadConfig == nil {
210+
c.ClusterMonitoringConfiguration.PrometheusOperatorUserWorkloadConfig = &PrometheusOperatorConfig{}
208211
}
209-
if c.PrometheusK8sConfig == nil {
210-
c.PrometheusK8sConfig = &PrometheusK8sConfig{}
212+
if c.ClusterMonitoringConfiguration.PrometheusK8sConfig == nil {
213+
c.ClusterMonitoringConfiguration.PrometheusK8sConfig = &PrometheusK8sConfig{}
211214
}
212-
if c.PrometheusK8sConfig.Retention == "" {
213-
c.PrometheusK8sConfig.Retention = "15d"
215+
if c.ClusterMonitoringConfiguration.PrometheusK8sConfig.Retention == "" {
216+
c.ClusterMonitoringConfiguration.PrometheusK8sConfig.Retention = "15d"
214217
}
215-
if c.PrometheusUserWorkloadConfig == nil {
216-
c.PrometheusUserWorkloadConfig = &PrometheusK8sConfig{}
218+
if c.ClusterMonitoringConfiguration.PrometheusUserWorkloadConfig == nil {
219+
c.ClusterMonitoringConfiguration.PrometheusUserWorkloadConfig = &PrometheusK8sConfig{}
217220
}
218-
if c.PrometheusUserWorkloadConfig.Retention == "" {
219-
c.PrometheusUserWorkloadConfig.Retention = "15d"
221+
if c.ClusterMonitoringConfiguration.PrometheusUserWorkloadConfig.Retention == "" {
222+
c.ClusterMonitoringConfiguration.PrometheusUserWorkloadConfig.Retention = "15d"
220223
}
221-
if c.AlertmanagerMainConfig == nil {
222-
c.AlertmanagerMainConfig = &AlertmanagerMainConfig{}
224+
if c.ClusterMonitoringConfiguration.AlertmanagerMainConfig == nil {
225+
c.ClusterMonitoringConfiguration.AlertmanagerMainConfig = &AlertmanagerMainConfig{}
223226
}
224-
if c.ThanosRulerConfig == nil {
225-
c.ThanosRulerConfig = &ThanosRulerConfig{}
227+
if c.ClusterMonitoringConfiguration.UserWorkloadEnabled == nil {
228+
disable := false
229+
c.ClusterMonitoringConfiguration.UserWorkloadEnabled = &disable
226230
}
227-
if c.ThanosQuerierConfig == nil {
228-
c.ThanosQuerierConfig = &ThanosQuerierConfig{}
231+
if c.ClusterMonitoringConfiguration.ThanosRulerConfig == nil {
232+
c.ClusterMonitoringConfiguration.ThanosRulerConfig = &ThanosRulerConfig{}
229233
}
230-
if c.GrafanaConfig == nil {
231-
c.GrafanaConfig = &GrafanaConfig{}
234+
if c.ClusterMonitoringConfiguration.ThanosQuerierConfig == nil {
235+
c.ClusterMonitoringConfiguration.ThanosQuerierConfig = &ThanosQuerierConfig{}
232236
}
233-
if c.KubeStateMetricsConfig == nil {
234-
c.KubeStateMetricsConfig = &KubeStateMetricsConfig{}
237+
if c.ClusterMonitoringConfiguration.GrafanaConfig == nil {
238+
c.ClusterMonitoringConfiguration.GrafanaConfig = &GrafanaConfig{}
235239
}
236-
if c.OpenShiftMetricsConfig == nil {
237-
c.OpenShiftMetricsConfig = &OpenShiftStateMetricsConfig{}
240+
if c.ClusterMonitoringConfiguration.KubeStateMetricsConfig == nil {
241+
c.ClusterMonitoringConfiguration.KubeStateMetricsConfig = &KubeStateMetricsConfig{}
238242
}
239-
if c.HTTPConfig == nil {
240-
c.HTTPConfig = &HTTPConfig{}
243+
if c.ClusterMonitoringConfiguration.OpenShiftMetricsConfig == nil {
244+
c.ClusterMonitoringConfiguration.OpenShiftMetricsConfig = &OpenShiftStateMetricsConfig{}
241245
}
242-
if c.TelemeterClientConfig == nil {
243-
c.TelemeterClientConfig = &TelemeterClientConfig{
246+
if c.ClusterMonitoringConfiguration.HTTPConfig == nil {
247+
c.ClusterMonitoringConfiguration.HTTPConfig = &HTTPConfig{}
248+
}
249+
if c.ClusterMonitoringConfiguration.TelemeterClientConfig == nil {
250+
c.ClusterMonitoringConfiguration.TelemeterClientConfig = &TelemeterClientConfig{
244251
TelemeterServerURL: "https://infogw.api.openshift.com/",
245252
}
246253
}
247-
if c.K8sPrometheusAdapter == nil {
248-
c.K8sPrometheusAdapter = &K8sPrometheusAdapter{}
254+
if c.ClusterMonitoringConfiguration.K8sPrometheusAdapter == nil {
255+
c.ClusterMonitoringConfiguration.K8sPrometheusAdapter = &K8sPrometheusAdapter{}
249256
}
250-
if c.EtcdConfig == nil {
251-
c.EtcdConfig = &EtcdConfig{}
257+
if c.ClusterMonitoringConfiguration.EtcdConfig == nil {
258+
c.ClusterMonitoringConfiguration.EtcdConfig = &EtcdConfig{}
252259
}
253-
if c.UserWorkloadConfig == nil {
254-
c.UserWorkloadConfig = &UserWorkloadConfig{}
260+
if c.ClusterMonitoringConfiguration.UserWorkloadConfig == nil {
261+
c.ClusterMonitoringConfiguration.UserWorkloadConfig = &UserWorkloadConfig{}
255262
}
256263
}
257264

@@ -274,18 +281,18 @@ func (c *Config) SetImages(images map[string]string) {
274281
}
275282

276283
func (c *Config) SetTelemetryMatches(matches []string) {
277-
c.PrometheusK8sConfig.TelemetryMatches = matches
284+
c.ClusterMonitoringConfiguration.PrometheusK8sConfig.TelemetryMatches = matches
278285
}
279286

280287
func (c *Config) SetRemoteWrite(rw bool) {
281288
c.RemoteWrite = rw
282-
if c.RemoteWrite && c.TelemeterClientConfig.TelemeterServerURL == "https://infogw.api.openshift.com/" {
283-
c.TelemeterClientConfig.TelemeterServerURL = "https://infogw.api.openshift.com/metrics/v1/receive"
289+
if c.RemoteWrite && c.ClusterMonitoringConfiguration.TelemeterClientConfig.TelemeterServerURL == "https://infogw.api.openshift.com/" {
290+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.TelemeterServerURL = "https://infogw.api.openshift.com/metrics/v1/receive"
284291
}
285292
}
286293

287294
func (c *Config) LoadClusterID(load func() (*configv1.ClusterVersion, error)) error {
288-
if c.TelemeterClientConfig.ClusterID != "" {
295+
if c.ClusterMonitoringConfiguration.TelemeterClientConfig.ClusterID != "" {
289296
return nil
290297
}
291298

@@ -294,12 +301,12 @@ func (c *Config) LoadClusterID(load func() (*configv1.ClusterVersion, error)) er
294301
return fmt.Errorf("error loading cluster version: %v", err)
295302
}
296303

297-
c.TelemeterClientConfig.ClusterID = string(cv.Spec.ClusterID)
304+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.ClusterID = string(cv.Spec.ClusterID)
298305
return nil
299306
}
300307

301308
func (c *Config) LoadToken(load func() (*v1.Secret, error)) error {
302-
if c.TelemeterClientConfig.Token != "" {
309+
if c.ClusterMonitoringConfiguration.TelemeterClientConfig.Token != "" {
303310
return nil
304311
}
305312

@@ -324,12 +331,12 @@ func (c *Config) LoadToken(load func() (*v1.Secret, error)) error {
324331
return fmt.Errorf("unmarshaling pull secret failed: %v", err)
325332
}
326333

327-
c.TelemeterClientConfig.Token = ps.Auths.COC.Auth
334+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.Token = ps.Auths.COC.Auth
328335
return nil
329336
}
330337

331338
func (c *Config) LoadProxy(load func() (*configv1.Proxy, error)) error {
332-
if c.HTTPConfig.HTTPProxy != "" || c.HTTPConfig.HTTPSProxy != "" || c.HTTPConfig.NoProxy != "" {
339+
if c.ClusterMonitoringConfiguration.HTTPConfig.HTTPProxy != "" || c.ClusterMonitoringConfiguration.HTTPConfig.HTTPSProxy != "" || c.ClusterMonitoringConfiguration.HTTPConfig.NoProxy != "" {
333340
return nil
334341
}
335342

@@ -338,9 +345,9 @@ func (c *Config) LoadProxy(load func() (*configv1.Proxy, error)) error {
338345
return fmt.Errorf("error loading proxy: %v", err)
339346
}
340347

341-
c.HTTPConfig.HTTPProxy = p.Status.HTTPProxy
342-
c.HTTPConfig.HTTPSProxy = p.Status.HTTPSProxy
343-
c.HTTPConfig.NoProxy = p.Status.NoProxy
348+
c.ClusterMonitoringConfiguration.HTTPConfig.HTTPProxy = p.Status.HTTPProxy
349+
c.ClusterMonitoringConfiguration.HTTPConfig.HTTPSProxy = p.Status.HTTPSProxy
350+
c.ClusterMonitoringConfiguration.HTTPConfig.NoProxy = p.Status.NoProxy
344351

345352
return nil
346353
}
@@ -364,6 +371,67 @@ func NewConfigFromString(content string) (*Config, error) {
364371

365372
func NewDefaultConfig() *Config {
366373
c := &Config{}
374+
cmc := ClusterMonitoringConfiguration{}
375+
c.ClusterMonitoringConfiguration = &cmc
376+
c.UserWorkloadConfiguration = NewDefaultUserWorkloadMonitoringConfig()
367377
c.applyDefaults()
368378
return c
369379
}
380+
381+
type UserWorkloadConfiguration struct {
382+
PrometheusOperator *PrometheusOperatorConfig `json:"prometheusOperator"`
383+
Prometheus *PrometheusK8sConfig `json:"prometheus"`
384+
ThanosRuler *ThanosRulerConfig `json:"thanosRuler"`
385+
}
386+
387+
func (u *UserWorkloadConfiguration) applyDefaults() {
388+
if u.PrometheusOperator == nil {
389+
u.PrometheusOperator = &PrometheusOperatorConfig{}
390+
}
391+
if u.Prometheus == nil {
392+
u.Prometheus = &PrometheusK8sConfig{}
393+
}
394+
if u.ThanosRuler == nil {
395+
u.ThanosRuler = &ThanosRulerConfig{}
396+
}
397+
}
398+
399+
func NewUserConfigFromString(content string) (*UserWorkloadConfiguration, error) {
400+
if content == "" {
401+
return NewDefaultUserWorkloadMonitoringConfig(), nil
402+
}
403+
u := &UserWorkloadConfiguration{}
404+
err := k8syaml.NewYAMLOrJSONDecoder(bytes.NewBuffer([]byte(content)), 100).Decode(&u)
405+
if err != nil {
406+
return nil, err
407+
}
408+
409+
u.applyDefaults()
410+
411+
return u, nil
412+
}
413+
414+
func NewDefaultUserWorkloadMonitoringConfig() *UserWorkloadConfiguration {
415+
u := &UserWorkloadConfiguration{}
416+
u.applyDefaults()
417+
return u
418+
}
419+
420+
// IsUserWorkloadEnabled checks if user workload monitoring is
421+
// enabled on old or new configuration.
422+
func (c *Config) IsUserWorkloadEnabled() bool {
423+
if *c.ClusterMonitoringConfiguration.UserWorkloadEnabled == true {
424+
return true
425+
}
426+
427+
return c.ClusterMonitoringConfiguration.UserWorkloadConfig.isEnabled()
428+
}
429+
430+
// isEnabled returns the underlying value of the `Enabled` boolean pointer.
431+
// It defaults to false if the pointer is nil.
432+
func (c *UserWorkloadConfig) isEnabled() bool {
433+
if c.Enabled == nil {
434+
return false
435+
}
436+
return *c.Enabled
437+
}

‎pkg/manifests/config_test.go

+39-6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package manifests
1717
import (
1818
"errors"
1919
"fmt"
20+
"io/ioutil"
2021
"os"
2122
"testing"
2223

@@ -28,11 +29,36 @@ func TestConfigParsing(t *testing.T) {
2829
if err != nil {
2930
t.Fatal(err)
3031
}
32+
c, err := NewConfig(f)
33+
if err != nil {
34+
t.Fatal(err)
35+
}
36+
37+
if c.ClusterMonitoringConfiguration.AlertmanagerMainConfig.VolumeClaimTemplate == nil {
38+
t.Fatal("config parsing failed: AlertmanagerMainConfig VolumeClaimTemplate was not parsed correctly")
39+
}
40+
}
41+
42+
func TestNewUserConfigFromStringParsing(t *testing.T) {
43+
c, err := ioutil.ReadFile("../../examples/user-workload/cluster-monitoring-configmap.yaml")
44+
if err != nil {
45+
t.Fatal(err)
46+
}
3147

32-
_, err = NewConfig(f)
48+
uwmc, err := NewUserConfigFromString(string(c))
3349
if err != nil {
3450
t.Fatal(err)
3551
}
52+
53+
if uwmc.PrometheusOperator == nil {
54+
t.Fatal("config parsing failed: Prometheus Operator was not parsed correctly")
55+
}
56+
if uwmc.Prometheus == nil {
57+
t.Fatal("config parsing failed: Prometheus was not parsed correctly")
58+
}
59+
if uwmc.ThanosRuler == nil {
60+
t.Fatal("config parsing failed: Thanos was not parsed correctly")
61+
}
3662
}
3763

3864
func TestEmptyConfigIsValid(t *testing.T) {
@@ -42,6 +68,13 @@ func TestEmptyConfigIsValid(t *testing.T) {
4268
}
4369
}
4470

71+
func TestEmptyUserConfigIsValid(t *testing.T) {
72+
_, err := NewUserConfigFromString("")
73+
if err != nil {
74+
t.Fatal(err)
75+
}
76+
}
77+
4578
func TestTelemeterClientConfig(t *testing.T) {
4679
truev, falsev := true, false
4780

@@ -146,14 +179,14 @@ func TestEtcdDefaultsToDisabled(t *testing.T) {
146179
if err != nil {
147180
t.Fatal(err)
148181
}
149-
if c.EtcdConfig.IsEnabled() {
182+
if c.ClusterMonitoringConfiguration.EtcdConfig.IsEnabled() {
150183
t.Error("an empty configuration should have etcd disabled")
151184
}
152185
c, err = NewConfigFromString(`{"etcd":{}}`)
153186
if err != nil {
154187
t.Fatal(err)
155188
}
156-
if c.EtcdConfig.IsEnabled() {
189+
if c.ClusterMonitoringConfiguration.EtcdConfig.IsEnabled() {
157190
t.Error("an empty etcd configuration should have etcd disabled")
158191
}
159192
}
@@ -183,7 +216,7 @@ func hasError(expected bool) configCheckFunc {
183216
func TestLoadProxy(t *testing.T) {
184217
hasHTTPProxy := func(expected string) configCheckFunc {
185218
return configCheckFunc(func(c *Config, _ error) error {
186-
if got := c.HTTPConfig.HTTPProxy; got != expected {
219+
if got := c.ClusterMonitoringConfiguration.HTTPConfig.HTTPProxy; got != expected {
187220
return fmt.Errorf("want http proxy %v, got %v", expected, got)
188221
}
189222
return nil
@@ -192,7 +225,7 @@ func TestLoadProxy(t *testing.T) {
192225

193226
hasHTTPSProxy := func(expected string) configCheckFunc {
194227
return configCheckFunc(func(c *Config, _ error) error {
195-
if got := c.HTTPConfig.HTTPSProxy; got != expected {
228+
if got := c.ClusterMonitoringConfiguration.HTTPConfig.HTTPSProxy; got != expected {
196229
return fmt.Errorf("want https proxy %v, got %v", expected, got)
197230
}
198231
return nil
@@ -201,7 +234,7 @@ func TestLoadProxy(t *testing.T) {
201234

202235
hasNoProxy := func(expected string) configCheckFunc {
203236
return configCheckFunc(func(c *Config, _ error) error {
204-
if got := c.HTTPConfig.NoProxy; got != expected {
237+
if got := c.ClusterMonitoringConfiguration.HTTPConfig.NoProxy; got != expected {
205238
return fmt.Errorf("want noproxy %v, got %v", expected, got)
206239
}
207240
return nil

‎pkg/manifests/manifests.go

+227-147
Large diffs are not rendered by default.

‎pkg/manifests/manifests_test.go

+18-18
Original file line numberDiff line numberDiff line change
@@ -784,8 +784,8 @@ func TestPrometheusK8sRemoteWrite(t *testing.T) {
784784
t.Fatal(err)
785785
}
786786

787-
c.TelemeterClientConfig.ClusterID = "123"
788-
c.TelemeterClientConfig.Token = "secret"
787+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.ClusterID = "123"
788+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.Token = "secret"
789789

790790
return c
791791
},
@@ -801,9 +801,9 @@ func TestPrometheusK8sRemoteWrite(t *testing.T) {
801801
t.Fatal(err)
802802
}
803803

804-
c.TelemeterClientConfig.ClusterID = "123"
805-
c.TelemeterClientConfig.Token = "secret"
806-
c.PrometheusK8sConfig.RemoteWrite = []monv1.RemoteWriteSpec{{URL: "http://custom"}}
804+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.ClusterID = "123"
805+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.Token = "secret"
806+
c.ClusterMonitoringConfiguration.PrometheusK8sConfig.RemoteWrite = []monv1.RemoteWriteSpec{{URL: "http://custom"}}
807807

808808
return c
809809
},
@@ -822,8 +822,8 @@ func TestPrometheusK8sRemoteWrite(t *testing.T) {
822822
}
823823

824824
c.SetRemoteWrite(true)
825-
c.TelemeterClientConfig.ClusterID = "123"
826-
c.TelemeterClientConfig.Token = "secret"
825+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.ClusterID = "123"
826+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.Token = "secret"
827827

828828
return c
829829
},
@@ -842,9 +842,9 @@ func TestPrometheusK8sRemoteWrite(t *testing.T) {
842842
}
843843

844844
c.SetRemoteWrite(true)
845-
c.TelemeterClientConfig.ClusterID = "123"
846-
c.TelemeterClientConfig.Token = "secret"
847-
c.PrometheusK8sConfig.RemoteWrite = []monv1.RemoteWriteSpec{{URL: "http://custom"}}
845+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.ClusterID = "123"
846+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.Token = "secret"
847+
c.ClusterMonitoringConfiguration.PrometheusK8sConfig.RemoteWrite = []monv1.RemoteWriteSpec{{URL: "http://custom"}}
848848

849849
return c
850850
},
@@ -864,10 +864,10 @@ func TestPrometheusK8sRemoteWrite(t *testing.T) {
864864
}
865865

866866
c.SetRemoteWrite(true)
867-
c.TelemeterClientConfig.TelemeterServerURL = "http://custom-telemeter"
868-
c.TelemeterClientConfig.ClusterID = "123"
869-
c.TelemeterClientConfig.Token = "secret"
870-
c.PrometheusK8sConfig.RemoteWrite = []monv1.RemoteWriteSpec{{URL: "http://custom-remote-write"}}
867+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.TelemeterServerURL = "http://custom-telemeter"
868+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.ClusterID = "123"
869+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.Token = "secret"
870+
c.ClusterMonitoringConfiguration.PrometheusK8sConfig.RemoteWrite = []monv1.RemoteWriteSpec{{URL: "http://custom-remote-write"}}
871871

872872
return c
873873
},
@@ -1273,7 +1273,7 @@ func TestPrometheusK8sControlPlaneRulesFiltered(t *testing.T) {
12731273
func TestPrometheusEtcdRulesFiltered(t *testing.T) {
12741274
enabled := false
12751275
c := NewDefaultConfig()
1276-
c.EtcdConfig.Enabled = &enabled
1276+
c.ClusterMonitoringConfiguration.EtcdConfig.Enabled = &enabled
12771277
f := NewFactory("openshift-monitoring", "openshift-user-workload-monitoring", c)
12781278

12791279
r, err := f.PrometheusK8sRules()
@@ -1291,7 +1291,7 @@ func TestPrometheusEtcdRulesFiltered(t *testing.T) {
12911291
func TestPrometheusEtcdRules(t *testing.T) {
12921292
enabled := true
12931293
c := NewDefaultConfig()
1294-
c.EtcdConfig.Enabled = &enabled
1294+
c.ClusterMonitoringConfiguration.EtcdConfig.Enabled = &enabled
12951295
f := NewFactory("openshift-monitoring", "openshift-user-workload-monitoring", c)
12961296

12971297
r, err := f.PrometheusK8sRules()
@@ -1313,7 +1313,7 @@ func TestPrometheusEtcdRules(t *testing.T) {
13131313
func TestEtcdGrafanaDashboardFiltered(t *testing.T) {
13141314
enabled := false
13151315
c := NewDefaultConfig()
1316-
c.EtcdConfig.Enabled = &enabled
1316+
c.ClusterMonitoringConfiguration.EtcdConfig.Enabled = &enabled
13171317
f := NewFactory("openshift-monitoring", "openshift-user-workload-monitoring", c)
13181318

13191319
cms, err := f.GrafanaDashboardDefinitions()
@@ -1331,7 +1331,7 @@ func TestEtcdGrafanaDashboardFiltered(t *testing.T) {
13311331
func TestEtcdGrafanaDashboard(t *testing.T) {
13321332
enabled := true
13331333
c := NewDefaultConfig()
1334-
c.EtcdConfig.Enabled = &enabled
1334+
c.ClusterMonitoringConfiguration.EtcdConfig.Enabled = &enabled
13351335
f := NewFactory("openshift-monitoring", "openshift-user-workload-monitoring", c)
13361336

13371337
cms, err := f.GrafanaDashboardDefinitions()

‎pkg/operator/operator.go

+62-19
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/pkg/errors"
2323
"github.com/prometheus/client_golang/prometheus"
2424
v1 "k8s.io/api/core/v1"
25+
apierrors "k8s.io/apimachinery/pkg/api/errors"
2526
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2627
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
2728
"k8s.io/client-go/rest"
@@ -50,10 +51,11 @@ const (
5051
type Operator struct {
5152
namespace, namespaceUserWorkload string
5253

53-
configMapName string
54-
images map[string]string
55-
telemetryMatches []string
56-
remoteWrite bool
54+
configMapName string
55+
userWorkloadConfigMapName string
56+
images map[string]string
57+
telemetryMatches []string
58+
remoteWrite bool
5759

5860
client *client.Client
5961

@@ -69,21 +71,22 @@ type Operator struct {
6971
reconcileErrors prometheus.Counter
7072
}
7173

72-
func New(config *rest.Config, version, namespace, namespaceUserWorkload, namespaceSelector, configMapName string, remoteWrite bool, images map[string]string, telemetryMatches []string) (*Operator, error) {
74+
func New(config *rest.Config, version, namespace, namespaceUserWorkload, namespaceSelector, configMapName, userWorkloadConfigMapName string, remoteWrite bool, images map[string]string, telemetryMatches []string) (*Operator, error) {
7375
c, err := client.New(config, version, namespace, namespaceSelector)
7476
if err != nil {
7577
return nil, err
7678
}
7779

7880
o := &Operator{
79-
images: images,
80-
telemetryMatches: telemetryMatches,
81-
configMapName: configMapName,
82-
remoteWrite: remoteWrite,
83-
namespace: namespace,
84-
namespaceUserWorkload: namespaceUserWorkload,
85-
client: c,
86-
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "cluster-monitoring"),
81+
images: images,
82+
telemetryMatches: telemetryMatches,
83+
configMapName: configMapName,
84+
userWorkloadConfigMapName: userWorkloadConfigMapName,
85+
remoteWrite: remoteWrite,
86+
namespace: namespace,
87+
namespaceUserWorkload: namespaceUserWorkload,
88+
client: c,
89+
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "cluster-monitoring"),
8790
}
8891

8992
o.secretInf = cache.NewSharedIndexInformer(
@@ -229,6 +232,7 @@ func (o *Operator) handleEvent(obj interface{}) {
229232
klog.V(5).Infof("ConfigMap or Secret updated: %s", key)
230233

231234
cmoConfigMap := o.namespace + "/" + o.configMapName
235+
uwmConfigMap := o.namespaceUserWorkload + "/" + o.userWorkloadConfigMapName
232236

233237
switch key {
234238
case cmoConfigMap:
@@ -239,6 +243,7 @@ func (o *Operator) handleEvent(obj interface{}) {
239243
case telemeterCABundleConfigMap:
240244
case alertmanagerCABundleConfigMap:
241245
case grpcTLS:
246+
case uwmConfigMap:
242247
default:
243248
klog.V(5).Infof("ConfigMap or Secret (%s) not triggering an update.", key)
244249
return
@@ -312,20 +317,20 @@ func (o *Operator) sync(key string) error {
312317
o.client,
313318
[]*tasks.TaskSpec{
314319
tasks.NewTaskSpec("Updating Prometheus Operator", tasks.NewPrometheusOperatorTask(o.client, factory)),
315-
tasks.NewTaskSpec("Updating user workload Prometheus Operator", tasks.NewPrometheusOperatorUserWorkloadTask(o.client, factory, config.UserWorkloadConfig)),
320+
tasks.NewTaskSpec("Updating user workload Prometheus Operator", tasks.NewPrometheusOperatorUserWorkloadTask(o.client, factory, config)),
316321
tasks.NewTaskSpec("Updating Cluster Monitoring Operator", tasks.NewClusterMonitoringOperatorTask(o.client, factory)),
317322
tasks.NewTaskSpec("Updating Grafana", tasks.NewGrafanaTask(o.client, factory)),
318323
tasks.NewTaskSpec("Updating Prometheus-k8s", tasks.NewPrometheusTask(o.client, factory, config)),
319-
tasks.NewTaskSpec("Updating Prometheus-user-workload", tasks.NewPrometheusUserWorkloadTask(o.client, factory, config.UserWorkloadConfig)),
324+
tasks.NewTaskSpec("Updating Prometheus-user-workload", tasks.NewPrometheusUserWorkloadTask(o.client, factory, config)),
320325
tasks.NewTaskSpec("Updating Alertmanager", tasks.NewAlertmanagerTask(o.client, factory)),
321326
tasks.NewTaskSpec("Updating node-exporter", tasks.NewNodeExporterTask(o.client, factory)),
322327
tasks.NewTaskSpec("Updating kube-state-metrics", tasks.NewKubeStateMetricsTask(o.client, factory)),
323328
tasks.NewTaskSpec("Updating openshift-state-metrics", tasks.NewOpenShiftStateMetricsTask(o.client, factory)),
324329
tasks.NewTaskSpec("Updating prometheus-adapter", tasks.NewPrometheusAdapterTaks(o.namespace, o.client, factory)),
325330
tasks.NewTaskSpec("Updating Telemeter client", tasks.NewTelemeterClientTask(o.client, factory, config)),
326331
tasks.NewTaskSpec("Updating configuration sharing", tasks.NewConfigSharingTask(o.client, factory)),
327-
tasks.NewTaskSpec("Updating Thanos Querier", tasks.NewThanosQuerierTask(o.client, factory, config.UserWorkloadConfig)),
328-
tasks.NewTaskSpec("Updating User Workload Thanos Ruler", tasks.NewThanosRulerUserWorkloadTask(o.client, factory, config.UserWorkloadConfig)),
332+
tasks.NewTaskSpec("Updating Thanos Querier", tasks.NewThanosQuerierTask(o.client, factory, config)),
333+
tasks.NewTaskSpec("Updating User Workload Thanos Ruler", tasks.NewThanosRulerUserWorkloadTask(o.client, factory, config)),
329334
},
330335
)
331336

@@ -355,6 +360,32 @@ func (o *Operator) sync(key string) error {
355360
return nil
356361
}
357362

363+
func (o *Operator) loadUserWorkloadConfig() (*manifests.UserWorkloadConfiguration, error) {
364+
userCM, err := o.client.GetConfigmap(o.namespaceUserWorkload, o.userWorkloadConfigMapName)
365+
if err != nil {
366+
if apierrors.IsNotFound(err) {
367+
klog.Warning("No User Workload Monitoring ConfigMap was found. Using defaults.")
368+
return manifests.NewDefaultUserWorkloadMonitoringConfig(), nil
369+
} else {
370+
klog.Warningf("Error loading User Workload Monitoring ConfigMap. Error: %v", err)
371+
return nil, errors.Wrap(err, "the User Workload Monitoring ConfigMap could not be loaded")
372+
}
373+
}
374+
375+
configContent, found := userCM.Data["config.yaml"]
376+
if found {
377+
uwc, err := manifests.NewUserConfigFromString(configContent)
378+
if err != nil {
379+
klog.Warningf("Error creating User Workload Configuration from ConfigMap. Error: %v", err)
380+
return nil, errors.Wrap(err, "the User Workload ConfigMap ConfigMap could not be parsed")
381+
}
382+
return uwc, nil
383+
}
384+
385+
klog.Warning("No User Workload Monitoring ConfigMap was found. Using defaults.")
386+
return manifests.NewDefaultUserWorkloadMonitoringConfig(), nil
387+
}
388+
358389
func (o *Operator) loadConfig(key string) (*manifests.Config, error) {
359390
obj, found, err := o.cmapInf.GetStore().GetByKey(key)
360391
if err != nil {
@@ -374,6 +405,7 @@ func (o *Operator) loadConfig(key string) (*manifests.Config, error) {
374405
}
375406

376407
cParsed, err := manifests.NewConfigFromString(configContent)
408+
377409
if err != nil {
378410
return nil, errors.Wrap(err, "the Cluster Monitoring ConfigMap could not be parsed")
379411
}
@@ -387,8 +419,19 @@ func (o *Operator) Config(key string) (*manifests.Config, error) {
387419
return nil, err
388420
}
389421

422+
// Only use User Workload Monitoring ConfigMap from user ns and populate if
423+
// its enabled by admin via Cluster Monitoring ConfigMap. The above
424+
// loadConfig() already initializes the structs with nil values for
425+
// UserWorkloadConfiguration struct.
426+
if *c.ClusterMonitoringConfiguration.UserWorkloadEnabled {
427+
c.UserWorkloadConfiguration, err = o.loadUserWorkloadConfig()
428+
if err != nil {
429+
return nil, err
430+
}
431+
}
432+
390433
// Only fetch the token and cluster ID if they have not been specified in the config.
391-
if c.TelemeterClientConfig.ClusterID == "" || c.TelemeterClientConfig.Token == "" {
434+
if c.ClusterMonitoringConfiguration.TelemeterClientConfig.ClusterID == "" || c.ClusterMonitoringConfiguration.TelemeterClientConfig.Token == "" {
392435
err := c.LoadClusterID(func() (*configv1.ClusterVersion, error) {
393436
return o.client.GetClusterVersion("version")
394437
})
@@ -441,7 +484,7 @@ func (o *Operator) Config(key string) (*manifests.Config, error) {
441484
keyFound && len(keyContent) > 0 {
442485

443486
trueBool := true
444-
c.EtcdConfig.Enabled = &trueBool
487+
c.ClusterMonitoringConfiguration.EtcdConfig.Enabled = &trueBool
445488
}
446489

447490
return c, nil

‎pkg/tasks/prometheus.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ func (t *PrometheusTask) Run() error {
218218
return errors.Wrap(err, "reconciling Prometheus Service failed")
219219
}
220220

221-
if t.config.EtcdConfig.IsEnabled() {
221+
if t.config.ClusterMonitoringConfiguration.EtcdConfig.IsEnabled() {
222222
etcdCA, err := t.client.GetConfigmap("openshift-config", "etcd-metric-serving-ca")
223223
if err != nil {
224224
return errors.Wrap(err, "failed to load etcd client CA")
@@ -328,7 +328,7 @@ func (t *PrometheusTask) Run() error {
328328
return errors.Wrap(err, "initializing Prometheus etcd ServiceMonitor failed")
329329
}
330330

331-
if t.config.EtcdConfig.IsEnabled() {
331+
if t.config.ClusterMonitoringConfiguration.EtcdConfig.IsEnabled() {
332332
err = t.client.CreateOrUpdateServiceMonitor(sme)
333333
if err != nil {
334334
return errors.Wrap(err, "reconciling Prometheus etcd ServiceMonitor failed")

‎pkg/tasks/prometheus_user_workload.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,21 @@ import (
2323
)
2424

2525
type PrometheusUserWorkloadTask struct {
26-
client *client.Client
27-
factory *manifests.Factory
28-
userWorkloadConfig *manifests.UserWorkloadConfig
26+
client *client.Client
27+
factory *manifests.Factory
28+
config *manifests.Config
2929
}
3030

31-
func NewPrometheusUserWorkloadTask(client *client.Client, factory *manifests.Factory, userWorkloadConfig *manifests.UserWorkloadConfig) *PrometheusUserWorkloadTask {
31+
func NewPrometheusUserWorkloadTask(client *client.Client, factory *manifests.Factory, config *manifests.Config) *PrometheusUserWorkloadTask {
3232
return &PrometheusUserWorkloadTask{
33-
client: client,
34-
factory: factory,
35-
userWorkloadConfig: userWorkloadConfig,
33+
client: client,
34+
factory: factory,
35+
config: config,
3636
}
3737
}
3838

3939
func (t *PrometheusUserWorkloadTask) Run() error {
40-
if t.userWorkloadConfig.IsEnabled() {
40+
if t.config.IsUserWorkloadEnabled() {
4141
return t.create()
4242
}
4343

‎pkg/tasks/prometheusoperator_user_workload.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ import (
2424
type PrometheusOperatorUserWorkloadTask struct {
2525
client *client.Client
2626
factory *manifests.Factory
27-
config *manifests.UserWorkloadConfig
27+
config *manifests.Config
2828
}
2929

30-
func NewPrometheusOperatorUserWorkloadTask(client *client.Client, factory *manifests.Factory, config *manifests.UserWorkloadConfig) *PrometheusOperatorUserWorkloadTask {
30+
func NewPrometheusOperatorUserWorkloadTask(client *client.Client, factory *manifests.Factory, config *manifests.Config) *PrometheusOperatorUserWorkloadTask {
3131
return &PrometheusOperatorUserWorkloadTask{
3232
client: client,
3333
factory: factory,
@@ -36,7 +36,7 @@ func NewPrometheusOperatorUserWorkloadTask(client *client.Client, factory *manif
3636
}
3737

3838
func (t *PrometheusOperatorUserWorkloadTask) Run() error {
39-
if t.config.IsEnabled() {
39+
if t.config.IsUserWorkloadEnabled() {
4040
return t.create()
4141
}
4242

‎pkg/tasks/telemeter.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ func NewTelemeterClientTask(client *client.Client, factory *manifests.Factory, c
3939
}
4040

4141
func (t *TelemeterClientTask) Run() error {
42-
if t.config.TelemeterClientConfig.IsEnabled() && !t.config.RemoteWrite {
42+
if t.config.ClusterMonitoringConfiguration.TelemeterClientConfig.IsEnabled() && !t.config.RemoteWrite {
4343
return t.create()
4444
}
4545

46-
if !t.config.TelemeterClientConfig.IsEnabled() || t.config.TelemeterClientConfig.IsEnabled() && t.config.RemoteWrite {
46+
if !t.config.ClusterMonitoringConfiguration.TelemeterClientConfig.IsEnabled() || t.config.ClusterMonitoringConfiguration.TelemeterClientConfig.IsEnabled() && t.config.RemoteWrite {
4747
return t.destroy()
4848
}
4949

@@ -149,7 +149,7 @@ func (t *TelemeterClientTask) create() error {
149149
}
150150
}
151151

152-
rec, err := generateTelemeterWhitelistRec(t.config.PrometheusK8sConfig.TelemetryMatches)
152+
rec, err := generateTelemeterWhitelistRec(t.config.ClusterMonitoringConfiguration.PrometheusK8sConfig.TelemetryMatches)
153153
if err != nil {
154154
return errors.Wrap(err, "generating Telemeter client Prometheus Rule failed")
155155
}

‎pkg/tasks/thanos_querier.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,16 @@ import (
2323
)
2424

2525
type ThanosQuerierTask struct {
26-
client *client.Client
27-
factory *manifests.Factory
28-
userWorkloadConfig *manifests.UserWorkloadConfig
26+
client *client.Client
27+
factory *manifests.Factory
28+
config *manifests.Config
2929
}
3030

31-
func NewThanosQuerierTask(client *client.Client, factory *manifests.Factory, cfg *manifests.UserWorkloadConfig) *ThanosQuerierTask {
31+
func NewThanosQuerierTask(client *client.Client, factory *manifests.Factory, cfg *manifests.Config) *ThanosQuerierTask {
3232
return &ThanosQuerierTask{
33-
client: client,
34-
factory: factory,
35-
userWorkloadConfig: cfg,
33+
client: client,
34+
factory: factory,
35+
config: cfg,
3636
}
3737
}
3838

@@ -193,7 +193,7 @@ func (t *ThanosQuerierTask) Run() error {
193193
return errors.Wrap(err, "syncing Thanos Querier trusted CA bundle ConfigMap failed")
194194
}
195195

196-
dep, err := t.factory.ThanosQuerierDeployment(s, t.userWorkloadConfig.IsEnabled(), trustedCA)
196+
dep, err := t.factory.ThanosQuerierDeployment(s, t.config.IsUserWorkloadEnabled(), trustedCA)
197197
if err != nil {
198198
return errors.Wrap(err, "initializing Thanos Querier Deployment failed")
199199
}

‎pkg/tasks/thanos_ruler_user_workload.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ import (
2323
type ThanosRulerUserWorkloadTask struct {
2424
client *client.Client
2525
factory *manifests.Factory
26-
config *manifests.UserWorkloadConfig
26+
config *manifests.Config
2727
}
2828

29-
func NewThanosRulerUserWorkloadTask(client *client.Client, factory *manifests.Factory, config *manifests.UserWorkloadConfig) *ThanosRulerUserWorkloadTask {
29+
func NewThanosRulerUserWorkloadTask(client *client.Client, factory *manifests.Factory, config *manifests.Config) *ThanosRulerUserWorkloadTask {
3030
return &ThanosRulerUserWorkloadTask{
3131
client: client,
3232
factory: factory,
@@ -35,7 +35,7 @@ func NewThanosRulerUserWorkloadTask(client *client.Client, factory *manifests.Fa
3535
}
3636

3737
func (t *ThanosRulerUserWorkloadTask) Run() error {
38-
if t.config.IsEnabled() {
38+
if t.config.IsUserWorkloadEnabled() {
3939
return t.create()
4040
}
4141

‎test/e2e/user_workload_monitoring_test.go

+85-7
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,14 @@ import (
2929
apierrors "k8s.io/apimachinery/pkg/api/errors"
3030
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3131
"k8s.io/apimachinery/pkg/util/intstr"
32+
"k8s.io/apimachinery/pkg/util/wait"
3233
)
3334

3435
// The namespace where to deploy the test application.
35-
const userWorkloadTestNs = "user-workload-test"
36+
const (
37+
userWorkloadTestNs = "user-workload-test"
38+
userWorkloadNs = "openshift-user-workload-monitoring"
39+
)
3640

3741
func TestUserWorkloadMonitoring(t *testing.T) {
3842
cm := &v1.ConfigMap{
@@ -67,6 +71,85 @@ func TestUserWorkloadMonitoring(t *testing.T) {
6771
}
6872
}
6973

74+
func TestUserWorkloadMonitoringNewConfig(t *testing.T) {
75+
cm := &v1.ConfigMap{
76+
ObjectMeta: metav1.ObjectMeta{
77+
Name: "cluster-monitoring-config",
78+
Namespace: f.Ns,
79+
},
80+
Data: map[string]string{
81+
"config.yaml": `enableUserWorkload: true
82+
`,
83+
},
84+
}
85+
86+
uwmCM := &v1.ConfigMap{
87+
ObjectMeta: metav1.ObjectMeta{
88+
Name: "user-workload-monitoring-config",
89+
Namespace: userWorkloadNs,
90+
},
91+
Data: map[string]string{
92+
"config.yaml": `prometheus:
93+
volumeClaimTemplate:
94+
spec:
95+
storageClassName: gp2
96+
resources:
97+
requests:
98+
storage: 2Gi
99+
`,
100+
},
101+
}
102+
103+
for _, scenario := range []struct {
104+
name string
105+
f func(*testing.T)
106+
}{
107+
{"enable user workload monitoring, assert prometheus rollout", createUserWorkloadAssets(cm)},
108+
{"set VolumeClaimTemplate for prometheus CR, assert that it is created", assertPrometheusVCConfig(uwmCM)},
109+
{"assert assets are deleted when user workload monitoring is disabled", assertDeletedUserWorkloadAssets(cm)},
110+
} {
111+
if ok := t.Run(scenario.name, scenario.f); !ok {
112+
t.Fatalf("scenario %q failed", scenario.name)
113+
}
114+
}
115+
}
116+
117+
func assertPrometheusVCConfig(cm *v1.ConfigMap) func(*testing.T) {
118+
return func(t *testing.T) {
119+
if err := f.OperatorClient.CreateOrUpdateConfigMap(cm); err != nil {
120+
t.Fatal(err)
121+
}
122+
123+
var lastErr error
124+
// Wait for persistent volume claim
125+
err := wait.Poll(time.Second, 5*time.Minute, func() (bool, error) {
126+
_, err := f.KubeClient.CoreV1().PersistentVolumeClaims(userWorkloadNs).Get("prometheus-user-workload-db-prometheus-user-workload-0", metav1.GetOptions{})
127+
lastErr = errors.Wrap(err, "getting prometheus persistent volume claim failed")
128+
if err != nil {
129+
return false, nil
130+
}
131+
return true, nil
132+
})
133+
if err != nil {
134+
if err == wait.ErrWaitTimeout && lastErr != nil {
135+
err = lastErr
136+
}
137+
t.Fatal(err)
138+
}
139+
140+
err = f.OperatorClient.WaitForStatefulsetRollout(&appsv1.StatefulSet{
141+
ObjectMeta: metav1.ObjectMeta{
142+
Name: "prometheus-user-workload",
143+
Namespace: userWorkloadNs,
144+
},
145+
})
146+
if err != nil {
147+
t.Fatal(err)
148+
}
149+
}
150+
151+
}
152+
70153
func createUserWorkloadAssets(cm *v1.ConfigMap) func(*testing.T) {
71154
return func(t *testing.T) {
72155
if err := f.OperatorClient.CreateOrUpdateConfigMap(cm); err != nil {
@@ -561,12 +644,7 @@ func assertPrometheusAlertmanagerInUserNamespace(t *testing.T) {
561644

562645
func assertDeletedUserWorkloadAssets(cm *v1.ConfigMap) func(*testing.T) {
563646
return func(t *testing.T) {
564-
err := f.KubeClient.CoreV1().Namespaces().Delete(userWorkloadTestNs, &metav1.DeleteOptions{})
565-
if err != nil {
566-
t.Fatal(err)
567-
}
568-
569-
err = f.OperatorClient.DeleteConfigMap(cm)
647+
err := f.OperatorClient.DeleteConfigMap(cm)
570648
if err != nil {
571649
t.Fatal(err)
572650
}

0 commit comments

Comments
 (0)
Please sign in to comment.