terraform-provider-libvirt/libvirt/provider.go

78 lines
2.4 KiB
Go

package libvirt
import (
"log"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// Provider libvirt.
func Provider() *schema.Provider {
return &schema.Provider{
Schema: map[string]*schema.Schema{
"uri": {
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.EnvDefaultFunc("LIBVIRT_DEFAULT_URI", nil),
Description: "libvirt connection URI for operations. See https://libvirt.org/uri.html",
},
},
ResourcesMap: map[string]*schema.Resource{
"libvirt_domain": resourceLibvirtDomain(),
"libvirt_volume": resourceLibvirtVolume(),
"libvirt_network": resourceLibvirtNetwork(),
"libvirt_pool": resourceLibvirtPool(),
"libvirt_cloudinit_disk": resourceCloudInitDisk(),
"libvirt_ignition": resourceIgnition(),
},
DataSourcesMap: map[string]*schema.Resource{
"libvirt_network_dns_host_template": datasourceLibvirtNetworkDNSHostTemplate(),
"libvirt_network_dns_srv_template": datasourceLibvirtNetworkDNSSRVTemplate(),
"libvirt_network_dnsmasq_options_template": datasourceLibvirtNetworkDnsmasqOptionsTemplate(),
"libvirt_node_info": datasourceLibvirtNodeInfo(),
"libvirt_node_device_info": datasourceLibvirtNodeDeviceInfo(),
"libvirt_node_devices": datasourceLibvirtNodeDevices(),
},
ConfigureFunc: providerConfigure,
}
}
// uri -> client for multi instance support
// (we share the same client for the same uri).
var globalClientMap = make(map[string]*Client)
// CleanupLibvirtConnections closes libvirt clients for all URIs.
func CleanupLibvirtConnections() {
for uri, client := range globalClientMap {
log.Printf("[DEBUG] cleaning up connection for URI: %s", uri)
// TODO: Confirm appropriate IsAlive() validation
err := client.libvirt.ConnectClose()
if err != nil {
log.Printf("[ERROR] cannot close libvirt connection: %v", err)
}
}
}
func providerConfigure(d *schema.ResourceData) (interface{}, error) {
config := Config{
URI: d.Get("uri").(string),
}
log.Printf("[DEBUG] Configuring provider for '%s': %v", config.URI, d)
if client, ok := globalClientMap[config.URI]; ok {
log.Printf("[DEBUG] Reusing client for uri: '%s'", config.URI)
return client, nil
}
client, err := config.Client()
if err != nil {
return nil, err
}
globalClientMap[config.URI] = client
return client, nil
}