@@ -9,9 +9,11 @@ import (
9
9
10
10
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11
11
12
+ k8sappsv1 "k8s.io/api/apps/v1"
12
13
k8serrors "k8s.io/apimachinery/pkg/api/errors"
13
14
k8smeta "k8s.io/apimachinery/pkg/api/meta"
14
15
k8smetav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16
+
15
17
k8sunstructured "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
16
18
k8sruntime "k8s.io/apimachinery/pkg/runtime"
17
19
k8sschema "k8s.io/apimachinery/pkg/runtime/schema"
@@ -20,13 +22,20 @@ import (
20
22
"k8s.io/client-go/restmapper"
21
23
)
22
24
25
+ var waitRefreshFunctions = map [string ]waitRefreshFunction {
26
+ "apps/Deployment" : waitDeploymentRefresh ,
27
+ "apps/Daemonset" : waitDaemonsetRefresh ,
28
+ }
29
+
23
30
type kManifestId struct {
24
31
group string
25
32
kind string
26
33
namespace string
27
34
name string
28
35
}
29
36
37
+ type waitRefreshFunction func (km * kManifest ) (interface {}, string , error )
38
+
30
39
func mustParseProviderId (str string ) * kManifestId {
31
40
kr , err := parseProviderId (str )
32
41
if err != nil {
@@ -354,6 +363,92 @@ func (km *kManifest) waitDeleted(t time.Duration) error {
354
363
return nil
355
364
}
356
365
366
+ func daemonsetReady (u * k8sunstructured.Unstructured ) (bool , error ) {
367
+ var daemonset k8sappsv1.DaemonSet
368
+ if err := k8sruntime .DefaultUnstructuredConverter .FromUnstructured (u .UnstructuredContent (), & daemonset ); err != nil {
369
+ return false , err
370
+ }
371
+ if daemonset .Generation == daemonset .Status .ObservedGeneration &&
372
+ daemonset .Status .UpdatedNumberScheduled == daemonset .Status .DesiredNumberScheduled &&
373
+ daemonset .Status .NumberReady == daemonset .Status .DesiredNumberScheduled &&
374
+ daemonset .Status .NumberUnavailable == 0 {
375
+ return true , nil
376
+ } else {
377
+ return false , nil
378
+ }
379
+ }
380
+
381
+ func waitDaemonsetRefresh (km * kManifest ) (interface {}, string , error ) {
382
+ resp , err := km .apiGet (k8smetav1.GetOptions {})
383
+ if err != nil {
384
+ if k8serrors .IsNotFound (err ) {
385
+ return nil , "missing" , nil
386
+ }
387
+ return nil , "error" , err
388
+ }
389
+ ready , err := daemonsetReady (resp )
390
+ if err != nil {
391
+ return nil , "error" , err
392
+ }
393
+ if ready {
394
+ return resp , "done" , nil
395
+ }
396
+ return nil , "in progress" , nil
397
+ }
398
+
399
+ func deploymentReady (u * k8sunstructured.Unstructured ) (bool , error ) {
400
+ var deployment k8sappsv1.Deployment
401
+ if err := k8sruntime .DefaultUnstructuredConverter .FromUnstructured (u .UnstructuredContent (), & deployment ); err != nil {
402
+ return false , err
403
+ }
404
+ if deployment .Generation == deployment .Status .ObservedGeneration &&
405
+ deployment .Status .AvailableReplicas == * deployment .Spec .Replicas &&
406
+ deployment .Status .AvailableReplicas == deployment .Status .Replicas &&
407
+ deployment .Status .UnavailableReplicas == 0 {
408
+ return true , nil
409
+ } else {
410
+ return false , nil
411
+ }
412
+ }
413
+
414
+ func waitDeploymentRefresh (km * kManifest ) (interface {}, string , error ) {
415
+ resp , err := km .apiGet (k8smetav1.GetOptions {})
416
+ if err != nil {
417
+ if k8serrors .IsNotFound (err ) {
418
+ return nil , "missing" , nil
419
+ }
420
+ return nil , "error" , err
421
+ }
422
+ ready , err := deploymentReady (resp )
423
+ if err != nil {
424
+ return nil , "error" , err
425
+ }
426
+ if ready {
427
+ return resp , "done" , nil
428
+ }
429
+ return nil , "in progress" , nil
430
+ }
431
+
432
+ func (km * kManifest ) waitCreatedOrUpdated (t time.Duration ) error {
433
+ gvk := km .gvk ()
434
+ if refresh , ok := waitRefreshFunctions [fmt .Sprintf ("%s/%s" , gvk .Group , gvk .Kind )]; ok {
435
+ stateConf := & resource.StateChangeConf {
436
+ Target : []string {"done" },
437
+ Pending : []string {"in progress" },
438
+ Timeout : t ,
439
+ Refresh : func () (interface {}, string , error ) {
440
+ return refresh (km )
441
+ },
442
+ }
443
+
444
+ _ , err := stateConf .WaitForState ()
445
+ if err != nil {
446
+ return km .fmtErr (fmt .Errorf ("timed out creating/updating %s %s/%s: %s" , gvk .Kind , km .namespace (), km .name (), err ))
447
+ }
448
+ }
449
+ return nil
450
+ }
451
+
357
452
func (km * kManifest ) fmtErr (err error ) error {
358
453
return fmt .Errorf (
359
454
"%q: %s" ,
0 commit comments