Skip to content

Commit 8974f22

Browse files
authored
[eks_argo] Add event triggering support (#56)
* [eks_argo] Add event triggering support * Add some comments * refactor a bit - create a new file argo_events.tf * fix lints * push argo-events stuff into a module - with view to migrate it to metaflow-tools later
1 parent 5b27e96 commit 8974f22

File tree

9 files changed

+281
-6
lines changed

9 files changed

+281
-6
lines changed

examples/eks_argo/argo_events.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module "argo_events" {
2+
depends_on = [helm_release.argo]
3+
source = "./argo_events"
4+
jobs_namespace = "default"
5+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Patterns to ignore when building packages.
2+
# This supports shell glob matching, relative path matching, and
3+
# negation (prefixed with !). Only one pattern per line.
4+
.DS_Store
5+
# Common VCS dirs
6+
.git/
7+
.gitignore
8+
.bzr/
9+
.bzrignore
10+
.hg/
11+
.hgignore
12+
.svn/
13+
# Common backup files
14+
*.swp
15+
*.bak
16+
*.tmp
17+
*.orig
18+
*~
19+
# Various IDEs
20+
.project
21+
.idea/
22+
*.tmproj
23+
.vscode/
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
apiVersion: v2
2+
name: argo-events-helper-chart
3+
description: Helper chart that contains EventBus and EventSource definitions.
4+
type: application
5+
version: 0.1.0
6+
appVersion: "0.1.0"
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
apiVersion: argoproj.io/v1alpha1
2+
kind: EventBus
3+
metadata:
4+
name: default
5+
namespace: {{ .Values.jobsNamespace }}
6+
spec:
7+
jetstream:
8+
version: 2.9.15
9+
containerTemplate:
10+
resources:
11+
limits:
12+
cpu: 100m
13+
memory: 128Mi
14+
requests:
15+
cpu: 100m
16+
memory: 128Mi
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
apiVersion: argoproj.io/v1alpha1
2+
kind: EventSource
3+
metadata:
4+
name: argo-events-webhook
5+
namespace: {{ .Values.jobsNamespace }}
6+
spec:
7+
template:
8+
container:
9+
resources:
10+
requests:
11+
cpu: 50m
12+
memory: 50Mi
13+
limits:
14+
cpu: 50m
15+
memory: 50Mi
16+
service:
17+
ports:
18+
- port: 12000
19+
targetPort: 12000
20+
webhook:
21+
metaflow-event:
22+
port: "12000"
23+
endpoint: /metaflow-event
24+
method: POST
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
jobsNamespace: default

examples/eks_argo/argo_events/main.tf

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
locals {
2+
argo_events_values = {
3+
"configs" = {
4+
"jetstream" = {
5+
"versions" = [
6+
{
7+
"configReloaderImage" = "natsio/nats-server-config-reloader:latest"
8+
"metricsExporterImage" = "natsio/prometheus-nats-exporter:latest"
9+
"natsImage" = "nats:latest"
10+
"startCommand" = "/nats-server"
11+
"version" = "latest"
12+
},
13+
{
14+
"configReloaderImage" = "natsio/nats-server-config-reloader:latest"
15+
"metricsExporterImage" = "natsio/prometheus-nats-exporter:latest"
16+
"natsImage" = "nats:2.9.15"
17+
"startCommand" = "/nats-server"
18+
"version" = "2.9.15"
19+
},
20+
]
21+
}
22+
}
23+
"controller" = {
24+
"name" = "controller-manager"
25+
"rbac" = {
26+
"enabled" = true
27+
"namespaced" = false
28+
}
29+
"resources" = {
30+
"limits" = {
31+
"cpu" = "200m"
32+
"memory" = "192Mi"
33+
}
34+
"requests" = {
35+
"cpu" = "200m"
36+
"memory" = "192Mi"
37+
}
38+
}
39+
"serviceAccount" = {
40+
"create" = true
41+
"name" = "argo-events-events-controller-sa"
42+
}
43+
}
44+
"crds" = {
45+
"keep" = true
46+
}
47+
"extraObjects" = [
48+
{
49+
"apiVersion" = "v1"
50+
"kind" = "ServiceAccount"
51+
"metadata" = {
52+
"name" = "operate-workflow-sa"
53+
"namespace" = var.jobs_namespace
54+
}
55+
},
56+
{
57+
"apiVersion" = "rbac.authorization.k8s.io/v1"
58+
"kind" = "Role"
59+
"metadata" = {
60+
"name" = "operate-workflow-role"
61+
"namespace" = var.jobs_namespace
62+
}
63+
"rules" = [
64+
{
65+
"apiGroups" = [
66+
"argoproj.io",
67+
]
68+
"resources" = [
69+
"workflows",
70+
"workflowtemplates",
71+
"cronworkflows",
72+
"clusterworkflowtemplates",
73+
]
74+
"verbs" = [
75+
"*",
76+
]
77+
},
78+
]
79+
},
80+
{
81+
"apiVersion" = "rbac.authorization.k8s.io/v1"
82+
"kind" = "RoleBinding"
83+
"metadata" = {
84+
"name" = "operate-workflow-role-binding"
85+
"namespace" = var.jobs_namespace
86+
}
87+
"roleRef" = {
88+
"apiGroup" = "rbac.authorization.k8s.io"
89+
"kind" = "Role"
90+
"name" = "operate-workflow-role"
91+
}
92+
"subjects" = [
93+
{
94+
"kind" = "ServiceAccount"
95+
"name" = "operate-workflow-sa"
96+
},
97+
]
98+
},
99+
{
100+
"apiVersion" = "rbac.authorization.k8s.io/v1"
101+
"kind" = "Role"
102+
"metadata" = {
103+
"name" = "view-events-role"
104+
"namespace" = var.jobs_namespace
105+
}
106+
"rules" = [
107+
{
108+
"apiGroups" = [
109+
"argoproj.io",
110+
]
111+
"resources" = [
112+
"eventsources",
113+
"eventbuses",
114+
"sensors",
115+
]
116+
"verbs" = [
117+
"get",
118+
"list",
119+
"watch",
120+
]
121+
},
122+
]
123+
},
124+
{
125+
"apiVersion" = "rbac.authorization.k8s.io/v1"
126+
"kind" = "RoleBinding"
127+
"metadata" = {
128+
"name" = "view-events-role-binding"
129+
"namespace" = var.jobs_namespace
130+
}
131+
"roleRef" = {
132+
"apiGroup" = "rbac.authorization.k8s.io"
133+
"kind" = "Role"
134+
"name" = "view-events-role"
135+
}
136+
"subjects" = [
137+
{
138+
"kind" = "ServiceAccount"
139+
"name" = "argo-workflows"
140+
"namespace" = "argo-workflows"
141+
},
142+
]
143+
},
144+
]
145+
}
146+
}
147+
148+
resource "kubernetes_namespace" "argo_events" {
149+
metadata {
150+
name = "argo-events"
151+
}
152+
}
153+
154+
resource "helm_release" "argo_events" {
155+
name = "argo-events"
156+
157+
repository = "https://argoproj.github.io/argo-helm"
158+
chart = "argo-events"
159+
namespace = kubernetes_namespace.argo_events.metadata[0].name
160+
force_update = true
161+
162+
values = [
163+
yamlencode(local.argo_events_values)
164+
]
165+
}
166+
167+
168+
resource "helm_release" "argo_events_helper_chart" {
169+
# We define an EventBus and EventSource in this helper chart. This is one
170+
# of the cleaner workarounds for the chicken-egg problem with CR and CRD definitions
171+
# in "terraform plan". E.g. Terraform tries to validate the kind "EventBus" before it
172+
# has been created in the cluster, causing the validation to fail.
173+
#
174+
# Mega-thread here: https://github.com/hashicorp/terraform-provider-kubernetes/issues/1367
175+
name = "argo-events-helper-chart"
176+
177+
depends_on = [helm_release.argo_events]
178+
179+
chart = "${path.module}/argo-events-helper-chart"
180+
namespace = kubernetes_namespace.argo_events.metadata[0].name
181+
force_update = true
182+
183+
set {
184+
name = "jobsNamespace"
185+
value = var.jobs_namespace
186+
}
187+
}
188+
189+
variable "jobs_namespace" {
190+
type = string
191+
}

examples/eks_argo/metaflow.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,8 @@ module "metaflow-metadata-service" {
6565

6666
standard_tags = local.tags
6767
}
68+
69+
variable "with_public_ip" {
70+
type = bool
71+
default = true
72+
}

examples/eks_argo/metaflow_config.tf

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,17 @@ data "aws_api_gateway_api_key" "metadata_api_key" {
55
resource "local_file" "foo" {
66
content = jsonencode({
77
"METAFLOW_SERVICE_AUTH_KEY" = data.aws_api_gateway_api_key.metadata_api_key.value
8-
"METAFLOW_DATASTORE_SYSROOT_S3" = module.metaflow-datastore.METAFLOW_DATASTORE_SYSROOT_S3,
9-
"METAFLOW_DATATOOLS_S3ROOT" = module.metaflow-datastore.METAFLOW_DATATOOLS_S3ROOT,
10-
"METAFLOW_SERVICE_URL" = module.metaflow-metadata-service.METAFLOW_SERVICE_URL,
11-
"METAFLOW_KUBERNETES_NAMESPACE" = "default",
12-
"METAFLOW_KUBERNETES_SERVICE_ACCOUNT" = "argo-workflow",
13-
"METAFLOW_DEFAULT_DATASTORE" = "s3",
8+
"METAFLOW_DATASTORE_SYSROOT_S3" = module.metaflow-datastore.METAFLOW_DATASTORE_SYSROOT_S3
9+
"METAFLOW_DATATOOLS_S3ROOT" = module.metaflow-datastore.METAFLOW_DATATOOLS_S3ROOT
10+
"METAFLOW_SERVICE_URL" = module.metaflow-metadata-service.METAFLOW_SERVICE_URL
11+
"METAFLOW_KUBERNETES_NAMESPACE" = "default"
12+
"METAFLOW_KUBERNETES_SERVICE_ACCOUNT" = "argo-workflow"
13+
"METAFLOW_DEFAULT_DATASTORE" = "s3"
1414
"METAFLOW_DEFAULT_METADATA" = "service"
15+
"METAFLOW_ARGO_EVENTS_EVENT_BUS" = "default"
16+
"METAFLOW_ARGO_EVENTS_EVENT_SOURCE" = "argo-events-webhook"
17+
"METAFLOW_ARGO_EVENTS_EVENT" = "metaflow-event"
18+
"METAFLOW_ARGO_EVENTS_WEBHOOK_URL" = "http://argo-events-webhook-eventsource-svc.default:12000/metaflow-event"
1519
})
1620
filename = "${path.module}/config.json"
1721
}

0 commit comments

Comments
 (0)