github.com/paultyng/terraform@v0.6.11-0.20180227224804-66ff8f8bed40/configs/configload/loader_install_test.go (about)

     1  package configload
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"strings"
     7  	"testing"
     8  
     9  	version "github.com/hashicorp/go-version"
    10  	"github.com/hashicorp/terraform/configs"
    11  )
    12  
    13  func TestLoaderInstallModules_local(t *testing.T) {
    14  	fixtureDir := filepath.Clean("test-fixtures/local-modules")
    15  	loader, done := tempChdirLoader(t, fixtureDir)
    16  	defer done()
    17  
    18  	hooks := &testInstallHooks{}
    19  
    20  	diags := loader.InstallModules(".", false, hooks)
    21  	assertNoDiagnostics(t, diags)
    22  
    23  	wantCalls := []testInstallHookCall{
    24  		{
    25  			Name:        "Install",
    26  			ModuleAddr:  "child_a",
    27  			PackageAddr: "",
    28  			LocalPath:   "child_a",
    29  		},
    30  		{
    31  			Name:        "Install",
    32  			ModuleAddr:  "child_a.child_b",
    33  			PackageAddr: "",
    34  			LocalPath:   "child_a/child_b",
    35  		},
    36  	}
    37  
    38  	if assertResultDeepEqual(t, hooks.Calls, wantCalls) {
    39  		return
    40  	}
    41  
    42  	// Make sure the configuration is loadable now.
    43  	// (This ensures that correct information is recorded in the manifest.)
    44  	config, loadDiags := loader.LoadConfig(".")
    45  	assertNoDiagnostics(t, loadDiags)
    46  
    47  	wantTraces := map[string]string{
    48  		"":                "in root module",
    49  		"child_a":         "in child_a module",
    50  		"child_a.child_b": "in child_b module",
    51  	}
    52  	gotTraces := map[string]string{}
    53  	config.DeepEach(func(c *configs.Config) {
    54  		path := strings.Join(c.Path, ".")
    55  		if c.Module.Variables["v"] == nil {
    56  			gotTraces[path] = "<missing>"
    57  			return
    58  		}
    59  		varDesc := c.Module.Variables["v"].Description
    60  		gotTraces[path] = varDesc
    61  	})
    62  	assertResultDeepEqual(t, gotTraces, wantTraces)
    63  }
    64  
    65  func TestLoaderInstallModules_registry(t *testing.T) {
    66  	if os.Getenv("TF_ACC") == "" {
    67  		t.Skip("this test accesses registry.terraform.io and github.com; set TF_ACC=1 to run it")
    68  	}
    69  
    70  	fixtureDir := filepath.Clean("test-fixtures/registry-modules")
    71  	loader, done := tempChdirLoader(t, fixtureDir)
    72  	defer done()
    73  
    74  	hooks := &testInstallHooks{}
    75  
    76  	diags := loader.InstallModules(".", false, hooks)
    77  	assertNoDiagnostics(t, diags)
    78  
    79  	v := version.Must(version.NewVersion("0.0.1"))
    80  
    81  	wantCalls := []testInstallHookCall{
    82  		// the configuration builder visits each level of calls in lexicographical
    83  		// order by name, so the following list is kept in the same order.
    84  
    85  		// acctest_child_a accesses //modules/child_a directly
    86  		{
    87  			Name:        "Download",
    88  			ModuleAddr:  "acctest_child_a",
    89  			PackageAddr: "hashicorp/module-installer-acctest/aws", // intentionally excludes the subdir because we're downloading the whole package here
    90  			Version:     v,
    91  		},
    92  		{
    93  			Name:       "Install",
    94  			ModuleAddr: "acctest_child_a",
    95  			Version:    v,
    96  			LocalPath:  ".terraform/modules/acctest_child_a/hashicorp-terraform-aws-module-installer-acctest-853d038/modules/child_a",
    97  		},
    98  
    99  		// acctest_child_a.child_b
   100  		// (no download because it's a relative path inside acctest_child_a)
   101  		{
   102  			Name:       "Install",
   103  			ModuleAddr: "acctest_child_a.child_b",
   104  			LocalPath:  ".terraform/modules/acctest_child_a/hashicorp-terraform-aws-module-installer-acctest-853d038/modules/child_b",
   105  		},
   106  
   107  		// acctest_child_b accesses //modules/child_b directly
   108  		{
   109  			Name:        "Download",
   110  			ModuleAddr:  "acctest_child_b",
   111  			PackageAddr: "hashicorp/module-installer-acctest/aws", // intentionally excludes the subdir because we're downloading the whole package here
   112  			Version:     v,
   113  		},
   114  		{
   115  			Name:       "Install",
   116  			ModuleAddr: "acctest_child_b",
   117  			Version:    v,
   118  			LocalPath:  ".terraform/modules/acctest_child_b/hashicorp-terraform-aws-module-installer-acctest-853d038/modules/child_b",
   119  		},
   120  
   121  		// acctest_root
   122  		{
   123  			Name:        "Download",
   124  			ModuleAddr:  "acctest_root",
   125  			PackageAddr: "hashicorp/module-installer-acctest/aws",
   126  			Version:     v,
   127  		},
   128  		{
   129  			Name:       "Install",
   130  			ModuleAddr: "acctest_root",
   131  			Version:    v,
   132  			LocalPath:  ".terraform/modules/acctest_root/hashicorp-terraform-aws-module-installer-acctest-853d038",
   133  		},
   134  
   135  		// acctest_root.child_a
   136  		// (no download because it's a relative path inside acctest_root)
   137  		{
   138  			Name:       "Install",
   139  			ModuleAddr: "acctest_root.child_a",
   140  			LocalPath:  ".terraform/modules/acctest_root/hashicorp-terraform-aws-module-installer-acctest-853d038/modules/child_a",
   141  		},
   142  
   143  		// acctest_root.child_a.child_b
   144  		// (no download because it's a relative path inside acctest_root, via acctest_root.child_a)
   145  		{
   146  			Name:       "Install",
   147  			ModuleAddr: "acctest_root.child_a.child_b",
   148  			LocalPath:  ".terraform/modules/acctest_root/hashicorp-terraform-aws-module-installer-acctest-853d038/modules/child_b",
   149  		},
   150  	}
   151  
   152  	if assertResultDeepEqual(t, hooks.Calls, wantCalls) {
   153  		return
   154  	}
   155  
   156  	// Make sure the configuration is loadable now.
   157  	// (This ensures that correct information is recorded in the manifest.)
   158  	config, loadDiags := loader.LoadConfig(".")
   159  	assertNoDiagnostics(t, loadDiags)
   160  
   161  	wantTraces := map[string]string{
   162  		"":                             "in local caller for registry-modules",
   163  		"acctest_root":                 "in root module",
   164  		"acctest_root.child_a":         "in child_a module",
   165  		"acctest_root.child_a.child_b": "in child_b module",
   166  		"acctest_child_a":              "in child_a module",
   167  		"acctest_child_a.child_b":      "in child_b module",
   168  		"acctest_child_b":              "in child_b module",
   169  	}
   170  	gotTraces := map[string]string{}
   171  	config.DeepEach(func(c *configs.Config) {
   172  		path := strings.Join(c.Path, ".")
   173  		if c.Module.Variables["v"] == nil {
   174  			gotTraces[path] = "<missing>"
   175  			return
   176  		}
   177  		varDesc := c.Module.Variables["v"].Description
   178  		gotTraces[path] = varDesc
   179  	})
   180  	assertResultDeepEqual(t, gotTraces, wantTraces)
   181  
   182  }
   183  
   184  func TestLoaderInstallModules_goGetter(t *testing.T) {
   185  	if os.Getenv("TF_ACC") == "" {
   186  		t.Skip("this test accesses github.com; set TF_ACC=1 to run it")
   187  	}
   188  
   189  	fixtureDir := filepath.Clean("test-fixtures/go-getter-modules")
   190  	loader, done := tempChdirLoader(t, fixtureDir)
   191  	defer done()
   192  
   193  	hooks := &testInstallHooks{}
   194  
   195  	diags := loader.InstallModules(".", false, hooks)
   196  	assertNoDiagnostics(t, diags)
   197  
   198  	wantCalls := []testInstallHookCall{
   199  		// the configuration builder visits each level of calls in lexicographical
   200  		// order by name, so the following list is kept in the same order.
   201  
   202  		// acctest_child_a accesses //modules/child_a directly
   203  		{
   204  			Name:        "Download",
   205  			ModuleAddr:  "acctest_child_a",
   206  			PackageAddr: "github.com/hashicorp/terraform-aws-module-installer-acctest?ref=v0.0.1", // intentionally excludes the subdir because we're downloading the whole repo here
   207  		},
   208  		{
   209  			Name:       "Install",
   210  			ModuleAddr: "acctest_child_a",
   211  			LocalPath:  ".terraform/modules/acctest_child_a/modules/child_a",
   212  		},
   213  
   214  		// acctest_child_a.child_b
   215  		// (no download because it's a relative path inside acctest_child_a)
   216  		{
   217  			Name:       "Install",
   218  			ModuleAddr: "acctest_child_a.child_b",
   219  			LocalPath:  ".terraform/modules/acctest_child_a/modules/child_b",
   220  		},
   221  
   222  		// acctest_child_b accesses //modules/child_b directly
   223  		{
   224  			Name:        "Download",
   225  			ModuleAddr:  "acctest_child_b",
   226  			PackageAddr: "github.com/hashicorp/terraform-aws-module-installer-acctest?ref=v0.0.1", // intentionally excludes the subdir because we're downloading the whole package here
   227  		},
   228  		{
   229  			Name:       "Install",
   230  			ModuleAddr: "acctest_child_b",
   231  			LocalPath:  ".terraform/modules/acctest_child_b/modules/child_b",
   232  		},
   233  
   234  		// acctest_root
   235  		{
   236  			Name:        "Download",
   237  			ModuleAddr:  "acctest_root",
   238  			PackageAddr: "github.com/hashicorp/terraform-aws-module-installer-acctest?ref=v0.0.1",
   239  		},
   240  		{
   241  			Name:       "Install",
   242  			ModuleAddr: "acctest_root",
   243  			LocalPath:  ".terraform/modules/acctest_root",
   244  		},
   245  
   246  		// acctest_root.child_a
   247  		// (no download because it's a relative path inside acctest_root)
   248  		{
   249  			Name:       "Install",
   250  			ModuleAddr: "acctest_root.child_a",
   251  			LocalPath:  ".terraform/modules/acctest_root/modules/child_a",
   252  		},
   253  
   254  		// acctest_root.child_a.child_b
   255  		// (no download because it's a relative path inside acctest_root, via acctest_root.child_a)
   256  		{
   257  			Name:       "Install",
   258  			ModuleAddr: "acctest_root.child_a.child_b",
   259  			LocalPath:  ".terraform/modules/acctest_root/modules/child_b",
   260  		},
   261  	}
   262  
   263  	if assertResultDeepEqual(t, hooks.Calls, wantCalls) {
   264  		return
   265  	}
   266  
   267  	// Make sure the configuration is loadable now.
   268  	// (This ensures that correct information is recorded in the manifest.)
   269  	config, loadDiags := loader.LoadConfig(".")
   270  	assertNoDiagnostics(t, loadDiags)
   271  
   272  	wantTraces := map[string]string{
   273  		"":                             "in local caller for go-getter-modules",
   274  		"acctest_root":                 "in root module",
   275  		"acctest_root.child_a":         "in child_a module",
   276  		"acctest_root.child_a.child_b": "in child_b module",
   277  		"acctest_child_a":              "in child_a module",
   278  		"acctest_child_a.child_b":      "in child_b module",
   279  		"acctest_child_b":              "in child_b module",
   280  	}
   281  	gotTraces := map[string]string{}
   282  	config.DeepEach(func(c *configs.Config) {
   283  		path := strings.Join(c.Path, ".")
   284  		if c.Module.Variables["v"] == nil {
   285  			gotTraces[path] = "<missing>"
   286  			return
   287  		}
   288  		varDesc := c.Module.Variables["v"].Description
   289  		gotTraces[path] = varDesc
   290  	})
   291  	assertResultDeepEqual(t, gotTraces, wantTraces)
   292  
   293  }
   294  
   295  type testInstallHooks struct {
   296  	Calls []testInstallHookCall
   297  }
   298  
   299  type testInstallHookCall struct {
   300  	Name        string
   301  	ModuleAddr  string
   302  	PackageAddr string
   303  	Version     *version.Version
   304  	LocalPath   string
   305  }
   306  
   307  func (h *testInstallHooks) Download(moduleAddr, packageAddr string, version *version.Version) {
   308  	h.Calls = append(h.Calls, testInstallHookCall{
   309  		Name:        "Download",
   310  		ModuleAddr:  moduleAddr,
   311  		PackageAddr: packageAddr,
   312  		Version:     version,
   313  	})
   314  }
   315  
   316  func (h *testInstallHooks) Install(moduleAddr string, version *version.Version, localPath string) {
   317  	h.Calls = append(h.Calls, testInstallHookCall{
   318  		Name:       "Install",
   319  		ModuleAddr: moduleAddr,
   320  		Version:    version,
   321  		LocalPath:  localPath,
   322  	})
   323  }