|
17 | 17 | import json |
18 | 18 | import os |
19 | 19 | import random |
| 20 | +import shutil |
20 | 21 | import signal |
21 | 22 | import subprocess |
22 | 23 | import time |
|
25 | 26 | from enum import Enum |
26 | 27 | from typing import Any |
27 | 28 |
|
| 29 | +import requests |
28 | 30 | import yaml |
29 | 31 | from semver.version import Version |
30 | 32 |
|
|
41 | 43 | from materialize.mzcompose.services.orchestratord import Orchestratord |
42 | 44 | from materialize.mzcompose.services.testdrive import Testdrive |
43 | 45 | from materialize.util import all_subclasses |
44 | | -from materialize.version_list import get_all_self_managed_versions |
| 46 | +from materialize.version_list import ( |
| 47 | + get_all_self_managed_versions, |
| 48 | + get_self_managed_versions, |
| 49 | +) |
45 | 50 |
|
46 | 51 | SERVICES = [ |
47 | 52 | Testdrive(), |
@@ -1127,6 +1132,125 @@ class Action(Enum): |
1127 | 1132 | UpgradeChain = "upgrade-chain" |
1128 | 1133 |
|
1129 | 1134 |
|
| 1135 | +def workflow_defaults(c: Composition, parser: WorkflowArgumentParser) -> None: |
| 1136 | + current_version = get_tag() |
| 1137 | + |
| 1138 | + # Following https://materialize.com/docs/self-managed/v25.2/installation/install-on-local-kind/ |
| 1139 | + for version in reversed(get_self_managed_versions() + [current_version]): |
| 1140 | + dir = "my-local-mz" |
| 1141 | + if os.path.exists(dir): |
| 1142 | + shutil.rmtree(dir) |
| 1143 | + os.mkdir(dir) |
| 1144 | + spawn.runv(["kind", "delete", "cluster"]) |
| 1145 | + spawn.runv(["kind", "create", "cluster"]) |
| 1146 | + |
| 1147 | + shutil.copyfile( |
| 1148 | + "misc/helm-charts/operator/values.yaml", |
| 1149 | + os.path.join(dir, "sample-values.yaml"), |
| 1150 | + ) |
| 1151 | + files = { |
| 1152 | + "sample-postgres.yaml": "misc/helm-charts/testing/postgres.yaml", |
| 1153 | + "sample-minio.yaml": "misc/helm-charts/testing/minio.yaml", |
| 1154 | + "sample-materialize.yaml": "misc/helm-charts/testing/materialize.yaml", |
| 1155 | + } |
| 1156 | + |
| 1157 | + for file, path in files.items(): |
| 1158 | + if version == current_version: |
| 1159 | + shutil.copyfile(path, os.path.join(dir, file)) |
| 1160 | + else: |
| 1161 | + url = f"https://raw.githubusercontent.com/MaterializeInc/materialize/refs/tags/{version}/{path}" |
| 1162 | + response = requests.get(url) |
| 1163 | + assert ( |
| 1164 | + response.status_code == 200 |
| 1165 | + ), f"Failed to download {file} from {url}: {response.status_code}" |
| 1166 | + with open(os.path.join(dir, file), "wb") as f: |
| 1167 | + f.write(response.content) |
| 1168 | + |
| 1169 | + spawn.runv( |
| 1170 | + [ |
| 1171 | + "helm", |
| 1172 | + "repo", |
| 1173 | + "add", |
| 1174 | + "materialize", |
| 1175 | + "https://materializeinc.github.io/materialize", |
| 1176 | + ] |
| 1177 | + ) |
| 1178 | + spawn.runv(["helm", "repo", "update", "materialize"]) |
| 1179 | + spawn.runv( |
| 1180 | + [ |
| 1181 | + "helm", |
| 1182 | + "install", |
| 1183 | + "my-materialize-operator", |
| 1184 | + "materialize/materialize-operator", |
| 1185 | + "--namespace=materialize", |
| 1186 | + "--create-namespace", |
| 1187 | + "--version", |
| 1188 | + "v25.2.13", # TODO: How to set this version? |
| 1189 | + "--set", |
| 1190 | + "observability.podMetrics.enabled=true", |
| 1191 | + "-f", |
| 1192 | + os.path.join(dir, "sample-values.yaml"), |
| 1193 | + ] |
| 1194 | + ) |
| 1195 | + spawn.runv( |
| 1196 | + ["kubectl", "apply", "-f", os.path.join(dir, "sample-postgres.yaml")] |
| 1197 | + ) |
| 1198 | + spawn.runv(["kubectl", "apply", "-f", os.path.join(dir, "sample-minio.yaml")]) |
| 1199 | + spawn.runv(["kubectl", "get", "all", "-n", "materialize"]) |
| 1200 | + spawn.runv( |
| 1201 | + [ |
| 1202 | + "helm", |
| 1203 | + "repo", |
| 1204 | + "add", |
| 1205 | + "metrics-server", |
| 1206 | + "https://kubernetes-sigs.github.io/metrics-server/", |
| 1207 | + ] |
| 1208 | + ) |
| 1209 | + spawn.runv(["helm", "repo", "update", "metrics-server"]) |
| 1210 | + spawn.runv( |
| 1211 | + [ |
| 1212 | + "helm", |
| 1213 | + "install", |
| 1214 | + "metrics-server", |
| 1215 | + "metrics-server/metrics-server", |
| 1216 | + "--namespace", |
| 1217 | + "kube-system", |
| 1218 | + "--set", |
| 1219 | + "args={--kubelet-insecure-tls,--kubelet-preferred-address-types=InternalIP,Hostname,ExternalIP}", |
| 1220 | + ] |
| 1221 | + ) |
| 1222 | + for i in range(120): |
| 1223 | + try: |
| 1224 | + spawn.capture( |
| 1225 | + [ |
| 1226 | + "kubectl", |
| 1227 | + "get", |
| 1228 | + "crd", |
| 1229 | + "materializes.materialize.cloud", |
| 1230 | + "-n", |
| 1231 | + "materialize", |
| 1232 | + "-o", |
| 1233 | + "name", |
| 1234 | + ], |
| 1235 | + stderr=subprocess.DEVNULL, |
| 1236 | + ) |
| 1237 | + break |
| 1238 | + |
| 1239 | + except subprocess.CalledProcessError: |
| 1240 | + pass |
| 1241 | + time.sleep(1) |
| 1242 | + else: |
| 1243 | + raise ValueError("Never completed") |
| 1244 | + spawn.runv( |
| 1245 | + ["kubectl", "apply", "-f", os.path.join(dir, "sample-materialize.yaml")] |
| 1246 | + ) |
| 1247 | + # TODO: Verify that everything is there: |
| 1248 | + spawn.runv(["kubectl", "get", "all", "-n", "materialize-environment"]) |
| 1249 | + |
| 1250 | + # TODO: Remove the break once environmentId is set in older versions |
| 1251 | + break |
| 1252 | + |
| 1253 | + |
1130 | 1254 | def workflow_default(c: Composition, parser: WorkflowArgumentParser) -> None: |
1131 | 1255 | parser.add_argument( |
1132 | 1256 | "--recreate-cluster", |
|
0 commit comments