/
tf_migration.go
92 lines (75 loc) · 2.74 KB
/
tf_migration.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
// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Gardener contributors
//
// SPDX-License-Identifier: Apache-2.0
package infrastructure
import (
"fmt"
"github.com/gardener/gardener/extensions/pkg/terraformer"
"k8s.io/apimachinery/pkg/runtime"
aliapi "github.com/gardener/gardener-extension-provider-alicloud/pkg/apis/alicloud"
"github.com/gardener/gardener-extension-provider-alicloud/pkg/controller/infrastructure/infraflow"
"github.com/gardener/gardener-extension-provider-alicloud/pkg/controller/infrastructure/infraflow/shared"
)
func migrateTerraformStateToFlowState(rawExtension *runtime.RawExtension, zones []aliapi.Zone) (*infraflow.PersistentState, error) {
var (
tfRawState *terraformer.RawState
tfState *shared.TerraformState
err error
)
flowState := infraflow.NewPersistentState()
// return flowState, nil
if rawExtension == nil {
return flowState, nil
}
if tfRawState, err = getTerraformerRawState(rawExtension); err != nil {
return nil, err
}
if tfState, err = shared.UnmarshalTerraformStateFromTerraformer(tfRawState); err != nil {
return nil, err
}
if tfState.Outputs == nil {
return flowState, nil
}
vpc_id := tfState.Outputs["vpc_id"].Value
if vpc_id != "" {
setFlowStateData(flowState, infraflow.IdentifierVPC, &vpc_id)
}
sg_id := tfState.Outputs["sg_id"].Value
if sg_id != "" {
setFlowStateData(flowState, infraflow.IdentifierNodesSecurityGroup, &sg_id)
}
nat_gateway := tfState.GetManagedResourceInstanceID("alicloud_nat_gateway", "nat_gateway")
if nat_gateway != nil && *nat_gateway != "" {
setFlowStateData(flowState, infraflow.IdentifierNatGateway, nat_gateway)
}
for i, zone := range zones {
keyPrefix := infraflow.ChildIdZones + shared.Separator + zone.Name + shared.Separator
suffix := fmt.Sprintf("z%d", i)
setFlowStateData(flowState, keyPrefix+infraflow.IdentifierZoneSuffix, &suffix)
eip := tfState.GetManagedResourceInstanceID("alicloud_eip", "eip_natgw_"+suffix)
if eip != nil && *eip != "" {
setFlowStateData(flowState, keyPrefix+infraflow.IdentifierZoneNATGWElasticIP, eip)
}
setFlowStateData(flowState, keyPrefix+infraflow.IdentifierZoneVSwitch,
tfState.GetManagedResourceInstanceID("alicloud_vswitch", "vsw_"+suffix))
}
flowState.SetMigratedFromTerraform()
return flowState, nil
}
func setFlowStateData(state *infraflow.PersistentState, key string, id *string) {
if id == nil {
delete(state.Data, key)
} else {
state.Data[key] = *id
}
}
func getTerraformerRawState(state *runtime.RawExtension) (*terraformer.RawState, error) {
if state == nil {
return nil, nil
}
tfRawState, err := terraformer.UnmarshalRawState(state)
if err != nil {
return nil, fmt.Errorf("could not decode terraform raw state: %+v", err)
}
return tfRawState, nil
}