Skip to content

Commit 0f89767

Browse files
add basic crud for registries
1 parent a8579c5 commit 0f89767

File tree

6 files changed

+333
-1
lines changed

6 files changed

+333
-1
lines changed

client/client.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ func (client *Client) RequestAPI(opt *RequestOptions) ([]byte, error) {
7272
return nil, fmt.Errorf("Failed to read body %v %v", resp.StatusCode, resp.Status)
7373
}
7474

75-
if resp.StatusCode != 200 {
75+
// todo: maybe other 2**?
76+
if resp.StatusCode != 200 && resp.StatusCode != 201 {
7677
return nil, fmt.Errorf("%v, %s", resp.Status, string(body))
7778
}
7879
return body, nil

client/registry.go

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package client
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"net/url"
7+
)
8+
9+
type Registry struct {
10+
Id string `json:"_id,omitempty"`
11+
Name string `json:"name,omitempty"`
12+
Kind string `json:"kind,omitempty"`
13+
Provider string `json:"provider,omitempty"`
14+
Domain string `json:"domain,omitempty"`
15+
Username string `json:"username,omitempty"`
16+
Password string `json:"password,omitempty"`
17+
Default bool `json:"default,omitempty"`
18+
Primary bool `json:"primary,omitempty"`
19+
BehindFirewall bool `json:"behindFirewall,omitempty"`
20+
DenyCompositeDomain bool `json:"denyCompositeDomain,omitempty"`
21+
}
22+
23+
func (registry *Registry) GetID() string {
24+
return registry.Id
25+
}
26+
27+
func (client *Client) GetRegistry(name string) (*Registry, error) {
28+
fullPath := fmt.Sprintf("/registries/%s", url.PathEscape(name))
29+
opts := RequestOptions{
30+
Path: fullPath,
31+
Method: "GET",
32+
}
33+
34+
resp, err := client.RequestAPI(&opts)
35+
36+
if err != nil {
37+
return nil, err
38+
}
39+
var respRegistry Registry
40+
err = DecodeResponseInto(resp, &respRegistry)
41+
if err != nil {
42+
return nil, err
43+
}
44+
45+
return &respRegistry, nil
46+
47+
}
48+
49+
func (client *Client) CreateRegistry(registry *Registry) (*Registry, error) {
50+
51+
body, err := EncodeToJSON(registry)
52+
53+
if err != nil {
54+
return nil, err
55+
}
56+
opts := RequestOptions{
57+
Path: "/registries",
58+
Method: "POST",
59+
Body: body,
60+
}
61+
62+
resp, err := client.RequestAPI(&opts)
63+
64+
if err != nil {
65+
log.Printf("[DEBUG] Call to API for registry creation failed with Error = %v for Body %v", err, body)
66+
return nil, err
67+
}
68+
69+
var respRegistry Registry
70+
err = DecodeResponseInto(resp, &respRegistry)
71+
if err != nil {
72+
return nil, err
73+
}
74+
75+
return &respRegistry, nil
76+
77+
}
78+
79+
func (client *Client) UpdateRegistry(registry *Registry) (*Registry, error) {
80+
81+
body, err := EncodeToJSON(registry)
82+
83+
if err != nil {
84+
return nil, err
85+
}
86+
87+
fullPath := fmt.Sprintf("/registries/%s", url.PathEscape(registry.Id))
88+
opts := RequestOptions{
89+
Path: fullPath,
90+
Method: "PATCH",
91+
Body: body,
92+
}
93+
94+
resp, err := client.RequestAPI(&opts)
95+
96+
if err != nil {
97+
return nil, err
98+
}
99+
100+
var respRegistry Registry
101+
err = DecodeResponseInto(resp, &respRegistry)
102+
if err != nil {
103+
return nil, err
104+
}
105+
106+
return &respRegistry, nil
107+
108+
}
109+
110+
func (client *Client) DeleteRegistry(name string) error {
111+
112+
fullPath := fmt.Sprintf("/registries/%s", url.PathEscape(name))
113+
opts := RequestOptions{
114+
Path: fullPath,
115+
Method: "DELETE",
116+
}
117+
118+
_, err := client.RequestAPI(&opts)
119+
120+
if err != nil {
121+
return err
122+
}
123+
124+
return nil
125+
}

codefresh/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func Provider() *schema.Provider {
4141
"codefresh_account_admins": resourceAccountAdmins(),
4242
"codefresh_api_key": resourceApiKey(),
4343
"codefresh_context": resourceContext(),
44+
"codefresh_registry": resourceRegistry(),
4445
"codefresh_idp_accounts": resourceIDPAccounts(),
4546
"codefresh_permission": resourcePermission(),
4647
"codefresh_pipeline": resourcePipeline(),

codefresh/resource_registry.go

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
package codefresh
2+
3+
import (
4+
"log"
5+
6+
cfClient "github.com/codefresh-io/terraform-provider-codefresh/client"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
8+
)
9+
10+
// todo: 1) decide about password
11+
// todo: 2) add another registry types
12+
// todo: 3) add data definitions
13+
// todo: 4) add more fields
14+
15+
func resourceRegistry() *schema.Resource {
16+
return &schema.Resource{
17+
Create: resourceRegistryCreate,
18+
Read: resourceRegistryRead,
19+
Update: resourceRegistryUpdate,
20+
Delete: resourceRegistryDelete,
21+
Importer: &schema.ResourceImporter{
22+
State: schema.ImportStatePassthrough,
23+
},
24+
Schema: map[string]*schema.Schema{
25+
"name": {
26+
Type: schema.TypeString,
27+
Required: true,
28+
ForceNew: false,
29+
},
30+
"kind": {
31+
Type: schema.TypeString,
32+
Required: true,
33+
ForceNew: false,
34+
},
35+
"registry_provider": {
36+
Type: schema.TypeString,
37+
Required: true,
38+
ForceNew: false,
39+
},
40+
"domain": {
41+
Type: schema.TypeString,
42+
Required: true,
43+
ForceNew: false,
44+
},
45+
"username": {
46+
Type: schema.TypeString,
47+
Required: true,
48+
ForceNew: false,
49+
},
50+
"password": {
51+
Type: schema.TypeString,
52+
Optional: true,
53+
ForceNew: false,
54+
},
55+
"default": {
56+
Type: schema.TypeBool,
57+
Optional: true,
58+
ForceNew: false,
59+
},
60+
"primary": {
61+
Type: schema.TypeBool,
62+
Optional: true,
63+
ForceNew: false,
64+
},
65+
"behind_firewall": {
66+
Type: schema.TypeBool,
67+
Optional: true,
68+
ForceNew: false,
69+
},
70+
"deny_composite_domain": {
71+
Type: schema.TypeBool,
72+
Optional: true,
73+
ForceNew: false,
74+
},
75+
},
76+
}
77+
}
78+
79+
func resourceRegistryCreate(d *schema.ResourceData, meta interface{}) error {
80+
81+
client := meta.(*cfClient.Client)
82+
resp, err := client.CreateRegistry(mapResourceToRegistry(d))
83+
if err != nil {
84+
log.Printf("[DEBUG] Error while creating registry. Error = %v", err)
85+
return err
86+
}
87+
88+
d.SetId(resp.Id)
89+
return resourceRegistryRead(d, meta)
90+
}
91+
92+
func resourceRegistryRead(d *schema.ResourceData, meta interface{}) error {
93+
client := meta.(*cfClient.Client)
94+
95+
registryId := d.Id()
96+
97+
if registryId == "" {
98+
d.SetId("")
99+
return nil
100+
}
101+
102+
registry, err := client.GetRegistry(registryId)
103+
if err != nil {
104+
log.Printf("[DEBUG] Error while getting registry. Error = %v", err)
105+
return err
106+
}
107+
108+
err = mapRegistryToResource(*registry, d)
109+
if err != nil {
110+
log.Printf("[DEBUG] Error while mapping registry to resource. Error = %v", err)
111+
return err
112+
}
113+
114+
return nil
115+
}
116+
117+
func resourceRegistryUpdate(d *schema.ResourceData, meta interface{}) error {
118+
119+
client := meta.(*cfClient.Client)
120+
121+
registry := *mapResourceToRegistry(d)
122+
registry.Id = d.Id()
123+
124+
_, err := client.UpdateRegistry(&registry)
125+
if err != nil {
126+
log.Printf("[DEBUG] Error while updating registry. Error = %v", err)
127+
return err
128+
}
129+
130+
return resourceRegistryRead(d, meta)
131+
}
132+
133+
func resourceRegistryDelete(d *schema.ResourceData, meta interface{}) error {
134+
135+
client := meta.(*cfClient.Client)
136+
137+
err := client.DeleteRegistry(d.Id())
138+
if err != nil {
139+
return err
140+
}
141+
142+
return nil
143+
}
144+
145+
func mapResourceToRegistry(d *schema.ResourceData) *cfClient.Registry {
146+
registry := &cfClient.Registry{
147+
Id: d.Id(),
148+
Name: d.Get("name").(string),
149+
Kind: d.Get("kind").(string),
150+
Provider: d.Get("registry_provider").(string),
151+
Domain: d.Get("domain").(string),
152+
}
153+
154+
if data, ok := d.GetOk("username"); ok {
155+
registry.Username = data.(string)
156+
}
157+
if data, ok := d.GetOk("password"); ok {
158+
registry.Password = data.(string)
159+
}
160+
161+
return registry
162+
}
163+
164+
func mapRegistryToResource(registry cfClient.Registry, d *schema.ResourceData) error {
165+
d.SetId(registry.Id)
166+
d.Set("name", registry.Name)
167+
d.Set("kind", registry.Kind)
168+
d.Set("registry_provider", registry.Provider)
169+
d.Set("domain", registry.Domain)
170+
d.Set("username", registry.Username)
171+
d.Set("password", registry.Password)
172+
173+
return nil
174+
}

examples/registries/main.tf

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
2+
variable api_url {
3+
type = string
4+
}
5+
6+
variable token {
7+
type = string
8+
default = ""
9+
}
10+
11+
variable test_password {
12+
type = string
13+
default = ""
14+
}
15+
16+
provider "codefresh" {
17+
api_url = var.api_url
18+
token = var.token
19+
}
20+
21+
resource "codefresh_registry" "test" {
22+
name = "test"
23+
kind = "standard"
24+
registry_provider = "other"
25+
domain = "test1.io"
26+
username = "test"
27+
password = var.test_password
28+
}

examples/registries/terraform.tfvars

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
api_url = "http://example.com/api"
2+
token = ""
3+

0 commit comments

Comments
 (0)