opentofu/internal/plugins/library.go
Christian Mesh ef97fd2b51
Some checks are pending
build / Build for freebsd_386 (push) Waiting to run
build / Build for linux_386 (push) Waiting to run
build / Build for openbsd_386 (push) Waiting to run
build / Build for windows_386 (push) Waiting to run
build / Build for freebsd_amd64 (push) Waiting to run
build / Build for linux_amd64 (push) Waiting to run
build / Build for openbsd_amd64 (push) Waiting to run
build / Build for solaris_amd64 (push) Waiting to run
build / Build for windows_amd64 (push) Waiting to run
build / Build for freebsd_arm (push) Waiting to run
build / Build for linux_arm (push) Waiting to run
build / Build for linux_arm64 (push) Waiting to run
build / Build for darwin_amd64 (push) Waiting to run
build / Build for darwin_arm64 (push) Waiting to run
build / End-to-end Tests for linux_386 (push) Waiting to run
build / End-to-end Tests for windows_386 (push) Waiting to run
build / End-to-end Tests for darwin_amd64 (push) Waiting to run
build / End-to-end Tests for linux_amd64 (push) Waiting to run
build / End-to-end Tests for windows_amd64 (push) Waiting to run
Quick Checks / List files changed for pull request (push) Waiting to run
Quick Checks / Unit tests for linux_386 (push) Blocked by required conditions
Quick Checks / Unit tests for linux_amd64 (push) Blocked by required conditions
Quick Checks / Unit tests for windows_amd64 (push) Blocked by required conditions
Quick Checks / Unit tests for linux_arm (push) Blocked by required conditions
Quick Checks / Unit tests for darwin_arm64 (push) Blocked by required conditions
Quick Checks / Unit tests for linux_arm64 (push) Blocked by required conditions
Quick Checks / Race Tests (push) Blocked by required conditions
Quick Checks / End-to-end Tests (push) Blocked by required conditions
Quick Checks / Code Consistency Checks (push) Blocked by required conditions
Quick Checks / License Checks (push) Waiting to run
Website checks / List files changed for pull request (push) Waiting to run
Website checks / Build (push) Blocked by required conditions
Website checks / Test Installation Instructions (push) Blocked by required conditions
Introduce plugin library and managers (#3652)
Signed-off-by: Christian Mesh <christianmesh1@gmail.com>
2026-02-24 08:51:48 -05:00

71 lines
1.9 KiB
Go

// Copyright (c) The OpenTofu Authors
// SPDX-License-Identifier: MPL-2.0
// Copyright (c) 2023 HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package plugins
import (
"sync"
"github.com/opentofu/opentofu/internal/addrs"
"github.com/opentofu/opentofu/internal/configs/configschema"
"github.com/opentofu/opentofu/internal/providers"
"github.com/opentofu/opentofu/internal/tfdiags"
)
// Library represents a suite of provider and provisioner plugins. It does not expose
// much functionality itself, instead serving as a starting point for the more complex
// managers.
type Library interface {
NewProviderManager() ProviderManager
NewProvisionerManager() ProvisionerManager
HasProvider(addr addrs.Provider) bool
HasProvisioner(typ string) bool
}
func NewLibrary(providerFactories ProviderFactories, provisionerFactories ProvisionerFactories) Library {
return &library{
providerFactories: providerFactories,
providerSchemas: map[addrs.Provider]*providerSchemaEntry{},
provisionerFactories: provisionerFactories,
provisionerSchemas: map[string]*provisionerSchemaEntry{},
}
}
// library is the default Library implementation, with included fields to facilitate
// schema caching among managers.
type library struct {
providerSchemasLock sync.Mutex
providerSchemas map[addrs.Provider]*providerSchemaEntry
providerFactories ProviderFactories
provisionerSchemasLock sync.Mutex
provisionerSchemas map[string]*provisionerSchemaEntry
provisionerFactories ProvisionerFactories
}
type providerSchemaEntry struct {
sync.Mutex
populated bool
schema providers.ProviderSchema
diags tfdiags.Diagnostics
}
type provisionerSchemaEntry struct {
sync.Mutex
populated bool
schema *configschema.Block
err error
}
func (l *library) HasProvider(addr addrs.Provider) bool {
return l.providerFactories.HasProvider(addr)
}
func (l *library) HasProvisioner(typ string) bool {
return l.provisionerFactories.HasProvisioner(typ)
}