From aedca597dde3c0e19643d28cd1fbe3d271a88420 Mon Sep 17 00:00:00 2001 From: Pam Selle <204372+pselle@users.noreply.github.com> Date: Sat, 23 Jan 2021 12:45:00 -0500 Subject: [PATCH] Reuse installed target dir providers in init In init, we can check to see if the target dir already has the provider we are seeking and skip further querying/installing of that provider. --- internal/providercache/installer.go | 9 +++ internal/providercache/installer_test.go | 97 ++++++++++++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/internal/providercache/installer.go b/internal/providercache/installer.go index 74b042a0f..820207057 100644 --- a/internal/providercache/installer.go +++ b/internal/providercache/installer.go @@ -310,6 +310,15 @@ NeedProvider: 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 { // Step 3a: If our global cache already has this version available then // we'll just link it in. diff --git a/internal/providercache/installer_test.go b/internal/providercache/installer_test.go index 57611db32..775b0199f 100644 --- a/internal/providercache/installer_test.go +++ b/internal/providercache/installer_test.go @@ -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": { Source: getproviders.NewMockSource( []getproviders.PackageMeta{