-
Notifications
You must be signed in to change notification settings - Fork 42
/
resource_jenkins_job.go
156 lines (129 loc) · 4.76 KB
/
resource_jenkins_job.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package jenkins
import (
"context"
"fmt"
"log"
"strings"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func resourceJenkinsJob() *schema.Resource {
return &schema.Resource{
CreateContext: resourceJenkinsJobCreate,
ReadContext: resourceJenkinsJobRead,
UpdateContext: resourceJenkinsJobUpdate,
DeleteContext: resourceJenkinsJobDelete,
Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Description: "The unique name of the JenkinsCI job.",
Required: true,
ForceNew: true,
ValidateDiagFunc: validateJobName,
},
"folder": {
Type: schema.TypeString,
Description: "The folder namespace that the job will be added to.",
Optional: true,
ForceNew: true,
ValidateDiagFunc: validateFolderName,
},
"template": {
Type: schema.TypeString,
Description: "The configuration file template, used to communicate with Jenkins.",
Required: true,
DiffSuppressFunc: templateDiff,
},
"parameters": {
Type: schema.TypeMap,
Description: "The set of parameters to be rendered in the template when generating a valid config.xml file.",
Optional: true,
Deprecated: "Use the built-in templatefile function to render your parameters in the future.",
Elem: schema.TypeString,
},
},
}
}
func resourceJenkinsJobCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(jenkinsClient)
name := d.Get("name").(string)
folderName := d.Get("folder").(string)
// Validate that the folder exists
if err := folderExists(ctx, client, folderName); err != nil {
return diag.FromErr(fmt.Errorf("jenkins::create - Could not find folder '%s': %w", folderName, err))
}
xml, err := renderTemplate(d.Get("template").(string), d)
if err != nil {
return diag.FromErr(fmt.Errorf("jenkins::create - Error binding config.xml template to %q: %w", name, err))
}
folders := extractFolders(folderName)
_, err = client.CreateJobInFolder(ctx, xml, name, folders...)
if err != nil {
return diag.FromErr(fmt.Errorf("jenkins::create - Error creating job for %q in folder %s: %w", name, folderName, err))
}
log.Printf("[DEBUG] jenkins::create - job %q created in folder %s", name, folderName)
d.SetId(formatFolderName(folderName + "/" + name))
return resourceJenkinsJobRead(ctx, d, meta)
}
func resourceJenkinsJobRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(jenkinsClient)
name, folders := parseCanonicalJobID(d.Id())
log.Printf("[DEBUG] jenkins::read - Looking for job %q", name)
job, err := client.GetJob(ctx, name, folders...)
if err != nil {
if strings.HasPrefix(err.Error(), "404") {
// Job does not exist
d.SetId("")
return nil
}
return diag.FromErr(fmt.Errorf("jenkins::read - Job %q does not exist: %w", name, err))
}
config, err := job.GetConfig(ctx)
if err != nil {
return diag.FromErr(fmt.Errorf("jenkins::read - Job %q could not extract configuration: %v", job.Base, err))
}
log.Printf("[DEBUG] jenkins::read - Job %q exists", job.Base)
d.SetId(job.Base)
if err := d.Set("template", config); err != nil {
return diag.FromErr(err)
}
if err := d.Set("name", name); err != nil {
return diag.FromErr(err)
}
if err := d.Set("folder", formatFolderID(folders)); err != nil {
return diag.FromErr(err)
}
return nil
}
func resourceJenkinsJobUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(jenkinsClient)
name, folders := parseCanonicalJobID(d.Id())
// grab job by current name
job, err := client.GetJob(ctx, name, folders...)
if err != nil {
return diag.FromErr(fmt.Errorf("jenkins::update - Could not find job %q: %w", name, err))
}
xml, err := renderTemplate(d.Get("template").(string), d)
if err != nil {
return diag.FromErr(fmt.Errorf("jenkins::update - Error binding config.xml template to %q: %w", name, err))
}
err = job.UpdateConfig(ctx, xml)
if err != nil {
return diag.FromErr(fmt.Errorf("jenkins::update - Error updating job %q configuration: %w", name, err))
}
return resourceJenkinsJobRead(ctx, d, meta)
}
func resourceJenkinsJobDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(jenkinsClient)
name, folders := parseCanonicalJobID(d.Id())
log.Printf("[DEBUG] jenkins::delete - Removing %q", name)
ok, err := client.DeleteJobInFolder(ctx, name, folders...)
if err != nil {
return diag.FromErr(err)
}
log.Printf("[DEBUG] jenkins::delete - %q removed: %t", name, ok)
return nil
}