@@ -3,11 +3,20 @@ package swarm
33import (
44 "testing"
55
6+ "github.com/pgEdge/control-plane/server/internal/config"
67 "github.com/pgEdge/control-plane/server/internal/database"
78 "github.com/pgEdge/control-plane/server/internal/filesystem"
89 "github.com/pgEdge/control-plane/server/internal/resource"
910)
1011
12+ // newTestOrchestrator returns an Orchestrator with serviceVersions initialised
13+ // from a minimal config, suitable for unit tests that call generateRAGInstanceResources.
14+ func newTestOrchestrator () * Orchestrator {
15+ return & Orchestrator {
16+ serviceVersions : NewServiceVersions (config.Config {}),
17+ }
18+ }
19+
1120// minimalRAGConfig returns a minimal valid RAG service config suitable for unit tests.
1221func minimalRAGConfig () map [string ]any {
1322 return map [string ]any {
@@ -37,7 +46,7 @@ func minimalRAGConfig() map[string]any {
3746}
3847
3948func TestGenerateRAGInstanceResources_ResourceList (t * testing.T ) {
40- o := & Orchestrator {}
49+ o := newTestOrchestrator ()
4150 spec := & database.ServiceInstanceSpec {
4251 ServiceInstanceID : "storefront-rag-host1" ,
4352 ServiceSpec : & database.ServiceSpec {
@@ -73,34 +82,46 @@ func TestGenerateRAGInstanceResources_ResourceList(t *testing.T) {
7382 result .ServiceInstance .State , database .ServiceInstanceStateCreating )
7483 }
7584
76- // Single node: canonical RO ServiceUserRole + DirResource + RAGServiceKeysResource + RAGConfigResource .
77- if len (result .Resources ) != 4 {
78- t .Fatalf ("len(Resources) = %d, want 4 " , len (result .Resources ))
85+ // Single node: Network + canonical RO + DirResource + Keys + Config + InstanceSpec + ServiceInstance = 7 .
86+ if len (result .Resources ) != 7 {
87+ t .Fatalf ("len(Resources) = %d, want 7 " , len (result .Resources ))
7988 }
80- if result .Resources [0 ].Identifier .Type != ResourceTypeServiceUserRole {
89+ if result .Resources [0 ].Identifier .Type != ResourceTypeNetwork {
8190 t .Errorf ("Resources[0].Identifier.Type = %q, want %q" ,
82- result .Resources [0 ].Identifier .Type , ResourceTypeServiceUserRole )
83- }
84- wantID := ServiceUserRoleIdentifier ("rag" , ServiceUserRoleRO )
85- if result .Resources [0 ].Identifier != wantID {
86- t .Errorf ("Resources[0].Identifier = %v, want %v" , result .Resources [0 ].Identifier , wantID )
91+ result .Resources [0 ].Identifier .Type , ResourceTypeNetwork )
8792 }
88- if result .Resources [1 ].Identifier .Type != filesystem . ResourceTypeDir {
93+ if result .Resources [1 ].Identifier .Type != ResourceTypeServiceUserRole {
8994 t .Errorf ("Resources[1].Identifier.Type = %q, want %q" ,
90- result .Resources [1 ].Identifier .Type , filesystem . ResourceTypeDir )
95+ result .Resources [1 ].Identifier .Type , ResourceTypeServiceUserRole )
9196 }
92- if result .Resources [2 ].Identifier .Type != ResourceTypeRAGServiceKeys {
97+ wantID := ServiceUserRoleIdentifier ("rag" , ServiceUserRoleRO )
98+ if result .Resources [1 ].Identifier != wantID {
99+ t .Errorf ("Resources[1].Identifier = %v, want %v" , result .Resources [1 ].Identifier , wantID )
100+ }
101+ if result .Resources [2 ].Identifier .Type != filesystem .ResourceTypeDir {
93102 t .Errorf ("Resources[2].Identifier.Type = %q, want %q" ,
94- result .Resources [2 ].Identifier .Type , ResourceTypeRAGServiceKeys )
103+ result .Resources [2 ].Identifier .Type , filesystem . ResourceTypeDir )
95104 }
96- if result .Resources [3 ].Identifier .Type != ResourceTypeRAGConfig {
105+ if result .Resources [3 ].Identifier .Type != ResourceTypeRAGServiceKeys {
97106 t .Errorf ("Resources[3].Identifier.Type = %q, want %q" ,
98- result .Resources [3 ].Identifier .Type , ResourceTypeRAGConfig )
107+ result .Resources [3 ].Identifier .Type , ResourceTypeRAGServiceKeys )
108+ }
109+ if result .Resources [4 ].Identifier .Type != ResourceTypeRAGConfig {
110+ t .Errorf ("Resources[4].Identifier.Type = %q, want %q" ,
111+ result .Resources [4 ].Identifier .Type , ResourceTypeRAGConfig )
112+ }
113+ if result .Resources [5 ].Identifier .Type != ResourceTypeServiceInstanceSpec {
114+ t .Errorf ("Resources[5].Identifier.Type = %q, want %q" ,
115+ result .Resources [5 ].Identifier .Type , ResourceTypeServiceInstanceSpec )
116+ }
117+ if result .Resources [6 ].Identifier .Type != ResourceTypeServiceInstance {
118+ t .Errorf ("Resources[6].Identifier.Type = %q, want %q" ,
119+ result .Resources [6 ].Identifier .Type , ResourceTypeServiceInstance )
99120 }
100121}
101122
102123func TestGenerateRAGInstanceResources_MultiNode (t * testing.T ) {
103- o := & Orchestrator {}
124+ o := newTestOrchestrator ()
104125 spec := & database.ServiceInstanceSpec {
105126 ServiceInstanceID : "storefront-rag-host1" ,
106127 ServiceSpec : & database.ServiceSpec {
@@ -125,19 +146,19 @@ func TestGenerateRAGInstanceResources_MultiNode(t *testing.T) {
125146 t .Fatalf ("generateRAGInstanceResources() error = %v" , err )
126147 }
127148
128- // 3 nodes → canonical(n1) + per-node(n2) + per-node(n3) + dir + keys + config = 6 resources .
129- if len (result .Resources ) != 6 {
130- t .Fatalf ("len(Resources) = %d, want 6 " , len (result .Resources ))
149+ // 3 nodes → Network + canonical(n1) + per-node(n2) + per-node(n3) + dir + keys + config + spec + instance = 9 .
150+ if len (result .Resources ) != 9 {
151+ t .Fatalf ("len(Resources) = %d, want 9 " , len (result .Resources ))
131152 }
132- // First three must be ServiceUserRole resources.
133- for i := 0 ; i < 3 ; i ++ {
153+ // Resources[0] is Network; Resources[1..3] are ServiceUserRole resources.
154+ for i := 1 ; i < 4 ; i ++ {
134155 if result .Resources [i ].Identifier .Type != ResourceTypeServiceUserRole {
135156 t .Errorf ("resource[%d] type = %q, want %q" , i , result .Resources [i ].Identifier .Type , ResourceTypeServiceUserRole )
136157 }
137158 }
138159
139- // Canonical is first and has no CredentialSource
140- canonical , err := resource.ToResource [* ServiceUserRole ](result .Resources [0 ])
160+ // Canonical is index 1 and has no CredentialSource
161+ canonical , err := resource.ToResource [* ServiceUserRole ](result .Resources [1 ])
141162 if err != nil {
142163 t .Fatalf ("ToResource canonical: %v" , err )
143164 }
@@ -150,7 +171,7 @@ func TestGenerateRAGInstanceResources_MultiNode(t *testing.T) {
150171
151172 // Per-node resources point back to canonical
152173 canonicalID := ServiceUserRoleIdentifier ("rag" , ServiceUserRoleRO )
153- for i , rd := range result .Resources [1 : 3 ] {
174+ for i , rd := range result .Resources [2 : 4 ] {
154175 perNode , err := resource.ToResource [* ServiceUserRole ](rd )
155176 if err != nil {
156177 t .Fatalf ("ToResource per-node[%d]: %v" , i , err )
@@ -163,23 +184,31 @@ func TestGenerateRAGInstanceResources_MultiNode(t *testing.T) {
163184 }
164185 }
165186
166- // Data dir, keys, and config resource are appended last.
167- if result .Resources [3 ].Identifier .Type != filesystem .ResourceTypeDir {
168- t .Errorf ("Resources[3].Identifier.Type = %q, want %q" ,
169- result .Resources [3 ].Identifier .Type , filesystem .ResourceTypeDir )
170- }
171- if result .Resources [4 ].Identifier .Type != ResourceTypeRAGServiceKeys {
187+ // Dir, keys, config, spec, and instance are appended last.
188+ if result .Resources [4 ].Identifier .Type != filesystem .ResourceTypeDir {
172189 t .Errorf ("Resources[4].Identifier.Type = %q, want %q" ,
173- result .Resources [4 ].Identifier .Type , ResourceTypeRAGServiceKeys )
190+ result .Resources [4 ].Identifier .Type , filesystem . ResourceTypeDir )
174191 }
175- if result .Resources [5 ].Identifier .Type != ResourceTypeRAGConfig {
192+ if result .Resources [5 ].Identifier .Type != ResourceTypeRAGServiceKeys {
176193 t .Errorf ("Resources[5].Identifier.Type = %q, want %q" ,
177- result .Resources [5 ].Identifier .Type , ResourceTypeRAGConfig )
194+ result .Resources [5 ].Identifier .Type , ResourceTypeRAGServiceKeys )
195+ }
196+ if result .Resources [6 ].Identifier .Type != ResourceTypeRAGConfig {
197+ t .Errorf ("Resources[6].Identifier.Type = %q, want %q" ,
198+ result .Resources [6 ].Identifier .Type , ResourceTypeRAGConfig )
199+ }
200+ if result .Resources [7 ].Identifier .Type != ResourceTypeServiceInstanceSpec {
201+ t .Errorf ("Resources[7].Identifier.Type = %q, want %q" ,
202+ result .Resources [7 ].Identifier .Type , ResourceTypeServiceInstanceSpec )
203+ }
204+ if result .Resources [8 ].Identifier .Type != ResourceTypeServiceInstance {
205+ t .Errorf ("Resources[8].Identifier.Type = %q, want %q" ,
206+ result .Resources [8 ].Identifier .Type , ResourceTypeServiceInstance )
178207 }
179208}
180209
181210func TestGenerateRAGInstanceResources_MultiNode_CanonicalNotFirst (t * testing.T ) {
182- o := & Orchestrator {}
211+ o := newTestOrchestrator ()
183212 spec := & database.ServiceInstanceSpec {
184213 ServiceInstanceID : "storefront-rag-host2" ,
185214 ServiceSpec : & database.ServiceSpec {
@@ -204,13 +233,13 @@ func TestGenerateRAGInstanceResources_MultiNode_CanonicalNotFirst(t *testing.T)
204233 t .Fatalf ("generateRAGInstanceResources() error = %v" , err )
205234 }
206235
207- // 3 nodes → canonical(n2) + per-node(n1) + per-node(n3) + dir + keys + config = 6 resources .
208- if len (result .Resources ) != 6 {
209- t .Fatalf ("len(Resources) = %d, want 6 " , len (result .Resources ))
236+ // 3 nodes → Network + canonical(n2) + per-node(n1) + per-node(n3) + dir + keys + config + spec + instance = 9 .
237+ if len (result .Resources ) != 9 {
238+ t .Fatalf ("len(Resources) = %d, want 9 " , len (result .Resources ))
210239 }
211240
212- // Canonical (index 0 ) must be n2 with no CredentialSource
213- canonical , err := resource.ToResource [* ServiceUserRole ](result .Resources [0 ])
241+ // Canonical (index 1, after Network ) must be n2 with no CredentialSource
242+ canonical , err := resource.ToResource [* ServiceUserRole ](result .Resources [1 ])
214243 if err != nil {
215244 t .Fatalf ("ToResource canonical: %v" , err )
216245 }
@@ -224,7 +253,7 @@ func TestGenerateRAGInstanceResources_MultiNode_CanonicalNotFirst(t *testing.T)
224253 // Per-node resources must cover n1 and n3, not n2
225254 canonicalID := ServiceUserRoleIdentifier ("rag" , ServiceUserRoleRO )
226255 perNodeNames := make (map [string ]bool )
227- for i , rd := range result .Resources [1 : 3 ] {
256+ for i , rd := range result .Resources [2 : 4 ] {
228257 perNode , err := resource.ToResource [* ServiceUserRole ](rd )
229258 if err != nil {
230259 t .Fatalf ("ToResource per-node[%d]: %v" , i , err )
@@ -243,7 +272,7 @@ func TestGenerateRAGInstanceResources_MultiNode_CanonicalNotFirst(t *testing.T)
243272}
244273
245274func TestGenerateServiceInstanceResources_RAGDispatch (t * testing.T ) {
246- o := & Orchestrator {}
275+ o := newTestOrchestrator ()
247276 spec := & database.ServiceInstanceSpec {
248277 ServiceInstanceID : "db1-rag-host1" ,
249278 ServiceSpec : & database.ServiceSpec {
@@ -268,7 +297,7 @@ func TestGenerateServiceInstanceResources_RAGDispatch(t *testing.T) {
268297}
269298
270299func TestGenerateServiceInstanceResources_UnknownTypeReturnsError (t * testing.T ) {
271- o := & Orchestrator {}
300+ o := newTestOrchestrator ()
272301 spec := & database.ServiceInstanceSpec {
273302 ServiceInstanceID : "db1-unknown-host1" ,
274303 ServiceSpec : & database.ServiceSpec {
0 commit comments