Skip to content

Commit 7eada8d

Browse files
committed
Add client
1 parent 17d4c61 commit 7eada8d

5 files changed

+664
-0
lines changed

client.go

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package main
2+
3+
import (
4+
// "net/http"
5+
)
6+
7+
type Config struct {
8+
APIServer string
9+
Token string
10+
}

todo/resource_cron_event.go

+203
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
package main
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
7+
"net/url"
8+
"strings"
9+
)
10+
11+
type cronEventResp struct {
12+
Type string `json:"type,omitempty"`
13+
Kind string `json:"kind,omitempty"`
14+
Secret string `json:"secret,omitempty"`
15+
URI string `json:"uri,omitempty"`
16+
}
17+
18+
func (r *cronEventResp) toCronEvent() *cronEvent {
19+
parts := strings.Split(r.URI, ":")
20+
return &cronEvent{
21+
Type: parts[0],
22+
Kind: parts[1],
23+
Secret: parts[4],
24+
Values: cronEventValues{
25+
Message: parts[3],
26+
Expression: parts[2],
27+
},
28+
}
29+
}
30+
31+
type cronEvent struct {
32+
Type string `json:"type,omitempty"`
33+
Kind string `json:"kind,omitempty"`
34+
Secret string `json:"secret,omitempty"`
35+
Values cronEventValues `json:"values,omitempty"`
36+
}
37+
38+
type cronEventValues struct {
39+
Expression string `json:"expression,omitempty"`
40+
Message string `json:"message,omitempty"`
41+
}
42+
43+
func (e *cronEvent) getID() string {
44+
return fmt.Sprintf("%v:%v:%v:%v:%v", e.Type, e.Kind, e.Values.Expression, e.Values.Message, e.Secret)
45+
}
46+
47+
func (e *cronEvent) urlEncode() string {
48+
return urlEncode(e.getID())
49+
}
50+
51+
func urlEncode(str string) string {
52+
return url.QueryEscape(url.QueryEscape(str))
53+
}
54+
55+
func resourceCronEvent() *schema.Resource {
56+
return &schema.Resource{
57+
Create: resourceCronEventCreate,
58+
Read: resourceCronEventRead,
59+
Delete: resourceCronEventDelete,
60+
Importer: &schema.ResourceImporter{
61+
State: resourceCronEventImport,
62+
},
63+
Schema: map[string]*schema.Schema{
64+
"type": {
65+
Type: schema.TypeString,
66+
Optional: true,
67+
Default: "cron",
68+
ForceNew: true,
69+
},
70+
"kind": {
71+
Type: schema.TypeString,
72+
Optional: true,
73+
Default: "codefresh",
74+
ForceNew: true,
75+
},
76+
"secret": {
77+
Type: schema.TypeString,
78+
Optional: true,
79+
Computed: true,
80+
},
81+
"expression": {
82+
Type: schema.TypeString,
83+
Required: true,
84+
ForceNew: true,
85+
},
86+
"message": {
87+
Type: schema.TypeString,
88+
Required: true,
89+
ForceNew: true,
90+
},
91+
},
92+
}
93+
}
94+
95+
func resourceCronEventCreate(d *schema.ResourceData, _ interface{}) error {
96+
return createCodefreshObject(
97+
fmt.Sprintf("%v/hermes/events", getCfUrl()),
98+
"POST",
99+
d,
100+
mapResourceToCronEvent,
101+
readCronEventString,
102+
)
103+
}
104+
105+
func resourceCronEventRead(d *schema.ResourceData, _ interface{}) error {
106+
return readCodefreshObject(
107+
d,
108+
getCronEventFromCodefresh,
109+
mapCronEventToResource)
110+
}
111+
112+
// TODO: I don't think this is actually deleting anything, I have an open ticket with Codefresh
113+
// https://support.codefresh.io/hc/en-us/requests/3167?page=1
114+
func resourceCronEventDelete(d *schema.ResourceData, _ interface{}) error {
115+
cfURL := fmt.Sprintf("%v/hermes/events/%v", getCfUrl(), urlEncode(d.Id()))
116+
return deleteCodefreshObject(cfURL)
117+
}
118+
119+
func resourceCronEventImport(d *schema.ResourceData, _ interface{}) ([]*schema.ResourceData, error) {
120+
return importCodefreshObject(
121+
d,
122+
getCronEventFromCodefresh,
123+
mapCronEventToResource)
124+
}
125+
126+
func mapResourceToCronEvent(d *schema.ResourceData) codefreshObject {
127+
dSecret := d.Get("secret").(string)
128+
if dSecret == "" {
129+
dSecret = "!generate"
130+
}
131+
cronEvent := &cronEvent{
132+
Type: d.Get("type").(string),
133+
Kind: d.Get("kind").(string),
134+
Secret: dSecret,
135+
Values: cronEventValues{
136+
Expression: d.Get("expression").(string),
137+
Message: d.Get("message").(string),
138+
},
139+
}
140+
return cronEvent
141+
}
142+
143+
// readCronEventString reads a simple string response as is returned from CREATE
144+
func readCronEventString(_ *schema.ResourceData, b []byte) (codefreshObject, error) {
145+
var respString string
146+
err := json.Unmarshal(b, &respString)
147+
if err != nil {
148+
return nil, err
149+
}
150+
cronEventResp := &cronEventResp{
151+
URI: respString,
152+
}
153+
return cronEventResp.toCronEvent(), nil
154+
}
155+
156+
// readCronEvent reads a JSON type response as is returned from GET
157+
func readCronEvent(_ *schema.ResourceData, b []byte) (codefreshObject, error) {
158+
cronEventResp := &cronEventResp{}
159+
160+
err := json.Unmarshal(b, cronEventResp)
161+
if err != nil {
162+
return nil, err
163+
}
164+
return cronEventResp.toCronEvent(), nil
165+
}
166+
167+
func getCronEventFromCodefresh(d *schema.ResourceData) (codefreshObject, error) {
168+
// get the event
169+
event := d.Id()
170+
cfURL := fmt.Sprintf("%v/hermes/events/%v", getCfUrl(), urlEncode(event))
171+
return getFromCodefresh(d, cfURL, readCronEvent)
172+
}
173+
174+
func mapCronEventToResource(cfObject codefreshObject, d *schema.ResourceData) error {
175+
cronEvent := cfObject.(*cronEvent)
176+
d.SetId(cronEvent.getID())
177+
178+
err := d.Set("type", cronEvent.Type)
179+
if err != nil {
180+
return err
181+
}
182+
183+
err = d.Set("kind", cronEvent.Kind)
184+
if err != nil {
185+
return err
186+
}
187+
188+
err = d.Set("secret", cronEvent.Secret)
189+
if err != nil {
190+
return err
191+
}
192+
193+
err = d.Set("message", cronEvent.Values.Message)
194+
if err != nil {
195+
return err
196+
}
197+
198+
err = d.Set("expression", cronEvent.Values.Expression)
199+
if err != nil {
200+
return err
201+
}
202+
return nil
203+
}

todo/resource_cron_trigger.go

+125
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package main
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
7+
)
8+
9+
type cronTrigger struct {
10+
Pipeline string `json:"pipeline,omitempty"`
11+
Event string `json:"event,omitempty"`
12+
}
13+
14+
func (t *cronTrigger) getID() string {
15+
return t.Pipeline
16+
}
17+
18+
func resourceCronTrigger() *schema.Resource {
19+
return &schema.Resource{
20+
Create: resourceCronTriggerCreate,
21+
Read: resourceCronTriggerRead,
22+
Delete: resourceCronTriggerDelete,
23+
Importer: &schema.ResourceImporter{
24+
State: resourceCronTriggerImport,
25+
},
26+
Schema: map[string]*schema.Schema{
27+
"pipeline": {
28+
Type: schema.TypeString,
29+
Required: true,
30+
ForceNew: true,
31+
},
32+
"event": {
33+
Type: schema.TypeString,
34+
Required: true,
35+
ForceNew: true,
36+
},
37+
},
38+
}
39+
}
40+
41+
func resourceCronTriggerCreate(d *schema.ResourceData, _ interface{}) error {
42+
return createCodefreshObject(
43+
fmt.Sprintf("%v/hermes/triggers/%v/%v", getCfUrl(), urlEncode(d.Get("event").(string)), d.Get("pipeline")),
44+
"POST",
45+
d,
46+
mapResourceToCronTrigger,
47+
readCronTriggerString,
48+
)
49+
}
50+
51+
func resourceCronTriggerRead(d *schema.ResourceData, _ interface{}) error {
52+
return readCodefreshObject(
53+
d,
54+
getCronTriggerFromCodefresh,
55+
mapCronTriggerToResource)
56+
}
57+
58+
// TODO: I don't think this is actually deleting anything, I have an open ticket with Codefresh
59+
// https://support.codefresh.io/hc/en-us/requests/3167?page=1
60+
func resourceCronTriggerDelete(d *schema.ResourceData, _ interface{}) error {
61+
cfURL := fmt.Sprintf("%v/hermes/triggers/%v/%v", getCfUrl(), urlEncode(d.Get("event").(string)), d.Get("pipeline"))
62+
return deleteCodefreshObject(cfURL)
63+
}
64+
65+
func resourceCronTriggerImport(d *schema.ResourceData, _ interface{}) ([]*schema.ResourceData, error) {
66+
return importCodefreshObject(
67+
d,
68+
getCronTriggerFromCodefresh,
69+
mapCronTriggerToResource)
70+
}
71+
72+
func mapResourceToCronTrigger(d *schema.ResourceData) codefreshObject {
73+
return &cronTrigger{
74+
Pipeline: d.Get("pipeline").(string),
75+
Event: d.Get("event").(string),
76+
}
77+
}
78+
79+
// readCronTriggerString reads a simple string response as is returned from CREATE
80+
func readCronTriggerString(originalObject *schema.ResourceData, _ []byte) (codefreshObject, error) {
81+
// create doesn't return the object, so we'll just wing it and return the object we sent for creation
82+
return mapResourceToCronTrigger(originalObject), nil
83+
}
84+
85+
// readCronTrigger reads a JSON type response as is returned from GET
86+
func readCronTrigger(_ *schema.ResourceData, b []byte) (codefreshObject, error) {
87+
var cronTriggerResp []*cronTrigger
88+
89+
err := json.Unmarshal(b, &cronTriggerResp)
90+
if err != nil {
91+
return nil, err
92+
}
93+
94+
if len(cronTriggerResp) > 1 {
95+
return nil, fmt.Errorf("More than 1 trigger per pipeline is not supported. Found %v triggers.", len(cronTriggerResp))
96+
}
97+
if len(cronTriggerResp) == 0 {
98+
return nil, nil
99+
}
100+
return cronTriggerResp[0], nil
101+
}
102+
103+
func getCronTriggerFromCodefresh(d *schema.ResourceData) (codefreshObject, error) {
104+
pipeline := d.Id()
105+
// get the trigger
106+
cfURL := fmt.Sprintf("%v/hermes/triggers/pipeline/%v", getCfUrl(), pipeline)
107+
return getFromCodefresh(d, cfURL, readCronTrigger)
108+
}
109+
110+
func mapCronTriggerToResource(cfObject codefreshObject, d *schema.ResourceData) error {
111+
cronTrigger := cfObject.(*cronTrigger)
112+
d.SetId(cronTrigger.getID())
113+
114+
err := d.Set("pipeline", cronTrigger.Pipeline)
115+
if err != nil {
116+
return err
117+
}
118+
119+
err = d.Set("event", cronTrigger.Event)
120+
if err != nil {
121+
return err
122+
}
123+
124+
return nil
125+
}

0 commit comments

Comments
 (0)