Cotas e recursos do VDC
As cotas são uma propriedade de um VDC, e não dos objetos individuais dentro dele. Elas são definidas na
criação (vdc-create) e alteradas por atualizações (vdc-set); são lidas junto com os
contadores de uso em uma única chamada a vdc-list. Um valor vazio (null)
significa que não há limite definido para aquele recurso.
As redes são contabilizadas separadamente das cotas. Uma rede é um objeto no nível do cluster: ela entra em um VDC por atribuição, e sua capacidade de endereços é restringida por um limite no par VDC↔rede. Um único limite não se aplica a dois VDCs em uma rede compartilhada; um valor é definido para cada par.
Cotas
Há cinco campos, e cada um limita o próprio recurso. vdc-create aceita um valor
como número ou string ("" e null resultam em null) e o desserializa para i32;
vdc-set aceita um número ou null.
| Campo | Recurso limitado |
|---|---|
quota_ram_gb | RAM, GB |
quota_space_gb | Espaço em disco, GB |
quota_cpu_ghz | Frequência de CPU, GHz |
quota_cpu_cores | Núcleos de CPU |
quota_space_snapshots | Espaço para snapshots |
quota_space_gb limita o espaço total do VDC: os discos das máquinas virtuais
e os volumes de armazenamento são somados. Um tenant que esgotou a cota
com volumes não pode adicionar nem expandir um disco de VM. Iniciar máquinas existentes não está
sujeito a essa regra: um tenant pode ligar a própria máquina desligada mesmo quando
a cota está esgotada.
Não é possível reduzir quota_space_gb abaixo do espaço efetivamente usado: vdc-set rejeita
esse valor com o código -3309 e inclui na mensagem o limite solicitado e o uso atual
de espaço. Um valor rejeitado não é aplicado; o limite sempre pode
ser removido por completo (null).

Fatores de oversubscription
Há um fator para cada cota. Os valores são desserializados para f64:
diferentemente das próprias cotas, os fatores podem ser fracionários. As regras de entrada são as mesmas: vdc-create
aceita um número ou uma string, e vdc-set aceita um número ou null.
| Campo | Cota correspondente |
|---|---|
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 e contabilização de uso
vdc-list retorna um registro completo para cada VDC acessível: identificação,
o papel do usuário que faz a chamada, cotas, fatores e uso.
| Campo | Significado |
|---|---|
id, name, description | Identificação do VDC |
created, modified | Timestamps de criação e da última modificação |
role_id, role_name | O papel do usuário que faz a chamada neste VDC |
vms_total, vms_running | Total de VMs e VMs em execução |
cpu_running | Uso de CPU pelas VMs em execução |
ram_usage | Uso de RAM |
space_gb_used | Espaço usado, GB: discos de VM e volumes de armazenamento somados |
cpu_cores_quota_usage | Uso de núcleos de CPU em relação à cota |
ram_quota_usage | Uso de memória em relação à cota |
space_quota_usage | Uso de espaço em disco em relação à cota |
Resposta a uma solicitação sem 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 não tem cotas: todos os campos quota_* estão vazios, assim como os campos relativos
(*_quota_usage), porque não há valor em relação ao qual calcular uma razão. Os contadores absolutos
continuam preenchidos e iguais a zero.
O formato objective
O parâmetro opcional objective altera o formato da resposta de vdc-list: em vez de
um array, ele retorna um objeto cujas chaves são os IDs dos VDCs e cujos valores são os mesmos
registros. O formato é ativado pela presença do campo; o valor do parâmetro não importa. Isso
poupa o cliente de percorrer um array ao procurar um VDC por id.
Redes atribuídas a um VDC
| Método | Finalidade | Acesso |
|---|---|---|
vdc-assign-network | Atribuir uma rede a um VDC | Cluster master ou o criador da rede com um papel no nível do VDC (role_id <= 2) |
vdc-deassign-network | Remover a atribuição de uma rede | Mesmos requisitos |
vdc-networks | Redes atribuídas aos VDCs acessíveis | Qualquer usuário; a resposta é limitada aos VDCs acessíveis |
vdc-network-addr-limit | Limite de endereços de um par VDC↔rede | Cluster master |
vdc-assign-network e vdc-deassign-network aceitam o mesmo par de
parâmetros: vdc_id e network_id, ambos obrigatórios. Uma resposta bem-sucedida tem
o campo data vazio.
Solicitação de atribuição:
{
"jsonrpc": "2.0",
"method": "vdc-assign-network",
"params": {
"vdc_id": 10,
"network_id": 42
},
"id": "cbf4478c-84b5-45ac-97cd-0390d7190585"
}
A remoção da atribuição é mais restritiva: uma rede com portas atribuídas a VMs não pode ter a atribuição removida. A
resposta -2206 informa o número dessas portas. Desconecte as VMs da rede e repita
a chamada.
A resposta de vdc-networks é um objeto aninhado: as chaves externas são os IDs dos VDCs;
dentro estão o id e o name do VDC, além dos registros das redes atribuídas, cada um com a chave
igual ao seu ID. Cada registro de rede inclui addr_limit, o limite de endereços atual
para aquele par VDC↔rede, junto com os parâmetros da própria rede: tipo e transporte
(network_type_id, backend), as tags vlan_id e qinq_id e os parâmetros de VXLAN
(vxlan_multicast_addr, vxlan_port). Os campos que não se aplicam a esse tipo de rede
ficam vazios (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
}
}
}
}
}
Limite de endereços de um par VDC↔rede
O método vdc-network-addr-limit está disponível apenas para o Cluster master.
| Parâmetro | Tipo | Obrigatório | Restrições |
|---|---|---|---|
vdc_id | Número | Sim | No mínimo 0 |
network_id | Número | Sim | No mínimo 0 |
addr_limit | Número ou null | Sim | No mínimo 0; string vazia não é permitida |
Solicitação:
{
"jsonrpc": "2.0",
"method": "vdc-network-addr-limit",
"params": {
"vdc_id": 10,
"network_id": 42,
"addr_limit": 32
},
"id": "cbf4478c-84b5-45ac-97cd-0390d7190585"
}
A ordem das operações é fixa: um limite só pode ser definido em uma rede que já esteja atribuída. Se
a rede não estiver atribuída ao VDC, a resposta é -23030 e identifica o par. Execute
vdc-assign-network primeiro.
Papéis atribuídos em um VDC
vdc-roles aceita o id do VDC e está disponível apenas para o Cluster master. A resposta é um
mapa de atribuições: cada chave corresponde a uma lista de IDs de papéis concedidos
neste VDC.
{
"jsonrpc": "2.0",
"id": "cbf4478c-84b5-45ac-97cd-0390d7190585",
"result": {
"code": 1,
"data": {
"12": [2, 3],
"15": [4]
}
}
}
A rejeição -403 ("Access denied") significa que a chamada não foi feita por um Cluster master.
Códigos de erro de recursos do VDC
Em cada par de códigos, o primeiro código pertence a vdc-assign-network e o segundo a
vdc-deassign-network: os métodos fazem as mesmas verificações, mas usam conjuntos
separados de códigos de erro. Nas mensagens, <vdc> e <net> são IDs da solicitação;
o servidor os substitui pelos valores reais.
| Código | Mensagem | Quando é retornado |
|---|---|---|
-2102, -2203 | "No params at all" | A solicitação não tem o objeto params |
-403 | "Access denied" | Não há concessões para o VDC da solicitação, ou existe uma concessão, mas o papel está abaixo do nível exigido; os dois casos usam a mesma rejeição de permissão |
-2108, -2218 | "You ain't the creator of network" | Um papel no nível do VDC sem permissões de cluster, e a rede foi criada por outro usuário |
-2120, -2220 | "Network id does not exist" | Não existe rede com esse network_id |
-2121, -2221 | "Bad vdc_id param value" | vdc_id está ausente ou fora do intervalo permitido |
-2122, -2222 | "Bad network_id param value" | network_id está ausente ou fora do intervalo permitido |
-2206 | "There are N ports assigned to VMs" | Uma rede está tendo a atribuição a um VDC removida enquanto ainda há portas de VM atribuídas |
-2207 | "Error upon network ID==<net> deassignment from vDC ID==<vdc>" | A remoção da atribuição da rede falha |
-23020 | "No param addr_limit" | O addr_limit obrigatório está ausente da solicitação |
-23022 | "Bad addr_limit" | O valor de addr_limit não passa na validação |
-23030 | "network_id==<net> has not been assigned to vdc_id==<vdc>, so limit can't be set" | Um limite está sendo definido em uma rede que não está atribuída ao VDC |