Skip to content

Commit 1cb3a3a

Browse files
Restore from file support for key and vault
1 parent df79675 commit 1cb3a3a

File tree

11 files changed

+351
-108
lines changed

11 files changed

+351
-108
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
- Support resource discovery for `oda` resources
1414
- Support resource discovery for `datascience` resources
1515
- Support resource discovery for `oci_objectstorage_object`, `oci_objectstorage_object_lifecycle_policy`, `oci_objectstorage_preauthrequest` resources
16+
- Support restore from file for `kms` resources
1617

1718
### Fixed
1819
- Fixed plan failure in case of missing required attributes in resource discovery. Placeholder values will be added for missing required attributes and the attributes will be added to `lifecycle ignore_changes`

examples/kms/data_sources.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ data "oci_kms_vault" "test_vault" {
1313
}
1414

1515
/*
16-
//if want to create a new vault
16+
//create a new vault
1717
resource "oci_kms_vault" "test_vault" {
1818
#Required
1919
compartment_id = "${var.compartment_id}"

examples/kms/key.tf

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,32 @@ resource "oci_kms_key" "test_key" {
1313
length = "${var.key_key_shape_length}"
1414
}
1515

16-
//If using bucket to restore a key use below
16+
//If using object to restore a key use below
1717
/*restore_from_object_store {
1818
bucket = "${data.oci_objectstorage_object.key_backup_object.bucket}"
1919
destination = "${var.destination[0]}"
2020
namespace = "${data.oci_objectstorage_object.key_backup_object.namespace}"
2121
object = "${data.oci_objectstorage_object.key_backup_object.object}"
2222
}*/
2323

24-
2524
//If using Pre-authenticated-request to restore a key use below
2625
/*restore_from_object_store {
2726
destination = "${var.destination[1]}"
2827
uri = "${data.oci_objectstorage_preauthrequest.key_backup_preauthenticated_request}"
2928
}*/
3029

31-
restore_trigger = "${var.key_restore_trigger}"
30+
//If using file stored in object storage to restore a key use below
31+
/*restore_from_file {
32+
//Required
33+
restore_key_from_file_details = "${data.oci_objectstorage_object.key_backup_object.content}"
34+
content_length = "${data.oci_objectstorage_object.key_backup_object.content_length}"
35+
36+
//Optional
37+
content_md5 = "${data.oci_objectstorage_object.key_backup_object.content_md5}"
38+
}*/
39+
40+
//Flip the trigger when restore operation on key needs to be performed
41+
//restore_trigger = "${var.key_restore_trigger}"
3242
}
3343

3444
resource "oci_kms_key_version" "test_key_version" {

examples/kms/vault.tf

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,32 @@ resource "oci_kms_vault" "private-vault-kms" {
33

44
/*restore_from_object_store {
55
bucket = "${data.oci_objectstorage_object.vault_backup_object.bucket}"
6-
destination = "${var.destination.bucket}"
6+
destination = "${var.destination[0]}"
77
namespace = "${data.oci_objectstorage_object.vault_backup_object.namespace}"
88
object = "${data.oci_objectstorage_object.vault_backup_object.object}"
99
}*/
1010

1111
//If restoring using a pre-authenticated-uri use the config below
1212

1313
/*restore_from_object_store {
14-
destination = "${var.destination[1]}"
15-
uri = "${data.oci_objectstorage_preauthrequest.vault_backup_preauthenticated_request}"
14+
destination = "${var.destination[1]}"
15+
uri = "${data.oci_objectstorage_preauthrequest.vault_backup_preauthenticated_request}"
16+
}*/
17+
18+
//If restoring using object in object storage use the config below
19+
/*restore_from_file {
20+
restore_vault_from_file_details = "${data.oci_objectstorage_object.vault_backup_object.content}"
21+
content_length = "${data.oci_objectstorage_object.vault_backup_object.content_length}"
22+
23+
//Optional
24+
content_md5 = "${data.oci_objectstorage_object.vault_backup_object.content_md5}"
1625
}*/
26+
27+
compartment_id = "${var.compartment_id}"
28+
29+
display_name = "${var.vault_display_name}"
30+
vault_type = "${var.vault_type[1]}"
1731

18-
compartment_id = "${var.compartment_id}"
19-
display_name = "${var.vault_display_name}"
20-
vault_type = "${var.vault_type[1]}"
21-
restore_trigger = "${var.vault_restore_trigger}"
32+
//Flip the trigger when restore operation on vault needs to be performed
33+
//restore_trigger = "${var.vault_restore_trigger}"
2234
}

oci/kms_key_resource.go

Lines changed: 112 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,13 @@
44
package oci
55

66
import (
7+
"bytes"
78
"context"
9+
"encoding/base64"
810
"fmt"
11+
"io/ioutil"
912
"log"
13+
"strconv"
1014
"time"
1115

1216
"github.com/hashicorp/terraform/helper/schema"
@@ -104,34 +108,12 @@ func KmsKeyResource() *schema.Resource {
104108
Computed: true,
105109
Optional: true,
106110
},
107-
108-
// Computed
109-
"current_key_version": {
110-
Type: schema.TypeString,
111-
Computed: true,
112-
},
113-
"restored_from_key_id": {
114-
Type: schema.TypeString,
115-
Computed: true,
116-
},
117-
"state": {
118-
Type: schema.TypeString,
119-
Computed: true,
120-
},
121-
"time_created": {
122-
Type: schema.TypeString,
123-
Computed: true,
124-
},
125-
"vault_id": {
126-
Type: schema.TypeString,
127-
Computed: true,
128-
},
129-
130111
"restore_from_object_store": {
131-
Type: schema.TypeList,
132-
Optional: true,
133-
MaxItems: 1,
134-
MinItems: 1,
112+
Type: schema.TypeList,
113+
Optional: true,
114+
MaxItems: 1,
115+
MinItems: 1,
116+
ConflictsWith: []string{"restore_from_file"},
135117
Elem: &schema.Resource{
136118
Schema: map[string]*schema.Schema{
137119
// Required
@@ -167,10 +149,62 @@ func KmsKeyResource() *schema.Resource {
167149
},
168150
},
169151
},
152+
"restore_from_file": {
153+
Type: schema.TypeList,
154+
Optional: true,
155+
MaxItems: 1,
156+
MinItems: 1,
157+
ConflictsWith: []string{"restore_from_object_store"},
158+
Elem: &schema.Resource{
159+
Schema: map[string]*schema.Schema{
160+
// Required
161+
"restore_key_from_file_details": {
162+
Type: schema.TypeString,
163+
Required: true,
164+
},
165+
"content_length": {
166+
Type: schema.TypeString,
167+
Required: true,
168+
ValidateFunc: validateInt64TypeString,
169+
DiffSuppressFunc: int64StringDiffSuppressFunction,
170+
},
171+
172+
// Optional
173+
"content_md5": {
174+
Type: schema.TypeString,
175+
Optional: true,
176+
},
177+
178+
// Computed
179+
},
180+
},
181+
},
170182
"restore_trigger": {
171183
Type: schema.TypeBool,
172184
Optional: true,
173185
},
186+
187+
// Computed
188+
"current_key_version": {
189+
Type: schema.TypeString,
190+
Computed: true,
191+
},
192+
"restored_from_key_id": {
193+
Type: schema.TypeString,
194+
Computed: true,
195+
},
196+
"state": {
197+
Type: schema.TypeString,
198+
Computed: true,
199+
},
200+
"time_created": {
201+
Type: schema.TypeString,
202+
Computed: true,
203+
},
204+
"vault_id": {
205+
Type: schema.TypeString,
206+
Computed: true,
207+
},
174208
},
175209
}
176210
}
@@ -316,7 +350,15 @@ func (s *KmsKeyResourceCrud) UpdatedTarget() []string {
316350
}
317351

318352
func (s *KmsKeyResourceCrud) Create() error {
319-
if _, ok := s.D.GetOkExists("restore_from_object_store"); ok {
353+
if _, ok := s.D.GetOk("restore_from_file"); ok {
354+
err := s.RestoreKeyFromFile()
355+
if err != nil {
356+
return err
357+
}
358+
s.D.SetId(s.ID())
359+
return s.UpdateKeyDetails()
360+
}
361+
if _, ok := s.D.GetOk("restore_from_object_store"); ok {
320362
err := s.RestoreKeyFromObjectStore()
321363
if err != nil {
322364
return err
@@ -394,7 +436,14 @@ func (s *KmsKeyResourceCrud) Get() error {
394436
}
395437

396438
func (s *KmsKeyResourceCrud) Update() error {
397-
if _, ok := s.D.GetOkExists("restore_from_object_store"); ok && s.D.HasChange("restore_trigger") {
439+
if _, ok := s.D.GetOk("restore_from_file"); ok && s.D.HasChange("restore_trigger") {
440+
err := s.RestoreKeyFromFile()
441+
if err != nil {
442+
return err
443+
}
444+
s.D.SetId(s.ID())
445+
}
446+
if _, ok := s.D.GetOk("restore_from_object_store"); ok && s.D.HasChange("restore_trigger") {
398447
err := s.RestoreKeyFromObjectStore()
399448
if err != nil {
400449
return err
@@ -611,6 +660,40 @@ func (s *KmsKeyResourceCrud) RestoreKeyFromObjectStore() error {
611660
return nil
612661
}
613662

663+
func (s *KmsKeyResourceCrud) RestoreKeyFromFile() error {
664+
request := oci_kms.RestoreKeyFromFileRequest{}
665+
if restoreKeyFromFileDetails, ok := s.D.GetOk("restore_from_file.0.restore_key_from_file_details"); ok {
666+
decodedFileContent, _ := base64.StdEncoding.DecodeString(restoreKeyFromFileDetails.(string))
667+
request.RestoreKeyFromFileDetails = ioutil.NopCloser(bytes.NewBuffer(decodedFileContent))
668+
} else {
669+
request.RestoreKeyFromFileDetails = ioutil.NopCloser(bytes.NewBuffer([]byte{}))
670+
}
671+
672+
if contentLength, ok := s.D.GetOk("restore_from_file.0.content_length"); ok {
673+
tmp := contentLength.(string)
674+
tmpInt64, err := strconv.ParseInt(tmp, 10, 64)
675+
if err != nil {
676+
return fmt.Errorf("unable to convert content-length string: %s to an int64 and encountered error: %v", tmp, err)
677+
}
678+
request.ContentLength = &tmpInt64
679+
}
680+
681+
if contentMd5, ok := s.D.GetOk("restore_from_file.0.content_md5"); ok {
682+
tmp := contentMd5.(string)
683+
request.ContentMd5 = &tmp
684+
}
685+
686+
request.RequestMetadata.RetryPolicy = getRetryPolicy(s.DisableNotFoundRetries, "kms")
687+
688+
response, err := s.Client.RestoreKeyFromFile(context.Background(), request)
689+
if err != nil {
690+
return err
691+
}
692+
693+
s.Res = &response.Key
694+
return nil
695+
}
696+
614697
func (s *KmsKeyResourceCrud) mapToBackupLocation(fieldKeyFormat string) (oci_kms.BackupLocation, error) {
615698
var baseObject oci_kms.BackupLocation
616699
//discriminator

0 commit comments

Comments
 (0)