@@ -38,6 +38,7 @@ import (
3838 "github.com/stretchr/testify/assert"
3939 "github.com/stretchr/testify/require"
4040 "golang.org/x/sync/errgroup"
41+ "gopkg.in/yaml.v3"
4142
4243 "github.com/pelicanplatform/pelican/config"
4344 "github.com/pelicanplatform/pelican/director"
@@ -157,60 +158,86 @@ func NewFedTest(t *testing.T, originConfig string) (ft *FedTest) {
157158 require .NoError (t , err )
158159
159160 // Read in any config we may have set
161+ var originConf interface {}
160162 if originConfig != "" {
161163 viper .SetConfigType ("yaml" )
162164 err = viper .MergeConfig (strings .NewReader (originConfig ))
163165 require .NoError (t , err , "error reading config" )
166+
167+ err := yaml .Unmarshal ([]byte (originConfig ), & originConf )
168+ require .NoError (t , err , "error unmarshalling into interface" )
169+
170+ confMap := originConf .(map [string ]interface {})
171+
172+ originRaw , exists := confMap ["Origin" ]
173+
174+ if exists {
175+ originMap := originRaw .(map [string ]interface {})
176+
177+ // Override the test directory from the config file with our temp directory
178+ if exportsRaw , ok := originMap ["Exports" ]; ok {
179+ for i , item := range exportsRaw .([]interface {}) {
180+ originDir , err := os .MkdirTemp ("" , fmt .Sprintf ("Export%d" , i ))
181+ assert .NoError (t , err )
182+ t .Cleanup (func () {
183+ err := os .RemoveAll (originDir )
184+ require .NoError (t , err )
185+ })
186+
187+ exportMap := item .(map [string ]interface {})
188+ exportMap ["StoragePrefix" ] = originDir
189+
190+ // Change the permissions of the temporary origin directory
191+ permissions = os .FileMode (0755 )
192+ err = os .Chmod (originDir , permissions )
193+ require .NoError (t , err )
194+
195+ // Change ownership on the temporary origin directory so files can be uploaded
196+ uinfo , err := config .GetDaemonUserInfo ()
197+ require .NoError (t , err )
198+ require .NoError (t , os .Chown (originDir , uinfo .Uid , uinfo .Gid ))
199+
200+ // Start off with a Hello World file we can use for testing in each of our exports
201+ err = os .WriteFile (filepath .Join (originDir , "hello_world.txt" ), []byte ("Hello, World!" ), os .FileMode (0644 ))
202+ require .NoError (t , err )
203+ }
204+ } else {
205+ originDir , err := os .MkdirTemp ("" , fmt .Sprintf ("Export%s" , "test" ))
206+ assert .NoError (t , err )
207+ t .Cleanup (func () {
208+ err := os .RemoveAll (originDir )
209+ require .NoError (t , err )
210+ })
211+
212+ originMap ["StoragePrefix" ] = originDir
213+
214+ permissions = os .FileMode (0755 )
215+ err = os .Chmod (originDir , permissions )
216+ require .NoError (t , err )
217+
218+ // Change ownership on the temporary origin directory so files can be uploaded
219+ uinfo , err := config .GetDaemonUserInfo ()
220+ require .NoError (t , err )
221+ require .NoError (t , os .Chown (originDir , uinfo .Uid , uinfo .Gid ))
222+
223+ // Start off with a Hello World file we can use for testing in the StoragePrefix
224+ err = os .WriteFile (filepath .Join (originDir , "hello_world.txt" ), []byte ("Hello, World!" ), os .FileMode (0644 ))
225+ require .NoError (t , err )
226+ }
227+ }
164228 }
165- // Now call GetOriginExports and check the struct
166- exports , err := server_utils .GetOriginExports ()
167- require .NoError (t , err , "error getting origin exports" )
168- ft .Exports = exports
169-
170- // Override the test directory from the config file with our temp directory
171- for i := 0 ; i < len (ft .Exports ); i ++ {
172- originDir , err := os .MkdirTemp ("" , fmt .Sprintf ("Export%d" , i ))
173- assert .NoError (t , err )
174- t .Cleanup (func () {
175- err := os .RemoveAll (originDir )
176- require .NoError (t , err )
177- })
178-
179- // Set the storage prefix to the temporary origin directory
180- ft .Exports [i ].StoragePrefix = originDir
181- // Our exports object becomes global -- we must reset in between each fed test
182- t .Cleanup (func () {
183- server_utils .ResetOriginExports ()
184- })
185-
186- // Change the permissions of the temporary origin directory
187- permissions = os .FileMode (0755 )
188- err = os .Chmod (originDir , permissions )
189- require .NoError (t , err )
190229
191- // Change ownership on the temporary origin directory so files can be uploaded
192- uinfo , err := config .GetDaemonUserInfo ()
193- require .NoError (t , err )
194- require .NoError (t , os .Chown (originDir , uinfo .Uid , uinfo .Gid ))
230+ confDir := t .TempDir ()
231+ outputPath := filepath .Join (confDir , "tempfile_*.yaml" )
195232
196- // Start off with a Hello World file we can use for testing in each of our exports
197- err = os .WriteFile (filepath .Join (originDir , "hello_world.txt" ), []byte ("Hello, World!" ), os .FileMode (0644 ))
198- require .NoError (t , err )
199- }
200- originConf := strings .NewReader (originConfig )
233+ outputData , err := yaml .Marshal (& originConf )
234+ require .NoError (t , err , "error marshalling struct into yaml format" )
201235
202- tmpFile , err := os .CreateTemp ("" , "tempfile_*.yaml" )
203- if err != nil {
204- t .Fatalf ("Error creating temporary config file for fed test: %v" , err )
205- }
206- defer tmpFile .Close ()
236+ err = os .WriteFile (outputPath , outputData , 0644 )
237+ require .NoError (t , err , "error writing out temporary config file for fed test" )
207238
208- _ , err = io .Copy (tmpFile , originConf )
209- if err != nil {
210- t .Fatalf ("Error writing to temporary config file for fed test: %v" , err )
211- }
239+ viper .Set ("config" , outputPath )
212240
213- viper .Set ("config" , tmpFile .Name ())
214241 servers , _ , err := launchers .LaunchModules (ctx , modules )
215242 require .NoError (t , err )
216243
@@ -275,6 +302,9 @@ func NewFedTest(t *testing.T, originConfig string) (ft *FedTest) {
275302
276303 ft .Token = token
277304
305+ ft .Exports , err = server_utils .GetOriginExports ()
306+ require .NoError (t , err )
307+
278308 // Explicitly run tmpPath cleanup AFTER cancel and egrp are done -- otherwise we end up
279309 // with a race condition where removing tmpPath might happen while the server is still
280310 // using it, resulting in "error: unlinkat <tmpPath>: directory not empty"
0 commit comments