Skip to content

Commit e71139c

Browse files
uma shanker orugantiMonica Joshi
authored andcommitted
Added - Support for Integrate native Redis Service authentication with OCI IAM/Identity
1 parent 992dcc8 commit e71139c

File tree

6 files changed

+419
-0
lines changed

6 files changed

+419
-0
lines changed
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
// Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
5+
variable "region" {
6+
default = "us-ashburn-1"
7+
}
8+
9+
variable "compartment_id" {
10+
default = "compartment.r47eayq"
11+
}
12+
#OciCacheCluster vars
13+
14+
variable "redis_cluster_freeform_tags" {
15+
default = { "bar-key" = "value" }
16+
}
17+
18+
variable "redis_cluster_node_count" {
19+
default = 2
20+
}
21+
22+
variable "redis_cluster_node_memory_in_gbs" {
23+
default = 2.0
24+
}
25+
26+
variable "redis_cluster_software_version" {
27+
default = "VALKEY_7_2"
28+
}
29+
30+
31+
variable "redis_cluster_display_name" {
32+
type = string
33+
default = "test-tf-redis-cluster"
34+
}
35+
36+
variable "tenancy_ocid" {}
37+
variable "user_ocid" {}
38+
variable "fingerprint" {}
39+
variable "private_key_path" {}
40+
41+
variable "redis_cluster_create_identity_token_defined_tags_value" {
42+
default = "definedTags"
43+
}
44+
45+
46+
variable "redis_cluster_create_identity_token_public_key" {
47+
default = "ssh-rsa KKKLK3NzaC1yc2EAAAADAQABAAABAQC+UC9MFNA55NIVtKPIBCNw7++ACXhD0hx+Zyj25JfHykjz/QU3Q5FAU3DxDbVXyubgXfb/GJnrKRY8O4QDdvnZZRvQFFEOaApThAmCAM5MuFUIHdFvlqP+0W+ZQnmtDhwVe2NCfcmOrMuaPEgOKO3DOW6I/qOOdO691Xe2S9NgT9HhN0ZfFtEODVgvYulgXuCCXsJs+NUqcHAOxxFUmwkbPvYi0P0e2DT8JKeiOOC8VKUEgvVx+GKmqasm+Y6zHFW7vv3g2GstE1aRs3mttHRoC/JPM86PRyIxeWXEMzyG5wHqUu4XZpDbnWNxi6ugxnAGiL3CrIFdCgRNgHz5qS1l MustWin"
48+
}
49+
50+
variable "redis_cluster_create_identity_token_redis_user" {
51+
default = "OCI_REDIS_OWNER"
52+
}
53+
54+
55+
provider "oci" {
56+
tenancy_ocid = var.tenancy_ocid
57+
user_ocid = var.user_ocid
58+
fingerprint = var.fingerprint
59+
private_key_path = var.private_key_path
60+
region = var.region
61+
}
62+
63+
resource "oci_core_vcn" "test_vcn" {
64+
cidr_block = "10.0.0.0/16"
65+
compartment_id = var.compartment_id
66+
}
67+
68+
resource "oci_core_security_list" "test_security_list" {
69+
compartment_id = var.compartment_id
70+
vcn_id = oci_core_vcn.test_vcn.id
71+
display_name = "redis-security-list"
72+
73+
// allow outbound udp traffic on a port range
74+
egress_security_rules {
75+
destination = "0.0.0.0/0"
76+
protocol = "17" // udp
77+
stateless = true
78+
}
79+
80+
// allow inbound ssh traffic from a specific port
81+
ingress_security_rules {
82+
protocol = "6" // tcp
83+
source = "0.0.0.0/0"
84+
stateless = false
85+
}
86+
}
87+
88+
resource "oci_core_subnet" "test_subnet" {
89+
cidr_block = "10.0.0.0/24"
90+
compartment_id = var.compartment_id
91+
vcn_id = oci_core_vcn.test_vcn.id
92+
security_list_ids = [oci_core_security_list.test_security_list.id]
93+
}
94+
95+
resource "oci_redis_redis_cluster" "test_redis_cluster" {
96+
#Required
97+
compartment_id = var.compartment_id
98+
display_name = var.redis_cluster_display_name
99+
node_count = var.redis_cluster_node_count
100+
node_memory_in_gbs = var.redis_cluster_node_memory_in_gbs
101+
software_version = var.redis_cluster_software_version
102+
subnet_id = oci_core_subnet.test_subnet.id
103+
104+
#Optional
105+
// defined_tags =
106+
}
107+
108+
109+
110+
resource "oci_redis_redis_cluster_create_identity_token" "test_redis_cluster_create_identity_token" {
111+
#Required
112+
public_key = var.redis_cluster_create_identity_token_public_key
113+
redis_cluster_id = oci_redis_redis_cluster.test_redis_cluster.id
114+
redis_user = var.redis_cluster_create_identity_token_redis_user
115+
116+
#Optional
117+
}
118+
119+

internal/client/redis_clients.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
func init() {
1313
RegisterOracleClient("oci_redis.OciCacheUserClient", &OracleClient{InitClientFn: initRedisOciCacheUserClient})
1414
RegisterOracleClient("oci_redis.RedisClusterClient", &OracleClient{InitClientFn: initRedisRedisClusterClient})
15+
RegisterOracleClient("oci_redis.RedisIdentityClient", &OracleClient{InitClientFn: initRedisRedisIdentityClient})
1516
}
1617

1718
func initRedisOciCacheUserClient(configProvider oci_common.ConfigurationProvider, configureClient ConfigureClient, serviceClientOverrides ServiceClientOverrides) (interface{}, error) {
@@ -53,3 +54,23 @@ func initRedisRedisClusterClient(configProvider oci_common.ConfigurationProvider
5354
func (m *OracleClients) RedisClusterClient() *oci_redis.RedisClusterClient {
5455
return m.GetClient("oci_redis.RedisClusterClient").(*oci_redis.RedisClusterClient)
5556
}
57+
58+
func initRedisRedisIdentityClient(configProvider oci_common.ConfigurationProvider, configureClient ConfigureClient, serviceClientOverrides ServiceClientOverrides) (interface{}, error) {
59+
client, err := oci_redis.NewRedisIdentityClientWithConfigurationProvider(configProvider)
60+
if err != nil {
61+
return nil, err
62+
}
63+
err = configureClient(&client.BaseClient)
64+
if err != nil {
65+
return nil, err
66+
}
67+
68+
if serviceClientOverrides.HostUrlOverride != "" {
69+
client.Host = serviceClientOverrides.HostUrlOverride
70+
}
71+
return &client, nil
72+
}
73+
74+
func (m *OracleClients) RedisIdentityClient() *oci_redis.RedisIdentityClient {
75+
return m.GetClient("oci_redis.RedisIdentityClient").(*oci_redis.RedisIdentityClient)
76+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
package integrationtest
5+
6+
import (
7+
"fmt"
8+
"log"
9+
"testing"
10+
11+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
12+
13+
"github.com/oracle/terraform-provider-oci/httpreplay"
14+
"github.com/oracle/terraform-provider-oci/internal/acctest"
15+
16+
"github.com/oracle/terraform-provider-oci/internal/utils"
17+
)
18+
19+
var (
20+
RedisRedisClusterCreateIdentityTokenRequiredOnlyResource = RedisRedisClusterCreateIdentityTokenResourceDependencies +
21+
acctest.GenerateResourceFromRepresentationMap("oci_redis_redis_cluster_create_identity_token", "test_redis_cluster_create_identity_token", acctest.Required, acctest.Create, RedisRedisClusterCreateIdentityTokenRepresentation)
22+
23+
RedisRedisClusterCreateIdentityTokenRepresentation = map[string]interface{}{
24+
"public_key": acctest.Representation{RepType: acctest.Required, Create: `LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFycHJDUWl5RVpwWFlaY044c0RGSAp4QVlYZ0hXRFd1NTF2ejBFWDg5dzMzaDgwNllQbUVBcFFjYzRETjJFbGNvcWJ0K1djb3lZWGdMemVmWGswcnVICjI1TDR4alZPQXJWQ2FwbVRubXBUVFY4RW9zYVorUjdBbmFkZC9LYjVHa21NV2ZZbmwvT05hT3RPQ1ZBMVZzOWsKTXZoZTFJZEJZNWM2bTlHYWxEanlaL2hOamlONVZyRkh1K0puajhodzNOSk9XSEtMNW9JT3NIU3A4MFozWmZHRApvUDFHREs3SVpXNUJ5bEhXSzhPU1pzYjJ6cDQ5d3JGVjZEWVJlR1F1RHFPbzhpR0lXUzJFQk9MU2xvMk9OU3RJCktySUJ3eTN5aElXK2hPVXVheWorRnc5OEpmdjVhYnpNK2hPa3BXUktqeWhsUGY0b05FK2J2bm9xT1NFdTIwUnoKR1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg`},
25+
"redis_cluster_id": acctest.Representation{RepType: acctest.Required, Create: `rediscluster.luiw7q`},
26+
"redis_user": acctest.Representation{RepType: acctest.Required, Create: `OCI_REDIS_OWNER`},
27+
"defined_tags": acctest.Representation{RepType: acctest.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")}`},
28+
"freeform_tags": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"freeformTags": "freeformTags"}, Update: map[string]string{"freeformTags2": "freeformTags2"}},
29+
}
30+
31+
RedisRedisClusterCreateIdentityTokenResourceDependencies = ""
32+
33+
// RedisRedisClusterCreateIdentityTokenResourceDependencies = acctest.GenerateResourceFromRepresentationMap("oci_core_subnet", "test_subnet", acctest.Required, acctest.Create, CoreSubnetRepresentation) +
34+
//
35+
// acctest.GenerateResourceFromRepresentationMap("oci_core_vcn", "test_vcn", acctest.Required, acctest.Create, CoreVcnRepresentation) +
36+
// DefinedTagsDependencies +
37+
// acctest.GenerateResourceFromRepresentationMap("oci_redis_redis_cluster", "test_redis_cluster", acctest.Required, acctest.Create, RedisRedisClusterRepresentation)
38+
)
39+
40+
// issue-routing-tag: redis/default
41+
func TestRedisRedisClusterCreateIdentityTokenResource_basic(t *testing.T) {
42+
httpreplay.SetScenario("TestRedisRedisClusterCreateIdentityTokenResource_basic")
43+
defer httpreplay.SaveScenario()
44+
45+
config := acctest.ProviderTestConfig()
46+
47+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
48+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
49+
50+
resourceName := "oci_redis_redis_cluster_create_identity_token.test_redis_cluster_create_identity_token"
51+
52+
// var resId string
53+
// Save TF content to Create resource with optional properties. This has to be exactly the same as the config part in the "create with optionals" step in the test.
54+
acctest.SaveConfigContent(config+compartmentIdVariableStr+RedisRedisClusterCreateIdentityTokenResourceDependencies+
55+
acctest.GenerateResourceFromRepresentationMap("oci_redis_redis_cluster_create_identity_token", "test_redis_cluster_create_identity_token", acctest.Optional, acctest.Create, RedisRedisClusterCreateIdentityTokenRepresentation), "redis", "redisClusterCreateIdentityToken", t)
56+
log.Printf("[DEBUG] *** 0010 RedisRedisClusterCreateIdentityTokenRepresentation ***: %v", RedisRedisClusterCreateIdentityTokenRepresentation)
57+
58+
acctest.ResourceTest(t, nil, []resource.TestStep{
59+
// verify Create
60+
{
61+
Config: config + compartmentIdVariableStr + RedisRedisClusterCreateIdentityTokenResourceDependencies +
62+
acctest.GenerateResourceFromRepresentationMap("oci_redis_redis_cluster_create_identity_token", "test_redis_cluster_create_identity_token", acctest.Required, acctest.Create, RedisRedisClusterCreateIdentityTokenRepresentation),
63+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
64+
resource.TestCheckResourceAttr(resourceName, "public_key", "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFycHJDUWl5RVpwWFlaY044c0RGSAp4QVlYZ0hXRFd1NTF2ejBFWDg5dzMzaDgwNllQbUVBcFFjYzRETjJFbGNvcWJ0K1djb3lZWGdMemVmWGswcnVICjI1TDR4alZPQXJWQ2FwbVRubXBUVFY4RW9zYVorUjdBbmFkZC9LYjVHa21NV2ZZbmwvT05hT3RPQ1ZBMVZzOWsKTXZoZTFJZEJZNWM2bTlHYWxEanlaL2hOamlONVZyRkh1K0puajhodzNOSk9XSEtMNW9JT3NIU3A4MFozWmZHRApvUDFHREs3SVpXNUJ5bEhXSzhPU1pzYjJ6cDQ5d3JGVjZEWVJlR1F1RHFPbzhpR0lXUzJFQk9MU2xvMk9OU3RJCktySUJ3eTN5aElXK2hPVXVheWorRnc5OEpmdjVhYnpNK2hPa3BXUktqeWhsUGY0b05FK2J2bm9xT1NFdTIwUnoKR1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg"),
65+
resource.TestCheckResourceAttrSet(resourceName, "redis_cluster_id"),
66+
resource.TestCheckResourceAttr(resourceName, "redis_user", "OCI_REDIS_OWNER"),
67+
),
68+
},
69+
})
70+
}
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
// Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
package redis
5+
6+
import (
7+
"context"
8+
"log"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
11+
12+
oci_redis "github.com/oracle/oci-go-sdk/v65/redis"
13+
14+
"github.com/oracle/terraform-provider-oci/internal/client"
15+
"github.com/oracle/terraform-provider-oci/internal/tfresource"
16+
)
17+
18+
func RedisRedisClusterCreateIdentityTokenResource() *schema.Resource {
19+
return &schema.Resource{
20+
Timeouts: tfresource.DefaultTimeout,
21+
Create: createRedisRedisClusterCreateIdentityToken,
22+
Read: readRedisRedisClusterCreateIdentityToken,
23+
Delete: deleteRedisRedisClusterCreateIdentityToken,
24+
Schema: map[string]*schema.Schema{
25+
// Required
26+
"public_key": {
27+
Type: schema.TypeString,
28+
Required: true,
29+
ForceNew: true,
30+
},
31+
"redis_cluster_id": {
32+
Type: schema.TypeString,
33+
Required: true,
34+
ForceNew: true,
35+
},
36+
"redis_user": {
37+
Type: schema.TypeString,
38+
Required: true,
39+
ForceNew: true,
40+
},
41+
42+
// Optional
43+
"defined_tags": {
44+
Type: schema.TypeMap,
45+
Optional: true,
46+
ForceNew: true,
47+
DiffSuppressFunc: tfresource.DefinedTagsDiffSuppressFunction,
48+
Elem: schema.TypeString,
49+
},
50+
"freeform_tags": {
51+
Type: schema.TypeMap,
52+
Optional: true,
53+
ForceNew: true,
54+
Elem: schema.TypeString,
55+
},
56+
57+
// Computed
58+
"identity_token": {
59+
Type: schema.TypeString,
60+
Computed: true,
61+
},
62+
},
63+
}
64+
}
65+
66+
func createRedisRedisClusterCreateIdentityToken(d *schema.ResourceData, m interface{}) error {
67+
sync := &RedisRedisClusterCreateIdentityTokenResourceCrud{}
68+
sync.D = d
69+
sync.Client = m.(*client.OracleClients).RedisIdentityClient()
70+
71+
return tfresource.CreateResource(d, sync)
72+
}
73+
74+
func readRedisRedisClusterCreateIdentityToken(d *schema.ResourceData, m interface{}) error {
75+
return nil
76+
}
77+
78+
func deleteRedisRedisClusterCreateIdentityToken(d *schema.ResourceData, m interface{}) error {
79+
return nil
80+
}
81+
82+
type RedisRedisClusterCreateIdentityTokenResourceCrud struct {
83+
tfresource.BaseCrud
84+
Client *oci_redis.RedisIdentityClient
85+
Res *oci_redis.IdentityTokenDetailsResponse
86+
DisableNotFoundRetries bool
87+
}
88+
89+
func (s *RedisRedisClusterCreateIdentityTokenResourceCrud) ID() string {
90+
return tfresource.GenerateDataSourceHashID("RedisRedisClusterCreateIdentityTokenResource-", RedisRedisClusterCreateIdentityTokenResource(), s.D)
91+
}
92+
93+
func (s *RedisRedisClusterCreateIdentityTokenResourceCrud) Create() error {
94+
request := oci_redis.CreateIdentityTokenRequest{}
95+
96+
if definedTags, ok := s.D.GetOkExists("defined_tags"); ok {
97+
convertedDefinedTags, err := tfresource.MapToDefinedTags(definedTags.(map[string]interface{}))
98+
if err != nil {
99+
return err
100+
}
101+
request.DefinedTags = convertedDefinedTags
102+
}
103+
104+
if freeformTags, ok := s.D.GetOkExists("freeform_tags"); ok {
105+
request.FreeformTags = tfresource.ObjectMapToStringMap(freeformTags.(map[string]interface{}))
106+
}
107+
108+
if publicKey, ok := s.D.GetOkExists("public_key"); ok {
109+
tmp := publicKey.(string)
110+
request.PublicKey = &tmp
111+
}
112+
113+
if redisClusterId, ok := s.D.GetOkExists("redis_cluster_id"); ok {
114+
tmp := redisClusterId.(string)
115+
request.RedisClusterId = &tmp
116+
}
117+
118+
if redisUser, ok := s.D.GetOkExists("redis_user"); ok {
119+
tmp := redisUser.(string)
120+
request.RedisUser = &tmp
121+
}
122+
123+
request.RequestMetadata.RetryPolicy = tfresource.GetRetryPolicy(s.DisableNotFoundRetries, "redis")
124+
log.Printf("[DEBUG] *** 00100 request ***: %v", request)
125+
126+
response, err := s.Client.CreateIdentityToken(context.Background(), request)
127+
if err != nil {
128+
return err
129+
}
130+
131+
s.Res = &response.IdentityTokenDetailsResponse
132+
return nil
133+
}
134+
135+
func (s *RedisRedisClusterCreateIdentityTokenResourceCrud) SetData() error {
136+
if s.Res.IdentityToken != nil {
137+
s.D.Set("identity_token", *s.Res.IdentityToken)
138+
}
139+
140+
if s.Res.RedisUser != nil {
141+
s.D.Set("redis_user", *s.Res.RedisUser)
142+
}
143+
144+
s.D.SetId(s.ID())
145+
return nil
146+
}

internal/service/redis/register_resource.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ func RegisterResource() {
1212
tfresource.RegisterResource("oci_redis_redis_cluster_attach_oci_cache_user", RedisRedisClusterAttachOciCacheUserResource())
1313
tfresource.RegisterResource("oci_redis_redis_cluster_detach_oci_cache_user", RedisRedisClusterDetachOciCacheUserResource())
1414
tfresource.RegisterResource("oci_redis_redis_cluster_get_oci_cache_user", RedisRedisClusterGetOciCacheUserResource())
15+
tfresource.RegisterResource("oci_redis_redis_cluster_create_identity_token", RedisRedisClusterCreateIdentityTokenResource())
1516
}

0 commit comments

Comments
 (0)