UNPKG

f5-conx-core

Version:

F5 SDK for JavaScript with Typescript type definitions

332 lines (255 loc) 8.45 kB
# f5-conx-core Enhancement Roadmap **Status:** Planning **Last Updated:** 2024-12-23 --- ## Overview Proposed enhancements to complete the f5-conx-core SDK for comprehensive BIG-IP management. These additions benefit all consumers (MCP servers, VSCode extensions, CLI tools) by providing structured APIs with proper async handling, TypeScript interfaces, and consistent error handling. --- ## Proposed Additions ### 1. UcsClient.restore() Complete the UCS lifecycle with restore functionality. **Rationale:** UCS restore has complex options and requires careful handling. A structured API prevents common mistakes. ```typescript interface UcsRestoreOptions { passphrase?: string; // For encrypted UCS noLicense?: boolean; // Skip license restoration noPlatformCheck?: boolean; // Skip platform validation resetTrust?: boolean; // Reset device trust includeChassisLevel?: boolean; // VIPRION chassis config } // Proposed API await f5Client.ucs.restore(filename: string, options?: UcsRestoreOptions): Promise<{ success: boolean; duration_ms: number; warnings: string[]; reboot_required: boolean; }>; ``` **Implementation:** Uses `tmsh load sys ucs` via bash endpoint with option mapping. --- ### 2. SysClient System operations with proper async job handling. **Rationale:** Reboot/shutdown cause device disconnection - need graceful handling and reconnection logic. ```typescript // Proposed API f5Client.sys.reboot(options?: { volume?: string; // Boot to specific volume }): Promise<{ initiated: boolean; reconnect_hint_seconds: number }>; f5Client.sys.shutdown(): Promise<{ initiated: boolean }>; f5Client.sys.saveConfig(options?: { partitions?: string[]; // Specific partitions }): Promise<{ success: boolean }>; ``` **Implementation:** - Reboot: `tmsh reboot` or `/mgmt/tm/sys` API - Returns immediately with estimated reconnect time - Consumer handles reconnection polling --- ### 3. HaClient HA operations with structured status responses. **Rationale:** HA status has many fields; failover/sync are critical operations that benefit from validation and structured responses. ```typescript interface HaStatus { enabled: boolean; local: { name: string; state: 'active' | 'standby' | 'offline'; management_ip: string; }; peer?: { name: string; state: 'active' | 'standby' | 'offline'; management_ip: string; reachable: boolean; }; sync: { status: string; // "In Sync", "Changes Pending", etc. color: 'green' | 'yellow' | 'red'; group: string; last_sync: string; // ISO8601 }; failover: { state: string; last_failover?: string; // ISO8601 last_reason?: string; }; traffic_groups: { name: string; state: 'active' | 'standby'; }[]; } // Proposed API f5Client.ha.getStatus(): Promise<HaStatus>; f5Client.ha.failover(options?: { trafficGroup?: string; // Specific traffic group }): Promise<{ success: boolean; previous_state: string; new_state: string; duration_ms: number; }>; f5Client.ha.sync(options?: { direction: 'to-group' | 'from-peer'; group?: string; // Auto-detected if omitted force?: boolean; // Force full sync }): Promise<{ success: boolean; sync_type: 'incremental' | 'full'; changes_synced: number; }>; ``` **Implementation:** - Status: `/mgmt/tm/cm/device` + `/mgmt/tm/cm/sync-status` - Failover: `tmsh run sys failover standby` or API - Sync: `/mgmt/tm/cm/config-sync` --- ### 4. SoftwareClient Image management with async install tracking. **Rationale:** Software installation is async and long-running (15-45 min). Needs progress monitoring. ```typescript interface SoftwareImage { name: string; version: string; build: string; size_mb: number; verified: boolean; } interface SoftwareVolume { name: string; // e.g., "HD1.1" version: string; build: string; active: boolean; status: 'complete' | 'installing' | 'failed'; } // Proposed API f5Client.software.listImages(): Promise<SoftwareImage[]>; f5Client.software.listVolumes(): Promise<SoftwareVolume[]>; f5Client.software.upload(localPath: string, options?: { verify?: boolean; }): Promise<{ filename: string; size_bytes: number; verified: boolean; }>; f5Client.software.install(image: string, options?: { volume?: string; // Auto-select inactive if omitted createVolume?: boolean; }): Promise<{ task_id: string; volume: string; status: 'installing'; }>; f5Client.software.installStatus(taskId: string): Promise<{ status: 'installing' | 'complete' | 'failed'; progress_percent?: number; error?: string; }>; f5Client.software.deleteImage(filename: string): Promise<{ success: boolean }>; ``` **Implementation:** - List: `/mgmt/tm/sys/software/image`, `/mgmt/tm/sys/software/volume` - Upload: File upload API - Install: `/mgmt/tm/sys/software/volume` with async job - Status: Poll `/mgmt/tm/sys/software/volume/{name}` --- ### 5. StatsClient LTM statistics with consistent structure. **Rationale:** Stats endpoints return deeply nested structures. A wrapper normalizes the response. ```typescript interface VirtualStats { name: string; destination: string; status: { availability: 'available' | 'offline' | 'unknown'; state: 'enabled' | 'disabled'; reason: string; }; connections: { current: number; max: number; total: number; }; bytes: { in: number; out: number }; packets: { in: number; out: number }; } interface PoolStats { name: string; status: { availability: string; state: string }; members_up: number; members_total: number; connections: { current: number; total: number }; bytes: { in: number; out: number }; } // Proposed API f5Client.stats.virtuals(name?: string): Promise<VirtualStats[]>; f5Client.stats.pools(name?: string): Promise<PoolStats[]>; f5Client.stats.nodes(name?: string): Promise<NodeStats[]>; ``` **Implementation:** `/mgmt/tm/ltm/*/stats` with response normalization. --- ### 6. LogsClient Log retrieval with filtering. **Rationale:** Logs are commonly needed for troubleshooting. Structured filtering avoids bash parsing in consumers. ```typescript type LogFile = 'ltm' | 'gtm' | 'audit' | 'restjavad' | 'restnoded' | 'apm' | 'asm'; interface LogEntry { timestamp: string; // ISO8601 severity?: string; source?: string; message: string; raw: string; } interface LogsOptions { lines?: number; // Tail N lines (default: 100) grep?: string; // Filter pattern since?: string; // ISO8601 timestamp severity?: 'debug' | 'info' | 'warning' | 'error' | 'critical'; } // Proposed API f5Client.logs.get(log: LogFile, options?: LogsOptions): Promise<{ entries: LogEntry[]; total_lines: number; filtered: boolean; }>; f5Client.logs.list(): Promise<{ name: LogFile; path: string; size_bytes: number; modified: string; }[]>; ``` **Implementation:** - bash: `tail -n {lines} /var/log/{log} | grep {pattern}` - Parse output into structured entries --- ## Implementation Priority ### Phase 1: Core Operations - [ ] `UcsClient.restore()` - Completes backup/restore cycle - [ ] `SysClient` - Reboot, shutdown, save config ### Phase 2: HA Operations - [ ] `HaClient` - Status, failover, sync ### Phase 3: Software Management - [ ] `SoftwareClient` - Image lifecycle with async install ### Phase 4: Observability - [ ] `StatsClient` - Normalized statistics - [ ] `LogsClient` - Log retrieval with filtering --- ## Design Principles 1. **Async-first** - Long operations return task IDs, provide status methods 2. **Structured responses** - TypeScript interfaces, not raw strings 3. **Consistent errors** - Use existing `F5Error` class 4. **Testable** - Unit tests with nock mocks 5. **Documented** - JSDoc comments, update README --- ## Alternatives Considered **Bash wrapper approach:** All operations could be done via `F5Client.https('/mgmt/tm/util/bash')`. This works but: - Requires parsing bash output in every consumer - No TypeScript type safety - Harder to test - Duplicates logic across MCP server, VSCode extension, etc. **Conclusion:** Library-level support provides better DX and reusability. --- ## Changelog ### 2024-12-23 - Initial roadmap created - Identified 6 enhancement areas with TypeScript interfaces