Skip to content

Commit 8acaeff

Browse files
authored
Merge pull request #1131 from Moon1706/main
Added `gitlab_release_link` as a resource and data source
2 parents ec07316 + f7cbe49 commit 8acaeff

15 files changed

+828
-0
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) Relative 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. Valid values are `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 full path to the project.
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: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "gitlab_release_link Resource - terraform-provider-gitlab"
4+
subcategory: ""
5+
description: |-
6+
The gitlab_release_link resource allows to manage the lifecycle 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 (Resource)
11+
12+
The `gitlab_release_link` resource allows to manage the lifecycle 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+
# Create a project
20+
resource "gitlab_project" "example" {
21+
name = "example"
22+
description = "An example project"
23+
}
24+
25+
# Can create release link only to a tag associated with a release
26+
resource "gitlab_release_link" "example" {
27+
project = gitlab_project.example.id
28+
tag_name = "tag_name_associated_with_release"
29+
name = "test"
30+
url = "https://test/"
31+
}
32+
```
33+
34+
<!-- schema generated by tfplugindocs -->
35+
## Schema
36+
37+
### Required
38+
39+
- `name` (String) The name of the link. Link names must be unique within the release.
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+
- `url` (String) The URL of the link. Link URLs must be unique within the release.
43+
44+
### Optional
45+
46+
- `filepath` (String) Relative path for a [Direct Asset link](https://docs.gitlab.com/ee/user/project/releases/index.html#permanent-links-to-release-assets).
47+
- `link_type` (String) The type of the link. Valid values are `other`, `runbook`, `image`, `package`. Defaults to other.
48+
49+
### Read-Only
50+
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).
52+
- `external` (Boolean) External or internal link.
53+
- `id` (String) The ID of this resource.
54+
- `link_id` (Number) The ID of the link.
55+
56+
## Import
57+
58+
Import is supported using the following syntax:
59+
60+
```shell
61+
# Gitlab release link can be imported with a key composed of `<project>:<tag_name>:<link_id>`, e.g.
62+
terraform import gitlab_release_link.example "12345:test:2"
63+
```
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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Gitlab release link can be imported with a key composed of `<project>:<tag_name>:<link_id>`, e.g.
2+
terraform import gitlab_release_link.example "12345:test:2"
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Create a project
2+
resource "gitlab_project" "example" {
3+
name = "example"
4+
description = "An example project"
5+
}
6+
7+
# Can create release link only to a tag associated with a release
8+
resource "gitlab_release_link" "example" {
9+
project = gitlab_project.example.id
10+
tag_name = "tag_name_associated_with_release"
11+
name = "test"
12+
url = "https://test/"
13+
}
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.ParallelTest(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: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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 full path to the project.",
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+
if is404(err) && (options.Page == 1) {
61+
break
62+
} else {
63+
return diag.FromErr(err)
64+
}
65+
}
66+
releaseLinks = append(releaseLinks, paginatedReleaseLinks...)
67+
options.Page = resp.NextPage
68+
}
69+
70+
log.Printf("[DEBUG] get list release links project/tagName: %s/%s", project, tagName)
71+
d.SetId(buildTwoPartID(&project, &tagName))
72+
if err := d.Set("release_links", flattenGitlabReleaseLinks(project, tagName, releaseLinks)); err != nil {
73+
return diag.Errorf("Failed to set release links to state: %v", err)
74+
}
75+
76+
return nil
77+
}
78+
79+
func flattenGitlabReleaseLinks(project string, tagName string, releaseLinks []*gitlab.ReleaseLink) (values []map[string]interface{}) {
80+
for _, releaseLink := range releaseLinks {
81+
values = append(values, gitlabReleaseLinkToStateMap(project, tagName, releaseLink))
82+
}
83+
return values
84+
}

0 commit comments

Comments
 (0)