Skip to content

Commit 881d542

Browse files
authored
feat: skip destroy imported resources (#1239)
1 parent c772aed commit 881d542

File tree

4 files changed

+70
-23
lines changed

4 files changed

+70
-23
lines changed

pkg/apis/api.kusion.io/v1/types.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -251,15 +251,18 @@ const (
251251
BackendTypeOss = "oss"
252252
BackendTypeS3 = "s3"
253253

254-
EnvOssAccessKeyID = "OSS_ACCESS_KEY_ID"
255-
EnvOssAccessKeySecret = "OSS_ACCESS_KEY_SECRET"
256-
EnvAwsAccessKeyID = "AWS_ACCESS_KEY_ID"
257-
EnvAwsSecretAccessKey = "AWS_SECRET_ACCESS_KEY"
258-
EnvAwsDefaultRegion = "AWS_DEFAULT_REGION"
259-
EnvAwsRegion = "AWS_REGION"
260-
EnvAlicloudAccessKey = "ALICLOUD_ACCESS_KEY"
261-
EnvAlicloudSecretKey = "ALICLOUD_SECRET_KEY"
262-
EnvAlicloudRegion = "ALICLOUD_REGION"
254+
EnvOssAccessKeyID = "OSS_ACCESS_KEY_ID"
255+
EnvOssAccessKeySecret = "OSS_ACCESS_KEY_SECRET"
256+
EnvAwsAccessKeyID = "AWS_ACCESS_KEY_ID"
257+
EnvAwsSecretAccessKey = "AWS_SECRET_ACCESS_KEY"
258+
EnvAwsDefaultRegion = "AWS_DEFAULT_REGION"
259+
EnvAwsRegion = "AWS_REGION"
260+
EnvAlicloudAccessKey = "ALICLOUD_ACCESS_KEY"
261+
EnvAlicloudSecretKey = "ALICLOUD_SECRET_KEY"
262+
EnvAlicloudRegion = "ALICLOUD_REGION"
263+
EnvViettelCloudCmpURL = "VIETTEL_CLOUD_CMP_URL"
264+
EnvViettelCloudUserToken = "VIETTEL_CLOUD_USER_TOKEN"
265+
EnvViettelCloudProjectID = "VIETTEL_CLOUD_PROJECT_ID"
263266

264267
FieldImportedResources = "importedResources"
265268
)

pkg/engine/operation/graph/resource_node.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,12 @@ func (rn *ResourceNode) computeActionType(
205205
switch operation.OperationType {
206206
case models.Destroy, models.DestroyPreview:
207207
rn.Action = models.Delete
208+
if planedResource != nil {
209+
importID, ok := planedResource.Extensions[tfops.ImportIDKey].(string)
210+
if ok && importID != "" {
211+
rn.Action = models.UnChanged
212+
}
213+
}
208214
case models.Apply, models.ApplyPreview:
209215
if planedResource == nil {
210216
rn.Action = models.Delete
@@ -252,7 +258,9 @@ func (rn *ResourceNode) initThreeWayDiffData(operation *models.Operation) (*apiv
252258
// When a resource is deleted in Intent but exists in PriorState,
253259
// this node should be regarded as a deleted node, and rn.resource stores the PriorState
254260
if rn.Action == models.Delete {
255-
planedResource = nil
261+
if _, ok := planedResource.Extensions[tfops.ImportIDKey].(string); !ok {
262+
planedResource = nil
263+
}
256264
}
257265

258266
// 2. get prior resource from the latest release

pkg/engine/runtime/terraform/terraform_runtime.go

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -190,11 +190,6 @@ func (t *Runtime) Read(ctx context.Context, request *runtime.ReadRequest) *runti
190190
DependsOn: priorResource.DependsOn,
191191
Extensions: priorResource.Extensions,
192192
}
193-
194-
// For the resource to be deleted, the 'import_id' attribute in 'Extensions' field should be removed.
195-
if _, ok := planResource.Extensions[tfops.ImportIDKey].(string); ok {
196-
delete(planResource.Extensions, tfops.ImportIDKey)
197-
}
198193
}
199194

200195
var tfState *tfops.StateRepresentation
@@ -216,17 +211,34 @@ func (t *Runtime) Read(ctx context.Context, request *runtime.ReadRequest) *runti
216211
}
217212
}
218213

219-
if priorResource == nil {
220-
// For resources declared with 'import_id' in the 'Extensions' field,
221-
// use 'terraform import' to import the latest state.
222-
importID, ok := planResource.Extensions[tfops.ImportIDKey].(string)
223-
if ok && importID != "" {
224-
if err = ws.ImportResource(ctx, importID); err != nil {
214+
importID, ok := planResource.Extensions[tfops.ImportIDKey].(string)
215+
if ok && importID != "" {
216+
if err = ws.ImportResource(ctx, importID); err != nil {
217+
return &runtime.ReadResponse{Resource: nil, Status: v1.NewErrorStatus(err)}
218+
} else {
219+
// read resource from tfstate
220+
tfState, err = ws.ShowState(ctx)
221+
if err != nil {
225222
return &runtime.ReadResponse{Resource: nil, Status: v1.NewErrorStatus(err)}
226223
}
227-
} else {
228-
return &runtime.ReadResponse{Resource: nil, Status: nil}
224+
// get terraform provider version
225+
providerAddr, err := ws.GetProvider()
226+
if err != nil {
227+
return &runtime.ReadResponse{Resource: nil, Status: v1.NewErrorStatus(err)}
228+
}
229+
r := tfops.ConvertTFState(tfState, providerAddr)
230+
return &runtime.ReadResponse{
231+
Resource: &apiv1.Resource{
232+
ID: planResource.ID,
233+
Type: planResource.Type,
234+
Attributes: r.Attributes,
235+
DependsOn: planResource.DependsOn,
236+
Extensions: planResource.Extensions,
237+
}, Status: nil,
238+
}
229239
}
240+
} else if priorResource == nil {
241+
return &runtime.ReadResponse{Resource: nil, Status: nil}
230242
} else if err = ws.WriteTFState(priorResource); err != nil {
231243
// priorResource overwrite tfState in workspace
232244
return &runtime.ReadResponse{Resource: nil, Status: v1.NewErrorStatus(err)}

pkg/engine/runtime/terraform/tfops/workspace.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,30 @@ func (w *WorkSpace) getEnvProviderInfo() ([]string, error) {
576576
envs = append(envs, fmt.Sprintf("%s=%s", v1.EnvAlicloudRegion, alicloudRegion))
577577
}
578578

579+
viettelCloudCmpURL, err := workspace.GetStringFromGenericConfig(context, v1.EnvViettelCloudCmpURL)
580+
if err != nil {
581+
return nil, err
582+
}
583+
if viettelCloudCmpURL != "" {
584+
envs = append(envs, fmt.Sprintf("%s=%s", v1.EnvViettelCloudCmpURL, viettelCloudCmpURL))
585+
}
586+
587+
viettelCloudUserToken, err := workspace.GetStringFromGenericConfig(context, v1.EnvViettelCloudUserToken)
588+
if err != nil {
589+
return nil, err
590+
}
591+
if viettelCloudUserToken != "" {
592+
envs = append(envs, fmt.Sprintf("%s=%s", v1.EnvViettelCloudUserToken, viettelCloudUserToken))
593+
}
594+
595+
viettelCloudProjectID, err := workspace.GetStringFromGenericConfig(context, v1.EnvViettelCloudProjectID)
596+
if err != nil {
597+
return nil, err
598+
}
599+
if viettelCloudProjectID != "" {
600+
envs = append(envs, fmt.Sprintf("%s=%s", v1.EnvViettelCloudProjectID, viettelCloudProjectID))
601+
}
602+
579603
return envs, nil
580604
}
581605

0 commit comments

Comments
 (0)