teamcity/provider.go (182 lines of code) (raw):
package teamcity
import (
"context"
"fmt"
"github.com/hashicorp/terraform-plugin-framework/datasource"
"github.com/hashicorp/terraform-plugin-framework/path"
"github.com/hashicorp/terraform-plugin-framework/provider"
"github.com/hashicorp/terraform-plugin-framework/provider/schema"
"github.com/hashicorp/terraform-plugin-framework/resource"
"github.com/hashicorp/terraform-plugin-framework/types"
"github.com/hashicorp/terraform-plugin-framework/types/basetypes"
"math/big"
"os"
"terraform-provider-teamcity/client"
)
const MaxRetriesDefault int = 12
var (
_ provider.Provider = &teamcityProvider{}
)
func New() provider.Provider {
return &teamcityProvider{}
}
type teamcityProvider struct{}
func (p *teamcityProvider) Metadata(_ context.Context, _ provider.MetadataRequest, resp *provider.MetadataResponse) {
resp.TypeName = "teamcity"
}
func (p *teamcityProvider) Schema(_ context.Context, _ provider.SchemaRequest, resp *provider.SchemaResponse) {
resp.Schema = schema.Schema{
Attributes: map[string]schema.Attribute{
"host": schema.StringAttribute{
Optional: true,
},
"token": schema.StringAttribute{
Optional: true,
Sensitive: true,
},
"username": schema.StringAttribute{
Optional: true,
},
"password": schema.StringAttribute{
Optional: true,
Sensitive: true,
},
"max_retries": schema.NumberAttribute{
Optional: true,
Description: "Maximum number of retries for requests to the server. Default is 12 (1 min). Each retry waits 5 seconds by default.",
},
},
}
}
type teamcityProviderModel struct {
Host types.String `tfsdk:"host"`
Token types.String `tfsdk:"token"`
Username types.String `tfsdk:"username"`
Password types.String `tfsdk:"password"`
MaxRetries basetypes.NumberValue `tfsdk:"max_retries"`
}
func (p *teamcityProvider) Configure(ctx context.Context, req provider.ConfigureRequest, resp *provider.ConfigureResponse) {
var config teamcityProviderModel
diags := req.Config.Get(ctx, &config)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
if config.Host.IsUnknown() {
resp.Diagnostics.AddAttributeError(
path.Root("host"),
"Unknown TeamCity Host",
"",
)
}
if config.Token.IsUnknown() {
resp.Diagnostics.AddAttributeError(
path.Root("token"),
"Unknown TeamCity API token",
"",
)
}
if config.Token.IsUnknown() {
resp.Diagnostics.AddAttributeError(
path.Root("username"),
"Unknown TeamCity username",
"",
)
}
if config.Token.IsUnknown() {
resp.Diagnostics.AddAttributeError(
path.Root("password"),
"Unknown TeamCity password",
"",
)
}
if resp.Diagnostics.HasError() {
return
}
host := os.Getenv("TEAMCITY_HOST")
token := os.Getenv("TEAMCITY_TOKEN")
username := os.Getenv("TEAMCITY_USERNAME")
password := os.Getenv("TEAMCITY_PASSWORD")
maxRetries := MaxRetriesDefault
if !config.Host.IsNull() {
host = config.Host.ValueString()
}
if !config.Token.IsNull() {
token = config.Token.ValueString()
}
if !config.Username.IsNull() {
username = config.Username.ValueString()
}
if !config.Password.IsNull() {
password = config.Password.ValueString()
}
if host == "" {
resp.Diagnostics.AddAttributeError(
path.Root("host"),
"Missing TeamCity Host",
"",
)
}
if token == "" && username == "" && password == "" {
resp.Diagnostics.AddAttributeError(
path.Root("token"),
"Missing TeamCity API Token",
"",
)
}
if resp.Diagnostics.HasError() {
return
}
if !config.MaxRetries.IsNull() {
var bigInt big.Int
config.MaxRetries.ValueBigFloat().Int(&bigInt)
maxRetries = int(bigInt.Int64())
}
cl := client.NewClient(host, token, username, password, maxRetries)
_, err := cl.VerifyConnection(ctx)
if err != nil {
resp.Diagnostics.AddError(
"Could not verify connection to server",
fmt.Sprint(err),
)
}
if resp.Diagnostics.HasError() {
return
}
resp.DataSourceData = &cl
resp.ResourceData = &cl
}
func (p *teamcityProvider) DataSources(_ context.Context) []func() datasource.DataSource {
return []func() datasource.DataSource{
NewServerDataSource,
NewBuildConfDataSource,
NewPoolDataSource,
NewSshKeyDataSource,
NewGroupDataSource,
NewUserDataSource,
}
}
func (p *teamcityProvider) Resources(_ context.Context) []func() resource.Resource {
return []func() resource.Resource{
NewCleanupResource,
NewPoolResource,
NewProjectResource,
NewSshKeyResource,
NewVcsRootResource,
NewVersionedSettingsResource,
NewRoleResource,
NewAuthResource,
NewGlobalResource,
NewEmailResource,
NewUserResource,
NewContextParamsResource,
NewTokenResource,
NewGroupResource,
NewMemberResource,
NewLicenseResource,
NewParamResource,
NewConnectionResource,
NewGroupRoleAssignmentResource,
NewUserRoleAssignmentResource,
}
}