mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-25 18:45:20 -06:00
Merge pull request #16487 from hashicorp/jbardin/from-module
init -from-module
This commit is contained in:
commit
90a7c7aed9
@ -9,8 +9,6 @@ import (
|
|||||||
|
|
||||||
"github.com/posener/complete"
|
"github.com/posener/complete"
|
||||||
|
|
||||||
"github.com/hashicorp/go-getter"
|
|
||||||
|
|
||||||
multierror "github.com/hashicorp/go-multierror"
|
multierror "github.com/hashicorp/go-multierror"
|
||||||
"github.com/hashicorp/terraform/backend"
|
"github.com/hashicorp/terraform/backend"
|
||||||
"github.com/hashicorp/terraform/config"
|
"github.com/hashicorp/terraform/config"
|
||||||
@ -131,7 +129,8 @@ func (c *InitCommand) Run(args []string) int {
|
|||||||
)))
|
)))
|
||||||
header = true
|
header = true
|
||||||
|
|
||||||
if err := c.copyConfigFromModule(path, src, pwd); err != nil {
|
s := module.NewStorage("", c.Services, c.Credentials)
|
||||||
|
if err := s.GetModule(path, src); err != nil {
|
||||||
c.Ui.Error(fmt.Sprintf("Error copying source module: %s", err))
|
c.Ui.Error(fmt.Sprintf("Error copying source module: %s", err))
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
@ -272,19 +271,6 @@ func (c *InitCommand) Run(args []string) int {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *InitCommand) copyConfigFromModule(dst, src, pwd string) error {
|
|
||||||
// errors from this function will be prefixed with "Error copying source module: "
|
|
||||||
// when returned to the user.
|
|
||||||
var err error
|
|
||||||
|
|
||||||
src, err = getter.Detect(src, pwd, getter.Detectors)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("invalid module source: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return module.GetCopy(dst, src)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load the complete module tree, and fetch any missing providers.
|
// Load the complete module tree, and fetch any missing providers.
|
||||||
// This method outputs its own Ui.
|
// This method outputs its own Ui.
|
||||||
func (c *InitCommand) getProviders(path string, state *terraform.State, upgrade bool) error {
|
func (c *InitCommand) getProviders(path string, state *terraform.State, upgrade bool) error {
|
||||||
|
@ -243,6 +243,41 @@ func (s Storage) findModule(key string) (string, error) {
|
|||||||
return s.moduleDir(key)
|
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
|
// find a registry module
|
||||||
func (s Storage) findRegistryModule(mSource, constraint string) (moduleRecord, error) {
|
func (s Storage) findRegistryModule(mSource, constraint string) (moduleRecord, error) {
|
||||||
rec := moduleRecord{
|
rec := moduleRecord{
|
||||||
|
49
config/module/storage_test.go
Normal file
49
config/module/storage_test.go
Normal 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)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user