|
| 1 | +--- |
| 2 | +name: ippool-agent-deployment-reconcile |
| 3 | +description: Plan to move IPPool agents from Pods to Deployments and reconcile via operator pattern. |
| 4 | +--- |
| 5 | + |
| 6 | +# Plan |
| 7 | + |
| 8 | +Obiettivo: passare da agent Pod a Deployment per ogni IPPool e riconciliare con pattern operator, aggiornando API, controller, RBAC e test. |
| 9 | + |
| 10 | +## Requirements |
| 11 | +- Ogni IPPool crea/gestisce un Deployment agent (repliche=1) con la stessa logica di rete/affinity/args attuale. |
| 12 | +- Reconcile idempotente: crea/aggiorna/monitor/cleanup del Deployment. |
| 13 | +- Upgrade immagine rispettando `hold-ippool-agent-upgrade`. |
| 14 | + |
| 15 | +## Scope |
| 16 | +- In: IPPool controller, API/CRD status, codegen, RBAC, test. |
| 17 | +- Out: logica DHCP/IPAM/VMNetCfg non correlata. |
| 18 | + |
| 19 | +## Files and entry points |
| 20 | +- `pkg/controller/ippool/controller.go` |
| 21 | +- `pkg/controller/ippool/common.go` |
| 22 | +- `pkg/apis/network.harvesterhci.io/v1alpha1/ippool.go` |
| 23 | +- `pkg/codegen/main.go`, `pkg/config/context.go` |
| 24 | +- `pkg/util/fakeclient`, `pkg/controller/ippool/controller_test.go` |
| 25 | +- `chart/templates/rbac.yaml`, `chart/crds/network.harvesterhci.io_ippools.yaml` |
| 26 | +- `pkg/data/data.go` |
| 27 | + |
| 28 | +## Data model / API changes |
| 29 | +- Sostituire `status.agentPodRef` con `status.agentDeploymentRef` (nuovo `DeploymentReference`). |
| 30 | + |
| 31 | +## Action items |
| 32 | +[ ] Aggiungere client/controller apps/v1 Deployment (codegen + Management) e fakeclient. |
| 33 | +[ ] Implementare `prepareAgentDeployment` e aggiornare Deploy/Monitor/Cleanup per Deployment. |
| 34 | +[ ] Aggiornare watch `relatedresource` su Deployment con label ippool. |
| 35 | +[ ] Aggiornare builder/status helpers e test per Deployment. |
| 36 | +[ ] Aggiornare RBAC per `deployments` (get/list/watch/create/update/delete). |
| 37 | +[ ] Rigenerare codegen/CRD/bindata. |
| 38 | + |
| 39 | +## Testing and validation |
| 40 | +- `go test ./...` (o `go test ./pkg/controller/ippool -run TestHandler_`). |
| 41 | +- `go generate` per rigenerare CRD/client/bindata. |
| 42 | + |
| 43 | +## Risks and edge cases |
| 44 | +- Breaking change CRD status. |
| 45 | +- Strategia Deployment (Recreate vs RollingUpdate) impatta continuita DHCP. |
| 46 | +- Namespace agent != IPPool: relazione via label, non ownerRef. |
| 47 | + |
| 48 | +## Open questions |
| 49 | +- Posso usare `agentDeploymentRef` al posto di `agentPodRef` anche se breaking? |
| 50 | +- Preferisci `Recreate` o `RollingUpdate` per i Deployment agent? |
| 51 | + |
| 52 | +--- |
| 53 | + |
| 54 | +# IPPool agent su Deployment |
| 55 | + |
| 56 | +Questo documento descrive logica e modifiche introdotte per spostare l'agent IPPool |
| 57 | +da Pod singolo a Deployment, con riconciliazione di tipo operator e strategia |
| 58 | +RollingUpdate. |
| 59 | + |
| 60 | +## Obiettivo |
| 61 | +- Ogni IPPool crea e gestisce un Deployment dedicato (repliche=1). |
| 62 | +- Riconciliazione idempotente che crea o aggiorna il Deployment quando cambia la configurazione. |
| 63 | +- Upgrade immagine controllato dall'annotazione `network.harvesterhci.io/hold-ippool-agent-upgrade`. |
| 64 | +- Migrazione centrata sul nuovo riferimento di stato `agentDeploymentRef`. |
| 65 | + |
| 66 | +## Flusso di riconciliazione |
| 67 | +### DeployAgent |
| 68 | +- Recupera ClusterNetwork dalla NetworkAttachmentDefinition (label `network.harvesterhci.io/clusternetwork`). |
| 69 | +- Calcola l'immagine desiderata (rispetta l'annotazione di hold). |
| 70 | +- Costruisce il Deployment desiderato via `prepareAgentDeployment`. |
| 71 | +- Se `status.agentDeploymentRef` e valorizzato: |
| 72 | + - Verifica UID e che il Deployment non sia in deletion. |
| 73 | + - Richiede selector immutabile (errore se diverge). |
| 74 | + - Aggiorna labels, strategy, replicas, template e container se differiscono. |
| 75 | + - Aggiorna `agentDeploymentRef` con namespace/nome/UID. |
| 76 | +- Se il Deployment non esiste o lo status e vuoto, crea il Deployment e registra lo status. |
| 77 | + |
| 78 | +### MonitorAgent |
| 79 | +- Se `noAgent` e true, non fa nulla; se IPPool e in pausa, ritorna errore. |
| 80 | +- Verifica esistenza, UID e immagine del container rispetto allo status. |
| 81 | +- Verifica readiness usando `ObservedGeneration` e repliche `Updated/Available`. |
| 82 | +- In caso di mismatch o non readiness, ritorna errore (non cancella il Deployment). |
| 83 | + |
| 84 | +### Cleanup |
| 85 | +- Elimina il Deployment associato e pulisce IPAM/MAC/metriche. |
| 86 | +- Usato su pause o rimozione IPPool. |
| 87 | + |
| 88 | +## Dettagli implementativi |
| 89 | +- Nome Deployment derivato da `util.SafeAgentConcatName`. |
| 90 | +- Labels: `network.harvesterhci.io/vm-dhcp-controller=agent` + labels IPPool namespace/nome. |
| 91 | +- Pod template con annotazione Multus `k8s.v1.cni.cncf.io/networks`. |
| 92 | +- Init container `ip-setter` per configurare `eth1`; container `agent` con probes `/healthz` e `/readyz`. |
| 93 | +- Container defaults (ImagePullPolicy e TerminationMessage*) esplicitati per evitare reconcile loop. |
| 94 | +- Strategia RollingUpdate: `maxUnavailable=0`, `maxSurge=1`. |
| 95 | + |
| 96 | +## Cambiamenti di stato/CRD |
| 97 | +- `status.agentPodRef` sostituito da `status.agentDeploymentRef`. |
| 98 | +- Nuova struct `DeploymentReference` con namespace, name, image, UID. |
| 99 | +- CRD aggiornata e bindata rigenerata. |
| 100 | + |
| 101 | +## Watch e relazione risorse |
| 102 | +- Watch su Deployment con label `vm-dhcp-controller=agent`. |
| 103 | +- Mapping IPPool tramite label `ippool-namespace` e `ippool-name`. |
| 104 | + |
| 105 | +## RBAC |
| 106 | +- Aggiunti permessi `deployments` per controller (get/list/watch). |
| 107 | +- Role dedicato `*-deployment-manager` con create/update/delete. |
| 108 | +- Binding aggiornato da `manage-pods` a `manage-deployments`. |
| 109 | + |
| 110 | +## Codegen e generated |
| 111 | +- Aggiunto gruppo apps/v1 alla codegen per controller/cache Deployment. |
| 112 | +- Nuovi controller generati in `pkg/generated/controllers/apps`. |
| 113 | +- Nuovo fake client per Deployment in `pkg/util/fakeclient/deployment.go`. |
| 114 | + |
| 115 | +## Modifiche al codice (file principali) |
| 116 | +- `pkg/controller/ippool/controller.go`: DeployAgent/MonitorAgent/cleanup aggiornati per Deployment. |
| 117 | +- `pkg/controller/ippool/common.go`: `prepareAgentDeployment` e builder di supporto. |
| 118 | +- `pkg/apis/network.harvesterhci.io/v1alpha1/ippool.go`: nuovo status field e tipo reference. |
| 119 | +- `pkg/config/context.go`: AppsFactory aggiunta al bootstrap. |
| 120 | +- `pkg/codegen/main.go`: codegen apps/v1 e rigenerazione dei controller. |
| 121 | +- `chart/templates/rbac.yaml` e `chart/crds/network.harvesterhci.io_ippools.yaml`: RBAC/CRD aggiornate. |
| 122 | + |
| 123 | +## Compatibilita e migrazione |
| 124 | +- `status.agentPodRef` non e piu letto; eventuali Pod legacy non sono piu gestiti. |
| 125 | +- RollingUpdate con `maxSurge=1` puo generare un secondo agent temporaneo. |
| 126 | +- Se esiste un Deployment con selector differente, la reconcile fallisce per evitare adozioni errate. |
| 127 | + |
| 128 | +## Test |
| 129 | +- Eseguito `go test ./...`. |
0 commit comments