package manta import ( "context" "fmt" "os" "path" "testing" "time" "github.com/hashicorp/terraform/internal/backend" "github.com/joyent/triton-go/storage" ) func testACC(t *testing.T) { skip := os.Getenv("TF_ACC") == "" && os.Getenv("TF_MANTA_TEST") == "" if skip { t.Log("Manta backend tests require setting TF_ACC or TF_MANTA_TEST") t.Skip() } skip = os.Getenv("TRITON_ACCOUNT") == "" && os.Getenv("SDC_ACCOUNT") == "" if skip { t.Fatal("Manta backend tests require setting TRITON_ACCOUNT or SDC_ACCOUNT") } skip = os.Getenv("TRITON_KEY_ID") == "" && os.Getenv("SDC_KEY_ID") == "" if skip { t.Fatal("Manta backend tests require setting TRITON_KEY_ID or SDC_KEY_ID") } } func TestBackend_impl(t *testing.T) { var _ backend.Backend = new(Backend) } func TestBackend(t *testing.T) { testACC(t) directory := fmt.Sprintf("terraform-remote-manta-test-%x", time.Now().Unix()) keyName := "testState" b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{ "path": directory, "object_name": keyName, })).(*Backend) createMantaFolder(t, b.storageClient, directory) defer deleteMantaFolder(t, b.storageClient, directory) backend.TestBackendStates(t, b) } func TestBackendLocked(t *testing.T) { testACC(t) directory := fmt.Sprintf("terraform-remote-manta-test-%x", time.Now().Unix()) keyName := "testState" b1 := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{ "path": directory, "object_name": keyName, })).(*Backend) b2 := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{ "path": directory, "object_name": keyName, })).(*Backend) createMantaFolder(t, b1.storageClient, directory) defer deleteMantaFolder(t, b1.storageClient, directory) backend.TestBackendStateLocks(t, b1, b2) backend.TestBackendStateForceUnlock(t, b1, b2) } func createMantaFolder(t *testing.T, mantaClient *storage.StorageClient, directoryName string) { // Be clear about what we're doing in case the user needs to clean // this up later. //t.Logf("creating Manta directory %s", directoryName) err := mantaClient.Dir().Put(context.Background(), &storage.PutDirectoryInput{ DirectoryName: path.Join(mantaDefaultRootStore, directoryName), }) if err != nil { t.Fatal("failed to create test Manta directory:", err) } } func deleteMantaFolder(t *testing.T, mantaClient *storage.StorageClient, directoryName string) { //warning := "WARNING: Failed to delete the test Manta directory. It may have been left in your Manta account and may incur storage charges. (error was %s)" // first we have to get rid of the env objects, or we can't delete the directory objs, err := mantaClient.Dir().List(context.Background(), &storage.ListDirectoryInput{ DirectoryName: path.Join(mantaDefaultRootStore, directoryName), }) if err != nil { t.Fatal("failed to retrieve directory listing") } for _, obj := range objs.Entries { if obj.Type == "directory" { ojs, err := mantaClient.Dir().List(context.Background(), &storage.ListDirectoryInput{ DirectoryName: path.Join(mantaDefaultRootStore, directoryName, obj.Name), }) if err != nil { t.Fatal("failed to retrieve directory listing") } for _, oj := range ojs.Entries { err := mantaClient.Objects().Delete(context.Background(), &storage.DeleteObjectInput{ ObjectPath: path.Join(mantaDefaultRootStore, directoryName, obj.Name, oj.Name), }) if err != nil { t.Fatal(err) } } } err := mantaClient.Objects().Delete(context.Background(), &storage.DeleteObjectInput{ ObjectPath: path.Join(mantaDefaultRootStore, directoryName, obj.Name), }) if err != nil { t.Fatal(err) } } err = mantaClient.Dir().Delete(context.Background(), &storage.DeleteDirectoryInput{ DirectoryName: path.Join(mantaDefaultRootStore, directoryName), }) if err != nil { t.Fatal("failed to delete manta directory") } }