- Add Kubernetes cluster management and operations - Include pod, service, and deployment management - Implement pattern-based resource deletion - Support namespace creation and management - Provide Rhai scripting wrappers for all functions - Include production safety features (timeouts, retries, rate limiting)
209 lines
5.8 KiB
Plaintext
209 lines
5.8 KiB
Plaintext
//! Multi-namespace Kubernetes operations example
|
|
//!
|
|
//! This script demonstrates working with multiple namespaces and comparing resources across them.
|
|
//!
|
|
//! Prerequisites:
|
|
//! - A running Kubernetes cluster
|
|
//! - Valid kubeconfig file or in-cluster configuration
|
|
//! - Appropriate permissions for the operations
|
|
//!
|
|
//! Usage:
|
|
//! herodo examples/kubernetes/multi_namespace_operations.rhai
|
|
|
|
print("=== SAL Kubernetes Multi-Namespace Operations Example ===");
|
|
|
|
// Define namespaces to work with
|
|
let target_namespaces = ["default", "kube-system"];
|
|
let managers = #{};
|
|
|
|
print("Creating managers for multiple namespaces...");
|
|
|
|
// Create managers for each namespace
|
|
for ns in target_namespaces {
|
|
try {
|
|
let km = kubernetes_manager_new(ns);
|
|
managers[ns] = km;
|
|
print("✓ Created manager for namespace: " + ns);
|
|
} catch(e) {
|
|
print("✗ Failed to create manager for " + ns + ": " + e);
|
|
}
|
|
}
|
|
|
|
// Function to safely get resource counts
|
|
fn get_safe_counts(km) {
|
|
try {
|
|
return resource_counts(km);
|
|
} catch(e) {
|
|
print(" Warning: Could not get resource counts - " + e);
|
|
return #{};
|
|
}
|
|
}
|
|
|
|
// Function to safely get pod list
|
|
fn get_safe_pods(km) {
|
|
try {
|
|
return pods_list(km);
|
|
} catch(e) {
|
|
print(" Warning: Could not list pods - " + e);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
// Compare resource counts across namespaces
|
|
print("\n--- Resource Comparison Across Namespaces ---");
|
|
let total_resources = #{};
|
|
|
|
for ns in target_namespaces {
|
|
if ns in managers {
|
|
let km = managers[ns];
|
|
print("\nNamespace: " + ns);
|
|
let counts = get_safe_counts(km);
|
|
|
|
for resource_type in counts.keys() {
|
|
let count = counts[resource_type];
|
|
print(" " + resource_type + ": " + count);
|
|
|
|
// Accumulate totals
|
|
if resource_type in total_resources {
|
|
total_resources[resource_type] = total_resources[resource_type] + count;
|
|
} else {
|
|
total_resources[resource_type] = count;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
print("\n--- Total Resources Across All Namespaces ---");
|
|
for resource_type in total_resources.keys() {
|
|
print("Total " + resource_type + ": " + total_resources[resource_type]);
|
|
}
|
|
|
|
// Find namespaces with the most resources
|
|
print("\n--- Namespace Resource Analysis ---");
|
|
let namespace_totals = #{};
|
|
|
|
for ns in target_namespaces {
|
|
if ns in managers {
|
|
let km = managers[ns];
|
|
let counts = get_safe_counts(km);
|
|
let total = 0;
|
|
|
|
for resource_type in counts.keys() {
|
|
total = total + counts[resource_type];
|
|
}
|
|
|
|
namespace_totals[ns] = total;
|
|
print("Namespace '" + ns + "' has " + total + " total resources");
|
|
}
|
|
}
|
|
|
|
// Find the busiest namespace
|
|
let busiest_ns = "";
|
|
let max_resources = 0;
|
|
for ns in namespace_totals.keys() {
|
|
if namespace_totals[ns] > max_resources {
|
|
max_resources = namespace_totals[ns];
|
|
busiest_ns = ns;
|
|
}
|
|
}
|
|
|
|
if busiest_ns != "" {
|
|
print("🏆 Busiest namespace: '" + busiest_ns + "' with " + max_resources + " resources");
|
|
}
|
|
|
|
// Detailed pod analysis
|
|
print("\n--- Pod Analysis Across Namespaces ---");
|
|
let all_pods = [];
|
|
|
|
for ns in target_namespaces {
|
|
if ns in managers {
|
|
let km = managers[ns];
|
|
let pods = get_safe_pods(km);
|
|
|
|
print("\nNamespace '" + ns + "' pods:");
|
|
if pods.len() == 0 {
|
|
print(" (no pods)");
|
|
} else {
|
|
for pod in pods {
|
|
print(" - " + pod);
|
|
all_pods.push(ns + "/" + pod);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
print("\n--- All Pods Summary ---");
|
|
print("Total pods across all namespaces: " + all_pods.len());
|
|
|
|
// Look for common pod name patterns
|
|
print("\n--- Pod Name Pattern Analysis ---");
|
|
let patterns = #{
|
|
"system": 0,
|
|
"kube": 0,
|
|
"coredns": 0,
|
|
"proxy": 0,
|
|
"controller": 0
|
|
};
|
|
|
|
for pod_full_name in all_pods {
|
|
let pod_name = pod_full_name.to_lower();
|
|
|
|
for pattern in patterns.keys() {
|
|
if pod_name.contains(pattern) {
|
|
patterns[pattern] = patterns[pattern] + 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
print("Common pod name patterns found:");
|
|
for pattern in patterns.keys() {
|
|
if patterns[pattern] > 0 {
|
|
print(" '" + pattern + "': " + patterns[pattern] + " pods");
|
|
}
|
|
}
|
|
|
|
// Namespace health check
|
|
print("\n--- Namespace Health Check ---");
|
|
for ns in target_namespaces {
|
|
if ns in managers {
|
|
let km = managers[ns];
|
|
print("\nChecking namespace: " + ns);
|
|
|
|
// Check if namespace exists (should always be true for our managers)
|
|
let exists = namespace_exists(km, ns);
|
|
if exists {
|
|
print(" ✓ Namespace exists and is accessible");
|
|
} else {
|
|
print(" ✗ Namespace existence check failed");
|
|
}
|
|
|
|
// Try to get resource counts as a health indicator
|
|
let counts = get_safe_counts(km);
|
|
if counts.len() > 0 {
|
|
print(" ✓ Can access resources (" + counts.len() + " resource types)");
|
|
} else {
|
|
print(" ⚠ No resources found or access limited");
|
|
}
|
|
}
|
|
}
|
|
|
|
// Create a summary report
|
|
print("\n--- Summary Report ---");
|
|
print("Namespaces analyzed: " + target_namespaces.len());
|
|
print("Total unique resource types: " + total_resources.len());
|
|
|
|
let grand_total = 0;
|
|
for resource_type in total_resources.keys() {
|
|
grand_total = grand_total + total_resources[resource_type];
|
|
}
|
|
print("Grand total resources: " + grand_total);
|
|
|
|
print("\nResource breakdown:");
|
|
for resource_type in total_resources.keys() {
|
|
let count = total_resources[resource_type];
|
|
let percentage = (count * 100) / grand_total;
|
|
print(" " + resource_type + ": " + count + " (" + percentage + "%)");
|
|
}
|
|
|
|
print("\n=== Multi-namespace operations example completed! ===");
|