orama/core/pkg/cli/functions/deploy.go

90 lines
2.0 KiB
Go

package functions
import (
"fmt"
"os"
"path/filepath"
"github.com/spf13/cobra"
)
// DeployCmd deploys a function to the Orama Network.
var DeployCmd = &cobra.Command{
Use: "deploy [directory]",
Short: "Deploy a function to the Orama Network",
Long: `Deploys the function in the given directory (or current directory).
If no .wasm file exists, it will be built automatically using TinyGo.
Reads configuration from function.yaml.`,
Args: cobra.MaximumNArgs(1),
RunE: runDeploy,
}
func runDeploy(cmd *cobra.Command, args []string) error {
dir := ""
if len(args) > 0 {
dir = args[0]
}
absDir, err := ResolveFunctionDir(dir)
if err != nil {
return err
}
// Load configuration
cfg, err := LoadConfig(absDir)
if err != nil {
return err
}
wasmPath := filepath.Join(absDir, "function.wasm")
// Auto-build if no WASM file exists
if _, err := os.Stat(wasmPath); os.IsNotExist(err) {
fmt.Printf("No function.wasm found, building...\n\n")
built, err := buildFunction(dir)
if err != nil {
return err
}
wasmPath = built
fmt.Println()
} else {
// Validate existing WASM
if err := ValidateWASMFile(wasmPath); err != nil {
return fmt.Errorf("existing function.wasm is invalid: %w\nRun 'orama function build' to rebuild", err)
}
}
fmt.Printf("Deploying function %q...\n", cfg.Name)
result, err := uploadWASMFunction(wasmPath, cfg)
if err != nil {
return err
}
fmt.Printf("\nFunction deployed successfully!\n\n")
if msg, ok := result["message"]; ok {
fmt.Printf(" %s\n", msg)
}
if fn, ok := result["function"].(map[string]interface{}); ok {
if id, ok := fn["id"]; ok {
fmt.Printf(" ID: %s\n", id)
}
fmt.Printf(" Name: %s\n", cfg.Name)
if v, ok := fn["version"]; ok {
fmt.Printf(" Version: %v\n", v)
}
if wc, ok := fn["wasm_cid"]; ok {
fmt.Printf(" WASM CID: %s\n", wc)
}
if st, ok := fn["status"]; ok {
fmt.Printf(" Status: %s\n", st)
}
}
fmt.Printf("\nInvoke with:\n")
fmt.Printf(" orama function invoke %s --data '{\"name\": \"World\"}'\n", cfg.Name)
return nil
}