mirror of
https://github.com/Lore09/Tesi-Magistrale.git
synced 2026-02-04 05:21:15 +00:00
added remove command
This commit is contained in:
@@ -1,10 +1,7 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import src
|
import src
|
||||||
from dotenv import load_dotenv
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
load_dotenv()
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description="Generate, build and deploy WASM components written in go"
|
description="Generate, build and deploy WASM components written in go"
|
||||||
@@ -21,6 +18,9 @@ def main():
|
|||||||
parser_deploy = subparsers.add_parser("deploy", help="Deploy WASM components")
|
parser_deploy = subparsers.add_parser("deploy", help="Deploy WASM components")
|
||||||
parser_deploy.add_argument("dir", type=str, help="Project directory")
|
parser_deploy.add_argument("dir", type=str, help="Project directory")
|
||||||
|
|
||||||
|
parser_remove = subparsers.add_parser("remove", help="Remove deployed WASM components", aliases=["rm"])
|
||||||
|
parser_remove.add_argument("dir", type=str, help="Project directory")
|
||||||
|
|
||||||
parser_all = subparsers.add_parser("brush", help="Everything above")
|
parser_all = subparsers.add_parser("brush", help="Everything above")
|
||||||
parser_all.add_argument("dir", type=str, help="Project directory")
|
parser_all.add_argument("dir", type=str, help="Project directory")
|
||||||
|
|
||||||
@@ -37,6 +37,8 @@ def main():
|
|||||||
pelato.build(args.dir)
|
pelato.build(args.dir)
|
||||||
elif args.command == "deploy":
|
elif args.command == "deploy":
|
||||||
pelato.deploy(args.dir)
|
pelato.deploy(args.dir)
|
||||||
|
elif args.command == "remove":
|
||||||
|
pelato.remove(args.dir)
|
||||||
elif args.command == "brush":
|
elif args.command == "brush":
|
||||||
pelato.all(args.dir)
|
pelato.all(args.dir)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -1,21 +1,20 @@
|
|||||||
project_name: Test
|
project_name: Test
|
||||||
tasks:
|
tasks:
|
||||||
- name: Data Aggregation
|
- name: Data Stream test 1
|
||||||
type: processor_nats
|
type: processor_nats
|
||||||
code: task1.go
|
code: task1.go
|
||||||
targets:
|
targets:
|
||||||
- edge
|
|
||||||
- cloud
|
- cloud
|
||||||
source_topic: temp_sensor
|
source_topic: test_source
|
||||||
dest_topic: aggregated_data
|
dest_topic: test_destination
|
||||||
component_name: data_aggregation
|
component_name: data_aggregation_test
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
- name: Aiutatemi
|
- name: Aiutatemi
|
||||||
type: processor_nats
|
type: producer_nats
|
||||||
code: danano.go
|
code: danano.go
|
||||||
targets:
|
targets:
|
||||||
- edge
|
- edge
|
||||||
source_topic: test
|
source_topic: test
|
||||||
dest_topic: temp_sensor
|
dest_topic: test_source
|
||||||
component_name: test_producer
|
component_name: test_producer_help
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
@@ -1,9 +1,12 @@
|
|||||||
import os
|
import os
|
||||||
|
from dotenv import load_dotenv
|
||||||
import src.code_generator.generator as code_generator
|
import src.code_generator.generator as code_generator
|
||||||
import src.wasm_builder.build as wasm_builder
|
import src.wasm_builder.build as wasm_builder
|
||||||
import src.component_deploy.deploy as deployer
|
import src.component_deploy.deploy as deployer
|
||||||
|
import src.component_deploy.remove as remover
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
|
||||||
class Pelato:
|
class Pelato:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
||||||
@@ -11,6 +14,8 @@ class Pelato:
|
|||||||
|
|
||||||
def setup_vars(self):
|
def setup_vars(self):
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
self.registry_url = os.getenv('REGISTRY_URL')
|
self.registry_url = os.getenv('REGISTRY_URL')
|
||||||
self.reg_user = os.getenv('REGISTRY_USER')
|
self.reg_user = os.getenv('REGISTRY_USER')
|
||||||
self.reg_pass = os.getenv('REGISTRY_PASSWORD')
|
self.reg_pass = os.getenv('REGISTRY_PASSWORD')
|
||||||
@@ -26,6 +31,9 @@ class Pelato:
|
|||||||
|
|
||||||
def deploy(self, project_dir):
|
def deploy(self, project_dir):
|
||||||
deployer.deploy_components(project_dir, self.nats_host, self.nats_port, self.detached)
|
deployer.deploy_components(project_dir, self.nats_host, self.nats_port, self.detached)
|
||||||
|
|
||||||
|
def remove(self, project_dir):
|
||||||
|
remover.remove_components(project_dir, self.nats_host, self.nats_port, self.detached)
|
||||||
|
|
||||||
def all(self, project_dir):
|
def all(self, project_dir):
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ def deploy_components(project_dir, nats_host, nats_port, detached):
|
|||||||
logging.error(f"Error deploying project: {e}")
|
logging.error(f"Error deploying project: {e}")
|
||||||
return
|
return
|
||||||
|
|
||||||
print("Project built successfully")
|
print("Project deployed successfully")
|
||||||
|
|
||||||
def __deploy_wadm(task_dir, client, nats_host, nats_port, detached, wait_list):
|
def __deploy_wadm(task_dir, client, nats_host, nats_port, detached, wait_list):
|
||||||
|
|
||||||
|
|||||||
23
src/component_deploy/docker/remove.Dockerfile
Normal file
23
src/component_deploy/docker/remove.Dockerfile
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
FROM ubuntu:24.04 AS wash-deploy-image
|
||||||
|
|
||||||
|
# Install dependencies and tools
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
tar \
|
||||||
|
git \
|
||||||
|
build-essential \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# ----------------- Install WasmCloud -----------------
|
||||||
|
RUN curl -s "https://packagecloud.io/install/repositories/wasmcloud/core/script.deb.sh" | bash && \
|
||||||
|
apt-get install -y wash
|
||||||
|
|
||||||
|
# ----------------- Deploy the WasmCloud module -----------------
|
||||||
|
FROM wash-deploy-image
|
||||||
|
|
||||||
|
RUN mkdir /app
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Deploy the WasmCloud module
|
||||||
|
CMD ["sh", "-c", "wash app delete wadm.yaml"]
|
||||||
82
src/component_deploy/remove.py
Normal file
82
src/component_deploy/remove.py
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
import docker
|
||||||
|
import os
|
||||||
|
import logging
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
def remove_components(project_dir, nats_host, nats_port, detached):
|
||||||
|
|
||||||
|
# Check if the project directory is valid
|
||||||
|
if not os.path.exists(f"{project_dir}/gen"):
|
||||||
|
logging.error(f"Project directory is not valid")
|
||||||
|
return
|
||||||
|
|
||||||
|
print('Removing WASM components')
|
||||||
|
|
||||||
|
# Docker client
|
||||||
|
client = docker.from_env()
|
||||||
|
|
||||||
|
# Build the images for the project if they don't exist
|
||||||
|
try:
|
||||||
|
client.images.get("wash-remove-image:latest")
|
||||||
|
except docker.errors.ImageNotFound:
|
||||||
|
|
||||||
|
print(' - Building wash-remove-image from Dockerfile...')
|
||||||
|
client.images.build(
|
||||||
|
path="src/component_deploy/docker",
|
||||||
|
dockerfile="remove.Dockerfile",
|
||||||
|
tag="wash-remove-image:latest"
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
wait_list = []
|
||||||
|
|
||||||
|
for task in os.listdir(f"{project_dir}/gen"):
|
||||||
|
__remove_wadm(f"{project_dir}/gen/{task}", client, nats_host, nats_port, detached, wait_list)
|
||||||
|
|
||||||
|
if detached == 'True':
|
||||||
|
|
||||||
|
print('Waiting for component remove...')
|
||||||
|
for container in wait_list:
|
||||||
|
try:
|
||||||
|
client.containers.get(container).wait()
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error removing components: {e}")
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def __remove_wadm(task_dir, client, nats_host, nats_port, detached, wait_list):
|
||||||
|
|
||||||
|
wadm = __parse_yaml(f"{task_dir}/wadm.yaml")
|
||||||
|
|
||||||
|
path = os.path.abspath(task_dir)
|
||||||
|
|
||||||
|
name = wadm['spec']['components'][0]['name'] + '-remove'
|
||||||
|
|
||||||
|
# Build the wasm module
|
||||||
|
print(f" - Removing WASM module {name} from WasmCloud")
|
||||||
|
container = client.containers.run(
|
||||||
|
"wash-remove-image:latest",
|
||||||
|
environment=[f'WASMCLOUD_CTL_HOST={nats_host}',
|
||||||
|
f'WASMCLOUD_CTL_PORT={nats_port}'],
|
||||||
|
volumes={path: {'bind': '/app', 'mode': 'rw'}},
|
||||||
|
remove=True,
|
||||||
|
detach=True,
|
||||||
|
name=name
|
||||||
|
)
|
||||||
|
|
||||||
|
if detached == 'False':
|
||||||
|
container.wait()
|
||||||
|
else:
|
||||||
|
wait_list.append(name)
|
||||||
|
|
||||||
|
|
||||||
|
def __parse_yaml(yaml_file):
|
||||||
|
with open(yaml_file, 'r') as stream:
|
||||||
|
try:
|
||||||
|
return yaml.safe_load(stream)
|
||||||
|
except yaml.YAMLError as exc:
|
||||||
|
print(exc)
|
||||||
|
return None
|
||||||
Reference in New Issue
Block a user