/
resource_issue_link.go
102 lines (79 loc) · 2.47 KB
/
resource_issue_link.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package jira
import (
"fmt"
"strings"
jira "github.com/andygrunwald/go-jira"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/pkg/errors"
)
func resourceIssueLink() *schema.Resource {
return &schema.Resource{
Create: resourceIssueLinkCreate,
Read: resourceIssueLinkRead,
Delete: resourceIssueLinkDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Schema: map[string]*schema.Schema{
"inward_key": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"outward_key": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"link_type": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
},
}
}
// resourceIssueLinkCreate creates a new jira issue using the jira api
func resourceIssueLinkCreate(d *schema.ResourceData, m interface{}) error {
config := m.(*Config)
issueLink := new(jira.IssueLink)
issueLink.InwardIssue = &jira.Issue{Key: d.Get("inward_key").(string)}
issueLink.OutwardIssue = &jira.Issue{Key: d.Get("outward_key").(string)}
issueLink.Type = jira.IssueLinkType{ID: d.Get("link_type").(string)}
resp, err := config.jiraClient.Issue.AddLink(issueLink)
if err != nil {
return errors.Wrap(err, "Creating Issue Link failed")
}
location, err := resp.Location()
if err != nil {
return errors.Wrap(err, "Creating Issue Link failed")
}
components := strings.Split(location.Path, "/")
ID := components[len(components)-1]
d.SetId(ID)
return resourceIssueLinkRead(d, m)
}
// resourceIssueLinkRead reads issue details using jira api
func resourceIssueLinkRead(d *schema.ResourceData, m interface{}) error {
config := m.(*Config)
urlStr := fmt.Sprintf("%s/%s", issueLinkAPIEndpoint, d.Id())
issueLink := new(jira.IssueLink)
err := request(config.jiraClient, "GET", urlStr, nil, issueLink)
if err != nil {
return errors.Wrap(err, "Request failed")
}
d.Set("inward_key", issueLink.InwardIssue.Key)
d.Set("outward_key", issueLink.OutwardIssue.Key)
d.Set("link_type", issueLink.Type.ID)
return nil
}
// resourceIssueLinkDelete deletes jira issue using the jira api
func resourceIssueLinkDelete(d *schema.ResourceData, m interface{}) error {
config := m.(*Config)
urlStr := fmt.Sprintf("%s/%s", issueLinkAPIEndpoint, d.Id())
err := request(config.jiraClient, "DELETE", urlStr, nil, nil)
if err != nil {
return errors.Wrap(err, "Request failed")
}
return nil
}