Skip to content

Commit 55a6da8

Browse files
authored
Resource Manager supports custom Grafana, Ingress and compartment level IAM (#64)
* Resource manager supports custom Grafana and Ingress * Resource manager supports compartment level IAM
1 parent 69acb46 commit 55a6da8

File tree

6 files changed

+297
-3
lines changed

6 files changed

+297
-3
lines changed

oci_lens_terraform/main.tf

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,15 @@ module "app" {
132132
superuser_email = var.superuser_email
133133
grafana_admin_password = var.grafana_admin_password
134134
ingress_domain = var.ingress_domain
135+
use_external_grafana = var.use_external_grafana
136+
grafana_url = var.grafana_url
137+
grafana_api_token = var.grafana_api_token
138+
use_external_ingress = var.use_external_ingress
139+
ingress_cert_manager_cluster_issuer = var.ingress_cert_manager_cluster_issuer
140+
ingress_class_name = var.ingress_class_name
141+
ingress_external_namespace = var.ingress_external_namespace
142+
ingress_external_service_name = var.ingress_external_service_name
143+
authorized_compartments = var.authorized_compartments
135144

136145
# wait for cluster (if new cluster was created)
137146
depends_on = [time_sleep.after_cluster]

oci_lens_terraform/modules/app/main.tf

Lines changed: 83 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ resource "helm_release" "app" {
4242
value = var.tenancy_ocid
4343
}
4444

45+
set {
46+
name = "backend.authorizedCompartments"
47+
value = var.authorized_compartments
48+
}
49+
4550
set {
4651
name = "backend.superuser.username"
4752
value = var.superuser_username
@@ -72,6 +77,80 @@ resource "helm_release" "app" {
7277
value = var.ingress_domain != "" ? var.ingress_domain : "nip.io"
7378
}
7479

80+
# External Grafana configuration
81+
dynamic "set" {
82+
for_each = var.use_external_grafana ? [1] : []
83+
content {
84+
name = "grafana.enabled"
85+
value = "false"
86+
}
87+
}
88+
89+
dynamic "set" {
90+
for_each = var.use_external_grafana && var.grafana_url != "" ? [1] : []
91+
content {
92+
name = "backend.grafanaUrl"
93+
value = var.grafana_url
94+
}
95+
}
96+
97+
dynamic "set" {
98+
for_each = var.use_external_grafana && var.grafana_api_token != "" ? [1] : []
99+
content {
100+
name = "backend.grafanaApiToken"
101+
value = var.grafana_api_token
102+
}
103+
}
104+
105+
# External Ingress and Cert-Manager configuration
106+
dynamic "set" {
107+
for_each = var.use_external_ingress ? [1] : []
108+
content {
109+
name = "cert-manager.enabled"
110+
value = "false"
111+
}
112+
}
113+
114+
dynamic "set" {
115+
for_each = var.use_external_ingress ? [1] : []
116+
content {
117+
name = "ingress-nginx.enabled"
118+
value = "false"
119+
}
120+
}
121+
122+
dynamic "set" {
123+
for_each = var.use_external_ingress && var.ingress_cert_manager_cluster_issuer != "" ? [1] : []
124+
content {
125+
name = "ingress.certManager.clusterIssuer"
126+
value = var.ingress_cert_manager_cluster_issuer
127+
}
128+
}
129+
130+
dynamic "set" {
131+
for_each = var.use_external_ingress && var.ingress_class_name != "" ? [1] : []
132+
content {
133+
name = "ingress.className"
134+
value = var.ingress_class_name
135+
}
136+
}
137+
138+
dynamic "set" {
139+
for_each = var.use_external_ingress && var.ingress_external_namespace != "" ? [1] : []
140+
content {
141+
name = "ingress.external.namespace"
142+
value = var.ingress_external_namespace
143+
}
144+
}
145+
146+
dynamic "set" {
147+
for_each = var.use_external_ingress && var.ingress_external_service_name != "" ? [1] : []
148+
content {
149+
name = "ingress.external.serviceName"
150+
value = var.ingress_external_service_name
151+
}
152+
}
153+
75154
depends_on = [
76155
kubernetes_namespace.ns,
77156
]
@@ -95,6 +174,8 @@ data "kubernetes_ingress_v1" "backend_ingress" {
95174
}
96175

97176
data "kubernetes_ingress_v1" "grafana_ingress" {
177+
count = var.use_external_grafana ? 0 : 1
178+
98179
metadata {
99180
name = "lens-grafana-ingress"
100181
namespace = kubernetes_namespace.ns.metadata[0].name
@@ -113,8 +194,8 @@ data "kubernetes_ingress_v1" "prometheus_ingress" {
113194
# Data source to get the ingress-nginx LoadBalancer IP
114195
data "kubernetes_service_v1" "ingress_nginx_controller" {
115196
metadata {
116-
name = "ingress-nginx-controller"
117-
namespace = kubernetes_namespace.ns.metadata[0].name
197+
name = var.use_external_ingress ? var.ingress_external_service_name : "${helm_release.app.name}-ingress-nginx-controller"
198+
namespace = var.use_external_ingress ? var.ingress_external_namespace : kubernetes_namespace.ns.metadata[0].name
118199
}
119200
depends_on = [helm_release.app]
120201
}

oci_lens_terraform/modules/app/outputs.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ output "backend_ingress_host" {
5454

5555
output "grafana_ingress_host" {
5656
description = "The ingress host for Grafana"
57-
value = try(data.kubernetes_ingress_v1.grafana_ingress.spec[0].rule[0].host, "")
57+
value = var.use_external_grafana ? "" : try(data.kubernetes_ingress_v1.grafana_ingress[0].spec[0].rule[0].host, "")
5858
}
5959

6060
output "prometheus_ingress_host" {

oci_lens_terraform/modules/app/variables.tf

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ variable "policy_name" {
3939
default = "lens-backend-workload-policy"
4040
}
4141

42+
variable "authorized_compartments" {
43+
description = "Comma-separated list of compartment OCIDs to grant IAM policy access. Leave blank to authorize access to the whole tenancy."
44+
type = string
45+
default = ""
46+
}
47+
4248
variable "superuser_username" {
4349
description = "Username for the superuser of Lens API Backend"
4450
type = string
@@ -65,4 +71,53 @@ variable "ingress_domain" {
6571
description = "Domain for ingress. Empty string defaults to nip.io."
6672
type = string
6773
default = ""
74+
}
75+
76+
variable "use_external_grafana" {
77+
description = "Use your own Grafana instance instead of deploying one."
78+
type = bool
79+
default = false
80+
}
81+
82+
variable "grafana_url" {
83+
description = "URL of your existing Grafana instance."
84+
type = string
85+
default = ""
86+
}
87+
88+
variable "grafana_api_token" {
89+
description = "API token for authenticating with your existing Grafana instance."
90+
type = string
91+
sensitive = true
92+
default = ""
93+
}
94+
95+
variable "use_external_ingress" {
96+
description = "Use your own ingress controller and cert-manager instead of deploying them."
97+
type = bool
98+
default = false
99+
}
100+
101+
variable "ingress_cert_manager_cluster_issuer" {
102+
description = "Name of your existing cert-manager ClusterIssuer for TLS certificate management."
103+
type = string
104+
default = ""
105+
}
106+
107+
variable "ingress_class_name" {
108+
description = "Ingress class name for your existing ingress controller."
109+
type = string
110+
default = ""
111+
}
112+
113+
variable "ingress_external_namespace" {
114+
description = "Namespace where your existing ingress controller service is deployed."
115+
type = string
116+
default = ""
117+
}
118+
119+
variable "ingress_external_service_name" {
120+
description = "Service name of your existing ingress controller."
121+
type = string
122+
default = ""
68123
}

oci_lens_terraform/schema.yaml

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,21 @@ variableGroups:
2424
- ingress_domain
2525
- create_iam_policy
2626
- policy_name
27+
- authorized_compartments
28+
- title: "Grafana Configuration"
29+
visible: true
30+
variables:
31+
- use_external_grafana
32+
- grafana_url
33+
- grafana_api_token
34+
- title: "Ingress and Cert-Manager Configuration"
35+
visible: true
36+
variables:
37+
- use_external_ingress
38+
- ingress_cert_manager_cluster_issuer
39+
- ingress_class_name
40+
- ingress_external_namespace
41+
- ingress_external_service_name
2742

2843
variables:
2944
tenancy_ocid:
@@ -84,6 +99,12 @@ variables:
8499
and:
85100
- create_iam_policy
86101

102+
authorized_compartments:
103+
type: string
104+
title: "Authorized Compartments"
105+
description: "Compartment OCID to grant IAM policy access. Leave blank to authorize access to the whole tenancy."
106+
default: ""
107+
87108
superuser_username:
88109
type: string
89110
title: "Superuser Username"
@@ -110,6 +131,79 @@ variables:
110131
sensitive: true
111132
default: "admin123"
112133

134+
use_external_grafana:
135+
type: boolean
136+
title: "Use External Grafana"
137+
description: "Use your own Grafana instance instead of deploying one. If enabled, Grafana will not be deployed and you must provide Grafana URL and API token."
138+
default: false
139+
140+
grafana_url:
141+
type: string
142+
title: "Grafana URL"
143+
description: "URL of your existing Grafana instance (e.g., http://grafana-service.namespace.svc.cluster.local:80 or http://your-grafana-domain.com)."
144+
default: ""
145+
required: true
146+
visible:
147+
and:
148+
- use_external_grafana
149+
150+
grafana_api_token:
151+
type: string
152+
title: "Grafana API Token"
153+
description: "API token for authenticating with your existing Grafana instance. Create one in Grafana under Administration > Users and Access > Service Accounts with admin rights."
154+
sensitive: true
155+
default: ""
156+
required: true
157+
visible:
158+
and:
159+
- use_external_grafana
160+
161+
use_external_ingress:
162+
type: boolean
163+
title: "Use External Ingress and Cert-Manager"
164+
description: "Use your own ingress controller and cert-manager instead of deploying them. If enabled, cert-manager and ingress-nginx will not be deployed."
165+
default: false
166+
167+
ingress_cert_manager_cluster_issuer:
168+
type: string
169+
title: "Cert-Manager Cluster Issuer"
170+
description: "Name of your existing cert-manager ClusterIssuer for TLS certificate management."
171+
default: ""
172+
required: true
173+
visible:
174+
and:
175+
- use_external_ingress
176+
177+
ingress_class_name:
178+
type: string
179+
title: "Ingress Class Name"
180+
description: "Ingress class name for your existing ingress controller."
181+
default: ""
182+
required: true
183+
visible:
184+
and:
185+
- use_external_ingress
186+
187+
ingress_external_namespace:
188+
type: string
189+
title: "External Ingress Namespace"
190+
description: "Namespace where your existing ingress controller service is deployed."
191+
default: ""
192+
required: true
193+
visible:
194+
and:
195+
- use_external_ingress
196+
197+
ingress_external_service_name:
198+
type: string
199+
title: "External Ingress Service Name"
200+
description: "Service name of your existing ingress controller."
201+
default: ""
202+
required: true
203+
visible:
204+
and:
205+
- use_external_ingress
206+
113207
outputs:
114208
# OCI GPU Scanner Portal
115209
portal_url:

oci_lens_terraform/variables.tf

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ variable "policy_name" {
3232
default = "lens-backend-workload-policy"
3333
}
3434

35+
variable "authorized_compartments" {
36+
description = "Comma-separated list of compartment OCIDs to grant IAM policy access (e.g., ocid1.compartment.oc1..xxx,ocid1.compartment.oc1..yyy). Leave blank to authorize access to the whole tenancy."
37+
type = string
38+
default = ""
39+
}
40+
3541
variable "superuser_username" {
3642
description = "Username for OCI GPU Scanner portal and backend API"
3743
type = string
@@ -62,4 +68,53 @@ variable "ingress_domain" {
6268
description = "Domain for ingress. Leave empty to use nip.io (wildcard DNS service)."
6369
type = string
6470
default = ""
71+
}
72+
73+
variable "use_external_grafana" {
74+
description = "Use your own Grafana instance instead of deploying one."
75+
type = bool
76+
default = false
77+
}
78+
79+
variable "grafana_url" {
80+
description = "URL of your existing Grafana instance."
81+
type = string
82+
default = ""
83+
}
84+
85+
variable "grafana_api_token" {
86+
description = "API token for authenticating with your existing Grafana instance."
87+
type = string
88+
sensitive = true
89+
default = ""
90+
}
91+
92+
variable "use_external_ingress" {
93+
description = "Use your own ingress controller and cert-manager instead of deploying them."
94+
type = bool
95+
default = false
96+
}
97+
98+
variable "ingress_cert_manager_cluster_issuer" {
99+
description = "Name of your existing cert-manager ClusterIssuer for TLS certificate management."
100+
type = string
101+
default = ""
102+
}
103+
104+
variable "ingress_class_name" {
105+
description = "Ingress class name for your existing ingress controller."
106+
type = string
107+
default = ""
108+
}
109+
110+
variable "ingress_external_namespace" {
111+
description = "Namespace where your existing ingress controller service is deployed."
112+
type = string
113+
default = ""
114+
}
115+
116+
variable "ingress_external_service_name" {
117+
description = "Service name of your existing ingress controller."
118+
type = string
119+
default = ""
65120
}

0 commit comments

Comments
 (0)