terraform/internal/backend/remote-state/artifactory/backend.go

103 lines
2.5 KiB
Go

package artifactory
import (
"context"
cleanhttp "github.com/hashicorp/go-cleanhttp"
"github.com/hashicorp/terraform/internal/backend"
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
"github.com/hashicorp/terraform/internal/states/remote"
"github.com/hashicorp/terraform/internal/states/statemgr"
artifactory "github.com/lusis/go-artifactory/src/artifactory.v401"
)
func New() backend.Backend {
s := &schema.Backend{
Schema: map[string]*schema.Schema{
"username": &schema.Schema{
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.EnvDefaultFunc("ARTIFACTORY_USERNAME", nil),
Description: "Username",
},
"password": &schema.Schema{
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.EnvDefaultFunc("ARTIFACTORY_PASSWORD", nil),
Description: "Password",
},
"url": &schema.Schema{
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.EnvDefaultFunc("ARTIFACTORY_URL", nil),
Description: "Artfactory base URL",
},
"repo": &schema.Schema{
Type: schema.TypeString,
Required: true,
Description: "The repository name",
},
"subpath": &schema.Schema{
Type: schema.TypeString,
Required: true,
Description: "Path within the repository",
},
},
}
b := &Backend{Backend: s}
b.Backend.ConfigureFunc = b.configure
return b
}
type Backend struct {
*schema.Backend
client *ArtifactoryClient
}
func (b *Backend) configure(ctx context.Context) error {
data := schema.FromContextBackendConfig(ctx)
userName := data.Get("username").(string)
password := data.Get("password").(string)
url := data.Get("url").(string)
repo := data.Get("repo").(string)
subpath := data.Get("subpath").(string)
clientConf := &artifactory.ClientConfig{
BaseURL: url,
Username: userName,
Password: password,
Transport: cleanhttp.DefaultPooledTransport(),
}
nativeClient := artifactory.NewClient(clientConf)
b.client = &ArtifactoryClient{
nativeClient: &nativeClient,
userName: userName,
password: password,
url: url,
repo: repo,
subpath: subpath,
}
return nil
}
func (b *Backend) Workspaces() ([]string, error) {
return nil, backend.ErrWorkspacesNotSupported
}
func (b *Backend) DeleteWorkspace(string) error {
return backend.ErrWorkspacesNotSupported
}
func (b *Backend) StateMgr(name string) (statemgr.Full, error) {
if name != backend.DefaultStateName {
return nil, backend.ErrWorkspacesNotSupported
}
return &remote.State{
Client: b.client,
}, nil
}