@ -14,12 +14,12 @@ import (
"sync"
"sync"
"time"
"time"
"github.com/google/go-querystring/query"
"repository.basistech.ru/BASIS/decort-golang-sdk/config"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi"
k8s_ca "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/k8s"
k8s_ca "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/k8s"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker"
k8s_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/k8s"
k8s_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/k8s"
"github.com/google/go-querystring/query"
"repository.basistech.ru/BASIS/decort-golang-sdk/config"
)
)
// HTTP-client for platform
// HTTP-client for platform
@ -73,398 +73,338 @@ func (dc *DecortClient) CloudBroker() *cloudbroker.CloudBroker {
func ( dc * DecortClient ) DecortApiCall ( ctx context . Context , method , url string , params interface { } ) ( [ ] byte , error ) {
func ( dc * DecortClient ) DecortApiCall ( ctx context . Context , method , url string , params interface { } ) ( [ ] byte , error ) {
k8sCaCreateReq , okCa := params . ( k8s_ca . CreateRequest )
k8sCaCreateReq , okCa := params . ( k8s_ca . CreateRequest )
k8sCbCreateReq , okCb := params . ( k8s_cb . CreateRequest )
k8sCbCreateReq , okCb := params . ( k8s_cb . CreateRequest )
var body * bytes . Buffer
var ctype string
if okCa {
if okCa {
body , ctype = createK8sCloudApi ( k8sCaCreateReq )
} else if okCb {
body , ctype = createK8sCloudBroker ( k8sCbCreateReq )
} else {
values , err := query . Values ( params )
if err != nil {
return nil , err
}
body = bytes . NewBufferString ( values . Encode ( ) )
}
req , err := http . NewRequestWithContext ( ctx , method , dc . decortURL + "/restmachine" + url , body )
if err != nil {
return nil , err
}
if err = dc . getToken ( ctx ) ; err != nil {
return nil , err
}
resp , err := dc . do ( req , ctype )
if err != nil {
return nil , err
}
defer resp . Body . Close ( )
respBytes , err := io . ReadAll ( resp . Body )
if err != nil {
return nil , err
}
if resp . StatusCode != 200 {
return nil , errors . New ( string ( respBytes ) )
}
return respBytes , nil
}
func ( dc * DecortClient ) getToken ( ctx context . Context ) error {
dc . mutex . Lock ( )
defer dc . mutex . Unlock ( )
if dc . cfg . Token == "" || time . Now ( ) . After ( dc . expiryTime ) {
body := fmt . Sprintf ( "grant_type=client_credentials&client_id=%s&client_secret=%s&response_type=id_token" , dc . cfg . AppID , dc . cfg . AppSecret )
bodyReader := strings . NewReader ( body )
dc . cfg . SSOURL = strings . TrimSuffix ( dc . cfg . SSOURL , "/" )
req , _ := http . NewRequestWithContext ( ctx , "POST" , dc . cfg . SSOURL + "/v1/oauth/access_token" , bodyReader )
req . Header . Add ( "Content-Type" , "application/x-www-form-urlencoded" )
resp , err := dc . client . Do ( req )
if err != nil {
return fmt . Errorf ( "cannot get token: %w" , err )
}
tokenBytes , _ := io . ReadAll ( resp . Body )
resp . Body . Close ( )
if resp . StatusCode != 200 {
return fmt . Errorf ( "cannot get token: %s" , tokenBytes )
}
token := string ( tokenBytes )
dc . cfg . Token = token
dc . expiryTime = time . Now ( ) . AddDate ( 0 , 0 , 1 )
}
return nil
}
func ( dc * DecortClient ) do ( req * http . Request , ctype string ) ( * http . Response , error ) {
if ctype != "" {
req . Header . Add ( "Content-Type" , ctype )
} else {
req . Header . Add ( "Content-Type" , "application/x-www-form-urlencoded" )
}
req . Header . Add ( "Authorization" , "bearer " + dc . cfg . Token )
req . Header . Set ( "Accept" , "application/json" )
// var resp *http.Response
// var err error
buf , _ := io . ReadAll ( req . Body )
// req = req.Clone(req.Context())
// for i := uint64(0); i < dc.cfg.Retries; i++ {
req . Body = io . NopCloser ( bytes . NewBuffer ( buf ) )
resp , err := dc . client . Do ( req )
// if err == nil {
if resp . StatusCode == 200 {
return resp , err
}
respBytes , _ := io . ReadAll ( resp . Body )
err = fmt . Errorf ( "%s" , respBytes )
resp . Body . Close ( )
// }
// }
return nil , fmt . Errorf ( "could not execute request: %w" , err )
}
func createK8sCloudApi ( req k8s_ca . CreateRequest ) ( * bytes . Buffer , string ) {
reqBody := & bytes . Buffer { }
reqBody := & bytes . Buffer { }
writer := multipart . NewWriter ( reqBody )
writer := multipart . NewWriter ( reqBody )
if k8sCaCreateReq . OidcCertificate != "" {
if req. OidcCertificate != "" {
part , _ := writer . CreateFormFile ( "oidcCertificate" , "ca.crt" )
part , _ := writer . CreateFormFile ( "oidcCertificate" , "ca.crt" )
_ , _ = io . Copy ( part , strings . NewReader ( k8sCaCreateReq . OidcCertificate ) )
_ , _ = io . Copy ( part , strings . NewReader ( req. OidcCertificate ) )
}
}
_ = writer . WriteField ( "name" , k8sCaCreateReq . Name )
_ = writer . WriteField ( "name" , req. Name )
_ = writer . WriteField ( "rgId" , strconv . FormatUint ( k8sCaCreateReq . RGID , 10 ) )
_ = writer . WriteField ( "rgId" , strconv . FormatUint ( req. RGID , 10 ) )
_ = writer . WriteField ( "k8ciId" , strconv . FormatUint ( k8sCaCreateReq . K8SCIID , 10 ) )
_ = writer . WriteField ( "k8ciId" , strconv . FormatUint ( req. K8SCIID , 10 ) )
_ = writer . WriteField ( "workerGroupName" , k8sCaCreateReq . WorkerGroupName )
_ = writer . WriteField ( "workerGroupName" , req. WorkerGroupName )
_ = writer . WriteField ( "networkPlugin" , k8sCaCreateReq . NetworkPlugin )
_ = writer . WriteField ( "networkPlugin" , req. NetworkPlugin )
if k8sCaCreateReq . MasterSEPID != 0 {
if req. MasterSEPID != 0 {
_ = writer . WriteField ( "masterSepId" , strconv . FormatUint ( k8sCaCreateReq . MasterSEPID , 10 ) )
_ = writer . WriteField ( "masterSepId" , strconv . FormatUint ( req. MasterSEPID , 10 ) )
}
}
if k8sCaCreateReq . MasterSEPPool != "" {
if req. MasterSEPPool != "" {
_ = writer . WriteField ( "masterSepPool" , k8sCaCreateReq . MasterSEPPool )
_ = writer . WriteField ( "masterSepPool" , req. MasterSEPPool )
}
}
if k8sCaCreateReq . WorkerSEPID != 0 {
if req. WorkerSEPID != 0 {
_ = writer . WriteField ( "workerSepId" , strconv . FormatUint ( k8sCaCreateReq . WorkerSEPID , 10 ) )
_ = writer . WriteField ( "workerSepId" , strconv . FormatUint ( req. WorkerSEPID , 10 ) )
}
}
if k8sCaCreateReq . WorkerSEPPool != "" {
if req. WorkerSEPPool != "" {
_ = writer . WriteField ( "workerSepPool" , k8sCaCreateReq . WorkerSEPPool )
_ = writer . WriteField ( "workerSepPool" , req. WorkerSEPPool )
}
}
if k8sCaCreateReq . Labels != nil {
if req. Labels != nil {
for _ , v := range k8sCaCreateReq . Labels {
for _ , v := range req. Labels {
_ = writer . WriteField ( "labels" , v )
_ = writer . WriteField ( "labels" , v )
}
}
}
}
if k8sCaCreateReq . Taints != nil {
if req. Taints != nil {
for _ , v := range k8sCaCreateReq . Taints {
for _ , v := range req. Taints {
_ = writer . WriteField ( "taints" , v )
_ = writer . WriteField ( "taints" , v )
}
}
}
}
if k8sCaCreateReq . Annotations != nil {
if req. Annotations != nil {
for _ , v := range k8sCaCreateReq . Annotations {
for _ , v := range req. Annotations {
_ = writer . WriteField ( "annotations" , v )
_ = writer . WriteField ( "annotations" , v )
}
}
}
}
if k8sCaCreateReq . MasterCPU != 0 {
if req. MasterCPU != 0 {
_ = writer . WriteField ( "masterCpu" , strconv . FormatUint ( uint64 ( k8sCaCreateReq . MasterCPU ) , 10 ) )
_ = writer . WriteField ( "masterCpu" , strconv . FormatUint ( uint64 ( req. MasterCPU ) , 10 ) )
}
}
if k8sCaCreateReq . MasterNum != 0 {
if req. MasterNum != 0 {
_ = writer . WriteField ( "masterNum" , strconv . FormatUint ( uint64 ( k8sCaCreateReq . MasterNum ) , 10 ) )
_ = writer . WriteField ( "masterNum" , strconv . FormatUint ( uint64 ( req. MasterNum ) , 10 ) )
}
}
if k8sCaCreateReq . MasterRAM != 0 {
if req. MasterRAM != 0 {
_ = writer . WriteField ( "masterRam" , strconv . FormatUint ( uint64 ( k8sCaCreateReq . MasterRAM ) , 10 ) )
_ = writer . WriteField ( "masterRam" , strconv . FormatUint ( uint64 ( req. MasterRAM ) , 10 ) )
}
}
if k8sCaCreateReq . MasterDisk != 0 {
if req. MasterDisk != 0 {
_ = writer . WriteField ( "masterDisk" , strconv . FormatUint ( uint64 ( k8sCaCreateReq . MasterDisk ) , 10 ) )
_ = writer . WriteField ( "masterDisk" , strconv . FormatUint ( uint64 ( req. MasterDisk ) , 10 ) )
}
}
if k8sCaCreateReq . WorkerCPU != 0 {
if req. WorkerCPU != 0 {
_ = writer . WriteField ( "workerCpu" , strconv . FormatUint ( uint64 ( k8sCaCreateReq . WorkerCPU ) , 10 ) )
_ = writer . WriteField ( "workerCpu" , strconv . FormatUint ( uint64 ( req. WorkerCPU ) , 10 ) )
}
}
if k8sCaCreateReq . WorkerNum != 0 {
if req. WorkerNum != 0 {
_ = writer . WriteField ( "workerNum" , strconv . FormatUint ( uint64 ( k8sCaCreateReq . WorkerNum ) , 10 ) )
_ = writer . WriteField ( "workerNum" , strconv . FormatUint ( uint64 ( req. WorkerNum ) , 10 ) )
}
}
if k8sCaCreateReq . WorkerRAM != 0 {
if req. WorkerRAM != 0 {
_ = writer . WriteField ( "workerRam" , strconv . FormatUint ( uint64 ( k8sCaCreateReq . WorkerRAM ) , 10 ) )
_ = writer . WriteField ( "workerRam" , strconv . FormatUint ( uint64 ( req. WorkerRAM ) , 10 ) )
}
}
if k8sCaCreateReq . WorkerDisk != 0 {
if req. WorkerDisk != 0 {
_ = writer . WriteField ( "workerDisk" , strconv . FormatUint ( uint64 ( k8sCaCreateReq . WorkerDisk ) , 10 ) )
_ = writer . WriteField ( "workerDisk" , strconv . FormatUint ( uint64 ( req. WorkerDisk ) , 10 ) )
}
}
if k8sCaCreateReq . ExtNetID != 0 {
if req. ExtNetID != 0 {
_ = writer . WriteField ( "extnetId" , strconv . FormatUint ( k8sCaCreateReq . ExtNetID , 10 ) )
_ = writer . WriteField ( "extnetId" , strconv . FormatUint ( req. ExtNetID , 10 ) )
}
}
if k8sCaCreateReq . VinsId != 0 {
if req. VinsId != 0 {
_ = writer . WriteField ( "vinsId" , strconv . FormatUint ( k8sCaCreateReq . VinsId , 10 ) )
_ = writer . WriteField ( "vinsId" , strconv . FormatUint ( req. VinsId , 10 ) )
}
}
if ! k8sCaCreateReq . WithLB {
if ! req. WithLB {
_ = writer . WriteField ( "withLB" , strconv . FormatBool ( k8sCaCreateReq . WithLB ) )
_ = writer . WriteField ( "withLB" , strconv . FormatBool ( req. WithLB ) )
}
}
_ = writer . WriteField ( "highlyAvailableLB" , strconv . FormatBool ( k8sCaCreateReq . HighlyAvailable ) )
_ = writer . WriteField ( "highlyAvailableLB" , strconv . FormatBool ( req. HighlyAvailable ) )
if k8sCaCreateReq . AdditionalSANs != nil {
if req. AdditionalSANs != nil {
for _ , v := range k8sCaCreateReq . AdditionalSANs {
for _ , v := range req. AdditionalSANs {
_ = writer . WriteField ( "additionalSANs" , v )
_ = writer . WriteField ( "additionalSANs" , v )
}
}
}
}
if k8sCaCreateReq . InitConfiguration != "" {
if req. InitConfiguration != "" {
_ = writer . WriteField ( "initConfiguration" , k8sCaCreateReq . InitConfiguration )
_ = writer . WriteField ( "initConfiguration" , req. InitConfiguration )
}
}
if k8sCaCreateReq . ClusterConfiguration != "" {
if req. ClusterConfiguration != "" {
_ = writer . WriteField ( "clusterConfiguration" , k8sCaCreateReq . ClusterConfiguration )
_ = writer . WriteField ( "clusterConfiguration" , req. ClusterConfiguration )
}
}
if k8sCaCreateReq . KubeletConfiguration != "" {
if req. KubeletConfiguration != "" {
_ = writer . WriteField ( "kubeletConfiguration" , k8sCaCreateReq . KubeletConfiguration )
_ = writer . WriteField ( "kubeletConfiguration" , req. KubeletConfiguration )
}
}
if k8sCaCreateReq . KubeProxyConfiguration != "" {
if req. KubeProxyConfiguration != "" {
_ = writer . WriteField ( "kubeProxyConfiguration" , k8sCaCreateReq . KubeProxyConfiguration )
_ = writer . WriteField ( "kubeProxyConfiguration" , req. KubeProxyConfiguration )
}
}
if k8sCaCreateReq . JoinConfiguration != "" {
if req. JoinConfiguration != "" {
_ = writer . WriteField ( "joinConfiguration" , k8sCaCreateReq . JoinConfiguration )
_ = writer . WriteField ( "joinConfiguration" , req. JoinConfiguration )
}
}
if k8sCaCreateReq . Description != "" {
if req. Description != "" {
_ = writer . WriteField ( "desc" , k8sCaCreateReq . Description )
_ = writer . WriteField ( "desc" , req. Description )
}
}
if k8sCaCreateReq . UserData != "" {
if req. UserData != "" {
_ = writer . WriteField ( "userData" , k8sCaCreateReq . UserData )
_ = writer . WriteField ( "userData" , req. UserData )
}
}
_ = writer . WriteField ( "extnetOnly" , strconv . FormatBool ( k8sCaCreateReq . ExtNetOnly ) )
_ = writer . WriteField ( "extnetOnly" , strconv . FormatBool ( req . ExtNetOnly ) )
_ = writer . FormDataContentType ( )
ct := writer . FormDataContentType ( )
ct := writer . FormDataContentType ( )
writer . Close ( )
writer . Close ( )
req , err := http . NewRequestWithContext ( ctx , method , dc . decortURL + "/restmachine" + url , reqBody )
if err != nil {
return nil , err
}
if err = dc . getToken ( ctx ) ; err != nil {
return nil , err
}
resp , err := dc . domp ( req , ct )
if err != nil {
return nil , err
}
defer resp . Body . Close ( )
respBytes , err := io . ReadAll ( resp . Body )
if err != nil {
return nil , err
}
if resp . StatusCode != 200 {
return reqBody , ct
return nil , errors . New ( string ( respBytes ) )
}
}
return respBytes , nil
func createK8sCloudBroker ( req k8s_cb . CreateRequest ) ( * bytes . Buffer , string ) {
} else if okCb {
reqBody := & bytes . Buffer { }
reqBody := & bytes . Buffer { }
writer := multipart . NewWriter ( reqBody )
writer := multipart . NewWriter ( reqBody )
if k8sCbC reateR eq. OidcCertificate != "" {
if req . OidcCertificate != "" {
part , _ := writer . CreateFormFile ( "oidcCertificate" , "ca.crt" )
part , _ := writer . CreateFormFile ( "oidcCertificate" , "ca.crt" )
_ , _ = io . Copy ( part , strings . NewReader ( k8sCbC reateR eq. OidcCertificate ) )
_ , _ = io . Copy ( part , strings . NewReader ( req . OidcCertificate ) )
}
}
_ = writer . WriteField ( "name" , k8sCbC reateR eq. Name )
_ = writer . WriteField ( "name" , req . Name )
_ = writer . WriteField ( "rgId" , strconv . FormatUint ( k8sCbC reateR eq. RGID , 10 ) )
_ = writer . WriteField ( "rgId" , strconv . FormatUint ( req . RGID , 10 ) )
_ = writer . WriteField ( "k8ciId" , strconv . FormatUint ( k8sCbC reateR eq. K8CIID , 10 ) )
_ = writer . WriteField ( "k8ciId" , strconv . FormatUint ( req . K8CIID , 10 ) )
_ = writer . WriteField ( "workerGroupName" , k8sCbC reateR eq. WorkerGroupName )
_ = writer . WriteField ( "workerGroupName" , req . WorkerGroupName )
_ = writer . WriteField ( "networkPlugin" , k8sCbC reateR eq. NetworkPlugin )
_ = writer . WriteField ( "networkPlugin" , req . NetworkPlugin )
if k8sCbC reateR eq. MasterSEPID != 0 {
if req. MasterSEPID != 0 {
_ = writer . WriteField ( "masterSepId" , strconv . FormatUint ( k8sCbC reateR eq. MasterSEPID , 10 ) )
_ = writer . WriteField ( "masterSepId" , strconv . FormatUint ( req. MasterSEPID , 10 ) )
}
}
if k8sCbC reateR eq. MasterSEPPool != "" {
if req. MasterSEPPool != "" {
_ = writer . WriteField ( "masterSepPool" , k8sCbC reateR eq. MasterSEPPool )
_ = writer . WriteField ( "masterSepPool" , req. MasterSEPPool )
}
}
if k8sCbC reateR eq. WorkerSEPID != 0 {
if req. WorkerSEPID != 0 {
_ = writer . WriteField ( "workerSepId" , strconv . FormatUint ( k8sCbC reateR eq. WorkerSEPID , 10 ) )
_ = writer . WriteField ( "workerSepId" , strconv . FormatUint ( req. WorkerSEPID , 10 ) )
}
}
if k8sCbC reateR eq. WorkerSEPPool != "" {
if req. WorkerSEPPool != "" {
_ = writer . WriteField ( "workerSepPool" , k8sCbC reateR eq. WorkerSEPPool )
_ = writer . WriteField ( "workerSepPool" , req. WorkerSEPPool )
}
}
if k8sCbC reateR eq. Labels != nil {
if req. Labels != nil {
for _ , v := range k8sCbC reateR eq. Labels {
for _ , v := range req. Labels {
_ = writer . WriteField ( "labels" , v )
_ = writer . WriteField ( "labels" , v )
}
}
}
}
if k8sCbC reateR eq. Taints != nil {
if req. Taints != nil {
for _ , v := range k8sCbC reateR eq. Taints {
for _ , v := range req. Taints {
_ = writer . WriteField ( "taints" , v )
_ = writer . WriteField ( "taints" , v )
}
}
}
}
if k8sCbC reateR eq. Annotations != nil {
if req. Annotations != nil {
for _ , v := range k8sCbC reateR eq. Annotations {
for _ , v := range req. Annotations {
_ = writer . WriteField ( "annotations" , v )
_ = writer . WriteField ( "annotations" , v )
}
}
}
}
if k8sCbC reateR eq. MasterCPU != 0 {
if req. MasterCPU != 0 {
_ = writer . WriteField ( "masterCpu" , strconv . FormatUint ( k8sCbC reateR eq. MasterCPU , 10 ) )
_ = writer . WriteField ( "masterCpu" , strconv . FormatUint ( req. MasterCPU , 10 ) )
}
}
if k8sCbC reateR eq. MasterNum != 0 {
if req. MasterNum != 0 {
_ = writer . WriteField ( "masterNum" , strconv . FormatUint ( k8sCbC reateR eq. MasterNum , 10 ) )
_ = writer . WriteField ( "masterNum" , strconv . FormatUint ( req. MasterNum , 10 ) )
}
}
if k8sCbC reateR eq. MasterRAM != 0 {
if req. MasterRAM != 0 {
_ = writer . WriteField ( "masterRam" , strconv . FormatUint ( k8sCbC reateR eq. MasterRAM , 10 ) )
_ = writer . WriteField ( "masterRam" , strconv . FormatUint ( req. MasterRAM , 10 ) )
}
}
if k8sCbC reateR eq. MasterDisk != 0 {
if req. MasterDisk != 0 {
_ = writer . WriteField ( "masterDisk" , strconv . FormatUint ( k8sCbC reateR eq. MasterDisk , 10 ) )
_ = writer . WriteField ( "masterDisk" , strconv . FormatUint ( req. MasterDisk , 10 ) )
}
}
if k8sCbC reateR eq. WorkerCPU != 0 {
if req. WorkerCPU != 0 {
_ = writer . WriteField ( "workerCpu" , strconv . FormatUint ( k8sCbC reateR eq. WorkerCPU , 10 ) )
_ = writer . WriteField ( "workerCpu" , strconv . FormatUint ( req. WorkerCPU , 10 ) )
}
}
if k8sCbC reateR eq. WorkerNum != 0 {
if req. WorkerNum != 0 {
_ = writer . WriteField ( "workerNum" , strconv . FormatUint ( k8sCbC reateR eq. WorkerNum , 10 ) )
_ = writer . WriteField ( "workerNum" , strconv . FormatUint ( req. WorkerNum , 10 ) )
}
}
if k8sCbC reateR eq. WorkerRAM != 0 {
if req. WorkerRAM != 0 {
_ = writer . WriteField ( "workerRam" , strconv . FormatUint ( k8sCbC reateR eq. WorkerRAM , 10 ) )
_ = writer . WriteField ( "workerRam" , strconv . FormatUint ( req. WorkerRAM , 10 ) )
}
}
if k8sCbC reateR eq. WorkerDisk != 0 {
if req. WorkerDisk != 0 {
_ = writer . WriteField ( "workerDisk" , strconv . FormatUint ( k8sCbC reateR eq. WorkerDisk , 10 ) )
_ = writer . WriteField ( "workerDisk" , strconv . FormatUint ( req. WorkerDisk , 10 ) )
}
}
if k8sCbC reateR eq. ExtNetID != 0 {
if req. ExtNetID != 0 {
_ = writer . WriteField ( "extnetId" , strconv . FormatUint ( k8sCbC reateR eq. ExtNetID , 10 ) )
_ = writer . WriteField ( "extnetId" , strconv . FormatUint ( req. ExtNetID , 10 ) )
}
}
if k8sCbC reateR eq. VinsId != 0 {
if req. VinsId != 0 {
_ = writer . WriteField ( "vinsId" , strconv . FormatUint ( k8sCbC reateR eq. VinsId , 10 ) )
_ = writer . WriteField ( "vinsId" , strconv . FormatUint ( req. VinsId , 10 ) )
}
}
if ! k8sCbC reateR eq. WithLB {
if ! req. WithLB {
_ = writer . WriteField ( "withLB" , strconv . FormatBool ( k8sCbC reateR eq. WithLB ) )
_ = writer . WriteField ( "withLB" , strconv . FormatBool ( req. WithLB ) )
}
}
_ = writer . WriteField ( "highlyAvailableLB" , strconv . FormatBool ( k8sCbC reateR eq. HighlyAvailable ) )
_ = writer . WriteField ( "highlyAvailableLB" , strconv . FormatBool ( req. HighlyAvailable ) )
if k8sCbC reateR eq. AdditionalSANs != nil {
if req. AdditionalSANs != nil {
for _ , v := range k8sCbC reateR eq. AdditionalSANs {
for _ , v := range req. AdditionalSANs {
_ = writer . WriteField ( "additionalSANs" , v )
_ = writer . WriteField ( "additionalSANs" , v )
}
}
}
}
if k8sCbC reateR eq. InitConfiguration != "" {
if req. InitConfiguration != "" {
_ = writer . WriteField ( "initConfiguration" , k8sCbC reateR eq. InitConfiguration )
_ = writer . WriteField ( "initConfiguration" , req. InitConfiguration )
}
}
if k8sCbC reateR eq. ClusterConfiguration != "" {
if req. ClusterConfiguration != "" {
_ = writer . WriteField ( "clusterConfiguration" , k8sCbC reateR eq. ClusterConfiguration )
_ = writer . WriteField ( "clusterConfiguration" , req. ClusterConfiguration )
}
}
if k8sCbC reateR eq. KubeletConfiguration != "" {
if req. KubeletConfiguration != "" {
_ = writer . WriteField ( "kubeletConfiguration" , k8sCbC reateR eq. KubeletConfiguration )
_ = writer . WriteField ( "kubeletConfiguration" , req. KubeletConfiguration )
}
}
if k8sCbC reateR eq. KubeProxyConfiguration != "" {
if req. KubeProxyConfiguration != "" {
_ = writer . WriteField ( "kubeProxyConfiguration" , k8sCbC reateR eq. KubeProxyConfiguration )
_ = writer . WriteField ( "kubeProxyConfiguration" , req. KubeProxyConfiguration )
}
}
if k8sCbC reateR eq. JoinConfiguration != "" {
if req. JoinConfiguration != "" {
_ = writer . WriteField ( "joinConfiguration" , k8sCbC reateR eq. JoinConfiguration )
_ = writer . WriteField ( "joinConfiguration" , req. JoinConfiguration )
}
}
if k8sCbC reateR eq. Description != "" {
if req. Description != "" {
_ = writer . WriteField ( "desc" , k8sCbC reateR eq. Description )
_ = writer . WriteField ( "desc" , req. Description )
}
}
if k8sCbC reateR eq. UserData != "" {
if req. UserData != "" {
_ = writer . WriteField ( "userData" , k8sCbC reateR eq. UserData )
_ = writer . WriteField ( "userData" , req. UserData )
}
}
_ = writer . WriteField ( "extnetOnly" , strconv . FormatBool ( k8sCbCreateReq . ExtNetOnly ) )
_ = writer . WriteField ( "extnetOnly" , strconv . FormatBool ( req . ExtNetOnly ) )
_ = writer . FormDataContentType ( )
ct := writer . FormDataContentType ( )
ct := writer . FormDataContentType ( )
writer . Close ( )
writer . Close ( )
req , err := http . NewRequestWithContext ( ctx , method , dc . decortURL + "/restmachine" + url , reqBody )
return reqBody , ct
if err != nil {
return nil , err
}
if err = dc . getToken ( ctx ) ; err != nil {
return nil , err
}
resp , err := dc . domp ( req , ct )
if err != nil {
return nil , err
}
defer resp . Body . Close ( )
respBytes , err := io . ReadAll ( resp . Body )
if err != nil {
return nil , err
}
if resp . StatusCode != 200 {
return nil , errors . New ( string ( respBytes ) )
}
return respBytes , nil
}
values , err := query . Values ( params )
if err != nil {
return nil , err
}
body := strings . NewReader ( values . Encode ( ) )
req , err := http . NewRequestWithContext ( ctx , method , dc . decortURL + "/restmachine" + url , body )
if err != nil {
return nil , err
}
if err = dc . getToken ( ctx ) ; err != nil {
return nil , err
}
resp , err := dc . do ( req )
if err != nil {
return nil , err
}
defer resp . Body . Close ( )
respBytes , err := io . ReadAll ( resp . Body )
if err != nil {
return nil , err
}
if resp . StatusCode != 200 {
return nil , errors . New ( string ( respBytes ) )
}
return respBytes , nil
}
func ( dc * DecortClient ) getToken ( ctx context . Context ) error {
dc . mutex . Lock ( )
defer dc . mutex . Unlock ( )
if dc . cfg . Token == "" || time . Now ( ) . After ( dc . expiryTime ) {
body := fmt . Sprintf ( "grant_type=client_credentials&client_id=%s&client_secret=%s&response_type=id_token" , dc . cfg . AppID , dc . cfg . AppSecret )
bodyReader := strings . NewReader ( body )
dc . cfg . SSOURL = strings . TrimSuffix ( dc . cfg . SSOURL , "/" )
req , _ := http . NewRequestWithContext ( ctx , "POST" , dc . cfg . SSOURL + "/v1/oauth/access_token" , bodyReader )
req . Header . Add ( "Content-Type" , "application/x-www-form-urlencoded" )
resp , err := dc . client . Do ( req )
if err != nil {
return fmt . Errorf ( "cannot get token: %w" , err )
}
tokenBytes , _ := io . ReadAll ( resp . Body )
resp . Body . Close ( )
if resp . StatusCode != 200 {
return fmt . Errorf ( "cannot get token: %s" , tokenBytes )
}
token := string ( tokenBytes )
dc . cfg . Token = token
dc . expiryTime = time . Now ( ) . AddDate ( 0 , 0 , 1 )
}
return nil
}
func ( dc * DecortClient ) do ( req * http . Request ) ( * http . Response , error ) {
req . Header . Add ( "Content-Type" , "application/x-www-form-urlencoded" )
req . Header . Add ( "Authorization" , "bearer " + dc . cfg . Token )
req . Header . Set ( "Accept" , "application/json" )
// var resp *http.Response
// var err error
buf , _ := io . ReadAll ( req . Body )
// req = req.Clone(req.Context())
// for i := uint64(0); i < dc.cfg.Retries; i++ {
req . Body = io . NopCloser ( bytes . NewBuffer ( buf ) )
resp , err := dc . client . Do ( req )
// if err == nil {
if resp . StatusCode == 200 {
return resp , err
}
respBytes , _ := io . ReadAll ( resp . Body )
err = fmt . Errorf ( "%s" , respBytes )
resp . Body . Close ( )
// }
// }
return nil , fmt . Errorf ( "could not execute request: %w" , err )
}
func ( dc * DecortClient ) domp ( req * http . Request , ctype string ) ( * http . Response , error ) {
req . Header . Add ( "Content-Type" , ctype )
req . Header . Add ( "Authorization" , "bearer " + dc . cfg . Token )
req . Header . Set ( "Accept" , "application/json" )
// var resp *http.Response
// var err error
buf , _ := io . ReadAll ( req . Body )
// req = req.Clone(req.Context())
// for i := uint64(0); i < dc.cfg.Retries; i++ {
req . Body = io . NopCloser ( bytes . NewBuffer ( buf ) )
resp , err := dc . client . Do ( req )
// if err == nil {
if resp . StatusCode == 200 {
return resp , err
}
respBytes , _ := io . ReadAll ( resp . Body )
err = fmt . Errorf ( "%s" , respBytes )
resp . Body . Close ( )
// }
// }
return nil , fmt . Errorf ( "could not execute request: %w" , err )
}
}