Merge pull request #27582 from hashicorp/pselle/reuse_targetdir_providers
Reuse installed target dir providers in init
This commit is contained in:
commit
dd7b412d56
|
@ -310,6 +310,15 @@ NeedProvider:
|
||||||
preferredHashes = lock.PreferredHashes()
|
preferredHashes = lock.PreferredHashes()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If our target directory already has the provider version that fulfills the lock file, carry on
|
||||||
|
if installed := i.targetDir.ProviderVersion(provider, version); installed != nil {
|
||||||
|
if len(preferredHashes) > 0 {
|
||||||
|
if matches, _ := installed.MatchesAnyHash(preferredHashes); matches {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if i.globalCacheDir != nil {
|
if i.globalCacheDir != nil {
|
||||||
// Step 3a: If our global cache already has this version available then
|
// Step 3a: If our global cache already has this version available then
|
||||||
// we'll just link it in.
|
// we'll just link it in.
|
||||||
|
|
|
@ -553,6 +553,103 @@ func TestEnsureProviderVersions(t *testing.T) {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"skipped install of one previously-locked and installed provider": {
|
||||||
|
Source: getproviders.NewMockSource(
|
||||||
|
[]getproviders.PackageMeta{
|
||||||
|
{
|
||||||
|
Provider: beepProvider,
|
||||||
|
Version: getproviders.MustParseVersion("2.0.0"),
|
||||||
|
TargetPlatform: fakePlatform,
|
||||||
|
Location: beepProviderDir,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
nil,
|
||||||
|
),
|
||||||
|
LockFile: `
|
||||||
|
provider "example.com/foo/beep" {
|
||||||
|
version = "2.0.0"
|
||||||
|
constraints = ">= 2.0.0"
|
||||||
|
hashes = [
|
||||||
|
"h1:2y06Ykj0FRneZfGCTxI9wRTori8iB7ZL5kQ6YyEnh84=",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
Prepare: func(t *testing.T, inst *Installer, dir *Dir) {
|
||||||
|
_, err := dir.InstallPackage(
|
||||||
|
context.Background(),
|
||||||
|
getproviders.PackageMeta{
|
||||||
|
Provider: beepProvider,
|
||||||
|
Version: getproviders.MustParseVersion("2.0.0"),
|
||||||
|
TargetPlatform: fakePlatform,
|
||||||
|
Location: beepProviderDir,
|
||||||
|
},
|
||||||
|
nil,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("installation to the test dir failed: %s", err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Mode: InstallNewProvidersOnly,
|
||||||
|
Reqs: getproviders.Requirements{
|
||||||
|
beepProvider: getproviders.MustParseVersionConstraints(">= 2.0.0"),
|
||||||
|
},
|
||||||
|
Check: func(t *testing.T, dir *Dir, locks *depsfile.Locks) {
|
||||||
|
if allCached := dir.AllAvailablePackages(); len(allCached) != 1 {
|
||||||
|
t.Errorf("wrong number of cache directory entries; want only one\n%s", spew.Sdump(allCached))
|
||||||
|
}
|
||||||
|
if allLocked := locks.AllProviders(); len(allLocked) != 1 {
|
||||||
|
t.Errorf("wrong number of provider lock entries; want only one\n%s", spew.Sdump(allLocked))
|
||||||
|
}
|
||||||
|
|
||||||
|
gotLock := locks.Provider(beepProvider)
|
||||||
|
wantLock := depsfile.NewProviderLock(
|
||||||
|
beepProvider,
|
||||||
|
getproviders.MustParseVersion("2.0.0"),
|
||||||
|
getproviders.MustParseVersionConstraints(">= 2.0.0"),
|
||||||
|
[]getproviders.Hash{"h1:2y06Ykj0FRneZfGCTxI9wRTori8iB7ZL5kQ6YyEnh84="},
|
||||||
|
)
|
||||||
|
if diff := cmp.Diff(wantLock, gotLock, depsfile.ProviderLockComparer); diff != "" {
|
||||||
|
t.Errorf("wrong lock entry\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
gotEntry := dir.ProviderLatestVersion(beepProvider)
|
||||||
|
wantEntry := &CachedProvider{
|
||||||
|
Provider: beepProvider,
|
||||||
|
Version: getproviders.MustParseVersion("2.0.0"),
|
||||||
|
PackageDir: filepath.Join(dir.BasePath(), "example.com/foo/beep/2.0.0/bleep_bloop"),
|
||||||
|
}
|
||||||
|
if diff := cmp.Diff(wantEntry, gotEntry); diff != "" {
|
||||||
|
t.Errorf("wrong cache entry\n%s", diff)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
WantEvents: func(inst *Installer, dir *Dir) map[addrs.Provider][]*testInstallerEventLogItem {
|
||||||
|
return map[addrs.Provider][]*testInstallerEventLogItem{
|
||||||
|
noProvider: {
|
||||||
|
{
|
||||||
|
Event: "PendingProviders",
|
||||||
|
Args: map[addrs.Provider]getproviders.VersionConstraints{
|
||||||
|
beepProvider: getproviders.MustParseVersionConstraints(">= 2.0.0"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
beepProvider: {
|
||||||
|
{
|
||||||
|
Event: "QueryPackagesBegin",
|
||||||
|
Provider: beepProvider,
|
||||||
|
Args: struct {
|
||||||
|
Constraints string
|
||||||
|
Locked bool
|
||||||
|
}{">= 2.0.0", true},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Event: "QueryPackagesSuccess",
|
||||||
|
Provider: beepProvider,
|
||||||
|
Args: "2.0.0",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
"successful upgrade of one previously-locked provider": {
|
"successful upgrade of one previously-locked provider": {
|
||||||
Source: getproviders.NewMockSource(
|
Source: getproviders.NewMockSource(
|
||||||
[]getproviders.PackageMeta{
|
[]getproviders.PackageMeta{
|
||||||
|
|
Loading…
Reference in New Issue