providers/ionoscloud/server.go (94 lines of code) (raw):

package ionoscloud import ( "context" "log" "github.com/GoogleCloudPlatform/terraformer/providers/ionoscloud/helpers" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ionoscloud "github.com/ionos-cloud/sdk-go/v6" ) type ServerGenerator struct { Service } func (g *ServerGenerator) InitResources() error { client := g.generateClient() cloudAPIClient := client.CloudAPIClient datacenters, err := helpers.GetAllDatacenters(*cloudAPIClient) if err != nil { return err } for _, datacenter := range datacenters { servers, _, err := cloudAPIClient.ServersApi.DatacentersServersGet(context.TODO(), *datacenter.Id).Depth(4).Execute() if err != nil { return err } if servers.Items == nil { log.Printf( "[WARNING] expected a response containing servers but received 'nil' instead, skipping search for datacenter with ID: %v.\n", *datacenter.Id) continue } serversToAdd := *servers.Items for _, server := range serversToAdd { if !isServerValid(server, *datacenter.Id) { continue } _, apiResponse, err := cloudAPIClient.LabelsApi.DatacentersServersLabelsFindByKey(context.TODO(), *datacenter.Id, *server.Id, "managedexternally").Execute() if err != nil { if !apiResponse.HttpNotFound() { return err } } else { // The server is managed externally(eg : k8s nodepool). // This means we do not want to write the server to the tf plan. continue } resourceType := getServerResourceType(*server.Properties.Type) if resourceType == "" { log.Printf("[WARNING] unknown server type: %v for server with ID: %v, skipping this server", *server.Properties.Type, *server.Id) continue } g.Resources = append(g.Resources, terraformutils.NewResource( *server.Id, *server.Properties.Name+"-"+*server.Id, resourceType, helpers.Ionos, map[string]string{helpers.DcID: *datacenter.Id}, []string{}, map[string]interface{}{})) } } return nil } // isServerValid skips servers that would not create a valid tf plan. func isServerValid(server ionoscloud.Server, datacenterID string) bool { if server.Properties == nil || server.Properties.Name == nil { log.Printf( "[WARNING] 'nil' values in the response for server with ID %v, datacenter ID: %v, skipping this resource.\n", *server.Id, datacenterID, ) return false } if server.Entities.Nics == nil || len(*server.Entities.Nics.Items) == 0 { log.Printf("Server %s, datacenter ID: %v contains no nics, moving on", *server.Id, datacenterID) return false } if server.Entities.Volumes == nil || len(*server.Entities.Volumes.Items) == 0 { log.Printf("Server %s, datacenter ID: %v contains no volumes, moving on", *server.Id, datacenterID) return false } if server.Properties.BootVolume == nil { log.Printf("Server %s, datacenter ID: %v contains no boot volume, moving on", *server.Id, datacenterID) return false } return true } func getServerResourceType(serverType string) string { resourceType := "" switch serverType { case "ENTERPRISE": resourceType = "ionoscloud_server" case "CUBE": resourceType = "ionoscloud_cube_server" case "VCPU": resourceType = "ionoscloud_vcpu_server" } return resourceType }