148 lines
4.4 KiB
Go
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
|
|
} |