Skip to content

Commit f5780fa

Browse files
committed
service connector module
Signed-off-by: Karthic Ravindran <[email protected]>
1 parent 7de68e5 commit f5780fa

File tree

6 files changed

+290
-0
lines changed

6 files changed

+290
-0
lines changed

modules/serviceconnector/README.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<!-- BEGIN_TF_DOCS -->
2+
## Requirements
3+
4+
| Name | Version |
5+
|------|---------|
6+
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.3.0 |
7+
| <a name="requirement_oci"></a> [oci](#requirement\_oci) | >= 4.67.3 |
8+
9+
## Providers
10+
11+
| Name | Version |
12+
|------|---------|
13+
| <a name="provider_oci"></a> [oci](#provider\_oci) | >= 4.67.3 |
14+
15+
## Modules
16+
17+
No modules.
18+
19+
## Resources
20+
21+
| Name | Type |
22+
|------|------|
23+
| [oci_identity_dynamic_group.serviceconnector_dynamic_group](https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/identity_dynamic_group) | resource |
24+
| [oci_identity_policy.serviceconnector_policy](https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/identity_policy) | resource |
25+
| [oci_sch_service_connector.this](https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/sch_service_connector) | resource |
26+
27+
## Inputs
28+
29+
| Name | Description | Type | Default | Required |
30+
|------|-------------|------|---------|:--------:|
31+
| <a name="input_compartment_ocid"></a> [compartment\_ocid](#input\_compartment\_ocid) | Compartment OCID | `string` | n/a | yes |
32+
| <a name="input_create_dg"></a> [create\_dg](#input\_create\_dg) | Whether to create dynamic group or not | `bool` | n/a | yes |
33+
| <a name="input_dynamic_group_name"></a> [dynamic\_group\_name](#input\_dynamic\_group\_name) | Dynamic group display name | `string` | n/a | yes |
34+
| <a name="input_policy_compartment_id"></a> [policy\_compartment\_id](#input\_policy\_compartment\_id) | Compartment where policy will be created | `string` | n/a | yes |
35+
| <a name="input_service_connector_def"></a> [service\_connector\_def](#input\_service\_connector\_def) | n/a | <pre>map(object({<br> defined_tags = optional(map(string))<br> freeform_tags = optional(map(string))<br> display_name = string<br> description = optional(string)<br> state = optional(string, "ACTIVE")<br> sch_source = string<br> sch_target = string<br><br> #For Streaming source<br> stream_id = optional(string)<br> stream_cursor = optional(string)<br> #For logging source<br> log_source = optional(list(object({<br> compartment_id = optional(string)<br> log_group_id = optional(string, "_Audit")<br> log_id = optional(string)<br> })))<br> #For monitoring source<br> monitoring_source = optional(list(object({<br> compartment_id = optional(string)<br> metric_namespace = list(string)<br> })))<br><br> target = object({<br> #For Objectstorage target<br> bucket_name = optional(string)<br> batch_rollover_size_in_mbs = optional(number, 100)<br> batch_rollover_time_in_ms = optional(number, 420000)<br> object_name_prefix = optional(string)<br> #For Streaming target<br> stream_id = optional(string)<br> #For Notification target<br> topic_id = optional(string)<br> #For Function target<br> function_id = optional(string)<br> #For LoggingAnalytics Target<br> log_group_id = optional(string)<br> log_source = optional(string)<br> compartment_id = optional(string)<br> })<br> tasks = optional(object({<br> log_condition = optional(string)<br> function_id = optional(string)<br> batch_size_in_kbs = optional(string, 5120)<br> batch_time_in_sec = optional(string, 600)<br><br> }))<br> }))</pre> | n/a | yes |
36+
| <a name="input_tenancy_ocid"></a> [tenancy\_ocid](#input\_tenancy\_ocid) | Tenancy OCID | `string` | n/a | yes |
37+
38+
## Outputs
39+
40+
| Name | Description |
41+
|------|-------------|
42+
| <a name="output_service_connectors"></a> [service\_connectors](#output\_service\_connectors) | Service Connector |
43+
<!-- END_TF_DOCS -->

modules/serviceconnector/main.tf

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
#Copyright (c) 2023 Oracle Corporation and/or its affiliates.
2+
#Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl
3+
4+
resource "oci_sch_service_connector" "this" {
5+
for_each = var.service_connector_def
6+
compartment_id = var.compartment_ocid
7+
display_name = each.value.display_name
8+
source {
9+
kind = each.value.sch_source
10+
dynamic "cursor" {
11+
for_each = each.value.sch_source == "streaming" ? [1] : []
12+
content {
13+
#https://docs.oracle.com/en-us/iaas/Content/Streaming/Tasks/using_a_single_consumer.htm#usingcursors
14+
kind = each.value.stream_cursor
15+
}
16+
}
17+
18+
dynamic "log_sources" {
19+
for_each = each.value.sch_source == "logging" ? each.value.log_source : []
20+
content {
21+
compartment_id = coalesce(log_sources.value.compartment_id, var.compartment_ocid)
22+
log_group_id = log_sources.value.log_group_id
23+
log_id = log_sources.value.log_id
24+
25+
}
26+
}
27+
dynamic "monitoring_sources" {
28+
for_each = each.value.sch_source == "monitoring" ? each.value.monitoring_source : []
29+
content {
30+
31+
compartment_id = coalesce(monitoring_sources.value.compartment_id, var.compartment_ocid)
32+
namespace_details {
33+
kind = "selected"
34+
dynamic "namespaces" {
35+
for_each = monitoring_sources.value.metric_namespace
36+
content {
37+
metrics {
38+
kind = "all"
39+
}
40+
namespace = namespaces.value
41+
}
42+
}
43+
}
44+
}
45+
}
46+
stream_id = each.value.sch_source == "streaming" ? each.value.stream_id : null
47+
}
48+
target {
49+
kind = each.value.sch_target
50+
log_group_id = each.value.sch_target == "loggingAnalytics" ? each.value.target.log_group_id : null
51+
log_source_identifier = (each.value.sch_source == "streaming" && each.value.sch_target == "loggingAnalytics") ? each.value.target.la_log_source : null
52+
compartment_id = coalesce(each.value.target.compartment_id, var.compartment_ocid)
53+
stream_id = each.value.sch_target == "streaming" ? each.value.target.stream_id : null
54+
bucket = each.value.sch_target == "objectstorage" ? each.value.target.bucket : null
55+
object_name_prefix = each.value.sch_target == "objectstorage" ? each.value.target.object_name_prefix : null
56+
batch_rollover_size_in_mbs = each.value.sch_target == "objectstorage" ? each.value.target.batch_rollover_size_in_mbs : null
57+
batch_rollover_time_in_ms = each.value.sch_target == "objectstorage" ? each.value.target.batch_rollover_time_in_ms : null
58+
topic_id = each.value.sch_target == "notifications" ? each.value.target.topic_id : null
59+
enable_formatted_messaging = each.value.sch_target == "notifications" ? each.value.target.enable_formatted_messaging : null
60+
function_id = each.value.sch_target == "functions" ? each.value.target.function_id : null
61+
62+
}
63+
defined_tags = each.value.defined_tags
64+
description = "Service connector for ${each.value.sch_source} to ${each.value.sch_target}"
65+
freeform_tags = each.value.freeform_tags
66+
dynamic "tasks" {
67+
for_each = each.value.tasks != null ? [1] : []
68+
content {
69+
kind = "logRule"
70+
condition = each.value.tasks.log_condition
71+
}
72+
}
73+
dynamic "tasks" {
74+
for_each = each.value.tasks != null ? [1] : []
75+
content {
76+
77+
kind = "function"
78+
79+
batch_size_in_kbs = each.value.tasks.batch_size_in_kbs
80+
batch_time_in_sec = each.value.tasks.batch_time_in_sec
81+
function_id = each.value.tasks.function_id
82+
}
83+
}
84+
85+
}

modules/serviceconnector/outputs.tf

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#Copyright (c) 2023 Oracle Corporation and/or its affiliates.
2+
#Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl
3+
4+
output "service_connectors" {
5+
description = "Service Connector"
6+
value = { for k in oci_sch_service_connector.this : k.display_name => k.id }
7+
}

modules/serviceconnector/policies.tf

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#Copyright (c) 2023 Oracle Corporation and/or its affiliates.
2+
#Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl
3+
4+
locals {
5+
policy_compartment_id = var.policy_compartment_id == null ? var.tenancy_ocid : var.policy_compartment_id
6+
7+
target_policies = {
8+
for k, v in var.service_connector_def : k => (v.create_policy && v.sch_target == "loggingAnalytics") ? "Allow dynamic-group ${var.dynamic_group_name} to use loganalytics-log-group in compartment id ${coalesce(v.target.compartment_id, var.compartment_ocid)} where target.loganalytics-log-group.id='${v.target.log_group_id}'" :
9+
(v.create_policy && v.sch_target == "notifications") ? "Allow dynamic-group ${var.dynamic_group_name} to use ons-topics in compartment id ${coalesce(v.target.compartment_id, var.compartment_ocid)}" :
10+
(v.create_policy && v.sch_target == "functions") ? "Allow dynamic-group ${var.dynamic_group_name} to use fn-invocation in compartment id ${coalesce(v.target.compartment_id, var.compartment_ocid)}" :
11+
(v.create_policy && v.sch_target == "objectstorage") ? "Allow dynamic-group ${var.dynamic_group_name} to manage objects in compartment id ${coalesce(v.target.compartment_id, var.compartment_ocid)} where target.bucket.name='${coalesce(v.target.bucket_name, "dummy")}'" :
12+
(v.create_policy && v.sch_target == "streaming") ? "Allow dynamic-group ${var.dynamic_group_name} to use stream-push in compartment id ${coalesce(v.target.compartment_id, var.compartment_ocid)} where target.stream.id='${v.target.stream_id}'" : ""
13+
}
14+
source_policies = {
15+
for k, v in var.service_connector_def : k => (v.create_policy && v.sch_source == "streaming") ? "Allow dynamic-group ${var.dynamic_group_name} to {STREAM_READ, STREAM_CONSUME} in compartment id ${coalesce(v.target.compartment_id, var.compartment_ocid)} where target.stream.id='${v.stream_id}'" :
16+
(v.create_policy && v.sch_source == "monitoring") ? "Allow dynamic-group ${var.dynamic_group_name} to read metrics in compartment id ${coalesce(v.target.compartment_id, var.compartment_ocid)}" : ""
17+
}
18+
19+
allpolicies = { for key in distinct(concat(keys(local.target_policies), keys(local.source_policies))) :
20+
key => compact(flatten([lookup(local.target_policies, key, []),
21+
lookup(local.source_policies, key, [])
22+
]))
23+
}
24+
25+
policies = { for k, v in local.allpolicies : k => v if length(v) > 0 }
26+
27+
}
28+
29+
#Create dynamic group
30+
resource "oci_identity_dynamic_group" "serviceconnector_dynamic_group" {
31+
provider = oci.home
32+
33+
count = var.create_dg ? 1 : 0
34+
compartment_id = var.tenancy_ocid
35+
description = "Dynamic group for service connector"
36+
matching_rule = "All {resource.type = 'serviceconnector', resource.compartment.id = '${var.compartment_ocid}'}"
37+
name = var.dynamic_group_name
38+
39+
}
40+
41+
#Create policy for service connector
42+
resource "oci_identity_policy" "serviceconnector_policy" {
43+
provider = oci.home
44+
45+
for_each = local.policies
46+
compartment_id = local.policy_compartment_id
47+
description = format("%s%s", "Policies for service connector ", each.key)
48+
name = format("%s_%s", "serviceconnector", each.key)
49+
statements = each.value
50+
51+
}

modules/serviceconnector/variables.tf

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
#Copyright (c) 2023 Oracle Corporation and/or its affiliates.
2+
#Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl
3+
4+
variable "compartment_ocid" {
5+
description = "Compartment OCID"
6+
type = string
7+
}
8+
9+
variable "create_dg" {
10+
type = bool
11+
description = "Whether to create dynamic group or not"
12+
}
13+
variable "tenancy_ocid" {
14+
description = "Tenancy OCID"
15+
type = string
16+
}
17+
18+
variable "policy_compartment_id" {
19+
type = string
20+
description = "Compartment where policy will be created"
21+
22+
}
23+
24+
variable "dynamic_group_name" {
25+
type = string
26+
description = "Dynamic group display name"
27+
28+
}
29+
30+
variable "service_connector_def" {
31+
type = map(object({
32+
defined_tags = optional(map(string))
33+
freeform_tags = optional(map(string))
34+
display_name = string
35+
description = optional(string)
36+
state = optional(string, "ACTIVE")
37+
sch_source = string
38+
sch_target = string
39+
40+
#For Streaming source
41+
stream_id = optional(string)
42+
stream_cursor = optional(string)
43+
#For logging source
44+
log_source = optional(list(object({
45+
compartment_id = optional(string)
46+
log_group_id = optional(string, "_Audit")
47+
log_id = optional(string)
48+
})))
49+
#For monitoring source
50+
monitoring_source = optional(list(object({
51+
compartment_id = optional(string)
52+
metric_namespace = list(string)
53+
})))
54+
55+
target = object({
56+
#For Objectstorage target
57+
bucket_name = optional(string)
58+
batch_rollover_size_in_mbs = optional(number, 100)
59+
batch_rollover_time_in_ms = optional(number, 420000)
60+
object_name_prefix = optional(string)
61+
#For Streaming target
62+
stream_id = optional(string)
63+
#For Notification target
64+
topic_id = optional(string)
65+
#For Function target
66+
function_id = optional(string)
67+
#For LoggingAnalytics Target
68+
log_group_id = optional(string)
69+
log_source = optional(string)
70+
compartment_id = optional(string)
71+
})
72+
tasks = optional(object({
73+
log_condition = optional(string)
74+
function_id = optional(string)
75+
batch_size_in_kbs = optional(string, 5120)
76+
batch_time_in_sec = optional(string, 600)
77+
78+
}))
79+
}))
80+
validation {
81+
condition = alltrue([
82+
for i in var.service_connector_def : contains(["logging", "monitoring", "streaming"], i.sch_source)])
83+
error_message = "Allowed value for sch_source is logging,monitoring and streaming."
84+
}
85+
validation {
86+
condition = alltrue([
87+
for i in var.service_connector_def : contains(["loggingAnalytics", "objectstorage", "streaming", "notifications"], i.sch_target)])
88+
error_message = "Allowed value for sch_target is loggingAnalytics,notifications,objectstorage and streaming."
89+
}
90+
91+
}

modules/serviceconnector/versions.tf

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#Copyright (c) 2023 Oracle Corporation and/or its affiliates.
2+
#Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl
3+
4+
terraform {
5+
required_providers {
6+
oci = {
7+
source = "oracle/oci"
8+
version = ">= 4.67.3"
9+
configuration_aliases = [oci.home]
10+
}
11+
}
12+
required_version = ">= 1.3.0"
13+
}

0 commit comments

Comments
 (0)