Skip to content

Commit 5df4824

Browse files
add support for gitlab project cluster
1 parent 028e509 commit 5df4824

File tree

3 files changed

+447
-0
lines changed

3 files changed

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

0 commit comments

Comments
 (0)