본문 바로가기
개발/Terraform on NaverCloud

MSSQL Test 하기

by 컴쏘 2023. 9. 11.
728x90

전에 작성했던, 코드들을 test 해보았다. 

 

오류

 error=
  | exit status 1
  |
  | Error: Invalid resource type
  |
  |   on terraform_plugin_test.tf line 3, in resource "ncloud_vpc" "test_vpc":
  |    3: \t\tresource "ncloud_vpc" "test_vpc" {
  |
  | The provider hashicorp/ncloud does not support resource type "ncloud_vpc".
  |
  | Error: Invalid resource type
  |
  |   on terraform_plugin_test.tf line 7, in resource "ncloud_subnet" "test_subnet":
  |    7: \t\tresource "ncloud_subnet" "test_subnet" {
  |
  | The provider hashicorp/ncloud does not support resource type "ncloud_subnet".

 

provider 부분에서 문제가 발생하였다.

 

잘 모르겠어서, 의선 멘토님께 여쭈어보았다. 

질문
답변

 

 

수정한 부분

cloud_mssql_test.go 의 func TestAccResourceNcloudMssql_vpc_basic(t *testing.T) 부분을 수정해주었다. 

 

수정 전 

Providers: GetTestAccProviders(true),

 

수정 후

ProtoV5ProviderFactories: ProtoV5ProviderFactories,

 

 

수정한 코드로 다시 test를 해보았다. 

2023/08/30 20:10:14 [INFO] GetCloudMssqlInstanceList success response=RequestID: 07921c83-f693-4624-a5b6-a9ed6e169f01, ReturnCode: 0, ReturnMessage: success
2023-08-30T20:10:14.066+0900 [ERROR] sdk.helper_resource: Unexpected error: test_working_directory=C:\Users\jpark\AppData\Local\Temp\plugintest4159863184 test_name=TestAccResourceNcloudMssql_vpc_basic test_terraform_path=C:\terraform_1.5.3\terraform.exe test_step_number=1 error="Check failed: Check 8/8 error: ncloud_mssql.mssql: Attribute 'is_automatic_backup' not found"        
    cloud_mssql_test.go:23: Step 1/1 error: Check failed: Check 8/8 error: ncloud_mssql.mssql: Attribute 'is_automatic_backup' not found
2023-08-30T20:10:14.381+0900 [WARN]  sdk.helper_schema: Previously configured provider being re-configured. This can cause issues in concurrent testing if the configurations are not equal.: tf_req_id=9a9b0fee-8600-7ca7-928f-c844e3b11e60 tf_provider_addr=registry.terraform.io/hashicorp/ncloud tf_rpc=ConfigureProvider tf_mux_provider="*schema.GRPCProviderServer"
2023/08/30 20:10:14 [INFO] DeleteCloudMssqlInstance params={"cloudMssqlInstanceNo":"19296995"}
2023/08/30 20:10:14 [ERROR] DeleteCloudMssqlInstance error params="19296995", err=json: cannot unmarshal array into Go struct field CloudMssqlInstance.cloudMssqlInstanceList.accessControlGroupNoList of type vmssql.AccessControlGroupNoList
2023-08-30T20:10:14.609+0900 [ERROR] sdk.proto: Response contains error diagnostic: tf_rpc=ApplyResourceChange tf_req_id=5c6fa69c-880b-f850-0f21-f5a05d0bd46e diagnostic_detail="" diagnostic_severity=ERROR diagnostic_summary="json: cannot unmarshal array into Go struct field CloudMssqlInstance.cloudMssqlInstanceList.accessControlGroupNoList of type vmssql.AccessControlGroupNoList" tf_provider_addr=registry.terraform.io/hashicorp/ncloud tf_resource_type=ncloud_mssql tf_proto_version=5.3
2023-08-30T20:10:14.630+0900 [WARN]  sdk.helper_resource: Error running Terraform CLI command: test_name=TestAccResourceNcloudMssql_vpc_basic
  error=
  | exit status 1
  |
  | Error: json: cannot unmarshal array into Go struct field CloudMssqlInstance.cloudMssqlInstanceList.accessControlGroupNoList of type vmssql.AccessControlGroupNoList
  |
   test_terraform_path=C:\terraform_1.5.3\terraform.exe test_step_number=1 test_working_directory=C:\Users\jpark\AppData\Local\Temp\plugintest4159863184
2023-08-30T20:10:14.630+0900 [ERROR] sdk.helper_resource: Error running post-test destroy, there may be dangling resources: test_working_directory=C:\Users\jpark\AppData\Local\Temp\plugintest4159863184 test_name=TestAccResourceNcloudMssql_vpc_basic test_terraform_path=C:\terraform_1.5.3\terraform.exe
  error=
  | exit status 1
  |
  | Error: json: cannot unmarshal array into Go struct field CloudMssqlInstance.cloudMssqlInstanceList.accessControlGroupNoList of type vmssql.AccessControlGroupNoList
  |
   test_step_number=1
    testing_new.go:82: Error running post-test destroy, there may be dangling resources: exit status 1

        Error: json: cannot unmarshal array into Go struct field CloudMssqlInstance.cloudMssqlInstanceList.accessControlGroupNoList of type vmssql.AccessControlGroupNoList

--- FAIL: TestAccResourceNcloudMssql_vpc_basic (3035.64s)
FAIL
FAIL    command-line-arguments  3036.433s
FAIL

 

오류 내용 1

Attribute 'is_automatic_backup' not found : ncloud_mssql.mssql 리소스에서 is_automatic_backup 속성을 찾을 수 없음

 

추가해주기 - cloud_mssql_test.go

수정 코드

 

오류 내용 2

json: cannot unmarshal array into Go struct field CloudMssqlInstance.cloudMssqlInstanceList.accessControlGroupNoList of type vmssql.AccessControlGroupNoList : accessControlGroupNoList 필드를 Go 구조체 형식으로 올바르게 정의했는지 확인

 

이건 내가 해결할 수 있는 부분이 아닌 것 같아 멘토님께 여쭈어보았다. 

질문
답변

 

수정된 sdk 적용하기

go get github.com/NaverCloudPlatform/ncloud-sdk-go-v2@fix-mssql-instance-response

 

 

같이 있었던 다른 내용들 

  • Previously configured provider being re-configured : Terraform 공급자가 이전에 구성된 것과 다른 구성으로 재구성되고 있다는 경고 (동일한 공급자에 대한 중복 구성을 피하기 위해 테스트 설정을 확인)
  • Error running post-test destroy, there may be dangling resources : 테스트 실패 후 미해결 자원이 남아있을 수 있음

 

cloud_mssql_test.go에서 2부분을 수정하였다. 

 

  • func testAccCheckCloudMssqlExists

수정 전 

mssql = mssqlInstance

 

수정 후

*mssql = *mssqlInstance

 

  • func testAccCloudMssqlVpcConfig

추가한 부분 ( resource "ncloud_mssql" "mssql" )

is_automatic_backup = true

 

다시 테스트 하기 

 

결과

2023-08-31T02:05:23.355+0900 [ERROR] sdk.proto: Response contains error diagnostic: tf_proto_version=5.3 tf_resource_type=ncloud_subnet diagnostic_summary="DeleteSubnet Subnet Instance params={0xc000194658 0xc000b788d8}"
  diagnostic_detail=
  | Status: 400 Bad Request, Body: {
  |   "responseError": {
  |     "returnCode": "1001019",
  |     "returnMessage": "There is a product in operation on Subnet. 관련된 Server, Network Interface, Cloud functions, Load balancer, Auto Scaling, NAT Gateway (New) 을 모두 삭제해주세요."
  |   }
  | }
   diagnostic_severity=ERROR tf_rpc=ApplyResourceChange tf_req_id=f2e92852-3b8a-e1fc-7235-58f3ee7620e2 tf_provider_addr=registry.terraform.io/hashicorp/ncloud

 

내용 요약

  • 아직 db 서버가 다 삭제되지 않았는데, subnet을 삭제하려고 하니 발생한 문제 같다.
  • 시간 차이를 두도록 하자.

delete와 관련한 함수를 수정하였다. 

resourceNcloudMssqlDelete에 waitForCloudMssqlActive, waitForCloudMssqlDeletion 2개의 함수를 추가하였다. 

 

delete 함수를 수정하면서, read, create에 context가 적용되게 같이 수정하였다. 

 

그리고 다시 테스트를 해보았다. 

 

결과 

2023-08-31T13:03:26.048+0900 [WARN]  sdk.helper_resource: Error running Terraform CLI command: test_name=TestAccResourceNcloudMssql_vpc_basic test_terraform_path=C:\terraform_1.5.3\terraform.exe
  error=
  | exit status 1
  |
  | Error: error waiting for Cloud Mssql instance (19310541) to become activating: unexpected state 'CREAT', wanted target 'OK'. last error: %!s(<nil>)
  |
  |   with ncloud_mssql.mssql,
  |   on terraform_plugin_test.tf line 14, in resource "ncloud_mssql" "mssql":
  |   14: \t\tresource "ncloud_mssql" "mssql" {
  |
   test_step_number=1 test_working_directory=C:\Users\jpark\AppData\Local\Temp\plugintest1507129588

 

내용 요약 

  • 예상하지 못한 상태가 나타남
    • "error waiting for Cloud Mssql instance (19310541) to become activating: unexpected state 'CREAT', wanted target 'OK'"로 나타나며, 클라우드 MSSQL 인스턴스를 생성하는 동안 예상하지 않은 상태 'CREAT'가 발생하였고, 'OK' 상태를 기대하였으나 그렇게 되지 않았음

waitForCloudMssqlActive에 status에 따른 결과를 return하는 코드를 추가하였다. 

status := ms.CloudMssqlInstanceStatus.Code
op := ms.CloudMssqlInstanceOperation.Code

if *status == "INIT" && *op == "CREAT" {
	return ms, "creating", nil
}

if *status == "CREAT" && *op == "SETUP" {
	return ms, "settingUp", nil
}

if *status == "CREAT" && *op == "NULL" {
	return ms, "running", nil
}

 

다시 테스트를 해보았다. 

 

결과

2023-08-31T14:07:18.051+0900 [WARN]  sdk.helper_resource: Error running Terraform CLI command: test_name=TestAccResourceNcloudMssql_vpc_basic test_terraform_path=C:\terraform_1.5.3\terraform.exe test_working_directory=C:\Users\jpark\AppData\Local\Temp\plugintest4044535831 test_step_number=1       
  error=
  | exit status 1
  |
  | Error: error waiting for Cloud Mssql instance (19310756) to become terminating: Status: 400 Bad Request, Body: {
  |   "responseError": {
  |     "returnCode": "5001269",
  |     "returnMessage": "It's a cluster deleted."
  |   }
  | }
  |

 

내용 요약 

  • Terraform이 Ncloud MSSQL 서비스 인스턴스를 삭제하려고 시도했을 때 이미 클러스터가 삭제되었거나 삭제 중임을 나타내고 있다.
    • 따라서 Terraform이 이미 삭제된 리소스를 다시 삭제하려고 시도해서 발생

 

delete 부분에서 문제가 생긴 것 같아 cloud_mssql.go에서 delete 관련 코드를 수정하였다.

그 전에, 먼저 멘토님께 조언을 구했다. 

 

질문
질문
답변

 

 

멘토님의 의견을 바탕으로 delete 코드를 수정하였다. 

GetCommonErrorBody 함수를 참고해서 err를 파싱해서 returnCode를 받아오게 만들었다.

 

참고 링크 : https://github.com/NaverCloudPlatform/terraform-provider-ncloud/blob/main/internal/common/convert_types.go

 

waitForCloudMssqlDeletion 함수에 다음의 내용을 추가했다.

commonErr, parseErr := GetCommonErrorBody(err)
				if parseErr == nil && commonErr.ReturnCode == "5001269" {
					return resp, "NULL", nil
				}

 

다시 테스트 해보기 .... 

 

결과

2023-08-31T18:09:39.263+0900 [ERROR] sdk.proto: Response contains error diagnostic:
  diagnostic_detail=
  | Status: 400 Bad Request, Body: {
  |   "responseError": {
  |     "returnCode": "1001019",
  |     "returnMessage": "There is a product in operation on Subnet. 관련된 Server, Network Interface, Cloud functions, Load balancer, Auto Scaling, NAT Gateway (New) 을 모두 삭제해주세요."
  |   }
  | }
   diagnostic_severity=ERROR diagnostic_summary="DeleteSubnet Subnet Instance params={0xc0008aebd8 0xc0002602f0}" tf_rpc=ApplyResourceChange tf_resource_type=ncloud_subnet tf_provider_addr=registry.terraform.io/hashicorp/ncloud tf_proto_version=5.3 tf_req_id=e73ec23b-7016-37ca-ec3d-5f6a7928ba4d

 

내용 요약

  • "1001019"라는 반환 코드와 함께 "Subnet에서 작동 중인 제품이 있습니다. 관련된 Server, Network Interface, Cloud functions, Load balancer, Auto Scaling, NAT Gateway (New)을 모두 삭제해주세요.”
    • 아직 완전히 삭제되지 않은 리소스가 있는데, 연관된 subnet을 삭제하려다가 발생한 문제

 

멘토님 추가 의견

멘토님 의견

 

위의 오류를 해결하기 위해 정말 많은 시도를 했었다.....!! 

timeout 시간 변경, waitForSubnetDelation 추가, 정찬님 코드 참고해서 코드 수정, loadbalancer 뜯어보기(여기서 응답을 가져오는 과정에서부터 잘못되었음을 느꼈다.), resourceNcloudMssqlCreate, resourceNcloudMssqlRead, resourceNcloudMssqlDelete 수정하기 .... 등등 

 

 

해결 방법

 

좋은 해결 방법은 아니지만, 임시 방편으로 waitForCloudMssqlDeletion에서 GetCommonErrorBody를 지워주고, resourceNcloudMssqlDelete 부분에 추가를 해주었다. 

if err := waitForCloudMssqlDeletion(ctx, d, config); err != nil {
	commonErr, parseErr := GetCommonErrorBody(err)
	if parseErr == nil && commonErr.ReturnCode == "5001269" {
		time.Sleep(3 * time.Minute)
		return nil
	}

 

 

나중에 멘토님들의 피드백을 받으면서 더 좋은 코드로 만들어보자!! 

 

728x90