Skip to content

new: STORIF-320 - Object storage creation flow updated.#13508

Open
dchyrva-akamai wants to merge 1 commit intolinode:developfrom
dchyrva-akamai:feature/STORIF-320
Open

new: STORIF-320 - Object storage creation flow updated.#13508
dchyrva-akamai wants to merge 1 commit intolinode:developfrom
dchyrva-akamai:feature/STORIF-320

Conversation

@dchyrva-akamai
Copy link
Contributor

Description 📝

Object storage creation flow updated.

Changes 🔄

  • OBJ Access key drawers refactored to be standalone and moved into a separate folder.
  • OBJ Bucket creation drawer moved into a separate folder.
  • OBJ Tabs moved into a separate component.

Preview 📷

image

How to test 🧪

  • Delete all the buckets and keys from your account.

  • Cancel object storage.

  • Navigate to the /object-storage page.

  • Observe OBJ Storage Landing page.

  • Create a bucket or a key.

  • Observe landing page get's replace by tabs view.

Author Checklists

As an Author, to speed up the review process, I considered 🤔

👀 Doing a self review
❔ Our contribution guidelines
🤏 Splitting feature into small PRs
➕ Adding a changeset
🧪 Providing/improving test coverage
🔐 Removing all sensitive information from the code and PR description
🚩 Using a feature flag to protect the release
👣 Providing comprehensive reproduction steps
📑 Providing or updating our documentation
🕛 Scheduling a pair reviewing session
📱 Providing mobile support
♿ Providing accessibility support


  • I have read and considered all applicable items listed above.

As an Author, before moving this PR from Draft to Open, I confirmed ✅

  • All tests and CI checks are passing
  • TypeScript compilation succeeded without errors
  • Code passes all linting rules

@dchyrva-akamai dchyrva-akamai force-pushed the feature/STORIF-320 branch 4 times, most recently from b33e9c9 to dc1fbdb Compare March 18, 2026 12:00
@dchyrva-akamai dchyrva-akamai marked this pull request as ready for review March 18, 2026 12:55
@dchyrva-akamai dchyrva-akamai requested a review from a team as a code owner March 18, 2026 12:55
@dchyrva-akamai dchyrva-akamai force-pushed the feature/STORIF-320 branch 3 times, most recently from 0de6612 to fc5387f Compare March 19, 2026 10:58
export const grantTypeMap = {
account: 'Account',
bucket: 'Buckets',
key: 'Access Keys',
Copy link
Contributor

Choose a reason for hiding this comment

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

I'm not sure if we should add grant mapping for keys if there are no key grants at the moment. I understand that this is for getRestrictedResourceText method, but maybe it would be better to provide an explicit tooltip text for the Access Key button for now, e.g. "You must have full account access to perform this operation.".
We will need some input from the Cloud Manager core team on this one.

Copy link
Contributor

Choose a reason for hiding this comment

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

I just discussed it with Jason - we should use a dedicated text for both Buckets and Access Key. Jason sugested the following text:

You don't have administrator privileges for Object Storage. Your administrator must change your account to full access to provide access to Object Storage.

We can improve the text later after discussing it with TW.

let drawerUrl = `/object-storage/access-keys/${objectStorageKey.id}`;

if (mode === 'editing') {
drawerUrl += `/update`;
Copy link
Contributor

Choose a reason for hiding this comment

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

Do we really need this? To make it consistent, we would need to have URL for each action. Looks like it's out of the scope for the current ticket.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

"we would need to have URL for each action", yes, this is the pattern we are using for Volumes, and I made the first step to migrate OBJ towards that same pattern.

"out of the scope for the current ticket.", refactoring yes, but for the landing page to work correctly I had to make AccessKeys and CreateBucket drawers to be standalone. It is a relatively small change in my opinion.

segment={`${accessDrawerOpen ? `Create an Access Key` : `Access Keys`}`}
/>
<>
<DocumentTitleSegment segment="Access Keys" />
Copy link
Contributor

Choose a reason for hiding this comment

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

This change create inconsistency. In all other pages, the title says "Create a ..." when on the create page.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

To be honest, I don't like the way it was initially implemented. I did the simplification and added a TODO comment to create a proper component for displaying those titles.

Do you think we can leave it like this for now (there is no Create a title) and create a refactoring ticket?

Copy link
Contributor

Choose a reason for hiding this comment

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

Do we need ObjectStorage prefix if it's in the ObjectStorage package?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

https://www.folger.edu/explore/shakespeares-works/hamlet/read/3/1/#line-3.1.64

I was following the same pattern as we are using for Volumes. If it's worth it, maybe we could refactor both later.

Copy link
Contributor

Choose a reason for hiding this comment

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

I think we should avoid organizing components by their type and do that rather by their domain or specific functionality, e.g. Buckets, AccessKeys, etc; on a more granular level AccessKeyTable, AccessKeyDetails, etc.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I treat drawers as separate type here because they might be reused in some other parts of the application, and I am trying to bring ObjectStorage to the same pattern that we are using for Volumes:
https://github.com/linode/manager/tree/develop/packages/manager/src/features/Volumes/VolumeDrawers

.sort(sortByCluster);

export const AccessKeyDrawer = (props: AccessKeyDrawerProps) => {
export const AccessKeyDrawerV1 = (props: AccessKeyDrawerProps) => {
Copy link
Contributor

Choose a reason for hiding this comment

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

If we really need multiple versions of the components, the new components should get a suffix or prefix, not the old one. That would make it much more easy to identify what's changed for someone familiar with the existing code.

Copy link
Contributor Author

@dchyrva-akamai dchyrva-akamai Mar 23, 2026

Choose a reason for hiding this comment

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

Reverted this change.

Initially, I created a proxy component AccessKeyDrawer with both AccessKeyDrawer and OMC_AccessKeyDrawer inside and added the version to avoid naming conflict, but later it got renamed into AccessKeyDrawers so version is not needed anymore.

@skulpok-akamai
Copy link
Contributor

The sheer number of changes is terrifying... Unfortunately, I wasn't able to go through all the changes in a single session.

@dchyrva-akamai dchyrva-akamai force-pushed the feature/STORIF-320 branch 4 times, most recently from 4776a97 to b7c59a3 Compare March 24, 2026 12:23
@linode-gh-bot
Copy link
Collaborator

Cloud Manager UI test results

🔺 10 failing tests on test run #14 ↗︎

❌ Failing✅ Passing↪️ Skipped🕐 Duration
10 Failing878 Passing11 Skipped48m 34s

Details

Failing Tests
SpecTest
lke-create.spec.tsCloud Manager Cypress Tests→LKE Cluster Creation with LKE-E→shows the LKE-E flow with the feature flag on » creates an LKE-E cluster with the account capability
object-storage.smoke.spec.tsCloud Manager Cypress Tests→object storage smoke tests » can create object storage bucket - smoke
object-storage.smoke.spec.tsCloud Manager Cypress Tests→object storage smoke tests » can delete object storage bucket - smoke
object-storage.e2e.spec.tsCloud Manager Cypress Tests→object storage end-to-end tests » can create and delete object storage buckets
bucket-create-multicluster.spec.tsCloud Manager Cypress Tests→Object Storage Multicluster Bucket create » can create object storage bucket with OBJ Multicluster
object-storage-objects-multicluster.spec.tsCloud Manager Cypress Tests→Object Storage Multicluster objects » can upload, access, and delete objects
alerts-create.spec.tsCloud Manager Cypress Tests→Create flow when beta alerts enabled by region and feature flag » create flow after switching to beta alerts
alerts-create.spec.tsCloud Manager Cypress Tests→Create flow when beta alerts enabled by region and feature flag » can toggle from legacy to beta alerts and back to legacy
enable-object-storage.spec.tsCloud Manager Cypress Tests→Object Storage enrollment » can enroll in Object Storage
bucket-delete-multicluster.spec.tsCloud Manager Cypress Tests→Object Storage Multicluster Bucket delete » can delete object storage bucket with OBJ Multicluster

Troubleshooting

Use this command to re-run the failing tests:

pnpm cy:run -s "cypress/e2e/core/kubernetes/lke-create.spec.ts,cypress/e2e/core/objectStorage/object-storage.smoke.spec.ts,cypress/e2e/core/objectStorage/object-storage.e2e.spec.ts,cypress/e2e/core/objectStorageMulticluster/bucket-create-multicluster.spec.ts,cypress/e2e/core/objectStorageMulticluster/object-storage-objects-multicluster.spec.ts,cypress/e2e/core/linodes/alerts-create.spec.ts,cypress/e2e/core/objectStorage/enable-object-storage.spec.ts,cypress/e2e/core/objectStorageMulticluster/bucket-delete-multicluster.spec.ts"

@skulpok-akamai
Copy link
Contributor

After looking into the problem more carefully I still thing that the pull request is too big and cover too many concerns, some of which were not covered in the original ticket, occasionally the complexity has risen (like now we have 3 components for Access Keys Drawer instead of 2), and the code was too strongly reorganized, while there were no need for it. Contributing guidelines are clear on this one: a good PR is small. In order to avoid discussion running in several direction in this PR, I'd like to separate the concerns covered in this ticket. A first step to it will be creating a separate ticket to refactor the drawer management for Object Storage, which should be a prerequisite for reorganizing the "empty" state landing page. I know this might seem painful, but sometimes you need to do few steps back to move forward.

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

Projects

Status: Review

Development

Successfully merging this pull request may close these issues.

3 participants