@@ -6,12 +6,14 @@ import (
6
6
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
7
7
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
8
8
cockpit "github.com/scaleway/scaleway-sdk-go/api/cockpit/v1beta1"
9
+ "github.com/scaleway/scaleway-sdk-go/scw"
9
10
)
10
11
11
12
func resourceScalewayCockpit () * schema.Resource {
12
13
return & schema.Resource {
13
14
CreateContext : resourceScalewayCockpitCreate ,
14
15
ReadContext : resourceScalewayCockpitRead ,
16
+ UpdateContext : resourceScalewayCockpitUpdate ,
15
17
DeleteContext : resourceScalewayCockpitDelete ,
16
18
Timeouts : & schema.ResourceTimeout {
17
19
Create : schema .DefaultTimeout (defaultCockpitTimeout ),
@@ -24,6 +26,16 @@ func resourceScalewayCockpit() *schema.Resource {
24
26
},
25
27
Schema : map [string ]* schema.Schema {
26
28
"project_id" : projectIDSchema (),
29
+ "plan" : {
30
+ Type : schema .TypeString ,
31
+ Optional : true ,
32
+ Description : "Name or ID of the plan" ,
33
+ },
34
+ "plan_id" : {
35
+ Type : schema .TypeString ,
36
+ Computed : true ,
37
+ Description : "The plan ID of the cockpit" ,
38
+ },
27
39
"endpoints" : {
28
40
Type : schema .TypeList ,
29
41
Computed : true ,
@@ -67,11 +79,40 @@ func resourceScalewayCockpitCreate(ctx context.Context, d *schema.ResourceData,
67
79
68
80
res , err := api .ActivateCockpit (& cockpit.ActivateCockpitRequest {
69
81
ProjectID : projectID ,
70
- })
82
+ }, scw . WithContext ( ctx ) )
71
83
if err != nil {
72
84
return diag .FromErr (err )
73
85
}
74
86
87
+ if targetPlanI , ok := d .GetOk ("plan" ); ok {
88
+ targetPlan := targetPlanI .(string )
89
+
90
+ plans , err := api .ListPlans (& cockpit.ListPlansRequest {}, scw .WithContext (ctx ), scw .WithAllPages ())
91
+ if err != nil {
92
+ return diag .FromErr (err )
93
+ }
94
+
95
+ var planID string
96
+ for _ , plan := range plans .Plans {
97
+ if plan .Name .String () == targetPlan || plan .ID == targetPlan {
98
+ planID = plan .ID
99
+ break
100
+ }
101
+ }
102
+
103
+ if planID == "" {
104
+ return diag .Errorf ("plan %s not found" , targetPlan )
105
+ }
106
+
107
+ _ , err = api .SelectPlan (& cockpit.SelectPlanRequest {
108
+ ProjectID : projectID ,
109
+ PlanID : planID ,
110
+ }, scw .WithContext (ctx ))
111
+ if err != nil {
112
+ return diag .FromErr (err )
113
+ }
114
+ }
115
+
75
116
d .SetId (res .ProjectID )
76
117
return resourceScalewayCockpitRead (ctx , d , meta )
77
118
}
@@ -84,19 +125,63 @@ func resourceScalewayCockpitRead(ctx context.Context, d *schema.ResourceData, me
84
125
85
126
res , err := waitForCockpit (ctx , api , d .Id (), d .Timeout (schema .TimeoutRead ))
86
127
if err != nil {
87
- if is404Error (err ) {
88
- d .SetId ("" )
89
- return nil
90
- }
91
128
return diag .FromErr (err )
92
129
}
93
130
94
131
_ = d .Set ("project_id" , res .ProjectID )
132
+ _ = d .Set ("plan_id" , res .Plan .ID )
95
133
_ = d .Set ("endpoints" , flattenCockpitEndpoints (res .Endpoints ))
96
134
97
135
return nil
98
136
}
99
137
138
+ func resourceScalewayCockpitUpdate (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
139
+ api , err := cockpitAPI (meta )
140
+ if err != nil {
141
+ return diag .FromErr (err )
142
+ }
143
+
144
+ projectID := d .Id ()
145
+ _ , err = waitForCockpit (ctx , api , projectID , d .Timeout (schema .TimeoutDelete ))
146
+ if err != nil {
147
+ return diag .FromErr (err )
148
+ }
149
+
150
+ if d .HasChange ("plan" ) {
151
+ targetPlan := cockpit .PlanNameFree .String ()
152
+ if targetPlanI , ok := d .GetOk ("plan" ); ok {
153
+ targetPlan = targetPlanI .(string )
154
+ }
155
+
156
+ plans , err := api .ListPlans (& cockpit.ListPlansRequest {}, scw .WithContext (ctx ), scw .WithAllPages ())
157
+ if err != nil {
158
+ return diag .FromErr (err )
159
+ }
160
+
161
+ var planID string
162
+ for _ , plan := range plans .Plans {
163
+ if plan .Name .String () == targetPlan || plan .ID == targetPlan {
164
+ planID = plan .ID
165
+ break
166
+ }
167
+ }
168
+
169
+ if planID == "" {
170
+ return diag .Errorf ("plan %s not found" , targetPlan )
171
+ }
172
+
173
+ _ , err = api .SelectPlan (& cockpit.SelectPlanRequest {
174
+ ProjectID : projectID ,
175
+ PlanID : planID ,
176
+ }, scw .WithContext (ctx ))
177
+ if err != nil {
178
+ return diag .FromErr (err )
179
+ }
180
+ }
181
+
182
+ return resourceScalewayCockpitRead (ctx , d , meta )
183
+ }
184
+
100
185
func resourceScalewayCockpitDelete (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
101
186
api , err := cockpitAPI (meta )
102
187
if err != nil {
@@ -110,7 +195,7 @@ func resourceScalewayCockpitDelete(ctx context.Context, d *schema.ResourceData,
110
195
111
196
_ , err = api .DeactivateCockpit (& cockpit.DeactivateCockpitRequest {
112
197
ProjectID : d .Id (),
113
- })
198
+ }, scw . WithContext ( ctx ) )
114
199
if err != nil {
115
200
return diag .FromErr (err )
116
201
}
0 commit comments