Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,37 @@
}
},
"required": ["metrics_enabled", "collection_targets"]
},
"vast": {
"type": "object",
"description": "VAST Data Storage telemetry.",
"properties": {
"metrics_enabled": {
"type": "boolean",
"default": false,
"description": "Enable or disable VAST storage metrics collection."
},
"logs_enabled": {
"type": "boolean",
"default": false,
"description": "Enable or disable VAST syslog logs collection."
},
"collection_targets": {
"type": "array",
"items": {
"type": "string",
"enum": ["victoria_metrics", "victoria_logs"]
},
"minItems": 1,
"uniqueItems": true,
"default": ["victoria_metrics"],
"description": "VAST supports victoria_metrics (metrics) and victoria_logs (logs)."
}
},
"required": ["metrics_enabled", "collection_targets"]
}
},
"required": ["idrac", "ldms", "dcgm", "powerscale", "ufm"]
"required": ["idrac", "ldms", "dcgm", "powerscale", "ufm", "vast"]
},
"telemetry_bridges": {
"type": "object",
Expand Down Expand Up @@ -473,7 +501,59 @@
}
},
"required": []
},
"vast_configuration": {
"type": "object",
"description": "VAST telemetry detailed configurations.",
"properties": {
"vast_endpoint": {
"type": "string",
"description": "VAST cluster IP address or hostname. Required when VAST telemetry is enabled (metrics_enabled or logs_enabled is true)."
},
"vast_metrics_port": {
"type": "integer",
"minimum": 1,
"maximum": 65535,
"default": 443,
"description": "VAST Prometheus metrics port."
},
"metrics_path": {
"type": "string",
"default": "/api/prometheusmetrics/all",
"description": "Prometheus metrics path for VAST API."
},
"scrape_interval": {
"type": "string",
"pattern": "^[0-9]+[smh]$",
"default": "30s",
"description": "Prometheus scrape interval for VAST metrics."
},
"scrape_timeout": {
"type": "string",
"pattern": "^[0-9]+[smh]$",
"default": "15s",
"description": "Prometheus scrape timeout (must be <= scrape_interval)."
},
"tls_mode": {
"type": "string",
"enum": ["self_signed", "ca_signed"],
"default": "self_signed",
"description": "TLS mode for connecting to VAST Prometheus endpoint."
},
"vast_ca_cert_path": {
"type": "string",
"default": "",
"description": "Path to CA certificate file for VAST TLS verification."
},
"auth_mode": {
"type": "string",
"enum": ["basic", "none"],
"default": "basic",
"description": "Authentication mode for VAST Prometheus endpoint."
}
},
"required": []
}
},
"required": ["telemetry_sources", "telemetry_bridges", "telemetry_sinks", "ldms_configurations", "powerscale_configurations", "ufm_configuration"]
"required": ["telemetry_sources", "telemetry_bridges", "telemetry_sinks", "ldms_configurations", "powerscale_configurations", "ufm_configuration", "vast_configuration"]
}
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ def validate_telemetry_config(
Validates the telemetry configuration from telemetry_config.yml.

This function validates the new three-layer telemetry configuration structure:
- telemetry_sources (idrac, ldms, dcgm, powerscale)
- telemetry_sources (idrac, ldms, dcgm, powerscale, ufm, vast)
- telemetry_bridges (vector_ldms, vector_ome)
- telemetry_sinks (victoria_metrics, victoria_logs, kafka)

Expand Down Expand Up @@ -329,6 +329,7 @@ def validate_telemetry_config(
ldms_source = telemetry_sources.get("ldms", {})
powerscale_source = telemetry_sources.get("powerscale", {})
ufm_source = telemetry_sources.get("ufm", {})
vast_source = telemetry_sources.get("vast", {})

idrac_telemetry_support = idrac_source.get("metrics_enabled", False)
idrac_collection_targets = idrac_source.get("collection_targets", [])
Expand Down Expand Up @@ -851,4 +852,59 @@ def validate_telemetry_config(
"auth_mode must be 'basic' or 'none'."
))

# =========================================================================
# Validate VAST telemetry configuration
# =========================================================================
vast_metrics_enabled = vast_source.get("metrics_enabled", False)
vast_logs_enabled = vast_source.get("logs_enabled", False)
vast_detailed_config = data.get("vast_configuration", {})

if vast_metrics_enabled or vast_logs_enabled:
# Check required VAST endpoint
vast_endpoint = vast_detailed_config.get("vast_endpoint", "")
if not vast_endpoint or (isinstance(vast_endpoint, str) and vast_endpoint.strip() == ""):
errors.append(create_error_msg(
"vast_configuration.vast_endpoint",
vast_endpoint,
"vast_endpoint is required when VAST telemetry is enabled. Provide the VAST cluster IP address or hostname."
))

# Validate VAST metrics port if metrics enabled
if vast_metrics_enabled:
vast_metrics_port = vast_detailed_config.get("vast_metrics_port", 443)
if not isinstance(vast_metrics_port, int) or vast_metrics_port < 1 or vast_metrics_port > 65535:
errors.append(create_error_msg(
"vast_configuration.vast_metrics_port",
vast_metrics_port,
"vast_metrics_port must be an integer between 1 and 65535."
))

# Validate TLS mode
tls_mode = vast_detailed_config.get("tls_mode", "self_signed")
if tls_mode not in ["self_signed", "ca_signed"]:
errors.append(create_error_msg(
"vast_configuration.tls_mode",
tls_mode,
"tls_mode must be 'self_signed' or 'ca_signed'."
))

# Validate CA certificate path when tls_mode is ca_signed
if tls_mode == "ca_signed":
ca_cert_path = vast_detailed_config.get("vast_ca_cert_path", "")
if not ca_cert_path or (isinstance(ca_cert_path, str) and ca_cert_path.strip() == ""):
errors.append(create_error_msg(
"vast_configuration.vast_ca_cert_path",
ca_cert_path,
"vast_ca_cert_path is required when tls_mode is 'ca_signed'. Provide path to CA certificate file."
))

# Validate auth mode
auth_mode = vast_detailed_config.get("auth_mode", "basic")
if auth_mode not in ["basic", "none"]:
errors.append(create_error_msg(
"vast_configuration.auth_mode",
auth_mode,
"auth_mode must be 'basic' or 'none'."
))

return errors
7 changes: 7 additions & 0 deletions common/library/modules/fetch_telemetry_status.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,13 @@ def main():
if ufm_config.get("logs_enabled", False):
telemetry_status_list.append("ufm_logs")

# Check VAST telemetry
vast_config = telemetry_sources.get("vast", {})
if vast_config.get("metrics_enabled", False):
telemetry_status_list.append("vast_telemetry")
if vast_config.get("logs_enabled", False):
telemetry_status_list.append("vast_logs")

module.exit_json(
changed=False,
telemetry_status_list=telemetry_status_list
Expand Down
82 changes: 80 additions & 2 deletions input/telemetry_config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@
# SOURCES (Collectors) → BRIDGES (Vector) → SINKS (Storage)
#
# SECTIONS:
# 1. Telemetry Sources : Data collectors (iDRAC, LDMS, DCGM, PowerScale)
# 1. Telemetry Sources : Data collectors (iDRAC, LDMS, DCGM, PowerScale, UFM, VAST)
# 2. Telemetry Bridges : Data routers (Vector pipelines)
# 3. Telemetry Sinks : Storage backends (victoria_metrics, victoria_logs, Kafka)
# 4. Source Configurations: Detailed settings per source (PowerScale, LDMS)
# 4. Source Configurations: Detailed settings per source (PowerScale, LDMS, UFM, VAST)
#
# ============================================================================
# STORAGE REQUIREMENTS SUMMARY
Expand Down Expand Up @@ -169,6 +169,29 @@ telemetry_sources:
- "victoria_metrics"
- "victoria_logs"

# --------------------------------------------------------------------------
# VAST — VAST Data Storage Telemetry
# --------------------------------------------------------------------------
# Collects: Storage performance metrics from VAST Data clusters via Prometheus API
# Requires: VAST Data cluster with Prometheus metrics endpoint enabled
# Data path: VAST Prometheus API → vmagent(shared) → victoria_metrics
#
# NOTE: Omnia does NOT deploy VAST itself. Omnia configures the existing
# vmagent to scrape the VAST Prometheus endpoint for storage metrics.
vast:
# Enable or disable VAST storage metrics collection
# Default: false
metrics_enabled: false

# Enable or disable VAST syslog logs collection
# Default: false
logs_enabled: false

# VAST uses vmagent(shared) for metrics and VLAgent for logs
collection_targets:
- "victoria_metrics"
- "victoria_logs"


# ============================================================================
# TELEMETRY BRIDGES (Data Routers)
Expand Down Expand Up @@ -430,3 +453,58 @@ ufm_configuration:
# - none: No authentication (UFM endpoint is open)
# Default: "basic"
auth_mode: "basic"

# --------------------------------------------------------------------------
# VAST Telemetry Configuration
# --------------------------------------------------------------------------
# VAST telemetry collects storage metrics from VAST Data clusters
# using Prometheus scraping via the VAST Prometheus metrics API.
#
# DATA PIPELINE:
# VAST Prometheus API (HTTPS) → vmagent(shared) → victoria_metrics
#
# NOTE: VAST does NOT use Vector bridges. It uses the shared vmagent instance
# for metrics collection.
vast_configuration:
# VAST cluster IP address or hostname
# Required when telemetry_sources.vast.metrics_enabled is true
# Example: "172.18.44.171" or "vast.example.com"
vast_endpoint: ""

# VAST Prometheus metrics port
# Default: 443 (VAST default HTTPS port)
vast_metrics_port: 443

# Prometheus metrics path for VAST API
# Default: "/api/prometheusmetrics/all"
metrics_path: "/api/prometheusmetrics/all"

# Prometheus scrape interval for VAST metrics
# Accepted values: Prometheus duration format (e.g., "15s", "30s", "1m")
# Default: "30s"
scrape_interval: "30s"

# Prometheus scrape timeout (must be <= scrape_interval)
# Accepted values: Prometheus duration format (e.g., "10s", "15s")
# Default: "15s"
scrape_timeout: "15s"

# TLS mode for connecting to VAST Prometheus endpoint
# Accepted values: "self_signed", "ca_signed"
# - self_signed: Skip TLS verification (insecure_skip_verify=true)
# - ca_signed: Use CA certificate for TLS verification
# Default: "self_signed"
tls_mode: "self_signed"

# Path to CA certificate file for VAST TLS verification
# Required when tls_mode is "ca_signed"
# Must be a valid PEM-format certificate file
# Default: "" (empty — not used when tls_mode is "self_signed")
vast_ca_cert_path: ""

# Authentication mode for VAST Prometheus endpoint
# Accepted values: "basic", "none"
# - basic: Use vast_username/vast_password from omnia_config_credentials.yml
# - none: No authentication (VAST endpoint is open)
# Default: "basic"
auth_mode: "basic"
Loading