Skip to content

NinjaOne LCP#34

Merged
Deenk merged 53 commits into
mainfrom
ninjaone
May 14, 2026
Merged

NinjaOne LCP#34
Deenk merged 53 commits into
mainfrom
ninjaone

Conversation

@Deenk
Copy link
Copy Markdown
Contributor

@Deenk Deenk commented Apr 7, 2026

🔌 Plugin overview

  • Plugin name: NinjaOne
  • Purpose / problem solved: Enable squaredup users to monitor devices, endpoints, tickets via NinjaOne RMM
  • Primary audience (e.g. platform teams, SREs, product teams): Systems and helpdesk (Internal and MSP)
  • Authentication method(s) (e.g. OAuth, Username/Password, API Key): Oauth client secret and id

🖼️ Plugin screenshots

Plugin configuration

image image

Default dashboards

image

🧪 Testing

I have tested that every data stream returns unnested arrays and results. data types should all be correct for strings, numbers, dates


⚠️ Known limitations

There are a number of ninjaone modules/add ons based on the licence tier of the customer. I already support the backups and tickets modules, but there are 5/6 more I could add support for later.


📚 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

@Deenk Deenk added the new-plugin Used to PR newly added plugins label Apr 7, 2026
@Deenk Deenk marked this pull request as ready for review April 7, 2026 08:38
Comment thread plugins/NinjaOne/v1/metadata.json
Comment thread plugins/NinjaOne/v1/dataStreams/organizationDevices.json Outdated
Comment thread plugins/NinjaOne/v1/defaultContent/backupManagement.dash.json Outdated
Comment thread plugins/NinjaOne/v1/ui.json Outdated
Comment thread plugins/NinjaOne/v1/dataStreams/activities.json
@Deenk Deenk requested a review from clarkd April 7, 2026 10:14
@gdorward
Copy link
Copy Markdown

gdorward commented Apr 7, 2026

@Deenk , I seem to be running into repeated 500 errors on the Backup Management OOB dashboards. Looking at the logs, one of the offending endpoints seems to be https://ca-api.ninjarmm.com/v2/queries/backup/usage?pageSize=1000

ERROR {"message":"handler.readDataSource threw: 500 - Internal Server Error"

@AliceG-Sq AliceG-Sq self-requested a review April 8, 2026 09:06
@Deenk
Copy link
Copy Markdown
Contributor Author

Deenk commented Apr 8, 2026

@Deenk , I seem to be running into repeated 500 errors on the Backup Management OOB dashboards. Looking at the logs, one of the offending endpoints seems to be https://ca-api.ninjarmm.com/v2/queries/backup/usage?pageSize=1000

ERROR {"message":"handler.readDataSource threw: 500 - Internal Server Error"

@gdorward This is probably because our license expired for the 'backups' module in NinjaOne. I'll investigate if that truly is the case and either request they fix it, or fix whatever is broken on our side depending on who's fault it is

@Deenk Deenk self-assigned this Apr 8, 2026
@gdorward
Copy link
Copy Markdown

gdorward commented Apr 9, 2026

I'm getting this error on imports all of a sudden @Deenk - specifically importing devices:

{ "name": "Error", "message": "ID column 'deviceId' not found in data stream response. Available columns: results.0.id, results.0.uid, results.0.organizationId, results.0.locationId, results.0.nodeClass, results.0.nodeRoleId, results.0.rolePolicyId, results.0.approvalStatus, results.0.offline, results.0.systemName, results.0.dnsName, results.0.created, results.0.lastContact, results.0.lastUpdate, results.0.deviceId, results.0.displayName, results.1.id, results.1.uid, results.1.organizationId, results.1.locationId, results.1.nodeClass, results.1.nodeRoleId, results.1.rolePolicyId, results.1.approvalStatus, results.1.offline, results.1.systemName, results.1.dnsName, results.1.created, results.1.lastContact, results.1.lastUpdate, results.1.deviceId, results.1.displayName, metadata.next_page_token", "stack": "Error: ID column 'deviceId' not found in data stream response. Available columns: results.0.id, results.0.uid, results.0.organizationId, results.0.locationId, results.0.nodeClass, results.0.nodeRoleId, results.0.rolePolicyId, results.0.approvalStatus, results.0.offline, results.0.systemName, results.0.dnsName, results.0.created, results.0.lastContact, results.0.lastUpdate, results.0.deviceId, results.0.displayName, results.1.id, results.1.uid, results.1.organizationId, results.1.locationId, results.1.nodeClass, results.1.nodeRoleId, results.1.rolePolicyId, results.1.approvalStatus, results.1.offline, results.1.systemName, results.1.dnsName, results.1.created, results.1.lastContact, results.1.lastUpdate, results.1.deviceId, results.1.displayName, metadata.next_page_token at dUe (/src/stepExecutor/mapStreamDataToVertices.ts:62:15) at E1r (/src/stepExecutor/handler.ts:172:33) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async <anonymous> (/src/createMessageHandler.ts:74:13) at async Promise.all (index 0) at async <anonymous> (/src/createMessageHandler.ts:121:32) at async Hcr (/node_modules/.pnpm/@middy+core@2.5.7/node_modules/@middy/core/index.js:86:26)" }

@Deenk
Copy link
Copy Markdown
Contributor Author

Deenk commented Apr 9, 2026

I'm getting this error on imports all of a sudden @Deenk - specifically importing devices:

{ "name": "Error", "message": "ID column 'deviceId' not found in data stream response. Available columns: results.0.id, results.0.uid, results.0.organizationId, results.0.locationId, results.0.nodeClass, results.0.nodeRoleId, results.0.rolePolicyId, results.0.approvalStatus, results.0.offline, results.0.systemName, results.0.dnsName, results.0.created, results.0.lastContact, results.0.lastUpdate, results.0.deviceId, results.0.displayName, results.1.id, results.1.uid, results.1.organizationId, results.1.locationId, results.1.nodeClass, results.1.nodeRoleId, results.1.rolePolicyId, results.1.approvalStatus, results.1.offline, results.1.systemName, results.1.dnsName, results.1.created, results.1.lastContact, results.1.lastUpdate, results.1.deviceId, results.1.displayName, metadata.next_page_token", "stack": "Error: ID column 'deviceId' not found in data stream response. Available columns: results.0.id, results.0.uid, results.0.organizationId, results.0.locationId, results.0.nodeClass, results.0.nodeRoleId, results.0.rolePolicyId, results.0.approvalStatus, results.0.offline, results.0.systemName, results.0.dnsName, results.0.created, results.0.lastContact, results.0.lastUpdate, results.0.deviceId, results.0.displayName, results.1.id, results.1.uid, results.1.organizationId, results.1.locationId, results.1.nodeClass, results.1.nodeRoleId, results.1.rolePolicyId, results.1.approvalStatus, results.1.offline, results.1.systemName, results.1.dnsName, results.1.created, results.1.lastContact, results.1.lastUpdate, results.1.deviceId, results.1.displayName, metadata.next_page_token at dUe (/src/stepExecutor/mapStreamDataToVertices.ts:62:15) at E1r (/src/stepExecutor/handler.ts:172:33) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async <anonymous> (/src/createMessageHandler.ts:74:13) at async Promise.all (index 0) at async <anonymous> (/src/createMessageHandler.ts:121:32) at async Hcr (/node_modules/.pnpm/@middy+core@2.5.7/node_modules/@middy/core/index.js:86:26)" }

I broke this during my testing adding more devices, pushing a fix for this now

@Deenk
Copy link
Copy Markdown
Contributor Author

Deenk commented Apr 9, 2026

I'm getting this error on imports all of a sudden @Deenk - specifically importing devices:
{ "name": "Error", "message": "ID column 'deviceId' not found in data stream response. Available columns: results.0.id, results.0.uid, results.0.organizationId, results.0.locationId, results.0.nodeClass, results.0.nodeRoleId, results.0.rolePolicyId, results.0.approvalStatus, results.0.offline, results.0.systemName, results.0.dnsName, results.0.created, results.0.lastContact, results.0.lastUpdate, results.0.deviceId, results.0.displayName, results.1.id, results.1.uid, results.1.organizationId, results.1.locationId, results.1.nodeClass, results.1.nodeRoleId, results.1.rolePolicyId, results.1.approvalStatus, results.1.offline, results.1.systemName, results.1.dnsName, results.1.created, results.1.lastContact, results.1.lastUpdate, results.1.deviceId, results.1.displayName, metadata.next_page_token", "stack": "Error: ID column 'deviceId' not found in data stream response. Available columns: results.0.id, results.0.uid, results.0.organizationId, results.0.locationId, results.0.nodeClass, results.0.nodeRoleId, results.0.rolePolicyId, results.0.approvalStatus, results.0.offline, results.0.systemName, results.0.dnsName, results.0.created, results.0.lastContact, results.0.lastUpdate, results.0.deviceId, results.0.displayName, results.1.id, results.1.uid, results.1.organizationId, results.1.locationId, results.1.nodeClass, results.1.nodeRoleId, results.1.rolePolicyId, results.1.approvalStatus, results.1.offline, results.1.systemName, results.1.dnsName, results.1.created, results.1.lastContact, results.1.lastUpdate, results.1.deviceId, results.1.displayName, metadata.next_page_token at dUe (/src/stepExecutor/mapStreamDataToVertices.ts:62:15) at E1r (/src/stepExecutor/handler.ts:172:33) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async <anonymous> (/src/createMessageHandler.ts:74:13) at async Promise.all (index 0) at async <anonymous> (/src/createMessageHandler.ts:121:32) at async Hcr (/node_modules/.pnpm/@middy+core@2.5.7/node_modules/@middy/core/index.js:86:26)" }

I broke this during my testing adding more devices, pushing a fix for this now

@gdorward this is now fixed

Comment thread plugins/NinjaOne/v1/dataStreams/health.json Outdated
Comment thread plugins/NinjaOne/v1/dataStreams/locationDevices.json Outdated
Comment thread plugins/NinjaOne/v1/dataStreams/networkInterfaces.json Outdated
Comment thread plugins/NinjaOne/v1/dataStreams/organizationDevices.json
Comment thread plugins/NinjaOne/v1/dataStreams/processors.json Outdated
Comment thread plugins/NinjaOne/v1/dataStreams/volumes.json Outdated
@Deenk Deenk requested a review from clarkd April 29, 2026 09:44
Copy link
Copy Markdown
Member

@clarkd clarkd left a comment

Choose a reason for hiding this comment

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

Thanks for taking all those changes in! Looks good to me, I'll defer to @gregdorward for any functional review. I've also pinged @shaswot77 RE the failing validation step.

Comment thread plugins/NinjaOne/v1/custom_types.json Outdated
@github-actions
Copy link
Copy Markdown

🧩 Plugin PR Summary

📦 Modified Plugins

  • plugins/NinjaOne/v1

📋 Results

Step Status
Validation ✅ Passed
Deployment 🚀 Deployed

🔍 Validation Details

ninja-one
{
  "valid": true,
  "pluginName": "ninja-one",
  "pluginType": "cloud",
  "summary": {
    "Data Streams": 37,
    "Import Definitions": 1,
    "UI Configuration": true,
    "Has Icon": true,
    "Has Default Content": true,
    "Config Validation": false,
    "Custom Types": true
  }
}

@vinbab
Copy link
Copy Markdown
Contributor

vinbab commented May 11, 2026

@Deenk feedback on the setup screen:

  • Do we need to ask both the Region and API Region? Would one suffice to derive the API endpoint?
  • Client Secret: lowercase secret in field title, placeholder and tooltip

@Deenk let me know when this will be updated or if you have any feedback?

@vinbab
Copy link
Copy Markdown
Contributor

vinbab commented May 11, 2026

@Deenk feedback on the setup screen:

  • Do we need to ask both the Region and API Region? Would one suffice to derive the API endpoint?
  • Client Secret: lowercase secret in field title, placeholder and tooltip

Thanks @vinbab , although LCP does not support deriving URLs like this (from what I can see), I have managed to discover you can get a token from the base url, so I now only need to use one radio selector. I've made the change.

Secret should now also be uppercase in the locations you mentioned

@Deenk can you please sentence case Client Secret to Client secret in field title and placeholder?

@Deenk Deenk merged commit 46747f5 into main May 14, 2026
1 check passed
@Deenk Deenk deleted the ninjaone branch May 14, 2026 13:59
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.

5 participants