mirror of
https://github.com/Lore09/Tesi-Magistrale.git
synced 2025-12-19 12:24:31 +00:00
@@ -2,3 +2,5 @@ REGISTRY_URL=
|
|||||||
REGISTRY_USER=
|
REGISTRY_USER=
|
||||||
REGISTRY_PASSWORD=
|
REGISTRY_PASSWORD=
|
||||||
PARALLEL_BUILD=
|
PARALLEL_BUILD=
|
||||||
|
NATS_HOST=
|
||||||
|
NATS_PORT=
|
||||||
@@ -16,7 +16,7 @@ nast server check connection
|
|||||||
|
|
||||||
Creare l'host wasmcloud con il comando
|
Creare l'host wasmcloud con il comando
|
||||||
```bash
|
```bash
|
||||||
wash up -d
|
wash up -d --multi-local
|
||||||
```
|
```
|
||||||
Controllare il corretto deployment dell'host
|
Controllare il corretto deployment dell'host
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
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"
|
||||||
)
|
)
|
||||||
|
|||||||
12
project/tasks/danano.go
Normal file
12
project/tasks/danano.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
func exec_task(arg string) string{
|
||||||
|
|
||||||
|
response := "" + arg
|
||||||
|
|
||||||
|
return response
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
|
|
||||||
func exec_task(arg string) string{
|
func exec_task(arg string) string{
|
||||||
|
|
||||||
response := "" + arg
|
response := "Ciao danano " + arg
|
||||||
|
|
||||||
return response
|
return response
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,21 @@
|
|||||||
|
project_name: Test
|
||||||
tasks:
|
tasks:
|
||||||
- name: Data Aggregation # Displayed name
|
- name: Data Aggregation
|
||||||
type: processor_nats # Used to select template
|
type: producer_nats
|
||||||
code: task1.go # Go code file inside tasks/ dir
|
code: task1.go
|
||||||
target: # Where the component will be deployed
|
targets:
|
||||||
- edge
|
- edge
|
||||||
- cloud
|
- cloud
|
||||||
source_topic: temp_sensor # Source NATS topic
|
source_topic: temp_sensor
|
||||||
dest_topic: aggregated_data # Destination NATS topic
|
dest_topic: aggregated_data
|
||||||
component_name: data_aggregation # Component name displayed in the OCI artifact
|
component_name: data_aggregation
|
||||||
|
version: 1.0.0
|
||||||
|
- name: Aiutatemi
|
||||||
|
type: processor_nats
|
||||||
|
code: danano.go
|
||||||
|
targets:
|
||||||
|
- edge
|
||||||
|
source_topic: test
|
||||||
|
dest_topic: temp_sensor
|
||||||
|
component_name: test_producer
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
from dotenv import load_dotenv
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
class Pelato:
|
class Pelato:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -10,12 +9,13 @@ class Pelato:
|
|||||||
self.setup_vars()
|
self.setup_vars()
|
||||||
|
|
||||||
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')
|
||||||
self.detached = os.getenv('PARALLEL_BUILD')
|
self.detached = os.getenv('PARALLEL_BUILD')
|
||||||
|
self.nats_host = os.getenv('NATS_HOST')
|
||||||
|
self.nats_port = os.getenv('NATS_PORT')
|
||||||
|
|
||||||
def generate(self, project_dir):
|
def generate(self, project_dir):
|
||||||
code_generator.generate(project_dir, self.registry_url)
|
code_generator.generate(project_dir, self.registry_url)
|
||||||
@@ -24,7 +24,14 @@ class Pelato:
|
|||||||
wasm_builder.build_project(project_dir, self.reg_user, self.reg_pass, self.detached)
|
wasm_builder.build_project(project_dir, self.reg_user, self.reg_pass, self.detached)
|
||||||
|
|
||||||
def deploy(self, project_dir):
|
def deploy(self, project_dir):
|
||||||
print(f"Deploying WASM components for project {project_dir}")
|
deployer.deploy_components(project_dir, self.nats_host, self.nats_port, self.detached)
|
||||||
|
|
||||||
def all(self, project_dir):
|
def all(self, project_dir):
|
||||||
print(f"Doing everything for project {project_dir}")
|
|
||||||
|
print('-------------------------------------------')
|
||||||
|
print(f"Starting PELATO for project {project_dir}")
|
||||||
|
print('-------------------------------------------')
|
||||||
|
|
||||||
|
self.generate(project_dir)
|
||||||
|
self.build(project_dir)
|
||||||
|
self.deploy(project_dir)
|
||||||
@@ -7,7 +7,7 @@ spec:
|
|||||||
- name: {{ component_name }}
|
- name: {{ component_name }}
|
||||||
type: component
|
type: component
|
||||||
properties:
|
properties:
|
||||||
image: "{{ registry_url }}/{{ component_name }}:{{ version }}"
|
image: {{ registry_url }}/{{ component_name }}:{{ version }}
|
||||||
id: stream
|
id: stream
|
||||||
traits:
|
traits:
|
||||||
- type: link
|
- type: link
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ spec:
|
|||||||
- name: {{ component_name }}
|
- name: {{ component_name }}
|
||||||
type: component
|
type: component
|
||||||
properties:
|
properties:
|
||||||
image: "{{ registry_url }}/{{ component_name }}:{{ version }}"
|
image: {{ registry_url }}/{{ component_name }}:{{ version }}
|
||||||
id: producer
|
id: producer
|
||||||
traits:
|
traits:
|
||||||
- type: spreadscaler
|
- type: spreadscaler
|
||||||
|
|||||||
83
src/component_deploy/deploy.py
Normal file
83
src/component_deploy/deploy.py
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
import docker
|
||||||
|
import os
|
||||||
|
import logging
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
def deploy_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('Deploying WASM components')
|
||||||
|
|
||||||
|
# Docker client
|
||||||
|
client = docker.from_env()
|
||||||
|
|
||||||
|
# Build the images for the project if they don't exist
|
||||||
|
try:
|
||||||
|
client.images.get("wash-deploy-image:latest")
|
||||||
|
except docker.errors.ImageNotFound:
|
||||||
|
|
||||||
|
print(' - Building wash-deploy-image from Dockerfile...')
|
||||||
|
client.images.build(
|
||||||
|
path="src/component_deploy/docker",
|
||||||
|
dockerfile="deploy.Dockerfile",
|
||||||
|
tag="wash-deploy-image:latest"
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
wait_list = []
|
||||||
|
|
||||||
|
for task in os.listdir(f"{project_dir}/gen"):
|
||||||
|
__deploy_wadm(f"{project_dir}/gen/{task}", client, nats_host, nats_port, detached, wait_list)
|
||||||
|
|
||||||
|
if detached == 'True':
|
||||||
|
|
||||||
|
print('Waiting for deployment...')
|
||||||
|
for container in wait_list:
|
||||||
|
try:
|
||||||
|
client.containers.get(container).wait()
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error deploying project: {e}")
|
||||||
|
return
|
||||||
|
|
||||||
|
print("Project built successfully")
|
||||||
|
|
||||||
|
def __deploy_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'] + '-deploy'
|
||||||
|
|
||||||
|
# Build the wasm module
|
||||||
|
print(f" - Deploying WASM module {name}")
|
||||||
|
container = client.containers.run(
|
||||||
|
"wash-deploy-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
|
||||||
@@ -10,6 +10,8 @@ def build_project(project_dir, reg_user, reg_pass, detached):
|
|||||||
logging.error(f"Project directory is not valid")
|
logging.error(f"Project directory is not valid")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
print('Building WASM components')
|
||||||
|
|
||||||
# Docker client
|
# Docker client
|
||||||
client = docker.from_env()
|
client = docker.from_env()
|
||||||
|
|
||||||
@@ -17,6 +19,8 @@ def build_project(project_dir, reg_user, reg_pass, detached):
|
|||||||
try:
|
try:
|
||||||
client.images.get("wash-build-image:latest")
|
client.images.get("wash-build-image:latest")
|
||||||
except docker.errors.ImageNotFound:
|
except docker.errors.ImageNotFound:
|
||||||
|
|
||||||
|
print(' - Building wash-build-image from Dockerfile...')
|
||||||
client.images.build(
|
client.images.build(
|
||||||
path="src/wasm_builder/docker",
|
path="src/wasm_builder/docker",
|
||||||
dockerfile="build.Dockerfile",
|
dockerfile="build.Dockerfile",
|
||||||
@@ -24,21 +28,34 @@ def build_project(project_dir, reg_user, reg_pass, detached):
|
|||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
wait_list = []
|
||||||
|
|
||||||
for task in os.listdir(f"{project_dir}/gen"):
|
for task in os.listdir(f"{project_dir}/gen"):
|
||||||
__build_wasm(f"{project_dir}/gen/{task}", client, reg_user, reg_pass, detached)
|
__build_wasm(f"{project_dir}/gen/{task}", client, reg_user, reg_pass, detached, wait_list)
|
||||||
|
|
||||||
|
if detached == 'True':
|
||||||
|
|
||||||
|
print('Waiting for build to finish...')
|
||||||
|
for container in wait_list:
|
||||||
|
try:
|
||||||
|
client.containers.get(container).wait()
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"Error building project: {e}")
|
logging.error(f"Error building project: {e}")
|
||||||
return
|
return
|
||||||
|
|
||||||
print("Project built successfully")
|
print("Project built successfully")
|
||||||
|
|
||||||
def __build_wasm(task_dir, client, reg_user, reg_pass, detached):
|
def __build_wasm(task_dir, client, reg_user, reg_pass, detached, wait_list):
|
||||||
|
|
||||||
wadm = __parse_yaml(f"{task_dir}/wadm.yaml")
|
wadm = __parse_yaml(f"{task_dir}/wadm.yaml")
|
||||||
|
|
||||||
path = os.path.abspath(task_dir)
|
path = os.path.abspath(task_dir)
|
||||||
|
|
||||||
oci_url = wadm['spec']['components'][0]['properties']['image']
|
oci_url = wadm['spec']['components'][0]['properties']['image']
|
||||||
|
name = wadm['spec']['components'][0]['name'] + '-build'
|
||||||
|
|
||||||
# Build the wasm module
|
# Build the wasm module
|
||||||
print(f" - Building WASM module {oci_url}")
|
print(f" - Building WASM module {oci_url}")
|
||||||
@@ -49,11 +66,14 @@ def __build_wasm(task_dir, client, reg_user, reg_pass, detached):
|
|||||||
f'WASH_REG_PASSWORD={reg_pass}'],
|
f'WASH_REG_PASSWORD={reg_pass}'],
|
||||||
volumes={path: {'bind': '/app', 'mode': 'rw'}},
|
volumes={path: {'bind': '/app', 'mode': 'rw'}},
|
||||||
remove=True,
|
remove=True,
|
||||||
detach=True
|
detach=True,
|
||||||
|
name=name
|
||||||
)
|
)
|
||||||
|
|
||||||
if detached == 'False':
|
if detached == 'False':
|
||||||
container.wait()
|
container.wait()
|
||||||
|
else:
|
||||||
|
wait_list.append(name)
|
||||||
|
|
||||||
|
|
||||||
def __parse_yaml(yaml_file):
|
def __parse_yaml(yaml_file):
|
||||||
|
|||||||
Reference in New Issue
Block a user