h2. Summary
CloudStack currently generates many API error messages through ad-hoc string construction, leading to inconsistencies, limited customization, and no clear support for localization.
This feature introduces a structured, key-based error messaging framework where the management server emits a stable error message key along with contextual metadata. Clients and operators can use these to present consistent, customizable, and localized error messages.


h2. Goals


h2. Non-Goals


h2. High-Level Design

h3. Error Message Keys and Metadata
Errors are identified using a unique error message key (for example, {{vm.deploy.serviceoffering.inactive}}) and accompanied by a metadata map containing contextual information such as IDs, names, or related objects.

Instead of hard-coded strings, exceptions are raised with:


h3. API Response Changes
API error responses include the following additional fields:

The existing errortext field is preserved for backward compatibility.

Example:
{code}
{
"deployvirtualmachineresponse": {
"errorcode": 431,
"cserrorcode": 4350,
"errortext": "Unable to deploy Instance as the given service offering 'test' (ID: 13, UUID: ...) is inactive. Specify an active service offering.",
"errortextkey": "vm.deploy.serviceoffering.inactive",
"errormetadata": {
"serviceOffering": "'test' (ID: 13, UUID: ...)"
}
}
}
{code}


h2. Error Message Templates

h3. Template Source
Error message templates are stored in a JSON file on the management server:

The default file is shipped with CloudStack and operators may modify it to customize messages.


h3. Template Format

Example:
{code}
{
"vm.deploy.serviceoffering.inactive":
"Unable to deploy Instance as the given service offering {{serviceOffering}} is inactive. Specify an active service offering.",
"vm.deploy.serviceoffering.inactive.admin":
"Unable to deploy Instance as service offering {{serviceOffering}} is inactive. Please activate it or choose a different offering."
}
{code}


h2. ErrorMessageResolver

A new component, ErrorMessageResolver, is responsible for resolving error message keys into user-facing messages.

Responsibilities:


h2. Role-Aware Error Messages
The caller’s role is determined using CallContext.
If the caller is a root admin and an admin-specific template exists, it is used; otherwise, the default template is applied.


h2. Exception Handling Changes
Common exceptions (such as {{CloudRuntimeException}} and {{ServerApiException}}) are enhanced with constructors that accept:

During API response generation:


h2. Initial Scope
The initial implementation applies this framework to selected validation paths in the VM deployment flow.
Additional flows and modules can be incrementally migrated in future releases.


h2. Backward Compatibility


h2. Packaging and Operations


h2. Testing Strategy


h2. Future Enhancements