Files
skybridge/faas-client/example/main.go
2025-08-31 17:19:13 -04:00

148 lines
4.4 KiB
Go

package main
import (
"context"
"encoding/json"
"log"
"time"
"github.com/google/uuid"
faasclient "github.com/RyanCopley/skybridge/faas-client"
)
func main() {
// Create FaaS client
client := faasclient.NewClient(
"http://localhost:8080",
faasclient.WithUserEmail("admin@example.com"),
)
ctx := context.Background()
// Create a simple Node.js function
log.Println("Creating function...")
createReq := &faasclient.CreateFunctionRequest{
Name: "hello-world-example",
AppID: "example-app",
Runtime: faasclient.RuntimeNodeJS18,
Handler: "index.handler",
Code: "exports.handler = async (event) => { return { message: 'Hello, ' + (event.name || 'World') + '!' }; }",
Environment: map[string]string{
"NODE_ENV": "production",
},
Timeout: faasclient.Duration(30 * time.Second),
Memory: 256,
Owner: faasclient.Owner{
Type: faasclient.OwnerTypeIndividual,
Name: "Example User",
Owner: "admin@example.com",
},
}
function, err := client.CreateFunction(ctx, createReq)
if err != nil {
log.Fatalf("Failed to create function: %v", err)
}
log.Printf("Created function: %s (ID: %s)", function.Name, function.ID)
// Deploy the function
log.Println("Deploying function...")
deployResp, err := client.DeployFunction(ctx, function.ID, nil)
if err != nil {
log.Fatalf("Failed to deploy function: %v", err)
}
log.Printf("Deployment status: %s - %s", deployResp.Status, deployResp.Message)
// Execute function synchronously
log.Println("Executing function synchronously...")
input := json.RawMessage(`{"name": "Skybridge"}`)
executeReq := &faasclient.ExecuteFunctionRequest{
FunctionID: function.ID,
Input: input,
Async: false,
}
execResp, err := client.ExecuteFunction(ctx, executeReq)
if err != nil {
log.Fatalf("Failed to execute function: %v", err)
}
log.Printf("Sync execution result: %s", string(execResp.Output))
log.Printf("Duration: %v, Memory used: %d MB", execResp.Duration, execResp.MemoryUsed)
// Execute function asynchronously
log.Println("Invoking function asynchronously...")
asyncResp, err := client.InvokeFunction(ctx, function.ID, input)
if err != nil {
log.Fatalf("Failed to invoke function: %v", err)
}
log.Printf("Async execution ID: %s, Status: %s", asyncResp.ExecutionID, asyncResp.Status)
// Wait a moment for async execution to complete
time.Sleep(2 * time.Second)
// Get execution details
log.Println("Getting execution details...")
execution, err := client.GetExecution(ctx, asyncResp.ExecutionID)
if err != nil {
log.Fatalf("Failed to get execution: %v", err)
}
log.Printf("Execution status: %s", execution.Status)
if execution.Status == faasclient.StatusCompleted {
log.Printf("Async execution result: %s", string(execution.Output))
log.Printf("Duration: %v, Memory used: %d MB", execution.Duration, execution.MemoryUsed)
}
// Get execution logs
log.Println("Getting execution logs...")
logs, err := client.GetExecutionLogs(ctx, asyncResp.ExecutionID)
if err != nil {
log.Printf("Failed to get logs: %v", err)
} else {
log.Printf("Logs (%d entries):", len(logs.Logs))
for _, logLine := range logs.Logs {
log.Printf(" %s", logLine)
}
}
// List functions
log.Println("Listing functions...")
listResp, err := client.ListFunctions(ctx, "example-app", 10, 0)
if err != nil {
log.Fatalf("Failed to list functions: %v", err)
}
log.Printf("Found %d functions:", len(listResp.Functions))
for _, fn := range listResp.Functions {
log.Printf(" - %s (%s) - Runtime: %s", fn.Name, fn.ID, fn.Runtime)
}
// List executions for this function
log.Println("Listing executions...")
execListResp, err := client.ListExecutions(ctx, &function.ID, 10, 0)
if err != nil {
log.Fatalf("Failed to list executions: %v", err)
}
log.Printf("Found %d executions:", len(execListResp.Executions))
for _, exec := range execListResp.Executions {
status := string(exec.Status)
log.Printf(" - %s: %s (Duration: %v)", exec.ID, status, exec.Duration)
}
// Clean up - delete the function
log.Println("Cleaning up...")
err = client.DeleteFunction(ctx, function.ID)
if err != nil {
log.Fatalf("Failed to delete function: %v", err)
}
log.Printf("Deleted function: %s", function.ID)
log.Println("Example completed successfully!")
}
// Helper function to create a UUID from string (for testing)
func mustParseUUID(s string) uuid.UUID {
id, err := uuid.Parse(s)
if err != nil {
panic(err)
}
return id
}