Merge pull request #3 from Lore09/pelato

Pelato
This commit is contained in:
Lorenzo Venerandi
2025-01-29 22:45:45 +01:00
committed by GitHub
12 changed files with 159 additions and 21 deletions

View File

@@ -1,4 +1,6 @@
REGISTRY_URL= REGISTRY_URL=
REGISTRY_USER= REGISTRY_USER=
REGISTRY_PASSWORD= REGISTRY_PASSWORD=
PARALLEL_BUILD= PARALLEL_BUILD=
NATS_HOST=
NATS_PORT=

View File

@@ -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

View File

@@ -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
View File

@@ -0,0 +1,12 @@
package main
import (
)
func exec_task(arg string) string{
response := "" + arg
return response
}

View File

@@ -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
} }

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View 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

View File

@@ -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):