Skip to content

Commit

Permalink
Merge pull request #9 from kishaningithub/handle-resources-which-does…
Browse files Browse the repository at this point in the history
…-not-support-import

Handle resources which does not support import operation
  • Loading branch information
kishaningithub committed Jan 3, 2024
2 parents a9b2b89 + 2660136 commit 7121990
Show file tree
Hide file tree
Showing 12 changed files with 128 additions and 14 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
- uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v4
uses: actions/setup-go@v5
with:
go-version-file: "go.mod"
cache: true
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,19 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Login to Docker Hub
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Set up Go
uses: actions/setup-go@v4
uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
cache: true
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.idea/
.vscode/
.DS_Store
*.tf
12 changes: 8 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@

## Setting up the code in local

- Fork and clone this repo
- Fork and clone this repo.
- Ensure you have the latest version of [golang](https://go.dev/) and [make](https://www.gnu.org/software/make/)
installed.
- To format the code, run command `make fmt`
- To build the project, run command `make build`
- To run the test suite, run command `make test`
- To format the code, run command `make fmt`.
- To build the project, run command `make build`.
- To run the test suite, run command `make test`.

## Upgrading dependencies
- For code, run command `make update-deps`
- For actions, go inside the yamls present in the [workflows](.github/workflows/) and bump the versions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/kishaningithub/tf-import-gen
go 1.21

require (
github.com/hashicorp/terraform-json v0.18.0
github.com/hashicorp/terraform-json v0.20.0
github.com/spf13/cobra v1.8.0
github.com/stretchr/testify v1.8.4
)
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/terraform-json v0.18.0 h1:pCjgJEqqDESv4y0Tzdqfxr/edOIGkjs8keY42xfNBwU=
github.com/hashicorp/terraform-json v0.18.0/go.mod h1:qdeBs11ovMzo5puhrRibdD6d2Dq6TyE/28JiU4tIQxk=
github.com/hashicorp/terraform-json v0.20.0 h1:cJcvn4gIOTi0SD7pIy+xiofV1zFA3hza+6K+fo52IX8=
github.com/hashicorp/terraform-json v0.20.0/go.mod h1:qdeBs11ovMzo5puhrRibdD6d2Dq6TyE/28JiU4tIQxk=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
Expand Down
17 changes: 14 additions & 3 deletions pkg/convertor.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,21 @@ import (
)

func computeTerraformImportForResource(resource parser.TerraformResource) TerraformImport {
return TerraformImport{
ResourceAddress: resource.Address,
ResourceID: computeResourceID(resource),
switch resource.Type {
case "aws_alb_target_group_attachment", "aws_lb_target_group_attachment":
return TerraformImport{
SupportsImport: false,
ResourceAddress: resource.Address,
ResourceID: computeResourceID(resource),
}
default:
return TerraformImport{
SupportsImport: true,
ResourceAddress: resource.Address,
ResourceID: computeResourceID(resource),
}
}

}

func computeResourceID(resource parser.TerraformResource) string {
Expand Down
12 changes: 12 additions & 0 deletions pkg/convertor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ func Test_ComputeTerraformImportForResource(t *testing.T) {
expected: TerraformImport{
ResourceAddress: "aws_iam_role_policy_attachment.test",
ResourceID: "test-role/test-policy-arn",
SupportsImport: true,
},
},
{
Expand All @@ -40,6 +41,7 @@ func Test_ComputeTerraformImportForResource(t *testing.T) {
expected: TerraformImport{
ResourceAddress: "aws_lambda_permission.test",
ResourceID: "test-function-name/test-statement-id",
SupportsImport: true,
},
},
{
Expand All @@ -59,6 +61,7 @@ func Test_ComputeTerraformImportForResource(t *testing.T) {
expected: TerraformImport{
ResourceAddress: "aws_security_group_rule.test",
ResourceID: "security-group-id_type_protocol_1234_5678_source-security-group-id",
SupportsImport: true,
},
},
{
Expand All @@ -78,6 +81,7 @@ func Test_ComputeTerraformImportForResource(t *testing.T) {
expected: TerraformImport{
ResourceAddress: "aws_security_group_rule.test",
ResourceID: "security-group-id_type_protocol_1234_5678_cidr-block-1_cidr-block-2",
SupportsImport: true,
},
},
{
Expand All @@ -93,6 +97,7 @@ func Test_ComputeTerraformImportForResource(t *testing.T) {
expected: TerraformImport{
ResourceAddress: "aws_api_gateway_resource.test",
ResourceID: "rest_api_id/id",
SupportsImport: true,
},
},
{
Expand All @@ -108,6 +113,7 @@ func Test_ComputeTerraformImportForResource(t *testing.T) {
expected: TerraformImport{
ResourceAddress: "aws_api_gateway_deployment.test",
ResourceID: "rest_api_id/id",
SupportsImport: true,
},
},
{
Expand All @@ -123,6 +129,7 @@ func Test_ComputeTerraformImportForResource(t *testing.T) {
expected: TerraformImport{
ResourceAddress: "aws_api_gateway_stage.test",
ResourceID: "rest_api_id/stage_name",
SupportsImport: true,
},
},
{
Expand All @@ -139,6 +146,7 @@ func Test_ComputeTerraformImportForResource(t *testing.T) {
expected: TerraformImport{
ResourceAddress: "aws_api_gateway_method_settings.test",
ResourceID: "rest_api_id/stage_name/method_path",
SupportsImport: true,
},
},
{
Expand All @@ -154,6 +162,7 @@ func Test_ComputeTerraformImportForResource(t *testing.T) {
expected: TerraformImport{
ResourceAddress: "aws_cloudwatch_event_target.test",
ResourceID: "rule/target_id",
SupportsImport: true,
},
},
{
Expand All @@ -170,6 +179,7 @@ func Test_ComputeTerraformImportForResource(t *testing.T) {
expected: TerraformImport{
ResourceAddress: "aws_api_gateway_method.test",
ResourceID: "rest_api_id/resource_id/http_method",
SupportsImport: true,
},
},
{
Expand All @@ -186,6 +196,7 @@ func Test_ComputeTerraformImportForResource(t *testing.T) {
expected: TerraformImport{
ResourceAddress: "aws_api_gateway_integration.test",
ResourceID: "rest_api_id/resource_id/http_method",
SupportsImport: true,
},
},
{
Expand All @@ -200,6 +211,7 @@ func Test_ComputeTerraformImportForResource(t *testing.T) {
expected: TerraformImport{
ResourceAddress: "example.address",
ResourceID: "test_id",
SupportsImport: true,
},
},
}
Expand Down
5 changes: 5 additions & 0 deletions pkg/import.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,18 @@ var _ fmt.Stringer = TerraformImport{}
type TerraformImport struct {
ResourceAddress string
ResourceID string
SupportsImport bool
}

func (terraformImport TerraformImport) String() string {
importTemplate := `import {
to = %s
id = "%s"
}`
if !terraformImport.SupportsImport {
importTemplate = `# resource "%s" with identifier "%s" does not support import operation. Kindly refer resource documentation for more info.`
}

return fmt.Sprintln(fmt.Sprintf(importTemplate, terraformImport.ResourceAddress, terraformImport.ResourceID))
}

Expand Down
15 changes: 15 additions & 0 deletions pkg/import_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ func TestImport_ShouldSerializeAsTerraformImportStatements(t *testing.T) {
tfImport := tfimportgen.TerraformImport{
ResourceAddress: "aws_glue_catalog_database.test_db",
ResourceID: "id_test_db",
SupportsImport: true,
}

expectedResult := `import {
Expand All @@ -30,10 +31,12 @@ func TestImports_ShouldSerializeAsMultipleTerraformImportStatements(t *testing.T
{
ResourceAddress: "aws_glue_catalog_database.test_db",
ResourceID: "id_test_db",
SupportsImport: true,
},
{
ResourceAddress: "aws_iam_instance_profile.test_instance_profile",
ResourceID: "id_test_instance_profile",
SupportsImport: true,
},
}

Expand All @@ -54,3 +57,15 @@ import {
require.Equal(t, expectedResult, fmt.Sprintf("%s", imports))
require.Equal(t, expectedResult, fmt.Sprintf("%v", imports))
}

func TestImport_ShouldGenerateHelpfulMessageWhenResourceDoesNotSupportImport(t *testing.T) {
tfImport := tfimportgen.TerraformImport{
SupportsImport: false,
ResourceAddress: "aws_alb_target_group_attachment.test_alb_target_group_attachment",
ResourceID: "id_test_alb_target_group_attachment",
}

expectedResult := `# resource "aws_alb_target_group_attachment.test_alb_target_group_attachment" with identifier "id_test_alb_target_group_attachment" does not support import operation. Kindly refer resource documentation for more info.`

require.Equal(t, fmt.Sprintln(expectedResult), fmt.Sprint(tfImport))
}
32 changes: 32 additions & 0 deletions pkg/testdata/resources_which_does_not_support_import.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"format_version": "0.1",
"terraform_version": "0.12.31",
"values": {
"root_module": {
"resources": [
{
"address": "aws_alb_target_group_attachment.test_alb_target_group_attachment",
"mode": "managed",
"type": "aws_alb_target_group_attachment",
"name": "test_alb_target_group_attachment",
"provider_name": "aws",
"schema_version": 0,
"values": {
"id": "id_test_alb_target_group_attachment"
}
},
{
"address": "aws_lb_target_group_attachment.test_lb_target_group_attachment",
"mode": "managed",
"type": "aws_lb_target_group_attachment",
"name": "test_lb_target_group_attachment",
"provider_name": "aws",
"schema_version": 0,
"values": {
"id": "id_test_lb_target_group_attachment"
}
}
]
}
}
}
34 changes: 34 additions & 0 deletions pkg/tfimportgen_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@ func Test_GenerateImports_ShouldGenerateImportsForAllResourcesWhenNoFiltersAreGi
{
ResourceAddress: "aws_glue_catalog_database.test_db",
ResourceID: "id_test_db",
SupportsImport: true,
},
{
ResourceAddress: "aws_iam_instance_profile.test_instance_profile",
ResourceID: "id_test_instance_profile",
SupportsImport: true,
},
},
},
Expand All @@ -35,10 +37,12 @@ func Test_GenerateImports_ShouldGenerateImportsForAllResourcesWhenNoFiltersAreGi
{
ResourceAddress: "module.test_mwaa.aws_iam_policy.test_mwaa_permissions",
ResourceID: "id_test_mwaa_permissions",
SupportsImport: true,
},
{
ResourceAddress: "module.test_mwaa.aws_mwaa_environment.test_airflow_env",
ResourceID: "id_test_airflow_env",
SupportsImport: true,
},
},
},
Expand All @@ -49,10 +53,12 @@ func Test_GenerateImports_ShouldGenerateImportsForAllResourcesWhenNoFiltersAreGi
{
ResourceAddress: "module.test_mwaa.nested1.nested2.aws_iam_policy.test_mwaa_permissions",
ResourceID: "id_test_mwaa_permissions",
SupportsImport: true,
},
{
ResourceAddress: "module.test_mwaa.nested1.nested2.aws_mwaa_environment.test_airflow_env",
ResourceID: "id_test_airflow_env",
SupportsImport: true,
},
},
},
Expand Down Expand Up @@ -87,10 +93,12 @@ func Test_GenerateImports_ShouldGenerateImportsForResourcesForGivenAddress(t *te
{
ResourceAddress: "module.test_mwaa.aws_iam_policy.test_mwaa_permissions",
ResourceID: "id_test_mwaa_permissions",
SupportsImport: true,
},
{
ResourceAddress: "module.test_mwaa.aws_mwaa_environment.test_airflow_env",
ResourceID: "id_test_airflow_env",
SupportsImport: true,
},
},
},
Expand All @@ -101,6 +109,7 @@ func Test_GenerateImports_ShouldGenerateImportsForResourcesForGivenAddress(t *te
{
ResourceAddress: "aws_glue_catalog_database.test_db",
ResourceID: "id_test_db",
SupportsImport: true,
},
},
},
Expand All @@ -121,3 +130,28 @@ func Test_GenerateImports_ShouldGenerateImportsForResourcesForGivenAddress(t *te
})
}
}

func Test_GenerateImports_ShouldGenerateHelpfulCommentForResourceThatCannotBeImported(t *testing.T) {
stateJsonFile, err := os.Open(filepath.FromSlash("testdata/resources_which_does_not_support_import.json"))
require.NoError(t, err)
t.Cleanup(func() {
_ = stateJsonFile.Close()
})

actual, err := tfimportgen.GenerateImports(stateJsonFile, "")

require.NoError(t, err)
expectedImports := tfimportgen.TerraformImports{
tfimportgen.TerraformImport{
ResourceAddress: "aws_alb_target_group_attachment.test_alb_target_group_attachment",
ResourceID: "id_test_alb_target_group_attachment",
SupportsImport: false,
},
tfimportgen.TerraformImport{
ResourceAddress: "aws_lb_target_group_attachment.test_lb_target_group_attachment",
ResourceID: "id_test_lb_target_group_attachment",
SupportsImport: false,
},
}
require.Equal(t, expectedImports, actual)
}

0 comments on commit 7121990

Please sign in to comment.