Adding new Dell EMC ECS Object Storage Plugin for CloudStack
Description
This PR adds support for a Dell EMC ECS S3 object storage plugin for Apache CloudStack. ECS is a software-defined object storage platform that supports both object and file-system protocols, with a focus on scalable and reliable object storage. We have been using ECS in production for three years, and this work extends CloudStack’s existing MinIO plugin to provide similar functionality for ECS.
The implementation supports the full lifecycle of S3-compatible buckets on ECS, including user provisioning, bucket creation, policy management, versioning, creation-time encryption, and integration with CloudStack’s S3 Browser. All functionality has been tested in a lab environment on Ubuntu using a CloudStack development setup based on the official installation guidelines.
Key architectural differences from MinIO:
Management API Integration
ECS requires use of the ECS Management API (port 4443, or 443 when fronted by HAProxy). CloudStack authenticates with management-user credentials to perform bucket and user operations.
Namespace Requirements
A dedicated ECS namespace is required for CloudStack-managed buckets. Multiple namespaces allow different CloudStack environments to share the same ECS cluster.
S3 Endpoints (Public and Private)
ECS exposes S3 services on ports 9020/9021 (non-TLS/TLS). In our deployment, these are routed through HAProxy and exposed externally on port 443. The Public URL is displayed to CloudStack users, while the Private URL is used internally.
TLS Handling
The “Allow Insecure HTTPS” option controls whether CloudStack accepts untrusted certificates when communicating with the ECS Management API.
User Provisioning Workflow
When a CloudStack user creates their first bucket, CloudStack provisions a corresponding ECS object user using the CloudStack UUID with a cs- prefix. ECS generates access and secret keys once, which CloudStack securely stores and reuses for subsequent bucket operations.
Bucket features:
- Encryption: Supported only during bucket creation; CloudStack hides encryption in the update view.
- Bucket Policy: Supports Private and Public configurations.
- Versioning: Fully supported through the S3 API rather than the Management API.
- Object Lock: Not supported in this release; the UI hides the option and API calls return a clear error.
Bucket modification supports quota changes, versioning updates, and policy changes. Encryption is excluded because ECS does not allow changing it after creation.
CloudStack’s S3 Browser supports upload, download, delete, listing, and prefix filtering through the ECS S3 endpoint. ECS prevents deletion of non-empty buckets, and CloudStack surfaces these errors accordingly.
We welcome review and feedback. The development fork is available here:
https://github.com/mhkadhum/cloudstack
Types of changes
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
- [x] New feature (non-breaking change which adds functionality)
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] Enhancement (improves an existing feature and functionality)
- [ ] Cleanup (Code refactoring and cleanup, that may add test cases)
- [ ] Build/CI
- [ ] Test (unit or integration test code)
Feature/Enhancement Scale or Bug Severity
Feature/Enhancement Scale
- [x] Major
- [ ] Minor
Bug Severity
- [ ] BLOCKER
- [ ] Critical
- [ ] Major
- [ ] Minor
- [ ] Trivial
Screenshots (if appropriate):
How Has This Been Tested?
The plugin was tested in an Ubuntu-based CloudStack development environment created by cloning the CloudStack source and following the official installation instructions. Testing included:
- Management API authentication and namespace operations
- Object-user provisioning and credential handling
- Bucket creation, deletion, versioning, quota updates, and policy changes
- S3 Browser operations (upload, download, delete, listing, prefix navigation)
- Error handling for invalid configurations and unsupported Object Lock requests
- TLS and insecure-TLS scenarios
- HAProxy-fronted deployments for both Management API and S3 endpoints
Congratulations on your first Pull Request and welcome to the Apache CloudStack community! If you have any issues or are unsure about any anything please check our Contribution Guide (https://github.com/apache/cloudstack/blob/main/CONTRIBUTING.md) Here are some useful points:
- In case of a new feature add useful documentation (raise doc PR at https://github.com/apache/cloudstack-documentation)
- Be patient and persistent. It might take some time to get a review or get the final approval from the committers.
- Pay attention to the quality of your code, ensure tests are passing and your PR doesn't have conflicts.
- Please follow ASF Code of Conduct for all communication including (but not limited to) comments on Pull Requests, Issues, Mailing list and Slack.
- Be sure to read the CloudStack Coding Conventions. Apache CloudStack is a community-driven project and together we are making it better 🚀. In case of doubts contact the developers at: Mailing List: [email protected] (https://cloudstack.apache.org/mailing-lists.html) Slack: https://apachecloudstack.slack.com/
Codecov Report
:x: Patch coverage is 0% with 1052 lines in your changes missing coverage. Please review.
:white_check_mark: Project coverage is 17.53%. Comparing base (8171d95) to head (6e3fb3e).
:warning: Report is 30 commits behind head on main.
Additional details and impacted files
@@ Coverage Diff @@
## main #12124 +/- ##
============================================
- Coverage 17.56% 17.53% -0.04%
- Complexity 15538 15548 +10
============================================
Files 5912 5916 +4
Lines 529383 530514 +1131
Branches 64660 64933 +273
============================================
+ Hits 92984 93002 +18
- Misses 425941 427052 +1111
- Partials 10458 10460 +2
| Flag | Coverage Δ | |
|---|---|---|
| uitests | 3.58% <ø> (-0.01%) |
:arrow_down: |
| unittests | 18.59% <0.00%> (-0.04%) |
:arrow_down: |
Flags with carried forward coverage won't be shown. Click here to find out more.
:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.
:rocket: New features to boost your workflow:
- :snowflake: Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
- :package: JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
@mhkadhum can you check the build errors?
Thanks for the feedback!
ive added the missing license headers and ran pre-commit locally, and pushed an updated commit
looks generally good @mhkadhum , thanks for the contribution. Will you be maintaining this? As it is a 3rd party component and it may require hardware or licenses not available to the project.
looks generally good @mhkadhum , thanks for the contribution. Will you be maintaining this? As it is a 3rd party component and it may require hardware or licenses not available to the project.
Yes, I will be the maintainer for the plugin. I have made a new commit to fix the previous build. Could you kindly review it
Hi, @DaanHoogland @abh1sar Just made the Update talked about in my previous comment with @DaanHoogland The screen displays the token creation request, which responds with the token and expiration details in the response headers. These headers are then utilized in the code to store the token for the specified duration.
X-SDS-AUTH-MAX-AGE
Hello @abh1sar @DaanHoogland
I just wanted to quickly follow up on my last comment.
I understand u r probably busy but if u get a chance, could u take a look when possible ? Appreciate the help!
Hello @abh1sar @DaanHoogland I just wanted to quickly follow up on my last comment. I understand u r probably busy but if u get a chance, could u take a look when possible ? Appreciate the help!
sorry @mhkadhum , this https://github.com/apache/cloudstack/pull/12124#issuecomment-3606486217 you mean right? I didn’t read it as a question and though this is ready for testing. What issues are you having right now?
Hello @abh1sar @DaanHoogland I just wanted to quickly follow up on my last comment. I understand u r probably busy but if u get a chance, could u take a look when possible ? Appreciate the help!
sorry @mhkadhum , this #12124 (comment) you mean right? I didn’t read it as a question and though this is ready for testing. What issues are you having right now?
No worries @DaanHoogland Yes this one. There are no issues at the moment. I am simply checking the status of the PR. Additionally, I am planning to develop another plugin for a different third-party object storage. Do you have an ECS environment where you plan to conduct the testing?
Hi @mhkadhum, I am planning to finish my review by early next week.
Do you have an ECS environment where you plan to conduct the testing?
No, but we will regard this as 3rd party extension and trust you with specific feature testing, only doing regression testing. (sponsored donation in the sense that you make an instance available for testing is welcome, but you maintaining it as even more ;)
Reviewed EcsObjectStoreDriverImpl Overall functionality looks good but there are some comments on code maintainability and organisation. Please check. Overall, I think use of reflections can be avoided in most cases.
Hello @abh1sar Thank you for ur feedback, am working on addressing all the issues u provided.