Skip to content

Commit bbdb3ed

Browse files
authored
Merge pull request #87 from matejvelikonja/master
Add support for gitlab project cluster
2 parents 4800a6d + b212a40 commit bbdb3ed

File tree

3 files changed

+471
-0
lines changed

3 files changed

+471
-0
lines changed

gitlab/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ func Provider() terraform.ResourceProvider {
5959
"gitlab_group_membership": resourceGitlabGroupMembership(),
6060
"gitlab_project_variable": resourceGitlabProjectVariable(),
6161
"gitlab_group_variable": resourceGitlabGroupVariable(),
62+
"gitlab_project_cluster": resourceGitlabProjectCluster(),
6263
},
6364

6465
ConfigureFunc: providerConfigure,
Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
package gitlab
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"strconv"
7+
8+
"github.com/hashicorp/terraform/helper/schema"
9+
"github.com/hashicorp/terraform/helper/validation"
10+
"github.com/xanzy/go-gitlab"
11+
)
12+
13+
func resourceGitlabProjectCluster() *schema.Resource {
14+
return &schema.Resource{
15+
Create: resourceGitlabProjectClusterCreate,
16+
Read: resourceGitlabProjectClusterRead,
17+
Update: resourceGitlabProjectClusterUpdate,
18+
Delete: resourceGitlabProjectClusterDelete,
19+
Importer: &schema.ResourceImporter{
20+
State: schema.ImportStatePassthrough,
21+
},
22+
23+
Schema: map[string]*schema.Schema{
24+
"project": {
25+
Type: schema.TypeString,
26+
Required: true,
27+
ForceNew: true,
28+
},
29+
"name": {
30+
Type: schema.TypeString,
31+
Required: true,
32+
},
33+
"enabled": {
34+
Type: schema.TypeBool,
35+
Optional: true,
36+
Default: true,
37+
ForceNew: true,
38+
},
39+
"created_at": {
40+
Type: schema.TypeString,
41+
Computed: true,
42+
},
43+
"provider_type": {
44+
Type: schema.TypeString,
45+
Computed: true,
46+
},
47+
"platform_type": {
48+
Type: schema.TypeString,
49+
Computed: true,
50+
},
51+
"environment_scope": {
52+
Type: schema.TypeString,
53+
Optional: true,
54+
Default: "*",
55+
},
56+
"cluster_type": {
57+
Type: schema.TypeString,
58+
Computed: true,
59+
},
60+
"kubernetes_api_url": {
61+
Type: schema.TypeString,
62+
Required: true,
63+
},
64+
"kubernetes_token": {
65+
Type: schema.TypeString,
66+
Required: true,
67+
Sensitive: true,
68+
},
69+
"kubernetes_ca_cert": {
70+
Type: schema.TypeString,
71+
Optional: true,
72+
},
73+
"kubernetes_namespace": {
74+
Type: schema.TypeString,
75+
Optional: true,
76+
},
77+
"kubernetes_authorization_type": {
78+
Type: schema.TypeString,
79+
Optional: true,
80+
ForceNew: true,
81+
Default: "rbac",
82+
ValidateFunc: validation.StringInSlice([]string{"rbac", "abac", "unknown_authorization"}, false),
83+
},
84+
},
85+
}
86+
}
87+
88+
func resourceGitlabProjectClusterCreate(d *schema.ResourceData, meta interface{}) error {
89+
client := meta.(*gitlab.Client)
90+
project := d.Get("project").(string)
91+
92+
pk := gitlab.AddPlatformKubernetesOptions{
93+
APIURL: gitlab.String(d.Get("kubernetes_api_url").(string)),
94+
Token: gitlab.String(d.Get("kubernetes_token").(string)),
95+
}
96+
97+
if v, ok := d.GetOk("kubernetes_ca_cert"); ok {
98+
pk.CaCert = gitlab.String(v.(string))
99+
}
100+
101+
if v, ok := d.GetOk("kubernetes_namespace"); ok {
102+
pk.Namespace = gitlab.String(v.(string))
103+
}
104+
105+
if v, ok := d.GetOk("kubernetes_authorization_type"); ok {
106+
pk.AuthorizationType = gitlab.String(v.(string))
107+
}
108+
109+
options := &gitlab.AddClusterOptions{
110+
Name: gitlab.String(d.Get("name").(string)),
111+
Enabled: gitlab.Bool(d.Get("enabled").(bool)),
112+
PlatformKubernetes: &pk,
113+
}
114+
115+
if v, ok := d.GetOk("environment_scope"); ok {
116+
options.EnvironmentScope = gitlab.String(v.(string))
117+
}
118+
119+
log.Printf("[DEBUG] create gitlab project cluster %q/%q", project, *options.Name)
120+
121+
cluster, _, err := client.ProjectCluster.AddCluster(project, options)
122+
123+
if err != nil {
124+
return err
125+
}
126+
127+
clusterIdString := fmt.Sprintf("%d", cluster.ID)
128+
d.SetId(buildTwoPartID(&project, &clusterIdString))
129+
130+
return resourceGitlabProjectClusterRead(d, meta)
131+
}
132+
133+
func resourceGitlabProjectClusterRead(d *schema.ResourceData, meta interface{}) error {
134+
client := meta.(*gitlab.Client)
135+
136+
project, clusterId, err := projectIdAndClusterIdFromId(d.Id())
137+
if err != nil {
138+
return err
139+
}
140+
141+
log.Printf("[DEBUG] read gitlab project cluster %q/%d", project, clusterId)
142+
143+
cluster, response, err := client.ProjectCluster.GetCluster(project, clusterId)
144+
if err != nil {
145+
if response.StatusCode == 404 {
146+
log.Printf("[WARN] removing project cluster %s/%d from state because it no longer exists in gitlab", project, clusterId)
147+
d.SetId("")
148+
return nil
149+
}
150+
151+
return err
152+
}
153+
154+
d.Set("project", project)
155+
d.Set("name", cluster.Name)
156+
d.Set("created_at", cluster.CreatedAt.String())
157+
d.Set("provider_type", cluster.ProviderType)
158+
d.Set("platform_type", cluster.PlatformType)
159+
d.Set("environment_scope", cluster.EnvironmentScope)
160+
d.Set("cluster_type", cluster.ClusterType)
161+
162+
d.Set("kubernetes_api_url", cluster.PlatformKubernetes.APIURL)
163+
d.Set("kubernetes_ca_cert", cluster.PlatformKubernetes.CaCert)
164+
d.Set("kubernetes_namespace", cluster.PlatformKubernetes.Namespace)
165+
d.Set("kubernetes_authorization_type", cluster.PlatformKubernetes.AuthorizationType)
166+
167+
return nil
168+
}
169+
170+
func resourceGitlabProjectClusterUpdate(d *schema.ResourceData, meta interface{}) error {
171+
client := meta.(*gitlab.Client)
172+
173+
project, clusterId, err := projectIdAndClusterIdFromId(d.Id())
174+
if err != nil {
175+
return err
176+
}
177+
178+
options := &gitlab.EditClusterOptions{}
179+
180+
if d.HasChange("name") {
181+
options.Name = gitlab.String(d.Get("name").(string))
182+
}
183+
184+
if d.HasChange("environment_scope") {
185+
options.EnvironmentScope = gitlab.String(d.Get("environment_scope").(string))
186+
}
187+
188+
pk := &gitlab.EditPlatformKubernetesOptions{}
189+
190+
if d.HasChange("kubernetes_api_url") {
191+
pk.APIURL = gitlab.String(d.Get("kubernetes_api_url").(string))
192+
}
193+
194+
if d.HasChange("kubernetes_token") {
195+
pk.Token = gitlab.String(d.Get("kubernetes_token").(string))
196+
}
197+
198+
if d.HasChange("kubernetes_ca_cert") {
199+
pk.CaCert = gitlab.String(d.Get("kubernetes_ca_cert").(string))
200+
}
201+
202+
if d.HasChange("kubernetes_namespace") {
203+
pk.Namespace = gitlab.String(d.Get("kubernetes_namespace").(string))
204+
}
205+
206+
if *pk != (gitlab.EditPlatformKubernetesOptions{}) {
207+
options.PlatformKubernetes = pk
208+
}
209+
210+
if *options != (gitlab.EditClusterOptions{}) {
211+
log.Printf("[DEBUG] update gitlab project cluster %q/%d", project, clusterId)
212+
_, _, err := client.ProjectCluster.EditCluster(project, clusterId, options)
213+
if err != nil {
214+
return err
215+
}
216+
}
217+
218+
return resourceGitlabProjectClusterRead(d, meta)
219+
}
220+
221+
func resourceGitlabProjectClusterDelete(d *schema.ResourceData, meta interface{}) error {
222+
client := meta.(*gitlab.Client)
223+
project, clusterId, err := projectIdAndClusterIdFromId(d.Id())
224+
if err != nil {
225+
return err
226+
}
227+
228+
log.Printf("[DEBUG] delete gitlab project cluster %q/%d", project, clusterId)
229+
230+
_, err = client.ProjectCluster.DeleteCluster(project, clusterId)
231+
232+
return err
233+
}
234+
235+
func projectIdAndClusterIdFromId(id string) (string, int, error) {
236+
project, clusterIdString, err := parseTwoPartID(id)
237+
if err != nil {
238+
return "", 0, err
239+
}
240+
241+
clusterId, err := strconv.Atoi(clusterIdString)
242+
if err != nil {
243+
return "", 0, fmt.Errorf("failed to get clusterId: %v", err)
244+
}
245+
246+
return project, clusterId, nil
247+
}

0 commit comments

Comments
 (0)