github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/command/env_command_test.go (about)

     1  package command
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/hashicorp/terraform/backend"
    11  	"github.com/hashicorp/terraform/backend/local"
    12  	"github.com/hashicorp/terraform/state"
    13  	"github.com/hashicorp/terraform/terraform"
    14  	"github.com/mitchellh/cli"
    15  )
    16  
    17  func TestEnv_createAndChange(t *testing.T) {
    18  	// Create a temporary working directory that is empty
    19  	td := tempDir(t)
    20  	os.MkdirAll(td, 0755)
    21  	defer os.RemoveAll(td)
    22  	defer testChdir(t, td)()
    23  
    24  	newCmd := &EnvNewCommand{}
    25  
    26  	current := newCmd.Env()
    27  	if current != backend.DefaultStateName {
    28  		t.Fatal("current env should be 'default'")
    29  	}
    30  
    31  	args := []string{"test"}
    32  	ui := new(cli.MockUi)
    33  	newCmd.Meta = Meta{Ui: ui}
    34  	if code := newCmd.Run(args); code != 0 {
    35  		t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter)
    36  	}
    37  
    38  	current = newCmd.Env()
    39  	if current != "test" {
    40  		t.Fatalf("current env should be 'test', got %q", current)
    41  	}
    42  
    43  	selCmd := &EnvSelectCommand{}
    44  	args = []string{backend.DefaultStateName}
    45  	ui = new(cli.MockUi)
    46  	selCmd.Meta = Meta{Ui: ui}
    47  	if code := selCmd.Run(args); code != 0 {
    48  		t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter)
    49  	}
    50  
    51  	current = newCmd.Env()
    52  	if current != backend.DefaultStateName {
    53  		t.Fatal("current env should be 'default'")
    54  	}
    55  
    56  }
    57  
    58  // Create some environments and test the list output.
    59  // This also ensures we switch to the correct env after each call
    60  func TestEnv_createAndList(t *testing.T) {
    61  	// Create a temporary working directory that is empty
    62  	td := tempDir(t)
    63  	os.MkdirAll(td, 0755)
    64  	defer os.RemoveAll(td)
    65  	defer testChdir(t, td)()
    66  
    67  	newCmd := &EnvNewCommand{}
    68  
    69  	envs := []string{"test_a", "test_b", "test_c"}
    70  
    71  	// create multiple envs
    72  	for _, env := range envs {
    73  		ui := new(cli.MockUi)
    74  		newCmd.Meta = Meta{Ui: ui}
    75  		if code := newCmd.Run([]string{env}); code != 0 {
    76  			t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter)
    77  		}
    78  	}
    79  
    80  	listCmd := &EnvListCommand{}
    81  	ui := new(cli.MockUi)
    82  	listCmd.Meta = Meta{Ui: ui}
    83  
    84  	if code := listCmd.Run(nil); code != 0 {
    85  		t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter)
    86  	}
    87  
    88  	actual := strings.TrimSpace(ui.OutputWriter.String())
    89  	expected := "default\n  test_a\n  test_b\n* test_c"
    90  
    91  	if actual != expected {
    92  		t.Fatalf("\nexpcted: %q\nactual:  %q", expected, actual)
    93  	}
    94  }
    95  
    96  func TestEnv_createWithState(t *testing.T) {
    97  	td := tempDir(t)
    98  	os.MkdirAll(td, 0755)
    99  	defer os.RemoveAll(td)
   100  	defer testChdir(t, td)()
   101  
   102  	// create a non-empty state
   103  	originalState := &terraform.State{
   104  		Modules: []*terraform.ModuleState{
   105  			&terraform.ModuleState{
   106  				Path: []string{"root"},
   107  				Resources: map[string]*terraform.ResourceState{
   108  					"test_instance.foo": &terraform.ResourceState{
   109  						Type: "test_instance",
   110  						Primary: &terraform.InstanceState{
   111  							ID: "bar",
   112  						},
   113  					},
   114  				},
   115  			},
   116  		},
   117  	}
   118  
   119  	err := (&state.LocalState{Path: "test.tfstate"}).WriteState(originalState)
   120  	if err != nil {
   121  		t.Fatal(err)
   122  	}
   123  
   124  	args := []string{"-state", "test.tfstate", "test"}
   125  	ui := new(cli.MockUi)
   126  	newCmd := &EnvNewCommand{
   127  		Meta: Meta{Ui: ui},
   128  	}
   129  	if code := newCmd.Run(args); code != 0 {
   130  		t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter)
   131  	}
   132  
   133  	newPath := filepath.Join(local.DefaultEnvDir, "test", DefaultStateFilename)
   134  	envState := state.LocalState{Path: newPath}
   135  	err = envState.RefreshState()
   136  	if err != nil {
   137  		t.Fatal(err)
   138  	}
   139  
   140  	newState := envState.State()
   141  	if !originalState.Equal(newState) {
   142  		t.Fatalf("states not equal\norig: %s\nnew: %s", originalState, newState)
   143  	}
   144  }
   145  
   146  func TestEnv_delete(t *testing.T) {
   147  	td := tempDir(t)
   148  	os.MkdirAll(td, 0755)
   149  	defer os.RemoveAll(td)
   150  	defer testChdir(t, td)()
   151  
   152  	// create the env directories
   153  	if err := os.MkdirAll(filepath.Join(local.DefaultEnvDir, "test"), 0755); err != nil {
   154  		t.Fatal(err)
   155  	}
   156  
   157  	// create the environment file
   158  	if err := os.MkdirAll(DefaultDataDir, 0755); err != nil {
   159  		t.Fatal(err)
   160  	}
   161  	if err := ioutil.WriteFile(filepath.Join(DefaultDataDir, local.DefaultEnvFile), []byte("test"), 0644); err != nil {
   162  		t.Fatal(err)
   163  	}
   164  
   165  	ui := new(cli.MockUi)
   166  	delCmd := &EnvDeleteCommand{
   167  		Meta: Meta{Ui: ui},
   168  	}
   169  
   170  	current := delCmd.Env()
   171  	if current != "test" {
   172  		t.Fatal("wrong env:", current)
   173  	}
   174  
   175  	// we can't delete out current environment
   176  	args := []string{"test"}
   177  	if code := delCmd.Run(args); code == 0 {
   178  		t.Fatal("expected error deleting current env")
   179  	}
   180  
   181  	// change back to default
   182  	if err := delCmd.SetEnv(backend.DefaultStateName); err != nil {
   183  		t.Fatal(err)
   184  	}
   185  
   186  	// try the delete again
   187  	ui = new(cli.MockUi)
   188  	delCmd.Meta.Ui = ui
   189  	if code := delCmd.Run(args); code != 0 {
   190  		t.Fatalf("error deleting env: %s", ui.ErrorWriter)
   191  	}
   192  
   193  	current = delCmd.Env()
   194  	if current != backend.DefaultStateName {
   195  		t.Fatalf("wrong env: %q", current)
   196  	}
   197  }
   198  func TestEnv_deleteWithState(t *testing.T) {
   199  	td := tempDir(t)
   200  	os.MkdirAll(td, 0755)
   201  	defer os.RemoveAll(td)
   202  	defer testChdir(t, td)()
   203  
   204  	// create the env directories
   205  	if err := os.MkdirAll(filepath.Join(local.DefaultEnvDir, "test"), 0755); err != nil {
   206  		t.Fatal(err)
   207  	}
   208  
   209  	// create a non-empty state
   210  	originalState := &terraform.State{
   211  		Modules: []*terraform.ModuleState{
   212  			&terraform.ModuleState{
   213  				Path: []string{"root"},
   214  				Resources: map[string]*terraform.ResourceState{
   215  					"test_instance.foo": &terraform.ResourceState{
   216  						Type: "test_instance",
   217  						Primary: &terraform.InstanceState{
   218  							ID: "bar",
   219  						},
   220  					},
   221  				},
   222  			},
   223  		},
   224  	}
   225  
   226  	envStatePath := filepath.Join(local.DefaultEnvDir, "test", DefaultStateFilename)
   227  	err := (&state.LocalState{Path: envStatePath}).WriteState(originalState)
   228  	if err != nil {
   229  		t.Fatal(err)
   230  	}
   231  
   232  	ui := new(cli.MockUi)
   233  	delCmd := &EnvDeleteCommand{
   234  		Meta: Meta{Ui: ui},
   235  	}
   236  	args := []string{"test"}
   237  	if code := delCmd.Run(args); code == 0 {
   238  		t.Fatalf("expected failure without -force.\noutput: %s", ui.OutputWriter)
   239  	}
   240  
   241  	ui = new(cli.MockUi)
   242  	delCmd.Meta.Ui = ui
   243  
   244  	args = []string{"-force", "test"}
   245  	if code := delCmd.Run(args); code != 0 {
   246  		t.Fatalf("failure: %s", ui.ErrorWriter)
   247  	}
   248  
   249  	if _, err := os.Stat(filepath.Join(local.DefaultEnvDir, "test")); !os.IsNotExist(err) {
   250  		t.Fatal("env 'test' still exists!")
   251  	}
   252  }