@@ -365,3 +365,296 @@ func TestDBDeployments_NonexistentSystemThrowsError(t *testing.T) {
365365 // Keep workspaceID to avoid "declared but not used" error
366366 _ = workspaceID
367367}
368+
369+ func TestDBDeployments_WithJsonResourceSelector (t * testing.T ) {
370+ workspaceID , conn := setupTestWithWorkspace (t )
371+
372+ tx , err := conn .Begin (t .Context ())
373+ if err != nil {
374+ t .Fatalf ("failed to begin tx: %v" , err )
375+ }
376+ defer tx .Rollback (t .Context ())
377+
378+ // Create a system first
379+ systemID := uuid .New ().String ()
380+ systemDescription := fmt .Sprintf ("desc-%s" , systemID [:8 ])
381+ sys := & oapi.System {
382+ Id : systemID ,
383+ WorkspaceId : workspaceID ,
384+ Name : fmt .Sprintf ("test-system-%s" , systemID [:8 ]),
385+ Description : & systemDescription ,
386+ }
387+ err = writeSystem (t .Context (), sys , tx )
388+ if err != nil {
389+ t .Fatalf ("failed to create system: %v" , err )
390+ }
391+
392+ // Create deployment with JSON resource selector
393+ deploymentID := uuid .New ().String ()
394+ description := "test deployment with JSON selector"
395+
396+ // Create a JSON selector
397+ resourceSelector := & oapi.Selector {}
398+ err = resourceSelector .FromJsonSelector (oapi.JsonSelector {
399+ Json : map [string ]interface {}{
400+ "type" : "name" ,
401+ "operator" : "equals" ,
402+ "value" : "test-resource" ,
403+ },
404+ })
405+ if err != nil {
406+ t .Fatalf ("failed to create JSON selector: %v" , err )
407+ }
408+
409+ deployment := & oapi.Deployment {
410+ Id : deploymentID ,
411+ Name : fmt .Sprintf ("test-deployment-%s" , deploymentID [:8 ]),
412+ Slug : fmt .Sprintf ("test-deployment-%s" , deploymentID [:8 ]),
413+ SystemId : systemID ,
414+ Description : & description ,
415+ JobAgentConfig : map [string ]interface {}{},
416+ ResourceSelector : resourceSelector ,
417+ }
418+
419+ err = writeDeployment (t .Context (), deployment , tx )
420+ if err != nil {
421+ t .Fatalf ("expected no errors, got %v" , err )
422+ }
423+
424+ err = tx .Commit (t .Context ())
425+ if err != nil {
426+ t .Fatalf ("failed to commit: %v" , err )
427+ }
428+
429+ // Read back and validate
430+ actualDeployments , err := getDeployments (t .Context (), workspaceID )
431+ if err != nil {
432+ t .Fatalf ("expected no errors, got %v" , err )
433+ }
434+
435+ if len (actualDeployments ) != 1 {
436+ t .Fatalf ("expected 1 deployment, got %d" , len (actualDeployments ))
437+ }
438+
439+ actualDeployment := actualDeployments [0 ]
440+ if actualDeployment .ResourceSelector == nil {
441+ t .Fatalf ("expected resource selector to be non-nil" )
442+ }
443+
444+ // Validate the selector content
445+ jsonSelector , err := actualDeployment .ResourceSelector .AsJsonSelector ()
446+ if err != nil {
447+ t .Fatalf ("expected JSON selector, got error: %v" , err )
448+ }
449+
450+ expectedJson := map [string ]interface {}{
451+ "type" : "name" ,
452+ "operator" : "equals" ,
453+ "value" : "test-resource" ,
454+ }
455+
456+ if jsonSelector .Json ["type" ] != expectedJson ["type" ] {
457+ t .Fatalf ("expected type %v, got %v" , expectedJson ["type" ], jsonSelector .Json ["type" ])
458+ }
459+ if jsonSelector .Json ["operator" ] != expectedJson ["operator" ] {
460+ t .Fatalf ("expected operator %v, got %v" , expectedJson ["operator" ], jsonSelector .Json ["operator" ])
461+ }
462+ if jsonSelector .Json ["value" ] != expectedJson ["value" ] {
463+ t .Fatalf ("expected value %v, got %v" , expectedJson ["value" ], jsonSelector .Json ["value" ])
464+ }
465+ }
466+
467+ func TestDBDeployments_WithCelResourceSelector (t * testing.T ) {
468+ workspaceID , conn := setupTestWithWorkspace (t )
469+
470+ tx , err := conn .Begin (t .Context ())
471+ if err != nil {
472+ t .Fatalf ("failed to begin tx: %v" , err )
473+ }
474+ defer tx .Rollback (t .Context ())
475+
476+ // Create a system first
477+ systemID := uuid .New ().String ()
478+ systemDescription := fmt .Sprintf ("desc-%s" , systemID [:8 ])
479+ sys := & oapi.System {
480+ Id : systemID ,
481+ WorkspaceId : workspaceID ,
482+ Name : fmt .Sprintf ("test-system-%s" , systemID [:8 ]),
483+ Description : & systemDescription ,
484+ }
485+ err = writeSystem (t .Context (), sys , tx )
486+ if err != nil {
487+ t .Fatalf ("failed to create system: %v" , err )
488+ }
489+
490+ // Create deployment with CEL resource selector
491+ deploymentID := uuid .New ().String ()
492+ description := "test deployment with CEL selector"
493+
494+ // Create a CEL selector
495+ resourceSelector := & oapi.Selector {}
496+ celExpression := "resource.metadata.environment == 'production'"
497+ err = resourceSelector .FromCelSelector (oapi.CelSelector {
498+ Cel : celExpression ,
499+ })
500+ if err != nil {
501+ t .Fatalf ("failed to create CEL selector: %v" , err )
502+ }
503+
504+ deployment := & oapi.Deployment {
505+ Id : deploymentID ,
506+ Name : fmt .Sprintf ("test-deployment-%s" , deploymentID [:8 ]),
507+ Slug : fmt .Sprintf ("test-deployment-%s" , deploymentID [:8 ]),
508+ SystemId : systemID ,
509+ Description : & description ,
510+ JobAgentConfig : map [string ]interface {}{},
511+ ResourceSelector : resourceSelector ,
512+ }
513+
514+ err = writeDeployment (t .Context (), deployment , tx )
515+ if err != nil {
516+ t .Fatalf ("expected no errors, got %v" , err )
517+ }
518+
519+ err = tx .Commit (t .Context ())
520+ if err != nil {
521+ t .Fatalf ("failed to commit: %v" , err )
522+ }
523+
524+ // Read back and validate
525+ actualDeployments , err := getDeployments (t .Context (), workspaceID )
526+ if err != nil {
527+ t .Fatalf ("expected no errors, got %v" , err )
528+ }
529+
530+ if len (actualDeployments ) != 1 {
531+ t .Fatalf ("expected 1 deployment, got %d" , len (actualDeployments ))
532+ }
533+
534+ actualDeployment := actualDeployments [0 ]
535+ if actualDeployment .ResourceSelector == nil {
536+ t .Fatalf ("expected resource selector to be non-nil" )
537+ }
538+
539+ // Validate the selector content
540+ celSelector , err := actualDeployment .ResourceSelector .AsCelSelector ()
541+ if err != nil {
542+ t .Fatalf ("expected CEL selector, got error: %v" , err )
543+ }
544+
545+ if celSelector .Cel != celExpression {
546+ t .Fatalf ("expected CEL expression %s, got %s" , celExpression , celSelector .Cel )
547+ }
548+ }
549+
550+ func TestDBDeployments_UpdateResourceSelector (t * testing.T ) {
551+ workspaceID , conn := setupTestWithWorkspace (t )
552+
553+ tx , err := conn .Begin (t .Context ())
554+ if err != nil {
555+ t .Fatalf ("failed to begin tx: %v" , err )
556+ }
557+ defer tx .Rollback (t .Context ())
558+
559+ // Create a system first
560+ systemID := uuid .New ().String ()
561+ systemDescription := fmt .Sprintf ("desc-%s" , systemID [:8 ])
562+ sys := & oapi.System {
563+ Id : systemID ,
564+ WorkspaceId : workspaceID ,
565+ Name : fmt .Sprintf ("test-system-%s" , systemID [:8 ]),
566+ Description : & systemDescription ,
567+ }
568+ err = writeSystem (t .Context (), sys , tx )
569+ if err != nil {
570+ t .Fatalf ("failed to create system: %v" , err )
571+ }
572+
573+ // Create deployment with JSON selector
574+ deploymentID := uuid .New ().String ()
575+ description := "test deployment"
576+
577+ initialSelector := & oapi.Selector {}
578+ err = initialSelector .FromJsonSelector (oapi.JsonSelector {
579+ Json : map [string ]interface {}{
580+ "type" : "name" ,
581+ "value" : "initial" ,
582+ },
583+ })
584+ if err != nil {
585+ t .Fatalf ("failed to create initial JSON selector: %v" , err )
586+ }
587+
588+ deployment := & oapi.Deployment {
589+ Id : deploymentID ,
590+ Name : fmt .Sprintf ("test-deployment-%s" , deploymentID [:8 ]),
591+ Slug : fmt .Sprintf ("test-deployment-%s" , deploymentID [:8 ]),
592+ SystemId : systemID ,
593+ Description : & description ,
594+ JobAgentConfig : map [string ]interface {}{},
595+ ResourceSelector : initialSelector ,
596+ }
597+
598+ err = writeDeployment (t .Context (), deployment , tx )
599+ if err != nil {
600+ t .Fatalf ("expected no errors, got %v" , err )
601+ }
602+
603+ err = tx .Commit (t .Context ())
604+ if err != nil {
605+ t .Fatalf ("failed to commit: %v" , err )
606+ }
607+
608+ // Update with CEL selector
609+ tx , err = conn .Begin (t .Context ())
610+ if err != nil {
611+ t .Fatalf ("failed to begin tx: %v" , err )
612+ }
613+ defer tx .Rollback (t .Context ())
614+
615+ updatedSelector := & oapi.Selector {}
616+ celExpression := "resource.kind == 'pod'"
617+ err = updatedSelector .FromCelSelector (oapi.CelSelector {
618+ Cel : celExpression ,
619+ })
620+ if err != nil {
621+ t .Fatalf ("failed to create CEL selector: %v" , err )
622+ }
623+
624+ deployment .ResourceSelector = updatedSelector
625+
626+ err = writeDeployment (t .Context (), deployment , tx )
627+ if err != nil {
628+ t .Fatalf ("expected no errors, got %v" , err )
629+ }
630+
631+ err = tx .Commit (t .Context ())
632+ if err != nil {
633+ t .Fatalf ("failed to commit: %v" , err )
634+ }
635+
636+ // Verify update
637+ actualDeployments , err := getDeployments (t .Context (), workspaceID )
638+ if err != nil {
639+ t .Fatalf ("expected no errors, got %v" , err )
640+ }
641+
642+ if len (actualDeployments ) != 1 {
643+ t .Fatalf ("expected 1 deployment, got %d" , len (actualDeployments ))
644+ }
645+
646+ actualDeployment := actualDeployments [0 ]
647+ if actualDeployment .ResourceSelector == nil {
648+ t .Fatalf ("expected resource selector to be non-nil" )
649+ }
650+
651+ // Validate it's now a CEL selector
652+ celSelector , err := actualDeployment .ResourceSelector .AsCelSelector ()
653+ if err != nil {
654+ t .Fatalf ("expected CEL selector, got error: %v" , err )
655+ }
656+
657+ if celSelector .Cel != celExpression {
658+ t .Fatalf ("expected CEL expression %s, got %s" , celExpression , celSelector .Cel )
659+ }
660+ }
0 commit comments