terraform-provider-nautobot/internal/provider/provider.go

101 lines
2.8 KiB
Go

package provider
import (
"context"
"fmt"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
nb "github.com/nautobot/go-nautobot"
)
func init() {
// Set descriptions to support markdown syntax, this will be used in document generation
// and the language server.
schema.DescriptionKind = schema.StringMarkdown
// Customize the content of descriptions when output. For example you can add defaults on
// to the exported descriptions if present.
// schema.SchemaDescriptionBuilder = func(s *schema.Schema) string {
// desc := s.Description
// if s.Default != nil {
// desc += fmt.Sprintf(" Defaults to `%v`.", s.Default)
// }
// return strings.TrimSpace(desc)
// }
}
func New(version string) func() *schema.Provider {
return func() *schema.Provider {
p := &schema.Provider{
Schema: map[string]*schema.Schema{
"url": {
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.EnvDefaultFunc("NAUTOBOT_URL", nil),
ValidateFunc: validation.IsURLWithHTTPorHTTPS,
Description: "URL for the Nautobot API platform. It should be of the form https:///server.example.org/api/.",
},
"token": {
Type: schema.TypeString,
Required: true,
Sensitive: true,
DefaultFunc: schema.EnvDefaultFunc("NAUTOBOT_TOKEN", nil),
Description: "Customer/user-specific authorization API token for Nautobot.",
},
},
DataSourcesMap: map[string]*schema.Resource{
"nautobot_manufacturers": dataSourceManufacturers(),
},
ResourcesMap: map[string]*schema.Resource{
"nautobot_manufacturer": resourceManufacturer(),
},
}
p.ConfigureContextFunc = configure(version, p)
return p
}
}
// Add whatever fields, client or connection info, etc. here
// you would need to setup to communicate with the upstream
// API.
type apiClient struct {
Client *nb.ClientWithResponses
Server string
}
func configure(version string, p *schema.Provider) func(context.Context, *schema.ResourceData) (interface{}, diag.Diagnostics) {
return func(ctx context.Context, d *schema.ResourceData) (interface{}, diag.Diagnostics) {
serverURL := d.Get("url").(string)
_, hasToken := d.GetOk("token")
var diags diag.Diagnostics = nil
if !hasToken {
diags = diag.FromErr(fmt.Errorf("missing token"))
diags[0].Severity = diag.Error
return &apiClient{Server: serverURL}, diags
}
token, _ := NewSecurityProviderNautobotToken(d.Get("token").(string))
c, err := nb.NewClientWithResponses(
serverURL,
nb.WithRequestEditorFn(token.Intercept),
)
if err != nil {
diags = diag.FromErr(err)
diags[0].Severity = diag.Error
return &apiClient{Server: serverURL}, diags
}
return &apiClient{
Client: c,
Server: serverURL,
}, diags
}
}