Skip to content

Commit e791f82

Browse files
Introducing support for Contexts (Config, Secret,Yaml, SecretYaml) (#27)
* Introducing support for Contexts (Config, Secret,Yaml, SecretYaml) * Fix escaping for context name in API call
1 parent bd4c889 commit e791f82

File tree

10 files changed

+1011
-1
lines changed

10 files changed

+1011
-1
lines changed

Diff for: client/context.go

+132
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package client
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"net/url"
7+
)
8+
9+
type ContextErrorResponse struct {
10+
Status int `json:"status,omitempty"`
11+
Message string `json:"message,omitempty"`
12+
Error string `json:"error,omitempty"`
13+
}
14+
15+
type ContextMetadata struct {
16+
Name string `json:"name,omitempty"`
17+
}
18+
19+
type Context struct {
20+
Metadata ContextMetadata `json:"metadata,omitempty"`
21+
Spec ContextSpec `json:"spec,omitempty"`
22+
Version string `json:"version,omitempty"`
23+
}
24+
25+
type ContextSpec struct {
26+
Type string `json:"type,omitempty"`
27+
Data map[string]interface{} `json:"data,omitempty"`
28+
}
29+
30+
func (context *Context) GetID() string {
31+
return context.Metadata.Name
32+
}
33+
34+
func (client *Client) GetContext(name string) (*Context, error) {
35+
fullPath := fmt.Sprintf("/contexts/%s?decrypt=true", url.PathEscape(name))
36+
opts := RequestOptions{
37+
Path: fullPath,
38+
Method: "GET",
39+
}
40+
41+
resp, err := client.RequestAPI(&opts)
42+
43+
if err != nil {
44+
return nil, err
45+
}
46+
var respContext Context
47+
err = DecodeResponseInto(resp, &respContext)
48+
if err != nil {
49+
return nil, err
50+
}
51+
52+
return &respContext, nil
53+
54+
}
55+
56+
func (client *Client) CreateContext(context *Context) (*Context, error) {
57+
58+
body, err := EncodeToJSON(context)
59+
60+
if err != nil {
61+
return nil, err
62+
}
63+
opts := RequestOptions{
64+
Path: "/contexts",
65+
Method: "POST",
66+
Body: body,
67+
}
68+
69+
resp, err := client.RequestAPI(&opts)
70+
log.Printf("[DEBUG] Called API for context with Body %v", body)
71+
if err != nil {
72+
log.Printf("[DEBUG] Call to API for context creation failed with Error = %v for Body %v", err, body)
73+
return nil, err
74+
}
75+
76+
var respContext Context
77+
err = DecodeResponseInto(resp, &respContext)
78+
if err != nil {
79+
return nil, err
80+
}
81+
82+
return &respContext, nil
83+
84+
}
85+
86+
func (client *Client) UpdateContext(context *Context) (*Context, error) {
87+
88+
body, err := EncodeToJSON(context)
89+
90+
if err != nil {
91+
return nil, err
92+
}
93+
94+
fullPath := fmt.Sprintf("/contexts/%s", url.PathEscape(context.Metadata.Name))
95+
opts := RequestOptions{
96+
Path: fullPath,
97+
Method: "PUT",
98+
Body: body,
99+
}
100+
101+
resp, err := client.RequestAPI(&opts)
102+
103+
if err != nil {
104+
return nil, err
105+
}
106+
107+
var respContext Context
108+
err = DecodeResponseInto(resp, &respContext)
109+
if err != nil {
110+
return nil, err
111+
}
112+
113+
return &respContext, nil
114+
115+
}
116+
117+
func (client *Client) DeleteContext(name string) error {
118+
119+
fullPath := fmt.Sprintf("/contexts/%s", url.PathEscape(name))
120+
opts := RequestOptions{
121+
Path: fullPath,
122+
Method: "DELETE",
123+
}
124+
125+
_, err := client.RequestAPI(&opts)
126+
127+
if err != nil {
128+
return err
129+
}
130+
131+
return nil
132+
}

Diff for: codefresh/data_context.go

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package codefresh
2+
3+
import (
4+
"fmt"
5+
6+
cfClient "github.com/codefresh-io/terraform-provider-codefresh/client"
7+
"github.com/ghodss/yaml"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
)
10+
11+
func dataSourceContext() *schema.Resource {
12+
return &schema.Resource{
13+
Read: dataSourceContextRead,
14+
Schema: map[string]*schema.Schema{
15+
"name": {
16+
Type: schema.TypeString,
17+
Required: true,
18+
},
19+
"type": {
20+
Type: schema.TypeString,
21+
Computed: true,
22+
},
23+
"data": {
24+
Type: schema.TypeString,
25+
Computed: true,
26+
},
27+
},
28+
}
29+
}
30+
31+
func dataSourceContextRead(d *schema.ResourceData, meta interface{}) error {
32+
33+
client := meta.(*cfClient.Client)
34+
var context *cfClient.Context
35+
var err error
36+
37+
if name, nameOk := d.GetOk("name"); nameOk {
38+
context, err = client.GetContext(name.(string))
39+
} else {
40+
return fmt.Errorf("data.codefresh_context - must specify name")
41+
}
42+
if err != nil {
43+
return err
44+
}
45+
46+
if context == nil {
47+
return fmt.Errorf("data.codefresh_context - cannot find context")
48+
}
49+
50+
return mapDataContextToResource(context, d)
51+
}
52+
53+
func mapDataContextToResource(context *cfClient.Context, d *schema.ResourceData) error {
54+
55+
if context == nil || context.Metadata.Name == "" {
56+
return fmt.Errorf("data.codefresh_context - failed to mapDataContextToResource")
57+
}
58+
d.SetId(context.Metadata.Name)
59+
60+
d.Set("name", context.Metadata.Name)
61+
d.Set("type", context.Spec.Type)
62+
data, err := yaml.Marshal(context.Spec.Data)
63+
if err != nil {
64+
return err
65+
}
66+
d.Set("data", string(data))
67+
68+
return nil
69+
}

Diff for: codefresh/provider.go

+3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package codefresh
33
import (
44
cfClient "github.com/codefresh-io/terraform-provider-codefresh/client"
55
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
6+
67
//"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
78
"os"
89
)
@@ -32,10 +33,12 @@ func Provider() *schema.Provider {
3233
"codefresh_account": dataSourceAccount(),
3334
"codefresh_team": dataSourceTeam(),
3435
"codefresh_current_account": dataSourceCurrentAccount(),
36+
"codefresh_context": dataSourceContext(),
3537
},
3638
ResourcesMap: map[string]*schema.Resource{
3739
"codefresh_project": resourceProject(),
3840
"codefresh_pipeline": resourcePipeline(),
41+
"codefresh_context": resourceContext(),
3942
"codefresh_team": resourceTeam(),
4043
"codefresh_account": resourceAccount(),
4144
"codefresh_api_key": resourceApiKey(),

0 commit comments

Comments
 (0)