Tiltfile 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. # This Tiltfile contains the deployment and build config for the Pyth Crosschain development environment.
  2. #
  3. # We use Buildkit cache mounts and careful layering to avoid unnecessary rebuilds - almost
  4. # all source code changes result in small, incremental rebuilds. Dockerfiles are written such
  5. # that, for example, changing the contract source code won't cause Solana itself to be rebuilt.
  6. #
  7. load("ext://namespace", "namespace_create", "namespace_inject")
  8. load("ext://secret", "secret_yaml_generic")
  9. allow_k8s_contexts("ci")
  10. # Disable telemetry by default
  11. analytics_settings(False)
  12. # Moar updates (default is 3)
  13. update_settings(max_parallel_updates=10)
  14. # Runtime configuration
  15. config.define_bool("ci", False, "We are running in CI")
  16. config.define_bool("manual", False, "Set TRIGGER_MODE_MANUAL by default")
  17. config.define_string("num", False, "Number of guardian nodes to run")
  18. # You do not usually need to set this argument - this argument is for debugging only. If you do use a different
  19. # namespace, note that the "wormhole" namespace is hardcoded in tests and don't forget specifying the argument
  20. # when running "tilt down".
  21. #
  22. config.define_string("namespace", False, "Kubernetes namespace to use")
  23. # These arguments will enable writing Guardian events to a cloud BigTable instance.
  24. # Writing to a cloud BigTable is optional. These arguments are not required to run the devnet.
  25. config.define_string("gcpProject", False, "GCP project ID for BigTable persistence")
  26. config.define_string("bigTableKeyPath", False, "Path to BigTable json key file")
  27. # When running Tilt on a server, this can be used to set the public hostname Tilt runs on
  28. # for service links in the UI to work.
  29. config.define_string("webHost", False, "Public hostname for port forwards")
  30. # Components
  31. config.define_bool("pyth", False, "Enable Pyth-to-Wormhole component")
  32. cfg = config.parse()
  33. num_guardians = int(cfg.get("num", "1"))
  34. namespace = cfg.get("namespace", "wormhole")
  35. gcpProject = cfg.get("gcpProject", "local-dev")
  36. bigTableKeyPath = cfg.get("bigTableKeyPath", "./event_database/devnet_key.json")
  37. webHost = cfg.get("webHost", "localhost")
  38. ci = cfg.get("ci", False)
  39. if cfg.get("manual", False):
  40. trigger_mode = TRIGGER_MODE_MANUAL
  41. else:
  42. trigger_mode = TRIGGER_MODE_AUTO
  43. # namespace
  44. if not ci:
  45. namespace_create(namespace)
  46. def k8s_yaml_with_ns(objects):
  47. return k8s_yaml(namespace_inject(objects, namespace))
  48. # wasm
  49. local_resource(
  50. name = "wasm-gen",
  51. cmd = "tilt docker build -- -f tilt-devnet/docker-images/Dockerfile.wasm -o type=local,dest=. .",
  52. env = {"DOCKER_BUILDKIT": "1"},
  53. deps = "./wormhole-attester",
  54. labels = ["wasm"],
  55. allow_parallel=True,
  56. trigger_mode = trigger_mode,
  57. )
  58. def build_node_yaml():
  59. node_yaml = read_yaml_stream("tilt-devnet/k8s/node.yaml")
  60. for obj in node_yaml:
  61. if obj["kind"] == "StatefulSet" and obj["metadata"]["name"] == "guardian":
  62. obj["spec"]["replicas"] = num_guardians
  63. container = obj["spec"]["template"]["spec"]["containers"][0]
  64. if container["name"] != "guardiand":
  65. fail("container 0 is not guardiand")
  66. container["command"] += ["--devNumGuardians", str(num_guardians)]
  67. return encode_yaml_stream(node_yaml)
  68. k8s_yaml_with_ns(build_node_yaml())
  69. k8s_resource(
  70. "guardian",
  71. resource_deps = ["eth-devnet", "eth-devnet2", "terra-terrad", "solana-devnet"],
  72. port_forwards = [
  73. port_forward(6060, name = "Debug/Status Server [:6060]", host = webHost),
  74. port_forward(7070, name = "Public gRPC [:7070]", host = webHost),
  75. port_forward(7071, name = "Public REST [:7071]", host = webHost),
  76. port_forward(2345, name = "Debugger [:2345]", host = webHost),
  77. ],
  78. labels = ["guardian"],
  79. trigger_mode = trigger_mode,
  80. )
  81. # spy
  82. k8s_yaml_with_ns("tilt-devnet/k8s/spy.yaml")
  83. k8s_resource(
  84. "spy",
  85. resource_deps = ["guardian"],
  86. port_forwards = [
  87. port_forward(6061, container_port = 6060, name = "Debug/Status Server [:6061]", host = webHost),
  88. port_forward(7072, name = "Spy gRPC [:7072]", host = webHost),
  89. ],
  90. labels = ["guardian"],
  91. trigger_mode = trigger_mode,
  92. )
  93. # solana client cli (used for devnet setup)
  94. docker_build(
  95. ref = "bridge-client",
  96. context = ".",
  97. dockerfile = "tilt-devnet/docker-images/Dockerfile.client",
  98. )
  99. # solana smart contract
  100. docker_build(
  101. ref = "solana-contract",
  102. context = ".",
  103. dockerfile = "tilt-devnet/docker-images/Dockerfile.solana",
  104. )
  105. # solana local devnet
  106. k8s_yaml_with_ns("tilt-devnet/k8s/solana-devnet.yaml")
  107. k8s_resource(
  108. "solana-devnet",
  109. port_forwards = [
  110. port_forward(8899, name = "Solana RPC [:8899]", host = webHost),
  111. port_forward(8900, name = "Solana WS [:8900]", host = webHost),
  112. port_forward(9000, name = "Solana PubSub [:9000]", host = webHost),
  113. ],
  114. labels = ["solana"],
  115. trigger_mode = trigger_mode,
  116. )
  117. # eth devnet
  118. docker_build(
  119. ref = "eth-node",
  120. context = "./",
  121. dockerfile = "tilt-devnet/docker-images/Dockerfile.ethereum",
  122. # sync external scripts for incremental development
  123. # (everything else needs to be restarted from scratch for determinism)
  124. #
  125. # This relies on --update-mode=exec to work properly with a non-root user.
  126. # https://github.com/tilt-dev/tilt/issues/3708
  127. live_update = [
  128. sync("./ethereum/src", "/home/node/app/src"),
  129. ],
  130. )
  131. # pyth autopublisher
  132. docker_build(
  133. ref = "pyth",
  134. context = ".",
  135. dockerfile = "third_party/pyth/Dockerfile.pyth",
  136. )
  137. k8s_yaml_with_ns("./tilt-devnet/k8s/pyth.yaml")
  138. k8s_resource(
  139. "pyth",
  140. resource_deps = ["solana-devnet"],
  141. labels = ["pyth"],
  142. trigger_mode = trigger_mode,
  143. )
  144. # pyth2wormhole client autoattester
  145. docker_build(
  146. ref = "p2w-attest",
  147. context = ".",
  148. dockerfile = "./third_party/pyth/Dockerfile.p2w-attest",
  149. )
  150. k8s_yaml_with_ns("tilt-devnet/k8s/p2w-attest.yaml")
  151. k8s_resource(
  152. "p2w-attest",
  153. resource_deps = ["solana-devnet", "pyth", "guardian"],
  154. port_forwards = [port_forward(3000, name = "metrics", host = webHost)],
  155. labels = ["pyth"],
  156. trigger_mode = trigger_mode,
  157. )
  158. # attestations checking script
  159. docker_build(
  160. ref = "check-attestations",
  161. context = ".",
  162. only = ["./third_party"],
  163. dockerfile = "./third_party/pyth/Dockerfile.check-attestations",
  164. )
  165. k8s_yaml_with_ns("tilt-devnet/k8s/check-attestations.yaml")
  166. k8s_resource(
  167. "check-attestations",
  168. resource_deps = ["pyth-price-service", "pyth", "p2w-attest"],
  169. labels = ["pyth"],
  170. trigger_mode = trigger_mode,
  171. )
  172. # Pyth2wormhole relay
  173. docker_build(
  174. ref = "p2w-relay",
  175. context = ".",
  176. dockerfile = "third_party/pyth/p2w-relay/Dockerfile.pyth_relay",
  177. )
  178. k8s_yaml_with_ns("tilt-devnet/k8s/p2w-terra-relay.yaml")
  179. k8s_resource(
  180. "p2w-terra-relay",
  181. resource_deps = ["pyth", "p2w-attest", "spy", "terra-terrad", "wasm-gen"],
  182. port_forwards = [
  183. port_forward(4200, name = "Rest API (Status + Query) [:4200]", host = webHost),
  184. port_forward(8081, name = "Prometheus [:8081]", host = webHost)],
  185. labels = ["pyth"]
  186. )
  187. k8s_yaml_with_ns("tilt-devnet/k8s/p2w-evm-relay.yaml")
  188. k8s_resource(
  189. "p2w-evm-relay",
  190. resource_deps = ["pyth", "p2w-attest", "spy", "eth-devnet", "wasm-gen"],
  191. port_forwards = [
  192. port_forward(4201, container_port = 4200, name = "Rest API (Status + Query) [:4201]", host = webHost),
  193. port_forward(8082, container_port = 8081, name = "Prometheus [:8082]", host = webHost)],
  194. labels = ["pyth"]
  195. )
  196. # Pyth Price service
  197. docker_build(
  198. ref = "pyth-price-service",
  199. context = ".",
  200. dockerfile = "third_party/pyth/price-service/Dockerfile.price_service",
  201. )
  202. k8s_yaml_with_ns("tilt-devnet/k8s/pyth-price-service.yaml")
  203. k8s_resource(
  204. "pyth-price-service",
  205. resource_deps = ["pyth", "p2w-attest", "spy", "eth-devnet", "wasm-gen"],
  206. port_forwards = [
  207. port_forward(4202, container_port = 4200, name = "Rest API (Status + Query) [:4202]", host = webHost),
  208. port_forward(6202, container_port = 6200, name = "WSS API [:6202]", host = webHost),
  209. port_forward(8083, container_port = 8081, name = "Prometheus [:8083]", host = webHost)],
  210. labels = ["pyth"]
  211. )
  212. k8s_yaml_with_ns("tilt-devnet/k8s/eth-devnet.yaml")
  213. k8s_resource(
  214. "eth-devnet",
  215. port_forwards = [
  216. port_forward(8545, name = "Ganache RPC [:8545]", host = webHost),
  217. ],
  218. labels = ["evm"],
  219. trigger_mode = trigger_mode,
  220. )
  221. k8s_resource(
  222. "eth-devnet2",
  223. port_forwards = [
  224. port_forward(8546, name = "Ganache RPC [:8546]", host = webHost),
  225. ],
  226. labels = ["evm"],
  227. trigger_mode = trigger_mode,
  228. )
  229. # terra devnet
  230. docker_build(
  231. ref = "terra-image",
  232. context = "./target-chains/cosmwasm/devnet",
  233. dockerfile = "./target-chains/cosmwasm/devnet/Dockerfile",
  234. )
  235. docker_build(
  236. ref = "cosmwasm-contracts",
  237. context = ".",
  238. dockerfile = "tilt-devnet/docker-images/Dockerfile.cosmwasm",
  239. )
  240. k8s_yaml_with_ns("tilt-devnet/k8s/terra-devnet.yaml")
  241. k8s_resource(
  242. "terra-terrad",
  243. port_forwards = [
  244. port_forward(26657, name = "Terra RPC [:26657]", host = webHost),
  245. port_forward(1317, name = "Terra LCD [:1317]", host = webHost),
  246. ],
  247. labels = ["terra"],
  248. trigger_mode = trigger_mode,
  249. )
  250. k8s_resource(
  251. "terra-postgres",
  252. labels = ["terra"],
  253. trigger_mode = trigger_mode,
  254. )
  255. k8s_resource(
  256. "terra-fcd",
  257. resource_deps = ["terra-terrad", "terra-postgres"],
  258. port_forwards = [port_forward(3060, name = "Terra FCD [:3060]", host = webHost)],
  259. labels = ["terra"],
  260. trigger_mode = trigger_mode,
  261. )
  262. docker_build(
  263. ref = "prometheus",
  264. context = ".",
  265. dockerfile = "tilt-devnet/docker-images/Dockerfile.prometheus",
  266. )
  267. k8s_yaml_with_ns("tilt-devnet/k8s/prometheus.yaml")
  268. k8s_resource(
  269. "prometheus",
  270. port_forwards = [port_forward(9090, name = "Prometheus dashboard", host = webHost)],
  271. labels = ["prometheus"],
  272. trigger_mode = trigger_mode,
  273. )
  274. docker_build(
  275. ref = "multisig",
  276. context = ".",
  277. dockerfile = "tilt-devnet/docker-images/Dockerfile.multisig",
  278. )
  279. k8s_yaml_with_ns("tilt-devnet/k8s/multisig.yaml")
  280. k8s_resource(
  281. "multisig",
  282. resource_deps = ["solana-devnet"],
  283. labels = ["solana"],
  284. trigger_mode = trigger_mode,
  285. )