From d588ec99989576cb0b634f2d76d72d3e5a5d037e Mon Sep 17 00:00:00 2001 From: Gavin Bunney Date: Fri, 11 Oct 2019 11:02:36 -0700 Subject: [PATCH] Added `data.plugin` --- README.md | 25 ++++++++ bitbucket/data_plugin.go | 114 ++++++++++++++++++++++++++++++++++ bitbucket/data_plugin_test.go | 38 ++++++++++++ bitbucket/provider.go | 1 + 4 files changed, 178 insertions(+) create mode 100644 bitbucket/data_plugin.go create mode 100644 bitbucket/data_plugin_test.go diff --git a/README.md b/README.md index 493398a..84904bf 100644 --- a/README.md +++ b/README.md @@ -509,6 +509,31 @@ data "bitbucketserver_project_permissions_users" "proj" { * `users` - List of maps containing `name`, `email_address`, `display_name`, `active` and `permission` keys. Available permissions are: `REPO_READ`, `REPO_WRITE`, `REPO_ADMIN` + +### Plugin Details + +Retrieve details of an installed plugin. + +```hcl +data "bitbucketserver_plugin" "myplugin" { + key = "com.atlassian.upm.atlassian-universal-plugin-manager-plugin" +} +``` + +#### Attributes + +* `key` - Unique key of the plugin. +* `enabled` - Set to `true` if the plugin is enabled. +* `enabled_by_default` - Set to `true` if the plugin is enabled by default (for system plugins). +* `version` - Installed version of the plugin. +* `name` - Name of the plugin. +* `description` - Plugin description. +* `user_installed` - Set to `true` if this is a user installed plugin vs a system bundled plugin. +* `optional` - Set to `true` if this is an optional plugin. +* `vendor_name` - Name of the vendor. +* `vendor_link` - Vendor homepage. +* `vendor_marketplace_link` - Plugin marketplace link. + --- ## Development Guide diff --git a/bitbucket/data_plugin.go b/bitbucket/data_plugin.go new file mode 100644 index 0000000..9027a84 --- /dev/null +++ b/bitbucket/data_plugin.go @@ -0,0 +1,114 @@ +package bitbucket + +import ( + "encoding/json" + "fmt" + "github.com/hashicorp/terraform/helper/schema" + "io/ioutil" +) + +type Plugin struct { + Key string `json:"key,omitempty"` + Enabled bool `json:"enabled,omitempty"` + EnabledByDefault bool `json:"enabledByDefault,omitempty"` + Version string `json:"version,omitempty"` + Description string `json:"description,omitempty"` + Name string `json:"name,omitempty"` + UserInstalled bool `json:"userInstalled,omitempty"` + Optional bool `json:"optional,omitempty"` + Vendor struct { + Name string `json:"name,omitempty"` + MarketplaceLink string `json:"marketplaceLink,omitempty"` + Link string `json:"link,omitempty"` + } `json:"vendor,omitempty"` +} + +func dataSourcePlugin() *schema.Resource { + return &schema.Resource{ + Read: dataSourcePluginRead, + + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + }, + "enabled": { + Type: schema.TypeBool, + Computed: true, + }, + "enabled_by_default": { + Type: schema.TypeBool, + Computed: true, + }, + "version": { + Type: schema.TypeString, + Computed: true, + }, + "description": { + Type: schema.TypeString, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + "user_installed": { + Type: schema.TypeBool, + Computed: true, + }, + "optional": { + Type: schema.TypeBool, + Computed: true, + }, + "vendor_name": { + Type: schema.TypeString, + Computed: true, + }, + "vendor_link": { + Type: schema.TypeString, + Computed: true, + }, + "vendor_marketplace_link": { + Type: schema.TypeString, + Computed: true, + }, + }, + } +} + +func dataSourcePluginRead(d *schema.ResourceData, m interface{}) error { + client := m.(*BitbucketClient) + req, err := client.Get(fmt.Sprintf("/rest/plugins/1.0/%s-key", d.Get("key").(string))) + if err != nil { + return err + } + + if req.StatusCode == 200 { + + var plugin Plugin + + body, readErr := ioutil.ReadAll(req.Body) + if readErr != nil { + return readErr + } + + decodeErr := json.Unmarshal(body, &plugin) + if decodeErr != nil { + return decodeErr + } + + d.SetId(plugin.Key) + _ = d.Set("enabled", plugin.Enabled) + _ = d.Set("enabled_by_default", plugin.EnabledByDefault) + _ = d.Set("version", plugin.Version) + _ = d.Set("description", plugin.Description) + _ = d.Set("name", plugin.Name) + _ = d.Set("user_installed", plugin.UserInstalled) + _ = d.Set("optional", plugin.Optional) + _ = d.Set("vendor_name", plugin.Vendor.Name) + _ = d.Set("vendor_link", plugin.Vendor.Link) + _ = d.Set("vendor_marketplace_link", plugin.Vendor.MarketplaceLink) + } + + return nil +} diff --git a/bitbucket/data_plugin_test.go b/bitbucket/data_plugin_test.go new file mode 100644 index 0000000..7cb6afe --- /dev/null +++ b/bitbucket/data_plugin_test.go @@ -0,0 +1,38 @@ +package bitbucket + +import ( + "testing" + + "github.com/hashicorp/terraform/helper/resource" +) + +func TestAccBitbucketDataPlugin(t *testing.T) { + config := ` + data "bitbucketserver_plugin" "upm" { + key = "com.atlassian.upm.atlassian-universal-plugin-manager-plugin" + } + ` + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: config, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr("data.bitbucketserver_plugin.upm", "key", "com.atlassian.upm.atlassian-universal-plugin-manager-plugin"), + resource.TestCheckResourceAttr("data.bitbucketserver_plugin.upm", "enabled", "true"), + resource.TestCheckResourceAttr("data.bitbucketserver_plugin.upm", "enabled_by_default", "true"), + resource.TestCheckResourceAttrSet("data.bitbucketserver_plugin.upm", "version"), + resource.TestCheckResourceAttr("data.bitbucketserver_plugin.upm", "name", "Atlassian Universal Plugin Manager Plugin"), + resource.TestCheckResourceAttr("data.bitbucketserver_plugin.upm", "description", "This is the plugin that provides the Atlassian Universal Plugin Manager."), + resource.TestCheckResourceAttr("data.bitbucketserver_plugin.upm", "user_installed", "false"), + resource.TestCheckResourceAttr("data.bitbucketserver_plugin.upm", "optional", "false"), + resource.TestCheckResourceAttr("data.bitbucketserver_plugin.upm", "vendor_name", "Atlassian"), + resource.TestCheckResourceAttr("data.bitbucketserver_plugin.upm", "vendor_link", "http://www.atlassian.com"), + resource.TestCheckResourceAttr("data.bitbucketserver_plugin.upm", "vendor_marketplace_link", "http://www.atlassian.com"), + ), + }, + }, + }) +} diff --git a/bitbucket/provider.go b/bitbucket/provider.go index 9643e50..c0c67d1 100644 --- a/bitbucket/provider.go +++ b/bitbucket/provider.go @@ -34,6 +34,7 @@ func Provider() terraform.ResourceProvider { "bitbucketserver_global_permissions_users": dataSourceGlobalPermissionsUsers(), "bitbucketserver_groups": dataSourceGroups(), "bitbucketserver_group_users": dataSourceGroupUsers(), + "bitbucketserver_plugin": dataSourcePlugin(), "bitbucketserver_project_permissions_groups": dataSourceProjectPermissionsGroups(), "bitbucketserver_project_permissions_users": dataSourceProjectPermissionsUsers(), "bitbucketserver_repository_permissions_groups": dataSourceRepositoryPermissionsGroups(),