diff --git a/Exesh/Makefile b/Exesh/Makefile deleted file mode 100644 index d5c18b34..00000000 --- a/Exesh/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -stress: - python3 stress.py - -clean: - rm -rf config/test && \ - docker rm -f $$(docker ps -aq) && \ - docker volume rm test_postgres diff --git a/Exesh/cmd/coordinator/main.go b/Exesh/cmd/coordinator/main.go index b39b559f..6a350a0a 100644 --- a/Exesh/cmd/coordinator/main.go +++ b/Exesh/cmd/coordinator/main.go @@ -55,7 +55,7 @@ func main() { return } - fs, err := filestorage.New(log, cfg.FileStorage, mux) + fs, err := filestorage.New(log, cfg.FileStorage.ToExternal(), mux) if err != nil { log.Error("failed to create filestorage", slog.String("error", err.Error())) return diff --git a/Exesh/cmd/worker/main.go b/Exesh/cmd/worker/main.go index 6c661612..600e1507 100644 --- a/Exesh/cmd/worker/main.go +++ b/Exesh/cmd/worker/main.go @@ -45,7 +45,7 @@ func main() { mux := chi.NewRouter() - fs, err := filestorage.New(log, cfg.FileStorage, mux) + fs, err := filestorage.New(log, cfg.FileStorage.ToExternal(), mux) if err != nil { log.Error("failed to create filestorage", slog.String("error", err.Error())) return diff --git a/Exesh/config/coordinator/docker.yml b/Exesh/config/coordinator.yml similarity index 100% rename from Exesh/config/coordinator/docker.yml rename to Exesh/config/coordinator.yml diff --git a/Exesh/config/coordinator/dev.yml b/Exesh/config/coordinator/dev.yml deleted file mode 100644 index 6babaf1b..00000000 --- a/Exesh/config/coordinator/dev.yml +++ /dev/null @@ -1,31 +0,0 @@ -env: dev -http_server: - addr: localhost:5253 -storage: - connection_string: host=localhost port=5433 database=exesh user=coordinator password=secret - init_timeout: 60s -filestorage: - root_dir: file_storage/coordinator - trasher: - workers: 1 - collector_iterations_delay: 60 - worker_iterations_delay: 5 -job_factory: - output: - compiled_binary: bin - run_output: output - source_ttl: - filestorage_bucket: 30m - filestorage_endpoint: http://coordinator:5253 -execution_scheduler: - executions_interval: 5s - max_concurrency: 10 - execution_retry_after: 30s -worker_pool: - worker_die_after: 10s -artifact_registry: - artifact_ttl: 3m -sender: - brokers: - - 0.0.0.0:29092 - topic: exesh.step-updates diff --git a/Exesh/config/worker-1/dev.yml b/Exesh/config/worker-1/dev.yml deleted file mode 100644 index 95b72cb2..00000000 --- a/Exesh/config/worker-1/dev.yml +++ /dev/null @@ -1,20 +0,0 @@ -env: dev -http_server: - addr: localhost:5254 -filestorage: - root_dir: file_storage/worker-1 - trasher: - workers: 1 - collector_iterations_delay: 60 - worker_iterations_delay: 5 -source_provider: - filestorage_bucket_ttl: 15m - artifact_ttl: 5m -output_provider: - artifact_ttl: 5m -worker: - id: http://localhost:5254 - free_slots: 1 - coordinator_endpoint: http://localhost:5253 - heartbeat_delay: 5s - worker_delay: 2s diff --git a/Exesh/config/worker-2/dev.yml b/Exesh/config/worker-2/dev.yml deleted file mode 100644 index e9d786c2..00000000 --- a/Exesh/config/worker-2/dev.yml +++ /dev/null @@ -1,20 +0,0 @@ -env: dev -http_server: - addr: localhost:5255 -filestorage: - root_dir: file_storage/worker-2 - trasher: - workers: 1 - collector_iterations_delay: 60 - worker_iterations_delay: 5 -source_provider: - filestorage_bucket_ttl: 15m - artifact_ttl: 5m -output_provider: - artifact_ttl: 5m -worker: - id: http://localhost:5255 - free_slots: 1 - coordinator_endpoint: http://localhost:5253 - heartbeat_delay: 5s - worker_delay: 2s diff --git a/Exesh/config/worker-2/docker.yml b/Exesh/config/worker-2/docker.yml deleted file mode 100644 index 496ea9aa..00000000 --- a/Exesh/config/worker-2/docker.yml +++ /dev/null @@ -1,21 +0,0 @@ -env: docker -http_server: - addr: 0.0.0.0:5255 - metrics_addr: 0.0.0.0:9092 -filestorage: - root_dir: file_storage/worker-2 - trasher: - workers: 1 - collector_iterations_delay: 60 - worker_iterations_delay: 5 -source_provider: - filestorage_bucket_ttl: 15m - artifact_ttl: 5m -output_provider: - artifact_ttl: 5m -worker: - id: http://worker-2:5255 - free_slots: 2 - coordinator_endpoint: http://coordinator:5253 - heartbeat_delay: 100ms - worker_delay: 100ms diff --git a/Exesh/config/worker-1/docker.yml b/Exesh/config/worker.yml similarity index 86% rename from Exesh/config/worker-1/docker.yml rename to Exesh/config/worker.yml index 1e4bf214..814e1259 100644 --- a/Exesh/config/worker-1/docker.yml +++ b/Exesh/config/worker.yml @@ -3,7 +3,7 @@ http_server: addr: 0.0.0.0:5254 metrics_addr: 0.0.0.0:9091 filestorage: - root_dir: file_storage/worker-1 + root_dir: file_storage/worker trasher: workers: 1 collector_iterations_delay: 60 @@ -14,7 +14,7 @@ source_provider: output_provider: artifact_ttl: 5m worker: - id: http://worker-1:5254 + id: http://worker:5254 free_slots: 2 coordinator_endpoint: http://coordinator:5253 heartbeat_delay: 100ms diff --git a/Exesh/docker-compose.yml b/Exesh/docker-compose.yml index 82700588..79cb2812 100644 --- a/Exesh/docker-compose.yml +++ b/Exesh/docker-compose.yml @@ -40,7 +40,10 @@ services: - "5253:5253" - "9080:9090" environment: - CONFIG_PATH: /config/coordinator/docker.yml + CONFIG_PATH: /config/coordinator.yml + EXESH_HTTP_SERVER_ADDR: 0.0.0.0:5253 + EXESH_HTTP_SERVER_METRICS_ADDR: 0.0.0.0:9090 + EXESH_JOB_FACTORY_FILESTORAGE_ENDPOINT: http://coordinator:5253 depends_on: postgres: condition: service_healthy @@ -60,7 +63,12 @@ services: - "5254:5254" - "9081:9091" environment: - CONFIG_PATH: /config/worker-1/docker.yml + CONFIG_PATH: /config/worker.yml + EXESH_HTTP_SERVER_ADDR: 0.0.0.0:5254 + EXESH_HTTP_SERVER_METRICS_ADDR: 0.0.0.0:9091 + EXESH_FILE_STORAGE_ROOT_DIR: file_storage/worker-1 + EXESH_WORKER_ID: http://worker-1:5254 + EXESH_WORKER_COORDINATOR_ENDPOINT: http://coordinator:5253 volumes: - /var/run/docker.sock:/var/run/docker.sock - ./config:/config:ro @@ -78,7 +86,12 @@ services: - "5255:5255" - "9082:9092" environment: - CONFIG_PATH: /config/worker-2/docker.yml + CONFIG_PATH: /config/worker.yml + EXESH_HTTP_SERVER_ADDR: 0.0.0.0:5255 + EXESH_HTTP_SERVER_METRICS_ADDR: 0.0.0.0:9092 + EXESH_FILE_STORAGE_ROOT_DIR: file_storage/worker-2 + EXESH_WORKER_ID: http://worker-2:5255 + EXESH_WORKER_COORDINATOR_ENDPOINT: http://coordinator:5253 volumes: - /var/run/docker.sock:/var/run/docker.sock - ./config:/config:ro diff --git a/Exesh/internal/config/config.go b/Exesh/internal/config/config.go index bc190248..4d06ad1e 100644 --- a/Exesh/internal/config/config.go +++ b/Exesh/internal/config/config.go @@ -2,7 +2,7 @@ package config type ( HttpServerConfig struct { - Addr string `yaml:"addr"` - MetricsAddr string `yaml:"metrics_addr"` + Addr string `yaml:"addr" env:"ADDR"` + MetricsAddr string `yaml:"metrics_addr" env:"METRICS_ADDR"` } ) diff --git a/Exesh/internal/config/coordinator_config.go b/Exesh/internal/config/coordinator_config.go index 1806f3b3..81156f3a 100644 --- a/Exesh/internal/config/coordinator_config.go +++ b/Exesh/internal/config/coordinator_config.go @@ -5,56 +5,55 @@ import ( "os" "time" - filestorage "github.com/DIvanCode/filestorage/pkg/config" "github.com/ilyakaznacheev/cleanenv" ) type ( CoordinatorConfig struct { - Env string `yaml:"env"` - HttpServer HttpServerConfig `yaml:"http_server"` - Storage StorageConfig `yaml:"storage"` - FileStorage filestorage.Config `yaml:"filestorage"` - JobFactory JobFactoryConfig `yaml:"job_factory"` - ExecutionScheduler ExecutionSchedulerConfig `yaml:"execution_scheduler"` - WorkerPool WorkerPoolConfig `yaml:"worker_pool"` - ArtifactRegistry ArtifactRegistryConfig `yaml:"artifact_registry"` - Sender SenderConfig `yaml:"sender"` + Env string `yaml:"env" env:"EXESH_ENV"` + HttpServer HttpServerConfig `yaml:"http_server" env-prefix:"EXESH_HTTP_SERVER_"` + Storage StorageConfig `yaml:"storage" env-prefix:"EXESH_STORAGE_"` + FileStorage FileStorageConfig `yaml:"filestorage" env-prefix:"EXESH_FILE_STORAGE_"` + JobFactory JobFactoryConfig `yaml:"job_factory" env-prefix:"EXESH_JOB_FACTORY_"` + ExecutionScheduler ExecutionSchedulerConfig `yaml:"execution_scheduler" env-prefix:"EXESH_EXECUTION_SCHEDULER_"` + WorkerPool WorkerPoolConfig `yaml:"worker_pool" env-prefix:"EXESH_WORKER_POOL_"` + ArtifactRegistry ArtifactRegistryConfig `yaml:"artifact_registry" env-prefix:"EXESH_ARTIFACT_REGISTRY_"` + Sender SenderConfig `yaml:"sender" env-prefix:"EXESH_SENDER_"` } StorageConfig struct { - ConnectionString string `yaml:"connection_string"` - InitTimeout time.Duration `yaml:"init_timeout"` + ConnectionString string `yaml:"connection_string" env:"CONNECTION_STRING"` + InitTimeout time.Duration `yaml:"init_timeout" env:"INIT_TIMEOUT"` } ExecutionSchedulerConfig struct { - ExecutionsInterval time.Duration `yaml:"executions_interval"` - MaxConcurrency int `yaml:"max_concurrency"` - ExecutionRetryAfter time.Duration `yaml:"execution_retry_after"` + ExecutionsInterval time.Duration `yaml:"executions_interval" env:"EXECUTIONS_INTERVAL"` + MaxConcurrency int `yaml:"max_concurrency" env:"MAX_CONCURRENCY"` + ExecutionRetryAfter time.Duration `yaml:"execution_retry_after" env:"EXECUTION_RETRY_AFTER"` } JobFactoryConfig struct { Output struct { - CompiledBinary string `yaml:"compiled_binary"` - RunOutput string `yaml:"run_output"` - } `yaml:"output"` + CompiledBinary string `yaml:"compiled_binary" env:"COMPILED_BINARY"` + RunOutput string `yaml:"run_output" env:"RUN_OUTPUT"` + } `yaml:"output" env-prefix:"OUTPUT_"` SourceTTL struct { - FilestorageBucket time.Duration `yaml:"filestorage_bucket"` - } `yaml:"source_ttl"` - FilestorageEndpoint string `yaml:"filestorage_endpoint"` + FilestorageBucket time.Duration `yaml:"filestorage_bucket" env:"FILESTORAGE_BUCKET"` + } `yaml:"source_ttl" env-prefix:"SOURCE_TTL_"` + FilestorageEndpoint string `yaml:"filestorage_endpoint" env:"FILESTORAGE_ENDPOINT"` } WorkerPoolConfig struct { - WorkerDieAfter time.Duration `yaml:"worker_die_after"` + WorkerDieAfter time.Duration `yaml:"worker_die_after" env:"WORKER_DIE_AFTER"` } ArtifactRegistryConfig struct { - ArtifactTTL time.Duration `yaml:"artifact_ttl"` + ArtifactTTL time.Duration `yaml:"artifact_ttl" env:"ARTIFACT_TTL"` } SenderConfig struct { - Brokers []string `yaml:"brokers"` - Topic string `yaml:"topic"` + Brokers []string `yaml:"brokers" env:"BROKERS" env-separator:","` + Topic string `yaml:"topic" env:"TOPIC"` } ) diff --git a/Exesh/internal/config/filestorage_config.go b/Exesh/internal/config/filestorage_config.go new file mode 100644 index 00000000..be7186c9 --- /dev/null +++ b/Exesh/internal/config/filestorage_config.go @@ -0,0 +1,27 @@ +package config + +import filestorage "github.com/DIvanCode/filestorage/pkg/config" + +type ( + FileStorageConfig struct { + RootDir string `yaml:"root_dir" env:"ROOT_DIR"` + Trasher FileStorageTrasherConfig `yaml:"trasher" env-prefix:"TRASHER_"` + } + + FileStorageTrasherConfig struct { + Workers int `yaml:"workers" env:"WORKERS"` + CollectorIterationsDelay int `yaml:"collector_iterations_delay" env:"COLLECTOR_ITERATIONS_DELAY"` + WorkerIterationsDelay int `yaml:"worker_iterations_delay" env:"WORKER_ITERATIONS_DELAY"` + } +) + +func (c FileStorageConfig) ToExternal() filestorage.Config { + return filestorage.Config{ + RootDir: c.RootDir, + Trasher: filestorage.TrasherConfig{ + Workers: c.Trasher.Workers, + CollectorIterationsDelay: c.Trasher.CollectorIterationsDelay, + WorkerIterationsDelay: c.Trasher.WorkerIterationsDelay, + }, + } +} diff --git a/Exesh/internal/config/worker_config.go b/Exesh/internal/config/worker_config.go index c09b203a..93eca452 100644 --- a/Exesh/internal/config/worker_config.go +++ b/Exesh/internal/config/worker_config.go @@ -5,35 +5,34 @@ import ( "os" "time" - filestorage "github.com/DIvanCode/filestorage/pkg/config" "github.com/ilyakaznacheev/cleanenv" ) type ( WorkerConfig struct { - Env string `yaml:"env"` - HttpServer HttpServerConfig `yaml:"http_server"` - FileStorage filestorage.Config `yaml:"filestorage"` - SourceProvider SourceProviderConfig `yaml:"input_provider"` - OutputProvider OutputProviderConfig `yaml:"output_provider"` - Worker WorkConfig `yaml:"worker"` + Env string `yaml:"env" env:"EXESH_ENV"` + HttpServer HttpServerConfig `yaml:"http_server" env-prefix:"EXESH_HTTP_SERVER_"` + FileStorage FileStorageConfig `yaml:"filestorage" env-prefix:"EXESH_FILE_STORAGE_"` + SourceProvider SourceProviderConfig `yaml:"source_provider" env-prefix:"EXESH_SOURCE_PROVIDER_"` + OutputProvider OutputProviderConfig `yaml:"output_provider" env-prefix:"EXESH_OUTPUT_PROVIDER_"` + Worker WorkConfig `yaml:"worker" env-prefix:"EXESH_WORKER_"` } SourceProviderConfig struct { - FilestorageBucketTTL time.Duration `yaml:"filestorage_bucket_ttl"` - ArtifactTTL time.Duration `yaml:"artifact_ttl"` + FilestorageBucketTTL time.Duration `yaml:"filestorage_bucket_ttl" env:"FILESTORAGE_BUCKET_TTL"` + ArtifactTTL time.Duration `yaml:"artifact_ttl" env:"ARTIFACT_TTL"` } OutputProviderConfig struct { - ArtifactTTL time.Duration `yaml:"artifact_ttl"` + ArtifactTTL time.Duration `yaml:"artifact_ttl" env:"ARTIFACT_TTL"` } WorkConfig struct { - WorkerID string `yaml:"id"` - FreeSlots int `yaml:"free_slots"` - CoordinatorEndpoint string `yaml:"coordinator_endpoint"` - HeartbeatDelay time.Duration `yaml:"heartbeat_delay"` - WorkerDelay time.Duration `yaml:"worker_delay"` + WorkerID string `yaml:"id" env:"ID"` + FreeSlots int `yaml:"free_slots" env:"FREE_SLOTS"` + CoordinatorEndpoint string `yaml:"coordinator_endpoint" env:"COORDINATOR_ENDPOINT"` + HeartbeatDelay time.Duration `yaml:"heartbeat_delay" env:"HEARTBEAT_DELAY"` + WorkerDelay time.Duration `yaml:"worker_delay" env:"WORKER_DELAY"` } ) diff --git a/Exesh/internal/worker/worker.go b/Exesh/internal/worker/worker.go index d2a8045d..6eff9d02 100644 --- a/Exesh/internal/worker/worker.go +++ b/Exesh/internal/worker/worker.go @@ -82,7 +82,6 @@ func (w *Worker) runHeartbeat(ctx context.Context) { } if w.getFreeSlots() == 0 { - w.log.Debug("skip heartbeat loop (no free slots)") continue } diff --git a/Exesh/stress.py b/Exesh/stress.py index c34b2e21..013e7294 100644 --- a/Exesh/stress.py +++ b/Exesh/stress.py @@ -7,62 +7,30 @@ class Coordinator: - base_config = """ -env: docker -http_server: - addr: 0.0.0.0:{PORT} - metrics_addr: 0.0.0.0:{METRICS_PORT} -storage: - connection_string: host=exesh_postgres port=5432 database=exesh user=coordinator password=secret - init_timeout: 60s -filestorage: - root_dir: file_storage/cluster-{CLUSTER}/coordinator - trasher: - workers: 1 - collector_iterations_delay: 60 - worker_iterations_delay: 5 -input_provider: - filestorage_bucket_ttl: 15m - artifact_ttl: 5m -job_factory: - output: - compiled_cpp: bin - run_output: output - check_verdict: verdict - filestorage_endpoint: http://coordinator-{CLUSTER}:{PORT} -execution_scheduler: - executions_interval: 1s - max_concurrency: 1 - execution_retry_after: 1500s -worker_pool: - worker_die_after: 10s -artifact_registry: - artifact_ttl: 3m -sender: - brokers: - - kafka:9092 - topic: exesh.step-updates -""" - base_docker_compose = """ coordinator-{CLUSTER}: build: - context: ../../ + context: {PROJECT_ROOT} dockerfile: Dockerfile command: - /app/bin/coordinator container_name: coordinator-{CLUSTER} ports: - "{PORT}:{PORT}" + - "{METRICS_PORT}:{METRICS_PORT}" networks: - coduels environment: - CONFIG_PATH: /{CLUSTER_PATH}/coordinator.yml + CONFIG_PATH: /config/coordinator.yml + EXESH_HTTP_SERVER_ADDR: 0.0.0.0:{PORT} + EXESH_HTTP_SERVER_METRICS_ADDR: 0.0.0.0:{METRICS_PORT} + EXESH_FILE_STORAGE_ROOT_DIR: file_storage/cluster-{CLUSTER}/coordinator + EXESH_JOB_FACTORY_FILESTORAGE_ENDPOINT: http://coordinator-{CLUSTER}:{PORT} depends_on: postgres: condition: service_healthy volumes: - - ../../{CLUSTER_PATH}:/{CLUSTER_PATH}:ro + - {PROJECT_ROOT}/config:/config:ro """ def __init__(self, cluster, port, metrics_port): @@ -70,62 +38,39 @@ def __init__(self, cluster, port, metrics_port): self.port = port self.metrics_port = metrics_port - def generate_config(self): - config = self.base_config[:] - config = config.replace("{CLUSTER}", str(self.cluster)) - config = config.replace("{PORT}", str(self.port)) - config = config.replace("{METRICS_PORT}", str(self.metrics_port)) - return config - - def generate_docker_compose(self, cluster_path): + def generate_docker_compose(self, project_root): docker_compose = self.base_docker_compose[:] docker_compose = docker_compose.replace("{CLUSTER}", str(self.cluster)) - docker_compose = docker_compose.replace("{CLUSTER_PATH}", cluster_path) + docker_compose = docker_compose.replace("{PROJECT_ROOT}", project_root) docker_compose = docker_compose.replace("{PORT}", str(self.port)) docker_compose = docker_compose.replace("{METRICS_PORT}", str(self.metrics_port)) return docker_compose class Worker: - base_config = """ -env: docker -http_server: - addr: 0.0.0.0:{PORT} - metrics_addr: 0.0.0.0:{METRICS_PORT} -filestorage: - root_dir: file_storage/cluster-{CLUSTER}/worker-{WORKER} - trasher: - workers: 1 - collector_iterations_delay: 60 - worker_iterations_delay: 5 -input_provider: - filestorage_bucket_ttl: 15m - artifact_ttl: 5m -output_provider: - artifact_ttl: 5m -worker: - id: http://worker-{CLUSTER}-{WORKER}:{PORT} - free_slots: 4 - coordinator_endpoint: http://coordinator-{CLUSTER}:{COORDINATOR_PORT} - heartbeat_delay: 2s - worker_delay: 1s -""" - base_docker_compose = """ worker-{CLUSTER}-{WORKER}: build: - context: ../../ + context: {PROJECT_ROOT} dockerfile: Dockerfile command: - /app/bin/worker container_name: worker-{CLUSTER}-{WORKER} + ports: + - "{PORT}:{PORT}" + - "{METRICS_PORT}:{METRICS_PORT}" networks: - coduels environment: - CONFIG_PATH: /{CLUSTER_PATH}/worker-{WORKER}.yml + CONFIG_PATH: /config/worker.yml + EXESH_HTTP_SERVER_ADDR: 0.0.0.0:{PORT} + EXESH_HTTP_SERVER_METRICS_ADDR: 0.0.0.0:{METRICS_PORT} + EXESH_FILE_STORAGE_ROOT_DIR: file_storage/cluster-{CLUSTER}/worker-{WORKER} + EXESH_WORKER_ID: http://worker-{CLUSTER}-{WORKER}:{PORT} + EXESH_WORKER_COORDINATOR_ENDPOINT: http://coordinator-{CLUSTER}:{COORDINATOR_PORT} volumes: - /var/run/docker.sock:/var/run/docker.sock - - ../../{CLUSTER_PATH}:/{CLUSTER_PATH}:ro + - {PROJECT_ROOT}/config:/config:ro """ def __init__(self, cluster, worker, port, metrics_port, coordinator_port): @@ -135,22 +80,14 @@ def __init__(self, cluster, worker, port, metrics_port, coordinator_port): self.metrics_port = metrics_port self.coordinator_port = coordinator_port - def generate_config(self): - config = self.base_config[:] - config = config.replace("{CLUSTER}", str(self.cluster)) - config = config.replace("{WORKER}", str(self.worker)) - config = config.replace("{PORT}", str(self.port)) - config = config.replace("{METRICS_PORT}", str(self.metrics_port)) - config = config.replace("{COORDINATOR_PORT}", str(self.coordinator_port)) - return config - - def generate_docker_compose(self, cluster_path): + def generate_docker_compose(self, project_root): docker_compose = self.base_docker_compose[:] docker_compose = docker_compose.replace("{CLUSTER}", str(self.cluster)) - docker_compose = docker_compose.replace("{CLUSTER_PATH}", cluster_path) + docker_compose = docker_compose.replace("{PROJECT_ROOT}", project_root) docker_compose = docker_compose.replace("{WORKER}", str(self.worker)) docker_compose = docker_compose.replace("{PORT}", str(self.port)) docker_compose = docker_compose.replace("{METRICS_PORT}", str(self.metrics_port)) + docker_compose = docker_compose.replace("{COORDINATOR_PORT}", str(self.coordinator_port)) return docker_compose @@ -165,36 +102,24 @@ def get_port(self): class Cluster: - def __init__(self, port_manager, config_path, cluster_id, n_workers): + def __init__(self, port_manager, cluster_id, n_workers): self.port_manager = port_manager self.cluster_id = cluster_id - self.cluster_path = config_path + "/cluster-" + str(self.cluster_id) self.n_workers = n_workers - def create_configs(self): - os.mkdir(self.cluster_path) - + def create(self): self.coordinator = Coordinator(self.cluster_id, self.port_manager.get_port(), self.port_manager.get_port()) - f = open(self.cluster_path + "/coordinator.yml", "w") - f.write(self.coordinator.generate_config()) - f.close() - self.workers = [] for worker_id in range(self.n_workers): worker = Worker(self.cluster_id, worker_id, self.port_manager.get_port(), self.port_manager.get_port(), self.coordinator.port) - - f = open(self.cluster_path + "/worker-" + str(worker_id) + ".yml", "w") - f.write(worker.generate_config()) - f.close() - self.workers.append(worker) - def generate_docker_compose(self): - docker_compose = self.coordinator.generate_docker_compose(self.cluster_path) + def generate_docker_compose(self, project_root): + docker_compose = self.coordinator.generate_docker_compose(project_root) for worker in self.workers: - docker_compose += worker.generate_docker_compose(self.cluster_path) + docker_compose += worker.generate_docker_compose(project_root) return docker_compose @@ -275,20 +200,21 @@ class Exesh: def __init__(self, n_clusters, n_workers, config_path): self.n_clusters = n_clusters self.n_workers = n_workers - self.config_path = config_path + self.config_path = os.path.abspath(config_path) + self.project_root = os.path.abspath(os.getcwd()) def configure(self): docker_compose = self.infrastructure_docker_compose - os.mkdir(self.config_path) + os.makedirs(self.config_path, exist_ok=True) port_manager = PortManager(5556) self.clusters = [] for cluster_id in range(self.n_clusters): - cluster = Cluster(port_manager, self.config_path, cluster_id, self.n_workers) - cluster.create_configs() + cluster = Cluster(port_manager, cluster_id, self.n_workers) + cluster.create() - docker_compose += cluster.generate_docker_compose() + docker_compose += cluster.generate_docker_compose(self.project_root) self.clusters.append(cluster) @@ -297,7 +223,7 @@ def configure(self): f.close() def run(self): - pwd = os.curdir + pwd = os.getcwd() os.chdir(self.config_path) try: subprocess.run(["docker-compose", "up", "-d", "--build"], check=True)