@@ -27,6 +27,45 @@ func resourceRKECluster() *schema.Resource {
27
27
Update : resourceRKEClusterUpdate ,
28
28
Delete : resourceRKEClusterDelete ,
29
29
Schema : rkeClusterFields (),
30
+ CustomizeDiff : func (d * schema.ResourceDiff , i interface {}) error {
31
+ changed , changedKeys := getChangedKeys (d )
32
+ if changed > 0 {
33
+ computedFields := []string {
34
+ "rke_state" ,
35
+ "kube_config_yaml" ,
36
+ "rke_cluster_yaml" ,
37
+ }
38
+
39
+ if changedKeys ["rotate_certificates" ] {
40
+ for _ , key := range []string {"ca_crt" , "client_cert" , "client_key" , "certificates" , "kube_admin_user" } {
41
+ computedFields = append (computedFields , key )
42
+ }
43
+ }
44
+
45
+ if changedKeys ["dns" ] || changedKeys ["services" ] {
46
+ for _ , key := range []string {"cluster_domain" , "cluster_cidr" , "cluster_dns_server" } {
47
+ computedFields = append (computedFields , key )
48
+ }
49
+ }
50
+
51
+ if changedKeys ["nodes" ] {
52
+ for _ , key := range []string {"api_server_url" , "etcd_hosts" , "control_plane_hosts" , "inactive_hosts" , "worker_hosts" } {
53
+ computedFields = append (computedFields , key )
54
+ }
55
+ }
56
+
57
+ if changedKeys ["kubernetes_version" ] || changedKeys ["system_images" ] {
58
+ computedFields = append (computedFields , "running_system_images" )
59
+ }
60
+
61
+ for _ , key := range computedFields {
62
+ if err := d .SetNewComputed (key ); err != nil {
63
+ return err
64
+ }
65
+ }
66
+ }
67
+ return nil
68
+ },
30
69
Timeouts : & schema.ResourceTimeout {
31
70
Create : schema .DefaultTimeout (30 * time .Minute ),
32
71
Update : schema .DefaultTimeout (30 * time .Minute ),
@@ -48,7 +87,7 @@ func resourceRKEClusterUpdate(d *schema.ResourceData, meta interface{}) error {
48
87
if err := clusterUp (d ); err != nil {
49
88
return meta .(* Config ).saveRKEOutput (err )
50
89
}
51
- return meta .( * Config ). saveRKEOutput ( resourceRKEClusterRead (d , meta ) )
90
+ return resourceRKEClusterRead (d , meta )
52
91
}
53
92
54
93
func resourceRKEClusterRead (d * schema.ResourceData , meta interface {}) error {
@@ -64,7 +103,7 @@ func resourceRKEClusterDelete(d *schema.ResourceData, meta interface{}) error {
64
103
log .Info ("Deleting RKE cluster..." )
65
104
err := clusterDelete (d )
66
105
if err != nil {
67
- return err
106
+ return meta .( * Config ). saveRKEOutput ( err )
68
107
}
69
108
d .SetId ("" )
70
109
return nil
@@ -332,6 +371,44 @@ func removeTempDir(tempDir string) {
332
371
}
333
372
}
334
373
374
+ func getChangedKeys (d * schema.ResourceDiff ) (int , map [string ]bool ) {
375
+ targetKeys := []string {
376
+ "addon_job_timeout" ,
377
+ "addons" ,
378
+ "addons_include" ,
379
+ "authentication" ,
380
+ "authorization" ,
381
+ "bastion_host" ,
382
+ "cloud_provider" ,
383
+ "cluster_name" ,
384
+ "dns" ,
385
+ "ignore_docker_version" ,
386
+ "ingress" ,
387
+ "kubernetes_version" ,
388
+ "monitoring" ,
389
+ "network" ,
390
+ "nodes" ,
391
+ "prefix_path" ,
392
+ "private_registries" ,
393
+ "restore" ,
394
+ "rotate_certificates" ,
395
+ "services" ,
396
+ "ssh_agent_auth" ,
397
+ "ssh_cert_path" ,
398
+ "ssh_key_path" ,
399
+ "system_images" ,
400
+ }
401
+ changedKeys := map [string ]bool {}
402
+ changed := 0
403
+ for _ , key := range targetKeys {
404
+ changedKeys [key ] = d .HasChange (key )
405
+ if changedKeys [key ] {
406
+ changed ++
407
+ }
408
+ }
409
+ return changed , changedKeys
410
+ }
411
+
335
412
type stateNotFoundError struct {
336
413
actual error
337
414
}
0 commit comments