@@ -15,13 +15,116 @@ import (
1515 "github.com/hashicorp/go-retryablehttp"
1616 "github.com/hashicorp/terraform-plugin-sdk/v2/helper/logging"
1717 v5okta "github.com/okta/okta-sdk-golang/v5/okta"
18+ v6okta "github.com/okta/okta-sdk-golang/v6/okta"
1819 "github.com/okta/terraform-provider-okta/okta/internal/apimutex"
1920 "github.com/okta/terraform-provider-okta/okta/internal/transport"
2021 "github.com/okta/terraform-provider-okta/okta/utils"
2122 "github.com/okta/terraform-provider-okta/okta/version"
2223 "github.com/okta/terraform-provider-okta/sdk"
2324)
2425
26+ func getV6ClientConfig (c * OktaAPIConfig ) (* v6okta.Configuration , * v6okta.APIClient , error ) {
27+ var httpClient * http.Client
28+ if c .Backoff {
29+ retryableClient := retryablehttp .NewClient ()
30+ retryableClient .RetryWaitMin = time .Second * time .Duration (c .MinWait )
31+ retryableClient .RetryWaitMax = time .Second * time .Duration (c .MaxWait )
32+ retryableClient .RetryMax = c .RetryCount
33+ retryableClient .Logger = c .Logger
34+ retryableClient .HTTPClient .Transport = logging .NewSubsystemLoggingHTTPTransport ("Okta" , retryableClient .HTTPClient .Transport )
35+ retryableClient .ErrorHandler = errHandler
36+ retryableClient .CheckRetry = checkRetry
37+ httpClient = retryableClient .StandardClient ()
38+ c .Logger .Info (fmt .Sprintf ("v6 running with backoff http client, wait min %d, wait max %d, retry max %d" , retryableClient .RetryWaitMin , retryableClient .RetryWaitMax , retryableClient .RetryMax ))
39+ } else {
40+ httpClient = cleanhttp .DefaultClient ()
41+ httpClient .Transport = logging .NewSubsystemLoggingHTTPTransport ("Okta" , httpClient .Transport )
42+ c .Logger .Info ("v6 running with default http client" )
43+ }
44+
45+ // adds transport governor to retryable or default client
46+ if c .MaxAPICapacity > 0 && c .MaxAPICapacity < 100 {
47+ c .Logger .Info (fmt .Sprintf ("v6 running with experimental max_api_capacity configuration at %d%%" , c .MaxAPICapacity ))
48+ apiMutex , err := apimutex .NewAPIMutex (c .MaxAPICapacity )
49+ if err != nil {
50+ return nil , nil , err
51+ }
52+ httpClient .Transport = transport .NewGovernedTransport (httpClient .Transport , apiMutex , c .Logger )
53+ }
54+ var orgURL string
55+ var disableHTTPS bool
56+ if c .HttpProxy != "" {
57+ orgURL = strings .TrimSuffix (c .HttpProxy , "/" )
58+ disableHTTPS = strings .HasPrefix (orgURL , "http://" )
59+ } else {
60+ orgURL = fmt .Sprintf ("https://%v.%v" , c .OrgName , c .Domain )
61+ }
62+ _ , err := url .Parse (orgURL )
63+ if err != nil {
64+ return nil , nil , fmt .Errorf ("malformed Okta API URL (org_name+base_url value, or http_proxy value): %+v" , err )
65+ }
66+
67+ setters := []v6okta.ConfigSetter {
68+ v6okta .WithOrgUrl (orgURL ),
69+ v6okta .WithCache (false ),
70+ v6okta .WithHttpClientPtr (httpClient ),
71+ v6okta .WithRateLimitMaxBackOff (int64 (c .MaxWait )),
72+ v6okta .WithRequestTimeout (int64 (c .RequestTimeout )),
73+ v6okta .WithRateLimitMaxRetries (int32 (c .RetryCount )),
74+ v6okta .WithUserAgentExtra (version .OktaTerraformProviderUserAgent ),
75+ }
76+ // v6 client also needs http proxy explicitly set
77+ if c .HttpProxy != "" {
78+ _url , err := url .Parse (c .HttpProxy )
79+ if err != nil {
80+ return nil , nil , err
81+ }
82+ host := v6okta .WithProxyHost (_url .Hostname ())
83+ setters = append (setters , host )
84+
85+ sPort := _url .Port ()
86+ if sPort == "" {
87+ sPort = "80"
88+ }
89+ iPort , err := strconv .Atoi (sPort )
90+ if err != nil {
91+ return nil , nil , err
92+ }
93+ port := v6okta .WithProxyPort (int32 (iPort ))
94+ setters = append (setters , port )
95+ }
96+
97+ switch {
98+ case c .AccessToken != "" :
99+ setters = append (
100+ setters ,
101+ v6okta .WithToken (c .AccessToken ), v6okta .WithAuthorizationMode ("Bearer" ),
102+ )
103+
104+ case c .ApiToken != "" :
105+ setters = append (
106+ setters ,
107+ v6okta .WithToken (c .ApiToken ), v6okta .WithAuthorizationMode ("SSWS" ),
108+ )
109+
110+ case c .PrivateKey != "" :
111+ setters = append (
112+ setters ,
113+ v6okta .WithPrivateKey (c .PrivateKey ), v6okta .WithPrivateKeyId (c .PrivateKeyId ), v6okta .WithScopes (c .Scopes ), v6okta .WithClientId (c .ClientID ), v6okta .WithAuthorizationMode ("PrivateKey" ),
114+ )
115+ }
116+
117+ if disableHTTPS {
118+ setters = append (setters , v6okta .WithTestingDisableHttpsCheck (true ))
119+ }
120+
121+ config , err := v6okta .NewConfiguration (setters ... )
122+ if err != nil {
123+ return nil , nil , err
124+ }
125+ return config , nil , nil
126+ }
127+
25128func getV5ClientConfig (c * OktaAPIConfig ) (* v5okta.Configuration , * v5okta.APIClient , error ) {
26129 var httpClient * http.Client
27130 logLevel := strings .ToLower (os .Getenv ("TF_LOG" ))
0 commit comments