Skip to content

Commit 87c38a2

Browse files
committed
fix(operator): Allow structured metadata only if V13 schema provided
1 parent 845359d commit 87c38a2

File tree

8 files changed

+593
-24
lines changed

8 files changed

+593
-24
lines changed

operator/internal/manifests/distributor.go

+5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"sigs.k8s.io/controller-runtime/pkg/client"
1515

1616
"github.com/grafana/loki/operator/internal/manifests/internal/config"
17+
"github.com/grafana/loki/operator/internal/manifests/storage"
1718
)
1819

1920
// BuildDistributor returns a list of k8s objects for Loki Distributor
@@ -44,6 +45,10 @@ func BuildDistributor(opts Options) ([]client.Object, error) {
4445
}
4546
}
4647

48+
if err := storage.ConfigureDeployment(deployment, opts.ObjectStorage); err != nil {
49+
return nil, err
50+
}
51+
4752
if err := configureHashRingEnv(&deployment.Spec.Template.Spec, opts); err != nil {
4853
return nil, err
4954
}

operator/internal/manifests/internal/config/build_test.go

+33-23
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ limits_config:
114114
shard_streams:
115115
enabled: true
116116
desired_rate: 3MB
117-
allow_structured_metadata: true
117+
allow_structured_metadata: false
118118
memberlist:
119119
abort_if_cluster_join_fails: true
120120
advertise_port: 7946
@@ -371,7 +371,7 @@ limits_config:
371371
shard_streams:
372372
enabled: true
373373
desired_rate: 3MB
374-
allow_structured_metadata: true
374+
allow_structured_metadata: false
375375
memberlist:
376376
abort_if_cluster_join_fails: true
377377
advertise_port: 7946
@@ -797,7 +797,7 @@ limits_config:
797797
shard_streams:
798798
enabled: true
799799
desired_rate: 3MB
800-
allow_structured_metadata: true
800+
allow_structured_metadata: false
801801
memberlist:
802802
abort_if_cluster_join_fails: true
803803
advertise_port: 7946
@@ -1155,7 +1155,7 @@ limits_config:
11551155
shard_streams:
11561156
enabled: true
11571157
desired_rate: 3MB
1158-
allow_structured_metadata: true
1158+
allow_structured_metadata: false
11591159
memberlist:
11601160
abort_if_cluster_join_fails: true
11611161
advertise_port: 7946
@@ -1514,7 +1514,7 @@ limits_config:
15141514
shard_streams:
15151515
enabled: true
15161516
desired_rate: 3MB
1517-
allow_structured_metadata: true
1517+
allow_structured_metadata: false
15181518
memberlist:
15191519
abort_if_cluster_join_fails: true
15201520
advertise_port: 7946
@@ -1911,7 +1911,7 @@ limits_config:
19111911
shard_streams:
19121912
enabled: true
19131913
desired_rate: 3MB
1914-
allow_structured_metadata: true
1914+
allow_structured_metadata: false
19151915
memberlist:
19161916
abort_if_cluster_join_fails: true
19171917
advertise_port: 7946
@@ -2241,7 +2241,7 @@ limits_config:
22412241
shard_streams:
22422242
enabled: true
22432243
desired_rate: 3MB
2244-
allow_structured_metadata: true
2244+
allow_structured_metadata: false
22452245
memberlist:
22462246
abort_if_cluster_join_fails: true
22472247
advertise_port: 7946
@@ -2680,7 +2680,7 @@ limits_config:
26802680
shard_streams:
26812681
enabled: true
26822682
desired_rate: 3MB
2683-
allow_structured_metadata: true
2683+
allow_structured_metadata: false
26842684
memberlist:
26852685
abort_if_cluster_join_fails: true
26862686
advertise_port: 7946
@@ -3004,7 +3004,7 @@ limits_config:
30043004
shard_streams:
30053005
enabled: true
30063006
desired_rate: 3MB
3007-
allow_structured_metadata: true
3007+
allow_structured_metadata: false
30083008
memberlist:
30093009
abort_if_cluster_join_fails: true
30103010
advertise_port: 7946
@@ -3501,7 +3501,7 @@ limits_config:
35013501
shard_streams:
35023502
enabled: true
35033503
desired_rate: 3MB
3504-
allow_structured_metadata: true
3504+
allow_structured_metadata: false
35053505
memberlist:
35063506
abort_if_cluster_join_fails: true
35073507
advertise_addr: ${HASH_RING_INSTANCE_ADDR}
@@ -3762,7 +3762,7 @@ limits_config:
37623762
shard_streams:
37633763
enabled: true
37643764
desired_rate: 3MB
3765-
allow_structured_metadata: true
3765+
allow_structured_metadata: false
37663766
memberlist:
37673767
abort_if_cluster_join_fails: true
37683768
advertise_addr: ${HASH_RING_INSTANCE_ADDR}
@@ -4024,7 +4024,7 @@ limits_config:
40244024
shard_streams:
40254025
enabled: true
40264026
desired_rate: 3MB
4027-
allow_structured_metadata: true
4027+
allow_structured_metadata: false
40284028
memberlist:
40294029
abort_if_cluster_join_fails: true
40304030
advertise_port: 7946
@@ -4287,7 +4287,7 @@ limits_config:
42874287
shard_streams:
42884288
enabled: true
42894289
desired_rate: 3MB
4290-
allow_structured_metadata: true
4290+
allow_structured_metadata: false
42914291
memberlist:
42924292
abort_if_cluster_join_fails: true
42934293
advertise_port: 7946
@@ -4586,7 +4586,7 @@ limits_config:
45864586
shard_streams:
45874587
enabled: true
45884588
desired_rate: 3MB
4589-
allow_structured_metadata: true
4589+
allow_structured_metadata: false
45904590
memberlist:
45914591
abort_if_cluster_join_fails: true
45924592
advertise_port: 7946
@@ -4880,7 +4880,7 @@ limits_config:
48804880
query_timeout: 1m
48814881
volume_enabled: true
48824882
volume_max_series: 1000
4883-
allow_structured_metadata: true
4883+
allow_structured_metadata: false
48844884
memberlist:
48854885
abort_if_cluster_join_fails: true
48864886
advertise_port: 7946
@@ -5124,11 +5124,12 @@ func defaultOptions() Options {
51245124

51255125
func TestBuild_ConfigAndRuntimeConfig_Schemas(t *testing.T) {
51265126
for _, tc := range []struct {
5127-
name string
5128-
schemaConfig []lokiv1.ObjectStorageSchema
5129-
shippers []string
5130-
expSchemaConfig string
5131-
expStorageConfig string
5127+
name string
5128+
schemaConfig []lokiv1.ObjectStorageSchema
5129+
shippers []string
5130+
expSchemaConfig string
5131+
expStorageConfig string
5132+
expStructuredMetadata string
51325133
}{
51335134
{
51345135
name: "default_config_v11_schema",
@@ -5156,6 +5157,8 @@ func TestBuild_ConfigAndRuntimeConfig_Schemas(t *testing.T) {
51565157
resync_interval: 5m
51575158
index_gateway_client:
51585159
server_address: dns:///loki-index-gateway-grpc-lokistack-dev.default.svc.cluster.local:9095`,
5160+
expStructuredMetadata: `
5161+
allow_structured_metadata: false`,
51595162
},
51605163
{
51615164
name: "v12_schema",
@@ -5183,6 +5186,8 @@ func TestBuild_ConfigAndRuntimeConfig_Schemas(t *testing.T) {
51835186
resync_interval: 5m
51845187
index_gateway_client:
51855188
server_address: dns:///loki-index-gateway-grpc-lokistack-dev.default.svc.cluster.local:9095`,
5189+
expStructuredMetadata: `
5190+
allow_structured_metadata: false`,
51865191
},
51875192
{
51885193
name: "v13_schema",
@@ -5210,6 +5215,8 @@ func TestBuild_ConfigAndRuntimeConfig_Schemas(t *testing.T) {
52105215
resync_interval: 5m
52115216
index_gateway_client:
52125217
server_address: dns:///loki-index-gateway-grpc-lokistack-dev.default.svc.cluster.local:9095`,
5218+
expStructuredMetadata: `
5219+
allow_structured_metadata: true`,
52135220
},
52145221
{
52155222
name: "multiple_schema",
@@ -5266,6 +5273,8 @@ func TestBuild_ConfigAndRuntimeConfig_Schemas(t *testing.T) {
52665273
resync_interval: 5m
52675274
index_gateway_client:
52685275
server_address: dns:///loki-index-gateway-grpc-lokistack-dev.default.svc.cluster.local:9095`,
5276+
expStructuredMetadata: `
5277+
allow_structured_metadata: true`,
52695278
},
52705279
} {
52715280
t.Run(tc.name, func(t *testing.T) {
@@ -5366,7 +5375,7 @@ limits_config:
53665375
query_timeout: 1m
53675376
volume_enabled: true
53685377
volume_max_series: 1000
5369-
allow_structured_metadata: true
5378+
${STORAGE_STRUCTURED_METADATA}
53705379
memberlist:
53715380
abort_if_cluster_join_fails: true
53725381
advertise_port: 7946
@@ -5416,6 +5425,7 @@ analytics:
54165425
`
54175426
expCfg = strings.Replace(expCfg, "${SCHEMA_CONFIG}", tc.expSchemaConfig, 1)
54185427
expCfg = strings.Replace(expCfg, "${STORAGE_CONFIG}", tc.expStorageConfig, 1)
5428+
expCfg = strings.Replace(expCfg, "${STORAGE_STRUCTURED_METADATA}", tc.expStructuredMetadata, 1)
54195429

54205430
opts := defaultOptions()
54215431
opts.ObjectStorage.Schemas = tc.schemaConfig
@@ -5540,7 +5550,7 @@ limits_config:
55405550
query_timeout: 1m
55415551
volume_enabled: true
55425552
volume_max_series: 1000
5543-
allow_structured_metadata: true
5553+
allow_structured_metadata: false
55445554
memberlist:
55455555
abort_if_cluster_join_fails: true
55465556
advertise_port: 7946
@@ -5712,7 +5722,7 @@ limits_config:
57125722
shard_streams:
57135723
enabled: true
57145724
desired_rate: 3MB
5715-
allow_structured_metadata: true
5725+
allow_structured_metadata: false
57165726
memberlist:
57175727
abort_if_cluster_join_fails: true
57185728
advertise_port: 7946

operator/internal/manifests/internal/config/loki-config.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ limits_config:
220220
enabled: true
221221
desired_rate: {{ . }}MB
222222
{{- end }}
223-
allow_structured_metadata: true
223+
allow_structured_metadata: {{ .ObjectStorage.AllowStructuredMetadata }}
224224
{{- with .GossipRing }}
225225
memberlist:
226226
abort_if_cluster_join_fails: true

operator/internal/manifests/options_test.go

+49
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
lokiv1 "github.com/grafana/loki/operator/apis/loki/v1"
1010
"github.com/grafana/loki/operator/internal/manifests/internal/config"
11+
"github.com/grafana/loki/operator/internal/manifests/storage"
1112
)
1213

1314
func TestNewTimeoutConfig_ReturnsDefaults_WhenLimitsSpecEmpty(t *testing.T) {
@@ -190,3 +191,51 @@ func TestNewTimeoutConfig_ReturnsDefaults_WhenTenantQueryTimeoutParseError(t *te
190191
_, err := NewTimeoutConfig(s.Spec.Limits)
191192
require.Error(t, err)
192193
}
194+
195+
func TestAllowStructuredMetadata_ReturnsTrue(t *testing.T) {
196+
opts := Options{
197+
ObjectStorage: storage.Options{
198+
Schemas: []lokiv1.ObjectStorageSchema{
199+
{Version: lokiv1.ObjectStorageSchemaV13},
200+
},
201+
},
202+
}
203+
204+
require.True(t, opts.ObjectStorage.AllowStructuredMetadata())
205+
}
206+
207+
func TestAllowStructuredMetadata_ReturnsTrue_WithFutureVersions(t *testing.T) {
208+
opts := Options{
209+
ObjectStorage: storage.Options{
210+
Schemas: []lokiv1.ObjectStorageSchema{
211+
{Version: lokiv1.ObjectStorageSchemaVersion("v14")},
212+
},
213+
},
214+
}
215+
216+
require.True(t, opts.ObjectStorage.AllowStructuredMetadata())
217+
}
218+
219+
func TestAllowStructuredMetadata_ReturnsFalse_WithV11(t *testing.T) {
220+
opts := Options{
221+
ObjectStorage: storage.Options{
222+
Schemas: []lokiv1.ObjectStorageSchema{
223+
{Version: lokiv1.ObjectStorageSchemaV11},
224+
},
225+
},
226+
}
227+
228+
require.False(t, opts.ObjectStorage.AllowStructuredMetadata())
229+
}
230+
231+
func TestAllowStructuredMetadata_ReturnsFalse_WithV12(t *testing.T) {
232+
opts := Options{
233+
ObjectStorage: storage.Options{
234+
Schemas: []lokiv1.ObjectStorageSchema{
235+
{Version: lokiv1.ObjectStorageSchemaV12},
236+
},
237+
},
238+
}
239+
240+
require.False(t, opts.ObjectStorage.AllowStructuredMetadata())
241+
}

operator/internal/manifests/query-frontend.go

+5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"sigs.k8s.io/controller-runtime/pkg/client"
1515

1616
"github.com/grafana/loki/operator/internal/manifests/internal/config"
17+
"github.com/grafana/loki/operator/internal/manifests/storage"
1718
)
1819

1920
// BuildQueryFrontend returns a list of k8s objects for Loki QueryFrontend
@@ -44,6 +45,10 @@ func BuildQueryFrontend(opts Options) ([]client.Object, error) {
4445
}
4546
}
4647

48+
if err := storage.ConfigureDeployment(deployment, opts.ObjectStorage); err != nil {
49+
return nil, err
50+
}
51+
4752
if err := configureHashRingEnv(&deployment.Spec.Template.Spec, opts); err != nil {
4853
return nil, err
4954
}

operator/internal/manifests/storage/configure.go

+26
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ func configureDeployment(d *appsv1.Deployment, opts Options) error {
7272
return kverrors.Wrap(err, "failed to merge gcs object storage spec ")
7373
}
7474

75+
p = ensureObjectStoreStructuredMetadata(&d.Spec.Template.Spec, opts)
76+
if err := mergo.Merge(&d.Spec.Template.Spec, p, mergo.WithOverride); err != nil {
77+
return kverrors.Wrap(err, "failed to merge object store structured metadata CLI arguments ")
78+
}
79+
7580
return nil
7681
}
7782

@@ -98,6 +103,11 @@ func configureStatefulSet(s *appsv1.StatefulSet, opts Options) error {
98103
return kverrors.Wrap(err, "failed to merge gcs object storage spec ")
99104
}
100105

106+
p = ensureObjectStoreStructuredMetadata(&s.Spec.Template.Spec, opts)
107+
if err := mergo.Merge(&s.Spec.Template.Spec, p, mergo.WithOverride); err != nil {
108+
return kverrors.Wrap(err, "failed to merge object store structured metadata CLI arguments ")
109+
}
110+
101111
return nil
102112
}
103113

@@ -116,6 +126,22 @@ func configureStatefulSetCA(s *appsv1.StatefulSet, tls *TLSConfig) error {
116126
return nil
117127
}
118128

129+
func ensureObjectStoreStructuredMetadata(p *corev1.PodSpec, opts Options) corev1.PodSpec {
130+
if !opts.AllowStructuredMetadata() {
131+
return *p
132+
}
133+
134+
container := p.Containers[0].DeepCopy()
135+
136+
container.Args = append(container.Args, "-validation.allow-structured-metadata=false")
137+
138+
return corev1.PodSpec{
139+
Containers: []corev1.Container{
140+
*container,
141+
},
142+
}
143+
}
144+
119145
func ensureObjectStoreCredentials(p *corev1.PodSpec, opts Options) corev1.PodSpec {
120146
container := p.Containers[0].DeepCopy()
121147
volumes := p.Volumes

0 commit comments

Comments
 (0)