@@ -51,6 +51,7 @@ var _ = Describe("SpiceDBClusters", func() {
5151 mapper meta.RESTMapper
5252 testNamespace string
5353 image string
54+ config map [string ]any
5455 secret * corev1.Secret
5556 cluster * v1alpha1.SpiceDBCluster
5657
@@ -100,15 +101,14 @@ var _ = Describe("SpiceDBClusters", func() {
100101 },
101102 }
102103
103- config : = map [string ]any {
104+ config = map [string ]any {
104105 "envPrefix" : spicedbEnvPrefix ,
105106 "image" : image ,
106107 "cmd" : spicedbCmd ,
107108 "skipReleaseCheck" : "true" ,
108109 "telemetryEndpoint" : "" ,
109110 }
110- jsonConfig , err := json .Marshal (config )
111- Expect (err ).To (Succeed ())
111+
112112 cluster = & v1alpha1.SpiceDBCluster {
113113 TypeMeta : metav1.TypeMeta {
114114 Kind : v1alpha1 .SpiceDBClusterKind ,
@@ -119,7 +119,6 @@ var _ = Describe("SpiceDBClusters", func() {
119119 Namespace : testNamespace ,
120120 },
121121 Spec : v1alpha1.ClusterSpec {
122- Config : jsonConfig ,
123122 SecretRef : "spicedb" ,
124123 },
125124 }
@@ -136,6 +135,10 @@ var _ = Describe("SpiceDBClusters", func() {
136135 // be modified by nested BeforeEach blocks.
137136 _ , err := kclient .CoreV1 ().Secrets (testNamespace ).Create (ctx , secret , metav1.CreateOptions {})
138137 Expect (err ).To (Succeed ())
138+
139+ jsonConfig , err := json .Marshal (config )
140+ Expect (err ).To (Succeed ())
141+ cluster .Spec .Config = jsonConfig
139142 u , err := runtime .DefaultUnstructuredConverter .ToUnstructured (cluster )
140143 Expect (err ).To (Succeed ())
141144 _ , err = client .Resource (v1alpha1ClusterGVR ).Namespace (cluster .Namespace ).Create (ctx , & unstructured.Unstructured {Object : u }, metav1.CreateOptions {})
@@ -233,7 +236,7 @@ var _ = Describe("SpiceDBClusters", func() {
233236 "migration_secrets" : "kaitain-bootstrap-token=testtesttesttest,sharewith-bootstrap-token=testtesttesttest,thumper-bootstrap-token=testtesttesttest,metrics-proxy-token=testtesttesttest" ,
234237 }
235238
236- config : = map [string ]any {
239+ config = map [string ]any {
237240 "skipReleaseCheck" : "true" ,
238241 "telemetryEndpoint" : "" ,
239242 "datastoreEngine" : db .Engine ,
@@ -246,10 +249,6 @@ var _ = Describe("SpiceDBClusters", func() {
246249 for k , v := range db .ExtraConfig {
247250 config [k ] = v
248251 }
249- jsonConfig , err := json .Marshal (config )
250- Expect (err ).To (Succeed ())
251-
252- cluster .Spec .Config = jsonConfig
253252 })
254253
255254 JustBeforeEach (func () {
@@ -271,7 +270,7 @@ var _ = Describe("SpiceDBClusters", func() {
271270 BeforeEach (func () {
272271 // this installs from the head of the current channel, skip validating image
273272 image = ""
274- config : = map [string ]any {
273+ config = map [string ]any {
275274 "skipReleaseCheck" : true ,
276275 "telemetryEndpoint" : "" ,
277276 "datastoreEngine" : db .Engine ,
@@ -287,9 +286,6 @@ var _ = Describe("SpiceDBClusters", func() {
287286 for k , v := range db .ExtraConfig {
288287 config [k ] = v
289288 }
290- jsonConfig , err := json .Marshal (config )
291- Expect (err ).To (BeNil ())
292- cluster .Spec .Config = jsonConfig
293289 cluster .Spec .Patches = []v1alpha1.Patch {{
294290 Kind : "Deployment" ,
295291 Patch : json .RawMessage (`{
@@ -305,7 +301,7 @@ var _ = Describe("SpiceDBClusters", func() {
305301 ktypes.NamespacedName {Name : cluster .Name , Namespace : cluster .Namespace },
306302 ktypes.NamespacedName {Name : "spicedb-grpc-tls" , Namespace : cluster .Namespace },
307303 )
308- _ , err = kclient .CoreV1 ().Secrets (cluster .Namespace ).Create (ctx , tlsSecret , metav1.CreateOptions {})
304+ _ , err : = kclient .CoreV1 ().Secrets (cluster .Namespace ).Create (ctx , tlsSecret , metav1.CreateOptions {})
309305 Expect (err ).To (Succeed ())
310306 DeferCleanup (kclient .CoreV1 ().Secrets (cluster .Namespace ).Delete , ctx , tlsSecret .Name , metav1.DeleteOptions {})
311307 })
@@ -329,6 +325,59 @@ var _ = Describe("SpiceDBClusters", func() {
329325 })
330326 })
331327
328+ When ("a valid spicedb cluster with a pod error" , func () {
329+ BeforeEach (func () {
330+ secret .StringData = map [string ]string {
331+ "datastore_uri" : db .DatastoreURI ,
332+ "preshared_key" : "testtesttesttest" ,
333+ "migration_secrets" : "kaitain-bootstrap-token=testtesttesttest,sharewith-bootstrap-token=testtesttesttest,thumper-bootstrap-token=testtesttesttest,metrics-proxy-token=testtesttesttest" ,
334+ }
335+ config = map [string ]any {
336+ "skipMigrations" : true ,
337+ "datastoreEngine" : db .Engine ,
338+ "image" : image ,
339+ "envPrefix" : spicedbEnvPrefix ,
340+ "cmd" : "badcmd" ,
341+ "datastoreConnpoolReadMinOpen" : "1" ,
342+ "datastoreConnpoolWriteMinOpen" : "1" ,
343+ }
344+ for k , v := range db .ExtraConfig {
345+ config [k ] = v
346+ }
347+ })
348+
349+ It ("reports un-recovered pod errors on the status" , func () {
350+ var lastCluster * v1alpha1.SpiceDBCluster
351+ var condition * metav1.Condition
352+ Watch (ctx , client , v1alpha1ClusterGVR , ktypes.NamespacedName {Name : cluster .Name , Namespace : testNamespace }, "0" , func (c * v1alpha1.SpiceDBCluster ) bool {
353+ condition = c .FindStatusCondition (v1alpha1 .ConditionTypeRolloutError )
354+ logr .FromContextOrDiscard (ctx ).Info ("watch event" , "status" , c .Status )
355+ lastCluster = c
356+ return condition == nil
357+ })
358+ Expect (condition ).To (EqualCondition (v1alpha1 .NewPodErrorCondition (`failed to create containerd task: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "badcmd": executable file not found in $PATH: unknown` )))
359+
360+ By ("fixing the config problem" )
361+ config ["cmd" ] = spicedbCmd
362+ config ["skipMigrations" ] = "false"
363+ jsonConfig , err := json .Marshal (config )
364+ Expect (err ).To (Succeed ())
365+ lastCluster .Spec .Config = jsonConfig
366+ u , err := runtime .DefaultUnstructuredConverter .ToUnstructured (lastCluster )
367+ Expect (err ).To (Succeed ())
368+ _ , err = client .Resource (v1alpha1ClusterGVR ).Namespace (cluster .Namespace ).Update (ctx , & unstructured.Unstructured {Object : u }, metav1.UpdateOptions {})
369+ Expect (err ).To (Succeed ())
370+
371+ By ("the condition should be removed" )
372+ Watch (ctx , client , v1alpha1ClusterGVR , ktypes.NamespacedName {Name : cluster .Name , Namespace : testNamespace }, "0" , func (c * v1alpha1.SpiceDBCluster ) bool {
373+ condition = c .FindStatusCondition (v1alpha1 .ConditionTypeRolloutError )
374+ logr .FromContextOrDiscard (ctx ).Info ("watch event" , "status" , c .Status )
375+ return condition != nil
376+ })
377+ Expect (condition ).To (BeNil ())
378+ })
379+ })
380+
332381 When ("a valid SpiceDBCluster and skipped migrations" , func () {
333382 BeforeEach (func () {
334383 secret .StringData = map [string ]string {
@@ -337,17 +386,15 @@ var _ = Describe("SpiceDBClusters", func() {
337386 "preshared_key" : "testtesttesttest" ,
338387 "migration_secrets" : "kaitain-bootstrap-token=testtesttesttest,sharewith-bootstrap-token=testtesttesttest,thumper-bootstrap-token=testtesttesttest,metrics-proxy-token=testtesttesttest" ,
339388 }
340- config , err := json . Marshal ( map [string ]any {
389+ config = map [string ]any {
341390 "skipMigrations" : true ,
342391 "datastoreEngine" : db .Engine ,
343392 "image" : image ,
344393 "envPrefix" : spicedbEnvPrefix ,
345394 "cmd" : spicedbCmd ,
346- "datastoreConnpoolReadMinOpen" : 1 ,
347- "datastoreConnpoolWriteMinOpen" : 1 ,
348- })
349- Expect (err ).To (Succeed ())
350- cluster .Spec .Config = config
395+ "datastoreConnpoolReadMinOpen" : "1" ,
396+ "datastoreConnpoolWriteMinOpen" : "1" ,
397+ }
351398 })
352399
353400 It ("Starts SpiceDB without migrating" , func () {
@@ -381,7 +428,7 @@ var _ = Describe("SpiceDBClusters", func() {
381428 "migration_secrets" : "kaitain-bootstrap-token=testtesttesttest,sharewith-bootstrap-token=testtesttesttest,thumper-bootstrap-token=testtesttesttest,metrics-proxy-token=testtesttesttest" ,
382429 }
383430
384- config : = map [string ]any {
431+ config = map [string ]any {
385432 "skipReleaseCheck" : "true" ,
386433 "telemetryEndpoint" : "" ,
387434 "datastoreEngine" : engine ,
@@ -400,10 +447,6 @@ var _ = Describe("SpiceDBClusters", func() {
400447 }
401448 config [k ] = v
402449 }
403- jsonConfig , err := json .Marshal (config )
404- Expect (err ).To (Succeed ())
405-
406- cluster .Spec .Config = jsonConfig
407450 cluster .Spec .Channel = channel
408451 cluster .Spec .Version = from
409452 })
@@ -527,18 +570,15 @@ var _ = Describe("SpiceDBClusters", func() {
527570
528571 Describe ("there is a series of required migrations" , Label ("published" ), func () {
529572 BeforeEach (func () {
530- classConfig : = map [string ]any {
573+ config = map [string ]any {
531574 "skipReleaseCheck" : "true" ,
532575 "telemetryEndpoint" : "" ,
533576 "logLevel" : "debug" ,
534577 "datastoreEngine" : "postgres" ,
535578 "tlsSecretName" : "spicedb-grpc-tls" ,
536579 "dispatchUpstreamCASecretName" : "spicedb-grpc-tls" ,
537580 }
538- jsonConfig , err := json .Marshal (classConfig )
539- Expect (err ).To (BeNil ())
540581 cluster .Spec .Version = "v1.13.0"
541- cluster .Spec .Config = jsonConfig
542582
543583 secret .StringData = map [string ]string {
544584 "datastore_uri" : db .DatastoreURI ,
@@ -550,7 +590,7 @@ var _ = Describe("SpiceDBClusters", func() {
550590 ktypes.NamespacedName {Name : cluster .Name , Namespace : cluster .Namespace },
551591 ktypes.NamespacedName {Name : "spicedb-grpc-tls" , Namespace : cluster .Namespace },
552592 )
553- _ , err = kclient .CoreV1 ().Secrets (cluster .Namespace ).Create (ctx , tlsSecret , metav1.CreateOptions {})
593+ _ , err : = kclient .CoreV1 ().Secrets (cluster .Namespace ).Create (ctx , tlsSecret , metav1.CreateOptions {})
554594 Expect (err ).To (Succeed ())
555595 DeferCleanup (kclient .CoreV1 ().Secrets (cluster .Namespace ).Delete , ctx , tlsSecret .Name , metav1.DeleteOptions {})
556596 })
0 commit comments