| package etcd |
| |
| import ( |
| "context" |
| "fmt" |
| "testing" |
| "time" |
| |
| "github.com/hashicorp/terraform/internal/backend" |
| "github.com/hashicorp/terraform/internal/states/remote" |
| "github.com/hashicorp/terraform/internal/states/statemgr" |
| ) |
| |
| func TestRemoteClient_impl(t *testing.T) { |
| var _ remote.Client = new(RemoteClient) |
| } |
| |
| func TestRemoteClient(t *testing.T) { |
| prepareEtcdv3(t) |
| defer cleanupEtcdv3(t) |
| |
| prefix := fmt.Sprintf("%s/%s/", keyPrefix, time.Now().Format(time.RFC3339)) |
| |
| // Get the backend |
| b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{ |
| "endpoints": stringsToInterfaces(etcdv3Endpoints), |
| "prefix": prefix, |
| })) |
| |
| // Grab the client |
| state, err := b.StateMgr(backend.DefaultStateName) |
| if err != nil { |
| t.Fatalf("Error: %s.", err) |
| } |
| |
| // Test |
| remote.TestClient(t, state.(*remote.State).Client) |
| } |
| |
| func TestEtcdv3_stateLock(t *testing.T) { |
| prepareEtcdv3(t) |
| defer cleanupEtcdv3(t) |
| |
| prefix := fmt.Sprintf("%s/%s/", keyPrefix, time.Now().Format(time.RFC3339)) |
| |
| // Get the backend |
| s1, err := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{ |
| "endpoints": stringsToInterfaces(etcdv3Endpoints), |
| "prefix": prefix, |
| })).StateMgr(backend.DefaultStateName) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| s2, err := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{ |
| "endpoints": stringsToInterfaces(etcdv3Endpoints), |
| "prefix": prefix, |
| })).StateMgr(backend.DefaultStateName) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| remote.TestRemoteLocks(t, s1.(*remote.State).Client, s2.(*remote.State).Client) |
| } |
| |
| func TestEtcdv3_destroyLock(t *testing.T) { |
| prepareEtcdv3(t) |
| defer cleanupEtcdv3(t) |
| |
| prefix := fmt.Sprintf("%s/%s/", keyPrefix, time.Now().Format(time.RFC3339)) |
| |
| // Get the backend |
| b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{ |
| "endpoints": stringsToInterfaces(etcdv3Endpoints), |
| "prefix": prefix, |
| })) |
| |
| // Grab the client |
| s, err := b.StateMgr(backend.DefaultStateName) |
| if err != nil { |
| t.Fatalf("err: %s", err) |
| } |
| |
| c := s.(*remote.State).Client.(*RemoteClient) |
| |
| info := statemgr.NewLockInfo() |
| id, err := c.Lock(info) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| if err := c.Unlock(id); err != nil { |
| t.Fatal(err) |
| } |
| |
| res, err := c.Client.KV.Get(context.TODO(), c.info.Path) |
| if err != nil { |
| t.Fatal(err) |
| } |
| if res.Count != 0 { |
| t.Fatalf("lock key not cleaned up at: %s", string(res.Kvs[0].Key)) |
| } |
| } |