Skip to content

Extensions Framework & Orchestrate Anything #9752

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 147 commits into
base: main
Choose a base branch
from

Conversation

harikrishna-patnala
Copy link
Contributor

@harikrishna-patnala harikrishna-patnala commented Oct 1, 2024

Description

Apache CloudStack already supports a wide range of hypervisors, including KVM, VMware, and Xen, to provision and manage instances. We are now introducing a new feature or framework that allows seamless integration of "external" provisioning systems into CloudStack. For example, this enables the integration of any baremetal provisioning system, platforms like Proxmox, or even the addition of new hypervisor support through the use of simple scripts.

A design document is made with more details at https://cwiki.apache.org/confluence/display/CLOUDSTACK/External+Deployment+Integration+in+CloudStack

Documentation PR: apache/cloudstack-documentation#523

Types of changes

  • Breaking change (fix or feature that would cause existing functionality to change)
  • 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

  • Major
  • Minor

Copy link

codecov bot commented Oct 1, 2024

Codecov Report

Attention: Patch coverage is 5.27845% with 1956 lines in your changes missing coverage. Please review.

Project coverage is 16.50%. Comparing base (5b7c3b4) to head (85101ac).

Files with missing lines Patch % Lines
...visioner/ExternalEntryPointPayloadProvisioner.java 0.00% 371 Missing ⚠️
...he/cloudstack/extension/ExtensionCustomAction.java 0.00% 222 Missing ⚠️
...n/java/com/cloud/vm/VirtualMachineManagerImpl.java 2.68% 143 Missing and 2 partials ⚠️
...hypervisor/external/resource/ExternalResource.java 0.00% 135 Missing ⚠️
...udstack/agent/manager/ExternalTemplateAdapter.java 0.00% 125 Missing ⚠️
.../external/discoverer/ExternalServerDiscoverer.java 0.00% 107 Missing ⚠️
...n/java/com/cloud/resource/ResourceManagerImpl.java 0.00% 74 Missing ⚠️
...loudstack/agent/manager/ExternalServerPlanner.java 0.00% 68 Missing ⚠️
...ck/api/response/ExtensionCustomActionResponse.java 0.00% 66 Missing ⚠️
...n/java/com/cloud/template/TemplateAdapterBase.java 43.37% 46 Missing and 1 partial ⚠️
... and 61 more
Additional details and impacted files
@@             Coverage Diff              @@
##               main    #9752      +/-   ##
============================================
- Coverage     16.57%   16.50%   -0.07%     
- Complexity    13967    13979      +12     
============================================
  Files          5743     5776      +33     
  Lines        510468   512985    +2517     
  Branches      62073    62446     +373     
============================================
+ Hits          84616    84688      +72     
- Misses       416390   418816    +2426     
- Partials       9462     9481      +19     
Flag Coverage Δ
uitests 3.84% <ø> (-0.06%) ⬇️
unittests 17.41% <5.27%> (-0.06%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@apache apache deleted a comment from blueorangutan Oct 1, 2024
@apache apache deleted a comment from blueorangutan Oct 1, 2024
Copy link

This pull request has merge conflicts. Dear author, please fix the conflicts and sync your branch with the base branch.

@harikrishna-patnala
Copy link
Contributor Author

@blueorangutan package

@blueorangutan
Copy link

@harikrishna-patnala a [SL] Jenkins job has been kicked to build packages. It will be bundled with KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

@blueorangutan
Copy link

Packaging result [SF]: ✔️ el8 ✔️ el9 ✖️ debian ✔️ suse15. SL-JID 11530

Copy link
Contributor

@DaanHoogland DaanHoogland left a comment

Choose a reason for hiding this comment

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

@harikrishna-patnala , I noticed I had started reviewing this and abandonned it. I was about half way anf will leave you the comments now. I will revisit after 4.20 is out.

@Parameter(name = ApiConstants.EXTERNAL_PROVISIONER, type = CommandType.STRING, description = "Name of the provisioner for the external host, this is mandatory input in case of hypervisor type external", since = "4.21.0")
private String provisioner;

@Parameter(name = ApiConstants.EXTERNAL_DETAILS, type = CommandType.MAP, description = "Details in key/value pairs using format externaldetails[i].keyname=keyvalue. Example: externaldetails[0].endpoint.url=urlvalue", since = "4.21.0")
Copy link
Contributor

Choose a reason for hiding this comment

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

why are these externaldetails and not just details

@@ -67,6 +70,9 @@ public class UpdateHostCmd extends BaseCmd {
@Parameter(name = ApiConstants.ANNOTATION, type = CommandType.STRING, description = "Add an annotation to this host", since = "4.11", authorized = {RoleType.Admin})
private String annotation;

@Parameter(name = ApiConstants.EXTERNAL_DETAILS, type = CommandType.MAP, description = "Details in key/value pairs using format externaldetails[i].keyname=keyvalue. Example: externaldetails[0].endpoint.url=urlvalue", since = "4.21.0")
Copy link
Contributor

Choose a reason for hiding this comment

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

details instead of external...

@@ -251,6 +252,8 @@ public class CreateServiceOfferingCmd extends BaseCmd {
since="4.20")
private Boolean purgeResources;

@Parameter(name = ApiConstants.EXTERNAL_DETAILS, type = CommandType.MAP, description = "Details in key/value pairs using format externaldetails[i].keyname=keyvalue. Example: externaldetails[0].endpoint.url=urlvalue", since = "4.21.0")
Copy link
Contributor

Choose a reason for hiding this comment

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

why do we need those extra external-details? aren't these just details?

@@ -359,9 +362,21 @@ public Map<String, String> getDetails() {
}
}
}

detailsMap.putAll(getExternalDetails());
Copy link
Contributor

Choose a reason for hiding this comment

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

see? these are just details.

public class RebootCommand extends Command {
String vmName;
VirtualMachineTO vm;
private Map<String, String> _details;
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
private Map<String, String> _details;
private Map<String, String> details;

}

public void setDetails(Map<String, String> details) {
_details = details;
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
_details = details;
this.details = details;

}

public Map<String, String> getDetails() {
return _details;
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
return _details;
return details;

} else if (template.getFormat() == ImageFormat.BAREMETAL) {
logger.debug("%s has format [{}]. Skipping ROOT volume [{}] allocation.", template.toString(), ImageFormat.BAREMETAL, rootVolumeName);
} else if (template.getFormat() == ImageFormat.BAREMETAL || template.getFormat() == ImageFormat.EXTERNAL) {
logger.debug(String.format("%s has format [%s]. Skipping ROOT volume [%s] allocation.", template.toString(), template.getFormat(), rootVolumeName));
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
logger.debug(String.format("%s has format [%s]. Skipping ROOT volume [%s] allocation.", template.toString(), template.getFormat(), rootVolumeName));
logger.debug("{} has format [{}]. Skipping ROOT volume [{}] allocation.", template.toString(), template.getFormat(), rootVolumeName);

Comment on lines 1910 to 1931
if (HypervisorType.External.equals(vm.getHypervisorType())) {
Long hostID = profile.getHostId();
if (hostID != null) {
HostVO host = _hostDao.findById(hostID);
HashMap<String, String> accessDetails = new HashMap<>();
loadExternalHostAccessDetails(host, accessDetails);
loadExternalInstanceDetails(vm.getId(), accessDetails);

stpCmd.setDetails(accessDetails);
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

can this be a method too?

Comment on lines 2249 to 2269
if (HypervisorType.External.equals(vm.getHypervisorType())) {
Long hostID = profile.getHostId();
HostVO host = _hostDao.findById(hostID);

HashMap<String, String> accessDetails = new HashMap<>();
loadExternalHostAccessDetails(host, accessDetails);
loadExternalInstanceDetails(vm.getId(), accessDetails);

stop.setDetails(accessDetails);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

another method? maybe even unify with the one at line 1910-1920.

@sureshanaparti sureshanaparti self-assigned this Nov 13, 2024
@rohityadavcloud
Copy link
Member

@blueorangutan package

@blueorangutan
Copy link

@rohityadavcloud a [SL] Jenkins job has been kicked to build packages. It will be bundled with KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

@blueorangutan
Copy link

Packaging result [SF]: ✔️ el8 ✔️ el9 ✔️ debian ✔️ suse15. SL-JID 11592

@harikrishna-patnala
Copy link
Contributor Author

@DaanHoogland I see many other custom detail parameters in a few other APIs, such as vnfdetails, domaindetails, accountdetails, and a few more.

In this case, I would like to keep this as a separate parameter because these are the only details that are important if the hypervisor type is External. The other parameters are just meant to fit into CloudStack's workflow. The core purpose of this feature is to send these external details to the external provisioner.

Copy link

github-actions bot commented Dec 3, 2024

This pull request has merge conflicts. Dear author, please fix the conflicts and sync your branch with the base branch.

Copy link

github-actions bot commented Dec 3, 2024

This pull request has merge conflicts. Dear author, please fix the conflicts and sync your branch with the base branch.

Signed-off-by: Abhishek Kumar <[email protected]>
shwstppr added a commit to shapeblue/cloudstack-documentation that referenced this pull request Jun 19, 2025
shwstppr added 2 commits June 19, 2025 17:28
Signed-off-by: Abhishek Kumar <[email protected]>
Signed-off-by: Abhishek Kumar <[email protected]>
)
VALUES (
UUID(), ext_name, ext_desc, 'Orchestrator',
entry_point, 1, 0, 'Enabled', NOW(), NULL
Copy link
Contributor

Choose a reason for hiding this comment

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

@abh1sar should this be Disabled by default?

Comment on lines +19 to +22
generate_random_mac() {
hexchars="0123456789ABCDEF"
echo "52:54:00:$(for i in {1..3}; do echo -n ${hexchars:$(( RANDOM % 16 )):1}${hexchars:$(( RANDOM % 16 )):1}; [[ $i -lt 3 ]] && echo -n ':'; done)"
}
Copy link
Contributor

Choose a reason for hiding this comment

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

@abh1sar we don't seem to be using prepare for proxmox, should we remove this?

Comment on lines +143 to +152
parse_json "$1" || exit 1

local mac_address
mac_address=$(generate_random_mac)

local response
response=$(jq -n --arg mac "$mac_address" \
'{status: "success", mac_address: $mac}')

echo "$response"
Copy link
Contributor

Choose a reason for hiding this comment

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

since we are not using prepare maybe better to send empty response or remove prepare handling? @abh1sar

Signed-off-by: Abhishek Kumar <[email protected]>
@shwstppr
Copy link
Contributor

@blueorangutan package

@blueorangutan
Copy link

@shwstppr a [SL] Jenkins job has been kicked to build packages. It will be bundled with KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

@blueorangutan
Copy link

Packaging result [SF]: ✔️ el8 ✔️ el9 ✔️ debian ✔️ suse15. SL-JID 13846

@shwstppr
Copy link
Contributor

@blueorangutan test

@blueorangutan
Copy link

@shwstppr a [SL] Trillian-Jenkins test job (ol8 mgmt + kvm-ol8) has been kicked to run smoke tests

@blueorangutan
Copy link

[SF] Trillian Build Failed (tid-13575)

@shwstppr
Copy link
Contributor

@blueorangutan test

@blueorangutan
Copy link

@shwstppr a [SL] Trillian-Jenkins test job (ol8 mgmt + kvm-ol8) has been kicked to run smoke tests

@blueorangutan
Copy link

[SF] Trillian test result (tid-13576)
Environment: kvm-ol8 (x2), Advanced Networking with Mgmt server ol8
Total time taken: 57360 seconds
Marvin logs: https://github.com/blueorangutan/acs-prs/releases/download/trillian/pr9752-t13576-kvm-ol8.zip
Smoke tests completed. 141 look OK, 0 have errors, 0 did not run
Only failed and skipped tests results shown below:

Test Result Time (s) Test File

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: In Progress
Development

Successfully merging this pull request may close these issues.

10 participants