apache / apache/cloudstack-go

Generator fabricates list-response JSON wrapper tags from parseSingular(), causing recurring silent-nil-slice bugs

Aberta
#155 0 comentários 0 reações 0 responsáveis Ver no GitHub
Linguagem predominante
Go
Estrelas
39
Forks
47
Métricas de merge de PRs
Nenhum PR com merge em 30d

Descrição

Splitting this out as the systemic root cause behind a recurring class of bugs (#135, #136 / #137, and the four just fixed in #154).

### Problem
For `ListResponse` structs, `generate.go` derives the JSON wrapper tag from `strings.ToLower(parseSingular(listName))`. But the key CloudStack actually returns is set server-side via `setObjectName(...)`, and it is frequently **not** what `parseSingular` produces:

- camelCase: `listHypervisorCapabilities` → server `hypervisorCapabilities`, generator `hypervisorcapability`
- `-xes` plural: `…Ipv6Prefixes` → `Prefixe` (also corrupts the element **type name**), server `guestnetworkipv6prefix`
- hand-chosen keys: `listLBHealthCheckPolicies` → server `healthcheckpolicies` (drops the `lb`, stays plural), generator `lbhealthcheckpolicy`

When the tag is wrong, `json.Unmarshal` populates `Count` but leaves the slice **nil** — silent data loss — and the generated `GetByID` helper then panics on `slice[0]`.

### Current mitigation doesn’t scale
`generateResponseType` already carries a hand-maintained override `switch` (~30 cases, incl. the metrics ones) that exists precisely to patch this. Each new case is added **reactively**, only after a user hits a nil slice. #154 adds four more; there are almost certainly others not yet reported.

Note: `listApis.json` (the generator input) does **not** expose the list wrapper object name — it carries each item’s `response` fields and `related`, but not the `setObjectName` value — so the correct key can’t simply be read from there.

### Proposed directions
1. **Harden `parseSingular`** for the regular English plurals it currently mishandles — `-xes/-ses/-ches/-shes` → drop `es` (it already does `-ies`/`-sses`). This fixes the `Prefixe` type-name corruption and several tags for free, shrinking the override set.
2. **Make the override set verifiable instead of reactive:** add a CI/test check that asserts each `ListResponse` tag against the keys in the `test/testdata/*.json` fixtures (and/or a captured real response), so drift is caught at build time rather than by users in production.
3. Optionally, a curated `command → objectName` override map (cleaner than inline `switch` cases) seeded from the verified keys.

I verified the #154 keys against the CloudStack server source (`setObjectName`) and have a 4.22 environment; happy to take on (1) and/or (2) if a maintainer signals a preferred direction.

Guia de contribuição

Nenhum guia de contribuição indexado para este repositório

Direção de pesquisa

Comece em generate.go, especialmente em parseSingular e generateResponseType, e revise o override switch existente. Compare as tags geradas de ListResponse com as chaves verificadas em test/testdata/*.json e com os valores de setObjectName no lado do servidor; listApis.json não contém esses nomes de wrapper. Está concluído quando a abordagem proposta para o tratamento e/ou a verificação de plurais impedir slices nil silenciosos sem depender apenas de overrides reativos.

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
go
Domínio
api, tooling
Tipo de issue
Bug
Dificuldade
4/5
Tempo estimado
3-5 dias
Status de atividade
Pouca atividade
Clareza
Razoavelmente clara
Facilidade para iniciantes
45/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.