@@ -8,6 +8,15 @@ import (
8
8
"github.com/gthesheep/terraform-provider-dbt-cloud/pkg/dbt_cloud"
9
9
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
10
10
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
11
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
12
+ )
13
+
14
+ var (
15
+ scheduleTypes = []string {
16
+ "every_day" ,
17
+ "days_of_week" ,
18
+ "custom_cron" ,
19
+ }
11
20
)
12
21
13
22
var jobSchema = map [string ]* schema.Schema {
@@ -80,6 +89,45 @@ var jobSchema = map[string]*schema.Schema{
80
89
Default : false ,
81
90
Description : "Flag for whether the job should run generate sources" ,
82
91
},
92
+ "schedule_type" : & schema.Schema {
93
+ Type : schema .TypeString ,
94
+ Optional : true ,
95
+ Default : "every_day" ,
96
+ Description : "Type of schedule to use, one of every_day/ days_of_week/ custom_cron" ,
97
+ ValidateFunc : validation .StringInSlice (scheduleTypes , false ),
98
+ },
99
+ "schedule_interval" : & schema.Schema {
100
+ Type : schema .TypeInt ,
101
+ Optional : true ,
102
+ Default : 1 ,
103
+ Description : "Number of hours between job executions if running on a schedule" ,
104
+ ValidateFunc : validation .IntBetween (1 , 23 ),
105
+ ConflictsWith : []string {"schedule_hours" },
106
+ },
107
+ "schedule_hours" : & schema.Schema {
108
+ Type : schema .TypeList ,
109
+ MinItems : 1 ,
110
+ Optional : true ,
111
+ Elem : & schema.Schema {
112
+ Type : schema .TypeInt ,
113
+ },
114
+ Description : "List of hours to execute the job at if running on a schedule" ,
115
+ ConflictsWith : []string {"schedule_interval" },
116
+ },
117
+ "schedule_days" : & schema.Schema {
118
+ Type : schema .TypeList ,
119
+ MinItems : 1 ,
120
+ Optional : true ,
121
+ Elem : & schema.Schema {
122
+ Type : schema .TypeInt ,
123
+ },
124
+ Description : "List of days of week as numbers (0 = Sunday, 7 = Saturday) to execute the job at if running on a schedule" ,
125
+ },
126
+ "schedule_cron" : & schema.Schema {
127
+ Type : schema .TypeString ,
128
+ Optional : true ,
129
+ Description : "Custom cron expression for schedule" ,
130
+ },
83
131
}
84
132
85
133
func ResourceJob () * schema.Resource {
@@ -139,6 +187,27 @@ func resourceJobRead(ctx context.Context, d *schema.ResourceData, m interface{})
139
187
if err := d .Set ("run_generate_sources" , job .Run_Generate_Sources ); err != nil {
140
188
return diag .FromErr (err )
141
189
}
190
+ if err := d .Set ("schedule_type" , job .Schedule .Date .Type ); err != nil {
191
+ return diag .FromErr (err )
192
+ }
193
+
194
+ schedule := 1
195
+ if job .Schedule .Time .Interval > 0 {
196
+ schedule = job .Schedule .Time .Interval
197
+ }
198
+ if err := d .Set ("schedule_interval" , schedule ); err != nil {
199
+ return diag .FromErr (err )
200
+ }
201
+
202
+ if err := d .Set ("schedule_hours" , job .Schedule .Time .Hours ); err != nil {
203
+ return diag .FromErr (err )
204
+ }
205
+ if err := d .Set ("schedule_days" , job .Schedule .Date .Days ); err != nil {
206
+ return diag .FromErr (err )
207
+ }
208
+ if err := d .Set ("schedule_cron" , job .Schedule .Date .Cron ); err != nil {
209
+ return diag .FromErr (err )
210
+ }
142
211
143
212
var triggers map [string ]interface {}
144
213
triggersInput , _ := json .Marshal (job .Triggers )
@@ -167,13 +236,26 @@ func resourceJobCreate(ctx context.Context, d *schema.ResourceData, m interface{
167
236
targetName := d .Get ("target_name" ).(string )
168
237
generateDocs := d .Get ("generate_docs" ).(bool )
169
238
runGenerateSources := d .Get ("run_generate_sources" ).(bool )
239
+ scheduleType := d .Get ("schedule_type" ).(string )
240
+ scheduleInterval := d .Get ("schedule_interval" ).(int )
241
+ scheduleHours := d .Get ("schedule_hours" ).([]interface {})
242
+ scheduleDays := d .Get ("schedule_days" ).([]interface {})
243
+ scheduleCron := d .Get ("schedule_cron" ).(string )
170
244
171
245
steps := []string {}
172
246
for _ , step := range executeSteps {
173
247
steps = append (steps , step .(string ))
174
248
}
249
+ hours := []int {}
250
+ for _ , hour := range scheduleHours {
251
+ hours = append (hours , hour .(int ))
252
+ }
253
+ days := []int {}
254
+ for _ , day := range scheduleDays {
255
+ days = append (days , day .(int ))
256
+ }
175
257
176
- j , err := c .CreateJob (projectId , environmentId , name , steps , dbtVersion , isActive , triggers , numThreads , targetName , generateDocs , runGenerateSources )
258
+ j , err := c .CreateJob (projectId , environmentId , name , steps , dbtVersion , isActive , triggers , numThreads , targetName , generateDocs , runGenerateSources , scheduleType , scheduleInterval , hours , days , scheduleCron )
177
259
if err != nil {
178
260
return diag .FromErr (err )
179
261
}
@@ -191,7 +273,9 @@ func resourceJobUpdate(ctx context.Context, d *schema.ResourceData, m interface{
191
273
192
274
if d .HasChange ("name" ) || d .HasChange ("dbt_version" ) || d .HasChange ("num_threads" ) ||
193
275
d .HasChange ("target_name" ) || d .HasChange ("execute_steps" ) || d .HasChange ("run_generate_sources" ) ||
194
- d .HasChange ("generate_docs" ) || d .HasChange ("triggers" ) {
276
+ d .HasChange ("generate_docs" ) || d .HasChange ("triggers" ) || d .HasChange ("schedule_type" ) ||
277
+ d .HasChange ("schedule_interval" ) || d .HasChange ("schedule_hours" ) || d .HasChange ("schedule_days" ) ||
278
+ d .HasChange ("schedule_cron" ) {
195
279
job , err := c .GetJob (jobId )
196
280
if err != nil {
197
281
return diag .FromErr (err )
@@ -235,6 +319,34 @@ func resourceJobUpdate(ctx context.Context, d *schema.ResourceData, m interface{
235
319
job .Triggers .Schedule = newTriggers ["schedule" ].(bool )
236
320
job .Triggers .Custom_Branch_Only = newTriggers ["custom_branch_only" ].(bool )
237
321
}
322
+ if d .HasChange ("schedule_type" ) {
323
+ scheduleType := d .Get ("schedule_type" ).(string )
324
+ job .Schedule .Date .Type = scheduleType
325
+ }
326
+ if d .HasChange ("schedule_interval" ) {
327
+ scheduleInterval := d .Get ("schedule_interval" ).(int )
328
+ job .Schedule .Time .Interval = scheduleInterval
329
+ }
330
+ if d .HasChange ("schedule_hours" ) {
331
+ scheduleHours := make ([]int , len (d .Get ("schedule_hours" ).([]interface {})))
332
+ for i , hour := range d .Get ("schedule_hours" ).([]interface {}) {
333
+ scheduleHours [i ] = hour .(int )
334
+ }
335
+ job .Schedule .Time .Hours = & scheduleHours
336
+ job .Schedule .Time .Type = "at_exact_hours"
337
+ job .Schedule .Time .Interval = 0
338
+ }
339
+ if d .HasChange ("schedule_days" ) {
340
+ scheduleDays := make ([]int , len (d .Get ("schedule_days" ).([]interface {})))
341
+ for i , day := range d .Get ("schedule_days" ).([]interface {}) {
342
+ scheduleDays [i ] = day .(int )
343
+ }
344
+ job .Schedule .Date .Days = & scheduleDays
345
+ }
346
+ if d .HasChange ("schedule_cron" ) {
347
+ scheduleCron := d .Get ("schedule_cron" ).(string )
348
+ job .Schedule .Date .Cron = & scheduleCron
349
+ }
238
350
239
351
_ , err = c .UpdateJob (jobId , * job )
240
352
if err != nil {
0 commit comments