Skip to content

Commit c589353

Browse files
committed
Add data source release link
1 parent 0ac952d commit c589353

12 files changed

+393
-31
lines changed

docs/data-sources/release_link.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "gitlab_release_link Data Source - terraform-provider-gitlab"
4+
subcategory: ""
5+
description: |-
6+
The gitlab_release_link data source allows get details of a release link.
7+
Upstream API: GitLab REST API docs https://docs.gitlab.com/ee/api/releases/links.html
8+
---
9+
10+
# gitlab_release_link (Data Source)
11+
12+
The `gitlab_release_link` data source allows get details of a release link.
13+
14+
**Upstream API**: [GitLab REST API docs](https://docs.gitlab.com/ee/api/releases/links.html)
15+
16+
## Example Usage
17+
18+
```terraform
19+
# By project ID
20+
data "gitlab_release_link" "example" {
21+
project = "12345"
22+
tag_name = "v1.0.1"
23+
link_id = "11"
24+
}
25+
26+
# By project full path
27+
data "gitlab_release_link" "example" {
28+
project = "foo/bar"
29+
tag_name = "v1.0.1"
30+
link_id = "11"
31+
}
32+
```
33+
34+
<!-- schema generated by tfplugindocs -->
35+
## Schema
36+
37+
### Required
38+
39+
- `link_id` (Number) The ID of the link.
40+
- `project` (String) The ID or [URL-encoded path of the project](https://docs.gitlab.com/ee/api/index.html#namespaced-path-encoding).
41+
- `tag_name` (String) The tag associated with the Release.
42+
43+
### Read-Only
44+
45+
- `direct_asset_url` (String) Full path for a [Direct Asset link](https://docs.gitlab.com/ee/user/project/releases/index.html#permanent-links-to-release-assets).
46+
- `external` (Boolean) External or internal link.
47+
- `filepath` (String) Relatively path for a [Direct Asset link](https://docs.gitlab.com/ee/user/project/releases/index.html#permanent-links-to-release-assets).
48+
- `id` (String) The ID of this resource.
49+
- `link_type` (String) The type of the link: `other`, `runbook`, `image`, `package`. Defaults to other.
50+
- `name` (String) The name of the link. Link names must be unique within the release.
51+
- `url` (String) The URL of the link. Link URLs must be unique within the release.
52+
53+

docs/data-sources/release_links.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "gitlab_release_links Data Source - terraform-provider-gitlab"
4+
subcategory: ""
5+
description: |-
6+
The gitlab_release_links data source allows get details of release links.
7+
Upstream API: GitLab REST API docs https://docs.gitlab.com/ee/api/releases/links.html
8+
---
9+
10+
# gitlab_release_links (Data Source)
11+
12+
The `gitlab_release_links` data source allows get details of release links.
13+
14+
**Upstream API**: [GitLab REST API docs](https://docs.gitlab.com/ee/api/releases/links.html)
15+
16+
## Example Usage
17+
18+
```terraform
19+
# By project ID
20+
data "gitlab_release_links" "example" {
21+
project = "12345"
22+
tag_name = "v1.0.1"
23+
}
24+
25+
# By project full path
26+
data "gitlab_release_links" "example" {
27+
project = "foo/bar"
28+
tag_name = "v1.0.1"
29+
}
30+
```
31+
32+
<!-- schema generated by tfplugindocs -->
33+
## Schema
34+
35+
### Required
36+
37+
- `project` (String) The ID or [URL-encoded path of the project](https://docs.gitlab.com/ee/api/index.html#namespaced-path-encoding).
38+
- `tag_name` (String) The tag associated with the Release.
39+
40+
### Read-Only
41+
42+
- `id` (String) The ID of this resource.
43+
- `release_links` (List of Object) List of release links (see [below for nested schema](#nestedatt--release_links))
44+
45+
<a id="nestedatt--release_links"></a>
46+
### Nested Schema for `release_links`
47+
48+
Read-Only:
49+
50+
- `direct_asset_url` (String)
51+
- `external` (Boolean)
52+
- `filepath` (String)
53+
- `link_id` (Number)
54+
- `link_type` (String)
55+
- `name` (String)
56+
- `project` (String)
57+
- `tag_name` (String)
58+
- `url` (String)
59+
60+

docs/resources/release_link.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ resource "gitlab_release_link" "example" {
4848

4949
### Read-Only
5050

51-
- `direct_asset_link` (String) Full path for a [Direct Asset link](https://docs.gitlab.com/ee/user/project/releases/index.html#permanent-links-to-release-assets).
51+
- `direct_asset_url` (String) Full path for a [Direct Asset link](https://docs.gitlab.com/ee/user/project/releases/index.html#permanent-links-to-release-assets).
5252
- `external` (Boolean) External or internal link.
5353
- `id` (String) The ID of this resource.
5454
- `link_id` (Number) The ID of the link.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# By project ID
2+
data "gitlab_release_link" "example" {
3+
project = "12345"
4+
tag_name = "v1.0.1"
5+
link_id = "11"
6+
}
7+
8+
# By project full path
9+
data "gitlab_release_link" "example" {
10+
project = "foo/bar"
11+
tag_name = "v1.0.1"
12+
link_id = "11"
13+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# By project ID
2+
data "gitlab_release_links" "example" {
3+
project = "12345"
4+
tag_name = "v1.0.1"
5+
}
6+
7+
# By project full path
8+
data "gitlab_release_links" "example" {
9+
project = "foo/bar"
10+
tag_name = "v1.0.1"
11+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package provider
2+
3+
import (
4+
"context"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
8+
"github.com/xanzy/go-gitlab"
9+
)
10+
11+
var _ = registerDataSource("gitlab_release_link", func() *schema.Resource {
12+
return &schema.Resource{
13+
Description: `The ` + "`gitlab_release_link`" + ` data source allows get details of a release link.
14+
15+
**Upstream API**: [GitLab REST API docs](https://docs.gitlab.com/ee/api/releases/links.html)`,
16+
17+
ReadContext: dataSourceGitlabReleaseLinkRead,
18+
Schema: datasourceSchemaFromResourceSchema(gitlabReleaseLinkGetSchema(), []string{"project", "tag_name", "link_id"}, nil),
19+
}
20+
})
21+
22+
func dataSourceGitlabReleaseLinkRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
23+
client := meta.(*gitlab.Client)
24+
project := d.Get("project").(string)
25+
tagName := d.Get("tag_name").(string)
26+
linkID := d.Get("link_id").(int)
27+
28+
releaseLink, _, err := client.ReleaseLinks.GetReleaseLink(project, tagName, linkID, gitlab.WithContext(ctx))
29+
if err != nil {
30+
return diag.FromErr(err)
31+
}
32+
d.SetId(resourceGitLabReleaseLinkBuildId(project, tagName, linkID))
33+
stateMap := gitlabReleaseLinkToStateMap(project, tagName, releaseLink)
34+
35+
if err := setStateMapInResourceData(stateMap, d); err != nil {
36+
return diag.FromErr(err)
37+
}
38+
return nil
39+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
//go:build acceptance
2+
// +build acceptance
3+
4+
package provider
5+
6+
import (
7+
"fmt"
8+
"testing"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
)
12+
13+
func TestAccDataSourceGitlabReleaseLink_basic(t *testing.T) {
14+
15+
project := testAccCreateProject(t)
16+
releases := testAccCreateReleases(t, project, 2)
17+
18+
resource.Test(t, resource.TestCase{
19+
ProviderFactories: providerFactories,
20+
Steps: []resource.TestStep{
21+
{
22+
// get release link used Project ID
23+
Config: fmt.Sprintf(`
24+
data "gitlab_release_link" "this" {
25+
project = "%d"
26+
tag_name = "%s"
27+
link_id = "%d"
28+
}`, project.ID, releases[0].TagName, releases[0].Assets.Links[0].ID),
29+
Check: resource.ComposeTestCheckFunc(
30+
resource.TestCheckResourceAttr("data.gitlab_release_link.this", "name", releases[0].Assets.Links[0].Name),
31+
resource.TestCheckResourceAttr("data.gitlab_release_link.this", "url", releases[0].Assets.Links[0].URL),
32+
resource.TestCheckResourceAttr("data.gitlab_release_link.this", "direct_asset_url", releases[0].Assets.Links[0].DirectAssetURL),
33+
),
34+
},
35+
{
36+
// get release link used full Project path
37+
Config: fmt.Sprintf(`
38+
data "gitlab_release_link" "this" {
39+
project = "%s"
40+
tag_name = "%s"
41+
link_id = "%d"
42+
}`, project.PathWithNamespace, releases[1].TagName, releases[1].Assets.Links[0].ID),
43+
Check: resource.ComposeTestCheckFunc(
44+
resource.TestCheckResourceAttr("data.gitlab_release_link.this", "name", releases[1].Assets.Links[0].Name),
45+
resource.TestCheckResourceAttr("data.gitlab_release_link.this", "url", releases[1].Assets.Links[0].URL),
46+
resource.TestCheckResourceAttr("data.gitlab_release_link.this", "direct_asset_url", releases[1].Assets.Links[0].DirectAssetURL),
47+
),
48+
},
49+
},
50+
})
51+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package provider
2+
3+
import (
4+
"context"
5+
"log"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
"github.com/xanzy/go-gitlab"
10+
)
11+
12+
var _ = registerDataSource("gitlab_release_links", func() *schema.Resource {
13+
14+
return &schema.Resource{
15+
Description: `The ` + "`gitlab_release_links`" + ` data source allows get details of release links.
16+
17+
**Upstream API**: [GitLab REST API docs](https://docs.gitlab.com/ee/api/releases/links.html)`,
18+
19+
ReadContext: dataSourceGitlabReleaseLinksRead,
20+
Schema: map[string]*schema.Schema{
21+
"project": {
22+
Description: "The ID or [URL-encoded path of the project](https://docs.gitlab.com/ee/api/index.html#namespaced-path-encoding).",
23+
Type: schema.TypeString,
24+
Required: true,
25+
ForceNew: true,
26+
},
27+
"tag_name": {
28+
Description: "The tag associated with the Release.",
29+
Type: schema.TypeString,
30+
Required: true,
31+
ForceNew: true,
32+
},
33+
"release_links": {
34+
Description: "List of release links",
35+
Type: schema.TypeList,
36+
Computed: true,
37+
Elem: &schema.Resource{
38+
Schema: datasourceSchemaFromResourceSchema(gitlabReleaseLinkGetSchema(), nil, nil),
39+
},
40+
},
41+
},
42+
}
43+
})
44+
45+
func dataSourceGitlabReleaseLinksRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
46+
client := meta.(*gitlab.Client)
47+
48+
project := d.Get("project").(string)
49+
tagName := d.Get("tag_name").(string)
50+
options := gitlab.ListReleaseLinksOptions(
51+
gitlab.ListOptions{
52+
PerPage: 20,
53+
Page: 1,
54+
})
55+
56+
var releaseLinks []*gitlab.ReleaseLink
57+
for options.Page != 0 {
58+
paginatedReleaseLinks, resp, err := client.ReleaseLinks.ListReleaseLinks(project, tagName, &options, gitlab.WithContext(ctx))
59+
if err != nil {
60+
return diag.FromErr(err)
61+
}
62+
63+
releaseLinks = append(releaseLinks, paginatedReleaseLinks...)
64+
options.Page = resp.NextPage
65+
}
66+
67+
log.Printf("[DEBUG] get list release links project/tagName: %s/%s", project, tagName)
68+
d.SetId(buildTwoPartID(&project, &tagName))
69+
var err error
70+
if err = d.Set("release_links", flattenGitlabReleaseLinks(project, tagName, releaseLinks)); err != nil {
71+
return diag.Errorf("Failed to set release links to state: %v", err)
72+
}
73+
74+
return nil
75+
}
76+
77+
func flattenGitlabReleaseLinks(project string, tagName string, releaseLinks []*gitlab.ReleaseLink) (values []map[string]interface{}) {
78+
for _, releaseLink := range releaseLinks {
79+
values = append(values, gitlabReleaseLinkToStateMap(project, tagName, releaseLink))
80+
}
81+
return values
82+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//go:build acceptance
2+
// +build acceptance
3+
4+
package provider
5+
6+
import (
7+
"fmt"
8+
"testing"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
)
12+
13+
func TestAccDataGitlabReleaseLinks_basic(t *testing.T) {
14+
15+
project := testAccCreateProject(t)
16+
releases := testAccCreateReleases(t, project, 2)
17+
18+
resource.Test(t, resource.TestCase{
19+
ProviderFactories: providerFactories,
20+
Steps: []resource.TestStep{
21+
{
22+
// get release link used Project ID
23+
Config: fmt.Sprintf(`
24+
data "gitlab_release_links" "this" {
25+
project = "%d"
26+
tag_name = "%s"
27+
}`, project.ID, releases[0].TagName),
28+
Check: resource.ComposeTestCheckFunc(
29+
resource.TestCheckResourceAttr("data.gitlab_release_links.this", "release_links.#", fmt.Sprintf("%v", 2)),
30+
resource.TestCheckResourceAttr("data.gitlab_release_links.this", "release_links.0.name", releases[0].Assets.Links[0].Name),
31+
resource.TestCheckResourceAttr("data.gitlab_release_links.this", "release_links.0.url", releases[0].Assets.Links[0].URL),
32+
resource.TestCheckResourceAttr("data.gitlab_release_links.this", "release_links.0.direct_asset_url", releases[0].Assets.Links[0].DirectAssetURL),
33+
resource.TestCheckResourceAttr("data.gitlab_release_links.this", "release_links.1.name", releases[0].Assets.Links[1].Name),
34+
resource.TestCheckResourceAttr("data.gitlab_release_links.this", "release_links.1.url", releases[0].Assets.Links[1].URL),
35+
resource.TestCheckResourceAttr("data.gitlab_release_links.this", "release_links.1.direct_asset_url", releases[0].Assets.Links[1].DirectAssetURL),
36+
),
37+
},
38+
{
39+
// get release link used full Project path
40+
Config: fmt.Sprintf(`
41+
data "gitlab_release_links" "this" {
42+
project = "%s"
43+
tag_name = "%s"
44+
}`, project.PathWithNamespace, releases[1].TagName),
45+
Check: resource.ComposeTestCheckFunc(
46+
resource.TestCheckResourceAttr("data.gitlab_release_links.this", "release_links.#", fmt.Sprintf("%v", 2)),
47+
resource.TestCheckResourceAttr("data.gitlab_release_links.this", "release_links.0.name", releases[1].Assets.Links[0].Name),
48+
resource.TestCheckResourceAttr("data.gitlab_release_links.this", "release_links.0.url", releases[1].Assets.Links[0].URL),
49+
resource.TestCheckResourceAttr("data.gitlab_release_links.this", "release_links.0.direct_asset_url", releases[1].Assets.Links[0].DirectAssetURL),
50+
resource.TestCheckResourceAttr("data.gitlab_release_links.this", "release_links.1.name", releases[1].Assets.Links[1].Name),
51+
resource.TestCheckResourceAttr("data.gitlab_release_links.this", "release_links.1.url", releases[1].Assets.Links[1].URL),
52+
resource.TestCheckResourceAttr("data.gitlab_release_links.this", "release_links.1.direct_asset_url", releases[1].Assets.Links[1].DirectAssetURL),
53+
),
54+
},
55+
},
56+
})
57+
}

0 commit comments

Comments
 (0)