Skip to content

Improvement/artesca 17187 rubrik assistant#1122

Open
damiengillesscality wants to merge 5 commits intodevelopment/4from
improvement/ARTESCA-17187-rubrik-assistant
Open

Improvement/artesca 17187 rubrik assistant#1122
damiengillesscality wants to merge 5 commits intodevelopment/4from
improvement/ARTESCA-17187-rubrik-assistant

Conversation

@damiengillesscality
Copy link
Copy Markdown

@damiengillesscality damiengillesscality commented Mar 30, 2026

Summary ARTESCA-17187

  • Promotes Rubrik from a documentation-only ISV card to a full configuration assistant (Configure → ApplyActions → Summary)
  • Adds a minimal engine enhancement: disableImmutability flag in PlatformConfig to cleanly support platforms that do not use S3 Object Lock
  • Implements Rubrik-specific IAM policy based on Scality documentation (multipart upload, restore, ACL actions; resource scoped to objects only)
  • Summary page includes Rubrik-specific guidance: Bucket Prefix convention (<prefix>-rubrik-0), RSA key generation instructions, and the note to select "Amazon S3 compatible" (not "Scality") in Rubrik CDM

Changes

  • engine/types.tsdisableImmutability?: boolean added to PlatformConfig; 'rubrik' moved to assisted platforms in ISVId
  • engine/builders/buildFields.ts — immutability toggle conditionally skipped
  • engine/definePlatform.tsimmutableValidator conditionally excluded
  • utils/ISVPolicy.tsGET_RUBRIK_POLICY with Rubrik-specific S3 actions
  • engine/validators.ts + engine/index.tsRubrikValidator (no immutability)
  • components/shared/PlatformTooltips.tsx'Rubrik' added to PlatformName type
  • platforms/rubrik.tsx — new platform definition
  • platforms/registry.tsRubrikPlatform registered
  • ISVList.tsx — docs-only Rubrik entry removed
  • platforms/__tests__/rubrik.test.tsx — 13 new tests (validator + policy)
Screenshot 2026-03-30 at 11 46 19 Screenshot 2026-03-30 at 15 07 59 Screenshot 2026-03-30 at 15 08 51 Screenshot 2026-03-30 at 15 10 34 Screenshot 2026-03-30 at 15 11 03

damiengillesscality and others added 3 commits March 30, 2026 13:54
…latforms without immutability

Platforms using disableImmutability: true (e.g. Rubrik) do not declare
enableImmutableBackup in their Joi validator. Including the field in the
base form defaults caused Joi to reject it as an unknown key, keeping
isValid: false and preventing the Continue button from being enabled.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@bert-e
Copy link
Copy Markdown
Contributor

bert-e commented Mar 30, 2026

Hello damiengillesscality,

My role is to assist you with the merge of this
pull request. Please type @bert-e help to get information
on this process, or consult the user documentation.

Available options
name description privileged authored
/after_pull_request Wait for the given pull request id to be merged before continuing with the current one.
/bypass_author_approval Bypass the pull request author's approval
/bypass_build_status Bypass the build and test status
/bypass_commit_size Bypass the check on the size of the changeset TBA
/bypass_incompatible_branch Bypass the check on the source branch prefix
/bypass_jira_check Bypass the Jira issue check
/bypass_peer_approval Bypass the pull request peers' approval
/bypass_leader_approval Bypass the pull request leaders' approval
/approve Instruct Bert-E that the author has approved the pull request. ✍️
/create_pull_requests Allow the creation of integration pull requests.
/create_integration_branches Allow the creation of integration branches.
/no_octopus Prevent Wall-E from doing any octopus merge and use multiple consecutive merge instead
/unanimity Change review acceptance criteria from one reviewer at least to all reviewers
/wait Instruct Bert-E not to run until further notice.
Available commands
name description privileged
/help Print Bert-E's manual in the pull request.
/status Print Bert-E's current status in the pull request TBA
/clear Remove all comments from Bert-E from the history TBA
/retry Re-start a fresh build TBA
/build Re-start a fresh build TBA
/force_reset Delete integration branches & pull requests, and restart merge process from the beginning.
/reset Try to remove integration branches unless there are commits on them which do not appear on the source branch.

Status report is not available.

@bert-e
Copy link
Copy Markdown
Contributor

bert-e commented Mar 30, 2026

Waiting for approval

The following approvals are needed before I can proceed with the merge:

  • the author

  • one peer

Peer approvals must include at least 1 approval from the following list:

Comment thread src/react/ISV/utils/ISVPolicy.ts Outdated
Comment thread src/react/ISV/platforms/__tests__/rubrik.test.tsx
@claude
Copy link
Copy Markdown

claude bot commented Mar 30, 2026

  • IAM policy Resource array only includes object-level ARNs (bucket/*) but several actions (s3:ListBucket, s3:GetBucketLocation, s3:CreateBucket, s3:GetBucketAcl, s3:ListBucketMultipartUploads) are bucket-level operations that require the bucket ARN (arn:aws:s3:::bucket). These actions will be silently denied at runtime.
    • Add arn:aws:s3:::bucket alongside arn:aws:s3:::bucket/* in the Resource array, matching the pattern used by the Veeam and Commvault policies
    • Update the test assertion that explicitly asserts the bucket ARN is absent

Review by Claude Code

@damiengillesscality
Copy link
Copy Markdown
Author

@Cuervino I handled your comments in #1121 except Should be sorted in the Rubrik order (AK / SK / Host name / Prefix / Number of buckets / RSA keys) where I'm not sure of the issue. Is it with the display of the credentials ?

image

@Cuervino
Copy link
Copy Markdown

@Cuervino I handled your comments in #1121 except Should be sorted in the Rubrik order (AK / SK / Host name / Prefix / Number of buckets / RSA keys) where I'm not sure of the issue. Is it with the display of the credentials ?
image

image

In the Assistant logic, we are trying to display the information in the summary tab in the same order that the user will need them to fill in the ISV application configuration. For instance, access key, secret key at the proper moment. You can see it on the screenshot.

…y update logic

The shared useCreateOrAddBucketToPolicyMutation fingerprints the main
statement by checking for all defaultActions. Rubrik's original policy
was missing GetBucketVersioning and GetBucketObjectLockConfiguration,
so statementIndex always returned -1, causing duplicate statements to
be appended on each re-run instead of updating the resource list.

Additionally, the code pushed Statement[1] of the new policy to add the
ListAllMyBuckets statement — but Rubrik's original single-statement
policy had no Statement[1], resulting in null being serialized into the
policy document and a MalformedPolicyDocument error from IAM.

Fix: restructure GET_RUBRIK_POLICY to match the two-statement pattern
(bucket-scoped actions + wildcard ListBucket statement) used by all
other platforms, and include defaultActions so fingerprinting works.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Comment thread src/react/ISV/utils/ISVPolicy.ts
@claude
Copy link
Copy Markdown

claude bot commented Mar 30, 2026

  • GET_RUBRIK_POLICY duplicates the defaultActions array inline instead of reusing the exported constant, creating a maintenance risk if defaultActions is updated.
    - Use ...defaultActions spread instead of repeating the six action strings.

    Review by Claude Code

@damiengillesscality
Copy link
Copy Markdown
Author

...
In the Assistant logic, we are trying to display the information in the summary tab in the same order that the user will need them to fill in the ISV application configuration. For instance, access key, secret key at the proper moment. You can see it on the screenshot.

Ok I reordered the sections

Screenshot 2026-03-30 at 16 56 50 Screenshot 2026-03-30 at 16 56 56

id: 'rsaKey',
render: () => (
<Stack gap="r8" direction="vertical" style={{ paddingTop: spacing.r8 }}>
<Text>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Inline style usage — other platform files use styled-components for layout. Consider using a styled component or the spacing utilities from core-ui instead of inline style={{ paddingTop: spacing.r8 }}.

— Claude Code

},
{
Sid: 'RubrikListBuckets',
Effect: 'Allow',
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

The Resource for ListBucket is set to *, but s3:ListBucket operates on a specific bucket (unlike s3:ListAllMyBuckets which is account-level). Best practice is to scope s3:ListBucket to the actual bucket ARNs and keep only s3:ListAllMyBuckets on *. This follows the principle of least privilege.

— Claude Code

's3:GetBucketVersioning',
's3:GetBucketObjectLockConfiguration',
// Rubrik-specific actions
's3:AbortMultipartUpload',
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

s3:CreateBucket is included in the Rubrik-specific actions, but the ISV assistant already creates the bucket on behalf of the user. Granting CreateBucket in the IAM policy means the Rubrik agent could create additional buckets beyond what was configured. Verify whether Rubrik CDM actually needs this permission, or if it can be removed to tighten the policy scope.

— Claude Code

@claude
Copy link
Copy Markdown

claude bot commented Mar 30, 2026

  • s3:ListBucket in RubrikListBuckets statement has Resource: '*', but s3:ListBucket is bucket-level (not account-level like s3:ListAllMyBuckets). Scope ListBucket to the actual bucket ARNs for least-privilege.
    • Move s3:ListBucket to the main RubrikPolicy statement (which already has bucket ARNs), or add a third statement scoped to bucket ARNs.
  • s3:CreateBucket is granted in the IAM policy, but the assistant already creates the bucket. Verify Rubrik CDM needs this permission — if not, removing it tightens the policy.
  • buildMutations.ts (not in this diff) uses form.enableImmutableBackup ? 'immutable' : 'non-immutable' for the policy name suffix. For Rubrik, enableImmutableBackup is undefined (falsy), producing ...-rubrik-non-immutable. This works but is semantically misleading for a platform that has no immutability concept at all.
    • Consider adding a disableImmutability-aware branch in buildMutations.ts to use a neutral suffix like default.
  • Minor: inline style={{ paddingTop: spacing.r8 }} in rubrik.tsx:115 — other platforms use styled-components for layout styling.

Review by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants