refactor config and nginx parsers

This commit is contained in:
2026-08-22 16:04:32 +08:00
parent a06771b708
commit 0102fa6ce9
3 changed files with 93 additions and 47 deletions
+59 -40
View File
@@ -212,16 +212,31 @@ func validateExactDocumentKeys(document []byte) error {
if err := toml.Unmarshal(document, &root); err != nil {
return err
}
if err := rejectUnknownKeys(root, "", "daemon", "backend", "nodeSsr"); err != nil {
if err := validateRootKeys(root); err != nil {
return err
}
if err := validateDaemonKeys(root); err != nil {
return err
}
if err := validateBackendKeys(root); err != nil {
return err
}
return validateOptionalNodeSsrKeys(root)
}
func validateRootKeys(root map[string]any) error {
return rejectUnknownKeys(root, "", "daemon", "backend", "nodeSsr")
}
func validateDaemonKeys(root map[string]any) error {
daemon, err := exactTable(root, "", "daemon")
if err != nil {
return err
}
if err := rejectUnknownKeys(daemon, "daemon", "environment"); err != nil {
return err
}
return rejectUnknownKeys(daemon, "daemon", "environment")
}
func validateBackendKeys(root map[string]any) error {
backend, err := exactTable(root, "", "backend")
if err != nil {
return err
@@ -233,18 +248,10 @@ func validateExactDocumentKeys(document []byte) error {
if err != nil {
return err
}
if err := rejectUnknownKeys(slots, "backend.slot", "8080", "8081"); err != nil {
return err
}
for _, port := range []string{"8080", "8081"} {
slot, err := exactTable(slots, "backend.slot", port)
if err != nil {
return err
}
if err := rejectUnknownKeys(slot, "backend.slot."+port, "unit", "jar", "container_name", "health_endpoint"); err != nil {
return err
}
}
return validateSlotKeys(slots, "backend.slot", []string{"8080", "8081"}, []string{"unit", "jar", "container_name", "health_endpoint"})
}
func validateOptionalNodeSsrKeys(root map[string]any) error {
nodeSsrValue, found := root["nodeSsr"]
if !found {
return nil
@@ -263,15 +270,19 @@ func validateExactDocumentKeys(document []byte) error {
if err != nil {
return err
}
if err := rejectUnknownKeys(nodeSlots, "nodeSsr.slot", "18910", "28910"); err != nil {
return validateSlotKeys(nodeSlots, "nodeSsr.slot", []string{"18910", "28910"}, []string{"container_name", "health_endpoint"})
}
func validateSlotKeys(slots map[string]any, parent string, ports []string, allowed []string) error {
if err := rejectUnknownKeys(slots, parent, ports...); err != nil {
return err
}
for _, port := range []string{"18910", "28910"} {
slot, err := exactTable(nodeSlots, "nodeSsr.slot", port)
for _, port := range ports {
slot, err := exactTable(slots, parent, port)
if err != nil {
return err
}
if err := rejectUnknownKeys(slot, "nodeSsr.slot."+port, "container_name", "health_endpoint"); err != nil {
if err := rejectUnknownKeys(slot, parent+"."+port, allowed...); err != nil {
return err
}
}
@@ -343,33 +354,41 @@ func validateBackend(backend Backend) error {
}
switch backend.Type {
case BackendTypeNative:
if backend.Slot.Port8080.ContainerName != "" || backend.Slot.Port8081.ContainerName != "" {
return errors.New("native backend slots do not accept container_name")
}
if backend.ReleaseDir != nativeReleaseDir {
return fmt.Errorf("backend.release_dir must be %q", nativeReleaseDir)
}
if backend.ActiveJAR != nativeActiveJAR {
return fmt.Errorf("backend.active_jar must be %q", nativeActiveJAR)
}
return validateNativeBackendSlots(backend.Slot)
return validateNativeBackend(backend)
case BackendTypeContainer:
if backend.ReleaseDir != "" || backend.ActiveJAR != "" {
return errors.New("container backend does not accept release_dir or active_jar")
}
if backend.Slot.Port8080.Unit != "" || backend.Slot.Port8080.JAR != "" || backend.Slot.Port8081.Unit != "" || backend.Slot.Port8081.JAR != "" {
return errors.New("container backend slots do not accept unit or jar")
}
if err := validateContainerSlot("backend.slot.8080", backend.Slot.Port8080, containerName8080, nativeHealthURL8080); err != nil {
return err
}
return validateContainerSlot("backend.slot.8081", backend.Slot.Port8081, containerName8081, nativeHealthURL8081)
return validateContainerBackend(backend)
default:
return fmt.Errorf("backend.type must be %q or %q", BackendTypeNative, BackendTypeContainer)
}
}
func validateNativeBackend(backend Backend) error {
if backend.Slot.Port8080.ContainerName != "" || backend.Slot.Port8081.ContainerName != "" {
return errors.New("native backend slots do not accept container_name")
}
if backend.ReleaseDir != nativeReleaseDir {
return fmt.Errorf("backend.release_dir must be %q", nativeReleaseDir)
}
if backend.ActiveJAR != nativeActiveJAR {
return fmt.Errorf("backend.active_jar must be %q", nativeActiveJAR)
}
return validateNativeBackendSlots(backend.Slot)
}
func validateContainerBackend(backend Backend) error {
if backend.ReleaseDir != "" || backend.ActiveJAR != "" {
return errors.New("container backend does not accept release_dir or active_jar")
}
if backend.Slot.Port8080.Unit != "" || backend.Slot.Port8080.JAR != "" || backend.Slot.Port8081.Unit != "" || backend.Slot.Port8081.JAR != "" {
return errors.New("container backend slots do not accept unit or jar")
}
if err := validateContainerSlot("backend.slot.8080", backend.Slot.Port8080, containerName8080, nativeHealthURL8080); err != nil {
return err
}
return validateContainerSlot("backend.slot.8081", backend.Slot.Port8081, containerName8081, nativeHealthURL8081)
}
func validateNativeBackendSlots(slots BackendSlots) error {
if err := validateNativeSlot("backend.slot.8080", slots.Port8080, nativeUnit8080, nativeSlotJAR8080, nativeHealthURL8080); err != nil {
return err