api_client.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. // Code generated by smithy-go-codegen DO NOT EDIT.
  2. package cloudwatchlogs
  3. import (
  4. "context"
  5. cryptorand "crypto/rand"
  6. "fmt"
  7. "github.com/aws/aws-sdk-go-v2/aws"
  8. "github.com/aws/aws-sdk-go-v2/aws/defaults"
  9. awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
  10. "github.com/aws/aws-sdk-go-v2/aws/retry"
  11. "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
  12. awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http"
  13. internalauth "github.com/aws/aws-sdk-go-v2/internal/auth"
  14. internalauthsmithy "github.com/aws/aws-sdk-go-v2/internal/auth/smithy"
  15. internalConfig "github.com/aws/aws-sdk-go-v2/internal/configsources"
  16. smithy "github.com/aws/smithy-go"
  17. smithydocument "github.com/aws/smithy-go/document"
  18. "github.com/aws/smithy-go/logging"
  19. "github.com/aws/smithy-go/middleware"
  20. smithyrand "github.com/aws/smithy-go/rand"
  21. smithyhttp "github.com/aws/smithy-go/transport/http"
  22. "net"
  23. "net/http"
  24. "time"
  25. )
  26. const ServiceID = "CloudWatch Logs"
  27. const ServiceAPIVersion = "2014-03-28"
  28. // Client provides the API client to make operations call for Amazon CloudWatch
  29. // Logs.
  30. type Client struct {
  31. options Options
  32. }
  33. // New returns an initialized Client based on the functional options. Provide
  34. // additional functional options to further configure the behavior of the client,
  35. // such as changing the client's endpoint or adding custom middleware behavior.
  36. func New(options Options, optFns ...func(*Options)) *Client {
  37. options = options.Copy()
  38. resolveDefaultLogger(&options)
  39. setResolvedDefaultsMode(&options)
  40. resolveRetryer(&options)
  41. resolveHTTPClient(&options)
  42. resolveHTTPSignerV4(&options)
  43. resolveIdempotencyTokenProvider(&options)
  44. resolveEndpointResolverV2(&options)
  45. resolveAuthSchemeResolver(&options)
  46. for _, fn := range optFns {
  47. fn(&options)
  48. }
  49. finalizeRetryMaxAttempts(&options)
  50. ignoreAnonymousAuth(&options)
  51. wrapWithAnonymousAuth(&options)
  52. resolveAuthSchemes(&options)
  53. client := &Client{
  54. options: options,
  55. }
  56. return client
  57. }
  58. // Options returns a copy of the client configuration.
  59. //
  60. // Callers SHOULD NOT perform mutations on any inner structures within client
  61. // config. Config overrides should instead be made on a per-operation basis through
  62. // functional options.
  63. func (c *Client) Options() Options {
  64. return c.options.Copy()
  65. }
  66. func (c *Client) invokeOperation(ctx context.Context, opID string, params interface{}, optFns []func(*Options), stackFns ...func(*middleware.Stack, Options) error) (result interface{}, metadata middleware.Metadata, err error) {
  67. ctx = middleware.ClearStackValues(ctx)
  68. stack := middleware.NewStack(opID, smithyhttp.NewStackRequest)
  69. options := c.options.Copy()
  70. for _, fn := range optFns {
  71. fn(&options)
  72. }
  73. setSafeEventStreamClientLogMode(&options, opID)
  74. finalizeOperationRetryMaxAttempts(&options, *c)
  75. finalizeClientEndpointResolverOptions(&options)
  76. for _, fn := range stackFns {
  77. if err := fn(stack, options); err != nil {
  78. return nil, metadata, err
  79. }
  80. }
  81. for _, fn := range options.APIOptions {
  82. if err := fn(stack); err != nil {
  83. return nil, metadata, err
  84. }
  85. }
  86. handler := middleware.DecorateHandler(smithyhttp.NewClientHandler(options.HTTPClient), stack)
  87. result, metadata, err = handler.Handle(ctx, params)
  88. if err != nil {
  89. err = &smithy.OperationError{
  90. ServiceID: ServiceID,
  91. OperationName: opID,
  92. Err: err,
  93. }
  94. }
  95. return result, metadata, err
  96. }
  97. type operationInputKey struct{}
  98. func setOperationInput(ctx context.Context, input interface{}) context.Context {
  99. return middleware.WithStackValue(ctx, operationInputKey{}, input)
  100. }
  101. func getOperationInput(ctx context.Context) interface{} {
  102. return middleware.GetStackValue(ctx, operationInputKey{})
  103. }
  104. type setOperationInputMiddleware struct {
  105. }
  106. func (*setOperationInputMiddleware) ID() string {
  107. return "setOperationInput"
  108. }
  109. func (m *setOperationInputMiddleware) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (
  110. out middleware.SerializeOutput, metadata middleware.Metadata, err error,
  111. ) {
  112. ctx = setOperationInput(ctx, in.Parameters)
  113. return next.HandleSerialize(ctx, in)
  114. }
  115. func addProtocolFinalizerMiddlewares(stack *middleware.Stack, options Options, operation string) error {
  116. if err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, middleware.Before); err != nil {
  117. return fmt.Errorf("add ResolveAuthScheme: %w", err)
  118. }
  119. if err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, "ResolveAuthScheme", middleware.After); err != nil {
  120. return fmt.Errorf("add GetIdentity: %v", err)
  121. }
  122. if err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, "GetIdentity", middleware.After); err != nil {
  123. return fmt.Errorf("add ResolveEndpointV2: %v", err)
  124. }
  125. if err := stack.Finalize.Insert(&signRequestMiddleware{}, "ResolveEndpointV2", middleware.After); err != nil {
  126. return fmt.Errorf("add Signing: %w", err)
  127. }
  128. return nil
  129. }
  130. func resolveAuthSchemeResolver(options *Options) {
  131. if options.AuthSchemeResolver == nil {
  132. options.AuthSchemeResolver = &defaultAuthSchemeResolver{}
  133. }
  134. }
  135. func resolveAuthSchemes(options *Options) {
  136. if options.AuthSchemes == nil {
  137. options.AuthSchemes = []smithyhttp.AuthScheme{
  138. internalauth.NewHTTPAuthScheme("aws.auth#sigv4", &internalauthsmithy.V4SignerAdapter{
  139. Signer: options.HTTPSignerV4,
  140. Logger: options.Logger,
  141. LogSigning: options.ClientLogMode.IsSigning(),
  142. }),
  143. }
  144. }
  145. }
  146. type noSmithyDocumentSerde = smithydocument.NoSerde
  147. type legacyEndpointContextSetter struct {
  148. LegacyResolver EndpointResolver
  149. }
  150. func (*legacyEndpointContextSetter) ID() string {
  151. return "legacyEndpointContextSetter"
  152. }
  153. func (m *legacyEndpointContextSetter) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (
  154. out middleware.InitializeOutput, metadata middleware.Metadata, err error,
  155. ) {
  156. if m.LegacyResolver != nil {
  157. ctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, true)
  158. }
  159. return next.HandleInitialize(ctx, in)
  160. }
  161. func addlegacyEndpointContextSetter(stack *middleware.Stack, o Options) error {
  162. return stack.Initialize.Add(&legacyEndpointContextSetter{
  163. LegacyResolver: o.EndpointResolver,
  164. }, middleware.Before)
  165. }
  166. func resolveDefaultLogger(o *Options) {
  167. if o.Logger != nil {
  168. return
  169. }
  170. o.Logger = logging.Nop{}
  171. }
  172. func addSetLoggerMiddleware(stack *middleware.Stack, o Options) error {
  173. return middleware.AddSetLoggerMiddleware(stack, o.Logger)
  174. }
  175. func setResolvedDefaultsMode(o *Options) {
  176. if len(o.resolvedDefaultsMode) > 0 {
  177. return
  178. }
  179. var mode aws.DefaultsMode
  180. mode.SetFromString(string(o.DefaultsMode))
  181. if mode == aws.DefaultsModeAuto {
  182. mode = defaults.ResolveDefaultsModeAuto(o.Region, o.RuntimeEnvironment)
  183. }
  184. o.resolvedDefaultsMode = mode
  185. }
  186. // NewFromConfig returns a new client from the provided config.
  187. func NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client {
  188. opts := Options{
  189. Region: cfg.Region,
  190. DefaultsMode: cfg.DefaultsMode,
  191. RuntimeEnvironment: cfg.RuntimeEnvironment,
  192. HTTPClient: cfg.HTTPClient,
  193. Credentials: cfg.Credentials,
  194. APIOptions: cfg.APIOptions,
  195. Logger: cfg.Logger,
  196. ClientLogMode: cfg.ClientLogMode,
  197. AppID: cfg.AppID,
  198. }
  199. resolveAWSRetryerProvider(cfg, &opts)
  200. resolveAWSRetryMaxAttempts(cfg, &opts)
  201. resolveAWSRetryMode(cfg, &opts)
  202. resolveAWSEndpointResolver(cfg, &opts)
  203. resolveUseDualStackEndpoint(cfg, &opts)
  204. resolveUseFIPSEndpoint(cfg, &opts)
  205. resolveBaseEndpoint(cfg, &opts)
  206. return New(opts, optFns...)
  207. }
  208. func resolveHTTPClient(o *Options) {
  209. var buildable *awshttp.BuildableClient
  210. if o.HTTPClient != nil {
  211. var ok bool
  212. buildable, ok = o.HTTPClient.(*awshttp.BuildableClient)
  213. if !ok {
  214. return
  215. }
  216. } else {
  217. buildable = awshttp.NewBuildableClient()
  218. }
  219. modeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode)
  220. if err == nil {
  221. buildable = buildable.WithDialerOptions(func(dialer *net.Dialer) {
  222. if dialerTimeout, ok := modeConfig.GetConnectTimeout(); ok {
  223. dialer.Timeout = dialerTimeout
  224. }
  225. })
  226. buildable = buildable.WithTransportOptions(func(transport *http.Transport) {
  227. if tlsHandshakeTimeout, ok := modeConfig.GetTLSNegotiationTimeout(); ok {
  228. transport.TLSHandshakeTimeout = tlsHandshakeTimeout
  229. }
  230. })
  231. }
  232. o.HTTPClient = buildable
  233. }
  234. func resolveRetryer(o *Options) {
  235. if o.Retryer != nil {
  236. return
  237. }
  238. if len(o.RetryMode) == 0 {
  239. modeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode)
  240. if err == nil {
  241. o.RetryMode = modeConfig.RetryMode
  242. }
  243. }
  244. if len(o.RetryMode) == 0 {
  245. o.RetryMode = aws.RetryModeStandard
  246. }
  247. var standardOptions []func(*retry.StandardOptions)
  248. if v := o.RetryMaxAttempts; v != 0 {
  249. standardOptions = append(standardOptions, func(so *retry.StandardOptions) {
  250. so.MaxAttempts = v
  251. })
  252. }
  253. switch o.RetryMode {
  254. case aws.RetryModeAdaptive:
  255. var adaptiveOptions []func(*retry.AdaptiveModeOptions)
  256. if len(standardOptions) != 0 {
  257. adaptiveOptions = append(adaptiveOptions, func(ao *retry.AdaptiveModeOptions) {
  258. ao.StandardOptions = append(ao.StandardOptions, standardOptions...)
  259. })
  260. }
  261. o.Retryer = retry.NewAdaptiveMode(adaptiveOptions...)
  262. default:
  263. o.Retryer = retry.NewStandard(standardOptions...)
  264. }
  265. }
  266. func resolveAWSRetryerProvider(cfg aws.Config, o *Options) {
  267. if cfg.Retryer == nil {
  268. return
  269. }
  270. o.Retryer = cfg.Retryer()
  271. }
  272. func resolveAWSRetryMode(cfg aws.Config, o *Options) {
  273. if len(cfg.RetryMode) == 0 {
  274. return
  275. }
  276. o.RetryMode = cfg.RetryMode
  277. }
  278. func resolveAWSRetryMaxAttempts(cfg aws.Config, o *Options) {
  279. if cfg.RetryMaxAttempts == 0 {
  280. return
  281. }
  282. o.RetryMaxAttempts = cfg.RetryMaxAttempts
  283. }
  284. func finalizeRetryMaxAttempts(o *Options) {
  285. if o.RetryMaxAttempts == 0 {
  286. return
  287. }
  288. o.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts)
  289. }
  290. func finalizeOperationRetryMaxAttempts(o *Options, client Client) {
  291. if v := o.RetryMaxAttempts; v == 0 || v == client.options.RetryMaxAttempts {
  292. return
  293. }
  294. o.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts)
  295. }
  296. func resolveAWSEndpointResolver(cfg aws.Config, o *Options) {
  297. if cfg.EndpointResolver == nil && cfg.EndpointResolverWithOptions == nil {
  298. return
  299. }
  300. o.EndpointResolver = withEndpointResolver(cfg.EndpointResolver, cfg.EndpointResolverWithOptions)
  301. }
  302. func addClientUserAgent(stack *middleware.Stack, options Options) error {
  303. if err := awsmiddleware.AddSDKAgentKeyValue(awsmiddleware.APIMetadata, "cloudwatchlogs", goModuleVersion)(stack); err != nil {
  304. return err
  305. }
  306. if len(options.AppID) > 0 {
  307. return awsmiddleware.AddSDKAgentKey(awsmiddleware.ApplicationIdentifier, options.AppID)(stack)
  308. }
  309. return nil
  310. }
  311. type HTTPSignerV4 interface {
  312. SignHTTP(ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*v4.SignerOptions)) error
  313. }
  314. func resolveHTTPSignerV4(o *Options) {
  315. if o.HTTPSignerV4 != nil {
  316. return
  317. }
  318. o.HTTPSignerV4 = newDefaultV4Signer(*o)
  319. }
  320. func newDefaultV4Signer(o Options) *v4.Signer {
  321. return v4.NewSigner(func(so *v4.SignerOptions) {
  322. so.Logger = o.Logger
  323. so.LogSigning = o.ClientLogMode.IsSigning()
  324. })
  325. }
  326. func resolveIdempotencyTokenProvider(o *Options) {
  327. if o.IdempotencyTokenProvider != nil {
  328. return
  329. }
  330. o.IdempotencyTokenProvider = smithyrand.NewUUIDIdempotencyToken(cryptorand.Reader)
  331. }
  332. func addRetryMiddlewares(stack *middleware.Stack, o Options) error {
  333. mo := retry.AddRetryMiddlewaresOptions{
  334. Retryer: o.Retryer,
  335. LogRetryAttempts: o.ClientLogMode.IsRetries(),
  336. }
  337. return retry.AddRetryMiddlewares(stack, mo)
  338. }
  339. // resolves dual-stack endpoint configuration
  340. func resolveUseDualStackEndpoint(cfg aws.Config, o *Options) error {
  341. if len(cfg.ConfigSources) == 0 {
  342. return nil
  343. }
  344. value, found, err := internalConfig.ResolveUseDualStackEndpoint(context.Background(), cfg.ConfigSources)
  345. if err != nil {
  346. return err
  347. }
  348. if found {
  349. o.EndpointOptions.UseDualStackEndpoint = value
  350. }
  351. return nil
  352. }
  353. // resolves FIPS endpoint configuration
  354. func resolveUseFIPSEndpoint(cfg aws.Config, o *Options) error {
  355. if len(cfg.ConfigSources) == 0 {
  356. return nil
  357. }
  358. value, found, err := internalConfig.ResolveUseFIPSEndpoint(context.Background(), cfg.ConfigSources)
  359. if err != nil {
  360. return err
  361. }
  362. if found {
  363. o.EndpointOptions.UseFIPSEndpoint = value
  364. }
  365. return nil
  366. }
  367. // IdempotencyTokenProvider interface for providing idempotency token
  368. type IdempotencyTokenProvider interface {
  369. GetIdempotencyToken() (string, error)
  370. }
  371. func addRequestIDRetrieverMiddleware(stack *middleware.Stack) error {
  372. return awsmiddleware.AddRequestIDRetrieverMiddleware(stack)
  373. }
  374. func addResponseErrorMiddleware(stack *middleware.Stack) error {
  375. return awshttp.AddResponseErrorMiddleware(stack)
  376. }
  377. func addRequestResponseLogging(stack *middleware.Stack, o Options) error {
  378. return stack.Deserialize.Add(&smithyhttp.RequestResponseLogger{
  379. LogRequest: o.ClientLogMode.IsRequest(),
  380. LogRequestWithBody: o.ClientLogMode.IsRequestWithBody(),
  381. LogResponse: o.ClientLogMode.IsResponse(),
  382. LogResponseWithBody: o.ClientLogMode.IsResponseWithBody(),
  383. }, middleware.After)
  384. }
  385. type disableHTTPSMiddleware struct {
  386. DisableHTTPS bool
  387. }
  388. func (*disableHTTPSMiddleware) ID() string {
  389. return "disableHTTPS"
  390. }
  391. func (m *disableHTTPSMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
  392. out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
  393. ) {
  394. req, ok := in.Request.(*smithyhttp.Request)
  395. if !ok {
  396. return out, metadata, fmt.Errorf("unknown transport type %T", in.Request)
  397. }
  398. if m.DisableHTTPS && !smithyhttp.GetHostnameImmutable(ctx) {
  399. req.URL.Scheme = "http"
  400. }
  401. return next.HandleFinalize(ctx, in)
  402. }
  403. func addDisableHTTPSMiddleware(stack *middleware.Stack, o Options) error {
  404. return stack.Finalize.Insert(&disableHTTPSMiddleware{
  405. DisableHTTPS: o.EndpointOptions.DisableHTTPS,
  406. }, "ResolveEndpointV2", middleware.After)
  407. }