Storage.GetModule

Add GetModule for the cli to initialize from a regisry module source.

Storage.GetModule fetches a module using the same detection and
discovery as used by the normal module loading. The final copy is still
done by module.GetCopy to remove vcs files.
This commit is contained in:
James Bardin 2017-10-27 19:17:26 -04:00
parent 9df2389ba2
commit eef2129f1a
2 changed files with 84 additions and 0 deletions

View File

@ -243,6 +243,41 @@ func (s Storage) findModule(key string) (string, error) {
return s.moduleDir(key)
}
// GetModule fetches a module source into the specified directory. This is used
// as a convenience function by the CLI to initialize a configuration.
func (s Storage) GetModule(dst, src string) error {
// reset this in case the caller was going to re-use it
mode := s.Mode
s.Mode = GetModeUpdate
defer func() {
s.Mode = mode
}()
rec, err := s.findRegistryModule(src, anyVersion)
if err != nil {
return err
}
pwd, err := os.Getwd()
if err != nil {
return err
}
source := rec.url
if source == "" {
source, err = getter.Detect(src, pwd, getter.Detectors)
if err != nil {
return fmt.Errorf("module %s: %s", src, err)
}
}
if source == "" {
return fmt.Errorf("module %q not found", src)
}
return GetCopy(dst, source)
}
// find a registry module
func (s Storage) findRegistryModule(mSource, constraint string) (moduleRecord, error) {
rec := moduleRecord{

View File

@ -0,0 +1,49 @@
package module
import (
"io/ioutil"
"os"
"path/filepath"
"testing"
)
func TestGetModule(t *testing.T) {
server := mockRegistry()
defer server.Close()
disco := testDisco(server)
td, err := ioutil.TempDir("", "tf")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(td)
storage := NewStorage(td, disco, nil)
// this module exists in a test fixture, and is known by the mockRegistry
// relative to our cwd.
err = storage.GetModule(filepath.Join(td, "foo"), "registry/local/sub")
if err != nil {
t.Fatal(err)
}
// list everything to make sure nothing else got unpacked in here
ls, err := ioutil.ReadDir(td)
if err != nil {
t.Fatal(err)
}
var names []string
for _, info := range ls {
names = append(names, info.Name())
}
if !(len(names) == 1 && names[0] == "foo") {
t.Fatalf("expected only directory 'foo', found entries %q", names)
}
_, err = os.Stat(filepath.Join(td, "foo", "main.tf"))
if err != nil {
t.Fatal(err)
}
}