Cuotas y recursos del VDC
Las cuotas son una propiedad del VDC, y no de los objetos individuales que contiene. Se establecen durante
la creación (vdc-create) y se cambian mediante actualizaciones (vdc-set); se leen junto con los
contadores de uso en una sola llamada a vdc-list. Un valor vacío (null)
significa que no hay límite establecido para ese recurso.
Las redes se contabilizan por separado de las cuotas. Una red es un objeto a nivel de clúster: entra en un VDC mediante su asignación, y su capacidad de direcciones está restringida por un límite sobre el par VDC↔red. Un mismo límite no se aplica a dos VDC en una red compartida; se establece un valor para cada par.
Cuotas
Hay cinco campos, y cada uno limita su propio recurso. vdc-create acepta un valor
como número o como cadena ("" y null producen null) y lo deserializa a i32;
vdc-set acepta un número o null.
| Campo | Recurso limitado |
|---|---|
quota_ram_gb | RAM, GB |
quota_space_gb | Espacio en disco, GB |
quota_cpu_ghz | Frecuencia de CPU, GHz |
quota_cpu_cores | Núcleos de CPU |
quota_space_snapshots | Espacio para instantáneas |
quota_space_gb limita el espacio total del VDC: se suman los discos de las máquinas virtuales
y los volúmenes de almacenamiento. Un inquilino que ha agotado la cuota
con volúmenes no puede añadir ni ampliar un disco de VM. El arranque de las máquinas existentes no está
sujeto a esta regla: un inquilino puede encender su propia máquina apagada incluso cuando
la cuota está agotada.
No se puede reducir quota_space_gb por debajo del espacio realmente utilizado: vdc-set rechaza
dicho valor con el código -3309 e incluye en el mensaje el límite solicitado y el uso actual
del espacio. Un valor rechazado no se aplica; el límite siempre se puede
eliminar por completo (null).

Factores de sobresuscripción
Hay un factor por cada cuota. Los valores se deserializan a f64:
a diferencia de las propias cuotas, los factores pueden ser fraccionarios. Las reglas de entrada son las mismas: vdc-create
acepta un número o una cadena, y vdc-set acepta un número o null.
| Campo | Cuota correspondiente |
|---|---|
quota_oversubscription_rate_ram | quota_ram_gb |
quota_oversubscription_rate_space_gb | quota_space_gb |
quota_oversubscription_rate_cpu_ghz | quota_cpu_ghz |
quota_oversubscription_rate_cpu_cores | quota_cpu_cores |
quota_oversubscription_rate_space_snapshots | quota_space_snapshots |
Contadores y contabilidad del uso
vdc-list devuelve un registro completo para cada VDC accesible: identificación,
el rol del usuario que realiza la llamada, cuotas, factores y uso.
| Campo | Significado |
|---|---|
id, name, description | Identificación del VDC |
created, modified | Marcas de tiempo de creación y de última modificación |
role_id, role_name | El rol del usuario que realiza la llamada en este VDC |
vms_total, vms_running | Total de VM y VM en ejecución |
cpu_running | Uso de CPU por las VM en ejecución |
ram_usage | Uso de RAM |
space_gb_used | Espacio utilizado, GB: discos de VM y volúmenes de almacenamiento en conjunto |
cpu_cores_quota_usage | Uso de núcleos de CPU respecto a la cuota |
ram_quota_usage | Uso de memoria respecto a la cuota |
space_quota_usage | Uso de espacio en disco respecto a la cuota |
Respuesta a una solicitud sin parámetros:
{
"jsonrpc": "2.0",
"id": "cbf4478c-84b5-45ac-97cd-0390d7190585",
"result": {
"code": 1,
"data": [
{
"id": 2,
"name": "vdc_name",
"description": null,
"created": 1710000000,
"modified": 1710000000,
"role_id": 2,
"role_name": "vDC admin",
"quota_cpu_cores": null,
"quota_cpu_ghz": null,
"quota_ram_gb": null,
"quota_space_gb": null,
"quota_space_snapshots": null,
"quota_oversubscription_rate_cpu_cores": null,
"quota_oversubscription_rate_cpu_ghz": null,
"quota_oversubscription_rate_ram": null,
"quota_oversubscription_rate_space_gb": null,
"quota_oversubscription_rate_space_snapshots": null,
"cpu_cores_quota_usage": null,
"cpu_running": 0,
"ram_quota_usage": null,
"ram_usage": 0,
"space_gb_used": 0,
"space_quota_usage": null,
"vms_running": 0,
"vms_total": 0
}
]
}
}
Este VDC no tiene cuotas: todos los campos quota_* están vacíos, al igual que los campos relativos
(*_quota_usage), porque no hay ningún valor respecto al cual calcular una proporción. Los contadores absolutos
sí se rellenan y son iguales a cero.
El formato objective
El parámetro opcional objective cambia la forma de la respuesta de vdc-list: en lugar de
una matriz, devuelve un objeto cuyas claves son los ID de los VDC y cuyos valores son los mismos
registros. El formato se activa por la presencia del campo; el valor del parámetro no importa. Esto
evita que el cliente tenga que recorrer una matriz al buscar un VDC por id.
Redes asignadas a un VDC
| Método | Finalidad | Acceso |
|---|---|---|
vdc-assign-network | Asignar una red a un VDC | Cluster master o el creador de la red con un rol a nivel de VDC (role_id <= 2) |
vdc-deassign-network | Eliminar la asignación de una red | Los mismos requisitos |
vdc-networks | Redes asignadas a los VDC accesibles | Cualquier usuario; la respuesta está limitada a los VDC accesibles |
vdc-network-addr-limit | Límite de direcciones de un par VDC↔red | Cluster master |
vdc-assign-network y vdc-deassign-network aceptan el mismo par de
parámetros: vdc_id y network_id, ambos obligatorios. Una respuesta correcta tiene
el campo data vacío.
Solicitud de asignación:
{
"jsonrpc": "2.0",
"method": "vdc-assign-network",
"params": {
"vdc_id": 10,
"network_id": 42
},
"id": "cbf4478c-84b5-45ac-97cd-0390d7190585"
}
La desasignación es más restrictiva: no se puede desasignar una red que tenga puertos asignados a VM. La
respuesta -2206 indica el número de esos puertos. Desconecte las VM de la red y repita
la llamada.
La respuesta de vdc-networks es un objeto anidado: las claves externas son los ID de los VDC;
dentro están el id y el name del VDC, además de los registros de las redes asignadas, cada uno con
su ID como clave. Cada registro de red incluye addr_limit, el límite de direcciones actual
para ese par VDC↔red, junto con los parámetros propios de la red: tipo y transporte
(network_type_id, backend), las etiquetas vlan_id y qinq_id, y los parámetros de VXLAN
(vxlan_multicast_addr, vxlan_port). Los campos que no se aplican a este tipo de red
están vacíos (null):
{
"jsonrpc": "2.0",
"id": "cbf4478c-84b5-45ac-97cd-0390d7190585",
"result": {
"code": 1,
"data": {
"10": {
"id": 10,
"name": "vdc_name",
"42": {
"addr_limit": 32,
"backend": 2,
"creator": 1,
"id": 42,
"mtu": 1500,
"name": "net",
"net_cidr": "192.0.2.0/24",
"network_type_id": 2,
"vlan_id": null,
"qinq_id": null,
"vxlan_multicast_addr": "239.0.0.1",
"vxlan_port": 9009
}
}
}
}
}
Límite de direcciones de un par VDC↔red
El método vdc-network-addr-limit solo está disponible para Cluster master.
| Parámetro | Tipo | Obligatorio | Restricciones |
|---|---|---|---|
vdc_id | Número | Sí | Como mínimo 0 |
network_id | Número | Sí | Como mínimo 0 |
addr_limit | Número o null | Sí | Como mínimo 0; no se admite una cadena vacía |
Solicitud:
{
"jsonrpc": "2.0",
"method": "vdc-network-addr-limit",
"params": {
"vdc_id": 10,
"network_id": 42,
"addr_limit": 32
},
"id": "cbf4478c-84b5-45ac-97cd-0390d7190585"
}
El orden de las operaciones es fijo: solo se puede establecer un límite en una red que ya esté asignada. Si
la red no está asignada al VDC, la respuesta es -23030 e identifica el par. Ejecute
primero vdc-assign-network.
Roles asignados en un VDC
vdc-roles acepta el id del VDC y solo está disponible para Cluster master. La respuesta es un
mapa de asignaciones: cada clave corresponde a una lista de ID de roles concedidos en
este VDC.
{
"jsonrpc": "2.0",
"id": "cbf4478c-84b5-45ac-97cd-0390d7190585",
"result": {
"code": 1,
"data": {
"12": [2, 3],
"15": [4]
}
}
}
El rechazo -403 ("Access denied") significa que la llamada no la realizó un Cluster master.
Códigos de error de los recursos del VDC
En cada par de códigos, el primero corresponde a vdc-assign-network y el segundo a
vdc-deassign-network: los métodos realizan las mismas comprobaciones, pero usan conjuntos
de códigos de error independientes. En los mensajes, <vdc> y <net> son ID de la solicitud;
el servidor sustituye sus valores reales.
| Código | Mensaje | Cuándo se devuelve |
|---|---|---|
-2102, -2203 | "No params at all" | La solicitud no tiene el objeto params |
-403 | "Access denied" | No hay concesiones para el VDC de la solicitud, o existe una concesión pero el rol está por debajo del nivel requerido; ambos casos usan el mismo rechazo de permisos |
-2108, -2218 | "You ain't the creator of network" | Un rol a nivel de VDC sin permisos de clúster, y la red la creó otro usuario |
-2120, -2220 | "Network id does not exist" | No existe ninguna red con este network_id |
-2121, -2221 | "Bad vdc_id param value" | vdc_id falta o está fuera del rango permitido |
-2122, -2222 | "Bad network_id param value" | network_id falta o está fuera del rango permitido |
-2206 | "There are N ports assigned to VMs" | Se está desasignando una red de un VDC mientras todavía hay puertos de VM asignados |
-2207 | "Error upon network ID==<net> deassignment from vDC ID==<vdc>" | La desasignación de la red falla |
-23020 | "No param addr_limit" | Falta en la solicitud el parámetro obligatorio addr_limit |
-23022 | "Bad addr_limit" | El valor de addr_limit no supera la validación |
-23030 | "network_id==<net> has not been assigned to vdc_id==<vdc>, so limit can't be set" | Se está estableciendo un límite en una red que no está asignada al VDC |