2022-07-14 17:14:24 +00:00
|
|
|
package s3
|
|
|
|
|
|
|
|
|
|
import (
|
2025-06-30 20:45:39 +00:00
|
|
|
"context"
|
|
|
|
|
"errors"
|
2022-07-14 17:14:24 +00:00
|
|
|
"os"
|
|
|
|
|
"testing"
|
|
|
|
|
|
2025-06-30 20:45:39 +00:00
|
|
|
"github.com/aws/aws-sdk-go-v2/service/s3"
|
|
|
|
|
"github.com/aws/aws-sdk-go-v2/service/s3/types"
|
2022-07-14 17:14:24 +00:00
|
|
|
"github.com/fleetdm/fleet/v4/server/config"
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
2025-02-27 20:37:56 +00:00
|
|
|
accessKeyID = "minio"
|
|
|
|
|
secretAccessKey = "minio123!"
|
2025-06-30 20:45:39 +00:00
|
|
|
testEndpoint = "http://localhost:9000"
|
2022-07-14 17:14:24 +00:00
|
|
|
)
|
|
|
|
|
|
2024-04-24 14:18:58 +00:00
|
|
|
func SetupTestSoftwareInstallerStore(tb testing.TB, bucket, prefix string) *SoftwareInstallerStore {
|
|
|
|
|
store := setupTestStore(tb, bucket, prefix, NewSoftwareInstallerStore)
|
|
|
|
|
tb.Cleanup(func() { cleanupStore(tb, store.s3store) })
|
|
|
|
|
return store
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-13 12:27:10 +00:00
|
|
|
func SetupTestBootstrapPackageStore(tb testing.TB, bucket, prefix string) *BootstrapPackageStore {
|
|
|
|
|
store := setupTestStore(tb, bucket, prefix, NewBootstrapPackageStore)
|
|
|
|
|
tb.Cleanup(func() { cleanupStore(tb, store.s3store) })
|
|
|
|
|
return store
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-05 22:31:03 +00:00
|
|
|
func SetupTestSoftwareTitleIconStore(tb testing.TB, bucket, prefix string) *SoftwareTitleIconStore {
|
|
|
|
|
store := setupTestStore(tb, bucket, prefix, NewSoftwareTitleIconStore)
|
|
|
|
|
tb.Cleanup(func() { cleanupStore(tb, store.s3store) })
|
|
|
|
|
return store
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-24 14:18:58 +00:00
|
|
|
type testBucketCreator interface {
|
2025-06-30 20:45:39 +00:00
|
|
|
CreateTestBucket(ctx context.Context, name string) error
|
2024-04-24 14:18:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func setupTestStore[T testBucketCreator](tb testing.TB, bucket, prefix string, newFn func(config.S3Config) (T, error)) T {
|
2022-07-14 17:14:24 +00:00
|
|
|
checkEnv(tb)
|
|
|
|
|
|
2024-04-24 14:18:58 +00:00
|
|
|
store, err := newFn(config.S3Config{
|
2024-06-10 17:35:27 +00:00
|
|
|
SoftwareInstallersBucket: bucket,
|
|
|
|
|
SoftwareInstallersPrefix: prefix,
|
|
|
|
|
SoftwareInstallersRegion: "minio",
|
|
|
|
|
SoftwareInstallersEndpointURL: testEndpoint,
|
|
|
|
|
SoftwareInstallersAccessKeyID: accessKeyID,
|
|
|
|
|
SoftwareInstallersSecretAccessKey: secretAccessKey,
|
|
|
|
|
SoftwareInstallersForceS3PathStyle: true,
|
|
|
|
|
SoftwareInstallersDisableSSL: true,
|
|
|
|
|
|
|
|
|
|
CarvesBucket: bucket,
|
|
|
|
|
CarvesPrefix: prefix,
|
|
|
|
|
CarvesRegion: "minio",
|
|
|
|
|
CarvesEndpointURL: testEndpoint,
|
|
|
|
|
CarvesAccessKeyID: accessKeyID,
|
|
|
|
|
CarvesSecretAccessKey: secretAccessKey,
|
|
|
|
|
CarvesForceS3PathStyle: true,
|
|
|
|
|
CarvesDisableSSL: true,
|
2022-07-14 17:14:24 +00:00
|
|
|
})
|
|
|
|
|
require.Nil(tb, err)
|
|
|
|
|
|
2025-06-30 20:45:39 +00:00
|
|
|
err = store.CreateTestBucket(context.Background(), bucket)
|
2022-07-15 15:20:24 +00:00
|
|
|
require.NoError(tb, err)
|
2022-07-14 17:14:24 +00:00
|
|
|
|
|
|
|
|
return store
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-24 14:18:58 +00:00
|
|
|
func cleanupStore(tb testing.TB, store *s3store) {
|
2022-07-14 17:14:24 +00:00
|
|
|
checkEnv(tb)
|
2024-04-24 14:18:58 +00:00
|
|
|
|
2025-06-30 20:45:39 +00:00
|
|
|
ctx := context.Background()
|
|
|
|
|
resp, err := store.s3Client.ListObjects(ctx, &s3.ListObjectsInput{
|
2022-07-14 17:14:24 +00:00
|
|
|
Bucket: &store.bucket,
|
|
|
|
|
})
|
2025-06-30 20:45:39 +00:00
|
|
|
var noSuchBucket *types.NoSuchBucket
|
|
|
|
|
if errors.As(err, &noSuchBucket) {
|
|
|
|
|
// OK, nothing to clean-up if the bucket no longer exists, no error
|
|
|
|
|
return
|
2024-08-13 12:27:10 +00:00
|
|
|
}
|
2022-07-14 17:14:24 +00:00
|
|
|
require.NoError(tb, err)
|
|
|
|
|
|
2025-06-30 20:45:39 +00:00
|
|
|
var objs []types.ObjectIdentifier
|
2022-07-14 17:14:24 +00:00
|
|
|
for _, o := range resp.Contents {
|
2025-06-30 20:45:39 +00:00
|
|
|
objs = append(objs, types.ObjectIdentifier{
|
|
|
|
|
Key: o.Key,
|
|
|
|
|
})
|
2022-07-14 17:14:24 +00:00
|
|
|
}
|
2024-04-24 14:18:58 +00:00
|
|
|
if len(objs) > 0 {
|
2025-06-30 20:45:39 +00:00
|
|
|
_, err = store.s3Client.DeleteObjects(ctx, &s3.DeleteObjectsInput{
|
2024-04-24 14:18:58 +00:00
|
|
|
Bucket: &store.bucket,
|
2025-06-30 20:45:39 +00:00
|
|
|
Delete: &types.Delete{
|
2024-04-24 14:18:58 +00:00
|
|
|
Objects: objs,
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
require.NoError(tb, err)
|
|
|
|
|
}
|
2022-07-14 17:14:24 +00:00
|
|
|
|
2025-06-30 20:45:39 +00:00
|
|
|
_, err = store.s3Client.DeleteBucket(ctx, &s3.DeleteBucketInput{
|
2022-07-14 17:14:24 +00:00
|
|
|
Bucket: &store.bucket,
|
|
|
|
|
})
|
|
|
|
|
require.NoError(tb, err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func checkEnv(tb testing.TB) {
|
|
|
|
|
if _, ok := os.LookupEnv("MINIO_STORAGE_TEST"); !ok {
|
|
|
|
|
tb.Skip("set MINIO_STORAGE_TEST environment variable to run S3-based tests")
|
|
|
|
|
}
|
|
|
|
|
}
|