providers/ionoscloud/ionoscloud_service.go (211 lines of code) (raw):
// Copyright 2019 The Terraformer Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package ionoscloud
import (
"fmt"
"log"
"net"
"net/http"
"os"
"runtime"
"time"
"github.com/GoogleCloudPlatform/terraformer/providers/ionoscloud/helpers"
"github.com/GoogleCloudPlatform/terraformer/terraformutils"
certificateManager "github.com/ionos-cloud/sdk-go-cert-manager"
containerRegistry "github.com/ionos-cloud/sdk-go-container-registry"
dataPlatform "github.com/ionos-cloud/sdk-go-dataplatform"
dbaasMongo "github.com/ionos-cloud/sdk-go-dbaas-mongo"
dbaasPgSQL "github.com/ionos-cloud/sdk-go-dbaas-postgres"
dns "github.com/ionos-cloud/sdk-go-dns"
logging "github.com/ionos-cloud/sdk-go-logging"
ionoscloud "github.com/ionos-cloud/sdk-go/v6"
)
type Service struct {
terraformutils.Service
}
type Bundle struct {
CloudAPIClient *ionoscloud.APIClient
DBaaSPgSQLApiClient *dbaasPgSQL.APIClient
DBaaSMongoAPIClient *dbaasMongo.APIClient
CertificateManagerAPIClient *certificateManager.APIClient
ContainerRegistryAPIClient *containerRegistry.APIClient
DataPlatformAPIClient *dataPlatform.APIClient
DNSAPIClient *dns.APIClient
LoggingAPIClient *logging.APIClient
}
type clientType int
const (
ionosClient clientType = iota
dbaasPgSQLClient
dbaasMongoClient
certificateManagerClient
containerRegistryClient
dataPlatformClient
dnsClient
loggingClient
)
func (s *Service) generateClient() *Bundle {
username := s.Args[helpers.UsernameArg].(string)
password := s.Args[helpers.PasswordArg].(string)
token := s.Args[helpers.TokenArg].(string)
url := s.Args[helpers.URLArg].(string)
cleanedURL := cleanURL(url)
newConfig := ionoscloud.NewConfiguration(username, password, token, cleanedURL)
if os.Getenv(helpers.IonosDebug) != "" {
newConfig.Debug = true
}
newConfig.MaxRetries = helpers.MaxRetries
newConfig.WaitTime = helpers.MaxWaitTime
clients := map[clientType]interface{}{
ionosClient: NewClientByType(username, password, token, cleanedURL, ionosClient),
dbaasPgSQLClient: NewClientByType(username, password, token, cleanedURL, dbaasPgSQLClient),
dbaasMongoClient: NewClientByType(username, password, token, cleanedURL, dbaasMongoClient),
certificateManagerClient: NewClientByType(username, password, token, cleanedURL, certificateManagerClient),
containerRegistryClient: NewClientByType(username, password, token, cleanedURL, containerRegistryClient),
dataPlatformClient: NewClientByType(username, password, token, cleanedURL, dataPlatformClient),
dnsClient: NewClientByType(username, password, token, cleanedURL, dnsClient),
loggingClient: NewClientByType(username, password, token, cleanedURL, loggingClient),
}
return &Bundle{
CloudAPIClient: clients[ionosClient].(*ionoscloud.APIClient),
DBaaSPgSQLApiClient: clients[dbaasPgSQLClient].(*dbaasPgSQL.APIClient),
DBaaSMongoAPIClient: clients[dbaasMongoClient].(*dbaasMongo.APIClient),
CertificateManagerAPIClient: clients[certificateManagerClient].(*certificateManager.APIClient),
ContainerRegistryAPIClient: clients[containerRegistryClient].(*containerRegistry.APIClient),
DataPlatformAPIClient: clients[dataPlatformClient].(*dataPlatform.APIClient),
DNSAPIClient: clients[dnsClient].(*dns.APIClient),
LoggingAPIClient: clients[loggingClient].(*logging.APIClient),
}
}
func NewClientByType(username, password, token, url string, clientType clientType) interface{} {
switch clientType {
case ionosClient:
{
newConfig := ionoscloud.NewConfiguration(username, password, token, url)
if os.Getenv(helpers.IonosDebug) != "" {
newConfig.Debug = true
}
newConfig.MaxRetries = helpers.MaxRetries
newConfig.WaitTime = helpers.MaxWaitTime
newConfig.HTTPClient = &http.Client{Transport: CreateTransport()}
newConfig.UserAgent = fmt.Sprintf(
"terraformer_ionos-cloud-sdk-go/%s_os/%s_arch/%s", ionoscloud.Version, runtime.GOOS, runtime.GOARCH)
return ionoscloud.NewAPIClient(newConfig)
}
case dbaasPgSQLClient:
{
newConfig := dbaasPgSQL.NewConfiguration(username, password, token, url)
if os.Getenv(helpers.IonosDebug) != "" {
newConfig.Debug = true
}
newConfig.MaxRetries = helpers.MaxRetries
newConfig.WaitTime = helpers.MaxWaitTime
newConfig.HTTPClient = &http.Client{Transport: CreateTransport()}
newConfig.UserAgent = fmt.Sprintf(
"terraformer_ionos-cloud-sdk-go-dbaas-postgres/%s_os/%s_arch/%s", dbaasPgSQL.Version, runtime.GOOS, runtime.GOARCH)
return dbaasPgSQL.NewAPIClient(newConfig)
}
case dbaasMongoClient:
{
newConfig := dbaasMongo.NewConfiguration(username, password, token, url)
if os.Getenv(helpers.IonosDebug) != "" {
newConfig.Debug = true
}
newConfig.MaxRetries = helpers.MaxRetries
newConfig.WaitTime = helpers.MaxWaitTime
newConfig.HTTPClient = &http.Client{Transport: CreateTransport()}
newConfig.UserAgent = fmt.Sprintf(
"terraformer_ionos-cloud-sdk-go-dbaas-mongo/%s_os/%s_arch/%s", dbaasMongo.Version, runtime.GOOS, runtime.GOARCH)
return dbaasMongo.NewAPIClient(newConfig)
}
case certificateManagerClient:
{
newConfig := certificateManager.NewConfiguration(username, password, token, url)
if os.Getenv(helpers.IonosDebug) != "" {
newConfig.Debug = true
}
newConfig.MaxRetries = helpers.MaxRetries
newConfig.WaitTime = helpers.MaxWaitTime
newConfig.HTTPClient = &http.Client{Transport: CreateTransport()}
newConfig.UserAgent = fmt.Sprintf(
"terraformer_ionos-cloud-sdk-go-cert-manager/%s_os/%s_arch/%s", certificateManager.Version, runtime.GOOS, runtime.GOARCH)
return certificateManager.NewAPIClient(newConfig)
}
case containerRegistryClient:
{
newConfig := containerRegistry.NewConfiguration(username, password, token, url)
if os.Getenv(helpers.IonosDebug) != "" {
newConfig.Debug = true
}
newConfig.MaxRetries = helpers.MaxRetries
newConfig.WaitTime = helpers.MaxWaitTime
newConfig.HTTPClient = &http.Client{Transport: CreateTransport()}
newConfig.UserAgent = fmt.Sprintf(
"terraformer_ionos-cloud-sdk-go-container-registry/%s_os/%s_arch/%s", containerRegistry.Version, runtime.GOOS, runtime.GOARCH)
return containerRegistry.NewAPIClient(newConfig)
}
case dataPlatformClient:
{
newConfig := dataPlatform.NewConfiguration(username, password, token, url)
if os.Getenv(helpers.IonosDebug) != "" {
newConfig.Debug = true
}
newConfig.MaxRetries = helpers.MaxRetries
newConfig.WaitTime = helpers.MaxWaitTime
newConfig.HTTPClient = &http.Client{Transport: CreateTransport()}
newConfig.UserAgent = fmt.Sprintf(
"terraformer_ionos-cloud-sdk-go-dataplatform/%s_os/%s_arch/%s", dataPlatform.Version, runtime.GOOS, runtime.GOARCH)
return dataPlatform.NewAPIClient(newConfig)
}
case dnsClient:
{
newConfig := dns.NewConfiguration(username, password, token, url)
if os.Getenv(helpers.IonosDebug) != "" {
newConfig.Debug = true
}
newConfig.MaxRetries = helpers.MaxRetries
newConfig.WaitTime = helpers.MaxWaitTime
newConfig.HTTPClient = &http.Client{Transport: CreateTransport()}
newConfig.UserAgent = fmt.Sprintf(
"terraformer_ionos-cloud-sdk-go-dns/%s_os/%s_arch/%s", dns.Version, runtime.GOOS, runtime.GOARCH)
return dns.NewAPIClient(newConfig)
}
case loggingClient:
{
newConfig := logging.NewConfiguration(username, password, token, url)
if os.Getenv(helpers.IonosDebug) != "" {
newConfig.Debug = true
}
newConfig.MaxRetries = helpers.MaxRetries
newConfig.WaitTime = helpers.MaxWaitTime
newConfig.HTTPClient = &http.Client{Transport: CreateTransport()}
newConfig.UserAgent = fmt.Sprintf(
"terraformer_ionos-cloud-sdk-go-logging/%s_os/%s_arch/%s", logging.Version, runtime.GOOS, runtime.GOARCH)
return logging.NewAPIClient(newConfig)
}
default:
log.Printf("[ERROR] unknown client type %d", clientType)
}
return nil
}
// cleanURL makes sure trailing slash does not corrupt the state
func cleanURL(url string) string {
length := len(url)
if length > 1 && url[length-1] == '/' {
url = url[:length-1]
}
return url
}
func CreateTransport() *http.Transport {
dialer := &net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}
return &http.Transport{
Proxy: http.ProxyFromEnvironment,
DialContext: dialer.DialContext,
DisableKeepAlives: true,
IdleConnTimeout: 30 * time.Second,
TLSHandshakeTimeout: 15 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
MaxIdleConnsPerHost: 3,
MaxConnsPerHost: 3,
}
}