Skip to content

Commit 9b9e348

Browse files
Terraform Team AutomationNagaRajuPasunuri
authored andcommitted
Added - Support for OCI Caching Service with Redis
1 parent 48b8bd9 commit 9b9e348

15 files changed

+1836
-0
lines changed
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
// Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
variable "region" {
5+
default = "us-ashburn-1"
6+
}
7+
8+
variable "compartment_id" {
9+
default = "ocid1.compartment.oc1..aaaaaaaarnj7d6pfp2c5op4oct6qfh7553xzxezc2afmxxboqdov23a7cp2a"
10+
}
11+
12+
variable "redis_cluster_display_name" {
13+
type = string
14+
default = "test-tf-redis-example"
15+
}
16+
17+
variable "redis_cluster_freeform_tags" {
18+
default = { "bar-key" = "value" }
19+
}
20+
21+
variable "redis_cluster_node_count" {
22+
default = 5
23+
}
24+
25+
variable "redis_cluster_node_memory_in_gbs" {
26+
default = 2.0
27+
}
28+
29+
variable "redis_cluster_software_version" {
30+
default = "V7_0_5"
31+
}
32+
33+
variable "redis_cluster_state" {
34+
default = "ACTIVE"
35+
}
36+
37+
38+
39+
provider "oci" {
40+
auth = "SecurityToken"
41+
config_file_profile = "DEFAULT"
42+
region = var.region
43+
}
44+
45+
resource "oci_core_vcn" "test_vcn" {
46+
cidr_block = "10.0.0.0/16"
47+
compartment_id = var.compartment_id
48+
}
49+
50+
resource "oci_core_security_list" "test_security_list" {
51+
compartment_id = var.compartment_id
52+
vcn_id = oci_core_vcn.test_vcn.id
53+
display_name = "redis-security-list"
54+
55+
// allow outbound udp traffic on a port range
56+
egress_security_rules {
57+
destination = "0.0.0.0/0"
58+
protocol = "17" // udp
59+
stateless = true
60+
}
61+
62+
// allow inbound ssh traffic from a specific port
63+
ingress_security_rules {
64+
protocol = "6" // tcp
65+
source = "0.0.0.0/0"
66+
stateless = false
67+
}
68+
}
69+
70+
resource "oci_core_subnet" "test_subnet" {
71+
cidr_block = "10.0.0.0/24"
72+
compartment_id = var.compartment_id
73+
vcn_id = oci_core_vcn.test_vcn.id
74+
security_list_ids = [oci_core_security_list.test_security_list.id]
75+
}
76+
77+
resource "oci_redis_redis_cluster" "test_redis_cluster" {
78+
#Required
79+
compartment_id = var.compartment_id
80+
display_name = var.redis_cluster_display_name
81+
node_count = var.redis_cluster_node_count
82+
node_memory_in_gbs = var.redis_cluster_node_memory_in_gbs
83+
software_version = var.redis_cluster_software_version
84+
subnet_id = oci_core_subnet.test_subnet.id
85+
86+
#Optional
87+
// defined_tags = map(oci_identity_tag_namespace.tag-namespace1.name.oci_identity_tag.tag1.name, var.redis_cluster_defined_tags_value)
88+
freeform_tags = var.redis_cluster_freeform_tags
89+
}
90+
91+
data "oci_redis_redis_clusters" "test_redis_clusters" {
92+
93+
#Optional
94+
compartment_id = var.compartment_id
95+
display_name = var.redis_cluster_display_name
96+
id = oci_redis_redis_cluster.test_redis_cluster.id
97+
state = var.redis_cluster_state
98+
}

internal/client/redis_clients.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
package client
5+
6+
import (
7+
oci_redis "github.com/oracle/oci-go-sdk/v65/redis"
8+
9+
oci_common "github.com/oracle/oci-go-sdk/v65/common"
10+
)
11+
12+
func init() {
13+
RegisterOracleClient("oci_redis.RedisClusterClient", &OracleClient{InitClientFn: initRedisRedisClusterClient})
14+
}
15+
16+
func initRedisRedisClusterClient(configProvider oci_common.ConfigurationProvider, configureClient ConfigureClient, serviceClientOverrides ServiceClientOverrides) (interface{}, error) {
17+
client, err := oci_redis.NewRedisClusterClientWithConfigurationProvider(configProvider)
18+
if err != nil {
19+
return nil, err
20+
}
21+
err = configureClient(&client.BaseClient)
22+
if err != nil {
23+
return nil, err
24+
}
25+
26+
if serviceClientOverrides.HostUrlOverride != "" {
27+
client.Host = serviceClientOverrides.HostUrlOverride
28+
}
29+
return &client, nil
30+
}
31+
32+
func (m *OracleClients) RedisClusterClient() *oci_redis.RedisClusterClient {
33+
return m.GetClient("oci_redis.RedisClusterClient").(*oci_redis.RedisClusterClient)
34+
}

internal/integrationtest/redis_redis_cluster_test.go

Lines changed: 386 additions & 0 deletions
Large diffs are not rendered by default.

internal/provider/register_datasource.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ import (
9696
tf_osub_usage "github.com/oracle/terraform-provider-oci/internal/service/osub_usage"
9797
tf_queue "github.com/oracle/terraform-provider-oci/internal/service/queue"
9898
tf_recovery "github.com/oracle/terraform-provider-oci/internal/service/recovery"
99+
tf_redis "github.com/oracle/terraform-provider-oci/internal/service/redis"
99100
tf_resourcemanager "github.com/oracle/terraform-provider-oci/internal/service/resourcemanager"
100101
tf_sch "github.com/oracle/terraform-provider-oci/internal/service/sch"
101102
tf_secrets "github.com/oracle/terraform-provider-oci/internal/service/secrets"
@@ -390,6 +391,9 @@ func init() {
390391
if common.CheckForEnabledServices("recovery") {
391392
tf_recovery.RegisterDatasource()
392393
}
394+
if common.CheckForEnabledServices("redis") {
395+
tf_redis.RegisterDatasource()
396+
}
393397
if common.CheckForEnabledServices("resourcemanager") {
394398
tf_resourcemanager.RegisterDatasource()
395399
}

internal/provider/register_resource.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ import (
9696
tf_osub_usage "github.com/oracle/terraform-provider-oci/internal/service/osub_usage"
9797
tf_queue "github.com/oracle/terraform-provider-oci/internal/service/queue"
9898
tf_recovery "github.com/oracle/terraform-provider-oci/internal/service/recovery"
99+
tf_redis "github.com/oracle/terraform-provider-oci/internal/service/redis"
99100
tf_resourcemanager "github.com/oracle/terraform-provider-oci/internal/service/resourcemanager"
100101
tf_sch "github.com/oracle/terraform-provider-oci/internal/service/sch"
101102
tf_secrets "github.com/oracle/terraform-provider-oci/internal/service/secrets"
@@ -390,6 +391,9 @@ func init() {
390391
if common.CheckForEnabledServices("recovery") {
391392
tf_recovery.RegisterResource()
392393
}
394+
if common.CheckForEnabledServices("redis") {
395+
tf_redis.RegisterResource()
396+
}
393397
if common.CheckForEnabledServices("resourcemanager") {
394398
tf_resourcemanager.RegisterResource()
395399
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package redis
2+
3+
import (
4+
oci_redis "github.com/oracle/oci-go-sdk/v65/redis"
5+
6+
tf_export "github.com/oracle/terraform-provider-oci/internal/commonexport"
7+
)
8+
9+
func init() {
10+
tf_export.RegisterCompartmentGraphs("redis", redisResourceGraph)
11+
}
12+
13+
// Custom overrides for generating composite IDs within the resource discovery framework
14+
15+
// Hints for discovering and exporting this resource to configuration and state files
16+
var exportRedisRedisClusterHints = &tf_export.TerraformResourceHints{
17+
ResourceClass: "oci_redis_redis_cluster",
18+
DatasourceClass: "oci_redis_redis_clusters",
19+
DatasourceItemsAttr: "redis_cluster_collection",
20+
IsDatasourceCollection: true,
21+
ResourceAbbreviation: "redis_cluster",
22+
RequireResourceRefresh: true,
23+
DiscoverableLifecycleStates: []string{
24+
string(oci_redis.RedisClusterLifecycleStateActive),
25+
},
26+
}
27+
28+
var redisResourceGraph = tf_export.TerraformResourceGraph{
29+
"oci_identity_compartment": {
30+
{TerraformResourceHints: exportRedisRedisClusterHints},
31+
},
32+
}
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
// Copyright (c) 2017, 2023, 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+
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
oci_redis "github.com/oracle/oci-go-sdk/v65/redis"
11+
12+
"github.com/oracle/terraform-provider-oci/internal/client"
13+
"github.com/oracle/terraform-provider-oci/internal/tfresource"
14+
)
15+
16+
func RedisRedisClusterDataSource() *schema.Resource {
17+
fieldMap := make(map[string]*schema.Schema)
18+
fieldMap["redis_cluster_id"] = &schema.Schema{
19+
Type: schema.TypeString,
20+
Required: true,
21+
}
22+
return tfresource.GetSingularDataSourceItemSchema(RedisRedisClusterResource(), fieldMap, readSingularRedisRedisCluster)
23+
}
24+
25+
func readSingularRedisRedisCluster(d *schema.ResourceData, m interface{}) error {
26+
sync := &RedisRedisClusterDataSourceCrud{}
27+
sync.D = d
28+
sync.Client = m.(*client.OracleClients).RedisClusterClient()
29+
30+
return tfresource.ReadResource(sync)
31+
}
32+
33+
type RedisRedisClusterDataSourceCrud struct {
34+
D *schema.ResourceData
35+
Client *oci_redis.RedisClusterClient
36+
Res *oci_redis.GetRedisClusterResponse
37+
}
38+
39+
func (s *RedisRedisClusterDataSourceCrud) VoidState() {
40+
s.D.SetId("")
41+
}
42+
43+
func (s *RedisRedisClusterDataSourceCrud) Get() error {
44+
request := oci_redis.GetRedisClusterRequest{}
45+
46+
if redisClusterId, ok := s.D.GetOkExists("redis_cluster_id"); ok {
47+
tmp := redisClusterId.(string)
48+
request.RedisClusterId = &tmp
49+
}
50+
51+
request.RequestMetadata.RetryPolicy = tfresource.GetRetryPolicy(false, "redis")
52+
53+
response, err := s.Client.GetRedisCluster(context.Background(), request)
54+
if err != nil {
55+
return err
56+
}
57+
58+
s.Res = &response
59+
return nil
60+
}
61+
62+
func (s *RedisRedisClusterDataSourceCrud) SetData() error {
63+
if s.Res == nil {
64+
return nil
65+
}
66+
67+
s.D.SetId(*s.Res.Id)
68+
69+
if s.Res.CompartmentId != nil {
70+
s.D.Set("compartment_id", *s.Res.CompartmentId)
71+
}
72+
73+
if s.Res.DefinedTags != nil {
74+
s.D.Set("defined_tags", tfresource.DefinedTagsToMap(s.Res.DefinedTags))
75+
}
76+
77+
if s.Res.DisplayName != nil {
78+
s.D.Set("display_name", *s.Res.DisplayName)
79+
}
80+
81+
s.D.Set("freeform_tags", s.Res.FreeformTags)
82+
s.D.Set("freeform_tags", s.Res.FreeformTags)
83+
84+
if s.Res.LifecycleDetails != nil {
85+
s.D.Set("lifecycle_details", *s.Res.LifecycleDetails)
86+
}
87+
88+
if s.Res.NodeCollection != nil {
89+
s.D.Set("node_collection", []interface{}{NodeCollectionToMap(s.Res.NodeCollection)})
90+
} else {
91+
s.D.Set("node_collection", nil)
92+
}
93+
94+
if s.Res.NodeCount != nil {
95+
s.D.Set("node_count", *s.Res.NodeCount)
96+
}
97+
98+
if s.Res.NodeMemoryInGBs != nil {
99+
s.D.Set("node_memory_in_gbs", *s.Res.NodeMemoryInGBs)
100+
}
101+
102+
if s.Res.PrimaryEndpointIpAddress != nil {
103+
s.D.Set("primary_endpoint_ip_address", *s.Res.PrimaryEndpointIpAddress)
104+
}
105+
106+
if s.Res.PrimaryFqdn != nil {
107+
s.D.Set("primary_fqdn", *s.Res.PrimaryFqdn)
108+
}
109+
110+
if s.Res.ReplicasEndpointIpAddress != nil {
111+
s.D.Set("replicas_endpoint_ip_address", *s.Res.ReplicasEndpointIpAddress)
112+
}
113+
114+
if s.Res.ReplicasFqdn != nil {
115+
s.D.Set("replicas_fqdn", *s.Res.ReplicasFqdn)
116+
}
117+
118+
s.D.Set("software_version", s.Res.SoftwareVersion)
119+
120+
s.D.Set("state", s.Res.LifecycleState)
121+
122+
if s.Res.SubnetId != nil {
123+
s.D.Set("subnet_id", *s.Res.SubnetId)
124+
}
125+
126+
if s.Res.SystemTags != nil {
127+
s.D.Set("system_tags", tfresource.SystemTagsToMap(s.Res.SystemTags))
128+
}
129+
130+
if s.Res.TimeCreated != nil {
131+
s.D.Set("time_created", s.Res.TimeCreated.String())
132+
}
133+
134+
if s.Res.TimeUpdated != nil {
135+
s.D.Set("time_updated", s.Res.TimeUpdated.String())
136+
}
137+
138+
return nil
139+
}

0 commit comments

Comments
 (0)