Some checks are pending
Test Publishing Setup / Test Publishing Setup (pull_request) Waiting to run
- Add a workflow for testing the publishing setup - Add a workflow for publishing SAL crates to crates.io - Improve crate metadata and version management - Add optional dependencies for modularity - Improve documentation for publishing and usage
293 lines
8.3 KiB
Plaintext
293 lines
8.3 KiB
Plaintext
#!/usr/bin/env rhai
|
|
|
|
// Test 3: PCRE Pattern Matching for Bulk Operations
|
|
// This test covers the powerful pattern-based deletion functionality
|
|
|
|
// Helper function to generate timestamp for unique names
|
|
fn timestamp() {
|
|
let now = 1640995200; // Base timestamp
|
|
let random = (now % 1000000).to_string();
|
|
random
|
|
}
|
|
|
|
print("=== Kubernetes PCRE Pattern Matching Test ===");
|
|
print("");
|
|
|
|
// Setup test namespace
|
|
let test_namespace = "sal-test-patterns-" + timestamp();
|
|
print("Setting up test namespace: " + test_namespace);
|
|
|
|
try {
|
|
let setup_km = kubernetes_manager_new("default");
|
|
setup_km.create_namespace(test_namespace);
|
|
print("✅ Test namespace created");
|
|
} catch (error) {
|
|
print("❌ Failed to create test namespace: " + error);
|
|
throw error;
|
|
}
|
|
|
|
// Create manager for test namespace
|
|
let km = kubernetes_manager_new(test_namespace);
|
|
|
|
print("");
|
|
|
|
// Create multiple test resources with different naming patterns
|
|
print("Test 1: Creating Test Resources");
|
|
print("------------------------------");
|
|
|
|
let test_resources = [
|
|
"test-app-frontend",
|
|
"test-app-backend",
|
|
"test-app-database",
|
|
"prod-app-frontend",
|
|
"prod-app-backend",
|
|
"staging-service",
|
|
"dev-service",
|
|
"temp-worker-1",
|
|
"temp-worker-2",
|
|
"permanent-service"
|
|
];
|
|
|
|
try {
|
|
print("Creating " + test_resources.len() + " test pods...");
|
|
|
|
for resource_name in test_resources {
|
|
let labels = #{
|
|
"app": resource_name,
|
|
"test": "pattern-matching",
|
|
"created-by": "sal-integration-test"
|
|
};
|
|
|
|
km.create_pod(resource_name, "nginx:alpine", labels);
|
|
print(" ✅ Created: " + resource_name);
|
|
}
|
|
|
|
print("✅ All test resources created");
|
|
|
|
} catch (error) {
|
|
print("❌ Test resource creation failed: " + error);
|
|
throw error;
|
|
}
|
|
|
|
print("");
|
|
|
|
// Verify all resources exist
|
|
print("Test 2: Verify Resource Creation");
|
|
print("--------------------------------");
|
|
|
|
try {
|
|
let all_pods = km.pods_list();
|
|
print("Total pods created: " + all_pods.len());
|
|
|
|
if all_pods.len() >= test_resources.len() {
|
|
print("✅ Expected number of pods found");
|
|
} else {
|
|
print("❌ Missing pods. Expected: " + test_resources.len() + ", Found: " + all_pods.len());
|
|
throw "Resource verification failed";
|
|
}
|
|
|
|
// List all pod names for verification
|
|
print("Created pods:");
|
|
for pod in all_pods {
|
|
print(" - " + pod.name);
|
|
}
|
|
|
|
} catch (error) {
|
|
print("❌ Resource verification failed: " + error);
|
|
throw error;
|
|
}
|
|
|
|
print("");
|
|
|
|
// Test pattern matching - delete all "test-app-*" resources
|
|
print("Test 3: Pattern Deletion - test-app-*");
|
|
print("--------------------------------------");
|
|
|
|
try {
|
|
let pattern = "test-app-.*";
|
|
print("Deleting resources matching pattern: " + pattern);
|
|
|
|
// Count pods before deletion
|
|
let pods_before = km.pods_list();
|
|
let count_before = pods_before.len();
|
|
print("Pods before deletion: " + count_before);
|
|
|
|
// Perform pattern deletion
|
|
km.delete(pattern);
|
|
print("✅ Pattern deletion executed");
|
|
|
|
// Wait for deletion to propagate
|
|
print("Waiting for deletion to propagate...");
|
|
|
|
// Count pods after deletion
|
|
let pods_after = km.pods_list();
|
|
let count_after = pods_after.len();
|
|
print("Pods after deletion: " + count_after);
|
|
|
|
// Should have deleted 3 pods (test-app-frontend, test-app-backend, test-app-database)
|
|
let expected_deleted = 3;
|
|
let actual_deleted = count_before - count_after;
|
|
|
|
if actual_deleted >= expected_deleted {
|
|
print("✅ Pattern deletion successful. Deleted " + actual_deleted + " pods");
|
|
} else {
|
|
print("⚠️ Pattern deletion may still be propagating. Expected to delete " + expected_deleted + ", deleted " + actual_deleted);
|
|
}
|
|
|
|
// Verify specific pods are gone
|
|
print("Remaining pods:");
|
|
for pod in pods_after {
|
|
print(" - " + pod.name);
|
|
|
|
// Check that no test-app-* pods remain
|
|
if pod.name.starts_with("test-app-") {
|
|
print("❌ Found test-app pod that should have been deleted: " + pod.name);
|
|
}
|
|
}
|
|
|
|
} catch (error) {
|
|
print("❌ Pattern deletion test failed: " + error);
|
|
throw error;
|
|
}
|
|
|
|
print("");
|
|
|
|
// Test more specific pattern - delete all "temp-*" resources
|
|
print("Test 4: Pattern Deletion - temp-*");
|
|
print("----------------------------------");
|
|
|
|
try {
|
|
let pattern = "temp-.*";
|
|
print("Deleting resources matching pattern: " + pattern);
|
|
|
|
// Count pods before deletion
|
|
let pods_before = km.pods_list();
|
|
let count_before = pods_before.len();
|
|
print("Pods before deletion: " + count_before);
|
|
|
|
// Perform pattern deletion
|
|
km.delete(pattern);
|
|
print("✅ Pattern deletion executed");
|
|
|
|
// Wait for deletion to propagate
|
|
print("Waiting for deletion to propagate...");
|
|
|
|
// Count pods after deletion
|
|
let pods_after = km.pods_list();
|
|
let count_after = pods_after.len();
|
|
print("Pods after deletion: " + count_after);
|
|
|
|
// Should have deleted 2 pods (temp-worker-1, temp-worker-2)
|
|
let expected_deleted = 2;
|
|
let actual_deleted = count_before - count_after;
|
|
|
|
if actual_deleted >= expected_deleted {
|
|
print("✅ Pattern deletion successful. Deleted " + actual_deleted + " pods");
|
|
} else {
|
|
print("⚠️ Pattern deletion may still be propagating. Expected to delete " + expected_deleted + ", deleted " + actual_deleted);
|
|
}
|
|
|
|
} catch (error) {
|
|
print("❌ Temp pattern deletion test failed: " + error);
|
|
throw error;
|
|
}
|
|
|
|
print("");
|
|
|
|
// Test complex pattern - delete all "*-service" resources
|
|
print("Test 5: Pattern Deletion - *-service");
|
|
print("------------------------------------");
|
|
|
|
try {
|
|
let pattern = ".*-service$";
|
|
print("Deleting resources matching pattern: " + pattern);
|
|
|
|
// Count pods before deletion
|
|
let pods_before = km.pods_list();
|
|
let count_before = pods_before.len();
|
|
print("Pods before deletion: " + count_before);
|
|
|
|
// Perform pattern deletion
|
|
km.delete(pattern);
|
|
print("✅ Pattern deletion executed");
|
|
|
|
// Wait for deletion to propagate
|
|
print("Waiting for deletion to propagate...");
|
|
|
|
// Count pods after deletion
|
|
let pods_after = km.pods_list();
|
|
let count_after = pods_after.len();
|
|
print("Pods after deletion: " + count_after);
|
|
|
|
// Should have deleted service pods (staging-service, dev-service, permanent-service)
|
|
let actual_deleted = count_before - count_after;
|
|
print("✅ Pattern deletion executed. Deleted " + actual_deleted + " pods");
|
|
|
|
} catch (error) {
|
|
print("❌ Service pattern deletion test failed: " + error);
|
|
throw error;
|
|
}
|
|
|
|
print("");
|
|
|
|
// Test safety - verify remaining resources
|
|
print("Test 6: Verify Remaining Resources");
|
|
print("----------------------------------");
|
|
|
|
try {
|
|
let remaining_pods = km.pods_list();
|
|
print("Remaining pods: " + remaining_pods.len());
|
|
|
|
print("Remaining pod names:");
|
|
for pod in remaining_pods {
|
|
print(" - " + pod.name);
|
|
}
|
|
|
|
// Should only have prod-app-* pods remaining
|
|
let expected_remaining = ["prod-app-frontend", "prod-app-backend"];
|
|
|
|
for pod in remaining_pods {
|
|
let is_expected = false;
|
|
for expected in expected_remaining {
|
|
if pod.name == expected {
|
|
is_expected = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if is_expected {
|
|
print("✅ Expected pod remains: " + pod.name);
|
|
} else {
|
|
print("⚠️ Unexpected pod remains: " + pod.name);
|
|
}
|
|
}
|
|
|
|
} catch (error) {
|
|
print("❌ Remaining resources verification failed: " + error);
|
|
throw error;
|
|
}
|
|
|
|
print("");
|
|
|
|
// Cleanup
|
|
print("Test 7: Cleanup");
|
|
print("---------------");
|
|
|
|
try {
|
|
let cleanup_km = kubernetes_manager_new("default");
|
|
cleanup_km.delete_namespace(test_namespace);
|
|
print("✅ Test namespace cleanup initiated");
|
|
|
|
} catch (error) {
|
|
print("❌ Cleanup failed: " + error);
|
|
// Don't throw here as this is cleanup
|
|
}
|
|
|
|
print("");
|
|
print("=== PCRE Pattern Matching Test Complete ===");
|
|
print("✅ All pattern matching tests passed");
|
|
print("");
|
|
print("⚠️ IMPORTANT: Pattern deletion is a powerful feature!");
|
|
print(" Always test patterns in safe environments first.");
|
|
print(" Use specific patterns to avoid accidental deletions.");
|