Skip to content

Add Veeam Backup & Replication plugin#81

Merged
vinbab merged 4 commits into
mainfrom
work/vb/plug-613
Jul 15, 2026
Merged

Add Veeam Backup & Replication plugin#81
vinbab merged 4 commits into
mainfrom
work/vb/plug-613

Conversation

@vinbab

@vinbab vinbab commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

🔌 Plugin overview

  • Plugin name: Veeam Backup & Replication
  • Purpose / problem solved: Brings a Veeam Backup & Replication (VBR) estate into SquaredUp via its REST API — indexes backup repositories and jobs as objects, and provides live status/health and capacity data streams plus out-of-the-box dashboards, so teams can monitor backup success/failure and repository capacity alongside the rest of their stack.
  • Primary audience: Platform / infrastructure / backup administrators and SREs.
  • Authentication method(s): OAuth2 password grant (username/password; no client id/secret). A required x-api-version header carries the selected REST API revision.

🖼️ Plugin screenshots

Screenshot 2026-07-02 at 14 37 22

Plugin configuration

Config form: Server URL, Username, Password, REST API version (dropdown), Ignore certificate errors.

Default dashboards

Overview (jobs by last result/status, failed & warning job lists, repositories table, % free space, repositories not online), plus per-object Job → Status and Repository → Status perspectives.


🧪 Testing

  • squaredup validate passes (hybrid).
  • Deployed to a SquaredUp dev tenant and connected to a live VBR v13 (1.3-rev1) server through a SquaredUp Agent.
  • Verified end-to-end: OAuth2 password-grant auth and the config-validation step; Veeam Repository and Veeam Job objects import; all four data streams return data — Job Status (All), Repository Status (All), and the object-scoped Job Status / Repository Status (server-side idFilter, one call per selected object); Name-column drilldowns resolve to the graph objects; the Last Result health map, gigabytes capacity and percent shapes render; and the Overview + per-object "Status" dashboards populate.
  • Runtime-tested on v13 only. Earlier revisions (12.0–12.3) are supported via the matching x-api-version — the endpoints the plugin uses exist across all offered revisions — but have not been end-to-end tested.

⚠️ Known limitations

  • Base plugin is a CI build (WebAPI-ci-wpPLUG4677), not the released WebAPI. It carries the PLUG-4677 fix (OAuth2 token cert/serialization) that the on-prem / self-signed flow needs. Before this ships publicly the base must be switched to the released WebAPI once PLUG-4677 is merged/released.
  • oauth2ClientId / oauth2ClientSecret are the literal "notused" — Veeam's password grant takes no client credentials, but the base's OAuth2 config expects the fields to be present. These are placeholders, not secrets.
  • On-premises VBR requires a SquaredUp Agent (REST API on port 9419).
  • Self-signed certificates: enable Ignore certificate errors (VBR default).
  • The selected x-api-version must not be older than the server (older revisions can't serialize newer enum values). The object-scoped streams make no request until at least one object is selected.

📚 Checklist

  • Plugin, datastream and UI naming follow SquaredUp guidelines
  • Logo added
  • One or more dashboards added
  • README added including configuration guidance
  • No secrets or credentials included
  • I agree to the Code of Conduct

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added an “Overview” dashboard plus dedicated job and repository “Status” dashboards.
    • Introduced live job and repository status data streams (scoped and unscoped), including last result/status, run timestamps, online indicators, capacity/free space, and property views.
    • Added job/repository selection scopes and improved UI presentation (custom types).
    • Added plugin configuration metadata, index mapping, and configuration validation with clear guidance for connectivity, credentials, API version, and required permissions.
  • Documentation
    • Added comprehensive plugin README covering indexed content, dashboards, scoping behavior, compatibility, limitations, and troubleshooting.

Low-code (Web API) plugin for Veeam Backup & Replication. Indexes backup
repositories and jobs as objects, provides job/repository status and capacity
data streams (all and object-scoped via idFilter), and ships an Overview plus
per-object Status dashboards. Auth via OAuth2 password grant with a selectable
x-api-version (Veeam 12.0-13).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vinbab vinbab requested a review from a team July 2, 2026 12:28
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro

Run ID: 0708860e-29c9-4583-9a7b-5e572e1318bc

📥 Commits

Reviewing files that changed from the base of the PR and between c386367 and c7ba0af.

📒 Files selected for processing (2)
  • plugins/VeeamBackupReplication/v1/defaultContent/Repository/status.dash.json
  • plugins/VeeamBackupReplication/v1/defaultContent/overviewDashboard.dash.json

📝 Walkthrough

Walkthrough

The PR adds a Veeam Backup & Replication v1 plugin with OAuth2 configuration, repository and job status streams, object indexing, scoped dashboards, overview dashboards, validation, and setup documentation.

Changes

Veeam Backup & Replication v1 plugin

Layer / File(s) Summary
Plugin contract and configuration
plugins/VeeamBackupReplication/v1/metadata.json, plugins/VeeamBackupReplication/v1/ui.json, plugins/VeeamBackupReplication/v1/configValidation.json, plugins/VeeamBackupReplication/v1/custom_types.json, plugins/VeeamBackupReplication/v1/defaultContent/scopes.json
Defines OAuth2 connection settings, configuration inputs, validation, custom repository/job types, and single-selection scopes.
Streams and object indexing
plugins/VeeamBackupReplication/v1/dataStreams/*, plugins/VeeamBackupReplication/v1/indexDefinitions/default.json
Adds unscoped and object-scoped repository/job status streams, metadata mappings, paging, and index steps for repository and job objects.
Default dashboards
plugins/VeeamBackupReplication/v1/defaultContent/manifest.json, plugins/VeeamBackupReplication/v1/defaultContent/Job/*, plugins/VeeamBackupReplication/v1/defaultContent/Repository/*, plugins/VeeamBackupReplication/v1/defaultContent/overviewDashboard.dash.json
Adds manifests and dashboard layouts for overview, job status, and repository status views, including status, capacity, free-space, scheduling, and filtered tables.
Plugin documentation
plugins/VeeamBackupReplication/v1/docs/README.md
Documents setup, authentication, API compatibility, indexed objects, streams, dashboards, limitations, troubleshooting, and API resources.

Sequence Diagram(s)

sequenceDiagram
  participant Configuration
  participant VeeamAPI
  participant Indexing
  participant Dashboards

  Configuration->>VeeamAPI: authenticate with OAuth2 credentials
  VeeamAPI-->>Indexing: return repository and job states
  Indexing->>Dashboards: provide indexed objects and status data
  Dashboards->>VeeamAPI: request scoped live status
  VeeamAPI-->>Dashboards: return selected job or repository status
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding a Veeam Backup & Replication plugin.
Description check ✅ Passed The description covers overview, screenshots, testing, limitations, and checklist items, so it is mostly complete.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Comment @coderabbitai help to get the list of available commands.

@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@clarkd

clarkd commented Jul 2, 2026

Copy link
Copy Markdown
Member

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@JRoseDev

JRoseDev commented Jul 2, 2026

Copy link
Copy Markdown

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Full review finished.

@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Full review finished.

@clarkd

clarkd commented Jul 2, 2026

Copy link
Copy Markdown
Member

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@clarkd

clarkd commented Jul 2, 2026

Copy link
Copy Markdown
Member

@claude review

@clarkd clarkd added the new-plugin Used to PR newly added plugins label Jul 2, 2026
@vinbab vinbab requested a review from jame2O July 2, 2026 13:46

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@plugins/VeeamBackupReplication/v1/defaultContent/Repository/status.dash.json`:
- Around line 25-30: The Online Status tile’s isOnline metadata only maps "true"
to success, so offline repositories with "false" are not shown as unhealthy.
Update the metadata shape in status.dash.json for the isOnline field to
explicitly map "false" to an error or warning state, keeping the existing
success mapping for "true", so the tile surfaces offline repositories clearly.

In `@plugins/VeeamBackupReplication/v1/metadata.json`:
- Around line 27-51: The base plugin reference in the metadata is pointing to an
unreleased CI build, which breaks validation and installability. Update the base
plugin identifier in the metadata config from the CI-specific
WebAPI-ci-wpPLUG4677 reference to the released WebAPI plugin version, keeping
the rest of the OAuth and header configuration unchanged.
- Line 9: The description in metadata.json is missing terminal punctuation and
should be a single punctuated sentence without implementation language. Update
the `description` field in `metadata.json` for `VeeamBackupReplication` so it
ends with proper punctuation while keeping it as one concise sentence.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro

Run ID: 6afbd30f-b671-4f35-97f5-ef225990c196

📥 Commits

Reviewing files that changed from the base of the PR and between 05aeeab and 964abbe.

⛔ Files ignored due to path filters (1)
  • plugins/VeeamBackupReplication/v1/icon.svg is excluded by !**/*.svg
📒 Files selected for processing (17)
  • plugins/VeeamBackupReplication/v1/configValidation.json
  • plugins/VeeamBackupReplication/v1/custom_types.json
  • plugins/VeeamBackupReplication/v1/dataStreams/jobStates.json
  • plugins/VeeamBackupReplication/v1/dataStreams/jobStatesScoped.json
  • plugins/VeeamBackupReplication/v1/dataStreams/repositoryStates.json
  • plugins/VeeamBackupReplication/v1/dataStreams/repositoryStatesScoped.json
  • plugins/VeeamBackupReplication/v1/defaultContent/Job/manifest.json
  • plugins/VeeamBackupReplication/v1/defaultContent/Job/status.dash.json
  • plugins/VeeamBackupReplication/v1/defaultContent/Repository/manifest.json
  • plugins/VeeamBackupReplication/v1/defaultContent/Repository/status.dash.json
  • plugins/VeeamBackupReplication/v1/defaultContent/manifest.json
  • plugins/VeeamBackupReplication/v1/defaultContent/overviewDashboard.dash.json
  • plugins/VeeamBackupReplication/v1/defaultContent/scopes.json
  • plugins/VeeamBackupReplication/v1/docs/README.md
  • plugins/VeeamBackupReplication/v1/indexDefinitions/default.json
  • plugins/VeeamBackupReplication/v1/metadata.json
  • plugins/VeeamBackupReplication/v1/ui.json

Comment thread plugins/VeeamBackupReplication/v1/metadata.json Outdated
Comment thread plugins/VeeamBackupReplication/v1/metadata.json

@jame2O jame2O left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All looking good so far! Just left a few nitpick comments but looks nearly ready to go

Comment thread plugins/VeeamBackupReplication/v1/docs/README.md Outdated
Comment thread plugins/VeeamBackupReplication/v1/docs/README.md Outdated
Comment thread plugins/VeeamBackupReplication/v1/indexDefinitions/default.json
- metadata.json: add terminal punctuation to description (CodeRabbit)
- Repository Status dashboard: map isOnline "false" to error so offline
  repositories surface as unhealthy (CodeRabbit)
- docs/README.md: drop the trailing-slash note and the redundant indexing
  paragraph (review nits)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vinbab vinbab requested a review from jame2O July 3, 2026 12:51
@vinbab

vinbab commented Jul 3, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@clarkd

clarkd commented Jul 6, 2026

Copy link
Copy Markdown
Member

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@vinbab vinbab requested review from AnEvilPenguin and jame2O and removed request for jame2O July 14, 2026 13:42

@AnEvilPenguin AnEvilPenguin left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Only thing that is jumping out at me is that you have the old style scoped/un-scoped data streams. e.g. Job states and Job states (All). I thought we were trying to get away from this style?

Otherwise I can't see anything specifically jumping out at me.

@vinbab

vinbab commented Jul 14, 2026

Copy link
Copy Markdown
Contributor Author

Only thing that is jumping out at me is that you have the old style scoped/un-scoped data streams. e.g. Job states and Job states (All). I thought we were trying to get away from this style?

Otherwise I can't see anything specifically jumping out at me.

@AnEvilPenguin Thanks. Indeed. Intentional but not what I had wanted.
I spoke to Dave C. about it. I wanted to use the object picker on the Parameters tab, but the VEEAM endpoints weren't playing nice. One supports an ID object filter but makes a call per object selected, so with the default being all selected and potentially 1,000s jobs, it would have always been making several calls when no objects are selected. Ideally, I'd have needed a VEEAM endpoint that makes one call with a list of ID (or accepts ALL, no filter). So for scalability, I opted for the old-fashioned separate data streams. It will at least ensure that a customer with 1,000 jobs should have a data stream that can return them all.

@masokisi

Copy link
Copy Markdown

I ran a Claude code review on this branch and it came up with these issues.

  1. isOnline boolean vs. string mismatch (Repository/status.dash.json:27) — the inline state-shape map treats isOnline as the strings "true"/"false", but Veeam's REST API returns it as a real JSON boolean (confirmed via their isOnlineFilter param being typed boolean). No other plugin in the repo maps a raw boolean through a state shape without first stringifying it. Likely breaks the "Online Status" color tile, and the same assumption shows up in the "Repositories Not Online" filter in overviewDashboard.dash.json:262.

  2. SQL selects "Name" but the field is "name" (overviewDashboard.dash.json:216, duplicated at Repository/status.dash.json:88) — every other SQL tile in the repo (MicrosoftDefender, AutoTask) matches the raw field key casing exactly; here capacityGB/freeGB do, but "Name" doesn't match the actual lowercase name field, so the repository name column in the "% Free Space" tiles is likely blank or errors.

  3. Docs promise multi-select, config doesn't allow it (jobStatesScoped.json:4) — both scoped stream descriptions and the README say "pick one or more jobs/repositories," but scopes.json sets allowMultipleSelection: false for both scope variables, so only a single object can ever be selected

The % Free Space tiles selected "Name" but the blocks/scalar viz reference the
lowercase "name" column, so the label didn't resolve. Align the SQL SELECT to
"name" in both the Overview and Repository/Status dashboards.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

🧩 Plugin PR Summary

📦 Modified Plugins

  • plugins/VeeamBackupReplication/v1

📋 Results

Step Status
Validation ✅ Passed
Deployment 🚀 Deployed

🔍 Validation Details

veeam-backup-replication
{
  "valid": true,
  "pluginName": "veeam-backup-replication",
  "pluginType": "hybrid",
  "summary": {
    "Data Streams": 4,
    "Import Definitions": 1,
    "UI Configuration": true,
    "Has Icon": true,
    "Has Default Content": true,
    "Config Validation": true,
    "Custom Types": true
  }
}

@vinbab

vinbab commented Jul 15, 2026

Copy link
Copy Markdown
Contributor Author

I ran a Claude code review on this branch and it came up with these issues.

  1. isOnline boolean vs. string mismatch (Repository/status.dash.json:27) — the inline state-shape map treats isOnline as the strings "true"/"false", but Veeam's REST API returns it as a real JSON boolean (confirmed via their isOnlineFilter param being typed boolean). No other plugin in the repo maps a raw boolean through a state shape without first stringifying it. Likely breaks the "Online Status" color tile, and the same assumption shows up in the "Repositories Not Online" filter in overviewDashboard.dash.json:262.
  2. SQL selects "Name" but the field is "name" (overviewDashboard.dash.json:216, duplicated at Repository/status.dash.json:88) — every other SQL tile in the repo (MicrosoftDefender, AutoTask) matches the raw field key casing exactly; here capacityGB/freeGB do, but "Name" doesn't match the actual lowercase name field, so the repository name column in the "% Free Space" tiles is likely blank or errors.
  3. Docs promise multi-select, config doesn't allow it (jobStatesScoped.json:4) — both scoped stream descriptions and the README say "pick one or more jobs/repositories," but scopes.json sets allowMultipleSelection: false for both scope variables, so only a single object can ever be selected

@masokisi

  • Point 1: I have tested and it works as intended. Also, in a previous comment, I committed a change to map "false" to "Error" state
  • Point 2: fixed (change Name to name in SQL query in the two % Free Space tiles).
  • Point 3: after checking, I came to the conclusion that that's not correct, multiple objects can be selected on the two scoped data streams

@jame2O jame2O left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nothing new popping out to me. :)

@vinbab vinbab merged commit ec80361 into main Jul 15, 2026
1 check passed
@vinbab vinbab deleted the work/vb/plug-613 branch July 15, 2026 11:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new-plugin Used to PR newly added plugins

Development

Successfully merging this pull request may close these issues.

6 participants