From fe4519232f99de70a2e10a34ad3aeac73c07e80c Mon Sep 17 00:00:00 2001 From: Simon Mayer Date: Thu, 17 Oct 2024 13:42:39 +0200 Subject: [PATCH] Use new struct for DNS and NTP servers --- cmd/metal-api/internal/metal/machine.go | 16 ++++++++-- .../internal/service/machine-service.go | 12 +++---- cmd/metal-api/internal/service/v1/machine.go | 8 ++--- spec/metal-api.json | 32 +++++++++++++++---- 4 files changed, 50 insertions(+), 18 deletions(-) diff --git a/cmd/metal-api/internal/metal/machine.go b/cmd/metal-api/internal/metal/machine.go index 86597355..083d3cf1 100644 --- a/cmd/metal-api/internal/metal/machine.go +++ b/cmd/metal-api/internal/metal/machine.go @@ -153,8 +153,8 @@ type MachineAllocation struct { VPN *MachineVPN `rethinkdb:"vpn" json:"vpn"` UUID string `rethinkdb:"uuid" json:"uuid"` FirewallRules *FirewallRules `rethinkdb:"firewall_rules" json:"firewall_rules"` - DNSServers []string `rethinkdb:"dns_servers" json:"dns_servers"` - NTPServers []string `rethinkdb:"ntp_servers" json:"ntp_servers"` + DNSServers DNSServers `rethinkdb:"dns_servers" json:"dns_servers"` + NTPServers NTPServers `rethinkdb:"ntp_servers" json:"ntp_servers"` } type FirewallRules struct { @@ -177,6 +177,18 @@ type IngressRule struct { Comment string `rethinkdb:"comment" json:"comment"` } +type DNSServers []DNSServer + +type DNSServer struct { + IP string `rethinkdb:"ip" json:"ip"` +} + +type NTPServers []NTPServer + +type NTPServer struct { + Address string `address:"address" json:"address"` +} + type Protocol string const ( diff --git a/cmd/metal-api/internal/service/machine-service.go b/cmd/metal-api/internal/service/machine-service.go index 4c85c96a..8cb5c73b 100644 --- a/cmd/metal-api/internal/service/machine-service.go +++ b/cmd/metal-api/internal/service/machine-service.go @@ -80,8 +80,8 @@ type machineAllocationSpec struct { PlacementTags []string EgressRules []metal.EgressRule IngressRules []metal.IngressRule - DNSServers []string - NTPServers []string + DNSServers metal.DNSServers + NTPServers metal.NTPServers } // allocationNetwork is intermediate struct to create machine networks from regular networks during machine allocation @@ -1151,7 +1151,7 @@ func createMachineAllocationSpec(ds *datastore.RethinkStore, machineRequest v1.M return nil, errors.New("please specify a maximum of three dns servers") } for _, dnsip := range machineRequest.DNSServers { - _, err := netip.ParseAddr(dnsip) + _, err := netip.ParseAddr(dnsip.IP) if err != nil { return nil, fmt.Errorf("IP: %s for DNS server not correct err: %w", dnsip, err) } @@ -1161,13 +1161,13 @@ func createMachineAllocationSpec(ds *datastore.RethinkStore, machineRequest v1.M return nil, errors.New("please specify a minimum of 3 and a maximum of 5 ntp servers") } for _, ntpserver := range machineRequest.NTPServers { - if net.ParseIP(ntpserver) != nil { - _, err := netip.ParseAddr(ntpserver) + if net.ParseIP(ntpserver.Address) != nil { + _, err := netip.ParseAddr(ntpserver.Address) if err != nil { return nil, fmt.Errorf("IP: %s for NTP server not correct err: %w", ntpserver, err) } } else { - if !govalidator.IsDNSName(ntpserver) { + if !govalidator.IsDNSName(ntpserver.Address) { return nil, fmt.Errorf("DNS name: %s for NTP server not correct err: %w", ntpserver, err) } } diff --git a/cmd/metal-api/internal/service/v1/machine.go b/cmd/metal-api/internal/service/v1/machine.go index 07de84cd..4d83a375 100644 --- a/cmd/metal-api/internal/service/v1/machine.go +++ b/cmd/metal-api/internal/service/v1/machine.go @@ -45,8 +45,8 @@ type MachineAllocation struct { VPN *MachineVPN `json:"vpn" description:"vpn connection info for machine" optional:"true"` AllocationUUID string `json:"allocationuuid" description:"a unique identifier for this machine allocation, can be used to distinguish between machine allocations over time."` FirewallRules *FirewallRules `json:"firewall_rules,omitempty" description:"a set of firewall rules to apply" optional:"true"` - DNSServers []string `json:"dns_servers,omitempty" description:"the dns servers used for the machine" optional:"true"` - NTPServers []string `json:"ntp_servers,omitempty" description:"the ntp servers used for the machine" optional:"true"` + DNSServers metal.DNSServers `json:"dns_servers,omitempty" description:"the dns servers used for the machine" optional:"true"` + NTPServers metal.NTPServers `json:"ntp_servers,omitempty" description:"the ntp servers used for the machine" optional:"true"` } type FirewallRules struct { @@ -231,8 +231,8 @@ type MachineAllocateRequest struct { Networks MachineAllocationNetworks `json:"networks" description:"the networks that this machine will be placed in." optional:"true"` IPs []string `json:"ips" description:"the ips to attach to this machine additionally" optional:"true"` PlacementTags []string `json:"placement_tags,omitempty" description:"by default machines are spread across the racks inside a partition for every project. if placement tags are provided, the machine candidate has an additional anti-affinity to other machines having the same tags"` - DNSServers []string `json:"dns_servers,omitempty" description:"the dns servers used for the machine" optional:"true"` - NTPServers []string `json:"ntp_servers,omitempty" description:"the ntp servers used for the machine" optional:"true"` + DNSServers metal.DNSServers `json:"dns_servers,omitempty" description:"the dns servers used for the machine" optional:"true"` + NTPServers metal.NTPServers `json:"ntp_servers,omitempty" description:"the ntp servers used for the machine" optional:"true"` } type MachineAllocationNetworks []MachineAllocationNetwork diff --git a/spec/metal-api.json b/spec/metal-api.json index d1485386..577dad30 100644 --- a/spec/metal-api.json +++ b/spec/metal-api.json @@ -348,6 +348,26 @@ "type": "HTTPErrorResponse" } }, + "metal.DNSServer": { + "properties": { + "ip": { + "type": "string" + } + }, + "required": [ + "ip" + ] + }, + "metal.NTPServer": { + "properties": { + "address": { + "type": "string" + } + }, + "required": [ + "address" + ] + }, "rest.HealthResponse": { "properties": { "message": { @@ -1012,7 +1032,7 @@ "dns_servers": { "description": "the dns servers used for the machine", "items": { - "type": "string" + "$ref": "#/definitions/metal.DNSServer" }, "type": "array" }, @@ -1053,7 +1073,7 @@ "ntp_servers": { "description": "the ntp servers used for the machine", "items": { - "type": "string" + "$ref": "#/definitions/metal.NTPServer" }, "type": "array" }, @@ -2001,7 +2021,7 @@ "dns_servers": { "description": "the dns servers used for the machine", "items": { - "type": "string" + "$ref": "#/definitions/metal.DNSServer" }, "type": "array" }, @@ -2038,7 +2058,7 @@ "ntp_servers": { "description": "the ntp servers used for the machine", "items": { - "type": "string" + "$ref": "#/definitions/metal.NTPServer" }, "type": "array" }, @@ -2118,7 +2138,7 @@ "dns_servers": { "description": "the dns servers used for the machine", "items": { - "type": "string" + "$ref": "#/definitions/metal.DNSServer" }, "type": "array" }, @@ -2153,7 +2173,7 @@ "ntp_servers": { "description": "the ntp servers used for the machine", "items": { - "type": "string" + "$ref": "#/definitions/metal.NTPServer" }, "type": "array" },