feat: P0-1e expand handleConfigPush with host config and cluster dispatch
Wires the remaining cluster_config_t data into the notification pipeline: - dispatchConfigPush() extracted as a pure-Go helper (CGO-free, testable) that drives OnQueueUpdated, OnResourceUpdated, OnHostConfigUpdated, and OnClusterUpdated from a single config push event - handleConfigPush() delegates to dispatchConfigPush via the new helper, eliminating the previous inline loops - OnHostConfigUpdated and OnClusterUpdated added to NotificationHandler interface and implemented with partial-merge semantics in DefaultHandler - rawHostConfigData/rawHostConfigToModel and rawClusterData/rawClusterToModel added to convert_pure.go with their CGO extraction counterparts in convert.go Safety fixes from code review: - OnHostUpdated, OnHostConfigUpdated, OnClusterUpdated now copy *incoming to a local merged value before mutation, closing the TOCTOU window between store.Get and store.Put under concurrent pushes - cClusterConfQueues and cClusterConfResources gain nil-pointer guards matching the existing guard in cClusterConfHostConfigs - handleConfigPush gains an explicit gHandler nil check - cClusterConfToClusterInfo returns nil on empty clustername (prevents phantom empty-key write to store.Clusters); handleConfigPush logs a warning when nil - 36 unit tests passing (CGO_ENABLED=0)
This commit is contained in:
parent
00c4472d6c
commit
893812e7aa
8 changed files with 850 additions and 11 deletions
|
|
@ -231,3 +231,53 @@ func rawResourceToModel(r rawResourceData) *models.ResourceDefinitionInfo {
|
|||
Interval: r.interval,
|
||||
}
|
||||
}
|
||||
|
||||
// rawHostConfigData mirrors the C xce_hostconfig_t fields used by the Go model.
|
||||
// Only fields that map to models.HostInfo are included:
|
||||
// - name → HostName, hostmodel → HostModel, hosttype → HostType, mxj → MaxSlot
|
||||
//
|
||||
// resources (xce_config_t**) and thresholds (xce_res_threshold_t**) have no HostInfo field and are excluded.
|
||||
// dispatchwindow (xce_timewindow_config_t*) is deferred — DisptWindow is left as empty string.
|
||||
type rawHostConfigData struct {
|
||||
name string
|
||||
hostmodel string
|
||||
hosttype string
|
||||
mxj int
|
||||
}
|
||||
|
||||
// rawHostConfigToModel maps a rawHostConfigData to a models.HostInfo.
|
||||
// Config-sourced fields only; worker-sourced fields remain zero.
|
||||
func rawHostConfigToModel(r rawHostConfigData) *models.HostInfo {
|
||||
return &models.HostInfo{
|
||||
HostName: r.name,
|
||||
HostModel: r.hostmodel,
|
||||
HostType: r.hosttype,
|
||||
MaxSlot: r.mxj,
|
||||
// TODO(dispatchwindow): xce_hostconfig_t.dispatchwindow is xce_timewindow_config_t*
|
||||
// (nsegs int + segs[] with open/close time fields). Serializing it requires a Go
|
||||
// mirror struct and json.Marshal. Deferred: no API endpoint currently consumes
|
||||
// DisptWindow. Implement when /xce/v1/hosts returns dispatch window data.
|
||||
}
|
||||
}
|
||||
|
||||
// rawClusterData mirrors the C cluster_config_t fields used by the Go model.
|
||||
// Only config-sourced fields are included (heartbeat_interval, vcpus, inactive_heartbeat_count).
|
||||
// Built-in/sourced fields (Version, Status, ControllerName, etc.) come from LoadBuiltinData
|
||||
// and are not part of the config push conversion.
|
||||
type rawClusterData struct {
|
||||
name string
|
||||
heartbeatInterval int
|
||||
vcpus int
|
||||
inactiveHeartbeatCount int
|
||||
}
|
||||
|
||||
// rawClusterToModel maps a rawClusterData to a models.ClusterInfo.
|
||||
// Config-sourced fields only; built-in fields remain zero.
|
||||
func rawClusterToModel(r rawClusterData) *models.ClusterInfo {
|
||||
return &models.ClusterInfo{
|
||||
ClusterName: r.name,
|
||||
HeartbeatInterval: r.heartbeatInterval,
|
||||
Vcpus: r.vcpus,
|
||||
InactiveHeartbeatCount: r.inactiveHeartbeatCount,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue