Skip to content

Commit b8093aa

Browse files
committed
Add support for Secrets Management Service
1 parent 07aa6c0 commit b8093aa

40 files changed

+3678
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
- Support for Oracle Big Data Service
66
- Support for application definition parameters update in dataflow application
77
- Support for Cross Region Replication
8+
- Support for Secrets Management Service's `oci_vault_secret` and `oci_vault_secret_version` datasources
89

910
## 3.68.0 (March 25, 2020)
1011

examples/secret/main.tf

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright (c) 2017, 2019, 2020, Oracle and/or its affiliates. All rights reserved.
2+
3+
variable "tenancy_ocid" {}
4+
variable "user_ocid" {}
5+
variable "fingerprint" {}
6+
variable "private_key_path" {}
7+
variable "region" {}
8+
variable "compartment_ocid" {}
9+
variable "secret_id" {}
10+
variable "vault_id" {}
11+
12+
provider "oci" {
13+
tenancy_ocid = "${var.tenancy_ocid}"
14+
user_ocid = "${var.user_ocid}"
15+
fingerprint = "${var.fingerprint}"
16+
private_key_path = "${var.private_key_path}"
17+
region = "${var.region}"
18+
}
19+
20+
data "oci_vault_secret" "test_secret" {
21+
secret_id = "${var.secret_id}"
22+
}
23+
24+
data "oci_vault_secret" "test_secret" {
25+
compartment_id = "${var.compartment_ocid}"
26+
state = "Active"
27+
vault_id = "${var.vault_id}"
28+
}

oci/oci_dependency_graph.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ func initDependencyGraph() {
6969
DependencyGraph["key"] = append(DependencyGraph["key"], "KmsEncryptedData")
7070
DependencyGraph["key"] = append(DependencyGraph["key"], "KmsGeneratedKey")
7171
DependencyGraph["key"] = append(DependencyGraph["key"], "KmsKeyVersion")
72+
DependencyGraph["key"] = append(DependencyGraph["key"], "VaultSecret")
7273
DependencyGraph["kmsKey"] = append(DependencyGraph["kmsKey"], "ContainerengineCluster")
7374
DependencyGraph["kmsKey"] = append(DependencyGraph["kmsKey"], "CoreBootVolume")
7475
DependencyGraph["kmsKey"] = append(DependencyGraph["kmsKey"], "CoreVolume")
@@ -122,6 +123,7 @@ func initDependencyGraph() {
122123
DependencyGraph["user"] = append(DependencyGraph["user"], "IdentitySwiftPassword")
123124
DependencyGraph["user"] = append(DependencyGraph["user"], "IdentityUiPassword")
124125
DependencyGraph["user"] = append(DependencyGraph["user"], "IdentityUserGroupMembership")
126+
DependencyGraph["vault"] = append(DependencyGraph["vault"], "VaultSecret")
125127
DependencyGraph["vcn"] = append(DependencyGraph["vcn"], "ContainerengineCluster")
126128
DependencyGraph["vcn"] = append(DependencyGraph["vcn"], "CoreDhcpOptions")
127129
DependencyGraph["vcn"] = append(DependencyGraph["vcn"], "CoreDrgAttachment")

oci/provider_clients.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
oci_osmanagement "github.com/oracle/oci-go-sdk/osmanagement"
3737
oci_resourcemanager "github.com/oracle/oci-go-sdk/resourcemanager"
3838
oci_streaming "github.com/oracle/oci-go-sdk/streaming"
39+
oci_vault "github.com/oracle/oci-go-sdk/vault"
3940
oci_waas "github.com/oracle/oci-go-sdk/waas"
4041
oci_work_requests "github.com/oracle/oci-go-sdk/workrequests"
4142

@@ -86,6 +87,7 @@ type OracleClients struct {
8687
redirectClient *oci_waas.RedirectClient
8788
resourceManagerClient *oci_resourcemanager.ResourceManagerClient
8889
streamAdminClient *oci_streaming.StreamAdminClient
90+
vaultsClient *oci_vault.VaultsClient
8991
virtualNetworkClient *oci_core.VirtualNetworkClient
9092
waasClient *oci_waas.WaasClient
9193
gatewayWorkRequestsClient *oci_apigateway.WorkRequestsClient
@@ -547,6 +549,16 @@ func createSDKClients(clients *OracleClients, configProvider oci_common.Configur
547549
}
548550
clients.streamAdminClient = &streamAdminClient
549551

552+
vaultsClient, err := oci_vault.NewVaultsClientWithConfigurationProvider(configProvider)
553+
if err != nil {
554+
return
555+
}
556+
err = configureClient(&vaultsClient.BaseClient)
557+
if err != nil {
558+
return
559+
}
560+
clients.vaultsClient = &vaultsClient
561+
550562
virtualNetworkClient, err := oci_core.NewVirtualNetworkClientWithConfigurationProvider(configProvider)
551563
if err != nil {
552564
return

oci/vault_secret_data_source.go

Lines changed: 256 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
1+
// Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
2+
3+
package oci
4+
5+
import (
6+
"context"
7+
"log"
8+
"strconv"
9+
10+
"github.com/hashicorp/terraform/helper/schema"
11+
oci_common "github.com/oracle/oci-go-sdk/common"
12+
oci_vault "github.com/oracle/oci-go-sdk/vault"
13+
)
14+
15+
func init() {
16+
RegisterDatasource("oci_vault_secret", VaultSecretDataSource())
17+
}
18+
19+
func VaultSecretDataSource() *schema.Resource {
20+
return &schema.Resource{
21+
Read: readSingularVaultSecret,
22+
Schema: map[string]*schema.Schema{
23+
"secret_id": {
24+
Type: schema.TypeString,
25+
Required: true,
26+
},
27+
// Computed
28+
"compartment_id": {
29+
Type: schema.TypeString,
30+
Computed: true,
31+
},
32+
"current_version_number": {
33+
Type: schema.TypeString,
34+
Computed: true,
35+
},
36+
"defined_tags": {
37+
Type: schema.TypeMap,
38+
Computed: true,
39+
Elem: schema.TypeString,
40+
},
41+
"description": {
42+
Type: schema.TypeString,
43+
Computed: true,
44+
},
45+
"freeform_tags": {
46+
Type: schema.TypeMap,
47+
Computed: true,
48+
Elem: schema.TypeString,
49+
},
50+
"key_id": {
51+
Type: schema.TypeString,
52+
Computed: true,
53+
},
54+
"lifecycle_details": {
55+
Type: schema.TypeString,
56+
Computed: true,
57+
},
58+
"metadata": {
59+
Type: schema.TypeMap,
60+
Computed: true,
61+
Elem: schema.TypeString,
62+
},
63+
"secret_name": {
64+
Type: schema.TypeString,
65+
Computed: true,
66+
},
67+
"secret_rules": {
68+
Type: schema.TypeList,
69+
Computed: true,
70+
Elem: &schema.Resource{
71+
Schema: map[string]*schema.Schema{
72+
// Required
73+
74+
// Optional
75+
76+
// Computed
77+
"is_enforced_on_deleted_secret_versions": {
78+
Type: schema.TypeBool,
79+
Computed: true,
80+
},
81+
"is_secret_content_retrieval_blocked_on_expiry": {
82+
Type: schema.TypeBool,
83+
Computed: true,
84+
},
85+
"rule_type": {
86+
Type: schema.TypeString,
87+
Computed: true,
88+
},
89+
"secret_version_expiry_interval": {
90+
Type: schema.TypeString,
91+
Computed: true,
92+
},
93+
"time_of_absolute_expiry": {
94+
Type: schema.TypeString,
95+
Computed: true,
96+
},
97+
},
98+
},
99+
},
100+
"state": {
101+
Type: schema.TypeString,
102+
Computed: true,
103+
},
104+
"time_created": {
105+
Type: schema.TypeString,
106+
Computed: true,
107+
},
108+
"time_of_current_version_expiry": {
109+
Type: schema.TypeString,
110+
Computed: true,
111+
},
112+
"time_of_deletion": {
113+
Type: schema.TypeString,
114+
Computed: true,
115+
},
116+
"vault_id": {
117+
Type: schema.TypeString,
118+
Computed: true,
119+
},
120+
},
121+
}
122+
}
123+
124+
func readSingularVaultSecret(d *schema.ResourceData, m interface{}) error {
125+
sync := &VaultSecretDataSourceCrud{}
126+
sync.D = d
127+
sync.Client = m.(*OracleClients).vaultsClient
128+
129+
return ReadResource(sync)
130+
}
131+
132+
type VaultSecretDataSourceCrud struct {
133+
D *schema.ResourceData
134+
Client *oci_vault.VaultsClient
135+
Res *oci_vault.GetSecretResponse
136+
}
137+
138+
func (s *VaultSecretDataSourceCrud) VoidState() {
139+
s.D.SetId("")
140+
}
141+
142+
func (s *VaultSecretDataSourceCrud) Get() error {
143+
request := oci_vault.GetSecretRequest{}
144+
145+
if secretId, ok := s.D.GetOkExists("secret_id"); ok {
146+
tmp := secretId.(string)
147+
request.SecretId = &tmp
148+
}
149+
150+
request.RequestMetadata.RetryPolicy = getRetryPolicy(false, "vault")
151+
152+
response, err := s.Client.GetSecret(context.Background(), request)
153+
if err != nil {
154+
return err
155+
}
156+
157+
s.Res = &response
158+
return nil
159+
}
160+
161+
func (s *VaultSecretDataSourceCrud) SetData() error {
162+
if s.Res == nil {
163+
return nil
164+
}
165+
166+
s.D.SetId(*s.Res.Id)
167+
168+
if s.Res.CompartmentId != nil {
169+
s.D.Set("compartment_id", *s.Res.CompartmentId)
170+
}
171+
172+
if s.Res.CurrentVersionNumber != nil {
173+
s.D.Set("current_version_number", strconv.FormatInt(*s.Res.CurrentVersionNumber, 10))
174+
}
175+
176+
if s.Res.DefinedTags != nil {
177+
s.D.Set("defined_tags", definedTagsToMap(s.Res.DefinedTags))
178+
}
179+
180+
if s.Res.Description != nil {
181+
s.D.Set("description", *s.Res.Description)
182+
}
183+
184+
s.D.Set("freeform_tags", s.Res.FreeformTags)
185+
186+
if s.Res.KeyId != nil {
187+
s.D.Set("key_id", *s.Res.KeyId)
188+
}
189+
190+
if s.Res.LifecycleDetails != nil {
191+
s.D.Set("lifecycle_details", *s.Res.LifecycleDetails)
192+
}
193+
194+
s.D.Set("metadata", s.Res.Metadata)
195+
196+
if s.Res.SecretName != nil {
197+
s.D.Set("secret_name", *s.Res.SecretName)
198+
}
199+
200+
secretRules := []interface{}{}
201+
for _, item := range s.Res.SecretRules {
202+
secretRules = append(secretRules, SecretRuleToMap(item))
203+
}
204+
s.D.Set("secret_rules", secretRules)
205+
206+
s.D.Set("state", s.Res.LifecycleState)
207+
208+
if s.Res.TimeCreated != nil {
209+
s.D.Set("time_created", s.Res.TimeCreated.String())
210+
}
211+
212+
if s.Res.TimeOfCurrentVersionExpiry != nil {
213+
s.D.Set("time_of_current_version_expiry", s.Res.TimeOfCurrentVersionExpiry.String())
214+
}
215+
216+
if s.Res.TimeOfDeletion != nil {
217+
s.D.Set("time_of_deletion", s.Res.TimeOfDeletion.String())
218+
}
219+
220+
if s.Res.VaultId != nil {
221+
s.D.Set("vault_id", *s.Res.VaultId)
222+
}
223+
224+
return nil
225+
}
226+
227+
func SecretRuleToMap(obj oci_vault.SecretRule) map[string]interface{} {
228+
result := map[string]interface{}{}
229+
switch v := (obj).(type) {
230+
case oci_vault.SecretExpiryRule:
231+
result["rule_type"] = "SECRET_EXPIRY_RULE"
232+
233+
if v.IsSecretContentRetrievalBlockedOnExpiry != nil {
234+
result["is_secret_content_retrieval_blocked_on_expiry"] = bool(*v.IsSecretContentRetrievalBlockedOnExpiry)
235+
}
236+
237+
if v.SecretVersionExpiryInterval != nil {
238+
result["secret_version_expiry_interval"] = string(*v.SecretVersionExpiryInterval)
239+
}
240+
241+
if v.TimeOfAbsoluteExpiry != nil {
242+
result["time_of_absolute_expiry"] = oci_common.SDKTime(*v.TimeOfAbsoluteExpiry)
243+
}
244+
case oci_vault.SecretReuseRule:
245+
result["rule_type"] = "SECRET_REUSE_RULE"
246+
247+
if v.IsEnforcedOnDeletedSecretVersions != nil {
248+
result["is_enforced_on_deleted_secret_versions"] = bool(*v.IsEnforcedOnDeletedSecretVersions)
249+
}
250+
default:
251+
log.Printf("[WARN] Received 'rule_type' of unknown type %v", obj)
252+
return nil
253+
}
254+
255+
return result
256+
}

0 commit comments

Comments
 (0)