packer-cn/vendor/github.com/hetznercloud/hcloud-go/hcloud/schema.go

409 lines
10 KiB
Go
Executable File

package hcloud
import (
"net"
"github.com/hetznercloud/hcloud-go/hcloud/schema"
)
// This file provides converter functions to convert models in the
// schema package to models in the hcloud package.
// ActionFromSchema converts a schema.Action to an Action.
func ActionFromSchema(s schema.Action) *Action {
action := &Action{
ID: s.ID,
Status: ActionStatus(s.Status),
Command: s.Command,
Progress: s.Progress,
Started: s.Started,
Resources: []*ActionResource{},
}
if s.Finished != nil {
action.Finished = *s.Finished
}
if s.Error != nil {
action.ErrorCode = s.Error.Code
action.ErrorMessage = s.Error.Message
}
for _, r := range s.Resources {
action.Resources = append(action.Resources, &ActionResource{
ID: r.ID,
Type: ActionResourceType(r.Type),
})
}
return action
}
// ActionsFromSchema converts a slice of schema.Action to a slice of Action.
func ActionsFromSchema(s []schema.Action) []*Action {
var actions []*Action
for _, a := range s {
actions = append(actions, ActionFromSchema(a))
}
return actions
}
// FloatingIPFromSchema converts a schema.FloatingIP to a FloatingIP.
func FloatingIPFromSchema(s schema.FloatingIP) *FloatingIP {
f := &FloatingIP{
ID: s.ID,
Type: FloatingIPType(s.Type),
HomeLocation: LocationFromSchema(s.HomeLocation),
Blocked: s.Blocked,
Protection: FloatingIPProtection{
Delete: s.Protection.Delete,
},
}
if s.Description != nil {
f.Description = *s.Description
}
if s.Server != nil {
f.Server = &Server{ID: *s.Server}
}
if f.Type == FloatingIPTypeIPv4 {
f.IP = net.ParseIP(s.IP)
} else {
f.IP, f.Network, _ = net.ParseCIDR(s.IP)
}
f.DNSPtr = map[string]string{}
for _, entry := range s.DNSPtr {
f.DNSPtr[entry.IP] = entry.DNSPtr
}
f.Labels = map[string]string{}
for key, value := range s.Labels {
f.Labels[key] = value
}
return f
}
// ISOFromSchema converts a schema.ISO to an ISO.
func ISOFromSchema(s schema.ISO) *ISO {
return &ISO{
ID: s.ID,
Name: s.Name,
Description: s.Description,
Type: ISOType(s.Type),
Deprecated: s.Deprecated,
}
}
// LocationFromSchema converts a schema.Location to a Location.
func LocationFromSchema(s schema.Location) *Location {
return &Location{
ID: s.ID,
Name: s.Name,
Description: s.Description,
Country: s.Country,
City: s.City,
Latitude: s.Latitude,
Longitude: s.Longitude,
}
}
// DatacenterFromSchema converts a schema.Datacenter to a Datacenter.
func DatacenterFromSchema(s schema.Datacenter) *Datacenter {
d := &Datacenter{
ID: s.ID,
Name: s.Name,
Description: s.Description,
Location: LocationFromSchema(s.Location),
ServerTypes: DatacenterServerTypes{
Available: []*ServerType{},
Supported: []*ServerType{},
},
}
for _, t := range s.ServerTypes.Available {
d.ServerTypes.Available = append(d.ServerTypes.Available, &ServerType{ID: t})
}
for _, t := range s.ServerTypes.Supported {
d.ServerTypes.Supported = append(d.ServerTypes.Supported, &ServerType{ID: t})
}
return d
}
// ServerFromSchema converts a schema.Server to a Server.
func ServerFromSchema(s schema.Server) *Server {
server := &Server{
ID: s.ID,
Name: s.Name,
Status: ServerStatus(s.Status),
Created: s.Created,
PublicNet: ServerPublicNetFromSchema(s.PublicNet),
ServerType: ServerTypeFromSchema(s.ServerType),
IncludedTraffic: s.IncludedTraffic,
RescueEnabled: s.RescueEnabled,
Datacenter: DatacenterFromSchema(s.Datacenter),
Locked: s.Locked,
Protection: ServerProtection{
Delete: s.Protection.Delete,
Rebuild: s.Protection.Rebuild,
},
}
if s.Image != nil {
server.Image = ImageFromSchema(*s.Image)
}
if s.BackupWindow != nil {
server.BackupWindow = *s.BackupWindow
}
if s.OutgoingTraffic != nil {
server.OutgoingTraffic = *s.OutgoingTraffic
}
if s.IngoingTraffic != nil {
server.IngoingTraffic = *s.IngoingTraffic
}
if s.ISO != nil {
server.ISO = ISOFromSchema(*s.ISO)
}
server.Labels = map[string]string{}
for key, value := range s.Labels {
server.Labels[key] = value
}
for _, id := range s.Volumes {
server.Volumes = append(server.Volumes, &Volume{ID: id})
}
return server
}
// ServerPublicNetFromSchema converts a schema.ServerPublicNet to a ServerPublicNet.
func ServerPublicNetFromSchema(s schema.ServerPublicNet) ServerPublicNet {
publicNet := ServerPublicNet{
IPv4: ServerPublicNetIPv4FromSchema(s.IPv4),
IPv6: ServerPublicNetIPv6FromSchema(s.IPv6),
}
for _, id := range s.FloatingIPs {
publicNet.FloatingIPs = append(publicNet.FloatingIPs, &FloatingIP{ID: id})
}
return publicNet
}
// ServerPublicNetIPv4FromSchema converts a schema.ServerPublicNetIPv4 to
// a ServerPublicNetIPv4.
func ServerPublicNetIPv4FromSchema(s schema.ServerPublicNetIPv4) ServerPublicNetIPv4 {
return ServerPublicNetIPv4{
IP: net.ParseIP(s.IP),
Blocked: s.Blocked,
DNSPtr: s.DNSPtr,
}
}
// ServerPublicNetIPv6FromSchema converts a schema.ServerPublicNetIPv6 to
// a ServerPublicNetIPv6.
func ServerPublicNetIPv6FromSchema(s schema.ServerPublicNetIPv6) ServerPublicNetIPv6 {
ipv6 := ServerPublicNetIPv6{
Blocked: s.Blocked,
DNSPtr: map[string]string{},
}
ipv6.IP, ipv6.Network, _ = net.ParseCIDR(s.IP)
for _, dnsPtr := range s.DNSPtr {
ipv6.DNSPtr[dnsPtr.IP] = dnsPtr.DNSPtr
}
return ipv6
}
// ServerTypeFromSchema converts a schema.ServerType to a ServerType.
func ServerTypeFromSchema(s schema.ServerType) *ServerType {
st := &ServerType{
ID: s.ID,
Name: s.Name,
Description: s.Description,
Cores: s.Cores,
Memory: s.Memory,
Disk: s.Disk,
StorageType: StorageType(s.StorageType),
CPUType: CPUType(s.CPUType),
}
for _, price := range s.Prices {
st.Pricings = append(st.Pricings, ServerTypeLocationPricing{
Location: &Location{Name: price.Location},
Hourly: Price{
Net: price.PriceHourly.Net,
Gross: price.PriceHourly.Gross,
},
Monthly: Price{
Net: price.PriceMonthly.Net,
Gross: price.PriceMonthly.Gross,
},
})
}
return st
}
// SSHKeyFromSchema converts a schema.SSHKey to a SSHKey.
func SSHKeyFromSchema(s schema.SSHKey) *SSHKey {
sshKey := &SSHKey{
ID: s.ID,
Name: s.Name,
Fingerprint: s.Fingerprint,
PublicKey: s.PublicKey,
}
sshKey.Labels = map[string]string{}
for key, value := range s.Labels {
sshKey.Labels[key] = value
}
return sshKey
}
// ImageFromSchema converts a schema.Image to an Image.
func ImageFromSchema(s schema.Image) *Image {
i := &Image{
ID: s.ID,
Type: ImageType(s.Type),
Status: ImageStatus(s.Status),
Description: s.Description,
DiskSize: s.DiskSize,
Created: s.Created,
RapidDeploy: s.RapidDeploy,
OSFlavor: s.OSFlavor,
Protection: ImageProtection{
Delete: s.Protection.Delete,
},
Deprecated: s.Deprecated,
}
if s.Name != nil {
i.Name = *s.Name
}
if s.ImageSize != nil {
i.ImageSize = *s.ImageSize
}
if s.OSVersion != nil {
i.OSVersion = *s.OSVersion
}
if s.CreatedFrom != nil {
i.CreatedFrom = &Server{
ID: s.CreatedFrom.ID,
Name: s.CreatedFrom.Name,
}
}
if s.BoundTo != nil {
i.BoundTo = &Server{
ID: *s.BoundTo,
}
}
i.Labels = map[string]string{}
for key, value := range s.Labels {
i.Labels[key] = value
}
return i
}
// VolumeFromSchema converts a schema.Volume to a Volume.
func VolumeFromSchema(s schema.Volume) *Volume {
v := &Volume{
ID: s.ID,
Name: s.Name,
Location: LocationFromSchema(s.Location),
Size: s.Size,
LinuxDevice: s.LinuxDevice,
Protection: VolumeProtection{
Delete: s.Protection.Delete,
},
Created: s.Created,
}
if s.Server != nil {
v.Server = &Server{ID: *s.Server}
}
v.Labels = map[string]string{}
for key, value := range s.Labels {
v.Labels[key] = value
}
return v
}
// PaginationFromSchema converts a schema.MetaPagination to a Pagination.
func PaginationFromSchema(s schema.MetaPagination) Pagination {
return Pagination{
Page: s.Page,
PerPage: s.PerPage,
PreviousPage: s.PreviousPage,
NextPage: s.NextPage,
LastPage: s.LastPage,
TotalEntries: s.TotalEntries,
}
}
// ErrorFromSchema converts a schema.Error to an Error.
func ErrorFromSchema(s schema.Error) Error {
e := Error{
Code: ErrorCode(s.Code),
Message: s.Message,
}
switch d := s.Details.(type) {
case schema.ErrorDetailsInvalidInput:
details := ErrorDetailsInvalidInput{
Fields: []ErrorDetailsInvalidInputField{},
}
for _, field := range d.Fields {
details.Fields = append(details.Fields, ErrorDetailsInvalidInputField{
Name: field.Name,
Messages: field.Messages,
})
}
e.Details = details
}
return e
}
// PricingFromSchema converts a schema.Pricing to a Pricing.
func PricingFromSchema(s schema.Pricing) Pricing {
p := Pricing{
Image: ImagePricing{
PerGBMonth: Price{
Currency: s.Currency,
VATRate: s.VATRate,
Net: s.Image.PricePerGBMonth.Net,
Gross: s.Image.PricePerGBMonth.Gross,
},
},
FloatingIP: FloatingIPPricing{
Monthly: Price{
Currency: s.Currency,
VATRate: s.VATRate,
Net: s.FloatingIP.PriceMonthly.Net,
Gross: s.FloatingIP.PriceMonthly.Gross,
},
},
Traffic: TrafficPricing{
PerTB: Price{
Currency: s.Currency,
VATRate: s.VATRate,
Net: s.Traffic.PricePerTB.Net,
Gross: s.Traffic.PricePerTB.Gross,
},
},
ServerBackup: ServerBackupPricing{
Percentage: s.ServerBackup.Percentage,
},
}
for _, serverType := range s.ServerTypes {
var pricings []ServerTypeLocationPricing
for _, price := range serverType.Prices {
pricings = append(pricings, ServerTypeLocationPricing{
Location: &Location{Name: price.Location},
Hourly: Price{
Currency: s.Currency,
VATRate: s.VATRate,
Net: price.PriceHourly.Net,
Gross: price.PriceHourly.Gross,
},
Monthly: Price{
Currency: s.Currency,
VATRate: s.VATRate,
Net: price.PriceMonthly.Net,
Gross: price.PriceMonthly.Gross,
},
})
}
p.ServerTypes = append(p.ServerTypes, ServerTypePricing{
ServerType: &ServerType{
ID: serverType.ID,
Name: serverType.Name,
},
Pricings: pricings,
})
}
return p
}