@@ -583,6 +583,59 @@ func (o *Orchestrator) buildServiceInstanceResources(spec *database.ServiceInsta
583583 }, nil
584584}
585585
586+ // generateRAGInstanceResources returns the resources needed for one RAG service
587+ // instance. RAG only requires read access, so a single ServiceUserRoleRO is
588+ // created per database node using the same canonical+per-node pattern as MCP.
589+ func (o * Orchestrator ) generateRAGInstanceResources (spec * database.ServiceInstanceSpec ) (* database.ServiceInstanceResources , error ) {
590+ canonicalROID := ServiceUserRoleIdentifier (spec .ServiceSpec .ServiceID , ServiceUserRoleRO )
591+
592+ // Canonical read-only role — runs on the node co-located with this instance.
593+ canonicalRO := & ServiceUserRole {
594+ ServiceID : spec .ServiceSpec .ServiceID ,
595+ DatabaseID : spec .DatabaseID ,
596+ DatabaseName : spec .DatabaseName ,
597+ NodeName : spec .NodeName ,
598+ Mode : ServiceUserRoleRO ,
599+ }
600+
601+ orchestratorResources := []resource.Resource {canonicalRO }
602+
603+ // Per-node RO role for each additional database node so that RAG instances
604+ // on other hosts can authenticate against their co-located Postgres.
605+ if len (spec .DatabaseNodes ) > 1 {
606+ for _ , nodeInst := range spec .DatabaseNodes [1 :] {
607+ orchestratorResources = append (orchestratorResources , & ServiceUserRole {
608+ ServiceID : spec .ServiceSpec .ServiceID ,
609+ DatabaseID : spec .DatabaseID ,
610+ DatabaseName : spec .DatabaseName ,
611+ NodeName : nodeInst .NodeName ,
612+ Mode : ServiceUserRoleRO ,
613+ CredentialSource : & canonicalROID ,
614+ })
615+ }
616+ }
617+
618+ data := make ([]* resource.ResourceData , len (orchestratorResources ))
619+ for i , res := range orchestratorResources {
620+ d , err := resource .ToResourceData (res )
621+ if err != nil {
622+ return nil , fmt .Errorf ("failed to convert resource to resource data: %w" , err )
623+ }
624+ data [i ] = d
625+ }
626+
627+ return & database.ServiceInstanceResources {
628+ ServiceInstance : & database.ServiceInstance {
629+ ServiceInstanceID : spec .ServiceInstanceID ,
630+ ServiceID : spec .ServiceSpec .ServiceID ,
631+ DatabaseID : spec .DatabaseID ,
632+ HostID : spec .HostID ,
633+ State : database .ServiceInstanceStateCreating ,
634+ },
635+ Resources : data ,
636+ }, nil
637+ }
638+
586639func (o * Orchestrator ) GetInstanceConnectionInfo (ctx context.Context , databaseID , instanceID string ) (* database.ConnectionInfo , error ) {
587640 container , err := GetPostgresContainer (ctx , o .docker , instanceID )
588641 if err != nil {
0 commit comments