|
3 | 3 | package provider |
4 | 4 |
|
5 | 5 | import ( |
| 6 | + "context" |
6 | 7 | "fmt" |
7 | 8 | "testing" |
| 9 | + "time" |
8 | 10 |
|
9 | 11 | "github.com/hashicorp/terraform/helper/resource" |
10 | 12 | "github.com/hashicorp/terraform/terraform" |
| 13 | + "github.com/oracle/oci-go-sdk/common" |
11 | 14 |
|
| 15 | + oci_kms "github.com/oracle/oci-go-sdk/keymanagement" |
12 | 16 | "github.com/terraform-providers/terraform-provider-oci/httpreplay" |
13 | 17 | ) |
14 | 18 |
|
|
33 | 37 | "values": Representation{repType: Required, create: []string{`${oci_kms_key.test_key.id}`}}, |
34 | 38 | } |
35 | 39 |
|
| 40 | + deletionTime = time.Now().UTC().AddDate(0, 0, 8).Truncate(time.Millisecond) |
| 41 | + |
36 | 42 | keyRepresentation = map[string]interface{}{ |
37 | 43 | "compartment_id": Representation{repType: Required, create: `${var.tenancy_ocid}`}, |
38 | 44 | "display_name": Representation{repType: Required, create: `Key C`, update: `displayName2`}, |
|
41 | 47 | "desired_state": Representation{repType: Optional, create: `ENABLED`, update: `DISABLED`}, |
42 | 48 | "defined_tags": Representation{repType: Optional, create: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "value")}`, update: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "updatedValue")}`}, |
43 | 49 | "freeform_tags": Representation{repType: Optional, create: map[string]string{"bar-key": "value"}, update: map[string]string{"Department": "Accounting"}}, |
| 50 | + "time_of_deletion": Representation{repType: Optional, create: deletionTime.Format(time.RFC3339Nano)}, |
44 | 51 | } |
45 | 52 | keyKeyShapeRepresentation = map[string]interface{}{ |
46 | 53 | "algorithm": Representation{repType: Required, create: `AES`}, |
@@ -91,7 +98,8 @@ func TestKmsKeyResource_basic(t *testing.T) { |
91 | 98 | var resId, resId2 string |
92 | 99 |
|
93 | 100 | resource.Test(t, resource.TestCase{ |
94 | | - PreCheck: func() { testAccPreCheck(t) }, |
| 101 | + PreCheck: func() { testAccPreCheck(t) }, |
| 102 | + CheckDestroy: testAccCheckKMSKeyDestroy, |
95 | 103 | Providers: map[string]terraform.ResourceProvider{ |
96 | 104 | "oci": provider, |
97 | 105 | }, |
@@ -241,13 +249,63 @@ func TestKmsKeyResource_basic(t *testing.T) { |
241 | 249 | ImportStateIdFunc: keyImportId, |
242 | 250 | ImportStateVerifyIgnore: []string{ |
243 | 251 | "desired_state", |
| 252 | + "time_of_deletion", |
244 | 253 | }, |
245 | 254 | ResourceName: resourceName, |
246 | 255 | }, |
247 | 256 | }, |
248 | 257 | }) |
249 | 258 | } |
250 | 259 |
|
| 260 | +func testAccCheckKMSKeyDestroy(s *terraform.State) error { |
| 261 | + noResourceFound := true |
| 262 | + for _, rs := range s.RootModule().Resources { |
| 263 | + if rs.Type == "oci_kms_key" { |
| 264 | + client, err := testAccProvider.Meta().(*OracleClients).KmsManagementClient(rs.Primary.Attributes["management_endpoint"]) |
| 265 | + if err != nil { |
| 266 | + return err |
| 267 | + } |
| 268 | + |
| 269 | + noResourceFound = false |
| 270 | + request := oci_kms.GetKeyRequest{} |
| 271 | + |
| 272 | + tmp := rs.Primary.ID |
| 273 | + request.KeyId = &tmp |
| 274 | + |
| 275 | + request.RequestMetadata.RetryPolicy = getRetryPolicy(true, "kms") |
| 276 | + |
| 277 | + response, err := client.GetKey(context.Background(), request) |
| 278 | + |
| 279 | + if err == nil { |
| 280 | + deletedLifecycleStates := map[string]bool{ |
| 281 | + string(oci_kms.KeyLifecycleStateSchedulingDeletion): true, |
| 282 | + string(oci_kms.KeyLifecycleStatePendingDeletion): true, |
| 283 | + } |
| 284 | + if _, ok := deletedLifecycleStates[string(response.LifecycleState)]; !ok { |
| 285 | + //resource lifecycle state is not in expected deleted lifecycle states. |
| 286 | + return fmt.Errorf("resource lifecycle state: %s is not in expected deleted lifecycle states", response.LifecycleState) |
| 287 | + } |
| 288 | + |
| 289 | + if !response.TimeOfDeletion.Equal(deletionTime) && !httpreplay.ModeRecordReplay() { |
| 290 | + return fmt.Errorf("resource time_of_deletion: %s is not set to %s", response.TimeOfDeletion.Format(time.RFC3339Nano), deletionTime.Format(time.RFC3339Nano)) |
| 291 | + } |
| 292 | + //resource lifecycle state is in expected deleted lifecycle states. continue with next one. |
| 293 | + continue |
| 294 | + } |
| 295 | + |
| 296 | + //Verify that exception is for '404 not found'. |
| 297 | + if failure, isServiceError := common.IsServiceError(err); !isServiceError || failure.GetHTTPStatusCode() != 404 { |
| 298 | + return err |
| 299 | + } |
| 300 | + } |
| 301 | + } |
| 302 | + if noResourceFound { |
| 303 | + return fmt.Errorf("at least one resource was expected from the state file, but could not be found") |
| 304 | + } |
| 305 | + |
| 306 | + return nil |
| 307 | +} |
| 308 | + |
251 | 309 | func keyImportId(state *terraform.State) (string, error) { |
252 | 310 | for _, rs := range state.RootModule().Resources { |
253 | 311 | if rs.Type == "oci_kms_key" { |
|
0 commit comments