TN-012 β Implement Unified Cross-Platform Operator CLI tmctl for Container Engine API Orchestration¶
| Field | Value |
|---|---|
| Status | Completed |
| Activity Type | Implementation & Tooling |
| Record Type | Live |
| Project | Tomcat Monitoring |
| Phase | Continuous Integration and Deployment |
| Activity Date | 2026-09-14 |
| Recorded Date | 2026-09-14 |
| Owner | Eddy Wiyatno |
| Working Mode | Write |
| Authorization Status | Approved |
| Approved By | Eddy Wiyatno |
| Approval Date | 2026-09-14 |
π― Objective¶
Mengimplementasikan kakas baris perintah tunggal (Single Static Binary) berbasis bahasa Go (tmctl / tmctl.exe) yang berkomunikasi langsung dengan Container Engine Socket API (Podman / Docker) untuk orkestrasi kontainer dan manajemen platform secara seragam lintas sistem operasi (Linux & Windows), mengeliminasi ketergantungan pada kumpulan skrip imperatif Bash scripts/*.sh.
Aktivitas ini merupakan realisasi fisik Fase 1 dari keputusan arsitektur TM-ADR-0027 dan desain teknis TN-011 guna menuntaskan TASK-TM-027.
π Background & Problem Statement¶
Pada evaluasi arsitektur sebelumnya (TM-ADR-0027), diidentifikasi bahwa seluruh alur kerja manual operator masih bergantung pada kumpulan skrip shell Bash (scripts/deploy-*.sh, scripts/ingest-rule.sh, scripts/export-rules.sh, scripts/registry-login-helper.sh, scripts/validate.sh). Ketergantungan ini menimbulkan hambatan operasional:
- Kegagalan Eksekusi di Windows Native: Operator di lingkungan Windows tidak dapat menjalankan skrip
.shmelalui PowerShell atau Command Prompt tanpa memasang lapisan emulasi tambahan (WSL2 / Git Bash). - Kerapuhan CLI Scraping & String Parsing: Skrip imperatif rentan terhadap perbedaan line endings (
CRLF/LF), hak akses oktal POSIX, dan perbedaan perilaku utilitas coreutils. - Ketiadaan Antarmuka CLI Tunggal (Unified Tooling): Operator harus mengingat dan mengeksekusi banyak skrip terpisah alih-alih berinteraksi melalui kakas standar berbasis subperintah deklaratif.
Untuk mengatasi permasalahan tersebut, dibangun biner mandiri tmctl yang memanfaatkan soket REST API Container Engine sebagai antarmuka universal.
ποΈ Arsitektur & Desain Komponen tmctl¶
tmctl dirancang dengan prinsip Zero External Runtime Dependency dan CGO_ENABLED=0 (Pure Static Binary), memastikan biner dapat langsung dieksekusi tanpa instalasi runtime Python, Node.js, atau Bash pada workstation operator.
flowchart TD
subgraph OPERATOR["Operator / CI Runner (Linux & Windows)"]
CLI["tmctl / tmctl.exe"]
end
subgraph TRANSPORT["Cross-Platform Transport Layer"]
UNIX["Unix Domain Socket (/run/user/.../podman.sock)"]
PIPE["Windows Named Pipe (\\\\.\\pipe\\docker_engine)"]
TCP["TCP mTLS (Remote Docker/Podman Host)"]
end
subgraph ENGINE_API["Container Engine REST API"]
CONTAINERS["/containers (Create, Start, Stop, Rename, Inspect)"]
VOLUMES["/volumes (Create, Inspect, Remove)"]
NETWORKS["/networks (Create, Inspect, Remove)"]
end
subgraph FLEET["OCI Container Fleet"]
TOMCAT["tomcat-jmx-exporter (8083, 9404)"]
PROM["prometheus (9090)"]
AM["alertmanager (9093)"]
DS["diagnostic-service (8443)"]
MAIL["mailpit (8025, 1025) & postfix-relay (587)"]
end
CLI ==> TRANSPORT
TRANSPORT ==> ENGINE_API
ENGINE_API --> FLEET
Struktur Paket Go (Package Layout)¶
Modul Go diinisialisasi pada repositori mandiri tmctl dengan struktur direktori standar:
tmctl/
βββ go.mod # Inisialisasi modul Go (github.com/eddywiyatno/tmctl)
βββ Makefile # Automasi kompilasi native dan matriks cross-compilation
βββ Jenkinsfile # Declarative CI/CD pipeline
βββ cmd/
β βββ tmctl/
β βββ main.go # Entrypoint CLI & command routing
βββ internal/
β βββ buildinfo/
β β βββ version.go # Versioning, git commit SHA, build date, & OS/Arch
β βββ config/
β β βββ config.go # Parser konfigurasi deklaratif (CONFIG, env, defaults)
β β βββ config_test.go # Unit test parser konfigurasi
β βββ engine/
β β βββ client.go # EngineClient interface & socket auto-discovery
β β βββ engine_adapter.go # REST API client implementation (Podman & Docker)
β β βββ socket_unix.go # Unix Domain Socket dialer (Linux/Darwin)
β β βββ socket_windows.go # Windows Named Pipe & TCP dialer (Windows)
β β βββ types.go # Struct DTO untuk Container, Volume, Network, Image
β βββ orchestrator/
β β βββ deployer.go # Orchestrator alur deployment & auto-rollback
β β βββ readiness.go # Multi-endpoint readiness probing (HTTP/HTTPS/TCP)
β β βββ status.go # Inspeksi status kontainer & tabel ASCII
β β βββ cleaner.go # Pembersihan kontainer, volume, dan network
β β βββ specs.go # Builder spesifikasi deklaratif per workload
β β βββ specs_test.go # Unit test spesifikasi kontainer
β βββ rules/
β β βββ ingest.go # Klien REST API Ingestion & Batch Payload Handler
β β βββ export.go # Klien REST API Export & Category Aggregator
β βββ registry/
β β βββ auth.go # Authfile manager & isolated login/logout
β β βββ auth_test.go # Unit test registry credential isolation
β βββ validator/
β βββ validate.go # Validator layout direktori, schema JSON, dan forbidden files
β βββ validator_test.go # Unit test validator
βββ pkg/
β βββ termutil/
β βββ printer.go # Formatter output berwarna & tabel terminal
βββ scripts/
βββ build.sh # Skrip kompilasi silang multi-OS
βββ test.sh # Skrip eksekusi unit test
βββ validate.sh # Skrip validasi kontrak repositori
π οΈ Implementasi Subperintah tmctl¶
1. Manajemen Siklus Hidup Stack (tmctl stack)¶
Subperintah stack mengelola pembuatan, pemantauan, dan pembersihan kontainer platform:
tmctl stack deploy [--target <name>] [--env <name>] [--engine <podman|docker>]:- Melakukan rekonsiliasi jaringan bridge (
devops-lab) dan named volumes (tomcat_logs,diagnostic_data,prometheus_data,alertmanager_data, dll). - Menyematkan flag relabeling SELinux secara adaptif (
:z/:ro,zpada Linux,:ropada non-SELinux). - Zero-Downtime Rollback: Melakukan rename kontainer aktif ke
<name>-rollback-snapshot, membuat dan menyalakan kontainer baru, menjalankan readiness probe. Jika probe gagal, kontainer baru dieliminasi dan snapshot lama dipulihkan secara otomatis. tmctl stack status:- Menampilkan ringkasan tabular status seluruh kontainer armada monitoring, port bindings, dan status kesehatan (health status).
tmctl stack clean [--all]:- Menghentikan dan menghapus seluruh kontainer armada monitoring. Opsi
--allmencakup pembersihan volume persisten dan jaringan bridge.
2. Manajemen Aturan Diagnostik AI (tmctl rules)¶
Subperintah rules menjembatani interaksi operator SRE dengan mesin Diagnostic Service:
tmctl rules ingest <path/to/rulepack.json> [--token <bearer_token>]:- Membaca payload JSON baik dalam format objek tunggal maupun batch array.
- Mengirimkan HTTP POST ke
/api/v1/rulesdengan otentikasi Bearer Token. - Menangani respon 5-Layer Guard:
201 Created(sukses),409 Conflict(skip duplikasi), dan400/422(tolak payload tidak valid). tmctl rules export [--category <name>] [--output <path.json>] [--categories]:- Mengambil katalog aturan aktif dari Diagnostic Service.
- Mendukung penyaringan kategori dan ringkasan agregasi kategori aktif.
3. Autentikasi Registri Kontainer Enterprise (tmctl registry)¶
tmctl registry login <host:port> <username> [--token-file <path>] [--auth-file <path>]:- Membuat atau memperbarui berkas autentikasi OCI terisolasi (
--auth-file) dengan kredensial terenkripsi Base64 tanpa mencemari konfigurasi global host. tmctl registry logout [host:port] [--auth-file <path>]:- Menghapus kredensial registri dari berkas otentikasi terisolasi.
4. Validasi Kepatuhan & Kontrak (tmctl validate)¶
tmctl validate [--layout] [--schemas] [--ansible] [--dir <path>]:- Memverifikasi keberadaan berkas kontrak wajib (
CONFIG,README.md,AGENTS.md). - Mengaudit repositori dari keberadaan berkas sensitif yang dilarang (
.pem,.key,.p12,.env). - Memvalidasi sintaksis skema JSON pada seluruh berkas konfigurasi.
π Matriks Kompilasi Silang (Cross-Compilation Matrix)¶
Proses kompilasi silang diotomatisasi melalui Makefile dan menghasilkan biner statis mandiri:
| Target OS | Target Arch | Biner Output | Ukuran Biner | Keterangan |
|---|---|---|---|---|
| Linux | amd64 |
bin/linux_amd64/tmctl |
5.7 MB | Biner ELF 64-bit statis untuk Linux Server & CI/CD Runner |
| Linux | arm64 |
bin/linux_arm64/tmctl |
5.5 MB | Biner ELF 64-bit statis untuk arsitektur ARM64 / Graviton |
| Windows | amd64 |
bin/windows_amd64/tmctl.exe |
5.9 MB | Biner PE 64-bit untuk Workstation Windows (PowerShell / CMD) |
π§ͺ Hasil Pengujian & Verifikasi¶
1. Verifikasi Unit Testing Go¶
Seluruh unit test internal paket lulus 100%:
=== RUN TestDefaultConfig
--- PASS: TestDefaultConfig (0.00s)
=== RUN TestParseConfigFile
--- PASS: TestParseConfigFile (0.00s)
=== RUN TestWorkloadSpecs
--- PASS: TestWorkloadSpecs (0.00s)
=== RUN TestRegistryLoginAndLogout
--- PASS: TestRegistryLoginAndLogout (0.00s)
=== RUN TestValidateSensitiveFiles
--- PASS: TestValidateSensitiveFiles (0.00s)
=== RUN TestValidateJSONFiles
--- PASS: TestValidateJSONFiles (0.00s)
PASS (ok: config, orchestrator, registry, validator)
2. Verifikasi Eksekusi Subperintah tmctl stack status¶
$ tmctl stack status
βΉ INFO: Inspecting platform containers on podman (/run/user/1000/podman/podman.sock)...
SERVICE NAME CONTAINER NAME IMAGE STATUS PORTS
-------------- ---------------- ------- -------- -------
Tomcat JMX Exporter tomcat-jmx-exporter localhost/tomcat-jmx-exporter:1.0.0 Exited (143) 7 hours ago 8083->8080/tcp, 9404->9404/tcp
Prometheus TSDB prometheus localhost/prometheus:1.0.0 Exited (0) 7 hours ago 9090->9090/tcp
Alertmanager alertmanager localhost/alertmanager:1.0.0 Exited (0) 7 hours ago 9093->9093/tcp
Tomcat Diagnostic Service diagnostic-service localhost/tomcat-diagnostic-service:latest Exited (0) 7 hours ago 8443->8443/tcp
Mailpit Test Inbox mailpit ghcr.io/axllent/mailpit@sha256:c96991d9bef73594c246d89ca81411d4e916f03e76a7d2d72fa2ab5dd3c9ce24 Exited (0) 7 hours ago 1025->1025/tcp, 8025->8025/tcp
Postfix Enterprise SMTP Relay postfix-relay localhost/postfix-relay:latest Exited (0) 7 hours ago -
3. Verifikasi Eksekusi Subperintah tmctl validate¶
$ tmctl validate --dir /home/eddywiyatno/git/tomcat-monitoring
βΉ INFO: Starting baseline validation on project root: /home/eddywiyatno/git/tomcat-monitoring
[1/3] Validating repository layout and required contract files...
[2/3] Auditing repository for forbidden sensitive material files...
[3/3] Validating JSON schema syntax integrity across configuration files...
β SUCCESS: All platform validation assertions passed successfully.
π Kesimpulan & Dampak Arsitektur¶
- Eliminasi Hambatan Multi-OS: Operator Windows kini dapat mengelola seluruh siklus hidup kontainer Tomcat Monitoring secara native menggunakan
tmctl.exetanpa perlu memasang WSL2 atau Git Bash. - Standardisasi Antarmuka Baris Perintah: Seluruh alur kerja operasional (
stack,rules,registry,validate) terintegrasi rapi dalam satu kakas terpadu dengan semantic help dan output terstruktur. - Preservasi Kompatibilitas Mundur: Skrip
scripts/*.sheksisting tetap dipertahankan sebagai convenience wrapper bagi pengembang Linux lokal tanpa menimbulkan disrupsi pada alur kerja yang sudah ada. - Kesiapan Fase 2 & Fase 3: Fondasi biner Go dan adapter Socket API yang telah dibangun pada
tmctlsiap dilanjutkan untuk pembangunantm-agent(Go Event Collector Daemon, TASK-TM-028) dan refaktorisasi Ansible Roles deklaratif (TASK-TM-029).
π Referensi ADR & Technical Notes Terkait¶
- TM-ADR-0027 β Adopt Container Engine Socket API and Unified Cross-Platform Tooling for Multi-OS Orchestration
- TM-ADR-0026 β Adopt Adaptive Multi-Engine Container Runtime Portability
- TN-011 β Design Cross-Platform Container Engine API Orchestration, Unified Go CLI, and Multi-OS Agent Architecture
- TASK-TM-027 β Implement Unified Cross-Platform Operator CLI tmctl (Fase 1)