From 0bb25f909b89c313e26d00de10cb80471b31ecd1 Mon Sep 17 00:00:00 2001 From: Jim Sheldon Date: Thu, 7 Jul 2022 08:59:15 -0400 Subject: [PATCH] repo and repos data sources --- docs/data-sources/repo.md | 36 ++++++++++++ docs/data-sources/repos.md | 23 ++++++++ drone/data_source_repo.go | 114 +++++++++++++++++++++++++++++++++++++ drone/data_source_repos.go | 61 ++++++++++++++++++++ drone/provider.go | 2 + 5 files changed, 236 insertions(+) create mode 100644 docs/data-sources/repo.md create mode 100644 docs/data-sources/repos.md create mode 100644 drone/data_source_repo.go create mode 100644 drone/data_source_repos.go diff --git a/docs/data-sources/repo.md b/docs/data-sources/repo.md new file mode 100644 index 0000000..fb06e78 --- /dev/null +++ b/docs/data-sources/repo.md @@ -0,0 +1,36 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "drone_repo Data Source - terraform-provider-drone" +subcategory: "" +description: |- + Data source for retrieving a Drone repository +--- + +# drone_repo (Data Source) + +Data source for retrieving a Drone repository + + + + +## Schema + +### Required + +- `repository` (String) + +### Read-Only + +- `cancel_pulls` (Boolean) +- `cancel_push` (Boolean) +- `cancel_running` (Boolean) +- `configuration` (String) +- `id` (String) The ID of this resource. +- `ignore_forks` (Boolean) +- `ignore_pulls` (Boolean) +- `protected` (Boolean) +- `timeout` (Number) +- `trusted` (Boolean) +- `visibility` (String) + + diff --git a/docs/data-sources/repos.md b/docs/data-sources/repos.md new file mode 100644 index 0000000..f820203 --- /dev/null +++ b/docs/data-sources/repos.md @@ -0,0 +1,23 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "drone_repos Data Source - terraform-provider-drone" +subcategory: "" +description: |- + Data source for retrieving all repositories to which the user has explicit access in the host system +--- + +# drone_repos (Data Source) + +Data source for retrieving all repositories to which the user has explicit access in the host system + + + + +## Schema + +### Read-Only + +- `id` (String) The ID of this resource. +- `repositories` (List of String) + + diff --git a/drone/data_source_repo.go b/drone/data_source_repo.go new file mode 100644 index 0000000..66376c0 --- /dev/null +++ b/drone/data_source_repo.go @@ -0,0 +1,114 @@ +package drone + +import ( + "context" + "fmt" + "regexp" + "terraform-provider-drone/drone/utils" + + "github.com/drone/drone-go/drone" + "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" +) + +func dataSourceRepo() *schema.Resource { + return &schema.Resource{ + Description: "Data source for retrieving a Drone repository", + ReadContext: dataSourceRepoRead, + Schema: map[string]*schema.Schema{ + "cancel_pulls": { + Type: schema.TypeBool, + Computed: true, + }, + "cancel_push": { + Type: schema.TypeBool, + Computed: true, + }, + "cancel_running": { + Type: schema.TypeBool, + Computed: true, + }, + "configuration": { + Type: schema.TypeString, + Computed: true, + }, + "ignore_forks": { + Type: schema.TypeBool, + Computed: true, + }, + "ignore_pulls": { + Type: schema.TypeBool, + Computed: true, + }, + "protected": { + Type: schema.TypeBool, + Computed: true, + }, + "repository": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.StringMatch( + regexp.MustCompile("^[^/ ]+/[^/ ]+$"), + "Invalid repository (e.g. octocat/hello-world)", + ), + }, + "timeout": { + Type: schema.TypeInt, + Computed: true, + }, + "trusted": { + Type: schema.TypeBool, + Computed: true, + }, + "visibility": { + Type: schema.TypeString, + Computed: true, + }, + }, + } +} + +func dataSourceRepoRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + client := m.(drone.Client) + + // Warning or errors can be collected in a slice type + var diags diag.Diagnostics + + // Refresh repository list + if _, err := client.RepoListSync(); err != nil { + return diag.FromErr(err) + } + + repository := d.Get("repository").(string) + owner, name, err := utils.ParseRepo(repository) + if err != nil { + return diag.FromErr(err) + } + + repo, err := client.Repo(owner, name) + if err != nil { + diags = append(diags, diag.Diagnostic{ + Severity: diag.Error, + Summary: fmt.Sprintf("Failed to read repo %s", repository), + Detail: err.Error(), + }) + + return diags + } + + d.Set("cancel_pulls", repo.CancelPulls) + d.Set("cancel_push", repo.CancelPush) + d.Set("cancel_running", repo.CancelRunning) + d.Set("configuration", repo.Config) + d.Set("ignore_forks", repo.IgnoreForks) + d.Set("ignore_pulls", repo.IgnorePulls) + d.Set("protected", repo.Protected) + d.Set("timeout", repo.Timeout) + d.Set("trusted", repo.Trusted) + d.Set("visibility", repo.Visibility) + + d.SetId(repository) + + return diags +} diff --git a/drone/data_source_repos.go b/drone/data_source_repos.go new file mode 100644 index 0000000..4541a8d --- /dev/null +++ b/drone/data_source_repos.go @@ -0,0 +1,61 @@ +package drone + +import ( + "context" + "sort" + + "terraform-provider-drone/drone/utils" + + "github.com/drone/drone-go/drone" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func dataSourceRepos() *schema.Resource { + return &schema.Resource{ + Description: "Data source for retrieving all repositories to which the user has explicit access in the host system", + ReadContext: dataSourceReposRead, + Schema: map[string]*schema.Schema{ + "repositories": { + Type: schema.TypeList, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + Computed: true, + }, + }, + } +} + +func dataSourceReposRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + client := m.(drone.Client) + + // Warning or errors can be collected in a slice type + var diags diag.Diagnostics + + repos, err := client.RepoListSync() + if err != nil { + diags = append(diags, diag.Diagnostic{ + Severity: diag.Error, + Summary: "Failed to retrieve repositories", + Detail: err.Error(), + }) + + return diags + } + + id := make([]string, 0) + slugs := make([]string, 0) + + for _, repo := range repos { + id = append(id, repo.Slug) + slugs = append(slugs, repo.Slug) + } + + sort.Strings(slugs) + d.Set("repositories", slugs) + + d.SetId(utils.BuildChecksumID(id)) + + return diags +} diff --git a/drone/provider.go b/drone/provider.go index 0d1a29c..0a63d15 100644 --- a/drone/provider.go +++ b/drone/provider.go @@ -39,6 +39,8 @@ func Provider() *schema.Provider { "drone_user": resourceUser(), }, DataSourcesMap: map[string]*schema.Resource{ + "drone_repo": dataSourceRepo(), + "drone_repos": dataSourceRepos(), "drone_template": dataSourceTemplate(), "drone_templates": dataSourceTemplates(), "drone_user": dataSourceUser(),