Skip to content

Commit 65dd241

Browse files
committed
Pull database out of function since its not 1:1 with deployments
1 parent 53b7e47 commit 65dd241

File tree

2 files changed

+510
-4
lines changed

2 files changed

+510
-4
lines changed

src/ol_infrastructure/applications/jupyterhub/__main__.py

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
"""JupyterHub application deployment for MIT Open Learning."""
22

33
from pulumi import Config, StackReference
4+
from pulumi_aws import ec2
45

6+
from bridge.lib.magic_numbers import DEFAULT_POSTGRES_PORT
57
from ol_infrastructure.applications.jupyterhub.deployment import (
68
provision_jupyterhub_deployment,
79
)
10+
from ol_infrastructure.components.aws.database import OLAmazonDB, OLPostgresDBConfig
811
from ol_infrastructure.lib.aws.eks_helper import (
912
check_cluster_namespace,
1013
setup_k8s_provider,
@@ -22,17 +25,21 @@
2225
# Parse stack and setup providers
2326
stack_info = parse_stack()
2427
setup_vault_provider(stack_info)
28+
env_name = f"{stack_info.env_prefix}-{stack_info.env_suffix}"
2529

2630
# Configuration
2731
jupyterhub_config = Config("jupyterhub")
2832
vault_config = Config("vault")
2933

34+
3035
# Stack references
3136
network_stack = StackReference(f"infrastructure.aws.network.{stack_info.name}")
3237
vault_stack = StackReference(f"infrastructure.vault.operations.{stack_info.name}")
3338
cluster_stack = StackReference(f"infrastructure.aws.eks.applications.{stack_info.name}")
3439

3540
# AWS configuration
41+
apps_vpc = network_stack.require_output("applications_vpc")
42+
k8s_pod_subnet_cidrs = apps_vpc["k8s_pod_subnet_cidrs"]
3643
aws_config = AWSBase(
3744
tags={"OU": BusinessUnit.mit_learn, "Environment": stack_info.env_suffix}
3845
)
@@ -68,6 +75,11 @@
6875
jupyterhub_config.get("db_instance_size") or rds_defaults["instance_size"]
6976
)
7077
rds_defaults["use_blue_green"] = False
78+
rds_password = jupyterhub_config.require("rds_password")
79+
80+
target_vpc_name = jupyterhub_config.get("target_vpc") or f"{stack_info.env_prefix}_vpc"
81+
target_vpc = network_stack.require_output(target_vpc_name)
82+
target_vpc_id = target_vpc["id"]
7183

7284
# Extra images for pre-pulling
7385
COURSE_NAMES = [
@@ -108,6 +120,59 @@
108120
for course_name in COURSE_NAMES
109121
}
110122

123+
#### Database setup ####
124+
# The physical database for Jupyterhub is shared across both the main and authoring
125+
# deployments, but we create separate Vault backends for each to manage credentials
126+
# and roles separately.
127+
jupyterhub_db_security_group = ec2.SecurityGroup(
128+
f"jupyterhub-db-security-group-{env_name}",
129+
name=f"jupyterhub-db-{target_vpc_name}-{env_name}",
130+
description="Access from jupyterhub to its own postgres database.",
131+
ingress=[
132+
ec2.SecurityGroupIngressArgs(
133+
security_groups=[
134+
vault_stack.require_output("vault_server")["security_group"],
135+
],
136+
cidr_blocks=[target_vpc["cidr"]],
137+
protocol="tcp",
138+
from_port=DEFAULT_POSTGRES_PORT,
139+
to_port=DEFAULT_POSTGRES_PORT,
140+
description="Access to Postgres from jupyterhub nodes.",
141+
),
142+
ec2.SecurityGroupIngressArgs(
143+
cidr_blocks=k8s_pod_subnet_cidrs,
144+
description="Allow k8s cluster ipblocks to talk to DB",
145+
from_port=DEFAULT_POSTGRES_PORT,
146+
protocol="tcp",
147+
security_groups=[],
148+
to_port=DEFAULT_POSTGRES_PORT,
149+
),
150+
],
151+
tags=aws_config.tags,
152+
vpc_id=target_vpc_id,
153+
)
154+
155+
jupyterhub_db_config = OLPostgresDBConfig(
156+
instance_name=f"jupyterhub-db-{stack_info.env_suffix}",
157+
password=rds_password,
158+
subnet_group_name=target_vpc["rds_subnet"],
159+
security_groups=[jupyterhub_db_security_group],
160+
tags=aws_config.tags,
161+
db_name="jupyterhub",
162+
**rds_defaults,
163+
)
164+
jupyterhub_db = OLAmazonDB(jupyterhub_db_config)
165+
166+
jupyterhub_authoring_db_config = OLPostgresDBConfig(
167+
instance_name=f"jupyterhub-authoring-db-{stack_info.env_suffix}",
168+
password=rds_password,
169+
subnet_group_name=target_vpc["rds_subnet"],
170+
security_groups=[jupyterhub_db_security_group],
171+
tags=aws_config.tags,
172+
db_name="jupyterhub_authoring",
173+
**rds_defaults,
174+
)
175+
111176
# Provision main JupyterHub deployment
112177
jupyterhub_deployment = provision_jupyterhub_deployment(
113178
base_name="jupyterhub",
@@ -116,10 +181,10 @@
116181
stack_info=stack_info,
117182
jupyterhub_config=jupyterhub_config,
118183
vault_config=vault_config,
184+
db_config=jupyterhub_db_config,
185+
app_db=jupyterhub_db,
119186
network_stack=network_stack,
120-
vault_stack=vault_stack,
121187
cluster_stack=cluster_stack,
122-
aws_config=aws_config,
123188
application_labels=application_labels,
124189
k8s_global_labels=k8s_global_labels,
125190
extra_images=EXTRA_IMAGES,
@@ -133,10 +198,10 @@
133198
stack_info=stack_info,
134199
jupyterhub_config=jupyterhub_config,
135200
vault_config=vault_config,
201+
db_config=jupyterhub_authoring_db_config,
202+
app_db=jupyterhub_db,
136203
network_stack=network_stack,
137-
vault_stack=vault_stack,
138204
cluster_stack=cluster_stack,
139-
aws_config=aws_config,
140205
application_labels=application_labels,
141206
k8s_global_labels=k8s_global_labels,
142207
extra_images=EXTRA_IMAGES,

0 commit comments

Comments
 (0)