Compare commits

...
63 Commits
Author SHA1 Message Date
dboreham 9a750f0d9e Update version
Former-commit-id: 10f2fbaa37
2023-01-30 22:28:33 +01:00
dboreham 8a6ba6d01b Merge pull request #172 from cerc-io/dboreham/revert-foundry-image
Revert local foundry build

Former-commit-id: 3bd0c74e1f
2023-01-30 22:06:26 +01:00
dboreham b4ddef7ff0 Revert local foundry build
Former-commit-id: e850923e1a
2023-01-30 14:05:48 -07:00
dboreham a38ac5470d Merge pull request #171 from cerc-io/dboreham/fixturenet-loaded
Initial commit

Former-commit-id: 82c2bb78f2
2023-01-30 19:12:06 +01:00
dboreham 77380aec94 Initial commit
Former-commit-id: f01bc27660
2023-01-30 16:53:57 +01:00
dboreham ce7e5f2d82 Merge pull request #169 from cerc-io/dboreham/fix-gerbil-package-install
Install gerbil packages globally not locally in the project directory

Former-commit-id: db5775621d
2023-01-28 11:35:44 -07:00
dboreham 4dda8e2a87 Install gerbil packages globally not locally in the project directory
Former-commit-id: 5928e40721
2023-01-28 18:56:43 +01:00
dboreham 24ab259741 Merge pull request #167 from cerc-io/dboreham/release-doc
Add release process doc

Former-commit-id: 605a9aeda1
2023-01-27 22:25:53 -07:00
David Boreham 607575e4f4 Add release process doc
Former-commit-id: 1b3a14d86f
2023-01-27 21:22:43 -07:00
dboreham 86e245e272 Merge pull request #166 from cerc-io/dboreham/fix-fixturenet-status
Fix status script

Former-commit-id: fc31b44b5a
2023-01-27 08:10:32 -07:00
dboreham d677e5f369 Fix status script
Former-commit-id: 5a3bdd269d
2023-01-27 08:10:04 -07:00
dboreham 9991baa8d6 Update version
Former-commit-id: 04f61293b5
2023-01-27 07:30:14 -07:00
dboreham d033d4ff93 Merge pull request #164 from cerc-io/dboreham/fixturenet-eth-fixes
Fixes to fixturenet-eth

Former-commit-id: ecf943b593
2023-01-26 21:36:23 -07:00
dboreham f02bbee3bf Fixes to fixturenet-eth
Former-commit-id: e4229e4ceb
2023-01-26 16:47:06 -07:00
telackey bdde1b2c9e Include all eth API operation metrics. (#162)
Former-commit-id: ce0c7ee9ba
2023-01-26 13:53:02 -06:00
dboreham 96a83422e7 Merge pull request #161 from cerc-io/dboreham/run-command-in-container
Exec command inside container

Former-commit-id: 6770f7af6e
2023-01-25 23:22:57 -07:00
dboreham af03208da7 Exec command inside container
Former-commit-id: ade20fb2f5
2023-01-25 23:22:05 -07:00
dboreham 86e2407800 Update version
Former-commit-id: bf91048dbb
2023-01-25 22:47:08 -07:00
dboreham c01ff28b4f Add release description
Former-commit-id: a520cce17c
2023-01-25 22:46:37 -07:00
dboreham ec54258285 Merge pull request #159 from cerc-io/dboreham/enhanced-publish-script
Better publish scripts

Former-commit-id: e1421045eb
2023-01-25 22:40:24 -07:00
dboreham 1f2ee33b42 Update version
Former-commit-id: 0b08d7ba65
2023-01-25 22:38:25 -07:00
dboreham a2b700727c Better publish scripts
Former-commit-id: 7fdf9bc4db
2023-01-25 22:37:43 -07:00
dboreham fa8ba7f9ef Merge pull request #158 from cerc-io/dboreham/publish-package
Basic GitHub release publishing script

Former-commit-id: a144dde4c1
2023-01-25 14:34:19 -07:00
dboreham dd0b8ae81f Basic GitHub release publishing script
Former-commit-id: 465d16e50f
2023-01-25 14:28:41 -07:00
telackey b5c7ad114c Integrate grafana/prometheus with fixturenet-eth. (#156)
* Integrate grafana/prometheus with fixturenet-eth.

* Integrate grafana/prometheus with fixturenet-eth.

* Revert port change

* EOL

* EOL

* Simplify ipld-eth-server config.

Former-commit-id: c279bd49a4
2023-01-25 11:50:08 -06:00
dboreham d0d29717e1 Update version
Former-commit-id: 080451f3df
2023-01-24 08:27:12 -07:00
dboreham 368091e125 Merge pull request #155 from cerc-io/dboreham/stack-test
Add stack tests

Former-commit-id: 8b19e0f194
2023-01-24 08:19:51 -07:00
dboreham 27195fc977 Add stack tests
Former-commit-id: c80ed2b245
2023-01-24 08:19:24 -07:00
Zach 91ad0f39e6 Merge pull request #144 from cerc-io/docs-updates
Docs updates

Former-commit-id: 3cef5eb262
2023-01-24 09:14:45 -05:00
dboreham b47b2200ce Merge pull request #154 from cerc-io/dboreham/port-command
Implement deploy-system port command

Former-commit-id: 208df97c96
2023-01-23 22:12:14 -07:00
David Boreham 2e291b3e4c Add trailing newline
Former-commit-id: 5f22afc78b
2023-01-23 22:11:24 -07:00
David Boreham 629e484c30 Implement deploy-system port command
Former-commit-id: ea6f932e00
2023-01-23 22:09:56 -07:00
dboreham 3d7d23b68b Merge pull request #151 from cerc-io/dboreham/build-foundry-local
Build foundry container locally

Former-commit-id: 9464c47163
2023-01-23 17:09:11 -07:00
dboreham c6c9e229d2 Revert debugging code
Former-commit-id: 14e57abfbf
2023-01-23 17:07:23 -07:00
telackey c77cc4e111 Update keycloak to include X-User-Id header. (#147)
Former-commit-id: 65cdba7705
2023-01-23 10:39:15 -06:00
dboreham 26c654f3ef Merge pull request #153 from cerc-io/dboreham/add-guile-to-gerbil-builder
Add guile to gertbil builder container

Former-commit-id: 5b9b259494
2023-01-23 08:00:46 -07:00
dboreham b6a84db6a2 Add guile to gertbil builder container
Former-commit-id: c7970d09b3
2023-01-23 08:00:24 -07:00
dboreham e7d31e78ad Merge pull request #150 from cerc-io/dboreham/gerbil-builder
Add gerbil builder container

Former-commit-id: f982a7632e
2023-01-23 07:24:55 -07:00
dboreham 86b7e6957c Enhance readme
Former-commit-id: 4ab84eb7ca
2023-01-23 07:24:27 -07:00
dboreham 7812490434 Merge pull request #152 from cerc-io/dboreham/fix-fixturenet-eth-stack
Fix stack file

Former-commit-id: fb8eabb28e
2023-01-23 06:52:27 -07:00
dboreham 161cd37b9c Fix stack file
Former-commit-id: a12e06dcbb
2023-01-23 06:51:51 -07:00
David Boreham e183e2a880 Build foundry container locally
Former-commit-id: f3f4033937
2023-01-22 22:19:23 -07:00
dboreham 7bd8045d6e Fix bugs
Former-commit-id: 46bcc2f882
2023-01-22 22:12:05 -07:00
dboreham b2268a6518 Add gerbil builder container
Former-commit-id: 8843b894e2
2023-01-22 21:50:50 -07:00
zramsay dfef77f35f update CONTRIBUTING
Former-commit-id: d3f63b8975
2023-01-20 11:35:57 -05:00
zramsay 78cd4e2e3e fixup spec
Former-commit-id: 00c1515807
2023-01-20 11:21:14 -05:00
zramsay dca9a36633 stack diagram: fix diagram & compress img
Former-commit-id: 4c84896090
2023-01-20 11:04:24 -05:00
Zach e799c9eaef Merge pull request #138 from cerc-io/fix-pods
Fix pods (db -> ipld-eth-db)

Former-commit-id: 59a9714d19
2023-01-20 09:38:54 -05:00
zramsay 42dac0e712 db -> ipld-eth-db
Former-commit-id: e9c24a0b82
2023-01-20 08:03:54 -05:00
dboreham a44c063e5a Update version
Former-commit-id: c949fe091f
2023-01-19 14:21:33 -07:00
dboreham 6ad2684de3 Update version
Former-commit-id: 1cdf0f3015
2023-01-19 14:21:13 -07:00
dboreham 5e7b51ee6a Update version
Former-commit-id: 6ae86dbcec
2023-01-19 14:19:39 -07:00
dboreham 50103fcc9c Merge pull request #137 from cerc-io/dboreham/missing-stack-error
Error check stack config

Former-commit-id: edbf674df7
2023-01-19 14:14:34 -07:00
dboreham edb7346f31 Error check stack config
Former-commit-id: d454a4ffc1
2023-01-19 14:13:57 -07:00
dboreham 377d18d540 Merge pull request #136 from cerc-io/dboreham/small-fixes
Some small fixes

Former-commit-id: cefe10d124
2023-01-19 13:39:06 -07:00
dboreham 6ed90536cf Implement continue on error for npm builds
Former-commit-id: 34aa613d04
2023-01-19 13:38:04 -07:00
dboreham 7d00228ca2 Remove result code check
Former-commit-id: 6faa933d42
2023-01-19 13:30:01 -07:00
dboreham 8f9f23b1c4 Implement stop on error building containers
Former-commit-id: bbbb57ec06
2023-01-19 13:20:53 -07:00
dboreham 429e04f81d Catch docker run exceptions
Former-commit-id: 68c7f91052
2023-01-19 13:00:35 -07:00
dboreham 7a9926b695 Remove extraneous stderr output
Former-commit-id: 3b5efc8f0f
2023-01-19 13:00:06 -07:00
dboreham 0372504f44 Merge pull request #135 from cerc-io/dboreham/fix-npm-builds
Fix various npm build issues

Former-commit-id: d94ed55642
2023-01-19 11:34:19 -07:00
dboreham b29537ad7c Fix various npm build issues
Former-commit-id: 9fb96d8458
2023-01-19 11:33:34 -07:00
dboreham 1cf58c900e Update version
Former-commit-id: d05a47946a
2023-01-18 22:07:04 -07:00
55 changed files with 2023 additions and 151 deletions
+4 -4
View File
@@ -8,9 +8,9 @@ Stack Orchestrator allows building and deployment of a Laconic Stack on a single
Ensure that the following are already installed: Ensure that the following are already installed:
- [Python3](https://wiki.python.org/moin/BeginnersGuide/Download) - [Python3](https://wiki.python.org/moin/BeginnersGuide/Download): `python3 --version` >= `3.10.8`
- [Docker](https://docs.docker.com/get-docker/) - [Docker](https://docs.docker.com/get-docker/): `docker --version` >= `20.10.21`
- [Docker Compose](https://docs.docker.com/compose/install/) - [Docker Compose](https://docs.docker.com/compose/install/): `docker-compose --version` >= `2.13.0`
Note: if installing docker-compose via package manager (as opposed to Docker Desktop), you must [install the plugin](https://docs.docker.com/compose/install/linux/#install-the-plugin-manually), e.g., on Linux: Note: if installing docker-compose via package manager (as opposed to Docker Desktop), you must [install the plugin](https://docs.docker.com/compose/install/linux/#install-the-plugin-manually), e.g., on Linux:
@@ -97,7 +97,7 @@ laconic-so --verbose deploy-system --include ipld-eth-db,go-ethereum-foundry,ipl
## Contributing ## Contributing
See the [CONTRIBUTING.md](.github/CONTRIBUTING.md) for developer mode install. See the [CONTRIBUTING.md](/docs/CONTRIBUTING.md) for developer mode install.
## Platform Support ## Platform Support
+15 -12
View File
@@ -1,4 +1,4 @@
# Copyright © 2022 Cerc # Copyright © 2022, 2023 Cerc
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by # it under the terms of the GNU Affero General Public License as published by
@@ -21,13 +21,13 @@
# TODO: display the available list of containers; allow re-build of either all or specific containers # TODO: display the available list of containers; allow re-build of either all or specific containers
import os import os
import sys
from decouple import config from decouple import config
import subprocess import subprocess
import click import click
import importlib.resources import importlib.resources
from pathlib import Path from pathlib import Path
import yaml from .util import include_exclude_check, get_parsed_stack_config
from .util import include_exclude_check
# TODO: find a place for this # TODO: find a place for this
# epilog="Config provided either in .env or settings.ini or env vars: CERC_REPO_BASE_DIR (defaults to ~/cerc)" # epilog="Config provided either in .env or settings.ini or env vars: CERC_REPO_BASE_DIR (defaults to ~/cerc)"
@@ -45,6 +45,7 @@ def command(ctx, include, exclude):
dry_run = ctx.obj.dry_run dry_run = ctx.obj.dry_run
local_stack = ctx.obj.local_stack local_stack = ctx.obj.local_stack
stack = ctx.obj.stack stack = ctx.obj.stack
continue_on_error = ctx.obj.continue_on_error
# See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure
container_build_dir = Path(__file__).absolute().parent.joinpath("data", "container-build") container_build_dir = Path(__file__).absolute().parent.joinpath("data", "container-build")
@@ -68,13 +69,8 @@ def command(ctx, include, exclude):
containers_in_scope = [] containers_in_scope = []
if stack: if stack:
# In order to be compatible with Python 3.8 we need to use this hack to get the path: stack_config = get_parsed_stack_config(stack)
# See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure containers_in_scope = stack_config['containers']
stack_file_path = Path(__file__).absolute().parent.joinpath("data", "stacks", stack, "stack.yml")
with stack_file_path:
stack_config = yaml.safe_load(open(stack_file_path, "r"))
# TODO: syntax check the input here
containers_in_scope = stack_config['containers']
else: else:
containers_in_scope = all_containers containers_in_scope = all_containers
@@ -112,8 +108,15 @@ def command(ctx, include, exclude):
if verbose: if verbose:
print(f"Executing: {build_command}") print(f"Executing: {build_command}")
build_result = subprocess.run(build_command, shell=True, env=container_build_env) build_result = subprocess.run(build_command, shell=True, env=container_build_env)
# TODO: check result in build_result.returncode if verbose:
print(f"Result is: {build_result}") print(f"Return code is: {build_result.returncode}")
if build_result.returncode != 0:
print(f"Error running build for {container}")
if not continue_on_error:
print("FATAL Error: container build failed and --continue-on-error not set, exiting")
sys.exit(1)
else:
print("****** Container Build Error, continuing because --continue-on-error is set")
else: else:
print("Skipped") print("Skipped")
+30 -24
View File
@@ -1,4 +1,4 @@
# Copyright © 2022 Cerc # Copyright © 2022, 2023 Cerc
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by # it under the terms of the GNU Affero General Public License as published by
@@ -19,13 +19,12 @@
# CERC_REPO_BASE_DIR defaults to ~/cerc # CERC_REPO_BASE_DIR defaults to ~/cerc
import os import os
import sys
from decouple import config from decouple import config
import click import click
import importlib.resources import importlib.resources
from pathlib import Path from python_on_whales import docker, DockerException
from python_on_whales import docker from .util import include_exclude_check, get_parsed_stack_config
import yaml
from .util import include_exclude_check
@click.command() @click.command()
@click.option('--include', help="only build these packages") @click.option('--include', help="only build these packages")
@@ -40,6 +39,7 @@ def command(ctx, include, exclude):
local_stack = ctx.obj.local_stack local_stack = ctx.obj.local_stack
debug = ctx.obj.debug debug = ctx.obj.debug
stack = ctx.obj.stack stack = ctx.obj.stack
continue_on_error = ctx.obj.continue_on_error
if local_stack: if local_stack:
dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")]
@@ -60,13 +60,9 @@ def command(ctx, include, exclude):
packages_in_scope = [] packages_in_scope = []
if stack: if stack:
# In order to be compatible with Python 3.8 we need to use this hack to get the path: stack_config = get_parsed_stack_config(stack)
# See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure # TODO: syntax check the input here
stack_file_path = Path(__file__).absolute().parent.joinpath("data", "stacks", stack, "stack.yml") packages_in_scope = stack_config['npms']
with stack_file_path:
stack_config = yaml.safe_load(open(stack_file_path, "r"))
# TODO: syntax check the input here
packages_in_scope = stack_config['npms']
else: else:
packages_in_scope = all_packages packages_in_scope = all_packages
@@ -84,18 +80,28 @@ def command(ctx, include, exclude):
if verbose: if verbose:
print(f"Executing: {build_command}") print(f"Executing: {build_command}")
envs = {"CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"]} | ({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) envs = {"CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"]} | ({"CERC_SCRIPT_DEBUG": "true"} if debug else {})
build_result = docker.run("cerc/builder-js", try:
remove=True, docker.run("cerc/builder-js",
interactive=True, remove=True,
tty=True, interactive=True,
user=f"{os.getuid()}:{os.getgid()}", tty=True,
envs=envs, user=f"{os.getuid()}:{os.getgid()}",
add_hosts=[("gitea.local", "host-gateway")], envs=envs,
volumes=[(repo_full_path, "/workspace")], add_hosts=[("gitea.local", "host-gateway")],
command=build_command volumes=[(repo_full_path, "/workspace")],
) command=build_command
# TODO: check result in build_result.returncode )
print(f"Result is: {build_result}") # Note that although the docs say that build_result should contain
# the command output as a string, in reality it is always the empty string.
# Since we detect errors via catching exceptions below, we can safely ignore it here.
except DockerException as e:
print(f"Error executing build for {package} in container:\n {e}")
if not continue_on_error:
print("FATAL Error: build failed and --continue-on-error not set, exiting")
sys.exit(1)
else:
print("****** Build Error, continuing because --continue-on-error is set")
else: else:
print("Skipped") print("Skipped")
@@ -0,0 +1,23 @@
version: "3.2"
services:
prometheus:
restart: always
image: prom/prometheus
depends_on:
fixturenet-eth-geth-1:
condition: service_healthy
volumes:
- ../config/fixturenet-eth-metrics/prometheus/etc:/etc/prometheus
ports:
- "9090"
grafana:
restart: always
image: grafana/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=changeme6325
volumes:
- ../config/fixturenet-eth-metrics/grafana/etc/provisioning/dashboards:/etc/grafana/provisioning/dashboards
- ../config/fixturenet-eth-metrics/grafana/etc/provisioning/datasources:/etc/grafana/provisioning/datasources
- ../config/fixturenet-eth-metrics/grafana/etc/dashboards:/etc/grafana/dashboards
ports:
- "3000"
@@ -20,6 +20,7 @@ services:
CERC_REMOTE_DEBUG: "true" CERC_REMOTE_DEBUG: "true"
CERC_RUN_STATEDIFF: "detect" CERC_RUN_STATEDIFF: "detect"
CERC_STATEDIFF_DB_NODE_ID: 1 CERC_STATEDIFF_DB_NODE_ID: 1
CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG}
env_file: env_file:
- ../config/fixturenet-eth/fixturenet-eth.env - ../config/fixturenet-eth/fixturenet-eth.env
image: cerc/fixturenet-eth-geth:local image: cerc/fixturenet-eth-geth:local
@@ -20,16 +20,24 @@ services:
DATABASE_USER: "vdbm" DATABASE_USER: "vdbm"
DATABASE_PASSWORD: "password" DATABASE_PASSWORD: "password"
ETH_CHAIN_ID: 99 ETH_CHAIN_ID: 99
ETH_FORWARD_ETH_CALLS: $eth_forward_eth_calls ETH_FORWARD_ETH_CALLS: "false"
ETH_PROXY_ON_ERROR: $eth_proxy_on_error ETH_FORWARD_GET_STORAGE_AT: "false"
ETH_HTTP_PATH: $eth_http_path ETH_PROXY_ON_ERROR: "false"
METRICS: "true"
PROM_HTTP: "true"
PROM_HTTP_ADDR: "0.0.0.0"
PROM_HTTP_PORT: "8090"
LOGRUS_LEVEL: "debug"
CERC_REMOTE_DEBUG: "true"
volumes: volumes:
- type: bind - type: bind
source: ../config/ipld-eth-server/chain.json source: ../config/ipld-eth-server/chain.json
target: /tmp/chain.json target: /tmp/chain.json
ports: ports:
- "127.0.0.1:8081:8081" - "8081"
- "127.0.0.1:8082:8082" - "8082"
- "8090"
- "40000"
healthcheck: healthcheck:
test: ["CMD", "nc", "-v", "localhost", "8081"] test: ["CMD", "nc", "-v", "localhost", "8081"]
interval: 20s interval: 20s
@@ -29,9 +29,17 @@ services:
condition: service_healthy condition: service_healthy
keycloak-nginx: keycloak-nginx:
image: nginx:1.23-alpine image: nginx:1.23-alpine
restart: always
volumes: volumes:
- ../config/keycloak/nginx:/etc/nginx/conf.d - ../config/keycloak/nginx:/etc/nginx/conf.d
ports: ports:
- 80 - 80
depends_on: depends_on:
- keycloak - keycloak
keycloak-nginx-prometheus-exporter:
image: nginx/nginx-prometheus-exporter
restart: always
environment:
- SCRAPE_URI=http://keycloak-nginx:80/stub_status
depends_on:
- keycloak-nginx
@@ -1,21 +0,0 @@
version: "3.2"
services:
# If you want prometheus to work, you must update the following file in the ops repo locally.
# localhost:6060 --> go-ethereum:6060
prometheus:
restart: always
user: "987"
image: prom/prometheus
volumes:
- ${cerc_ops}/metrics/etc:/etc/prometheus
- ./prometheus-data:/prometheus
ports:
- "127.0.0.1:9090:9090"
grafana:
restart: always
user: "472"
image: grafana/grafana
volumes:
- ./grafana-data:/var/lib/grafana
ports:
- "127.0.0.1:3000:3000"
+2
View File
@@ -3,3 +3,5 @@ services:
test: test:
image: cerc/test-container:local image: cerc/test-container:local
restart: always restart: always
ports:
- "80"
@@ -0,0 +1,9 @@
apiVersion: 1
providers:
- name: dashboards
type: file
updateIntervalSeconds: 10
options:
path: /etc/grafana/dashboards
foldersFromFilesStructure: true
@@ -0,0 +1,19 @@
apiVersion: 1
datasources:
- id: 1
uid: jZUuGao4k
orgId: 1
name: Prometheus
type: prometheus
typeName: Prometheus
typeLogoUrl: public/app/plugins/datasource/prometheus/img/prometheus_logo.svg
access: proxy
url: http://prometheus:9090
user: ""
database: ""
basicAuth: false
isDefault: true
jsonData:
httpMethod: POST
readOnly: false
@@ -0,0 +1,34 @@
global:
scrape_interval: 5s
evaluation_interval: 15s
scrape_configs:
# ipld-eth-server
- job_name: 'ipld-eth-server'
metrics_path: /metrics
scrape_interval: 5s
static_configs:
- targets: ['ipld-eth-server:8090']
# geth
- job_name: 'geth'
metrics_path: /debug/metrics/prometheus
scheme: http
static_configs:
- targets: ['fixturenet-eth-geth-1:6060']
# nginx
- job_name: 'nginx'
scrape_interval: 5s
metrics_path: /metrics
scheme: http
static_configs:
- targets: ['keycloak-nginx-prometheus-exporter:9113']
# keycloak
- job_name: 'keycloak'
scrape_interval: 5s
metrics_path: /auth/realms/cerc/metrics
scheme: http
static_configs:
- targets: ['keycloak:8080']
@@ -19,3 +19,5 @@ CERC_STATEDIFF_DB_USER="vdbm"
CERC_STATEDIFF_DB_PASSWORD="password" CERC_STATEDIFF_DB_PASSWORD="password"
CERC_STATEDIFF_DB_GOOSE_MIN_VER=23 CERC_STATEDIFF_DB_GOOSE_MIN_VER=23
CERC_STATEDIFF_DB_LOG_STATEMENTS="false" CERC_STATEDIFF_DB_LOG_STATEMENTS="false"
CERC_GETH_VMODULE="statediff/*=5,rpc/*=5"
@@ -20,16 +20,19 @@ server {
proxy_pass http://fixturenet-eth-geth-1:8545; proxy_pass http://fixturenet-eth-geth-1:8545;
} }
### ipld-eth-server ## ipld-eth-server
# location ~ ^/ipld/eth/([^/]*)$ { # location ~ ^/ipld/eth/([^/]*)$ {
# set $apiKey $1; # set $apiKey $1;
# if ($apiKey = '') { # if ($apiKey = '') {
# set $apiKey $http_X_API_KEY; # set $apiKey $http_X_API_KEY;
# } # }
# auth_request /auth; # auth_request /auth;
# auth_request_set $user_id $sent_http_x_user_id;
# proxy_buffering off; # proxy_buffering off;
# rewrite /.*$ / break; # rewrite /.*$ / break;
# proxy_pass http://ipld-eth-server:8081; # proxy_pass http://ipld-eth-server:8081;
# proxy_set_header X-Original-Remote-Addr $remote_addr;
# proxy_set_header X-User-Id $user_id;
# } # }
# #
# location ~ ^/ipld/gql/([^/]*)$ { # location ~ ^/ipld/gql/([^/]*)$ {
@@ -42,14 +45,14 @@ server {
# rewrite /.*$ / break; # rewrite /.*$ / break;
# proxy_pass http://ipld-eth-server:8082; # proxy_pass http://ipld-eth-server:8082;
# } # }
#
### lighthouse ## lighthouse
# location /beacon/ { location /beacon/ {
# set $apiKey $http_X_API_KEY; set $apiKey $http_X_API_KEY;
# auth_request /auth; auth_request /auth;
# proxy_buffering off; proxy_buffering off;
# proxy_pass http://fixturenet-eth-lighthouse-1:8001/; proxy_pass http://fixturenet-eth-lighthouse-1:8001/;
# } }
location = /auth { location = /auth {
internal; internal;
@@ -63,7 +66,7 @@ server {
proxy_set_header X-Original-Host $host; proxy_set_header X-Original-Host $host;
} }
# location = /basic_status { location = /stub_status {
# stub_status; stub_status;
# } }
} }
@@ -0,0 +1,31 @@
# From: https://github.com/vyzo/gerbil/blob/master/docker/Dockerfile
FROM gerbil/ubuntu
# Install the Solidity compiler (latest stable version)
# and guile
# and libsecp256k1-dev
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && export DEBCONF_NOWARNINGS="yes" && \
apt-get install -y software-properties-common && \
add-apt-repository ppa:ethereum/ethereum && \
apt-get update && \
apt-get install -y solc && \
apt-get install -y guile-3.0 && \
apt-get install -y libsecp256k1-dev && \
apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN mkdir /scripts
COPY install-dependencies.sh /scripts
# Override the definition of GERBIL_PATH in the base image, but
# is safe because (at present) no gerbil packages are installed in the base image
# We do this in order to allow a set of pre-installed packages from the container
# to be used with an arbitrary, potentially different set of projects bind mounted
# at /src
ENV GERBIL_PATH=/.gerbil
RUN bash /scripts/install-dependencies.sh
# Needed to prevent git from raging about /src
RUN git config --global --add safe.directory /src
COPY entrypoint.sh /scripts
ENTRYPOINT ["/scripts/entrypoint.sh"]
@@ -0,0 +1,21 @@
## Gerbil Scheme Builder
This container is designed to be used as a simple "build runner" environment for building and running Scheme projects using Gerbil and gerbil-ethereum. Its primary purpose is to allow build/test/run of gerbil code without the need to install and configure all the necessary prerequisites and dependencies on the host system.
### Usage
First build the container with:
```
$ laconic-so build-containers --include cerc/builder-gerbil
```
Now, assuming a gerbil project located at `~/projects/my-project`, run bash in the container mounting the project with:
```
$ docker run -it -v $HOME/projects/my-project:/src cerc/builder-gerbil:latest bash
root@7c4124bb09e3:/src#
```
Now gerbil commands can be run.
@@ -0,0 +1,2 @@
#!/bin/sh
exec "$@"
@@ -0,0 +1,16 @@
DEPS=(github.com/fare/gerbil-utils
github.com/fare/gerbil-poo
github.com/fare/gerbil-crypto
github.com/fare/gerbil-persist
github.com/fare/gerbil-ethereum
github.com/drewc/gerbil-swank
github.com/drewc/drewc-r7rs-swank
github.com/drewc/smug-gerbil
github.com/drewc/ftw
github.com/vyzo/gerbil-libp2p
) ;
for i in ${DEPS[@]} ; do
echo "Installing gerbil package: $i"
gxpkg install $i &&
gxpkg build $i
done
@@ -13,6 +13,8 @@ if [[ -z "${CERC_NPM_AUTH_TOKEN}" ]]; then
echo "CERC_NPM_AUTH_TOKEN is not set" >&2 echo "CERC_NPM_AUTH_TOKEN is not set" >&2
exit 1 exit 1
fi fi
# Exit on error
set -e
local_npm_registry_url=$1 local_npm_registry_url=$1
package_publish_version=$2 package_publish_version=$2
# TODO: make this a paramater and allow a list of scopes # TODO: make this a paramater and allow a list of scopes
@@ -17,6 +17,8 @@ if [[ $# -eq 2 ]]; then
else else
package_publish_version=$( cat package.json | jq -r .version ) package_publish_version=$( cat package.json | jq -r .version )
fi fi
# Exit on error
set -e
# Get the name of this package from package.json since we weren't passed that # Get the name of this package from package.json since we weren't passed that
package_name=$( cat package.json | jq -r .name ) package_name=$( cat package.json | jq -r .name )
local_npm_registry_url=$1 local_npm_registry_url=$1
@@ -24,7 +26,7 @@ npm config set @lirewine:registry ${local_npm_registry_url}
npm config set @cerc-io:registry ${local_npm_registry_url} npm config set @cerc-io:registry ${local_npm_registry_url}
npm config set -- ${local_npm_registry_url}:_authToken ${CERC_NPM_AUTH_TOKEN} npm config set -- ${local_npm_registry_url}:_authToken ${CERC_NPM_AUTH_TOKEN}
# First check if the version of this package we're trying to build already exists in the registry # First check if the version of this package we're trying to build already exists in the registry
package_exists=$( yarn info --json ${package_name}@${package_publish_version} | jq -r .data.dist.tarball ) package_exists=$( yarn info --json ${package_name}@${package_publish_version} 2>/dev/null | jq -r .data.dist.tarball )
if [[ ! -z "$package_exists" && "$package_exists" != "null" ]]; then if [[ ! -z "$package_exists" && "$package_exists" != "null" ]]; then
echo "${package_publish_version} of ${package_name} already exists in the registry, skipping build" echo "${package_publish_version} of ${package_name} already exists in the registry, skipping build"
exit 0 exit 0
@@ -14,14 +14,23 @@ if [[ $# -ne 2 ]]; then
echo "Illegal number of parameters" >&2 echo "Illegal number of parameters" >&2
exit 1 exit 1
fi fi
# Exit on error
set -e
target_package=$1 target_package=$1
local_npm_registry_url=$2 local_npm_registry_url=$2
# TODO: use jq rather than sed here: # TODO: use jq rather than sed here:
versioned_target_package=$(grep ${target_package} package.json | sed -e 's#[[:space:]]\{1,\}\"\('${target_package}'\)\":[[:space:]]\{1,\}\"\(.*\)\",#\1@\2#' ) versioned_target_package=$(grep ${target_package} package.json | sed -e 's#[[:space:]]\{1,\}\"\('${target_package}'\)\":[[:space:]]\{1,\}\"\(.*\)\",#\1@\2#' )
# Use yarn info to get URL checksums etc from the new registry # Use yarn info to get URL checksums etc from the new registry
yarn_info_output=$(yarn info --json $versioned_target_package 2>/dev/null) yarn_info_output=$(yarn info --json $versioned_target_package 2>/dev/null)
# Code below parses out the values we need # First check if the target version actually exists.
# If it doesn't exist there will be no .data.dist.tarball element,
# and jq will output the string "null"
package_tarball=$(echo $yarn_info_output | jq -r .data.dist.tarball) package_tarball=$(echo $yarn_info_output | jq -r .data.dist.tarball)
if [[ $package_tarball == "null" ]]; then
echo "FATAL: Target package version ($versioned_target_package) not found" >&2
exit 1
fi
# Code below parses out the values we need
# When running inside a container, the registry can return a URL with the wrong host name due to proxying # When running inside a container, the registry can return a URL with the wrong host name due to proxying
# so we need to check if that has happened and fix the URL if so. # so we need to check if that has happened and fix the URL if so.
if ! [[ "${package_tarball}" =~ ^${local_npm_registry_url}.* ]]; then if ! [[ "${package_tarball}" =~ ^${local_npm_registry_url}.* ]]; then
@@ -33,6 +42,7 @@ package_integrity=$(echo $yarn_info_output | jq -r .data.dist.integrity)
package_shasum=$(echo $yarn_info_output | jq -r .data.dist.shasum) package_shasum=$(echo $yarn_info_output | jq -r .data.dist.shasum)
package_resolved=${package_tarball}#${package_shasum} package_resolved=${package_tarball}#${package_shasum}
# Some strings need to be escaped so they work when passed to sed later # Some strings need to be escaped so they work when passed to sed later
escaped_package_integrity=$(printf '%s\n' "$package_integrity" | sed -e 's/[\/&]/\\&/g')
escaped_package_resolved=$(printf '%s\n' "$package_resolved" | sed -e 's/[\/&]/\\&/g') escaped_package_resolved=$(printf '%s\n' "$package_resolved" | sed -e 's/[\/&]/\\&/g')
escaped_target_package=$(printf '%s\n' "$target_package" | sed -e 's/[\/&]/\\&/g') escaped_target_package=$(printf '%s\n' "$target_package" | sed -e 's/[\/&]/\\&/g')
if [ -n "$CERC_SCRIPT_VERBOSE" ]; then if [ -n "$CERC_SCRIPT_VERBOSE" ]; then
@@ -44,4 +54,4 @@ fi
# Use magic sed regex to replace the values in yarn.lock # Use magic sed regex to replace the values in yarn.lock
# Note: yarn.lock is not json so we can not use jq for this # Note: yarn.lock is not json so we can not use jq for this
sed -i -e '/^\"'${escaped_target_package}'.*\":$/ , /^\".*$/ s/^\([[:space:]]\{1,\}resolved \).*$/\1'\"${escaped_package_resolved}\"'/' yarn.lock sed -i -e '/^\"'${escaped_target_package}'.*\":$/ , /^\".*$/ s/^\([[:space:]]\{1,\}resolved \).*$/\1'\"${escaped_package_resolved}\"'/' yarn.lock
sed -i -e '/^\"'${escaped_target_package}'.*\":$/ , /^\".*$/ s/^\([[:space:]]\{1,\}integrity \).*$/\1'${package_integrity}'/' yarn.lock sed -i -e '/^\"'${escaped_target_package}'.*\":$/ , /^\".*$/ s/^\([[:space:]]\{1,\}integrity \).*$/\1'${escaped_package_integrity}'/' yarn.lock
@@ -1,5 +1,9 @@
#!/bin/bash #!/bin/bash
if [ -n "$CERC_SCRIPT_DEBUG" ]; then
set -x
fi
ETHERBASE=`cat /opt/testnet/build/el/accounts.csv | head -1 | cut -d',' -f2` ETHERBASE=`cat /opt/testnet/build/el/accounts.csv | head -1 | cut -d',' -f2`
NETWORK_ID=`cat /opt/testnet/el/el-config.yaml | grep 'chain_id' | awk '{ print $2 }'` NETWORK_ID=`cat /opt/testnet/el/el-config.yaml | grep 'chain_id' | awk '{ print $2 }'`
NETRESTRICT=`ip addr | grep inet | grep -v '127.0' | awk '{print $2}'` NETRESTRICT=`ip addr | grep inet | grep -v '127.0' | awk '{print $2}'`
@@ -28,7 +32,9 @@ else
echo -n "$JWT" > /opt/testnet/build/el/jwtsecret echo -n "$JWT" > /opt/testnet/build/el/jwtsecret
if [ "$CERC_RUN_STATEDIFF" == "detect" ] && [ -n "$CERC_STATEDIFF_DB_HOST" ]; then if [ "$CERC_RUN_STATEDIFF" == "detect" ] && [ -n "$CERC_STATEDIFF_DB_HOST" ]; then
if [ -n "$(dig $CERC_STATEDIFF_DB_HOST +short)" ]; then dig_result=$(dig $CERC_STATEDIFF_DB_HOST +short)
dig_status_code=$?
if [[ $dig_status_code = 0 && -n $dig_result ]]; then
echo "Statediff DB at $CERC_STATEDIFF_DB_HOST" echo "Statediff DB at $CERC_STATEDIFF_DB_HOST"
CERC_RUN_STATEDIFF="true" CERC_RUN_STATEDIFF="true"
else else
@@ -27,4 +27,8 @@ RUN cd /opt/testnet && make genesis-cl
# Work around some bugs in lcli where the default path is always used. # Work around some bugs in lcli where the default path is always used.
RUN mkdir -p /root/.lighthouse && cd /root/.lighthouse && ln -s /opt/testnet/build/cl/testnet RUN mkdir -p /root/.lighthouse && cd /root/.lighthouse && ln -s /opt/testnet/build/cl/testnet
RUN mkdir -p /scripts
COPY scripts/status-internal.sh /scripts
COPY scripts/status.sh /scripts
ENTRYPOINT ["/opt/testnet/run.sh"] ENTRYPOINT ["/opt/testnet/run.sh"]
@@ -0,0 +1,10 @@
#!/usr/bin/env bash
# Wrapper to facilitate using status.sh inside the container
if [ -n "$CERC_SCRIPT_DEBUG" ]; then
set -x
fi
export LIGHTHOUSE_BASE_URL="http://fixturenet-eth-lighthouse-1:8001"
export GETH_BASE_URL="http://fixturenet-eth-geth-1:8545"
# See: https://stackoverflow.com/a/246128/1701505
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
$SCRIPT_DIR/status.sh
@@ -1,5 +1,7 @@
#!/bin/bash #!/usr/bin/env bash
if [ -n "$CERC_SCRIPT_DEBUG" ]; then
set -x
fi
STATUSES=("geth to generate DAG" "beacon phase0" "beacon altair" "beacon bellatrix pre-merge" "beacon bellatrix merge") STATUSES=("geth to generate DAG" "beacon phase0" "beacon altair" "beacon bellatrix pre-merge" "beacon bellatrix merge")
STATUS=0 STATUS=0
@@ -7,13 +9,17 @@ STATUS=0
LIGHTHOUSE_BASE_URL=${LIGHTHOUSE_BASE_URL} LIGHTHOUSE_BASE_URL=${LIGHTHOUSE_BASE_URL}
GETH_BASE_URL=${GETH_BASE_URL} GETH_BASE_URL=${GETH_BASE_URL}
# TODO: Docker commands below should be replaced by some interface into stack orchestrator
# or some execution environment-neutral mechanism.
if [ -z "$LIGHTHOUSE_BASE_URL" ]; then if [ -z "$LIGHTHOUSE_BASE_URL" ]; then
LIGHTHOUSE_PORT=`docker ps -f "name=fixturenet-eth-lighthouse-1-1" --format "{{.Ports}}" | head -1 | cut -d':' -f2 | cut -d'-' -f1` LIGHTHOUSE_CONTAINER=`docker ps -q -f "name=fixturenet-eth-lighthouse-1-1"`
LIGHTHOUSE_PORT=`docker port $LIGHTHOUSE_CONTAINER 8001 | cut -d':' -f2`
LIGHTHOUSE_BASE_URL="http://localhost:${LIGHTHOUSE_PORT}" LIGHTHOUSE_BASE_URL="http://localhost:${LIGHTHOUSE_PORT}"
fi fi
if [ -z "$GETH_BASE_URL" ]; then if [ -z "$GETH_BASE_URL" ]; then
GETH_PORT=`docker ps -f "name=fixturenet-eth-geth-1-1" --format "{{.Ports}}" | head -1 | cut -d':' -f2 | cut -d'-' -f1` GETH_CONTAINER=`docker ps -q -f "name=fixturenet-eth-geth-1-1"`
GETH_PORT=`docker port $GETH_CONTAINER 8545 | cut -d':' -f2`
GETH_BASE_URL="http://localhost:${GETH_PORT}" GETH_BASE_URL="http://localhost:${GETH_PORT}"
fi fi
@@ -1,4 +1,4 @@
FROM quay.io/keycloak/keycloak:20.0 FROM quay.io/keycloak/keycloak:20.0
WORKDIR /opt/keycloak/providers WORKDIR /opt/keycloak/providers
RUN curl -L https://github.com/aerogear/keycloak-metrics-spi/releases/download/2.5.3/keycloak-metrics-spi-2.5.3.jar --output keycloak-metrics-spi.jar RUN curl -L https://github.com/aerogear/keycloak-metrics-spi/releases/download/2.5.3/keycloak-metrics-spi-2.5.3.jar --output keycloak-metrics-spi.jar
RUN curl -L https://github.com/cerc-io/keycloak-api-key-demo/releases/download/v0.1/api-key-module-0.1.jar --output api-key-module.jar RUN curl -L https://github.com/cerc-io/keycloak-api-key-demo/releases/download/v0.2/api-key-module-0.2.jar --output api-key-module.jar
@@ -1,4 +1,11 @@
FROM alpine:latest FROM ubuntu:latest
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && export DEBCONF_NOWARNINGS="yes" && \
apt-get install -y software-properties-common && \
apt-get install -y nginx && \
apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
EXPOSE 80
COPY run.sh /app/run.sh COPY run.sh /app/run.sh
@@ -12,5 +12,5 @@ else
echo `date` > $EXISTSFILENAME echo `date` > $EXISTSFILENAME
fi fi
# Sleep forever to keep docker happy # Run nginx which will block here forever
while true; do sleep 10; done /usr/sbin/nginx -g "daemon off;"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Build foundry-rs/foundry
# HACK below : TARGETARCH needs to be derived from the host environment
docker build -t foundry-rs/foundry:local ${CERC_REPO_BASE_DIR}/foundry
+2
View File
@@ -1,3 +1,4 @@
foundry-rs/foundry
cerc/test-contract cerc/test-contract
cerc/eth-statediff-fill-service cerc/eth-statediff-fill-service
cerc/eth-statediff-service cerc/eth-statediff-service
@@ -22,3 +23,4 @@ cerc/eth-probe
cerc/builder-js cerc/builder-js
cerc/keycloak cerc/keycloak
cerc/tx-spammer cerc/tx-spammer
cerc/builder-gerbil
+1 -1
View File
@@ -6,10 +6,10 @@ ipld-eth-beacon-db
ipld-eth-beacon-indexer ipld-eth-beacon-indexer
ipld-eth-server ipld-eth-server
lighthouse lighthouse
prometheus-grafana
laconicd laconicd
fixturenet-laconicd fixturenet-laconicd
fixturenet-eth fixturenet-eth
fixturenet-eth-metrics
watcher-mobymask watcher-mobymask
watcher-erc20 watcher-erc20
watcher-erc721 watcher-erc721
+1
View File
@@ -16,3 +16,4 @@ vulcanize/uniswap-v3-info
vulcanize/assemblyscript vulcanize/assemblyscript
cerc-io/eth-probe cerc-io/eth-probe
cerc-io/tx-spammer cerc-io/tx-spammer
foundry-rs/foundry
+1 -1
View File
@@ -13,6 +13,6 @@ containers:
- cerc/watcher-erc20 - cerc/watcher-erc20
pods: pods:
- go-ethereum-foundry - go-ethereum-foundry
- db - ipld-eth-db
- ipld-eth-server - ipld-eth-server
- watcher-erc20 - watcher-erc20
+1 -1
View File
@@ -13,6 +13,6 @@ containers:
- cerc/watcher-erc721 - cerc/watcher-erc721
pods: pods:
- go-ethereum-foundry - go-ethereum-foundry
- db - ipld-eth-db
- ipld-eth-server - ipld-eth-server
- watcher-erc721 - watcher-erc721
@@ -0,0 +1,6 @@
# fixturenet-eth
A "loaded" version of fixturenet-eth, with all the bells and whistles enabled.
TODO: write me
@@ -0,0 +1,24 @@
version: "1.0"
name: fixturenet-eth-loaded
decription: "Loaded Ethereum Fixturenet"
repos:
- cerc-io/go-ethereum
- cerc-io/tx-spammer
- cerc-io/ipld-eth-server
- cerc-io/ipld-eth-db
- cerc/go-ethereum
containers:
- cerc/lighthouse
- cerc/fixturenet-eth-geth
- cerc/fixturenet-eth-lighthouse
- cerc/ipld-eth-server
- cerc/ipld-eth-db
- cerc/keycloak
- cerc/tx-spammer
pods:
- fixturenet-eth
- tx-spammer
- fixturenet-eth-metrics
- keycloak
- ipld-eth-server
- ipld-eth-db
+3 -3
View File
@@ -4,12 +4,12 @@ Instructions for deploying a local a geth + lighthouse blockchain "fixturenet" f
## Clone required repositories ## Clone required repositories
``` ```
$ laconic-so setup-repositories --include cerc-io/go-ethereum $ laconic-so --stack fixturenet-eth setup-repositories
``` ```
## Build the fixturenet-eth containers ## Build the fixturenet-eth containers
``` ```
$ laconic-so build-containers --include cerc/go-ethereum,cerc/lighthouse,cerc/fixturenet-eth-geth,cerc/fixturenet-eth-lighthouse $ laconic-so --stack fixturenet-eth build-containers
``` ```
This should create several container images in the local image registry: This should create several container images in the local image registry:
@@ -20,7 +20,7 @@ This should create several container images in the local image registry:
## Deploy the stack ## Deploy the stack
``` ```
$ laconic-so deploy-system --include fixturenet-eth up $ laconic-so --stack fixturenet-eth deploy-system up
``` ```
## Check status ## Check status
+3 -2
View File
@@ -1,12 +1,13 @@
version: "1.0" version: "1.0"
name: fixturenet-eth name: fixturenet-eth
decription: "Ethereum Fixturenet"
repos: repos:
- cerc-io/go-ethereum - cerc-io/go-ethereum
- cerc-io/lighthouse - cerc-io/tx-spammer
containers: containers:
- cerc/go-ethereum - cerc/go-ethereum
- cerc/lighthouse - cerc/lighthouse
- cerc/fixturenet-eth-geth - cerc/fixturenet-eth-geth
- cerc/fixturenet-eth-lighthouse - cerc/fixturenet-eth-lighthouse
pods: pods:
- fixturenet-eth - fixturenet-eth
@@ -1,5 +1,6 @@
version: "1.0" version: "1.0"
name: fixturenet-laconicd name: fixturenet-laconicd
description: "A laconicd fixturenet"
repos: repos:
- cerc-io/laconicd - cerc-io/laconicd
- cerc-io/laconic-sdk - cerc-io/laconic-sdk
+3
View File
@@ -0,0 +1,3 @@
# Test Stack
A stack for test/demo purposes.
+9
View File
@@ -0,0 +1,9 @@
version: "1.0"
name: test
description: "A test stack"
repos:
- cerc-io/laconicd
containers:
- cerc/test-container
pods:
- test
+1 -1
View File
@@ -1,2 +1,2 @@
# This file should be re-generated running: scripts/update-version-file.sh script # This file should be re-generated running: scripts/update-version-file.sh script
v1.0.10-alpha-4e1366d v1.0.18-3bd0c74
+35 -15
View File
@@ -1,4 +1,4 @@
# Copyright © 2022 Cerc # Copyright © 2022, 2023 Cerc
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by # it under the terms of the GNU Affero General Public License as published by
@@ -22,8 +22,7 @@ from python_on_whales import DockerClient
import click import click
import importlib.resources import importlib.resources
from pathlib import Path from pathlib import Path
import yaml from .util import include_exclude_check, get_parsed_stack_config
from .util import include_exclude_check
@click.command() @click.command()
@@ -31,13 +30,14 @@ from .util import include_exclude_check
@click.option("--exclude", help="don\'t start these components") @click.option("--exclude", help="don\'t start these components")
@click.option("--cluster", help="specify a non-default cluster name") @click.option("--cluster", help="specify a non-default cluster name")
@click.argument('command', required=True) # help: command: up|down|ps @click.argument('command', required=True) # help: command: up|down|ps
@click.argument('services', nargs=-1) # help: command: up|down|ps <service1> <service2> @click.argument('extra_args', nargs=-1) # help: command: up|down|ps <service1> <service2>
@click.pass_context @click.pass_context
def command(ctx, include, exclude, cluster, command, services): def command(ctx, include, exclude, cluster, command, extra_args):
'''deploy a stack''' '''deploy a stack'''
# TODO: implement option exclusion and command value constraint lost with the move from argparse to click # TODO: implement option exclusion and command value constraint lost with the move from argparse to click
debug = ctx.obj.debug
quiet = ctx.obj.quiet quiet = ctx.obj.quiet
verbose = ctx.obj.verbose verbose = ctx.obj.verbose
dry_run = ctx.obj.dry_run dry_run = ctx.obj.dry_run
@@ -62,13 +62,9 @@ def command(ctx, include, exclude, cluster, command, services):
pods_in_scope = [] pods_in_scope = []
if stack: if stack:
# In order to be compatible with Python 3.8 we need to use this hack to get the path: stack_config = get_parsed_stack_config(stack)
# See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure # TODO: syntax check the input here
stack_file_path = Path(__file__).absolute().parent.joinpath("data", "stacks", stack, "stack.yml") pods_in_scope = stack_config['pods']
with stack_file_path:
stack_config = yaml.safe_load(open(stack_file_path, "r"))
# TODO: syntax check the input here
pods_in_scope = stack_config['pods']
else: else:
pods_in_scope = all_pods pods_in_scope = all_pods
@@ -92,17 +88,41 @@ def command(ctx, include, exclude, cluster, command, services):
# See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ # See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/
docker = DockerClient(compose_files=compose_files, compose_project_name=cluster) docker = DockerClient(compose_files=compose_files, compose_project_name=cluster)
services_list = list(services) or None extra_args_list = list(extra_args) or None
if not dry_run: if not dry_run:
if command == "up": if command == "up":
if debug:
os.environ["CERC_SCRIPT_DEBUG"] = "true"
if verbose: if verbose:
print(f"Running compose up for services: {services_list}") print(f"Running compose up for extra_args: {extra_args_list}")
docker.compose.up(detach=True, services=services_list) docker.compose.up(detach=True, services=extra_args_list)
elif command == "down": elif command == "down":
if verbose: if verbose:
print("Running compose down") print("Running compose down")
docker.compose.down() docker.compose.down()
elif command == "exec":
if extra_args_list is None or len(extra_args_list) < 2:
print("Usage: exec <service> <cmd>")
sys.exit(1)
service_name = extra_args_list[0]
command_to_exec = extra_args_list[1:]
container_exec_env = {
"CERC_SCRIPT_DEBUG": "true"
} if debug else {}
if verbose:
print(f"Running compose exec {service_name} {command_to_exec}")
docker.compose.execute(service_name, command_to_exec, envs=container_exec_env)
elif command == "port":
if extra_args_list is None or len(extra_args_list) < 2:
print("Usage: port <service> <exposed-port>")
sys.exit(1)
service_name = extra_args_list[0]
exposed_port = extra_args_list[1]
if verbose:
print(f"Running compose port {service_name} {exposed_port}")
mapped_port_data = docker.compose.port(service_name, exposed_port)
print(f"{mapped_port_data[0]}:{mapped_port_data[1]}")
elif command == "ps": elif command == "ps":
if verbose: if verbose:
print("Running compose ps") print("Running compose ps")
+27 -1
View File
@@ -1,4 +1,4 @@
# Copyright © 2022 Cerc # Copyright © 2022, 2023 Cerc
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by # it under the terms of the GNU Affero General Public License as published by
@@ -13,6 +13,12 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http:#www.gnu.org/licenses/>. # along with this program. If not, see <http:#www.gnu.org/licenses/>.
import os.path
import sys
import yaml
from pathlib import Path
def include_exclude_check(s, include, exclude): def include_exclude_check(s, include, exclude):
if include is None and exclude is None: if include is None and exclude is None:
return True return True
@@ -22,3 +28,23 @@ def include_exclude_check(s, include, exclude):
if exclude is not None: if exclude is not None:
exclude_list = exclude.split(",") exclude_list = exclude.split(",")
return s not in exclude_list return s not in exclude_list
def get_parsed_stack_config(stack):
# In order to be compatible with Python 3.8 we need to use this hack to get the path:
# See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure
stack_file_path = Path(__file__).absolute().parent.joinpath("data", "stacks", stack, "stack.yml")
try:
with stack_file_path:
stack_config = yaml.safe_load(open(stack_file_path, "r"))
return stack_config
except FileNotFoundError as error:
# We try here to generate a useful diagnostic error
# First check if the stack directory is present
stack_directory = stack_file_path.parent
if os.path.exists(stack_directory):
print(f"Error: stack.yml file is missing from stack: {stack}")
else:
print(f"Error: stack: {stack} does not exist")
print(f"Exiting, error: {error}")
sys.exit(1)
+5 -3
View File
@@ -27,13 +27,14 @@ CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])
# TODO: this seems kind of weird and heavy on boilerplate -- check it is # TODO: this seems kind of weird and heavy on boilerplate -- check it is
# the best Python can do for us. # the best Python can do for us.
class Options(object): class Options(object):
def __init__(self, stack, quiet, verbose, dry_run, local_stack, debug): def __init__(self, stack, quiet, verbose, dry_run, local_stack, debug, continue_on_error):
self.stack = stack self.stack = stack
self.quiet = quiet self.quiet = quiet
self.verbose = verbose self.verbose = verbose
self.dry_run = dry_run self.dry_run = dry_run
self.local_stack = local_stack self.local_stack = local_stack
self.debug = debug self.debug = debug
self.continue_on_error = continue_on_error
@click.group(context_settings=CONTEXT_SETTINGS) @click.group(context_settings=CONTEXT_SETTINGS)
@@ -43,11 +44,12 @@ class Options(object):
@click.option('--dry-run', is_flag=True, default=False) @click.option('--dry-run', is_flag=True, default=False)
@click.option('--local-stack', is_flag=True, default=False) @click.option('--local-stack', is_flag=True, default=False)
@click.option('--debug', is_flag=True, default=False) @click.option('--debug', is_flag=True, default=False)
@click.option('--continue-on-error', is_flag=True, default=False)
# See: https://click.palletsprojects.com/en/8.1.x/complex/#building-a-git-clone # See: https://click.palletsprojects.com/en/8.1.x/complex/#building-a-git-clone
@click.pass_context @click.pass_context
def cli(ctx, stack, quiet, verbose, dry_run, local_stack, debug): def cli(ctx, stack, quiet, verbose, dry_run, local_stack, debug, continue_on_error):
"""Laconic Stack Orchestrator""" """Laconic Stack Orchestrator"""
ctx.obj = Options(stack, quiet, verbose, dry_run, local_stack, debug) ctx.obj = Options(stack, quiet, verbose, dry_run, local_stack, debug, continue_on_error)
cli.add_command(setup_repositories.command, "setup-repositories") cli.add_command(setup_repositories.command, "setup-repositories")
@@ -5,8 +5,11 @@ Thank you for taking the time to make a contribution to Stack Orchestrator.
## Install (developer mode) ## Install (developer mode)
Suitable for developers either modifying or debugging the orchestrator Python code: Suitable for developers either modifying or debugging the orchestrator Python code:
#### Prerequisites
In addition to the binary install prerequisites listed above, the following are required: ### Prerequisites
In addition to the pre-requisites listed in the [README](/README.md), the following are required:
1. Python venv package 1. Python venv package
This may or may not be already installed depending on the host OS and version. Check by running: This may or may not be already installed depending on the host OS and version. Check by running:
``` ```
@@ -18,26 +21,32 @@ In addition to the binary install prerequisites listed above, the following are
``` ```
$ apt install python3.10-venv $ apt install python3.10-venv
``` ```
#### Install
### Install
1. Clone this repository: 1. Clone this repository:
``` ```
$ git clone (https://github.com/cerc-io/stack-orchestrator.git $ git clone (https://github.com/cerc-io/stack-orchestrator.git
``` ```
4. Enter the project directory:
2. Enter the project directory:
``` ```
$ cd stack-orchestrator $ cd stack-orchestrator
``` ```
5. Create and activate a venv:
3. Create and activate a venv:
``` ```
$ python3 -m venv venv $ python3 -m venv venv
$ source ./venv/bin/activate $ source ./venv/bin/activate
(venv) $ (venv) $
``` ```
6. Install the cli in edit mode:
4. Install the cli in edit mode:
``` ```
$ pip install --editable . $ pip install --editable .
``` ```
7. Verify installation:
5. Verify installation:
``` ```
(venv) $ laconic-so (venv) $ laconic-so
Usage: laconic-so [OPTIONS] COMMAND [ARGS]... Usage: laconic-so [OPTIONS] COMMAND [ARGS]...
@@ -56,19 +65,23 @@ In addition to the binary install prerequisites listed above, the following are
setup-repositories git clone the set of repositories required to build... setup-repositories git clone the set of repositories required to build...
``` ```
#### Build a zipapp (single file distributable script) ## Build a zipapp (single file distributable script)
Use shiv to build a single file Python executable zip archive of laconic-so: Use shiv to build a single file Python executable zip archive of laconic-so:
1. Install [shiv](https://github.com/linkedin/shiv): 1. Install [shiv](https://github.com/linkedin/shiv):
``` ```
$ (venv) pip install shiv $ (venv) pip install shiv
$ (venv) pip install wheel $ (venv) pip install wheel
``` ```
1. Run shiv to create a zipapp file:
2. Run shiv to create a zipapp file:
``` ```
$ (venv) shiv -c laconic-so -o laconic-so . $ (venv) shiv -c laconic-so -o laconic-so .
``` ```
This creates a file `./laconic-so` that is executable outside of any venv, and on other machines and OSes and architectures, and requiring only the system Python3: This creates a file `./laconic-so` that is executable outside of any venv, and on other machines and OSes and architectures, and requiring only the system Python3:
1. Verify it works:
3. Verify it works:
``` ```
$ cp stack-orchetrator/laconic-so ~/bin $ cp stack-orchetrator/laconic-so ~/bin
$ laconic-so $ laconic-so
@@ -88,4 +101,4 @@ Use shiv to build a single file Python executable zip archive of laconic-so:
setup-repositories git clone the set of repositories required to build... setup-repositories git clone the set of repositories required to build...
``` ```
For cutting releases, use the [shiv build script](/scripts/build_shiv_package.sh).
Binary file not shown.

After

Width:  |  Height:  |  Size: 999 KiB

@@ -1 +0,0 @@
8f6452ed13e85a447103a7fff7cf3fb8ff5ea51a
+29
View File
@@ -0,0 +1,29 @@
# Release Process
## Manually publish to github releases
In order to build, the shiv and wheel packages must be installed:
```
$ pip install shiv
$ pip install wheel
```
Then:
1. Define `CERC_GH_RELEASE_SCRIPTS_DIR`
1. Define `CERC_PACKAGE_RELEASE_GITHUB_TOKEN`
1. Run `./scripts/tag_new_release.sh <major> <minor> <patch>`
1. Run `./scripts/build_shiv_package.sh`
1. Run `./scripts/publish_shiv_package_github.sh <major> <minor> <patch>`
1. Commit the new version file.
e.g.
```
$ export CERC_GH_RELEASE_SCRIPTS_DIR=~/projects/cerc/github-release-api/
$ export CERC_PACKAGE_RELEASE_GITHUB_TOKEN=github_pat_xxxxxx
$ ./scripts/tag_new_release.sh 1 0 17
$ ./scripts/build_shiv_package.sh
$ ./scripts/publish_shiv_package_github.sh 1 0 17
```
+59 -14
View File
@@ -1,37 +1,82 @@
# Spec # Specification
TODO: update
## Implementation ## Implementation
The orchestrator's operation is driven by files shown below. `repository-list.txt` container the list of git repositories; `container-image-list.txt` contains
the list of container image names, while `clister-list.txt` specifies the set of compose components (corresponding to individual docker-compose-xxx.yml files which may in turn specify more than one container). The orchestrator's operation is driven by files shown below.
Files required to build each container image are stored under `./container-build/<container-name>`
Files required at deploy-time are stored under `./config/<component-name>` - `repository-list.txt` contains the list of git repositories;
- `container-image-list.txt` contains the list of container image names
- `pod-list.txt` specifies the set of compose components (corresponding to individual docker-compose-xxx.yml files which may in turn specify more than one container).
- `container-build/` contains the files required to build each container image
- `config/` contains the files required at deploy time
``` ```
├── container-image-list.txt
├── pod-list.txt ├── pod-list.txt
├── repository-list.txt
├── compose ├── compose
│   ├── docker-compose-contract.yml │   ├── docker-compose-contract.yml
│   ├── docker-compose-db-sharding.yml │   ├── docker-compose-eth-probe.yml
│   ├── docker-compose-db.yml
│   ├── docker-compose-eth-statediff-fill-service.yml │   ├── docker-compose-eth-statediff-fill-service.yml
│   ├── docker-compose-fixturenet-eth.yml
│   ├── docker-compose-fixturenet-laconicd.yml
│   ├── docker-compose-go-ethereum-foundry.yml │   ├── docker-compose-go-ethereum-foundry.yml
│   ├── docker-compose-ipld-eth-beacon-db.yml │   ├── docker-compose-ipld-eth-beacon-db.yml
│   ├── docker-compose-ipld-eth-beacon-indexer.yml │   ├── docker-compose-ipld-eth-beacon-indexer.yml
│   ├── docker-compose-ipld-eth-db.yml
│   ├── docker-compose-ipld-eth-server.yml │   ├── docker-compose-ipld-eth-server.yml
│   ├── docker-compose-lighthouse.yml │   ├── docker-compose-keycloak.yml
│   ── docker-compose-prometheus-grafana.yml │   ── docker-compose-laconicd.yml
│   ├── docker-compose-prometheus-grafana.yml
│   ├── docker-compose-test.yml
│   ├── docker-compose-tx-spammer.yml
│   ├── docker-compose-watcher-erc20.yml
│   ├── docker-compose-watcher-erc721.yml
│   ├── docker-compose-watcher-mobymask.yml
│   └── docker-compose-watcher-uniswap-v3.yml
├── config ├── config
│   ── ipld-eth-server │   ── fixturenet-eth
│   ├── fixturenet-laconicd
│   ├── ipld-eth-beacon-indexer
│   ├── ipld-eth-server
│   ├── keycloak
│   ├── postgresql
│   ├── tx-spammer
│   ├── watcher-erc20
│   ├── watcher-erc721
│   ├── watcher-mobymask
│   └── watcher-uniswap-v3
├── container-build ├── container-build
│   ├── cerc-builder-js
│   ├── cerc-eth-probe
│   ├── cerc-eth-statediff-fill-service │   ├── cerc-eth-statediff-fill-service
│   ├── cerc-eth-statediff-service
│   ├── cerc-fixturenet-eth-geth
│   ├── cerc-fixturenet-eth-lighthouse
│   ├── cerc-go-ethereum │   ├── cerc-go-ethereum
│   ├── cerc-go-ethereum-foundry │   ├── cerc-go-ethereum-foundry
│   ├── cerc-ipld-eth-beacon-db │   ├── cerc-ipld-eth-beacon-db
│   ├── cerc-ipld-eth-beacon-indexer │   ├── cerc-ipld-eth-beacon-indexer
│   ├── cerc-ipld-eth-db │   ├── cerc-ipld-eth-db
│   ├── cerc-ipld-eth-server │   ├── cerc-ipld-eth-server
│   ├── cerc-keycloak
│   ├── cerc-laconic-registry-cli
│   ├── cerc-laconicd
│   ├── cerc-lighthouse │   ├── cerc-lighthouse
│   ── cerc-test-contract │   ── cerc-test-container
├── container-image-list.txt │   ├── cerc-test-contract
├── repository-list.txt │   ├── cerc-tx-spammer
│   ├── cerc-uniswap-v3-info
│   ├── cerc-watcher-erc20
│   ├── cerc-watcher-erc721
│   ├── cerc-watcher-mobymask
│   ├── cerc-watcher-uniswap-v3
└── stacks
├── erc20
├── erc721
├── fixturenet-eth
├── fixturenet-laconicd
├── mobymask
└── uniswap-v3
``` ```
+40
View File
@@ -0,0 +1,40 @@
#!/usr/bin/env bash
# Usage: publish_shiv_package_github.sh <major> <minor> <patch>
# Uses this script package to publish a new release:
# https://github.com/cerc-io/github-release-api
# User must define: CERC_GH_RELEASE_SCRIPTS_DIR
# pointing to the location of that cloned repository
# e.g.
# cd ~/projects
# git clone https://github.com/cerc-io/github-release-api
# cd ./stack-orchestrator
# export CERC_GH_RELEASE_SCRIPTS_DIR=~/projects/github-release-api
# ./scripts/publish_shiv_package_github.sh
# In addition, a valid GitHub token must be defined in
# CERC_PACKAGE_RELEASE_GITHUB_TOKEN
if [[ -z "${CERC_PACKAGE_RELEASE_GITHUB_TOKEN}" ]]; then
echo "CERC_PACKAGE_RELEASE_GITHUB_TOKEN is not set" >&2
exit 1
fi
# TODO: check args and env vars
major=$1
minor=$2
patch=$3
export PATH=$CERC_GH_RELEASE_SCRIPTS_DIR:$PATH
github_org="cerc-io"
github_repository="stack-orchestrator"
latest_package=$(ls -1t ./package/* | head -1)
uploaded_package="./package/laconic-so"
# Remove any old package
rm ${uploaded_package}
cp ${latest_package} ${uploaded_package}
github_release_manager.sh \
-l notused -t ${CERC_PACKAGE_RELEASE_GITHUB_TOKEN} \
-o ${github_org} -r ${github_repository} \
-d v${major}.${minor}.${patch} \
-c create -m "Release v${major}.${minor}.${patch}"
github_release_manager.sh \
-l notused -t ${CERC_PACKAGE_RELEASE_GITHUB_TOKEN} \
-o ${github_org} -r ${github_repository} \
-d v${major}.${minor}.${patch} \
-c upload ${uploaded_package}
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Usage: tag_new_release.sh <major> <minor> <patch>
# Uses this script package to tag a new release:
# User must define: CERC_GH_RELEASE_SCRIPTS_DIR
# pointing to the location of that cloned repository
# e.g.
# cd ~/projects
# git clone https://github.com/cerc-io/github-release-api
# cd ./stack-orchestrator
# export CERC_GH_RELEASE_SCRIPTS_DIR=~/projects/github-release-api
# ./scripts/publish_shiv_package_github.sh
# TODO: check args and env vars
major=$1
minor=$2
patch=$3
export PATH=$CERC_GH_RELEASE_SCRIPTS_DIR:$PATH
git_tag_manager.sh -M ${major} -m ${minor} -p ${patch} -t "Release ${major}.${minor}.${patch}"
+1 -1
View File
@@ -6,7 +6,7 @@ with open("requirements.txt", "r", encoding="utf-8") as fh:
requirements = fh.read() requirements = fh.read()
setup( setup(
name='laconic-stack-orchestrator', name='laconic-stack-orchestrator',
version='1.0.9', version='1.0.12',
author='Cerc', author='Cerc',
author_email='info@cerc.io', author_email='info@cerc.io',
license='GNU Affero General Public License', license='GNU Affero General Public License',
+8 -6
View File
@@ -13,13 +13,15 @@ rm -rf $CERC_REPO_BASE_DIR
mkdir -p $CERC_REPO_BASE_DIR mkdir -p $CERC_REPO_BASE_DIR
# Pull an example small public repo to test we can pull a repo # Pull an example small public repo to test we can pull a repo
$TEST_TARGET_SO setup-repositories --include cerc-io/laconic-sdk $TEST_TARGET_SO setup-repositories --include cerc-io/laconic-sdk
# TODO: test building the repo into a container # Test pulling a stack
# Build two example containers $TEST_TARGET_SO --stack test setup-repositories
# TODO: # Test building the a stack container
$TEST_TARGET_SO build-containers --include cerc/builder-js,cerc/test-container $TEST_TARGET_SO --stack test build-containers
# Build one example containers
$TEST_TARGET_SO build-containers --include cerc/builder-js
# Deploy the test container # Deploy the test container
$TEST_TARGET_SO deploy-system --include test up $TEST_TARGET_SO --stack test deploy-system up
# TODO: test that we can use the deployed container somehow # TODO: test that we can use the deployed container somehow
# Clean up # Clean up
$TEST_TARGET_SO deploy-system --include test down $TEST_TARGET_SO --stack test deploy-system down
echo "Test passed" echo "Test passed"