diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,367 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,44 @@
+# Amazon OpenSearch Service SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2021-01-01@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-opensearch)
+and the [AWS API Reference](https://aws.amazon.com/documentation/).
+
+The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
+which provides mechanisms for specifying AuthN/AuthZ information, sending requests,
+and receiving responses.
+
+Lenses are used for constructing and manipulating types,
+due to the depth of nesting of AWS types and transparency regarding
+de/serialisation into more palatable Haskell values.
+The provided lenses should be compatible with any of the major lens libraries
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
+
+See [Amazonka.OpenSearch](http://hackage.haskell.org/package/amazonka-opensearch/docs/Amazonka-OpenSearch.html)
+or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-opensearch` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
+
+Parts of the code are derived from AWS service descriptions, licensed under Apache 2.0.
+Source files subject to this contain an additional licensing clause in their header.
diff --git a/amazonka-opensearch.cabal b/amazonka-opensearch.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-opensearch.cabal
@@ -0,0 +1,241 @@
+cabal-version:      2.2
+name:               amazonka-opensearch
+version:            2.0
+synopsis:           Amazon OpenSearch Service SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
+description:
+  Derived from API version @2021-01-01@ of the AWS service descriptions, licensed under Apache 2.0.
+  .
+  The types from this library are intended to be used with <http://hackage.haskell.org/package/amazonka amazonka>,
+  which provides mechanisms for specifying AuthN/AuthZ information, sending requests, and receiving responses.
+  .
+  It is recommended to use generic lenses or optics from packages such as <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify optional fields and deconstruct responses.
+  .
+  Generated lenses can be found in "Amazonka.OpenSearch.Lens" and are
+  suitable for use with a lens package such as <http://hackage.haskell.org/package/lens lens> or <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
+  .
+  See "Amazonka.OpenSearch" and the <https://aws.amazon.com/documentation/ AWS documentation> to get started.
+
+source-repository head
+  type:     git
+  location: git://github.com/brendanhay/amazonka.git
+  subdir:   amazonka-opensearch
+
+library
+  default-language: Haskell2010
+  hs-source-dirs:   src gen
+  ghc-options:
+    -Wall -fwarn-incomplete-uni-patterns
+    -fwarn-incomplete-record-updates -funbox-strict-fields
+
+  exposed-modules:
+    Amazonka.OpenSearch
+    Amazonka.OpenSearch.AcceptInboundConnection
+    Amazonka.OpenSearch.AddTags
+    Amazonka.OpenSearch.AssociatePackage
+    Amazonka.OpenSearch.AuthorizeVpcEndpointAccess
+    Amazonka.OpenSearch.CancelServiceSoftwareUpdate
+    Amazonka.OpenSearch.CreateDomain
+    Amazonka.OpenSearch.CreateOutboundConnection
+    Amazonka.OpenSearch.CreatePackage
+    Amazonka.OpenSearch.CreateVpcEndpoint
+    Amazonka.OpenSearch.DeleteDomain
+    Amazonka.OpenSearch.DeleteInboundConnection
+    Amazonka.OpenSearch.DeleteOutboundConnection
+    Amazonka.OpenSearch.DeletePackage
+    Amazonka.OpenSearch.DeleteVpcEndpoint
+    Amazonka.OpenSearch.DescribeDomain
+    Amazonka.OpenSearch.DescribeDomainAutoTunes
+    Amazonka.OpenSearch.DescribeDomainChangeProgress
+    Amazonka.OpenSearch.DescribeDomainConfig
+    Amazonka.OpenSearch.DescribeDomains
+    Amazonka.OpenSearch.DescribeInboundConnections
+    Amazonka.OpenSearch.DescribeInstanceTypeLimits
+    Amazonka.OpenSearch.DescribeOutboundConnections
+    Amazonka.OpenSearch.DescribePackages
+    Amazonka.OpenSearch.DescribeReservedInstanceOfferings
+    Amazonka.OpenSearch.DescribeReservedInstances
+    Amazonka.OpenSearch.DescribeVpcEndpoints
+    Amazonka.OpenSearch.DissociatePackage
+    Amazonka.OpenSearch.GetCompatibleVersions
+    Amazonka.OpenSearch.GetPackageVersionHistory
+    Amazonka.OpenSearch.GetUpgradeHistory
+    Amazonka.OpenSearch.GetUpgradeStatus
+    Amazonka.OpenSearch.Lens
+    Amazonka.OpenSearch.ListDomainNames
+    Amazonka.OpenSearch.ListDomainsForPackage
+    Amazonka.OpenSearch.ListInstanceTypeDetails
+    Amazonka.OpenSearch.ListPackagesForDomain
+    Amazonka.OpenSearch.ListTags
+    Amazonka.OpenSearch.ListVersions
+    Amazonka.OpenSearch.ListVpcEndpointAccess
+    Amazonka.OpenSearch.ListVpcEndpoints
+    Amazonka.OpenSearch.ListVpcEndpointsForDomain
+    Amazonka.OpenSearch.PurchaseReservedInstanceOffering
+    Amazonka.OpenSearch.RejectInboundConnection
+    Amazonka.OpenSearch.RemoveTags
+    Amazonka.OpenSearch.RevokeVpcEndpointAccess
+    Amazonka.OpenSearch.StartServiceSoftwareUpdate
+    Amazonka.OpenSearch.Types
+    Amazonka.OpenSearch.Types.AccessPoliciesStatus
+    Amazonka.OpenSearch.Types.AdditionalLimit
+    Amazonka.OpenSearch.Types.AdvancedOptionsStatus
+    Amazonka.OpenSearch.Types.AdvancedSecurityOptions
+    Amazonka.OpenSearch.Types.AdvancedSecurityOptionsInput
+    Amazonka.OpenSearch.Types.AdvancedSecurityOptionsStatus
+    Amazonka.OpenSearch.Types.AuthorizedPrincipal
+    Amazonka.OpenSearch.Types.AutoTune
+    Amazonka.OpenSearch.Types.AutoTuneDesiredState
+    Amazonka.OpenSearch.Types.AutoTuneDetails
+    Amazonka.OpenSearch.Types.AutoTuneMaintenanceSchedule
+    Amazonka.OpenSearch.Types.AutoTuneOptions
+    Amazonka.OpenSearch.Types.AutoTuneOptionsInput
+    Amazonka.OpenSearch.Types.AutoTuneOptionsOutput
+    Amazonka.OpenSearch.Types.AutoTuneOptionsStatus
+    Amazonka.OpenSearch.Types.AutoTuneState
+    Amazonka.OpenSearch.Types.AutoTuneStatus
+    Amazonka.OpenSearch.Types.AutoTuneType
+    Amazonka.OpenSearch.Types.AWSDomainInformation
+    Amazonka.OpenSearch.Types.ChangeProgressDetails
+    Amazonka.OpenSearch.Types.ChangeProgressStage
+    Amazonka.OpenSearch.Types.ChangeProgressStatusDetails
+    Amazonka.OpenSearch.Types.ClusterConfig
+    Amazonka.OpenSearch.Types.ClusterConfigStatus
+    Amazonka.OpenSearch.Types.CognitoOptions
+    Amazonka.OpenSearch.Types.CognitoOptionsStatus
+    Amazonka.OpenSearch.Types.ColdStorageOptions
+    Amazonka.OpenSearch.Types.CompatibleVersionsMap
+    Amazonka.OpenSearch.Types.DeploymentStatus
+    Amazonka.OpenSearch.Types.DescribePackagesFilter
+    Amazonka.OpenSearch.Types.DescribePackagesFilterName
+    Amazonka.OpenSearch.Types.DomainConfig
+    Amazonka.OpenSearch.Types.DomainEndpointOptions
+    Amazonka.OpenSearch.Types.DomainEndpointOptionsStatus
+    Amazonka.OpenSearch.Types.DomainInfo
+    Amazonka.OpenSearch.Types.DomainInformationContainer
+    Amazonka.OpenSearch.Types.DomainPackageDetails
+    Amazonka.OpenSearch.Types.DomainPackageStatus
+    Amazonka.OpenSearch.Types.DomainStatus
+    Amazonka.OpenSearch.Types.DryRunResults
+    Amazonka.OpenSearch.Types.Duration
+    Amazonka.OpenSearch.Types.EBSOptions
+    Amazonka.OpenSearch.Types.EBSOptionsStatus
+    Amazonka.OpenSearch.Types.EncryptionAtRestOptions
+    Amazonka.OpenSearch.Types.EncryptionAtRestOptionsStatus
+    Amazonka.OpenSearch.Types.EngineType
+    Amazonka.OpenSearch.Types.ErrorDetails
+    Amazonka.OpenSearch.Types.Filter
+    Amazonka.OpenSearch.Types.InboundConnection
+    Amazonka.OpenSearch.Types.InboundConnectionStatus
+    Amazonka.OpenSearch.Types.InboundConnectionStatusCode
+    Amazonka.OpenSearch.Types.InstanceCountLimits
+    Amazonka.OpenSearch.Types.InstanceLimits
+    Amazonka.OpenSearch.Types.InstanceTypeDetails
+    Amazonka.OpenSearch.Types.Limits
+    Amazonka.OpenSearch.Types.LogPublishingOption
+    Amazonka.OpenSearch.Types.LogPublishingOptionsStatus
+    Amazonka.OpenSearch.Types.LogType
+    Amazonka.OpenSearch.Types.MasterUserOptions
+    Amazonka.OpenSearch.Types.NodeToNodeEncryptionOptions
+    Amazonka.OpenSearch.Types.NodeToNodeEncryptionOptionsStatus
+    Amazonka.OpenSearch.Types.OpenSearchPartitionInstanceType
+    Amazonka.OpenSearch.Types.OpenSearchWarmPartitionInstanceType
+    Amazonka.OpenSearch.Types.OptionState
+    Amazonka.OpenSearch.Types.OptionStatus
+    Amazonka.OpenSearch.Types.OutboundConnection
+    Amazonka.OpenSearch.Types.OutboundConnectionStatus
+    Amazonka.OpenSearch.Types.OutboundConnectionStatusCode
+    Amazonka.OpenSearch.Types.OverallChangeStatus
+    Amazonka.OpenSearch.Types.PackageDetails
+    Amazonka.OpenSearch.Types.PackageSource
+    Amazonka.OpenSearch.Types.PackageStatus
+    Amazonka.OpenSearch.Types.PackageType
+    Amazonka.OpenSearch.Types.PackageVersionHistory
+    Amazonka.OpenSearch.Types.PrincipalType
+    Amazonka.OpenSearch.Types.RecurringCharge
+    Amazonka.OpenSearch.Types.ReservedInstance
+    Amazonka.OpenSearch.Types.ReservedInstanceOffering
+    Amazonka.OpenSearch.Types.ReservedInstancePaymentOption
+    Amazonka.OpenSearch.Types.RollbackOnDisable
+    Amazonka.OpenSearch.Types.SAMLIdp
+    Amazonka.OpenSearch.Types.SAMLOptionsInput
+    Amazonka.OpenSearch.Types.SAMLOptionsOutput
+    Amazonka.OpenSearch.Types.ScheduledAutoTuneActionType
+    Amazonka.OpenSearch.Types.ScheduledAutoTuneDetails
+    Amazonka.OpenSearch.Types.ScheduledAutoTuneSeverityType
+    Amazonka.OpenSearch.Types.ServiceSoftwareOptions
+    Amazonka.OpenSearch.Types.SnapshotOptions
+    Amazonka.OpenSearch.Types.SnapshotOptionsStatus
+    Amazonka.OpenSearch.Types.StorageType
+    Amazonka.OpenSearch.Types.StorageTypeLimit
+    Amazonka.OpenSearch.Types.Tag
+    Amazonka.OpenSearch.Types.TimeUnit
+    Amazonka.OpenSearch.Types.TLSSecurityPolicy
+    Amazonka.OpenSearch.Types.UpgradeHistory
+    Amazonka.OpenSearch.Types.UpgradeStatus
+    Amazonka.OpenSearch.Types.UpgradeStep
+    Amazonka.OpenSearch.Types.UpgradeStepItem
+    Amazonka.OpenSearch.Types.VersionStatus
+    Amazonka.OpenSearch.Types.VolumeType
+    Amazonka.OpenSearch.Types.VPCDerivedInfo
+    Amazonka.OpenSearch.Types.VPCDerivedInfoStatus
+    Amazonka.OpenSearch.Types.VpcEndpoint
+    Amazonka.OpenSearch.Types.VpcEndpointError
+    Amazonka.OpenSearch.Types.VpcEndpointErrorCode
+    Amazonka.OpenSearch.Types.VpcEndpointStatus
+    Amazonka.OpenSearch.Types.VpcEndpointSummary
+    Amazonka.OpenSearch.Types.VPCOptions
+    Amazonka.OpenSearch.Types.ZoneAwarenessConfig
+    Amazonka.OpenSearch.UpdateDomainConfig
+    Amazonka.OpenSearch.UpdatePackage
+    Amazonka.OpenSearch.UpdateVpcEndpoint
+    Amazonka.OpenSearch.UpgradeDomain
+    Amazonka.OpenSearch.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-opensearch-test
+  type:             exitcode-stdio-1.0
+  default-language: Haskell2010
+  hs-source-dirs:   test
+  main-is:          Main.hs
+  ghc-options:      -Wall -threaded
+
+  -- This section is encoded by the template and any modules added by
+  -- hand outside these namespaces will not correctly be added to the
+  -- distribution package.
+  other-modules:
+    Test.Amazonka.Gen.OpenSearch
+    Test.Amazonka.OpenSearch
+    Test.Amazonka.OpenSearch.Internal
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-opensearch
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/AcceptInboundConnection.yaml b/fixture/AcceptInboundConnection.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AcceptInboundConnection.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/AcceptInboundConnectionResponse.proto b/fixture/AcceptInboundConnectionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AcceptInboundConnectionResponse.proto
diff --git a/fixture/AddTags.yaml b/fixture/AddTags.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AddTags.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/AddTagsResponse.proto b/fixture/AddTagsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AddTagsResponse.proto
diff --git a/fixture/AssociatePackage.yaml b/fixture/AssociatePackage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AssociatePackage.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/AssociatePackageResponse.proto b/fixture/AssociatePackageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AssociatePackageResponse.proto
diff --git a/fixture/AuthorizeVpcEndpointAccess.yaml b/fixture/AuthorizeVpcEndpointAccess.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AuthorizeVpcEndpointAccess.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/AuthorizeVpcEndpointAccessResponse.proto b/fixture/AuthorizeVpcEndpointAccessResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AuthorizeVpcEndpointAccessResponse.proto
diff --git a/fixture/CancelServiceSoftwareUpdate.yaml b/fixture/CancelServiceSoftwareUpdate.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CancelServiceSoftwareUpdate.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CancelServiceSoftwareUpdateResponse.proto b/fixture/CancelServiceSoftwareUpdateResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CancelServiceSoftwareUpdateResponse.proto
diff --git a/fixture/CreateDomain.yaml b/fixture/CreateDomain.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDomain.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateDomainResponse.proto b/fixture/CreateDomainResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDomainResponse.proto
diff --git a/fixture/CreateOutboundConnection.yaml b/fixture/CreateOutboundConnection.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateOutboundConnection.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateOutboundConnectionResponse.proto b/fixture/CreateOutboundConnectionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateOutboundConnectionResponse.proto
diff --git a/fixture/CreatePackage.yaml b/fixture/CreatePackage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreatePackage.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreatePackageResponse.proto b/fixture/CreatePackageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreatePackageResponse.proto
diff --git a/fixture/CreateVpcEndpoint.yaml b/fixture/CreateVpcEndpoint.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVpcEndpoint.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateVpcEndpointResponse.proto b/fixture/CreateVpcEndpointResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVpcEndpointResponse.proto
diff --git a/fixture/DeleteDomain.yaml b/fixture/DeleteDomain.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDomain.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteDomainResponse.proto b/fixture/DeleteDomainResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDomainResponse.proto
diff --git a/fixture/DeleteInboundConnection.yaml b/fixture/DeleteInboundConnection.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteInboundConnection.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteInboundConnectionResponse.proto b/fixture/DeleteInboundConnectionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteInboundConnectionResponse.proto
diff --git a/fixture/DeleteOutboundConnection.yaml b/fixture/DeleteOutboundConnection.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteOutboundConnection.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteOutboundConnectionResponse.proto b/fixture/DeleteOutboundConnectionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteOutboundConnectionResponse.proto
diff --git a/fixture/DeletePackage.yaml b/fixture/DeletePackage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeletePackage.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeletePackageResponse.proto b/fixture/DeletePackageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeletePackageResponse.proto
diff --git a/fixture/DeleteVpcEndpoint.yaml b/fixture/DeleteVpcEndpoint.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVpcEndpoint.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteVpcEndpointResponse.proto b/fixture/DeleteVpcEndpointResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVpcEndpointResponse.proto
diff --git a/fixture/DescribeDomain.yaml b/fixture/DescribeDomain.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDomain.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeDomainAutoTunes.yaml b/fixture/DescribeDomainAutoTunes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDomainAutoTunes.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeDomainAutoTunesResponse.proto b/fixture/DescribeDomainAutoTunesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDomainAutoTunesResponse.proto
diff --git a/fixture/DescribeDomainChangeProgress.yaml b/fixture/DescribeDomainChangeProgress.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDomainChangeProgress.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeDomainChangeProgressResponse.proto b/fixture/DescribeDomainChangeProgressResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDomainChangeProgressResponse.proto
diff --git a/fixture/DescribeDomainConfig.yaml b/fixture/DescribeDomainConfig.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDomainConfig.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeDomainConfigResponse.proto b/fixture/DescribeDomainConfigResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDomainConfigResponse.proto
diff --git a/fixture/DescribeDomainResponse.proto b/fixture/DescribeDomainResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDomainResponse.proto
diff --git a/fixture/DescribeDomains.yaml b/fixture/DescribeDomains.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDomains.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeDomainsResponse.proto b/fixture/DescribeDomainsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDomainsResponse.proto
diff --git a/fixture/DescribeInboundConnections.yaml b/fixture/DescribeInboundConnections.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeInboundConnections.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeInboundConnectionsResponse.proto b/fixture/DescribeInboundConnectionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeInboundConnectionsResponse.proto
diff --git a/fixture/DescribeInstanceTypeLimits.yaml b/fixture/DescribeInstanceTypeLimits.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeInstanceTypeLimits.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeInstanceTypeLimitsResponse.proto b/fixture/DescribeInstanceTypeLimitsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeInstanceTypeLimitsResponse.proto
diff --git a/fixture/DescribeOutboundConnections.yaml b/fixture/DescribeOutboundConnections.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeOutboundConnections.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeOutboundConnectionsResponse.proto b/fixture/DescribeOutboundConnectionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeOutboundConnectionsResponse.proto
diff --git a/fixture/DescribePackages.yaml b/fixture/DescribePackages.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePackages.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribePackagesResponse.proto b/fixture/DescribePackagesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePackagesResponse.proto
diff --git a/fixture/DescribeReservedInstanceOfferings.yaml b/fixture/DescribeReservedInstanceOfferings.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeReservedInstanceOfferings.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeReservedInstanceOfferingsResponse.proto b/fixture/DescribeReservedInstanceOfferingsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeReservedInstanceOfferingsResponse.proto
diff --git a/fixture/DescribeReservedInstances.yaml b/fixture/DescribeReservedInstances.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeReservedInstances.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeReservedInstancesResponse.proto b/fixture/DescribeReservedInstancesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeReservedInstancesResponse.proto
diff --git a/fixture/DescribeVpcEndpoints.yaml b/fixture/DescribeVpcEndpoints.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeVpcEndpoints.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeVpcEndpointsResponse.proto b/fixture/DescribeVpcEndpointsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeVpcEndpointsResponse.proto
diff --git a/fixture/DissociatePackage.yaml b/fixture/DissociatePackage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DissociatePackage.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DissociatePackageResponse.proto b/fixture/DissociatePackageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DissociatePackageResponse.proto
diff --git a/fixture/GetCompatibleVersions.yaml b/fixture/GetCompatibleVersions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetCompatibleVersions.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetCompatibleVersionsResponse.proto b/fixture/GetCompatibleVersionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetCompatibleVersionsResponse.proto
diff --git a/fixture/GetPackageVersionHistory.yaml b/fixture/GetPackageVersionHistory.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetPackageVersionHistory.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetPackageVersionHistoryResponse.proto b/fixture/GetPackageVersionHistoryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetPackageVersionHistoryResponse.proto
diff --git a/fixture/GetUpgradeHistory.yaml b/fixture/GetUpgradeHistory.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetUpgradeHistory.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetUpgradeHistoryResponse.proto b/fixture/GetUpgradeHistoryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetUpgradeHistoryResponse.proto
diff --git a/fixture/GetUpgradeStatus.yaml b/fixture/GetUpgradeStatus.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetUpgradeStatus.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetUpgradeStatusResponse.proto b/fixture/GetUpgradeStatusResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetUpgradeStatusResponse.proto
diff --git a/fixture/ListDomainNames.yaml b/fixture/ListDomainNames.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDomainNames.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListDomainNamesResponse.proto b/fixture/ListDomainNamesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDomainNamesResponse.proto
diff --git a/fixture/ListDomainsForPackage.yaml b/fixture/ListDomainsForPackage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDomainsForPackage.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListDomainsForPackageResponse.proto b/fixture/ListDomainsForPackageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDomainsForPackageResponse.proto
diff --git a/fixture/ListInstanceTypeDetails.yaml b/fixture/ListInstanceTypeDetails.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListInstanceTypeDetails.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListInstanceTypeDetailsResponse.proto b/fixture/ListInstanceTypeDetailsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListInstanceTypeDetailsResponse.proto
diff --git a/fixture/ListPackagesForDomain.yaml b/fixture/ListPackagesForDomain.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListPackagesForDomain.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListPackagesForDomainResponse.proto b/fixture/ListPackagesForDomainResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListPackagesForDomainResponse.proto
diff --git a/fixture/ListTags.yaml b/fixture/ListTags.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTags.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListTagsResponse.proto b/fixture/ListTagsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsResponse.proto
diff --git a/fixture/ListVersions.yaml b/fixture/ListVersions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListVersions.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListVersionsResponse.proto b/fixture/ListVersionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListVersionsResponse.proto
diff --git a/fixture/ListVpcEndpointAccess.yaml b/fixture/ListVpcEndpointAccess.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListVpcEndpointAccess.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListVpcEndpointAccessResponse.proto b/fixture/ListVpcEndpointAccessResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListVpcEndpointAccessResponse.proto
diff --git a/fixture/ListVpcEndpoints.yaml b/fixture/ListVpcEndpoints.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListVpcEndpoints.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListVpcEndpointsForDomain.yaml b/fixture/ListVpcEndpointsForDomain.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListVpcEndpointsForDomain.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListVpcEndpointsForDomainResponse.proto b/fixture/ListVpcEndpointsForDomainResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListVpcEndpointsForDomainResponse.proto
diff --git a/fixture/ListVpcEndpointsResponse.proto b/fixture/ListVpcEndpointsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListVpcEndpointsResponse.proto
diff --git a/fixture/PurchaseReservedInstanceOffering.yaml b/fixture/PurchaseReservedInstanceOffering.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PurchaseReservedInstanceOffering.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/PurchaseReservedInstanceOfferingResponse.proto b/fixture/PurchaseReservedInstanceOfferingResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PurchaseReservedInstanceOfferingResponse.proto
diff --git a/fixture/RejectInboundConnection.yaml b/fixture/RejectInboundConnection.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RejectInboundConnection.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/RejectInboundConnectionResponse.proto b/fixture/RejectInboundConnectionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RejectInboundConnectionResponse.proto
diff --git a/fixture/RemoveTags.yaml b/fixture/RemoveTags.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RemoveTags.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/RemoveTagsResponse.proto b/fixture/RemoveTagsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RemoveTagsResponse.proto
diff --git a/fixture/RevokeVpcEndpointAccess.yaml b/fixture/RevokeVpcEndpointAccess.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RevokeVpcEndpointAccess.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/RevokeVpcEndpointAccessResponse.proto b/fixture/RevokeVpcEndpointAccessResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RevokeVpcEndpointAccessResponse.proto
diff --git a/fixture/StartServiceSoftwareUpdate.yaml b/fixture/StartServiceSoftwareUpdate.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartServiceSoftwareUpdate.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/StartServiceSoftwareUpdateResponse.proto b/fixture/StartServiceSoftwareUpdateResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartServiceSoftwareUpdateResponse.proto
diff --git a/fixture/UpdateDomainConfig.yaml b/fixture/UpdateDomainConfig.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDomainConfig.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateDomainConfigResponse.proto b/fixture/UpdateDomainConfigResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDomainConfigResponse.proto
diff --git a/fixture/UpdatePackage.yaml b/fixture/UpdatePackage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdatePackage.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdatePackageResponse.proto b/fixture/UpdatePackageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdatePackageResponse.proto
diff --git a/fixture/UpdateVpcEndpoint.yaml b/fixture/UpdateVpcEndpoint.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateVpcEndpoint.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateVpcEndpointResponse.proto b/fixture/UpdateVpcEndpointResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateVpcEndpointResponse.proto
diff --git a/fixture/UpgradeDomain.yaml b/fixture/UpgradeDomain.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpgradeDomain.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpgradeDomainResponse.proto b/fixture/UpgradeDomainResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpgradeDomainResponse.proto
diff --git a/gen/Amazonka/OpenSearch.hs b/gen/Amazonka/OpenSearch.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch.hs
@@ -0,0 +1,856 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.OpenSearch
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2021-01-01@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Use the Amazon OpenSearch Service configuration API to create,
+-- configure, and manage OpenSearch Service domains.
+--
+-- For sample code that uses the configuration API, see the
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/opensearch-configuration-samples.html Amazon OpenSearch Service Developer Guide>
+-- . The guide also contains
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/request-signing.html sample code>
+-- for sending signed HTTP requests to the OpenSearch APIs. The endpoint
+-- for configuration service requests is Region specific:
+-- es./region/.amazonaws.com. For example, es.us-east-1.amazonaws.com. For
+-- a current list of supported Regions and endpoints, see
+-- <https://docs.aws.amazon.com/general/latest/gr/rande.html#service-regions Amazon Web Services service endpoints>.
+module Amazonka.OpenSearch
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** BaseException
+    _BaseException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** DisabledOperationException
+    _DisabledOperationException,
+
+    -- ** InternalException
+    _InternalException,
+
+    -- ** InvalidPaginationTokenException
+    _InvalidPaginationTokenException,
+
+    -- ** InvalidTypeException
+    _InvalidTypeException,
+
+    -- ** LimitExceededException
+    _LimitExceededException,
+
+    -- ** ResourceAlreadyExistsException
+    _ResourceAlreadyExistsException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** AcceptInboundConnection
+    AcceptInboundConnection (AcceptInboundConnection'),
+    newAcceptInboundConnection,
+    AcceptInboundConnectionResponse (AcceptInboundConnectionResponse'),
+    newAcceptInboundConnectionResponse,
+
+    -- ** AddTags
+    AddTags (AddTags'),
+    newAddTags,
+    AddTagsResponse (AddTagsResponse'),
+    newAddTagsResponse,
+
+    -- ** AssociatePackage
+    AssociatePackage (AssociatePackage'),
+    newAssociatePackage,
+    AssociatePackageResponse (AssociatePackageResponse'),
+    newAssociatePackageResponse,
+
+    -- ** AuthorizeVpcEndpointAccess
+    AuthorizeVpcEndpointAccess (AuthorizeVpcEndpointAccess'),
+    newAuthorizeVpcEndpointAccess,
+    AuthorizeVpcEndpointAccessResponse (AuthorizeVpcEndpointAccessResponse'),
+    newAuthorizeVpcEndpointAccessResponse,
+
+    -- ** CancelServiceSoftwareUpdate
+    CancelServiceSoftwareUpdate (CancelServiceSoftwareUpdate'),
+    newCancelServiceSoftwareUpdate,
+    CancelServiceSoftwareUpdateResponse (CancelServiceSoftwareUpdateResponse'),
+    newCancelServiceSoftwareUpdateResponse,
+
+    -- ** CreateDomain
+    CreateDomain (CreateDomain'),
+    newCreateDomain,
+    CreateDomainResponse (CreateDomainResponse'),
+    newCreateDomainResponse,
+
+    -- ** CreateOutboundConnection
+    CreateOutboundConnection (CreateOutboundConnection'),
+    newCreateOutboundConnection,
+    CreateOutboundConnectionResponse (CreateOutboundConnectionResponse'),
+    newCreateOutboundConnectionResponse,
+
+    -- ** CreatePackage
+    CreatePackage (CreatePackage'),
+    newCreatePackage,
+    CreatePackageResponse (CreatePackageResponse'),
+    newCreatePackageResponse,
+
+    -- ** CreateVpcEndpoint
+    CreateVpcEndpoint (CreateVpcEndpoint'),
+    newCreateVpcEndpoint,
+    CreateVpcEndpointResponse (CreateVpcEndpointResponse'),
+    newCreateVpcEndpointResponse,
+
+    -- ** DeleteDomain
+    DeleteDomain (DeleteDomain'),
+    newDeleteDomain,
+    DeleteDomainResponse (DeleteDomainResponse'),
+    newDeleteDomainResponse,
+
+    -- ** DeleteInboundConnection
+    DeleteInboundConnection (DeleteInboundConnection'),
+    newDeleteInboundConnection,
+    DeleteInboundConnectionResponse (DeleteInboundConnectionResponse'),
+    newDeleteInboundConnectionResponse,
+
+    -- ** DeleteOutboundConnection
+    DeleteOutboundConnection (DeleteOutboundConnection'),
+    newDeleteOutboundConnection,
+    DeleteOutboundConnectionResponse (DeleteOutboundConnectionResponse'),
+    newDeleteOutboundConnectionResponse,
+
+    -- ** DeletePackage
+    DeletePackage (DeletePackage'),
+    newDeletePackage,
+    DeletePackageResponse (DeletePackageResponse'),
+    newDeletePackageResponse,
+
+    -- ** DeleteVpcEndpoint
+    DeleteVpcEndpoint (DeleteVpcEndpoint'),
+    newDeleteVpcEndpoint,
+    DeleteVpcEndpointResponse (DeleteVpcEndpointResponse'),
+    newDeleteVpcEndpointResponse,
+
+    -- ** DescribeDomain
+    DescribeDomain (DescribeDomain'),
+    newDescribeDomain,
+    DescribeDomainResponse (DescribeDomainResponse'),
+    newDescribeDomainResponse,
+
+    -- ** DescribeDomainAutoTunes
+    DescribeDomainAutoTunes (DescribeDomainAutoTunes'),
+    newDescribeDomainAutoTunes,
+    DescribeDomainAutoTunesResponse (DescribeDomainAutoTunesResponse'),
+    newDescribeDomainAutoTunesResponse,
+
+    -- ** DescribeDomainChangeProgress
+    DescribeDomainChangeProgress (DescribeDomainChangeProgress'),
+    newDescribeDomainChangeProgress,
+    DescribeDomainChangeProgressResponse (DescribeDomainChangeProgressResponse'),
+    newDescribeDomainChangeProgressResponse,
+
+    -- ** DescribeDomainConfig
+    DescribeDomainConfig (DescribeDomainConfig'),
+    newDescribeDomainConfig,
+    DescribeDomainConfigResponse (DescribeDomainConfigResponse'),
+    newDescribeDomainConfigResponse,
+
+    -- ** DescribeDomains
+    DescribeDomains (DescribeDomains'),
+    newDescribeDomains,
+    DescribeDomainsResponse (DescribeDomainsResponse'),
+    newDescribeDomainsResponse,
+
+    -- ** DescribeInboundConnections
+    DescribeInboundConnections (DescribeInboundConnections'),
+    newDescribeInboundConnections,
+    DescribeInboundConnectionsResponse (DescribeInboundConnectionsResponse'),
+    newDescribeInboundConnectionsResponse,
+
+    -- ** DescribeInstanceTypeLimits
+    DescribeInstanceTypeLimits (DescribeInstanceTypeLimits'),
+    newDescribeInstanceTypeLimits,
+    DescribeInstanceTypeLimitsResponse (DescribeInstanceTypeLimitsResponse'),
+    newDescribeInstanceTypeLimitsResponse,
+
+    -- ** DescribeOutboundConnections
+    DescribeOutboundConnections (DescribeOutboundConnections'),
+    newDescribeOutboundConnections,
+    DescribeOutboundConnectionsResponse (DescribeOutboundConnectionsResponse'),
+    newDescribeOutboundConnectionsResponse,
+
+    -- ** DescribePackages
+    DescribePackages (DescribePackages'),
+    newDescribePackages,
+    DescribePackagesResponse (DescribePackagesResponse'),
+    newDescribePackagesResponse,
+
+    -- ** DescribeReservedInstanceOfferings
+    DescribeReservedInstanceOfferings (DescribeReservedInstanceOfferings'),
+    newDescribeReservedInstanceOfferings,
+    DescribeReservedInstanceOfferingsResponse (DescribeReservedInstanceOfferingsResponse'),
+    newDescribeReservedInstanceOfferingsResponse,
+
+    -- ** DescribeReservedInstances
+    DescribeReservedInstances (DescribeReservedInstances'),
+    newDescribeReservedInstances,
+    DescribeReservedInstancesResponse (DescribeReservedInstancesResponse'),
+    newDescribeReservedInstancesResponse,
+
+    -- ** DescribeVpcEndpoints
+    DescribeVpcEndpoints (DescribeVpcEndpoints'),
+    newDescribeVpcEndpoints,
+    DescribeVpcEndpointsResponse (DescribeVpcEndpointsResponse'),
+    newDescribeVpcEndpointsResponse,
+
+    -- ** DissociatePackage
+    DissociatePackage (DissociatePackage'),
+    newDissociatePackage,
+    DissociatePackageResponse (DissociatePackageResponse'),
+    newDissociatePackageResponse,
+
+    -- ** GetCompatibleVersions
+    GetCompatibleVersions (GetCompatibleVersions'),
+    newGetCompatibleVersions,
+    GetCompatibleVersionsResponse (GetCompatibleVersionsResponse'),
+    newGetCompatibleVersionsResponse,
+
+    -- ** GetPackageVersionHistory
+    GetPackageVersionHistory (GetPackageVersionHistory'),
+    newGetPackageVersionHistory,
+    GetPackageVersionHistoryResponse (GetPackageVersionHistoryResponse'),
+    newGetPackageVersionHistoryResponse,
+
+    -- ** GetUpgradeHistory
+    GetUpgradeHistory (GetUpgradeHistory'),
+    newGetUpgradeHistory,
+    GetUpgradeHistoryResponse (GetUpgradeHistoryResponse'),
+    newGetUpgradeHistoryResponse,
+
+    -- ** GetUpgradeStatus
+    GetUpgradeStatus (GetUpgradeStatus'),
+    newGetUpgradeStatus,
+    GetUpgradeStatusResponse (GetUpgradeStatusResponse'),
+    newGetUpgradeStatusResponse,
+
+    -- ** ListDomainNames
+    ListDomainNames (ListDomainNames'),
+    newListDomainNames,
+    ListDomainNamesResponse (ListDomainNamesResponse'),
+    newListDomainNamesResponse,
+
+    -- ** ListDomainsForPackage
+    ListDomainsForPackage (ListDomainsForPackage'),
+    newListDomainsForPackage,
+    ListDomainsForPackageResponse (ListDomainsForPackageResponse'),
+    newListDomainsForPackageResponse,
+
+    -- ** ListInstanceTypeDetails
+    ListInstanceTypeDetails (ListInstanceTypeDetails'),
+    newListInstanceTypeDetails,
+    ListInstanceTypeDetailsResponse (ListInstanceTypeDetailsResponse'),
+    newListInstanceTypeDetailsResponse,
+
+    -- ** ListPackagesForDomain
+    ListPackagesForDomain (ListPackagesForDomain'),
+    newListPackagesForDomain,
+    ListPackagesForDomainResponse (ListPackagesForDomainResponse'),
+    newListPackagesForDomainResponse,
+
+    -- ** ListTags
+    ListTags (ListTags'),
+    newListTags,
+    ListTagsResponse (ListTagsResponse'),
+    newListTagsResponse,
+
+    -- ** ListVersions
+    ListVersions (ListVersions'),
+    newListVersions,
+    ListVersionsResponse (ListVersionsResponse'),
+    newListVersionsResponse,
+
+    -- ** ListVpcEndpointAccess
+    ListVpcEndpointAccess (ListVpcEndpointAccess'),
+    newListVpcEndpointAccess,
+    ListVpcEndpointAccessResponse (ListVpcEndpointAccessResponse'),
+    newListVpcEndpointAccessResponse,
+
+    -- ** ListVpcEndpoints
+    ListVpcEndpoints (ListVpcEndpoints'),
+    newListVpcEndpoints,
+    ListVpcEndpointsResponse (ListVpcEndpointsResponse'),
+    newListVpcEndpointsResponse,
+
+    -- ** ListVpcEndpointsForDomain
+    ListVpcEndpointsForDomain (ListVpcEndpointsForDomain'),
+    newListVpcEndpointsForDomain,
+    ListVpcEndpointsForDomainResponse (ListVpcEndpointsForDomainResponse'),
+    newListVpcEndpointsForDomainResponse,
+
+    -- ** PurchaseReservedInstanceOffering
+    PurchaseReservedInstanceOffering (PurchaseReservedInstanceOffering'),
+    newPurchaseReservedInstanceOffering,
+    PurchaseReservedInstanceOfferingResponse (PurchaseReservedInstanceOfferingResponse'),
+    newPurchaseReservedInstanceOfferingResponse,
+
+    -- ** RejectInboundConnection
+    RejectInboundConnection (RejectInboundConnection'),
+    newRejectInboundConnection,
+    RejectInboundConnectionResponse (RejectInboundConnectionResponse'),
+    newRejectInboundConnectionResponse,
+
+    -- ** RemoveTags
+    RemoveTags (RemoveTags'),
+    newRemoveTags,
+    RemoveTagsResponse (RemoveTagsResponse'),
+    newRemoveTagsResponse,
+
+    -- ** RevokeVpcEndpointAccess
+    RevokeVpcEndpointAccess (RevokeVpcEndpointAccess'),
+    newRevokeVpcEndpointAccess,
+    RevokeVpcEndpointAccessResponse (RevokeVpcEndpointAccessResponse'),
+    newRevokeVpcEndpointAccessResponse,
+
+    -- ** StartServiceSoftwareUpdate
+    StartServiceSoftwareUpdate (StartServiceSoftwareUpdate'),
+    newStartServiceSoftwareUpdate,
+    StartServiceSoftwareUpdateResponse (StartServiceSoftwareUpdateResponse'),
+    newStartServiceSoftwareUpdateResponse,
+
+    -- ** UpdateDomainConfig
+    UpdateDomainConfig (UpdateDomainConfig'),
+    newUpdateDomainConfig,
+    UpdateDomainConfigResponse (UpdateDomainConfigResponse'),
+    newUpdateDomainConfigResponse,
+
+    -- ** UpdatePackage
+    UpdatePackage (UpdatePackage'),
+    newUpdatePackage,
+    UpdatePackageResponse (UpdatePackageResponse'),
+    newUpdatePackageResponse,
+
+    -- ** UpdateVpcEndpoint
+    UpdateVpcEndpoint (UpdateVpcEndpoint'),
+    newUpdateVpcEndpoint,
+    UpdateVpcEndpointResponse (UpdateVpcEndpointResponse'),
+    newUpdateVpcEndpointResponse,
+
+    -- ** UpgradeDomain
+    UpgradeDomain (UpgradeDomain'),
+    newUpgradeDomain,
+    UpgradeDomainResponse (UpgradeDomainResponse'),
+    newUpgradeDomainResponse,
+
+    -- * Types
+
+    -- ** AutoTuneDesiredState
+    AutoTuneDesiredState (..),
+
+    -- ** AutoTuneState
+    AutoTuneState (..),
+
+    -- ** AutoTuneType
+    AutoTuneType (..),
+
+    -- ** DeploymentStatus
+    DeploymentStatus (..),
+
+    -- ** DescribePackagesFilterName
+    DescribePackagesFilterName (..),
+
+    -- ** DomainPackageStatus
+    DomainPackageStatus (..),
+
+    -- ** EngineType
+    EngineType (..),
+
+    -- ** InboundConnectionStatusCode
+    InboundConnectionStatusCode (..),
+
+    -- ** LogType
+    LogType (..),
+
+    -- ** OpenSearchPartitionInstanceType
+    OpenSearchPartitionInstanceType (..),
+
+    -- ** OpenSearchWarmPartitionInstanceType
+    OpenSearchWarmPartitionInstanceType (..),
+
+    -- ** OptionState
+    OptionState (..),
+
+    -- ** OutboundConnectionStatusCode
+    OutboundConnectionStatusCode (..),
+
+    -- ** OverallChangeStatus
+    OverallChangeStatus (..),
+
+    -- ** PackageStatus
+    PackageStatus (..),
+
+    -- ** PackageType
+    PackageType (..),
+
+    -- ** PrincipalType
+    PrincipalType (..),
+
+    -- ** ReservedInstancePaymentOption
+    ReservedInstancePaymentOption (..),
+
+    -- ** RollbackOnDisable
+    RollbackOnDisable (..),
+
+    -- ** ScheduledAutoTuneActionType
+    ScheduledAutoTuneActionType (..),
+
+    -- ** ScheduledAutoTuneSeverityType
+    ScheduledAutoTuneSeverityType (..),
+
+    -- ** TLSSecurityPolicy
+    TLSSecurityPolicy (..),
+
+    -- ** TimeUnit
+    TimeUnit (..),
+
+    -- ** UpgradeStatus
+    UpgradeStatus (..),
+
+    -- ** UpgradeStep
+    UpgradeStep (..),
+
+    -- ** VolumeType
+    VolumeType (..),
+
+    -- ** VpcEndpointErrorCode
+    VpcEndpointErrorCode (..),
+
+    -- ** VpcEndpointStatus
+    VpcEndpointStatus (..),
+
+    -- ** AWSDomainInformation
+    AWSDomainInformation (AWSDomainInformation'),
+    newAWSDomainInformation,
+
+    -- ** AccessPoliciesStatus
+    AccessPoliciesStatus (AccessPoliciesStatus'),
+    newAccessPoliciesStatus,
+
+    -- ** AdditionalLimit
+    AdditionalLimit (AdditionalLimit'),
+    newAdditionalLimit,
+
+    -- ** AdvancedOptionsStatus
+    AdvancedOptionsStatus (AdvancedOptionsStatus'),
+    newAdvancedOptionsStatus,
+
+    -- ** AdvancedSecurityOptions
+    AdvancedSecurityOptions (AdvancedSecurityOptions'),
+    newAdvancedSecurityOptions,
+
+    -- ** AdvancedSecurityOptionsInput
+    AdvancedSecurityOptionsInput (AdvancedSecurityOptionsInput'),
+    newAdvancedSecurityOptionsInput,
+
+    -- ** AdvancedSecurityOptionsStatus
+    AdvancedSecurityOptionsStatus (AdvancedSecurityOptionsStatus'),
+    newAdvancedSecurityOptionsStatus,
+
+    -- ** AuthorizedPrincipal
+    AuthorizedPrincipal (AuthorizedPrincipal'),
+    newAuthorizedPrincipal,
+
+    -- ** AutoTune
+    AutoTune (AutoTune'),
+    newAutoTune,
+
+    -- ** AutoTuneDetails
+    AutoTuneDetails (AutoTuneDetails'),
+    newAutoTuneDetails,
+
+    -- ** AutoTuneMaintenanceSchedule
+    AutoTuneMaintenanceSchedule (AutoTuneMaintenanceSchedule'),
+    newAutoTuneMaintenanceSchedule,
+
+    -- ** AutoTuneOptions
+    AutoTuneOptions (AutoTuneOptions'),
+    newAutoTuneOptions,
+
+    -- ** AutoTuneOptionsInput
+    AutoTuneOptionsInput (AutoTuneOptionsInput'),
+    newAutoTuneOptionsInput,
+
+    -- ** AutoTuneOptionsOutput
+    AutoTuneOptionsOutput (AutoTuneOptionsOutput'),
+    newAutoTuneOptionsOutput,
+
+    -- ** AutoTuneOptionsStatus
+    AutoTuneOptionsStatus (AutoTuneOptionsStatus'),
+    newAutoTuneOptionsStatus,
+
+    -- ** AutoTuneStatus
+    AutoTuneStatus (AutoTuneStatus'),
+    newAutoTuneStatus,
+
+    -- ** ChangeProgressDetails
+    ChangeProgressDetails (ChangeProgressDetails'),
+    newChangeProgressDetails,
+
+    -- ** ChangeProgressStage
+    ChangeProgressStage (ChangeProgressStage'),
+    newChangeProgressStage,
+
+    -- ** ChangeProgressStatusDetails
+    ChangeProgressStatusDetails (ChangeProgressStatusDetails'),
+    newChangeProgressStatusDetails,
+
+    -- ** ClusterConfig
+    ClusterConfig (ClusterConfig'),
+    newClusterConfig,
+
+    -- ** ClusterConfigStatus
+    ClusterConfigStatus (ClusterConfigStatus'),
+    newClusterConfigStatus,
+
+    -- ** CognitoOptions
+    CognitoOptions (CognitoOptions'),
+    newCognitoOptions,
+
+    -- ** CognitoOptionsStatus
+    CognitoOptionsStatus (CognitoOptionsStatus'),
+    newCognitoOptionsStatus,
+
+    -- ** ColdStorageOptions
+    ColdStorageOptions (ColdStorageOptions'),
+    newColdStorageOptions,
+
+    -- ** CompatibleVersionsMap
+    CompatibleVersionsMap (CompatibleVersionsMap'),
+    newCompatibleVersionsMap,
+
+    -- ** DescribePackagesFilter
+    DescribePackagesFilter (DescribePackagesFilter'),
+    newDescribePackagesFilter,
+
+    -- ** DomainConfig
+    DomainConfig (DomainConfig'),
+    newDomainConfig,
+
+    -- ** DomainEndpointOptions
+    DomainEndpointOptions (DomainEndpointOptions'),
+    newDomainEndpointOptions,
+
+    -- ** DomainEndpointOptionsStatus
+    DomainEndpointOptionsStatus (DomainEndpointOptionsStatus'),
+    newDomainEndpointOptionsStatus,
+
+    -- ** DomainInfo
+    DomainInfo (DomainInfo'),
+    newDomainInfo,
+
+    -- ** DomainInformationContainer
+    DomainInformationContainer (DomainInformationContainer'),
+    newDomainInformationContainer,
+
+    -- ** DomainPackageDetails
+    DomainPackageDetails (DomainPackageDetails'),
+    newDomainPackageDetails,
+
+    -- ** DomainStatus
+    DomainStatus (DomainStatus'),
+    newDomainStatus,
+
+    -- ** DryRunResults
+    DryRunResults (DryRunResults'),
+    newDryRunResults,
+
+    -- ** Duration
+    Duration (Duration'),
+    newDuration,
+
+    -- ** EBSOptions
+    EBSOptions (EBSOptions'),
+    newEBSOptions,
+
+    -- ** EBSOptionsStatus
+    EBSOptionsStatus (EBSOptionsStatus'),
+    newEBSOptionsStatus,
+
+    -- ** EncryptionAtRestOptions
+    EncryptionAtRestOptions (EncryptionAtRestOptions'),
+    newEncryptionAtRestOptions,
+
+    -- ** EncryptionAtRestOptionsStatus
+    EncryptionAtRestOptionsStatus (EncryptionAtRestOptionsStatus'),
+    newEncryptionAtRestOptionsStatus,
+
+    -- ** ErrorDetails
+    ErrorDetails (ErrorDetails'),
+    newErrorDetails,
+
+    -- ** Filter
+    Filter (Filter'),
+    newFilter,
+
+    -- ** InboundConnection
+    InboundConnection (InboundConnection'),
+    newInboundConnection,
+
+    -- ** InboundConnectionStatus
+    InboundConnectionStatus (InboundConnectionStatus'),
+    newInboundConnectionStatus,
+
+    -- ** InstanceCountLimits
+    InstanceCountLimits (InstanceCountLimits'),
+    newInstanceCountLimits,
+
+    -- ** InstanceLimits
+    InstanceLimits (InstanceLimits'),
+    newInstanceLimits,
+
+    -- ** InstanceTypeDetails
+    InstanceTypeDetails (InstanceTypeDetails'),
+    newInstanceTypeDetails,
+
+    -- ** Limits
+    Limits (Limits'),
+    newLimits,
+
+    -- ** LogPublishingOption
+    LogPublishingOption (LogPublishingOption'),
+    newLogPublishingOption,
+
+    -- ** LogPublishingOptionsStatus
+    LogPublishingOptionsStatus (LogPublishingOptionsStatus'),
+    newLogPublishingOptionsStatus,
+
+    -- ** MasterUserOptions
+    MasterUserOptions (MasterUserOptions'),
+    newMasterUserOptions,
+
+    -- ** NodeToNodeEncryptionOptions
+    NodeToNodeEncryptionOptions (NodeToNodeEncryptionOptions'),
+    newNodeToNodeEncryptionOptions,
+
+    -- ** NodeToNodeEncryptionOptionsStatus
+    NodeToNodeEncryptionOptionsStatus (NodeToNodeEncryptionOptionsStatus'),
+    newNodeToNodeEncryptionOptionsStatus,
+
+    -- ** OptionStatus
+    OptionStatus (OptionStatus'),
+    newOptionStatus,
+
+    -- ** OutboundConnection
+    OutboundConnection (OutboundConnection'),
+    newOutboundConnection,
+
+    -- ** OutboundConnectionStatus
+    OutboundConnectionStatus (OutboundConnectionStatus'),
+    newOutboundConnectionStatus,
+
+    -- ** PackageDetails
+    PackageDetails (PackageDetails'),
+    newPackageDetails,
+
+    -- ** PackageSource
+    PackageSource (PackageSource'),
+    newPackageSource,
+
+    -- ** PackageVersionHistory
+    PackageVersionHistory (PackageVersionHistory'),
+    newPackageVersionHistory,
+
+    -- ** RecurringCharge
+    RecurringCharge (RecurringCharge'),
+    newRecurringCharge,
+
+    -- ** ReservedInstance
+    ReservedInstance (ReservedInstance'),
+    newReservedInstance,
+
+    -- ** ReservedInstanceOffering
+    ReservedInstanceOffering (ReservedInstanceOffering'),
+    newReservedInstanceOffering,
+
+    -- ** SAMLIdp
+    SAMLIdp (SAMLIdp'),
+    newSAMLIdp,
+
+    -- ** SAMLOptionsInput
+    SAMLOptionsInput (SAMLOptionsInput'),
+    newSAMLOptionsInput,
+
+    -- ** SAMLOptionsOutput
+    SAMLOptionsOutput (SAMLOptionsOutput'),
+    newSAMLOptionsOutput,
+
+    -- ** ScheduledAutoTuneDetails
+    ScheduledAutoTuneDetails (ScheduledAutoTuneDetails'),
+    newScheduledAutoTuneDetails,
+
+    -- ** ServiceSoftwareOptions
+    ServiceSoftwareOptions (ServiceSoftwareOptions'),
+    newServiceSoftwareOptions,
+
+    -- ** SnapshotOptions
+    SnapshotOptions (SnapshotOptions'),
+    newSnapshotOptions,
+
+    -- ** SnapshotOptionsStatus
+    SnapshotOptionsStatus (SnapshotOptionsStatus'),
+    newSnapshotOptionsStatus,
+
+    -- ** StorageType
+    StorageType (StorageType'),
+    newStorageType,
+
+    -- ** StorageTypeLimit
+    StorageTypeLimit (StorageTypeLimit'),
+    newStorageTypeLimit,
+
+    -- ** Tag
+    Tag (Tag'),
+    newTag,
+
+    -- ** UpgradeHistory
+    UpgradeHistory (UpgradeHistory'),
+    newUpgradeHistory,
+
+    -- ** UpgradeStepItem
+    UpgradeStepItem (UpgradeStepItem'),
+    newUpgradeStepItem,
+
+    -- ** VPCDerivedInfo
+    VPCDerivedInfo (VPCDerivedInfo'),
+    newVPCDerivedInfo,
+
+    -- ** VPCDerivedInfoStatus
+    VPCDerivedInfoStatus (VPCDerivedInfoStatus'),
+    newVPCDerivedInfoStatus,
+
+    -- ** VPCOptions
+    VPCOptions (VPCOptions'),
+    newVPCOptions,
+
+    -- ** VersionStatus
+    VersionStatus (VersionStatus'),
+    newVersionStatus,
+
+    -- ** VpcEndpoint
+    VpcEndpoint (VpcEndpoint'),
+    newVpcEndpoint,
+
+    -- ** VpcEndpointError
+    VpcEndpointError (VpcEndpointError'),
+    newVpcEndpointError,
+
+    -- ** VpcEndpointSummary
+    VpcEndpointSummary (VpcEndpointSummary'),
+    newVpcEndpointSummary,
+
+    -- ** ZoneAwarenessConfig
+    ZoneAwarenessConfig (ZoneAwarenessConfig'),
+    newZoneAwarenessConfig,
+  )
+where
+
+import Amazonka.OpenSearch.AcceptInboundConnection
+import Amazonka.OpenSearch.AddTags
+import Amazonka.OpenSearch.AssociatePackage
+import Amazonka.OpenSearch.AuthorizeVpcEndpointAccess
+import Amazonka.OpenSearch.CancelServiceSoftwareUpdate
+import Amazonka.OpenSearch.CreateDomain
+import Amazonka.OpenSearch.CreateOutboundConnection
+import Amazonka.OpenSearch.CreatePackage
+import Amazonka.OpenSearch.CreateVpcEndpoint
+import Amazonka.OpenSearch.DeleteDomain
+import Amazonka.OpenSearch.DeleteInboundConnection
+import Amazonka.OpenSearch.DeleteOutboundConnection
+import Amazonka.OpenSearch.DeletePackage
+import Amazonka.OpenSearch.DeleteVpcEndpoint
+import Amazonka.OpenSearch.DescribeDomain
+import Amazonka.OpenSearch.DescribeDomainAutoTunes
+import Amazonka.OpenSearch.DescribeDomainChangeProgress
+import Amazonka.OpenSearch.DescribeDomainConfig
+import Amazonka.OpenSearch.DescribeDomains
+import Amazonka.OpenSearch.DescribeInboundConnections
+import Amazonka.OpenSearch.DescribeInstanceTypeLimits
+import Amazonka.OpenSearch.DescribeOutboundConnections
+import Amazonka.OpenSearch.DescribePackages
+import Amazonka.OpenSearch.DescribeReservedInstanceOfferings
+import Amazonka.OpenSearch.DescribeReservedInstances
+import Amazonka.OpenSearch.DescribeVpcEndpoints
+import Amazonka.OpenSearch.DissociatePackage
+import Amazonka.OpenSearch.GetCompatibleVersions
+import Amazonka.OpenSearch.GetPackageVersionHistory
+import Amazonka.OpenSearch.GetUpgradeHistory
+import Amazonka.OpenSearch.GetUpgradeStatus
+import Amazonka.OpenSearch.Lens
+import Amazonka.OpenSearch.ListDomainNames
+import Amazonka.OpenSearch.ListDomainsForPackage
+import Amazonka.OpenSearch.ListInstanceTypeDetails
+import Amazonka.OpenSearch.ListPackagesForDomain
+import Amazonka.OpenSearch.ListTags
+import Amazonka.OpenSearch.ListVersions
+import Amazonka.OpenSearch.ListVpcEndpointAccess
+import Amazonka.OpenSearch.ListVpcEndpoints
+import Amazonka.OpenSearch.ListVpcEndpointsForDomain
+import Amazonka.OpenSearch.PurchaseReservedInstanceOffering
+import Amazonka.OpenSearch.RejectInboundConnection
+import Amazonka.OpenSearch.RemoveTags
+import Amazonka.OpenSearch.RevokeVpcEndpointAccess
+import Amazonka.OpenSearch.StartServiceSoftwareUpdate
+import Amazonka.OpenSearch.Types
+import Amazonka.OpenSearch.UpdateDomainConfig
+import Amazonka.OpenSearch.UpdatePackage
+import Amazonka.OpenSearch.UpdateVpcEndpoint
+import Amazonka.OpenSearch.UpgradeDomain
+import Amazonka.OpenSearch.Waiters
+
+-- $errors
+-- Error matchers are designed for use with the functions provided by
+-- <http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+-- This allows catching (and rethrowing) service specific errors returned
+-- by 'OpenSearch'.
+
+-- $operations
+-- Some AWS operations return results that are incomplete and require subsequent
+-- requests in order to obtain the entire result set. The process of sending
+-- subsequent requests to continue where a previous request left off is called
+-- pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
+-- 1000 objects at a time, and you must send subsequent requests with the
+-- appropriate Marker in order to retrieve the next page of results.
+--
+-- Operations that have an 'AWSPager' instance can transparently perform subsequent
+-- requests, correctly setting Markers and other request facets to iterate through
+-- the entire result set of a truncated API operation. Operations which support
+-- this have an additional note in the documentation.
+--
+-- Many operations have the ability to filter results on the server side. See the
+-- individual operation parameters for details.
+
+-- $waiters
+-- Waiters poll by repeatedly sending a request until some remote success condition
+-- configured by the 'Wait' specification is fulfilled. The 'Wait' specification
+-- determines how many attempts should be made, in addition to delay and retry strategies.
diff --git a/gen/Amazonka/OpenSearch/AcceptInboundConnection.hs b/gen/Amazonka/OpenSearch/AcceptInboundConnection.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/AcceptInboundConnection.hs
@@ -0,0 +1,171 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.AcceptInboundConnection
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Allows the destination Amazon OpenSearch Service domain owner to accept
+-- an inbound cross-cluster search connection request. For more
+-- information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/cross-cluster-search.html Cross-cluster search for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.AcceptInboundConnection
+  ( -- * Creating a Request
+    AcceptInboundConnection (..),
+    newAcceptInboundConnection,
+
+    -- * Request Lenses
+    acceptInboundConnection_connectionId,
+
+    -- * Destructuring the Response
+    AcceptInboundConnectionResponse (..),
+    newAcceptInboundConnectionResponse,
+
+    -- * Response Lenses
+    acceptInboundConnectionResponse_connection,
+    acceptInboundConnectionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @AcceptInboundConnection@ operation.
+--
+-- /See:/ 'newAcceptInboundConnection' smart constructor.
+data AcceptInboundConnection = AcceptInboundConnection'
+  { -- | The ID of the inbound connection to accept.
+    connectionId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AcceptInboundConnection' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connectionId', 'acceptInboundConnection_connectionId' - The ID of the inbound connection to accept.
+newAcceptInboundConnection ::
+  -- | 'connectionId'
+  Prelude.Text ->
+  AcceptInboundConnection
+newAcceptInboundConnection pConnectionId_ =
+  AcceptInboundConnection'
+    { connectionId =
+        pConnectionId_
+    }
+
+-- | The ID of the inbound connection to accept.
+acceptInboundConnection_connectionId :: Lens.Lens' AcceptInboundConnection Prelude.Text
+acceptInboundConnection_connectionId = Lens.lens (\AcceptInboundConnection' {connectionId} -> connectionId) (\s@AcceptInboundConnection' {} a -> s {connectionId = a} :: AcceptInboundConnection)
+
+instance Core.AWSRequest AcceptInboundConnection where
+  type
+    AWSResponse AcceptInboundConnection =
+      AcceptInboundConnectionResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          AcceptInboundConnectionResponse'
+            Prelude.<$> (x Data..?> "Connection")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable AcceptInboundConnection where
+  hashWithSalt _salt AcceptInboundConnection' {..} =
+    _salt `Prelude.hashWithSalt` connectionId
+
+instance Prelude.NFData AcceptInboundConnection where
+  rnf AcceptInboundConnection' {..} =
+    Prelude.rnf connectionId
+
+instance Data.ToHeaders AcceptInboundConnection where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON AcceptInboundConnection where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance Data.ToPath AcceptInboundConnection where
+  toPath AcceptInboundConnection' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/cc/inboundConnection/",
+        Data.toBS connectionId,
+        "/accept"
+      ]
+
+instance Data.ToQuery AcceptInboundConnection where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Contains details about the accepted inbound connection.
+--
+-- /See:/ 'newAcceptInboundConnectionResponse' smart constructor.
+data AcceptInboundConnectionResponse = AcceptInboundConnectionResponse'
+  { -- | Information about the accepted inbound connection.
+    connection :: Prelude.Maybe InboundConnection,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AcceptInboundConnectionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connection', 'acceptInboundConnectionResponse_connection' - Information about the accepted inbound connection.
+--
+-- 'httpStatus', 'acceptInboundConnectionResponse_httpStatus' - The response's http status code.
+newAcceptInboundConnectionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  AcceptInboundConnectionResponse
+newAcceptInboundConnectionResponse pHttpStatus_ =
+  AcceptInboundConnectionResponse'
+    { connection =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the accepted inbound connection.
+acceptInboundConnectionResponse_connection :: Lens.Lens' AcceptInboundConnectionResponse (Prelude.Maybe InboundConnection)
+acceptInboundConnectionResponse_connection = Lens.lens (\AcceptInboundConnectionResponse' {connection} -> connection) (\s@AcceptInboundConnectionResponse' {} a -> s {connection = a} :: AcceptInboundConnectionResponse)
+
+-- | The response's http status code.
+acceptInboundConnectionResponse_httpStatus :: Lens.Lens' AcceptInboundConnectionResponse Prelude.Int
+acceptInboundConnectionResponse_httpStatus = Lens.lens (\AcceptInboundConnectionResponse' {httpStatus} -> httpStatus) (\s@AcceptInboundConnectionResponse' {} a -> s {httpStatus = a} :: AcceptInboundConnectionResponse)
+
+instance
+  Prelude.NFData
+    AcceptInboundConnectionResponse
+  where
+  rnf AcceptInboundConnectionResponse' {..} =
+    Prelude.rnf connection
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/AddTags.hs b/gen/Amazonka/OpenSearch/AddTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/AddTags.hs
@@ -0,0 +1,140 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.AddTags
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Attaches tags to an existing Amazon OpenSearch Service domain. Tags are
+-- a set of case-sensitive key-value pairs. An domain can have up to 10
+-- tags. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains.html#managedomains-awsresorcetagging Tagging Amazon OpenSearch Service domains>.
+module Amazonka.OpenSearch.AddTags
+  ( -- * Creating a Request
+    AddTags (..),
+    newAddTags,
+
+    -- * Request Lenses
+    addTags_arn,
+    addTags_tagList,
+
+    -- * Destructuring the Response
+    AddTagsResponse (..),
+    newAddTagsResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @AddTags@ operation. Specifies the
+-- tags to attach to the domain.
+--
+-- /See:/ 'newAddTags' smart constructor.
+data AddTags = AddTags'
+  { -- | Amazon Resource Name (ARN) for the OpenSearch Service domain to which
+    -- you want to attach resource tags.
+    arn :: Prelude.Text,
+    -- | List of resource tags.
+    tagList :: [Tag]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AddTags' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'addTags_arn' - Amazon Resource Name (ARN) for the OpenSearch Service domain to which
+-- you want to attach resource tags.
+--
+-- 'tagList', 'addTags_tagList' - List of resource tags.
+newAddTags ::
+  -- | 'arn'
+  Prelude.Text ->
+  AddTags
+newAddTags pARN_ =
+  AddTags' {arn = pARN_, tagList = Prelude.mempty}
+
+-- | Amazon Resource Name (ARN) for the OpenSearch Service domain to which
+-- you want to attach resource tags.
+addTags_arn :: Lens.Lens' AddTags Prelude.Text
+addTags_arn = Lens.lens (\AddTags' {arn} -> arn) (\s@AddTags' {} a -> s {arn = a} :: AddTags)
+
+-- | List of resource tags.
+addTags_tagList :: Lens.Lens' AddTags [Tag]
+addTags_tagList = Lens.lens (\AddTags' {tagList} -> tagList) (\s@AddTags' {} a -> s {tagList = a} :: AddTags) Prelude.. Lens.coerced
+
+instance Core.AWSRequest AddTags where
+  type AWSResponse AddTags = AddTagsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response = Response.receiveNull AddTagsResponse'
+
+instance Prelude.Hashable AddTags where
+  hashWithSalt _salt AddTags' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` tagList
+
+instance Prelude.NFData AddTags where
+  rnf AddTags' {..} =
+    Prelude.rnf arn `Prelude.seq` Prelude.rnf tagList
+
+instance Data.ToHeaders AddTags where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON AddTags where
+  toJSON AddTags' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("ARN" Data..= arn),
+            Prelude.Just ("TagList" Data..= tagList)
+          ]
+      )
+
+instance Data.ToPath AddTags where
+  toPath = Prelude.const "/2021-01-01/tags"
+
+instance Data.ToQuery AddTags where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newAddTagsResponse' smart constructor.
+data AddTagsResponse = AddTagsResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AddTagsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newAddTagsResponse ::
+  AddTagsResponse
+newAddTagsResponse = AddTagsResponse'
+
+instance Prelude.NFData AddTagsResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/OpenSearch/AssociatePackage.hs b/gen/Amazonka/OpenSearch/AssociatePackage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/AssociatePackage.hs
@@ -0,0 +1,186 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.AssociatePackage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Associates a package with an Amazon OpenSearch Service domain. For more
+-- information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/custom-packages.html Custom packages for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.AssociatePackage
+  ( -- * Creating a Request
+    AssociatePackage (..),
+    newAssociatePackage,
+
+    -- * Request Lenses
+    associatePackage_packageID,
+    associatePackage_domainName,
+
+    -- * Destructuring the Response
+    AssociatePackageResponse (..),
+    newAssociatePackageResponse,
+
+    -- * Response Lenses
+    associatePackageResponse_domainPackageDetails,
+    associatePackageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to the @AssociatePackage@
+-- operation.
+--
+-- /See:/ 'newAssociatePackage' smart constructor.
+data AssociatePackage = AssociatePackage'
+  { -- | Internal ID of the package to associate with a domain. Use
+    -- @DescribePackages@ to find this value.
+    packageID :: Prelude.Text,
+    -- | Name of the domain to associate the package with.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssociatePackage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'packageID', 'associatePackage_packageID' - Internal ID of the package to associate with a domain. Use
+-- @DescribePackages@ to find this value.
+--
+-- 'domainName', 'associatePackage_domainName' - Name of the domain to associate the package with.
+newAssociatePackage ::
+  -- | 'packageID'
+  Prelude.Text ->
+  -- | 'domainName'
+  Prelude.Text ->
+  AssociatePackage
+newAssociatePackage pPackageID_ pDomainName_ =
+  AssociatePackage'
+    { packageID = pPackageID_,
+      domainName = pDomainName_
+    }
+
+-- | Internal ID of the package to associate with a domain. Use
+-- @DescribePackages@ to find this value.
+associatePackage_packageID :: Lens.Lens' AssociatePackage Prelude.Text
+associatePackage_packageID = Lens.lens (\AssociatePackage' {packageID} -> packageID) (\s@AssociatePackage' {} a -> s {packageID = a} :: AssociatePackage)
+
+-- | Name of the domain to associate the package with.
+associatePackage_domainName :: Lens.Lens' AssociatePackage Prelude.Text
+associatePackage_domainName = Lens.lens (\AssociatePackage' {domainName} -> domainName) (\s@AssociatePackage' {} a -> s {domainName = a} :: AssociatePackage)
+
+instance Core.AWSRequest AssociatePackage where
+  type
+    AWSResponse AssociatePackage =
+      AssociatePackageResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          AssociatePackageResponse'
+            Prelude.<$> (x Data..?> "DomainPackageDetails")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable AssociatePackage where
+  hashWithSalt _salt AssociatePackage' {..} =
+    _salt
+      `Prelude.hashWithSalt` packageID
+      `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData AssociatePackage where
+  rnf AssociatePackage' {..} =
+    Prelude.rnf packageID
+      `Prelude.seq` Prelude.rnf domainName
+
+instance Data.ToHeaders AssociatePackage where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON AssociatePackage where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance Data.ToPath AssociatePackage where
+  toPath AssociatePackage' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/packages/associate/",
+        Data.toBS packageID,
+        "/",
+        Data.toBS domainName
+      ]
+
+instance Data.ToQuery AssociatePackage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Container for the response returned by the @AssociatePackage@ operation.
+--
+-- /See:/ 'newAssociatePackageResponse' smart constructor.
+data AssociatePackageResponse = AssociatePackageResponse'
+  { -- | Information about a package that is associated with a domain.
+    domainPackageDetails :: Prelude.Maybe DomainPackageDetails,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssociatePackageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainPackageDetails', 'associatePackageResponse_domainPackageDetails' - Information about a package that is associated with a domain.
+--
+-- 'httpStatus', 'associatePackageResponse_httpStatus' - The response's http status code.
+newAssociatePackageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  AssociatePackageResponse
+newAssociatePackageResponse pHttpStatus_ =
+  AssociatePackageResponse'
+    { domainPackageDetails =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about a package that is associated with a domain.
+associatePackageResponse_domainPackageDetails :: Lens.Lens' AssociatePackageResponse (Prelude.Maybe DomainPackageDetails)
+associatePackageResponse_domainPackageDetails = Lens.lens (\AssociatePackageResponse' {domainPackageDetails} -> domainPackageDetails) (\s@AssociatePackageResponse' {} a -> s {domainPackageDetails = a} :: AssociatePackageResponse)
+
+-- | The response's http status code.
+associatePackageResponse_httpStatus :: Lens.Lens' AssociatePackageResponse Prelude.Int
+associatePackageResponse_httpStatus = Lens.lens (\AssociatePackageResponse' {httpStatus} -> httpStatus) (\s@AssociatePackageResponse' {} a -> s {httpStatus = a} :: AssociatePackageResponse)
+
+instance Prelude.NFData AssociatePackageResponse where
+  rnf AssociatePackageResponse' {..} =
+    Prelude.rnf domainPackageDetails
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/AuthorizeVpcEndpointAccess.hs b/gen/Amazonka/OpenSearch/AuthorizeVpcEndpointAccess.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/AuthorizeVpcEndpointAccess.hs
@@ -0,0 +1,192 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.AuthorizeVpcEndpointAccess
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides access to an Amazon OpenSearch Service domain through the use
+-- of an interface VPC endpoint.
+module Amazonka.OpenSearch.AuthorizeVpcEndpointAccess
+  ( -- * Creating a Request
+    AuthorizeVpcEndpointAccess (..),
+    newAuthorizeVpcEndpointAccess,
+
+    -- * Request Lenses
+    authorizeVpcEndpointAccess_domainName,
+    authorizeVpcEndpointAccess_account,
+
+    -- * Destructuring the Response
+    AuthorizeVpcEndpointAccessResponse (..),
+    newAuthorizeVpcEndpointAccessResponse,
+
+    -- * Response Lenses
+    authorizeVpcEndpointAccessResponse_httpStatus,
+    authorizeVpcEndpointAccessResponse_authorizedPrincipal,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newAuthorizeVpcEndpointAccess' smart constructor.
+data AuthorizeVpcEndpointAccess = AuthorizeVpcEndpointAccess'
+  { -- | The name of the OpenSearch Service domain to provide access to.
+    domainName :: Prelude.Text,
+    -- | The Amazon Web Services account ID to grant access to.
+    account :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AuthorizeVpcEndpointAccess' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainName', 'authorizeVpcEndpointAccess_domainName' - The name of the OpenSearch Service domain to provide access to.
+--
+-- 'account', 'authorizeVpcEndpointAccess_account' - The Amazon Web Services account ID to grant access to.
+newAuthorizeVpcEndpointAccess ::
+  -- | 'domainName'
+  Prelude.Text ->
+  -- | 'account'
+  Prelude.Text ->
+  AuthorizeVpcEndpointAccess
+newAuthorizeVpcEndpointAccess pDomainName_ pAccount_ =
+  AuthorizeVpcEndpointAccess'
+    { domainName =
+        pDomainName_,
+      account = pAccount_
+    }
+
+-- | The name of the OpenSearch Service domain to provide access to.
+authorizeVpcEndpointAccess_domainName :: Lens.Lens' AuthorizeVpcEndpointAccess Prelude.Text
+authorizeVpcEndpointAccess_domainName = Lens.lens (\AuthorizeVpcEndpointAccess' {domainName} -> domainName) (\s@AuthorizeVpcEndpointAccess' {} a -> s {domainName = a} :: AuthorizeVpcEndpointAccess)
+
+-- | The Amazon Web Services account ID to grant access to.
+authorizeVpcEndpointAccess_account :: Lens.Lens' AuthorizeVpcEndpointAccess Prelude.Text
+authorizeVpcEndpointAccess_account = Lens.lens (\AuthorizeVpcEndpointAccess' {account} -> account) (\s@AuthorizeVpcEndpointAccess' {} a -> s {account = a} :: AuthorizeVpcEndpointAccess)
+
+instance Core.AWSRequest AuthorizeVpcEndpointAccess where
+  type
+    AWSResponse AuthorizeVpcEndpointAccess =
+      AuthorizeVpcEndpointAccessResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          AuthorizeVpcEndpointAccessResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "AuthorizedPrincipal")
+      )
+
+instance Prelude.Hashable AuthorizeVpcEndpointAccess where
+  hashWithSalt _salt AuthorizeVpcEndpointAccess' {..} =
+    _salt
+      `Prelude.hashWithSalt` domainName
+      `Prelude.hashWithSalt` account
+
+instance Prelude.NFData AuthorizeVpcEndpointAccess where
+  rnf AuthorizeVpcEndpointAccess' {..} =
+    Prelude.rnf domainName
+      `Prelude.seq` Prelude.rnf account
+
+instance Data.ToHeaders AuthorizeVpcEndpointAccess where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON AuthorizeVpcEndpointAccess where
+  toJSON AuthorizeVpcEndpointAccess' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("Account" Data..= account)]
+      )
+
+instance Data.ToPath AuthorizeVpcEndpointAccess where
+  toPath AuthorizeVpcEndpointAccess' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/domain/",
+        Data.toBS domainName,
+        "/authorizeVpcEndpointAccess"
+      ]
+
+instance Data.ToQuery AuthorizeVpcEndpointAccess where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newAuthorizeVpcEndpointAccessResponse' smart constructor.
+data AuthorizeVpcEndpointAccessResponse = AuthorizeVpcEndpointAccessResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | Information about the Amazon Web Services account or service that was
+    -- provided access to the domain.
+    authorizedPrincipal :: AuthorizedPrincipal
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AuthorizeVpcEndpointAccessResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'authorizeVpcEndpointAccessResponse_httpStatus' - The response's http status code.
+--
+-- 'authorizedPrincipal', 'authorizeVpcEndpointAccessResponse_authorizedPrincipal' - Information about the Amazon Web Services account or service that was
+-- provided access to the domain.
+newAuthorizeVpcEndpointAccessResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'authorizedPrincipal'
+  AuthorizedPrincipal ->
+  AuthorizeVpcEndpointAccessResponse
+newAuthorizeVpcEndpointAccessResponse
+  pHttpStatus_
+  pAuthorizedPrincipal_ =
+    AuthorizeVpcEndpointAccessResponse'
+      { httpStatus =
+          pHttpStatus_,
+        authorizedPrincipal =
+          pAuthorizedPrincipal_
+      }
+
+-- | The response's http status code.
+authorizeVpcEndpointAccessResponse_httpStatus :: Lens.Lens' AuthorizeVpcEndpointAccessResponse Prelude.Int
+authorizeVpcEndpointAccessResponse_httpStatus = Lens.lens (\AuthorizeVpcEndpointAccessResponse' {httpStatus} -> httpStatus) (\s@AuthorizeVpcEndpointAccessResponse' {} a -> s {httpStatus = a} :: AuthorizeVpcEndpointAccessResponse)
+
+-- | Information about the Amazon Web Services account or service that was
+-- provided access to the domain.
+authorizeVpcEndpointAccessResponse_authorizedPrincipal :: Lens.Lens' AuthorizeVpcEndpointAccessResponse AuthorizedPrincipal
+authorizeVpcEndpointAccessResponse_authorizedPrincipal = Lens.lens (\AuthorizeVpcEndpointAccessResponse' {authorizedPrincipal} -> authorizedPrincipal) (\s@AuthorizeVpcEndpointAccessResponse' {} a -> s {authorizedPrincipal = a} :: AuthorizeVpcEndpointAccessResponse)
+
+instance
+  Prelude.NFData
+    AuthorizeVpcEndpointAccessResponse
+  where
+  rnf AuthorizeVpcEndpointAccessResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf authorizedPrincipal
diff --git a/gen/Amazonka/OpenSearch/CancelServiceSoftwareUpdate.hs b/gen/Amazonka/OpenSearch/CancelServiceSoftwareUpdate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/CancelServiceSoftwareUpdate.hs
@@ -0,0 +1,181 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.CancelServiceSoftwareUpdate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Cancels a scheduled service software update for an Amazon OpenSearch
+-- Service domain. You can only perform this operation before the
+-- @AutomatedUpdateDate@ and when the domain\'s @UpdateStatus@ is
+-- @PENDING_UPDATE@. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/service-software.html Service software updates in Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.CancelServiceSoftwareUpdate
+  ( -- * Creating a Request
+    CancelServiceSoftwareUpdate (..),
+    newCancelServiceSoftwareUpdate,
+
+    -- * Request Lenses
+    cancelServiceSoftwareUpdate_domainName,
+
+    -- * Destructuring the Response
+    CancelServiceSoftwareUpdateResponse (..),
+    newCancelServiceSoftwareUpdateResponse,
+
+    -- * Response Lenses
+    cancelServiceSoftwareUpdateResponse_serviceSoftwareOptions,
+    cancelServiceSoftwareUpdateResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to cancel a service software
+-- update.
+--
+-- /See:/ 'newCancelServiceSoftwareUpdate' smart constructor.
+data CancelServiceSoftwareUpdate = CancelServiceSoftwareUpdate'
+  { -- | Name of the OpenSearch Service domain that you want to cancel the
+    -- service software update on.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CancelServiceSoftwareUpdate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainName', 'cancelServiceSoftwareUpdate_domainName' - Name of the OpenSearch Service domain that you want to cancel the
+-- service software update on.
+newCancelServiceSoftwareUpdate ::
+  -- | 'domainName'
+  Prelude.Text ->
+  CancelServiceSoftwareUpdate
+newCancelServiceSoftwareUpdate pDomainName_ =
+  CancelServiceSoftwareUpdate'
+    { domainName =
+        pDomainName_
+    }
+
+-- | Name of the OpenSearch Service domain that you want to cancel the
+-- service software update on.
+cancelServiceSoftwareUpdate_domainName :: Lens.Lens' CancelServiceSoftwareUpdate Prelude.Text
+cancelServiceSoftwareUpdate_domainName = Lens.lens (\CancelServiceSoftwareUpdate' {domainName} -> domainName) (\s@CancelServiceSoftwareUpdate' {} a -> s {domainName = a} :: CancelServiceSoftwareUpdate)
+
+instance Core.AWSRequest CancelServiceSoftwareUpdate where
+  type
+    AWSResponse CancelServiceSoftwareUpdate =
+      CancelServiceSoftwareUpdateResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CancelServiceSoftwareUpdateResponse'
+            Prelude.<$> (x Data..?> "ServiceSoftwareOptions")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CancelServiceSoftwareUpdate where
+  hashWithSalt _salt CancelServiceSoftwareUpdate' {..} =
+    _salt `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData CancelServiceSoftwareUpdate where
+  rnf CancelServiceSoftwareUpdate' {..} =
+    Prelude.rnf domainName
+
+instance Data.ToHeaders CancelServiceSoftwareUpdate where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON CancelServiceSoftwareUpdate where
+  toJSON CancelServiceSoftwareUpdate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("DomainName" Data..= domainName)]
+      )
+
+instance Data.ToPath CancelServiceSoftwareUpdate where
+  toPath =
+    Prelude.const
+      "/2021-01-01/opensearch/serviceSoftwareUpdate/cancel"
+
+instance Data.ToQuery CancelServiceSoftwareUpdate where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Container for the response to a @CancelServiceSoftwareUpdate@ operation.
+-- Contains the status of the update.
+--
+-- /See:/ 'newCancelServiceSoftwareUpdateResponse' smart constructor.
+data CancelServiceSoftwareUpdateResponse = CancelServiceSoftwareUpdateResponse'
+  { -- | Container for the state of your domain relative to the latest service
+    -- software.
+    serviceSoftwareOptions :: Prelude.Maybe ServiceSoftwareOptions,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CancelServiceSoftwareUpdateResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'serviceSoftwareOptions', 'cancelServiceSoftwareUpdateResponse_serviceSoftwareOptions' - Container for the state of your domain relative to the latest service
+-- software.
+--
+-- 'httpStatus', 'cancelServiceSoftwareUpdateResponse_httpStatus' - The response's http status code.
+newCancelServiceSoftwareUpdateResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CancelServiceSoftwareUpdateResponse
+newCancelServiceSoftwareUpdateResponse pHttpStatus_ =
+  CancelServiceSoftwareUpdateResponse'
+    { serviceSoftwareOptions =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Container for the state of your domain relative to the latest service
+-- software.
+cancelServiceSoftwareUpdateResponse_serviceSoftwareOptions :: Lens.Lens' CancelServiceSoftwareUpdateResponse (Prelude.Maybe ServiceSoftwareOptions)
+cancelServiceSoftwareUpdateResponse_serviceSoftwareOptions = Lens.lens (\CancelServiceSoftwareUpdateResponse' {serviceSoftwareOptions} -> serviceSoftwareOptions) (\s@CancelServiceSoftwareUpdateResponse' {} a -> s {serviceSoftwareOptions = a} :: CancelServiceSoftwareUpdateResponse)
+
+-- | The response's http status code.
+cancelServiceSoftwareUpdateResponse_httpStatus :: Lens.Lens' CancelServiceSoftwareUpdateResponse Prelude.Int
+cancelServiceSoftwareUpdateResponse_httpStatus = Lens.lens (\CancelServiceSoftwareUpdateResponse' {httpStatus} -> httpStatus) (\s@CancelServiceSoftwareUpdateResponse' {} a -> s {httpStatus = a} :: CancelServiceSoftwareUpdateResponse)
+
+instance
+  Prelude.NFData
+    CancelServiceSoftwareUpdateResponse
+  where
+  rnf CancelServiceSoftwareUpdateResponse' {..} =
+    Prelude.rnf serviceSoftwareOptions
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/CreateDomain.hs b/gen/Amazonka/OpenSearch/CreateDomain.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/CreateDomain.hs
@@ -0,0 +1,492 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.CreateDomain
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an Amazon OpenSearch Service domain. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html Creating and managing Amazon OpenSearch Service domains>.
+module Amazonka.OpenSearch.CreateDomain
+  ( -- * Creating a Request
+    CreateDomain (..),
+    newCreateDomain,
+
+    -- * Request Lenses
+    createDomain_accessPolicies,
+    createDomain_advancedOptions,
+    createDomain_advancedSecurityOptions,
+    createDomain_autoTuneOptions,
+    createDomain_clusterConfig,
+    createDomain_cognitoOptions,
+    createDomain_domainEndpointOptions,
+    createDomain_eBSOptions,
+    createDomain_encryptionAtRestOptions,
+    createDomain_engineVersion,
+    createDomain_logPublishingOptions,
+    createDomain_nodeToNodeEncryptionOptions,
+    createDomain_snapshotOptions,
+    createDomain_tagList,
+    createDomain_vPCOptions,
+    createDomain_domainName,
+
+    -- * Destructuring the Response
+    CreateDomainResponse (..),
+    newCreateDomainResponse,
+
+    -- * Response Lenses
+    createDomainResponse_domainStatus,
+    createDomainResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateDomain' smart constructor.
+data CreateDomain = CreateDomain'
+  { -- | Identity and Access Management (IAM) policy document specifying the
+    -- access policies for the new domain.
+    accessPolicies :: Prelude.Maybe Prelude.Text,
+    -- | Key-value pairs to specify advanced configuration options. The following
+    -- key-value pairs are supported:
+    --
+    -- -   @\"rest.action.multi.allow_explicit_index\": \"true\" | \"false\"@ -
+    --     Note the use of a string rather than a boolean. Specifies whether
+    --     explicit references to indexes are allowed inside the body of HTTP
+    --     requests. If you want to configure access policies for domain
+    --     sub-resources, such as specific indexes and domain APIs, you must
+    --     disable this property. Default is true.
+    --
+    -- -   @\"indices.fielddata.cache.size\": \"80\" @ - Note the use of a
+    --     string rather than a boolean. Specifies the percentage of heap space
+    --     allocated to field data. Default is unbounded.
+    --
+    -- -   @\"indices.query.bool.max_clause_count\": \"1024\"@ - Note the use
+    --     of a string rather than a boolean. Specifies the maximum number of
+    --     clauses allowed in a Lucene boolean query. Default is 1,024. Queries
+    --     with more than the permitted number of clauses result in a
+    --     @TooManyClauses@ error.
+    --
+    -- -   @\"override_main_response_version\": \"true\" | \"false\"@ - Note
+    --     the use of a string rather than a boolean. Specifies whether the
+    --     domain reports its version as 7.10 to allow Elasticsearch OSS
+    --     clients and plugins to continue working with it. Default is false
+    --     when creating a domain and true when upgrading a domain.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomain-configure-advanced-options Advanced cluster parameters>.
+    advancedOptions :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Options for fine-grained access control.
+    advancedSecurityOptions :: Prelude.Maybe AdvancedSecurityOptionsInput,
+    -- | Options for Auto-Tune.
+    autoTuneOptions :: Prelude.Maybe AutoTuneOptionsInput,
+    -- | Container for the cluster configuration of a domain.
+    clusterConfig :: Prelude.Maybe ClusterConfig,
+    -- | Key-value pairs to configure Amazon Cognito authentication. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/cognito-auth.html Configuring Amazon Cognito authentication for OpenSearch Dashboards>.
+    cognitoOptions :: Prelude.Maybe CognitoOptions,
+    -- | Additional options for the domain endpoint, such as whether to require
+    -- HTTPS for all traffic.
+    domainEndpointOptions :: Prelude.Maybe DomainEndpointOptions,
+    -- | Container for the parameters required to enable EBS-based storage for an
+    -- OpenSearch Service domain.
+    eBSOptions :: Prelude.Maybe EBSOptions,
+    -- | Key-value pairs to enable encryption at rest.
+    encryptionAtRestOptions :: Prelude.Maybe EncryptionAtRestOptions,
+    -- | String of format Elasticsearch_X.Y or OpenSearch_X.Y to specify the
+    -- engine version for the OpenSearch Service domain. For example,
+    -- @OpenSearch_1.0@ or @Elasticsearch_7.9@. For more information, see
+    -- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomains Creating and managing Amazon OpenSearch Service domains>.
+    engineVersion :: Prelude.Maybe Prelude.Text,
+    -- | Key-value pairs to configure slow log publishing.
+    logPublishingOptions :: Prelude.Maybe (Prelude.HashMap LogType LogPublishingOption),
+    -- | Enables node-to-node encryption.
+    nodeToNodeEncryptionOptions :: Prelude.Maybe NodeToNodeEncryptionOptions,
+    -- | DEPRECATED. Container for the parameters required to configure automated
+    -- snapshots of domain indexes.
+    snapshotOptions :: Prelude.Maybe SnapshotOptions,
+    -- | List of tags to add to the domain upon creation.
+    tagList :: Prelude.Maybe [Tag],
+    -- | Container for the values required to configure VPC access domains. If
+    -- you don\'t specify these values, OpenSearch Service creates the domain
+    -- with a public endpoint. For more information, see
+    -- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html Launching your Amazon OpenSearch Service domains using a VPC>.
+    vPCOptions :: Prelude.Maybe VPCOptions,
+    -- | Name of the OpenSearch Service domain to create. Domain names are unique
+    -- across the domains owned by an account within an Amazon Web Services
+    -- Region.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDomain' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'accessPolicies', 'createDomain_accessPolicies' - Identity and Access Management (IAM) policy document specifying the
+-- access policies for the new domain.
+--
+-- 'advancedOptions', 'createDomain_advancedOptions' - Key-value pairs to specify advanced configuration options. The following
+-- key-value pairs are supported:
+--
+-- -   @\"rest.action.multi.allow_explicit_index\": \"true\" | \"false\"@ -
+--     Note the use of a string rather than a boolean. Specifies whether
+--     explicit references to indexes are allowed inside the body of HTTP
+--     requests. If you want to configure access policies for domain
+--     sub-resources, such as specific indexes and domain APIs, you must
+--     disable this property. Default is true.
+--
+-- -   @\"indices.fielddata.cache.size\": \"80\" @ - Note the use of a
+--     string rather than a boolean. Specifies the percentage of heap space
+--     allocated to field data. Default is unbounded.
+--
+-- -   @\"indices.query.bool.max_clause_count\": \"1024\"@ - Note the use
+--     of a string rather than a boolean. Specifies the maximum number of
+--     clauses allowed in a Lucene boolean query. Default is 1,024. Queries
+--     with more than the permitted number of clauses result in a
+--     @TooManyClauses@ error.
+--
+-- -   @\"override_main_response_version\": \"true\" | \"false\"@ - Note
+--     the use of a string rather than a boolean. Specifies whether the
+--     domain reports its version as 7.10 to allow Elasticsearch OSS
+--     clients and plugins to continue working with it. Default is false
+--     when creating a domain and true when upgrading a domain.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomain-configure-advanced-options Advanced cluster parameters>.
+--
+-- 'advancedSecurityOptions', 'createDomain_advancedSecurityOptions' - Options for fine-grained access control.
+--
+-- 'autoTuneOptions', 'createDomain_autoTuneOptions' - Options for Auto-Tune.
+--
+-- 'clusterConfig', 'createDomain_clusterConfig' - Container for the cluster configuration of a domain.
+--
+-- 'cognitoOptions', 'createDomain_cognitoOptions' - Key-value pairs to configure Amazon Cognito authentication. For more
+-- information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/cognito-auth.html Configuring Amazon Cognito authentication for OpenSearch Dashboards>.
+--
+-- 'domainEndpointOptions', 'createDomain_domainEndpointOptions' - Additional options for the domain endpoint, such as whether to require
+-- HTTPS for all traffic.
+--
+-- 'eBSOptions', 'createDomain_eBSOptions' - Container for the parameters required to enable EBS-based storage for an
+-- OpenSearch Service domain.
+--
+-- 'encryptionAtRestOptions', 'createDomain_encryptionAtRestOptions' - Key-value pairs to enable encryption at rest.
+--
+-- 'engineVersion', 'createDomain_engineVersion' - String of format Elasticsearch_X.Y or OpenSearch_X.Y to specify the
+-- engine version for the OpenSearch Service domain. For example,
+-- @OpenSearch_1.0@ or @Elasticsearch_7.9@. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomains Creating and managing Amazon OpenSearch Service domains>.
+--
+-- 'logPublishingOptions', 'createDomain_logPublishingOptions' - Key-value pairs to configure slow log publishing.
+--
+-- 'nodeToNodeEncryptionOptions', 'createDomain_nodeToNodeEncryptionOptions' - Enables node-to-node encryption.
+--
+-- 'snapshotOptions', 'createDomain_snapshotOptions' - DEPRECATED. Container for the parameters required to configure automated
+-- snapshots of domain indexes.
+--
+-- 'tagList', 'createDomain_tagList' - List of tags to add to the domain upon creation.
+--
+-- 'vPCOptions', 'createDomain_vPCOptions' - Container for the values required to configure VPC access domains. If
+-- you don\'t specify these values, OpenSearch Service creates the domain
+-- with a public endpoint. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html Launching your Amazon OpenSearch Service domains using a VPC>.
+--
+-- 'domainName', 'createDomain_domainName' - Name of the OpenSearch Service domain to create. Domain names are unique
+-- across the domains owned by an account within an Amazon Web Services
+-- Region.
+newCreateDomain ::
+  -- | 'domainName'
+  Prelude.Text ->
+  CreateDomain
+newCreateDomain pDomainName_ =
+  CreateDomain'
+    { accessPolicies = Prelude.Nothing,
+      advancedOptions = Prelude.Nothing,
+      advancedSecurityOptions = Prelude.Nothing,
+      autoTuneOptions = Prelude.Nothing,
+      clusterConfig = Prelude.Nothing,
+      cognitoOptions = Prelude.Nothing,
+      domainEndpointOptions = Prelude.Nothing,
+      eBSOptions = Prelude.Nothing,
+      encryptionAtRestOptions = Prelude.Nothing,
+      engineVersion = Prelude.Nothing,
+      logPublishingOptions = Prelude.Nothing,
+      nodeToNodeEncryptionOptions = Prelude.Nothing,
+      snapshotOptions = Prelude.Nothing,
+      tagList = Prelude.Nothing,
+      vPCOptions = Prelude.Nothing,
+      domainName = pDomainName_
+    }
+
+-- | Identity and Access Management (IAM) policy document specifying the
+-- access policies for the new domain.
+createDomain_accessPolicies :: Lens.Lens' CreateDomain (Prelude.Maybe Prelude.Text)
+createDomain_accessPolicies = Lens.lens (\CreateDomain' {accessPolicies} -> accessPolicies) (\s@CreateDomain' {} a -> s {accessPolicies = a} :: CreateDomain)
+
+-- | Key-value pairs to specify advanced configuration options. The following
+-- key-value pairs are supported:
+--
+-- -   @\"rest.action.multi.allow_explicit_index\": \"true\" | \"false\"@ -
+--     Note the use of a string rather than a boolean. Specifies whether
+--     explicit references to indexes are allowed inside the body of HTTP
+--     requests. If you want to configure access policies for domain
+--     sub-resources, such as specific indexes and domain APIs, you must
+--     disable this property. Default is true.
+--
+-- -   @\"indices.fielddata.cache.size\": \"80\" @ - Note the use of a
+--     string rather than a boolean. Specifies the percentage of heap space
+--     allocated to field data. Default is unbounded.
+--
+-- -   @\"indices.query.bool.max_clause_count\": \"1024\"@ - Note the use
+--     of a string rather than a boolean. Specifies the maximum number of
+--     clauses allowed in a Lucene boolean query. Default is 1,024. Queries
+--     with more than the permitted number of clauses result in a
+--     @TooManyClauses@ error.
+--
+-- -   @\"override_main_response_version\": \"true\" | \"false\"@ - Note
+--     the use of a string rather than a boolean. Specifies whether the
+--     domain reports its version as 7.10 to allow Elasticsearch OSS
+--     clients and plugins to continue working with it. Default is false
+--     when creating a domain and true when upgrading a domain.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomain-configure-advanced-options Advanced cluster parameters>.
+createDomain_advancedOptions :: Lens.Lens' CreateDomain (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createDomain_advancedOptions = Lens.lens (\CreateDomain' {advancedOptions} -> advancedOptions) (\s@CreateDomain' {} a -> s {advancedOptions = a} :: CreateDomain) Prelude.. Lens.mapping Lens.coerced
+
+-- | Options for fine-grained access control.
+createDomain_advancedSecurityOptions :: Lens.Lens' CreateDomain (Prelude.Maybe AdvancedSecurityOptionsInput)
+createDomain_advancedSecurityOptions = Lens.lens (\CreateDomain' {advancedSecurityOptions} -> advancedSecurityOptions) (\s@CreateDomain' {} a -> s {advancedSecurityOptions = a} :: CreateDomain)
+
+-- | Options for Auto-Tune.
+createDomain_autoTuneOptions :: Lens.Lens' CreateDomain (Prelude.Maybe AutoTuneOptionsInput)
+createDomain_autoTuneOptions = Lens.lens (\CreateDomain' {autoTuneOptions} -> autoTuneOptions) (\s@CreateDomain' {} a -> s {autoTuneOptions = a} :: CreateDomain)
+
+-- | Container for the cluster configuration of a domain.
+createDomain_clusterConfig :: Lens.Lens' CreateDomain (Prelude.Maybe ClusterConfig)
+createDomain_clusterConfig = Lens.lens (\CreateDomain' {clusterConfig} -> clusterConfig) (\s@CreateDomain' {} a -> s {clusterConfig = a} :: CreateDomain)
+
+-- | Key-value pairs to configure Amazon Cognito authentication. For more
+-- information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/cognito-auth.html Configuring Amazon Cognito authentication for OpenSearch Dashboards>.
+createDomain_cognitoOptions :: Lens.Lens' CreateDomain (Prelude.Maybe CognitoOptions)
+createDomain_cognitoOptions = Lens.lens (\CreateDomain' {cognitoOptions} -> cognitoOptions) (\s@CreateDomain' {} a -> s {cognitoOptions = a} :: CreateDomain)
+
+-- | Additional options for the domain endpoint, such as whether to require
+-- HTTPS for all traffic.
+createDomain_domainEndpointOptions :: Lens.Lens' CreateDomain (Prelude.Maybe DomainEndpointOptions)
+createDomain_domainEndpointOptions = Lens.lens (\CreateDomain' {domainEndpointOptions} -> domainEndpointOptions) (\s@CreateDomain' {} a -> s {domainEndpointOptions = a} :: CreateDomain)
+
+-- | Container for the parameters required to enable EBS-based storage for an
+-- OpenSearch Service domain.
+createDomain_eBSOptions :: Lens.Lens' CreateDomain (Prelude.Maybe EBSOptions)
+createDomain_eBSOptions = Lens.lens (\CreateDomain' {eBSOptions} -> eBSOptions) (\s@CreateDomain' {} a -> s {eBSOptions = a} :: CreateDomain)
+
+-- | Key-value pairs to enable encryption at rest.
+createDomain_encryptionAtRestOptions :: Lens.Lens' CreateDomain (Prelude.Maybe EncryptionAtRestOptions)
+createDomain_encryptionAtRestOptions = Lens.lens (\CreateDomain' {encryptionAtRestOptions} -> encryptionAtRestOptions) (\s@CreateDomain' {} a -> s {encryptionAtRestOptions = a} :: CreateDomain)
+
+-- | String of format Elasticsearch_X.Y or OpenSearch_X.Y to specify the
+-- engine version for the OpenSearch Service domain. For example,
+-- @OpenSearch_1.0@ or @Elasticsearch_7.9@. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomains Creating and managing Amazon OpenSearch Service domains>.
+createDomain_engineVersion :: Lens.Lens' CreateDomain (Prelude.Maybe Prelude.Text)
+createDomain_engineVersion = Lens.lens (\CreateDomain' {engineVersion} -> engineVersion) (\s@CreateDomain' {} a -> s {engineVersion = a} :: CreateDomain)
+
+-- | Key-value pairs to configure slow log publishing.
+createDomain_logPublishingOptions :: Lens.Lens' CreateDomain (Prelude.Maybe (Prelude.HashMap LogType LogPublishingOption))
+createDomain_logPublishingOptions = Lens.lens (\CreateDomain' {logPublishingOptions} -> logPublishingOptions) (\s@CreateDomain' {} a -> s {logPublishingOptions = a} :: CreateDomain) Prelude.. Lens.mapping Lens.coerced
+
+-- | Enables node-to-node encryption.
+createDomain_nodeToNodeEncryptionOptions :: Lens.Lens' CreateDomain (Prelude.Maybe NodeToNodeEncryptionOptions)
+createDomain_nodeToNodeEncryptionOptions = Lens.lens (\CreateDomain' {nodeToNodeEncryptionOptions} -> nodeToNodeEncryptionOptions) (\s@CreateDomain' {} a -> s {nodeToNodeEncryptionOptions = a} :: CreateDomain)
+
+-- | DEPRECATED. Container for the parameters required to configure automated
+-- snapshots of domain indexes.
+createDomain_snapshotOptions :: Lens.Lens' CreateDomain (Prelude.Maybe SnapshotOptions)
+createDomain_snapshotOptions = Lens.lens (\CreateDomain' {snapshotOptions} -> snapshotOptions) (\s@CreateDomain' {} a -> s {snapshotOptions = a} :: CreateDomain)
+
+-- | List of tags to add to the domain upon creation.
+createDomain_tagList :: Lens.Lens' CreateDomain (Prelude.Maybe [Tag])
+createDomain_tagList = Lens.lens (\CreateDomain' {tagList} -> tagList) (\s@CreateDomain' {} a -> s {tagList = a} :: CreateDomain) Prelude.. Lens.mapping Lens.coerced
+
+-- | Container for the values required to configure VPC access domains. If
+-- you don\'t specify these values, OpenSearch Service creates the domain
+-- with a public endpoint. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html Launching your Amazon OpenSearch Service domains using a VPC>.
+createDomain_vPCOptions :: Lens.Lens' CreateDomain (Prelude.Maybe VPCOptions)
+createDomain_vPCOptions = Lens.lens (\CreateDomain' {vPCOptions} -> vPCOptions) (\s@CreateDomain' {} a -> s {vPCOptions = a} :: CreateDomain)
+
+-- | Name of the OpenSearch Service domain to create. Domain names are unique
+-- across the domains owned by an account within an Amazon Web Services
+-- Region.
+createDomain_domainName :: Lens.Lens' CreateDomain Prelude.Text
+createDomain_domainName = Lens.lens (\CreateDomain' {domainName} -> domainName) (\s@CreateDomain' {} a -> s {domainName = a} :: CreateDomain)
+
+instance Core.AWSRequest CreateDomain where
+  type AWSResponse CreateDomain = CreateDomainResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateDomainResponse'
+            Prelude.<$> (x Data..?> "DomainStatus")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateDomain where
+  hashWithSalt _salt CreateDomain' {..} =
+    _salt
+      `Prelude.hashWithSalt` accessPolicies
+      `Prelude.hashWithSalt` advancedOptions
+      `Prelude.hashWithSalt` advancedSecurityOptions
+      `Prelude.hashWithSalt` autoTuneOptions
+      `Prelude.hashWithSalt` clusterConfig
+      `Prelude.hashWithSalt` cognitoOptions
+      `Prelude.hashWithSalt` domainEndpointOptions
+      `Prelude.hashWithSalt` eBSOptions
+      `Prelude.hashWithSalt` encryptionAtRestOptions
+      `Prelude.hashWithSalt` engineVersion
+      `Prelude.hashWithSalt` logPublishingOptions
+      `Prelude.hashWithSalt` nodeToNodeEncryptionOptions
+      `Prelude.hashWithSalt` snapshotOptions
+      `Prelude.hashWithSalt` tagList
+      `Prelude.hashWithSalt` vPCOptions
+      `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData CreateDomain where
+  rnf CreateDomain' {..} =
+    Prelude.rnf accessPolicies
+      `Prelude.seq` Prelude.rnf advancedOptions
+      `Prelude.seq` Prelude.rnf advancedSecurityOptions
+      `Prelude.seq` Prelude.rnf autoTuneOptions
+      `Prelude.seq` Prelude.rnf clusterConfig
+      `Prelude.seq` Prelude.rnf cognitoOptions
+      `Prelude.seq` Prelude.rnf domainEndpointOptions
+      `Prelude.seq` Prelude.rnf eBSOptions
+      `Prelude.seq` Prelude.rnf encryptionAtRestOptions
+      `Prelude.seq` Prelude.rnf engineVersion
+      `Prelude.seq` Prelude.rnf logPublishingOptions
+      `Prelude.seq` Prelude.rnf nodeToNodeEncryptionOptions
+      `Prelude.seq` Prelude.rnf snapshotOptions
+      `Prelude.seq` Prelude.rnf tagList
+      `Prelude.seq` Prelude.rnf vPCOptions
+      `Prelude.seq` Prelude.rnf domainName
+
+instance Data.ToHeaders CreateDomain where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON CreateDomain where
+  toJSON CreateDomain' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AccessPolicies" Data..=)
+              Prelude.<$> accessPolicies,
+            ("AdvancedOptions" Data..=)
+              Prelude.<$> advancedOptions,
+            ("AdvancedSecurityOptions" Data..=)
+              Prelude.<$> advancedSecurityOptions,
+            ("AutoTuneOptions" Data..=)
+              Prelude.<$> autoTuneOptions,
+            ("ClusterConfig" Data..=) Prelude.<$> clusterConfig,
+            ("CognitoOptions" Data..=)
+              Prelude.<$> cognitoOptions,
+            ("DomainEndpointOptions" Data..=)
+              Prelude.<$> domainEndpointOptions,
+            ("EBSOptions" Data..=) Prelude.<$> eBSOptions,
+            ("EncryptionAtRestOptions" Data..=)
+              Prelude.<$> encryptionAtRestOptions,
+            ("EngineVersion" Data..=) Prelude.<$> engineVersion,
+            ("LogPublishingOptions" Data..=)
+              Prelude.<$> logPublishingOptions,
+            ("NodeToNodeEncryptionOptions" Data..=)
+              Prelude.<$> nodeToNodeEncryptionOptions,
+            ("SnapshotOptions" Data..=)
+              Prelude.<$> snapshotOptions,
+            ("TagList" Data..=) Prelude.<$> tagList,
+            ("VPCOptions" Data..=) Prelude.<$> vPCOptions,
+            Prelude.Just ("DomainName" Data..= domainName)
+          ]
+      )
+
+instance Data.ToPath CreateDomain where
+  toPath =
+    Prelude.const "/2021-01-01/opensearch/domain"
+
+instance Data.ToQuery CreateDomain where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The result of a @CreateDomain@ operation. Contains the status of the
+-- newly created domain.
+--
+-- /See:/ 'newCreateDomainResponse' smart constructor.
+data CreateDomainResponse = CreateDomainResponse'
+  { -- | The status of the newly created domain.
+    domainStatus :: Prelude.Maybe DomainStatus,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDomainResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainStatus', 'createDomainResponse_domainStatus' - The status of the newly created domain.
+--
+-- 'httpStatus', 'createDomainResponse_httpStatus' - The response's http status code.
+newCreateDomainResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateDomainResponse
+newCreateDomainResponse pHttpStatus_ =
+  CreateDomainResponse'
+    { domainStatus =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The status of the newly created domain.
+createDomainResponse_domainStatus :: Lens.Lens' CreateDomainResponse (Prelude.Maybe DomainStatus)
+createDomainResponse_domainStatus = Lens.lens (\CreateDomainResponse' {domainStatus} -> domainStatus) (\s@CreateDomainResponse' {} a -> s {domainStatus = a} :: CreateDomainResponse)
+
+-- | The response's http status code.
+createDomainResponse_httpStatus :: Lens.Lens' CreateDomainResponse Prelude.Int
+createDomainResponse_httpStatus = Lens.lens (\CreateDomainResponse' {httpStatus} -> httpStatus) (\s@CreateDomainResponse' {} a -> s {httpStatus = a} :: CreateDomainResponse)
+
+instance Prelude.NFData CreateDomainResponse where
+  rnf CreateDomainResponse' {..} =
+    Prelude.rnf domainStatus
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/CreateOutboundConnection.hs b/gen/Amazonka/OpenSearch/CreateOutboundConnection.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/CreateOutboundConnection.hs
@@ -0,0 +1,263 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.CreateOutboundConnection
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a new cross-cluster search connection from a source Amazon
+-- OpenSearch Service domain to a destination domain. For more information,
+-- see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/cross-cluster-search.html Cross-cluster search for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.CreateOutboundConnection
+  ( -- * Creating a Request
+    CreateOutboundConnection (..),
+    newCreateOutboundConnection,
+
+    -- * Request Lenses
+    createOutboundConnection_localDomainInfo,
+    createOutboundConnection_remoteDomainInfo,
+    createOutboundConnection_connectionAlias,
+
+    -- * Destructuring the Response
+    CreateOutboundConnectionResponse (..),
+    newCreateOutboundConnectionResponse,
+
+    -- * Response Lenses
+    createOutboundConnectionResponse_connectionAlias,
+    createOutboundConnectionResponse_connectionId,
+    createOutboundConnectionResponse_connectionStatus,
+    createOutboundConnectionResponse_localDomainInfo,
+    createOutboundConnectionResponse_remoteDomainInfo,
+    createOutboundConnectionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @CreateOutboundConnection@
+-- operation.
+--
+-- /See:/ 'newCreateOutboundConnection' smart constructor.
+data CreateOutboundConnection = CreateOutboundConnection'
+  { -- | Name and Region of the source (local) domain.
+    localDomainInfo :: DomainInformationContainer,
+    -- | Name and Region of the destination (remote) domain.
+    remoteDomainInfo :: DomainInformationContainer,
+    -- | Name of the connection.
+    connectionAlias :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateOutboundConnection' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'localDomainInfo', 'createOutboundConnection_localDomainInfo' - Name and Region of the source (local) domain.
+--
+-- 'remoteDomainInfo', 'createOutboundConnection_remoteDomainInfo' - Name and Region of the destination (remote) domain.
+--
+-- 'connectionAlias', 'createOutboundConnection_connectionAlias' - Name of the connection.
+newCreateOutboundConnection ::
+  -- | 'localDomainInfo'
+  DomainInformationContainer ->
+  -- | 'remoteDomainInfo'
+  DomainInformationContainer ->
+  -- | 'connectionAlias'
+  Prelude.Text ->
+  CreateOutboundConnection
+newCreateOutboundConnection
+  pLocalDomainInfo_
+  pRemoteDomainInfo_
+  pConnectionAlias_ =
+    CreateOutboundConnection'
+      { localDomainInfo =
+          pLocalDomainInfo_,
+        remoteDomainInfo = pRemoteDomainInfo_,
+        connectionAlias = pConnectionAlias_
+      }
+
+-- | Name and Region of the source (local) domain.
+createOutboundConnection_localDomainInfo :: Lens.Lens' CreateOutboundConnection DomainInformationContainer
+createOutboundConnection_localDomainInfo = Lens.lens (\CreateOutboundConnection' {localDomainInfo} -> localDomainInfo) (\s@CreateOutboundConnection' {} a -> s {localDomainInfo = a} :: CreateOutboundConnection)
+
+-- | Name and Region of the destination (remote) domain.
+createOutboundConnection_remoteDomainInfo :: Lens.Lens' CreateOutboundConnection DomainInformationContainer
+createOutboundConnection_remoteDomainInfo = Lens.lens (\CreateOutboundConnection' {remoteDomainInfo} -> remoteDomainInfo) (\s@CreateOutboundConnection' {} a -> s {remoteDomainInfo = a} :: CreateOutboundConnection)
+
+-- | Name of the connection.
+createOutboundConnection_connectionAlias :: Lens.Lens' CreateOutboundConnection Prelude.Text
+createOutboundConnection_connectionAlias = Lens.lens (\CreateOutboundConnection' {connectionAlias} -> connectionAlias) (\s@CreateOutboundConnection' {} a -> s {connectionAlias = a} :: CreateOutboundConnection)
+
+instance Core.AWSRequest CreateOutboundConnection where
+  type
+    AWSResponse CreateOutboundConnection =
+      CreateOutboundConnectionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateOutboundConnectionResponse'
+            Prelude.<$> (x Data..?> "ConnectionAlias")
+            Prelude.<*> (x Data..?> "ConnectionId")
+            Prelude.<*> (x Data..?> "ConnectionStatus")
+            Prelude.<*> (x Data..?> "LocalDomainInfo")
+            Prelude.<*> (x Data..?> "RemoteDomainInfo")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateOutboundConnection where
+  hashWithSalt _salt CreateOutboundConnection' {..} =
+    _salt
+      `Prelude.hashWithSalt` localDomainInfo
+      `Prelude.hashWithSalt` remoteDomainInfo
+      `Prelude.hashWithSalt` connectionAlias
+
+instance Prelude.NFData CreateOutboundConnection where
+  rnf CreateOutboundConnection' {..} =
+    Prelude.rnf localDomainInfo
+      `Prelude.seq` Prelude.rnf remoteDomainInfo
+      `Prelude.seq` Prelude.rnf connectionAlias
+
+instance Data.ToHeaders CreateOutboundConnection where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON CreateOutboundConnection where
+  toJSON CreateOutboundConnection' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("LocalDomainInfo" Data..= localDomainInfo),
+            Prelude.Just
+              ("RemoteDomainInfo" Data..= remoteDomainInfo),
+            Prelude.Just
+              ("ConnectionAlias" Data..= connectionAlias)
+          ]
+      )
+
+instance Data.ToPath CreateOutboundConnection where
+  toPath =
+    Prelude.const
+      "/2021-01-01/opensearch/cc/outboundConnection"
+
+instance Data.ToQuery CreateOutboundConnection where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The result of a @CreateOutboundConnection@ request. Contains details
+-- about the newly created cross-cluster connection.
+--
+-- /See:/ 'newCreateOutboundConnectionResponse' smart constructor.
+data CreateOutboundConnectionResponse = CreateOutboundConnectionResponse'
+  { -- | Name of the connection.
+    connectionAlias :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the created outbound connection, which is used
+    -- for subsequent operations on the connection.
+    connectionId :: Prelude.Maybe Prelude.Text,
+    -- | The status of the connection.
+    connectionStatus :: Prelude.Maybe OutboundConnectionStatus,
+    -- | Information about the source (local) domain.
+    localDomainInfo :: Prelude.Maybe DomainInformationContainer,
+    -- | Information about the destination (remote) domain.
+    remoteDomainInfo :: Prelude.Maybe DomainInformationContainer,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateOutboundConnectionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connectionAlias', 'createOutboundConnectionResponse_connectionAlias' - Name of the connection.
+--
+-- 'connectionId', 'createOutboundConnectionResponse_connectionId' - The unique identifier for the created outbound connection, which is used
+-- for subsequent operations on the connection.
+--
+-- 'connectionStatus', 'createOutboundConnectionResponse_connectionStatus' - The status of the connection.
+--
+-- 'localDomainInfo', 'createOutboundConnectionResponse_localDomainInfo' - Information about the source (local) domain.
+--
+-- 'remoteDomainInfo', 'createOutboundConnectionResponse_remoteDomainInfo' - Information about the destination (remote) domain.
+--
+-- 'httpStatus', 'createOutboundConnectionResponse_httpStatus' - The response's http status code.
+newCreateOutboundConnectionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateOutboundConnectionResponse
+newCreateOutboundConnectionResponse pHttpStatus_ =
+  CreateOutboundConnectionResponse'
+    { connectionAlias =
+        Prelude.Nothing,
+      connectionId = Prelude.Nothing,
+      connectionStatus = Prelude.Nothing,
+      localDomainInfo = Prelude.Nothing,
+      remoteDomainInfo = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Name of the connection.
+createOutboundConnectionResponse_connectionAlias :: Lens.Lens' CreateOutboundConnectionResponse (Prelude.Maybe Prelude.Text)
+createOutboundConnectionResponse_connectionAlias = Lens.lens (\CreateOutboundConnectionResponse' {connectionAlias} -> connectionAlias) (\s@CreateOutboundConnectionResponse' {} a -> s {connectionAlias = a} :: CreateOutboundConnectionResponse)
+
+-- | The unique identifier for the created outbound connection, which is used
+-- for subsequent operations on the connection.
+createOutboundConnectionResponse_connectionId :: Lens.Lens' CreateOutboundConnectionResponse (Prelude.Maybe Prelude.Text)
+createOutboundConnectionResponse_connectionId = Lens.lens (\CreateOutboundConnectionResponse' {connectionId} -> connectionId) (\s@CreateOutboundConnectionResponse' {} a -> s {connectionId = a} :: CreateOutboundConnectionResponse)
+
+-- | The status of the connection.
+createOutboundConnectionResponse_connectionStatus :: Lens.Lens' CreateOutboundConnectionResponse (Prelude.Maybe OutboundConnectionStatus)
+createOutboundConnectionResponse_connectionStatus = Lens.lens (\CreateOutboundConnectionResponse' {connectionStatus} -> connectionStatus) (\s@CreateOutboundConnectionResponse' {} a -> s {connectionStatus = a} :: CreateOutboundConnectionResponse)
+
+-- | Information about the source (local) domain.
+createOutboundConnectionResponse_localDomainInfo :: Lens.Lens' CreateOutboundConnectionResponse (Prelude.Maybe DomainInformationContainer)
+createOutboundConnectionResponse_localDomainInfo = Lens.lens (\CreateOutboundConnectionResponse' {localDomainInfo} -> localDomainInfo) (\s@CreateOutboundConnectionResponse' {} a -> s {localDomainInfo = a} :: CreateOutboundConnectionResponse)
+
+-- | Information about the destination (remote) domain.
+createOutboundConnectionResponse_remoteDomainInfo :: Lens.Lens' CreateOutboundConnectionResponse (Prelude.Maybe DomainInformationContainer)
+createOutboundConnectionResponse_remoteDomainInfo = Lens.lens (\CreateOutboundConnectionResponse' {remoteDomainInfo} -> remoteDomainInfo) (\s@CreateOutboundConnectionResponse' {} a -> s {remoteDomainInfo = a} :: CreateOutboundConnectionResponse)
+
+-- | The response's http status code.
+createOutboundConnectionResponse_httpStatus :: Lens.Lens' CreateOutboundConnectionResponse Prelude.Int
+createOutboundConnectionResponse_httpStatus = Lens.lens (\CreateOutboundConnectionResponse' {httpStatus} -> httpStatus) (\s@CreateOutboundConnectionResponse' {} a -> s {httpStatus = a} :: CreateOutboundConnectionResponse)
+
+instance
+  Prelude.NFData
+    CreateOutboundConnectionResponse
+  where
+  rnf CreateOutboundConnectionResponse' {..} =
+    Prelude.rnf connectionAlias
+      `Prelude.seq` Prelude.rnf connectionId
+      `Prelude.seq` Prelude.rnf connectionStatus
+      `Prelude.seq` Prelude.rnf localDomainInfo
+      `Prelude.seq` Prelude.rnf remoteDomainInfo
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/CreatePackage.hs b/gen/Amazonka/OpenSearch/CreatePackage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/CreatePackage.hs
@@ -0,0 +1,216 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.CreatePackage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a package for use with Amazon OpenSearch Service domains. For
+-- more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/custom-packages.html Custom packages for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.CreatePackage
+  ( -- * Creating a Request
+    CreatePackage (..),
+    newCreatePackage,
+
+    -- * Request Lenses
+    createPackage_packageDescription,
+    createPackage_packageName,
+    createPackage_packageType,
+    createPackage_packageSource,
+
+    -- * Destructuring the Response
+    CreatePackageResponse (..),
+    newCreatePackageResponse,
+
+    -- * Response Lenses
+    createPackageResponse_packageDetails,
+    createPackageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for request parameters to the @CreatePackage@ operation.
+--
+-- /See:/ 'newCreatePackage' smart constructor.
+data CreatePackage = CreatePackage'
+  { -- | Description of the package.
+    packageDescription :: Prelude.Maybe Prelude.Text,
+    -- | Unique name for the package.
+    packageName :: Prelude.Text,
+    -- | Type of package.
+    packageType :: PackageType,
+    -- | The Amazon S3 location from which to import the package.
+    packageSource :: PackageSource
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreatePackage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'packageDescription', 'createPackage_packageDescription' - Description of the package.
+--
+-- 'packageName', 'createPackage_packageName' - Unique name for the package.
+--
+-- 'packageType', 'createPackage_packageType' - Type of package.
+--
+-- 'packageSource', 'createPackage_packageSource' - The Amazon S3 location from which to import the package.
+newCreatePackage ::
+  -- | 'packageName'
+  Prelude.Text ->
+  -- | 'packageType'
+  PackageType ->
+  -- | 'packageSource'
+  PackageSource ->
+  CreatePackage
+newCreatePackage
+  pPackageName_
+  pPackageType_
+  pPackageSource_ =
+    CreatePackage'
+      { packageDescription =
+          Prelude.Nothing,
+        packageName = pPackageName_,
+        packageType = pPackageType_,
+        packageSource = pPackageSource_
+      }
+
+-- | Description of the package.
+createPackage_packageDescription :: Lens.Lens' CreatePackage (Prelude.Maybe Prelude.Text)
+createPackage_packageDescription = Lens.lens (\CreatePackage' {packageDescription} -> packageDescription) (\s@CreatePackage' {} a -> s {packageDescription = a} :: CreatePackage)
+
+-- | Unique name for the package.
+createPackage_packageName :: Lens.Lens' CreatePackage Prelude.Text
+createPackage_packageName = Lens.lens (\CreatePackage' {packageName} -> packageName) (\s@CreatePackage' {} a -> s {packageName = a} :: CreatePackage)
+
+-- | Type of package.
+createPackage_packageType :: Lens.Lens' CreatePackage PackageType
+createPackage_packageType = Lens.lens (\CreatePackage' {packageType} -> packageType) (\s@CreatePackage' {} a -> s {packageType = a} :: CreatePackage)
+
+-- | The Amazon S3 location from which to import the package.
+createPackage_packageSource :: Lens.Lens' CreatePackage PackageSource
+createPackage_packageSource = Lens.lens (\CreatePackage' {packageSource} -> packageSource) (\s@CreatePackage' {} a -> s {packageSource = a} :: CreatePackage)
+
+instance Core.AWSRequest CreatePackage where
+  type
+    AWSResponse CreatePackage =
+      CreatePackageResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreatePackageResponse'
+            Prelude.<$> (x Data..?> "PackageDetails")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreatePackage where
+  hashWithSalt _salt CreatePackage' {..} =
+    _salt
+      `Prelude.hashWithSalt` packageDescription
+      `Prelude.hashWithSalt` packageName
+      `Prelude.hashWithSalt` packageType
+      `Prelude.hashWithSalt` packageSource
+
+instance Prelude.NFData CreatePackage where
+  rnf CreatePackage' {..} =
+    Prelude.rnf packageDescription
+      `Prelude.seq` Prelude.rnf packageName
+      `Prelude.seq` Prelude.rnf packageType
+      `Prelude.seq` Prelude.rnf packageSource
+
+instance Data.ToHeaders CreatePackage where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON CreatePackage where
+  toJSON CreatePackage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("PackageDescription" Data..=)
+              Prelude.<$> packageDescription,
+            Prelude.Just ("PackageName" Data..= packageName),
+            Prelude.Just ("PackageType" Data..= packageType),
+            Prelude.Just
+              ("PackageSource" Data..= packageSource)
+          ]
+      )
+
+instance Data.ToPath CreatePackage where
+  toPath = Prelude.const "/2021-01-01/packages"
+
+instance Data.ToQuery CreatePackage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Container for the response returned by the @CreatePackage@ operation.
+--
+-- /See:/ 'newCreatePackageResponse' smart constructor.
+data CreatePackageResponse = CreatePackageResponse'
+  { -- | Basic information about an OpenSearch Service package.
+    packageDetails :: Prelude.Maybe PackageDetails,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreatePackageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'packageDetails', 'createPackageResponse_packageDetails' - Basic information about an OpenSearch Service package.
+--
+-- 'httpStatus', 'createPackageResponse_httpStatus' - The response's http status code.
+newCreatePackageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreatePackageResponse
+newCreatePackageResponse pHttpStatus_ =
+  CreatePackageResponse'
+    { packageDetails =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Basic information about an OpenSearch Service package.
+createPackageResponse_packageDetails :: Lens.Lens' CreatePackageResponse (Prelude.Maybe PackageDetails)
+createPackageResponse_packageDetails = Lens.lens (\CreatePackageResponse' {packageDetails} -> packageDetails) (\s@CreatePackageResponse' {} a -> s {packageDetails = a} :: CreatePackageResponse)
+
+-- | The response's http status code.
+createPackageResponse_httpStatus :: Lens.Lens' CreatePackageResponse Prelude.Int
+createPackageResponse_httpStatus = Lens.lens (\CreatePackageResponse' {httpStatus} -> httpStatus) (\s@CreatePackageResponse' {} a -> s {httpStatus = a} :: CreatePackageResponse)
+
+instance Prelude.NFData CreatePackageResponse where
+  rnf CreatePackageResponse' {..} =
+    Prelude.rnf packageDetails
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/CreateVpcEndpoint.hs b/gen/Amazonka/OpenSearch/CreateVpcEndpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/CreateVpcEndpoint.hs
@@ -0,0 +1,194 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.CreateVpcEndpoint
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an Amazon OpenSearch Service-managed VPC endpoint.
+module Amazonka.OpenSearch.CreateVpcEndpoint
+  ( -- * Creating a Request
+    CreateVpcEndpoint (..),
+    newCreateVpcEndpoint,
+
+    -- * Request Lenses
+    createVpcEndpoint_clientToken,
+    createVpcEndpoint_domainArn,
+    createVpcEndpoint_vpcOptions,
+
+    -- * Destructuring the Response
+    CreateVpcEndpointResponse (..),
+    newCreateVpcEndpointResponse,
+
+    -- * Response Lenses
+    createVpcEndpointResponse_httpStatus,
+    createVpcEndpointResponse_vpcEndpoint,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateVpcEndpoint' smart constructor.
+data CreateVpcEndpoint = CreateVpcEndpoint'
+  { -- | Unique, case-sensitive identifier to ensure idempotency of the request.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the domain to grant access to.
+    domainArn :: Prelude.Text,
+    -- | Options to specify the subnets and security groups for the endpoint.
+    vpcOptions :: VPCOptions
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVpcEndpoint' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createVpcEndpoint_clientToken' - Unique, case-sensitive identifier to ensure idempotency of the request.
+--
+-- 'domainArn', 'createVpcEndpoint_domainArn' - The Amazon Resource Name (ARN) of the domain to grant access to.
+--
+-- 'vpcOptions', 'createVpcEndpoint_vpcOptions' - Options to specify the subnets and security groups for the endpoint.
+newCreateVpcEndpoint ::
+  -- | 'domainArn'
+  Prelude.Text ->
+  -- | 'vpcOptions'
+  VPCOptions ->
+  CreateVpcEndpoint
+newCreateVpcEndpoint pDomainArn_ pVpcOptions_ =
+  CreateVpcEndpoint'
+    { clientToken = Prelude.Nothing,
+      domainArn = pDomainArn_,
+      vpcOptions = pVpcOptions_
+    }
+
+-- | Unique, case-sensitive identifier to ensure idempotency of the request.
+createVpcEndpoint_clientToken :: Lens.Lens' CreateVpcEndpoint (Prelude.Maybe Prelude.Text)
+createVpcEndpoint_clientToken = Lens.lens (\CreateVpcEndpoint' {clientToken} -> clientToken) (\s@CreateVpcEndpoint' {} a -> s {clientToken = a} :: CreateVpcEndpoint)
+
+-- | The Amazon Resource Name (ARN) of the domain to grant access to.
+createVpcEndpoint_domainArn :: Lens.Lens' CreateVpcEndpoint Prelude.Text
+createVpcEndpoint_domainArn = Lens.lens (\CreateVpcEndpoint' {domainArn} -> domainArn) (\s@CreateVpcEndpoint' {} a -> s {domainArn = a} :: CreateVpcEndpoint)
+
+-- | Options to specify the subnets and security groups for the endpoint.
+createVpcEndpoint_vpcOptions :: Lens.Lens' CreateVpcEndpoint VPCOptions
+createVpcEndpoint_vpcOptions = Lens.lens (\CreateVpcEndpoint' {vpcOptions} -> vpcOptions) (\s@CreateVpcEndpoint' {} a -> s {vpcOptions = a} :: CreateVpcEndpoint)
+
+instance Core.AWSRequest CreateVpcEndpoint where
+  type
+    AWSResponse CreateVpcEndpoint =
+      CreateVpcEndpointResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateVpcEndpointResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "VpcEndpoint")
+      )
+
+instance Prelude.Hashable CreateVpcEndpoint where
+  hashWithSalt _salt CreateVpcEndpoint' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` domainArn
+      `Prelude.hashWithSalt` vpcOptions
+
+instance Prelude.NFData CreateVpcEndpoint where
+  rnf CreateVpcEndpoint' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf domainArn
+      `Prelude.seq` Prelude.rnf vpcOptions
+
+instance Data.ToHeaders CreateVpcEndpoint where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON CreateVpcEndpoint where
+  toJSON CreateVpcEndpoint' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("DomainArn" Data..= domainArn),
+            Prelude.Just ("VpcOptions" Data..= vpcOptions)
+          ]
+      )
+
+instance Data.ToPath CreateVpcEndpoint where
+  toPath =
+    Prelude.const "/2021-01-01/opensearch/vpcEndpoints"
+
+instance Data.ToQuery CreateVpcEndpoint where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateVpcEndpointResponse' smart constructor.
+data CreateVpcEndpointResponse = CreateVpcEndpointResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | Information about the newly created VPC endpoint.
+    vpcEndpoint :: VpcEndpoint
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVpcEndpointResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createVpcEndpointResponse_httpStatus' - The response's http status code.
+--
+-- 'vpcEndpoint', 'createVpcEndpointResponse_vpcEndpoint' - Information about the newly created VPC endpoint.
+newCreateVpcEndpointResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'vpcEndpoint'
+  VpcEndpoint ->
+  CreateVpcEndpointResponse
+newCreateVpcEndpointResponse
+  pHttpStatus_
+  pVpcEndpoint_ =
+    CreateVpcEndpointResponse'
+      { httpStatus =
+          pHttpStatus_,
+        vpcEndpoint = pVpcEndpoint_
+      }
+
+-- | The response's http status code.
+createVpcEndpointResponse_httpStatus :: Lens.Lens' CreateVpcEndpointResponse Prelude.Int
+createVpcEndpointResponse_httpStatus = Lens.lens (\CreateVpcEndpointResponse' {httpStatus} -> httpStatus) (\s@CreateVpcEndpointResponse' {} a -> s {httpStatus = a} :: CreateVpcEndpointResponse)
+
+-- | Information about the newly created VPC endpoint.
+createVpcEndpointResponse_vpcEndpoint :: Lens.Lens' CreateVpcEndpointResponse VpcEndpoint
+createVpcEndpointResponse_vpcEndpoint = Lens.lens (\CreateVpcEndpointResponse' {vpcEndpoint} -> vpcEndpoint) (\s@CreateVpcEndpointResponse' {} a -> s {vpcEndpoint = a} :: CreateVpcEndpointResponse)
+
+instance Prelude.NFData CreateVpcEndpointResponse where
+  rnf CreateVpcEndpointResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf vpcEndpoint
diff --git a/gen/Amazonka/OpenSearch/DeleteDomain.hs b/gen/Amazonka/OpenSearch/DeleteDomain.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DeleteDomain.hs
@@ -0,0 +1,158 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DeleteDomain
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an Amazon OpenSearch Service domain and all of its data. You
+-- can\'t recover a domain after you delete it.
+module Amazonka.OpenSearch.DeleteDomain
+  ( -- * Creating a Request
+    DeleteDomain (..),
+    newDeleteDomain,
+
+    -- * Request Lenses
+    deleteDomain_domainName,
+
+    -- * Destructuring the Response
+    DeleteDomainResponse (..),
+    newDeleteDomainResponse,
+
+    -- * Response Lenses
+    deleteDomainResponse_domainStatus,
+    deleteDomainResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @DeleteDomain@ operation.
+--
+-- /See:/ 'newDeleteDomain' smart constructor.
+data DeleteDomain = DeleteDomain'
+  { -- | The name of the domain you want to permanently delete.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDomain' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainName', 'deleteDomain_domainName' - The name of the domain you want to permanently delete.
+newDeleteDomain ::
+  -- | 'domainName'
+  Prelude.Text ->
+  DeleteDomain
+newDeleteDomain pDomainName_ =
+  DeleteDomain' {domainName = pDomainName_}
+
+-- | The name of the domain you want to permanently delete.
+deleteDomain_domainName :: Lens.Lens' DeleteDomain Prelude.Text
+deleteDomain_domainName = Lens.lens (\DeleteDomain' {domainName} -> domainName) (\s@DeleteDomain' {} a -> s {domainName = a} :: DeleteDomain)
+
+instance Core.AWSRequest DeleteDomain where
+  type AWSResponse DeleteDomain = DeleteDomainResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteDomainResponse'
+            Prelude.<$> (x Data..?> "DomainStatus")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteDomain where
+  hashWithSalt _salt DeleteDomain' {..} =
+    _salt `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData DeleteDomain where
+  rnf DeleteDomain' {..} = Prelude.rnf domainName
+
+instance Data.ToHeaders DeleteDomain where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DeleteDomain where
+  toPath DeleteDomain' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/domain/",
+        Data.toBS domainName
+      ]
+
+instance Data.ToQuery DeleteDomain where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The results of a @DeleteDomain@ request. Contains the status of the
+-- pending deletion, or a \"domain not found\" error if the domain and all
+-- of its resources have been deleted.
+--
+-- /See:/ 'newDeleteDomainResponse' smart constructor.
+data DeleteDomainResponse = DeleteDomainResponse'
+  { -- | The status of the domain being deleted.
+    domainStatus :: Prelude.Maybe DomainStatus,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDomainResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainStatus', 'deleteDomainResponse_domainStatus' - The status of the domain being deleted.
+--
+-- 'httpStatus', 'deleteDomainResponse_httpStatus' - The response's http status code.
+newDeleteDomainResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteDomainResponse
+newDeleteDomainResponse pHttpStatus_ =
+  DeleteDomainResponse'
+    { domainStatus =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The status of the domain being deleted.
+deleteDomainResponse_domainStatus :: Lens.Lens' DeleteDomainResponse (Prelude.Maybe DomainStatus)
+deleteDomainResponse_domainStatus = Lens.lens (\DeleteDomainResponse' {domainStatus} -> domainStatus) (\s@DeleteDomainResponse' {} a -> s {domainStatus = a} :: DeleteDomainResponse)
+
+-- | The response's http status code.
+deleteDomainResponse_httpStatus :: Lens.Lens' DeleteDomainResponse Prelude.Int
+deleteDomainResponse_httpStatus = Lens.lens (\DeleteDomainResponse' {httpStatus} -> httpStatus) (\s@DeleteDomainResponse' {} a -> s {httpStatus = a} :: DeleteDomainResponse)
+
+instance Prelude.NFData DeleteDomainResponse where
+  rnf DeleteDomainResponse' {..} =
+    Prelude.rnf domainStatus
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/DeleteInboundConnection.hs b/gen/Amazonka/OpenSearch/DeleteInboundConnection.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DeleteInboundConnection.hs
@@ -0,0 +1,168 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DeleteInboundConnection
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Allows the destination Amazon OpenSearch Service domain owner to delete
+-- an existing inbound cross-cluster search connection. For more
+-- information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/cross-cluster-search.html Cross-cluster search for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.DeleteInboundConnection
+  ( -- * Creating a Request
+    DeleteInboundConnection (..),
+    newDeleteInboundConnection,
+
+    -- * Request Lenses
+    deleteInboundConnection_connectionId,
+
+    -- * Destructuring the Response
+    DeleteInboundConnectionResponse (..),
+    newDeleteInboundConnectionResponse,
+
+    -- * Response Lenses
+    deleteInboundConnectionResponse_connection,
+    deleteInboundConnectionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @DeleteInboundConnection@ operation.
+--
+-- /See:/ 'newDeleteInboundConnection' smart constructor.
+data DeleteInboundConnection = DeleteInboundConnection'
+  { -- | The ID of the inbound connection to permanently delete.
+    connectionId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteInboundConnection' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connectionId', 'deleteInboundConnection_connectionId' - The ID of the inbound connection to permanently delete.
+newDeleteInboundConnection ::
+  -- | 'connectionId'
+  Prelude.Text ->
+  DeleteInboundConnection
+newDeleteInboundConnection pConnectionId_ =
+  DeleteInboundConnection'
+    { connectionId =
+        pConnectionId_
+    }
+
+-- | The ID of the inbound connection to permanently delete.
+deleteInboundConnection_connectionId :: Lens.Lens' DeleteInboundConnection Prelude.Text
+deleteInboundConnection_connectionId = Lens.lens (\DeleteInboundConnection' {connectionId} -> connectionId) (\s@DeleteInboundConnection' {} a -> s {connectionId = a} :: DeleteInboundConnection)
+
+instance Core.AWSRequest DeleteInboundConnection where
+  type
+    AWSResponse DeleteInboundConnection =
+      DeleteInboundConnectionResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteInboundConnectionResponse'
+            Prelude.<$> (x Data..?> "Connection")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteInboundConnection where
+  hashWithSalt _salt DeleteInboundConnection' {..} =
+    _salt `Prelude.hashWithSalt` connectionId
+
+instance Prelude.NFData DeleteInboundConnection where
+  rnf DeleteInboundConnection' {..} =
+    Prelude.rnf connectionId
+
+instance Data.ToHeaders DeleteInboundConnection where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DeleteInboundConnection where
+  toPath DeleteInboundConnection' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/cc/inboundConnection/",
+        Data.toBS connectionId
+      ]
+
+instance Data.ToQuery DeleteInboundConnection where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The results of a @DeleteInboundConnection@ operation. Contains details
+-- about the deleted inbound connection.
+--
+-- /See:/ 'newDeleteInboundConnectionResponse' smart constructor.
+data DeleteInboundConnectionResponse = DeleteInboundConnectionResponse'
+  { -- | The deleted inbound connection.
+    connection :: Prelude.Maybe InboundConnection,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteInboundConnectionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connection', 'deleteInboundConnectionResponse_connection' - The deleted inbound connection.
+--
+-- 'httpStatus', 'deleteInboundConnectionResponse_httpStatus' - The response's http status code.
+newDeleteInboundConnectionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteInboundConnectionResponse
+newDeleteInboundConnectionResponse pHttpStatus_ =
+  DeleteInboundConnectionResponse'
+    { connection =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The deleted inbound connection.
+deleteInboundConnectionResponse_connection :: Lens.Lens' DeleteInboundConnectionResponse (Prelude.Maybe InboundConnection)
+deleteInboundConnectionResponse_connection = Lens.lens (\DeleteInboundConnectionResponse' {connection} -> connection) (\s@DeleteInboundConnectionResponse' {} a -> s {connection = a} :: DeleteInboundConnectionResponse)
+
+-- | The response's http status code.
+deleteInboundConnectionResponse_httpStatus :: Lens.Lens' DeleteInboundConnectionResponse Prelude.Int
+deleteInboundConnectionResponse_httpStatus = Lens.lens (\DeleteInboundConnectionResponse' {httpStatus} -> httpStatus) (\s@DeleteInboundConnectionResponse' {} a -> s {httpStatus = a} :: DeleteInboundConnectionResponse)
+
+instance
+  Prelude.NFData
+    DeleteInboundConnectionResponse
+  where
+  rnf DeleteInboundConnectionResponse' {..} =
+    Prelude.rnf connection
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/DeleteOutboundConnection.hs b/gen/Amazonka/OpenSearch/DeleteOutboundConnection.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DeleteOutboundConnection.hs
@@ -0,0 +1,168 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DeleteOutboundConnection
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Allows the source Amazon OpenSearch Service domain owner to delete an
+-- existing outbound cross-cluster search connection. For more information,
+-- see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/cross-cluster-search.html Cross-cluster search for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.DeleteOutboundConnection
+  ( -- * Creating a Request
+    DeleteOutboundConnection (..),
+    newDeleteOutboundConnection,
+
+    -- * Request Lenses
+    deleteOutboundConnection_connectionId,
+
+    -- * Destructuring the Response
+    DeleteOutboundConnectionResponse (..),
+    newDeleteOutboundConnectionResponse,
+
+    -- * Response Lenses
+    deleteOutboundConnectionResponse_connection,
+    deleteOutboundConnectionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @DeleteOutboundConnection@
+-- operation.
+--
+-- /See:/ 'newDeleteOutboundConnection' smart constructor.
+data DeleteOutboundConnection = DeleteOutboundConnection'
+  { -- | The ID of the outbound connection you want to permanently delete.
+    connectionId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteOutboundConnection' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connectionId', 'deleteOutboundConnection_connectionId' - The ID of the outbound connection you want to permanently delete.
+newDeleteOutboundConnection ::
+  -- | 'connectionId'
+  Prelude.Text ->
+  DeleteOutboundConnection
+newDeleteOutboundConnection pConnectionId_ =
+  DeleteOutboundConnection'
+    { connectionId =
+        pConnectionId_
+    }
+
+-- | The ID of the outbound connection you want to permanently delete.
+deleteOutboundConnection_connectionId :: Lens.Lens' DeleteOutboundConnection Prelude.Text
+deleteOutboundConnection_connectionId = Lens.lens (\DeleteOutboundConnection' {connectionId} -> connectionId) (\s@DeleteOutboundConnection' {} a -> s {connectionId = a} :: DeleteOutboundConnection)
+
+instance Core.AWSRequest DeleteOutboundConnection where
+  type
+    AWSResponse DeleteOutboundConnection =
+      DeleteOutboundConnectionResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteOutboundConnectionResponse'
+            Prelude.<$> (x Data..?> "Connection")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteOutboundConnection where
+  hashWithSalt _salt DeleteOutboundConnection' {..} =
+    _salt `Prelude.hashWithSalt` connectionId
+
+instance Prelude.NFData DeleteOutboundConnection where
+  rnf DeleteOutboundConnection' {..} =
+    Prelude.rnf connectionId
+
+instance Data.ToHeaders DeleteOutboundConnection where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DeleteOutboundConnection where
+  toPath DeleteOutboundConnection' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/cc/outboundConnection/",
+        Data.toBS connectionId
+      ]
+
+instance Data.ToQuery DeleteOutboundConnection where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Details about the deleted outbound connection.
+--
+-- /See:/ 'newDeleteOutboundConnectionResponse' smart constructor.
+data DeleteOutboundConnectionResponse = DeleteOutboundConnectionResponse'
+  { -- | The deleted inbound connection.
+    connection :: Prelude.Maybe OutboundConnection,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteOutboundConnectionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connection', 'deleteOutboundConnectionResponse_connection' - The deleted inbound connection.
+--
+-- 'httpStatus', 'deleteOutboundConnectionResponse_httpStatus' - The response's http status code.
+newDeleteOutboundConnectionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteOutboundConnectionResponse
+newDeleteOutboundConnectionResponse pHttpStatus_ =
+  DeleteOutboundConnectionResponse'
+    { connection =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The deleted inbound connection.
+deleteOutboundConnectionResponse_connection :: Lens.Lens' DeleteOutboundConnectionResponse (Prelude.Maybe OutboundConnection)
+deleteOutboundConnectionResponse_connection = Lens.lens (\DeleteOutboundConnectionResponse' {connection} -> connection) (\s@DeleteOutboundConnectionResponse' {} a -> s {connection = a} :: DeleteOutboundConnectionResponse)
+
+-- | The response's http status code.
+deleteOutboundConnectionResponse_httpStatus :: Lens.Lens' DeleteOutboundConnectionResponse Prelude.Int
+deleteOutboundConnectionResponse_httpStatus = Lens.lens (\DeleteOutboundConnectionResponse' {httpStatus} -> httpStatus) (\s@DeleteOutboundConnectionResponse' {} a -> s {httpStatus = a} :: DeleteOutboundConnectionResponse)
+
+instance
+  Prelude.NFData
+    DeleteOutboundConnectionResponse
+  where
+  rnf DeleteOutboundConnectionResponse' {..} =
+    Prelude.rnf connection
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/DeletePackage.hs b/gen/Amazonka/OpenSearch/DeletePackage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DeletePackage.hs
@@ -0,0 +1,160 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DeletePackage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an Amazon OpenSearch Service package. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/custom-packages.html Custom packages for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.DeletePackage
+  ( -- * Creating a Request
+    DeletePackage (..),
+    newDeletePackage,
+
+    -- * Request Lenses
+    deletePackage_packageID,
+
+    -- * Destructuring the Response
+    DeletePackageResponse (..),
+    newDeletePackageResponse,
+
+    -- * Response Lenses
+    deletePackageResponse_packageDetails,
+    deletePackageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Deletes a package from OpenSearch Service. The package can\'t be
+-- associated with any OpenSearch Service domain.
+--
+-- /See:/ 'newDeletePackage' smart constructor.
+data DeletePackage = DeletePackage'
+  { -- | The internal ID of the package you want to delete. Use
+    -- @DescribePackages@ to find this value.
+    packageID :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeletePackage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'packageID', 'deletePackage_packageID' - The internal ID of the package you want to delete. Use
+-- @DescribePackages@ to find this value.
+newDeletePackage ::
+  -- | 'packageID'
+  Prelude.Text ->
+  DeletePackage
+newDeletePackage pPackageID_ =
+  DeletePackage' {packageID = pPackageID_}
+
+-- | The internal ID of the package you want to delete. Use
+-- @DescribePackages@ to find this value.
+deletePackage_packageID :: Lens.Lens' DeletePackage Prelude.Text
+deletePackage_packageID = Lens.lens (\DeletePackage' {packageID} -> packageID) (\s@DeletePackage' {} a -> s {packageID = a} :: DeletePackage)
+
+instance Core.AWSRequest DeletePackage where
+  type
+    AWSResponse DeletePackage =
+      DeletePackageResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeletePackageResponse'
+            Prelude.<$> (x Data..?> "PackageDetails")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeletePackage where
+  hashWithSalt _salt DeletePackage' {..} =
+    _salt `Prelude.hashWithSalt` packageID
+
+instance Prelude.NFData DeletePackage where
+  rnf DeletePackage' {..} = Prelude.rnf packageID
+
+instance Data.ToHeaders DeletePackage where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DeletePackage where
+  toPath DeletePackage' {..} =
+    Prelude.mconcat
+      ["/2021-01-01/packages/", Data.toBS packageID]
+
+instance Data.ToQuery DeletePackage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Container for the response parameters to the @DeletePackage@ operation.
+--
+-- /See:/ 'newDeletePackageResponse' smart constructor.
+data DeletePackageResponse = DeletePackageResponse'
+  { -- | Information about the deleted package.
+    packageDetails :: Prelude.Maybe PackageDetails,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeletePackageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'packageDetails', 'deletePackageResponse_packageDetails' - Information about the deleted package.
+--
+-- 'httpStatus', 'deletePackageResponse_httpStatus' - The response's http status code.
+newDeletePackageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeletePackageResponse
+newDeletePackageResponse pHttpStatus_ =
+  DeletePackageResponse'
+    { packageDetails =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the deleted package.
+deletePackageResponse_packageDetails :: Lens.Lens' DeletePackageResponse (Prelude.Maybe PackageDetails)
+deletePackageResponse_packageDetails = Lens.lens (\DeletePackageResponse' {packageDetails} -> packageDetails) (\s@DeletePackageResponse' {} a -> s {packageDetails = a} :: DeletePackageResponse)
+
+-- | The response's http status code.
+deletePackageResponse_httpStatus :: Lens.Lens' DeletePackageResponse Prelude.Int
+deletePackageResponse_httpStatus = Lens.lens (\DeletePackageResponse' {httpStatus} -> httpStatus) (\s@DeletePackageResponse' {} a -> s {httpStatus = a} :: DeletePackageResponse)
+
+instance Prelude.NFData DeletePackageResponse where
+  rnf DeletePackageResponse' {..} =
+    Prelude.rnf packageDetails
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/DeleteVpcEndpoint.hs b/gen/Amazonka/OpenSearch/DeleteVpcEndpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DeleteVpcEndpoint.hs
@@ -0,0 +1,161 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DeleteVpcEndpoint
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an Amazon OpenSearch Service-managed interface VPC endpoint.
+module Amazonka.OpenSearch.DeleteVpcEndpoint
+  ( -- * Creating a Request
+    DeleteVpcEndpoint (..),
+    newDeleteVpcEndpoint,
+
+    -- * Request Lenses
+    deleteVpcEndpoint_vpcEndpointId,
+
+    -- * Destructuring the Response
+    DeleteVpcEndpointResponse (..),
+    newDeleteVpcEndpointResponse,
+
+    -- * Response Lenses
+    deleteVpcEndpointResponse_httpStatus,
+    deleteVpcEndpointResponse_vpcEndpointSummary,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteVpcEndpoint' smart constructor.
+data DeleteVpcEndpoint = DeleteVpcEndpoint'
+  { -- | The unique identifier of the endpoint.
+    vpcEndpointId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVpcEndpoint' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'vpcEndpointId', 'deleteVpcEndpoint_vpcEndpointId' - The unique identifier of the endpoint.
+newDeleteVpcEndpoint ::
+  -- | 'vpcEndpointId'
+  Prelude.Text ->
+  DeleteVpcEndpoint
+newDeleteVpcEndpoint pVpcEndpointId_ =
+  DeleteVpcEndpoint' {vpcEndpointId = pVpcEndpointId_}
+
+-- | The unique identifier of the endpoint.
+deleteVpcEndpoint_vpcEndpointId :: Lens.Lens' DeleteVpcEndpoint Prelude.Text
+deleteVpcEndpoint_vpcEndpointId = Lens.lens (\DeleteVpcEndpoint' {vpcEndpointId} -> vpcEndpointId) (\s@DeleteVpcEndpoint' {} a -> s {vpcEndpointId = a} :: DeleteVpcEndpoint)
+
+instance Core.AWSRequest DeleteVpcEndpoint where
+  type
+    AWSResponse DeleteVpcEndpoint =
+      DeleteVpcEndpointResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteVpcEndpointResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "VpcEndpointSummary")
+      )
+
+instance Prelude.Hashable DeleteVpcEndpoint where
+  hashWithSalt _salt DeleteVpcEndpoint' {..} =
+    _salt `Prelude.hashWithSalt` vpcEndpointId
+
+instance Prelude.NFData DeleteVpcEndpoint where
+  rnf DeleteVpcEndpoint' {..} =
+    Prelude.rnf vpcEndpointId
+
+instance Data.ToHeaders DeleteVpcEndpoint where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DeleteVpcEndpoint where
+  toPath DeleteVpcEndpoint' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/vpcEndpoints/",
+        Data.toBS vpcEndpointId
+      ]
+
+instance Data.ToQuery DeleteVpcEndpoint where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteVpcEndpointResponse' smart constructor.
+data DeleteVpcEndpointResponse = DeleteVpcEndpointResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | Information about the deleted endpoint, including its current status
+    -- (@DELETING@ or @DELETE_FAILED@).
+    vpcEndpointSummary :: VpcEndpointSummary
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVpcEndpointResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deleteVpcEndpointResponse_httpStatus' - The response's http status code.
+--
+-- 'vpcEndpointSummary', 'deleteVpcEndpointResponse_vpcEndpointSummary' - Information about the deleted endpoint, including its current status
+-- (@DELETING@ or @DELETE_FAILED@).
+newDeleteVpcEndpointResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'vpcEndpointSummary'
+  VpcEndpointSummary ->
+  DeleteVpcEndpointResponse
+newDeleteVpcEndpointResponse
+  pHttpStatus_
+  pVpcEndpointSummary_ =
+    DeleteVpcEndpointResponse'
+      { httpStatus =
+          pHttpStatus_,
+        vpcEndpointSummary = pVpcEndpointSummary_
+      }
+
+-- | The response's http status code.
+deleteVpcEndpointResponse_httpStatus :: Lens.Lens' DeleteVpcEndpointResponse Prelude.Int
+deleteVpcEndpointResponse_httpStatus = Lens.lens (\DeleteVpcEndpointResponse' {httpStatus} -> httpStatus) (\s@DeleteVpcEndpointResponse' {} a -> s {httpStatus = a} :: DeleteVpcEndpointResponse)
+
+-- | Information about the deleted endpoint, including its current status
+-- (@DELETING@ or @DELETE_FAILED@).
+deleteVpcEndpointResponse_vpcEndpointSummary :: Lens.Lens' DeleteVpcEndpointResponse VpcEndpointSummary
+deleteVpcEndpointResponse_vpcEndpointSummary = Lens.lens (\DeleteVpcEndpointResponse' {vpcEndpointSummary} -> vpcEndpointSummary) (\s@DeleteVpcEndpointResponse' {} a -> s {vpcEndpointSummary = a} :: DeleteVpcEndpointResponse)
+
+instance Prelude.NFData DeleteVpcEndpointResponse where
+  rnf DeleteVpcEndpointResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf vpcEndpointSummary
diff --git a/gen/Amazonka/OpenSearch/DescribeDomain.hs b/gen/Amazonka/OpenSearch/DescribeDomain.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DescribeDomain.hs
@@ -0,0 +1,163 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DescribeDomain
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the domain configuration for the specified Amazon OpenSearch
+-- Service domain, including the domain ID, domain service endpoint, and
+-- domain ARN.
+module Amazonka.OpenSearch.DescribeDomain
+  ( -- * Creating a Request
+    DescribeDomain (..),
+    newDescribeDomain,
+
+    -- * Request Lenses
+    describeDomain_domainName,
+
+    -- * Destructuring the Response
+    DescribeDomainResponse (..),
+    newDescribeDomainResponse,
+
+    -- * Response Lenses
+    describeDomainResponse_httpStatus,
+    describeDomainResponse_domainStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @DescribeDomain@ operation.
+--
+-- /See:/ 'newDescribeDomain' smart constructor.
+data DescribeDomain = DescribeDomain'
+  { -- | The name of the domain that you want information about.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDomain' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainName', 'describeDomain_domainName' - The name of the domain that you want information about.
+newDescribeDomain ::
+  -- | 'domainName'
+  Prelude.Text ->
+  DescribeDomain
+newDescribeDomain pDomainName_ =
+  DescribeDomain' {domainName = pDomainName_}
+
+-- | The name of the domain that you want information about.
+describeDomain_domainName :: Lens.Lens' DescribeDomain Prelude.Text
+describeDomain_domainName = Lens.lens (\DescribeDomain' {domainName} -> domainName) (\s@DescribeDomain' {} a -> s {domainName = a} :: DescribeDomain)
+
+instance Core.AWSRequest DescribeDomain where
+  type
+    AWSResponse DescribeDomain =
+      DescribeDomainResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDomainResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "DomainStatus")
+      )
+
+instance Prelude.Hashable DescribeDomain where
+  hashWithSalt _salt DescribeDomain' {..} =
+    _salt `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData DescribeDomain where
+  rnf DescribeDomain' {..} = Prelude.rnf domainName
+
+instance Data.ToHeaders DescribeDomain where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DescribeDomain where
+  toPath DescribeDomain' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/domain/",
+        Data.toBS domainName
+      ]
+
+instance Data.ToQuery DescribeDomain where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Contains the status of the domain specified in the request.
+--
+-- /See:/ 'newDescribeDomainResponse' smart constructor.
+data DescribeDomainResponse = DescribeDomainResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | List that contains the status of each specified OpenSearch Service
+    -- domain.
+    domainStatus :: DomainStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDomainResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'describeDomainResponse_httpStatus' - The response's http status code.
+--
+-- 'domainStatus', 'describeDomainResponse_domainStatus' - List that contains the status of each specified OpenSearch Service
+-- domain.
+newDescribeDomainResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'domainStatus'
+  DomainStatus ->
+  DescribeDomainResponse
+newDescribeDomainResponse pHttpStatus_ pDomainStatus_ =
+  DescribeDomainResponse'
+    { httpStatus = pHttpStatus_,
+      domainStatus = pDomainStatus_
+    }
+
+-- | The response's http status code.
+describeDomainResponse_httpStatus :: Lens.Lens' DescribeDomainResponse Prelude.Int
+describeDomainResponse_httpStatus = Lens.lens (\DescribeDomainResponse' {httpStatus} -> httpStatus) (\s@DescribeDomainResponse' {} a -> s {httpStatus = a} :: DescribeDomainResponse)
+
+-- | List that contains the status of each specified OpenSearch Service
+-- domain.
+describeDomainResponse_domainStatus :: Lens.Lens' DescribeDomainResponse DomainStatus
+describeDomainResponse_domainStatus = Lens.lens (\DescribeDomainResponse' {domainStatus} -> domainStatus) (\s@DescribeDomainResponse' {} a -> s {domainStatus = a} :: DescribeDomainResponse)
+
+instance Prelude.NFData DescribeDomainResponse where
+  rnf DescribeDomainResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf domainStatus
diff --git a/gen/Amazonka/OpenSearch/DescribeDomainAutoTunes.hs b/gen/Amazonka/OpenSearch/DescribeDomainAutoTunes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DescribeDomainAutoTunes.hs
@@ -0,0 +1,222 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DescribeDomainAutoTunes
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the list of optimizations that Auto-Tune has made to an Amazon
+-- OpenSearch Service domain. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/auto-tune.html Auto-Tune for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.DescribeDomainAutoTunes
+  ( -- * Creating a Request
+    DescribeDomainAutoTunes (..),
+    newDescribeDomainAutoTunes,
+
+    -- * Request Lenses
+    describeDomainAutoTunes_maxResults,
+    describeDomainAutoTunes_nextToken,
+    describeDomainAutoTunes_domainName,
+
+    -- * Destructuring the Response
+    DescribeDomainAutoTunesResponse (..),
+    newDescribeDomainAutoTunesResponse,
+
+    -- * Response Lenses
+    describeDomainAutoTunesResponse_autoTunes,
+    describeDomainAutoTunesResponse_nextToken,
+    describeDomainAutoTunesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @DescribeDomainAutoTunes@ operation.
+--
+-- /See:/ 'newDescribeDomainAutoTunes' smart constructor.
+data DescribeDomainAutoTunes = DescribeDomainAutoTunes'
+  { -- | An optional parameter that specifies the maximum number of results to
+    -- return. You can use @nextToken@ to get the next page of results.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | If your initial @DescribeDomainAutoTunes@ operation returns a
+    -- @nextToken@, you can include the returned @nextToken@ in subsequent
+    -- @DescribeDomainAutoTunes@ operations, which returns results in the next
+    -- page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Name of the domain that you want Auto-Tune details about.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDomainAutoTunes' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'describeDomainAutoTunes_maxResults' - An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+--
+-- 'nextToken', 'describeDomainAutoTunes_nextToken' - If your initial @DescribeDomainAutoTunes@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @DescribeDomainAutoTunes@ operations, which returns results in the next
+-- page.
+--
+-- 'domainName', 'describeDomainAutoTunes_domainName' - Name of the domain that you want Auto-Tune details about.
+newDescribeDomainAutoTunes ::
+  -- | 'domainName'
+  Prelude.Text ->
+  DescribeDomainAutoTunes
+newDescribeDomainAutoTunes pDomainName_ =
+  DescribeDomainAutoTunes'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      domainName = pDomainName_
+    }
+
+-- | An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+describeDomainAutoTunes_maxResults :: Lens.Lens' DescribeDomainAutoTunes (Prelude.Maybe Prelude.Int)
+describeDomainAutoTunes_maxResults = Lens.lens (\DescribeDomainAutoTunes' {maxResults} -> maxResults) (\s@DescribeDomainAutoTunes' {} a -> s {maxResults = a} :: DescribeDomainAutoTunes)
+
+-- | If your initial @DescribeDomainAutoTunes@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @DescribeDomainAutoTunes@ operations, which returns results in the next
+-- page.
+describeDomainAutoTunes_nextToken :: Lens.Lens' DescribeDomainAutoTunes (Prelude.Maybe Prelude.Text)
+describeDomainAutoTunes_nextToken = Lens.lens (\DescribeDomainAutoTunes' {nextToken} -> nextToken) (\s@DescribeDomainAutoTunes' {} a -> s {nextToken = a} :: DescribeDomainAutoTunes)
+
+-- | Name of the domain that you want Auto-Tune details about.
+describeDomainAutoTunes_domainName :: Lens.Lens' DescribeDomainAutoTunes Prelude.Text
+describeDomainAutoTunes_domainName = Lens.lens (\DescribeDomainAutoTunes' {domainName} -> domainName) (\s@DescribeDomainAutoTunes' {} a -> s {domainName = a} :: DescribeDomainAutoTunes)
+
+instance Core.AWSRequest DescribeDomainAutoTunes where
+  type
+    AWSResponse DescribeDomainAutoTunes =
+      DescribeDomainAutoTunesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDomainAutoTunesResponse'
+            Prelude.<$> (x Data..?> "AutoTunes" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeDomainAutoTunes where
+  hashWithSalt _salt DescribeDomainAutoTunes' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData DescribeDomainAutoTunes where
+  rnf DescribeDomainAutoTunes' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf domainName
+
+instance Data.ToHeaders DescribeDomainAutoTunes where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DescribeDomainAutoTunes where
+  toPath DescribeDomainAutoTunes' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/domain/",
+        Data.toBS domainName,
+        "/autoTunes"
+      ]
+
+instance Data.ToQuery DescribeDomainAutoTunes where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The result of a @DescribeDomainAutoTunes@ request.
+--
+-- /See:/ 'newDescribeDomainAutoTunesResponse' smart constructor.
+data DescribeDomainAutoTunesResponse = DescribeDomainAutoTunesResponse'
+  { -- | The list of setting adjustments that Auto-Tune has made to the domain.
+    autoTunes :: Prelude.Maybe [AutoTune],
+    -- | When @nextToken@ is returned, there are more results available. The
+    -- value of @nextToken@ is a unique pagination token for each page. Make
+    -- the call again using the returned token to retrieve the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDomainAutoTunesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'autoTunes', 'describeDomainAutoTunesResponse_autoTunes' - The list of setting adjustments that Auto-Tune has made to the domain.
+--
+-- 'nextToken', 'describeDomainAutoTunesResponse_nextToken' - When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+--
+-- 'httpStatus', 'describeDomainAutoTunesResponse_httpStatus' - The response's http status code.
+newDescribeDomainAutoTunesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeDomainAutoTunesResponse
+newDescribeDomainAutoTunesResponse pHttpStatus_ =
+  DescribeDomainAutoTunesResponse'
+    { autoTunes =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The list of setting adjustments that Auto-Tune has made to the domain.
+describeDomainAutoTunesResponse_autoTunes :: Lens.Lens' DescribeDomainAutoTunesResponse (Prelude.Maybe [AutoTune])
+describeDomainAutoTunesResponse_autoTunes = Lens.lens (\DescribeDomainAutoTunesResponse' {autoTunes} -> autoTunes) (\s@DescribeDomainAutoTunesResponse' {} a -> s {autoTunes = a} :: DescribeDomainAutoTunesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+describeDomainAutoTunesResponse_nextToken :: Lens.Lens' DescribeDomainAutoTunesResponse (Prelude.Maybe Prelude.Text)
+describeDomainAutoTunesResponse_nextToken = Lens.lens (\DescribeDomainAutoTunesResponse' {nextToken} -> nextToken) (\s@DescribeDomainAutoTunesResponse' {} a -> s {nextToken = a} :: DescribeDomainAutoTunesResponse)
+
+-- | The response's http status code.
+describeDomainAutoTunesResponse_httpStatus :: Lens.Lens' DescribeDomainAutoTunesResponse Prelude.Int
+describeDomainAutoTunesResponse_httpStatus = Lens.lens (\DescribeDomainAutoTunesResponse' {httpStatus} -> httpStatus) (\s@DescribeDomainAutoTunesResponse' {} a -> s {httpStatus = a} :: DescribeDomainAutoTunesResponse)
+
+instance
+  Prelude.NFData
+    DescribeDomainAutoTunesResponse
+  where
+  rnf DescribeDomainAutoTunesResponse' {..} =
+    Prelude.rnf autoTunes
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/DescribeDomainChangeProgress.hs b/gen/Amazonka/OpenSearch/DescribeDomainChangeProgress.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DescribeDomainChangeProgress.hs
@@ -0,0 +1,195 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DescribeDomainChangeProgress
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about the current blue\/green deployment happening
+-- on an Amazon OpenSearch Service domain. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains-configuration-changes.html Making configuration changes in Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.DescribeDomainChangeProgress
+  ( -- * Creating a Request
+    DescribeDomainChangeProgress (..),
+    newDescribeDomainChangeProgress,
+
+    -- * Request Lenses
+    describeDomainChangeProgress_changeId,
+    describeDomainChangeProgress_domainName,
+
+    -- * Destructuring the Response
+    DescribeDomainChangeProgressResponse (..),
+    newDescribeDomainChangeProgressResponse,
+
+    -- * Response Lenses
+    describeDomainChangeProgressResponse_changeProgressStatus,
+    describeDomainChangeProgressResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @DescribeDomainChangeProgress@
+-- operation.
+--
+-- /See:/ 'newDescribeDomainChangeProgress' smart constructor.
+data DescribeDomainChangeProgress = DescribeDomainChangeProgress'
+  { -- | The specific change ID for which you want to get progress information.
+    -- If omitted, the request returns information about the most recent
+    -- configuration change.
+    changeId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the domain to get progress information for.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDomainChangeProgress' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'changeId', 'describeDomainChangeProgress_changeId' - The specific change ID for which you want to get progress information.
+-- If omitted, the request returns information about the most recent
+-- configuration change.
+--
+-- 'domainName', 'describeDomainChangeProgress_domainName' - The name of the domain to get progress information for.
+newDescribeDomainChangeProgress ::
+  -- | 'domainName'
+  Prelude.Text ->
+  DescribeDomainChangeProgress
+newDescribeDomainChangeProgress pDomainName_ =
+  DescribeDomainChangeProgress'
+    { changeId =
+        Prelude.Nothing,
+      domainName = pDomainName_
+    }
+
+-- | The specific change ID for which you want to get progress information.
+-- If omitted, the request returns information about the most recent
+-- configuration change.
+describeDomainChangeProgress_changeId :: Lens.Lens' DescribeDomainChangeProgress (Prelude.Maybe Prelude.Text)
+describeDomainChangeProgress_changeId = Lens.lens (\DescribeDomainChangeProgress' {changeId} -> changeId) (\s@DescribeDomainChangeProgress' {} a -> s {changeId = a} :: DescribeDomainChangeProgress)
+
+-- | The name of the domain to get progress information for.
+describeDomainChangeProgress_domainName :: Lens.Lens' DescribeDomainChangeProgress Prelude.Text
+describeDomainChangeProgress_domainName = Lens.lens (\DescribeDomainChangeProgress' {domainName} -> domainName) (\s@DescribeDomainChangeProgress' {} a -> s {domainName = a} :: DescribeDomainChangeProgress)
+
+instance Core.AWSRequest DescribeDomainChangeProgress where
+  type
+    AWSResponse DescribeDomainChangeProgress =
+      DescribeDomainChangeProgressResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDomainChangeProgressResponse'
+            Prelude.<$> (x Data..?> "ChangeProgressStatus")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    DescribeDomainChangeProgress
+  where
+  hashWithSalt _salt DescribeDomainChangeProgress' {..} =
+    _salt
+      `Prelude.hashWithSalt` changeId
+      `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData DescribeDomainChangeProgress where
+  rnf DescribeDomainChangeProgress' {..} =
+    Prelude.rnf changeId
+      `Prelude.seq` Prelude.rnf domainName
+
+instance Data.ToHeaders DescribeDomainChangeProgress where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DescribeDomainChangeProgress where
+  toPath DescribeDomainChangeProgress' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/domain/",
+        Data.toBS domainName,
+        "/progress"
+      ]
+
+instance Data.ToQuery DescribeDomainChangeProgress where
+  toQuery DescribeDomainChangeProgress' {..} =
+    Prelude.mconcat ["changeid" Data.=: changeId]
+
+-- | The result of a @DescribeDomainChangeProgress@ request. Contains
+-- progress information for the requested domain change.
+--
+-- /See:/ 'newDescribeDomainChangeProgressResponse' smart constructor.
+data DescribeDomainChangeProgressResponse = DescribeDomainChangeProgressResponse'
+  { -- | Container for information about the stages of a configuration change
+    -- happening on a domain.
+    changeProgressStatus :: Prelude.Maybe ChangeProgressStatusDetails,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDomainChangeProgressResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'changeProgressStatus', 'describeDomainChangeProgressResponse_changeProgressStatus' - Container for information about the stages of a configuration change
+-- happening on a domain.
+--
+-- 'httpStatus', 'describeDomainChangeProgressResponse_httpStatus' - The response's http status code.
+newDescribeDomainChangeProgressResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeDomainChangeProgressResponse
+newDescribeDomainChangeProgressResponse pHttpStatus_ =
+  DescribeDomainChangeProgressResponse'
+    { changeProgressStatus =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Container for information about the stages of a configuration change
+-- happening on a domain.
+describeDomainChangeProgressResponse_changeProgressStatus :: Lens.Lens' DescribeDomainChangeProgressResponse (Prelude.Maybe ChangeProgressStatusDetails)
+describeDomainChangeProgressResponse_changeProgressStatus = Lens.lens (\DescribeDomainChangeProgressResponse' {changeProgressStatus} -> changeProgressStatus) (\s@DescribeDomainChangeProgressResponse' {} a -> s {changeProgressStatus = a} :: DescribeDomainChangeProgressResponse)
+
+-- | The response's http status code.
+describeDomainChangeProgressResponse_httpStatus :: Lens.Lens' DescribeDomainChangeProgressResponse Prelude.Int
+describeDomainChangeProgressResponse_httpStatus = Lens.lens (\DescribeDomainChangeProgressResponse' {httpStatus} -> httpStatus) (\s@DescribeDomainChangeProgressResponse' {} a -> s {httpStatus = a} :: DescribeDomainChangeProgressResponse)
+
+instance
+  Prelude.NFData
+    DescribeDomainChangeProgressResponse
+  where
+  rnf DescribeDomainChangeProgressResponse' {..} =
+    Prelude.rnf changeProgressStatus
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/DescribeDomainConfig.hs b/gen/Amazonka/OpenSearch/DescribeDomainConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DescribeDomainConfig.hs
@@ -0,0 +1,166 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DescribeDomainConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the configuration of an Amazon OpenSearch Service domain.
+module Amazonka.OpenSearch.DescribeDomainConfig
+  ( -- * Creating a Request
+    DescribeDomainConfig (..),
+    newDescribeDomainConfig,
+
+    -- * Request Lenses
+    describeDomainConfig_domainName,
+
+    -- * Destructuring the Response
+    DescribeDomainConfigResponse (..),
+    newDescribeDomainConfigResponse,
+
+    -- * Response Lenses
+    describeDomainConfigResponse_httpStatus,
+    describeDomainConfigResponse_domainConfig,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @DescribeDomainConfig@ operation.
+--
+-- /See:/ 'newDescribeDomainConfig' smart constructor.
+data DescribeDomainConfig = DescribeDomainConfig'
+  { -- | Name of the OpenSearch Service domain configuration that you want to
+    -- describe.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDomainConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainName', 'describeDomainConfig_domainName' - Name of the OpenSearch Service domain configuration that you want to
+-- describe.
+newDescribeDomainConfig ::
+  -- | 'domainName'
+  Prelude.Text ->
+  DescribeDomainConfig
+newDescribeDomainConfig pDomainName_ =
+  DescribeDomainConfig' {domainName = pDomainName_}
+
+-- | Name of the OpenSearch Service domain configuration that you want to
+-- describe.
+describeDomainConfig_domainName :: Lens.Lens' DescribeDomainConfig Prelude.Text
+describeDomainConfig_domainName = Lens.lens (\DescribeDomainConfig' {domainName} -> domainName) (\s@DescribeDomainConfig' {} a -> s {domainName = a} :: DescribeDomainConfig)
+
+instance Core.AWSRequest DescribeDomainConfig where
+  type
+    AWSResponse DescribeDomainConfig =
+      DescribeDomainConfigResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDomainConfigResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "DomainConfig")
+      )
+
+instance Prelude.Hashable DescribeDomainConfig where
+  hashWithSalt _salt DescribeDomainConfig' {..} =
+    _salt `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData DescribeDomainConfig where
+  rnf DescribeDomainConfig' {..} =
+    Prelude.rnf domainName
+
+instance Data.ToHeaders DescribeDomainConfig where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DescribeDomainConfig where
+  toPath DescribeDomainConfig' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/domain/",
+        Data.toBS domainName,
+        "/config"
+      ]
+
+instance Data.ToQuery DescribeDomainConfig where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Contains the configuration information of the requested domain.
+--
+-- /See:/ 'newDescribeDomainConfigResponse' smart constructor.
+data DescribeDomainConfigResponse = DescribeDomainConfigResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | Container for the configuration of the OpenSearch Service domain.
+    domainConfig :: DomainConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDomainConfigResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'describeDomainConfigResponse_httpStatus' - The response's http status code.
+--
+-- 'domainConfig', 'describeDomainConfigResponse_domainConfig' - Container for the configuration of the OpenSearch Service domain.
+newDescribeDomainConfigResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'domainConfig'
+  DomainConfig ->
+  DescribeDomainConfigResponse
+newDescribeDomainConfigResponse
+  pHttpStatus_
+  pDomainConfig_ =
+    DescribeDomainConfigResponse'
+      { httpStatus =
+          pHttpStatus_,
+        domainConfig = pDomainConfig_
+      }
+
+-- | The response's http status code.
+describeDomainConfigResponse_httpStatus :: Lens.Lens' DescribeDomainConfigResponse Prelude.Int
+describeDomainConfigResponse_httpStatus = Lens.lens (\DescribeDomainConfigResponse' {httpStatus} -> httpStatus) (\s@DescribeDomainConfigResponse' {} a -> s {httpStatus = a} :: DescribeDomainConfigResponse)
+
+-- | Container for the configuration of the OpenSearch Service domain.
+describeDomainConfigResponse_domainConfig :: Lens.Lens' DescribeDomainConfigResponse DomainConfig
+describeDomainConfigResponse_domainConfig = Lens.lens (\DescribeDomainConfigResponse' {domainConfig} -> domainConfig) (\s@DescribeDomainConfigResponse' {} a -> s {domainConfig = a} :: DescribeDomainConfigResponse)
+
+instance Prelude.NFData DescribeDomainConfigResponse where
+  rnf DescribeDomainConfigResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf domainConfig
diff --git a/gen/Amazonka/OpenSearch/DescribeDomains.hs b/gen/Amazonka/OpenSearch/DescribeDomains.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DescribeDomains.hs
@@ -0,0 +1,169 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DescribeDomains
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns domain configuration information about the specified Amazon
+-- OpenSearch Service domains.
+module Amazonka.OpenSearch.DescribeDomains
+  ( -- * Creating a Request
+    DescribeDomains (..),
+    newDescribeDomains,
+
+    -- * Request Lenses
+    describeDomains_domainNames,
+
+    -- * Destructuring the Response
+    DescribeDomainsResponse (..),
+    newDescribeDomainsResponse,
+
+    -- * Response Lenses
+    describeDomainsResponse_httpStatus,
+    describeDomainsResponse_domainStatusList,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @DescribeDomains@ operation.
+--
+-- /See:/ 'newDescribeDomains' smart constructor.
+data DescribeDomains = DescribeDomains'
+  { -- | Array of OpenSearch Service domain names that you want information
+    -- about. If you don\'t specify any domains, OpenSearch Service returns
+    -- information about all domains owned by the account.
+    domainNames :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDomains' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainNames', 'describeDomains_domainNames' - Array of OpenSearch Service domain names that you want information
+-- about. If you don\'t specify any domains, OpenSearch Service returns
+-- information about all domains owned by the account.
+newDescribeDomains ::
+  DescribeDomains
+newDescribeDomains =
+  DescribeDomains' {domainNames = Prelude.mempty}
+
+-- | Array of OpenSearch Service domain names that you want information
+-- about. If you don\'t specify any domains, OpenSearch Service returns
+-- information about all domains owned by the account.
+describeDomains_domainNames :: Lens.Lens' DescribeDomains [Prelude.Text]
+describeDomains_domainNames = Lens.lens (\DescribeDomains' {domainNames} -> domainNames) (\s@DescribeDomains' {} a -> s {domainNames = a} :: DescribeDomains) Prelude.. Lens.coerced
+
+instance Core.AWSRequest DescribeDomains where
+  type
+    AWSResponse DescribeDomains =
+      DescribeDomainsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDomainsResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "DomainStatusList"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable DescribeDomains where
+  hashWithSalt _salt DescribeDomains' {..} =
+    _salt `Prelude.hashWithSalt` domainNames
+
+instance Prelude.NFData DescribeDomains where
+  rnf DescribeDomains' {..} = Prelude.rnf domainNames
+
+instance Data.ToHeaders DescribeDomains where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON DescribeDomains where
+  toJSON DescribeDomains' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("DomainNames" Data..= domainNames)]
+      )
+
+instance Data.ToPath DescribeDomains where
+  toPath =
+    Prelude.const "/2021-01-01/opensearch/domain-info"
+
+instance Data.ToQuery DescribeDomains where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Contains the status of the specified domains or all domains owned by the
+-- account.
+--
+-- /See:/ 'newDescribeDomainsResponse' smart constructor.
+data DescribeDomainsResponse = DescribeDomainsResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The status of the requested domains.
+    domainStatusList :: [DomainStatus]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDomainsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'describeDomainsResponse_httpStatus' - The response's http status code.
+--
+-- 'domainStatusList', 'describeDomainsResponse_domainStatusList' - The status of the requested domains.
+newDescribeDomainsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeDomainsResponse
+newDescribeDomainsResponse pHttpStatus_ =
+  DescribeDomainsResponse'
+    { httpStatus = pHttpStatus_,
+      domainStatusList = Prelude.mempty
+    }
+
+-- | The response's http status code.
+describeDomainsResponse_httpStatus :: Lens.Lens' DescribeDomainsResponse Prelude.Int
+describeDomainsResponse_httpStatus = Lens.lens (\DescribeDomainsResponse' {httpStatus} -> httpStatus) (\s@DescribeDomainsResponse' {} a -> s {httpStatus = a} :: DescribeDomainsResponse)
+
+-- | The status of the requested domains.
+describeDomainsResponse_domainStatusList :: Lens.Lens' DescribeDomainsResponse [DomainStatus]
+describeDomainsResponse_domainStatusList = Lens.lens (\DescribeDomainsResponse' {domainStatusList} -> domainStatusList) (\s@DescribeDomainsResponse' {} a -> s {domainStatusList = a} :: DescribeDomainsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData DescribeDomainsResponse where
+  rnf DescribeDomainsResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf domainStatusList
diff --git a/gen/Amazonka/OpenSearch/DescribeInboundConnections.hs b/gen/Amazonka/OpenSearch/DescribeInboundConnections.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DescribeInboundConnections.hs
@@ -0,0 +1,231 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DescribeInboundConnections
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all the inbound cross-cluster search connections for a destination
+-- (remote) Amazon OpenSearch Service domain. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/cross-cluster-search.html Cross-cluster search for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.DescribeInboundConnections
+  ( -- * Creating a Request
+    DescribeInboundConnections (..),
+    newDescribeInboundConnections,
+
+    -- * Request Lenses
+    describeInboundConnections_filters,
+    describeInboundConnections_maxResults,
+    describeInboundConnections_nextToken,
+
+    -- * Destructuring the Response
+    DescribeInboundConnectionsResponse (..),
+    newDescribeInboundConnectionsResponse,
+
+    -- * Response Lenses
+    describeInboundConnectionsResponse_connections,
+    describeInboundConnectionsResponse_nextToken,
+    describeInboundConnectionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @DescribeInboundConnections@
+-- operation.
+--
+-- /See:/ 'newDescribeInboundConnections' smart constructor.
+data DescribeInboundConnections = DescribeInboundConnections'
+  { -- | A list of filters used to match properties for inbound cross-cluster
+    -- connections.
+    filters :: Prelude.Maybe [Filter],
+    -- | An optional parameter that specifies the maximum number of results to
+    -- return. You can use @nextToken@ to get the next page of results.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | If your initial @DescribeInboundConnections@ operation returns a
+    -- @nextToken@, you can include the returned @nextToken@ in subsequent
+    -- @DescribeInboundConnections@ operations, which returns results in the
+    -- next page.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeInboundConnections' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filters', 'describeInboundConnections_filters' - A list of filters used to match properties for inbound cross-cluster
+-- connections.
+--
+-- 'maxResults', 'describeInboundConnections_maxResults' - An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+--
+-- 'nextToken', 'describeInboundConnections_nextToken' - If your initial @DescribeInboundConnections@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @DescribeInboundConnections@ operations, which returns results in the
+-- next page.
+newDescribeInboundConnections ::
+  DescribeInboundConnections
+newDescribeInboundConnections =
+  DescribeInboundConnections'
+    { filters =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | A list of filters used to match properties for inbound cross-cluster
+-- connections.
+describeInboundConnections_filters :: Lens.Lens' DescribeInboundConnections (Prelude.Maybe [Filter])
+describeInboundConnections_filters = Lens.lens (\DescribeInboundConnections' {filters} -> filters) (\s@DescribeInboundConnections' {} a -> s {filters = a} :: DescribeInboundConnections) Prelude.. Lens.mapping Lens.coerced
+
+-- | An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+describeInboundConnections_maxResults :: Lens.Lens' DescribeInboundConnections (Prelude.Maybe Prelude.Int)
+describeInboundConnections_maxResults = Lens.lens (\DescribeInboundConnections' {maxResults} -> maxResults) (\s@DescribeInboundConnections' {} a -> s {maxResults = a} :: DescribeInboundConnections)
+
+-- | If your initial @DescribeInboundConnections@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @DescribeInboundConnections@ operations, which returns results in the
+-- next page.
+describeInboundConnections_nextToken :: Lens.Lens' DescribeInboundConnections (Prelude.Maybe Prelude.Text)
+describeInboundConnections_nextToken = Lens.lens (\DescribeInboundConnections' {nextToken} -> nextToken) (\s@DescribeInboundConnections' {} a -> s {nextToken = a} :: DescribeInboundConnections)
+
+instance Core.AWSRequest DescribeInboundConnections where
+  type
+    AWSResponse DescribeInboundConnections =
+      DescribeInboundConnectionsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeInboundConnectionsResponse'
+            Prelude.<$> (x Data..?> "Connections" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeInboundConnections where
+  hashWithSalt _salt DescribeInboundConnections' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData DescribeInboundConnections where
+  rnf DescribeInboundConnections' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders DescribeInboundConnections where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON DescribeInboundConnections where
+  toJSON DescribeInboundConnections' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Filters" Data..=) Prelude.<$> filters,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath DescribeInboundConnections where
+  toPath =
+    Prelude.const
+      "/2021-01-01/opensearch/cc/inboundConnection/search"
+
+instance Data.ToQuery DescribeInboundConnections where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Contains a list of connections matching the filter criteria.
+--
+-- /See:/ 'newDescribeInboundConnectionsResponse' smart constructor.
+data DescribeInboundConnectionsResponse = DescribeInboundConnectionsResponse'
+  { -- | List of inbound connections.
+    connections :: Prelude.Maybe [InboundConnection],
+    -- | When @nextToken@ is returned, there are more results available. The
+    -- value of @nextToken@ is a unique pagination token for each page. Make
+    -- the call again using the returned token to retrieve the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeInboundConnectionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connections', 'describeInboundConnectionsResponse_connections' - List of inbound connections.
+--
+-- 'nextToken', 'describeInboundConnectionsResponse_nextToken' - When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+--
+-- 'httpStatus', 'describeInboundConnectionsResponse_httpStatus' - The response's http status code.
+newDescribeInboundConnectionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeInboundConnectionsResponse
+newDescribeInboundConnectionsResponse pHttpStatus_ =
+  DescribeInboundConnectionsResponse'
+    { connections =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | List of inbound connections.
+describeInboundConnectionsResponse_connections :: Lens.Lens' DescribeInboundConnectionsResponse (Prelude.Maybe [InboundConnection])
+describeInboundConnectionsResponse_connections = Lens.lens (\DescribeInboundConnectionsResponse' {connections} -> connections) (\s@DescribeInboundConnectionsResponse' {} a -> s {connections = a} :: DescribeInboundConnectionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+describeInboundConnectionsResponse_nextToken :: Lens.Lens' DescribeInboundConnectionsResponse (Prelude.Maybe Prelude.Text)
+describeInboundConnectionsResponse_nextToken = Lens.lens (\DescribeInboundConnectionsResponse' {nextToken} -> nextToken) (\s@DescribeInboundConnectionsResponse' {} a -> s {nextToken = a} :: DescribeInboundConnectionsResponse)
+
+-- | The response's http status code.
+describeInboundConnectionsResponse_httpStatus :: Lens.Lens' DescribeInboundConnectionsResponse Prelude.Int
+describeInboundConnectionsResponse_httpStatus = Lens.lens (\DescribeInboundConnectionsResponse' {httpStatus} -> httpStatus) (\s@DescribeInboundConnectionsResponse' {} a -> s {httpStatus = a} :: DescribeInboundConnectionsResponse)
+
+instance
+  Prelude.NFData
+    DescribeInboundConnectionsResponse
+  where
+  rnf DescribeInboundConnectionsResponse' {..} =
+    Prelude.rnf connections
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/DescribeInstanceTypeLimits.hs b/gen/Amazonka/OpenSearch/DescribeInstanceTypeLimits.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DescribeInstanceTypeLimits.hs
@@ -0,0 +1,211 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DescribeInstanceTypeLimits
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the instance count, storage, and master node limits for a
+-- given OpenSearch or Elasticsearch version and instance type.
+module Amazonka.OpenSearch.DescribeInstanceTypeLimits
+  ( -- * Creating a Request
+    DescribeInstanceTypeLimits (..),
+    newDescribeInstanceTypeLimits,
+
+    -- * Request Lenses
+    describeInstanceTypeLimits_domainName,
+    describeInstanceTypeLimits_instanceType,
+    describeInstanceTypeLimits_engineVersion,
+
+    -- * Destructuring the Response
+    DescribeInstanceTypeLimitsResponse (..),
+    newDescribeInstanceTypeLimitsResponse,
+
+    -- * Response Lenses
+    describeInstanceTypeLimitsResponse_limitsByRole,
+    describeInstanceTypeLimitsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @DescribeInstanceTypeLimits@
+-- operation.
+--
+-- /See:/ 'newDescribeInstanceTypeLimits' smart constructor.
+data DescribeInstanceTypeLimits = DescribeInstanceTypeLimits'
+  { -- | The name of the domain. Only specify if you need the limits for an
+    -- existing domain.
+    domainName :: Prelude.Maybe Prelude.Text,
+    -- | The OpenSearch Service instance type for which you need limit
+    -- information.
+    instanceType :: OpenSearchPartitionInstanceType,
+    -- | Version of OpenSearch or Elasticsearch, in the format Elasticsearch_X.Y
+    -- or OpenSearch_X.Y. Defaults to the latest version of OpenSearch.
+    engineVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeInstanceTypeLimits' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainName', 'describeInstanceTypeLimits_domainName' - The name of the domain. Only specify if you need the limits for an
+-- existing domain.
+--
+-- 'instanceType', 'describeInstanceTypeLimits_instanceType' - The OpenSearch Service instance type for which you need limit
+-- information.
+--
+-- 'engineVersion', 'describeInstanceTypeLimits_engineVersion' - Version of OpenSearch or Elasticsearch, in the format Elasticsearch_X.Y
+-- or OpenSearch_X.Y. Defaults to the latest version of OpenSearch.
+newDescribeInstanceTypeLimits ::
+  -- | 'instanceType'
+  OpenSearchPartitionInstanceType ->
+  -- | 'engineVersion'
+  Prelude.Text ->
+  DescribeInstanceTypeLimits
+newDescribeInstanceTypeLimits
+  pInstanceType_
+  pEngineVersion_ =
+    DescribeInstanceTypeLimits'
+      { domainName =
+          Prelude.Nothing,
+        instanceType = pInstanceType_,
+        engineVersion = pEngineVersion_
+      }
+
+-- | The name of the domain. Only specify if you need the limits for an
+-- existing domain.
+describeInstanceTypeLimits_domainName :: Lens.Lens' DescribeInstanceTypeLimits (Prelude.Maybe Prelude.Text)
+describeInstanceTypeLimits_domainName = Lens.lens (\DescribeInstanceTypeLimits' {domainName} -> domainName) (\s@DescribeInstanceTypeLimits' {} a -> s {domainName = a} :: DescribeInstanceTypeLimits)
+
+-- | The OpenSearch Service instance type for which you need limit
+-- information.
+describeInstanceTypeLimits_instanceType :: Lens.Lens' DescribeInstanceTypeLimits OpenSearchPartitionInstanceType
+describeInstanceTypeLimits_instanceType = Lens.lens (\DescribeInstanceTypeLimits' {instanceType} -> instanceType) (\s@DescribeInstanceTypeLimits' {} a -> s {instanceType = a} :: DescribeInstanceTypeLimits)
+
+-- | Version of OpenSearch or Elasticsearch, in the format Elasticsearch_X.Y
+-- or OpenSearch_X.Y. Defaults to the latest version of OpenSearch.
+describeInstanceTypeLimits_engineVersion :: Lens.Lens' DescribeInstanceTypeLimits Prelude.Text
+describeInstanceTypeLimits_engineVersion = Lens.lens (\DescribeInstanceTypeLimits' {engineVersion} -> engineVersion) (\s@DescribeInstanceTypeLimits' {} a -> s {engineVersion = a} :: DescribeInstanceTypeLimits)
+
+instance Core.AWSRequest DescribeInstanceTypeLimits where
+  type
+    AWSResponse DescribeInstanceTypeLimits =
+      DescribeInstanceTypeLimitsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeInstanceTypeLimitsResponse'
+            Prelude.<$> (x Data..?> "LimitsByRole" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeInstanceTypeLimits where
+  hashWithSalt _salt DescribeInstanceTypeLimits' {..} =
+    _salt
+      `Prelude.hashWithSalt` domainName
+      `Prelude.hashWithSalt` instanceType
+      `Prelude.hashWithSalt` engineVersion
+
+instance Prelude.NFData DescribeInstanceTypeLimits where
+  rnf DescribeInstanceTypeLimits' {..} =
+    Prelude.rnf domainName
+      `Prelude.seq` Prelude.rnf instanceType
+      `Prelude.seq` Prelude.rnf engineVersion
+
+instance Data.ToHeaders DescribeInstanceTypeLimits where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DescribeInstanceTypeLimits where
+  toPath DescribeInstanceTypeLimits' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/instanceTypeLimits/",
+        Data.toBS engineVersion,
+        "/",
+        Data.toBS instanceType
+      ]
+
+instance Data.ToQuery DescribeInstanceTypeLimits where
+  toQuery DescribeInstanceTypeLimits' {..} =
+    Prelude.mconcat ["domainName" Data.=: domainName]
+
+-- | Container for the parameters received from the
+-- @DescribeInstanceTypeLimits@ operation.
+--
+-- /See:/ 'newDescribeInstanceTypeLimitsResponse' smart constructor.
+data DescribeInstanceTypeLimitsResponse = DescribeInstanceTypeLimitsResponse'
+  { -- | Map that contains all applicable instance type limits.@data@ refers to
+    -- data nodes.@master@ refers to dedicated master nodes.
+    limitsByRole :: Prelude.Maybe (Prelude.HashMap Prelude.Text Limits),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeInstanceTypeLimitsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'limitsByRole', 'describeInstanceTypeLimitsResponse_limitsByRole' - Map that contains all applicable instance type limits.@data@ refers to
+-- data nodes.@master@ refers to dedicated master nodes.
+--
+-- 'httpStatus', 'describeInstanceTypeLimitsResponse_httpStatus' - The response's http status code.
+newDescribeInstanceTypeLimitsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeInstanceTypeLimitsResponse
+newDescribeInstanceTypeLimitsResponse pHttpStatus_ =
+  DescribeInstanceTypeLimitsResponse'
+    { limitsByRole =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Map that contains all applicable instance type limits.@data@ refers to
+-- data nodes.@master@ refers to dedicated master nodes.
+describeInstanceTypeLimitsResponse_limitsByRole :: Lens.Lens' DescribeInstanceTypeLimitsResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Limits))
+describeInstanceTypeLimitsResponse_limitsByRole = Lens.lens (\DescribeInstanceTypeLimitsResponse' {limitsByRole} -> limitsByRole) (\s@DescribeInstanceTypeLimitsResponse' {} a -> s {limitsByRole = a} :: DescribeInstanceTypeLimitsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeInstanceTypeLimitsResponse_httpStatus :: Lens.Lens' DescribeInstanceTypeLimitsResponse Prelude.Int
+describeInstanceTypeLimitsResponse_httpStatus = Lens.lens (\DescribeInstanceTypeLimitsResponse' {httpStatus} -> httpStatus) (\s@DescribeInstanceTypeLimitsResponse' {} a -> s {httpStatus = a} :: DescribeInstanceTypeLimitsResponse)
+
+instance
+  Prelude.NFData
+    DescribeInstanceTypeLimitsResponse
+  where
+  rnf DescribeInstanceTypeLimitsResponse' {..} =
+    Prelude.rnf limitsByRole
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/DescribeOutboundConnections.hs b/gen/Amazonka/OpenSearch/DescribeOutboundConnections.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DescribeOutboundConnections.hs
@@ -0,0 +1,228 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DescribeOutboundConnections
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all the outbound cross-cluster connections for a local (source)
+-- Amazon OpenSearch Service domain. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/cross-cluster-search.html Cross-cluster search for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.DescribeOutboundConnections
+  ( -- * Creating a Request
+    DescribeOutboundConnections (..),
+    newDescribeOutboundConnections,
+
+    -- * Request Lenses
+    describeOutboundConnections_filters,
+    describeOutboundConnections_maxResults,
+    describeOutboundConnections_nextToken,
+
+    -- * Destructuring the Response
+    DescribeOutboundConnectionsResponse (..),
+    newDescribeOutboundConnectionsResponse,
+
+    -- * Response Lenses
+    describeOutboundConnectionsResponse_connections,
+    describeOutboundConnectionsResponse_nextToken,
+    describeOutboundConnectionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @DescribeOutboundConnections@
+-- operation.
+--
+-- /See:/ 'newDescribeOutboundConnections' smart constructor.
+data DescribeOutboundConnections = DescribeOutboundConnections'
+  { -- | List of filter names and values that you can use for requests.
+    filters :: Prelude.Maybe [Filter],
+    -- | An optional parameter that specifies the maximum number of results to
+    -- return. You can use @nextToken@ to get the next page of results.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | If your initial @DescribeOutboundConnections@ operation returns a
+    -- @nextToken@, you can include the returned @nextToken@ in subsequent
+    -- @DescribeOutboundConnections@ operations, which returns results in the
+    -- next page.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeOutboundConnections' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filters', 'describeOutboundConnections_filters' - List of filter names and values that you can use for requests.
+--
+-- 'maxResults', 'describeOutboundConnections_maxResults' - An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+--
+-- 'nextToken', 'describeOutboundConnections_nextToken' - If your initial @DescribeOutboundConnections@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @DescribeOutboundConnections@ operations, which returns results in the
+-- next page.
+newDescribeOutboundConnections ::
+  DescribeOutboundConnections
+newDescribeOutboundConnections =
+  DescribeOutboundConnections'
+    { filters =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | List of filter names and values that you can use for requests.
+describeOutboundConnections_filters :: Lens.Lens' DescribeOutboundConnections (Prelude.Maybe [Filter])
+describeOutboundConnections_filters = Lens.lens (\DescribeOutboundConnections' {filters} -> filters) (\s@DescribeOutboundConnections' {} a -> s {filters = a} :: DescribeOutboundConnections) Prelude.. Lens.mapping Lens.coerced
+
+-- | An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+describeOutboundConnections_maxResults :: Lens.Lens' DescribeOutboundConnections (Prelude.Maybe Prelude.Int)
+describeOutboundConnections_maxResults = Lens.lens (\DescribeOutboundConnections' {maxResults} -> maxResults) (\s@DescribeOutboundConnections' {} a -> s {maxResults = a} :: DescribeOutboundConnections)
+
+-- | If your initial @DescribeOutboundConnections@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @DescribeOutboundConnections@ operations, which returns results in the
+-- next page.
+describeOutboundConnections_nextToken :: Lens.Lens' DescribeOutboundConnections (Prelude.Maybe Prelude.Text)
+describeOutboundConnections_nextToken = Lens.lens (\DescribeOutboundConnections' {nextToken} -> nextToken) (\s@DescribeOutboundConnections' {} a -> s {nextToken = a} :: DescribeOutboundConnections)
+
+instance Core.AWSRequest DescribeOutboundConnections where
+  type
+    AWSResponse DescribeOutboundConnections =
+      DescribeOutboundConnectionsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeOutboundConnectionsResponse'
+            Prelude.<$> (x Data..?> "Connections" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeOutboundConnections where
+  hashWithSalt _salt DescribeOutboundConnections' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData DescribeOutboundConnections where
+  rnf DescribeOutboundConnections' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders DescribeOutboundConnections where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON DescribeOutboundConnections where
+  toJSON DescribeOutboundConnections' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Filters" Data..=) Prelude.<$> filters,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath DescribeOutboundConnections where
+  toPath =
+    Prelude.const
+      "/2021-01-01/opensearch/cc/outboundConnection/search"
+
+instance Data.ToQuery DescribeOutboundConnections where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Contains a list of connections matching the filter criteria.
+--
+-- /See:/ 'newDescribeOutboundConnectionsResponse' smart constructor.
+data DescribeOutboundConnectionsResponse = DescribeOutboundConnectionsResponse'
+  { -- | List of outbound connections that match the filter criteria.
+    connections :: Prelude.Maybe [OutboundConnection],
+    -- | When @nextToken@ is returned, there are more results available. The
+    -- value of @nextToken@ is a unique pagination token for each page. Make
+    -- the call again using the returned token to retrieve the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeOutboundConnectionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connections', 'describeOutboundConnectionsResponse_connections' - List of outbound connections that match the filter criteria.
+--
+-- 'nextToken', 'describeOutboundConnectionsResponse_nextToken' - When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+--
+-- 'httpStatus', 'describeOutboundConnectionsResponse_httpStatus' - The response's http status code.
+newDescribeOutboundConnectionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeOutboundConnectionsResponse
+newDescribeOutboundConnectionsResponse pHttpStatus_ =
+  DescribeOutboundConnectionsResponse'
+    { connections =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | List of outbound connections that match the filter criteria.
+describeOutboundConnectionsResponse_connections :: Lens.Lens' DescribeOutboundConnectionsResponse (Prelude.Maybe [OutboundConnection])
+describeOutboundConnectionsResponse_connections = Lens.lens (\DescribeOutboundConnectionsResponse' {connections} -> connections) (\s@DescribeOutboundConnectionsResponse' {} a -> s {connections = a} :: DescribeOutboundConnectionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+describeOutboundConnectionsResponse_nextToken :: Lens.Lens' DescribeOutboundConnectionsResponse (Prelude.Maybe Prelude.Text)
+describeOutboundConnectionsResponse_nextToken = Lens.lens (\DescribeOutboundConnectionsResponse' {nextToken} -> nextToken) (\s@DescribeOutboundConnectionsResponse' {} a -> s {nextToken = a} :: DescribeOutboundConnectionsResponse)
+
+-- | The response's http status code.
+describeOutboundConnectionsResponse_httpStatus :: Lens.Lens' DescribeOutboundConnectionsResponse Prelude.Int
+describeOutboundConnectionsResponse_httpStatus = Lens.lens (\DescribeOutboundConnectionsResponse' {httpStatus} -> httpStatus) (\s@DescribeOutboundConnectionsResponse' {} a -> s {httpStatus = a} :: DescribeOutboundConnectionsResponse)
+
+instance
+  Prelude.NFData
+    DescribeOutboundConnectionsResponse
+  where
+  rnf DescribeOutboundConnectionsResponse' {..} =
+    Prelude.rnf connections
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/DescribePackages.hs b/gen/Amazonka/OpenSearch/DescribePackages.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DescribePackages.hs
@@ -0,0 +1,228 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DescribePackages
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes all packages available to OpenSearch Service. For more
+-- information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/custom-packages.html Custom packages for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.DescribePackages
+  ( -- * Creating a Request
+    DescribePackages (..),
+    newDescribePackages,
+
+    -- * Request Lenses
+    describePackages_filters,
+    describePackages_maxResults,
+    describePackages_nextToken,
+
+    -- * Destructuring the Response
+    DescribePackagesResponse (..),
+    newDescribePackagesResponse,
+
+    -- * Response Lenses
+    describePackagesResponse_nextToken,
+    describePackagesResponse_packageDetailsList,
+    describePackagesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to the @DescribePackage@ operation.
+--
+-- /See:/ 'newDescribePackages' smart constructor.
+data DescribePackages = DescribePackages'
+  { -- | Only returns packages that match the @DescribePackagesFilterList@
+    -- values.
+    filters :: Prelude.Maybe [DescribePackagesFilter],
+    -- | An optional parameter that specifies the maximum number of results to
+    -- return. You can use @nextToken@ to get the next page of results.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | If your initial @DescribePackageFilters@ operation returns a
+    -- @nextToken@, you can include the returned @nextToken@ in subsequent
+    -- @DescribePackageFilters@ operations, which returns results in the next
+    -- page.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePackages' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filters', 'describePackages_filters' - Only returns packages that match the @DescribePackagesFilterList@
+-- values.
+--
+-- 'maxResults', 'describePackages_maxResults' - An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+--
+-- 'nextToken', 'describePackages_nextToken' - If your initial @DescribePackageFilters@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @DescribePackageFilters@ operations, which returns results in the next
+-- page.
+newDescribePackages ::
+  DescribePackages
+newDescribePackages =
+  DescribePackages'
+    { filters = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | Only returns packages that match the @DescribePackagesFilterList@
+-- values.
+describePackages_filters :: Lens.Lens' DescribePackages (Prelude.Maybe [DescribePackagesFilter])
+describePackages_filters = Lens.lens (\DescribePackages' {filters} -> filters) (\s@DescribePackages' {} a -> s {filters = a} :: DescribePackages) Prelude.. Lens.mapping Lens.coerced
+
+-- | An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+describePackages_maxResults :: Lens.Lens' DescribePackages (Prelude.Maybe Prelude.Int)
+describePackages_maxResults = Lens.lens (\DescribePackages' {maxResults} -> maxResults) (\s@DescribePackages' {} a -> s {maxResults = a} :: DescribePackages)
+
+-- | If your initial @DescribePackageFilters@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @DescribePackageFilters@ operations, which returns results in the next
+-- page.
+describePackages_nextToken :: Lens.Lens' DescribePackages (Prelude.Maybe Prelude.Text)
+describePackages_nextToken = Lens.lens (\DescribePackages' {nextToken} -> nextToken) (\s@DescribePackages' {} a -> s {nextToken = a} :: DescribePackages)
+
+instance Core.AWSRequest DescribePackages where
+  type
+    AWSResponse DescribePackages =
+      DescribePackagesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribePackagesResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> ( x
+                            Data..?> "PackageDetailsList"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribePackages where
+  hashWithSalt _salt DescribePackages' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData DescribePackages where
+  rnf DescribePackages' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders DescribePackages where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON DescribePackages where
+  toJSON DescribePackages' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Filters" Data..=) Prelude.<$> filters,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath DescribePackages where
+  toPath =
+    Prelude.const "/2021-01-01/packages/describe"
+
+instance Data.ToQuery DescribePackages where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Container for the response returned by the @DescribePackages@ operation.
+--
+-- /See:/ 'newDescribePackagesResponse' smart constructor.
+data DescribePackagesResponse = DescribePackagesResponse'
+  { -- | When @nextToken@ is returned, there are more results available. The
+    -- value of @nextToken@ is a unique pagination token for each page. Make
+    -- the call again using the returned token to retrieve the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Basic information about a package.
+    packageDetailsList :: Prelude.Maybe [PackageDetails],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePackagesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describePackagesResponse_nextToken' - When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+--
+-- 'packageDetailsList', 'describePackagesResponse_packageDetailsList' - Basic information about a package.
+--
+-- 'httpStatus', 'describePackagesResponse_httpStatus' - The response's http status code.
+newDescribePackagesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribePackagesResponse
+newDescribePackagesResponse pHttpStatus_ =
+  DescribePackagesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      packageDetailsList = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+describePackagesResponse_nextToken :: Lens.Lens' DescribePackagesResponse (Prelude.Maybe Prelude.Text)
+describePackagesResponse_nextToken = Lens.lens (\DescribePackagesResponse' {nextToken} -> nextToken) (\s@DescribePackagesResponse' {} a -> s {nextToken = a} :: DescribePackagesResponse)
+
+-- | Basic information about a package.
+describePackagesResponse_packageDetailsList :: Lens.Lens' DescribePackagesResponse (Prelude.Maybe [PackageDetails])
+describePackagesResponse_packageDetailsList = Lens.lens (\DescribePackagesResponse' {packageDetailsList} -> packageDetailsList) (\s@DescribePackagesResponse' {} a -> s {packageDetailsList = a} :: DescribePackagesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describePackagesResponse_httpStatus :: Lens.Lens' DescribePackagesResponse Prelude.Int
+describePackagesResponse_httpStatus = Lens.lens (\DescribePackagesResponse' {httpStatus} -> httpStatus) (\s@DescribePackagesResponse' {} a -> s {httpStatus = a} :: DescribePackagesResponse)
+
+instance Prelude.NFData DescribePackagesResponse where
+  rnf DescribePackagesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf packageDetailsList
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/DescribeReservedInstanceOfferings.hs b/gen/Amazonka/OpenSearch/DescribeReservedInstanceOfferings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DescribeReservedInstanceOfferings.hs
@@ -0,0 +1,255 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DescribeReservedInstanceOfferings
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the available Amazon OpenSearch Service Reserved Instance
+-- offerings for a given Region. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ri.html Reserved Instances in Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.DescribeReservedInstanceOfferings
+  ( -- * Creating a Request
+    DescribeReservedInstanceOfferings (..),
+    newDescribeReservedInstanceOfferings,
+
+    -- * Request Lenses
+    describeReservedInstanceOfferings_maxResults,
+    describeReservedInstanceOfferings_nextToken,
+    describeReservedInstanceOfferings_reservedInstanceOfferingId,
+
+    -- * Destructuring the Response
+    DescribeReservedInstanceOfferingsResponse (..),
+    newDescribeReservedInstanceOfferingsResponse,
+
+    -- * Response Lenses
+    describeReservedInstanceOfferingsResponse_nextToken,
+    describeReservedInstanceOfferingsResponse_reservedInstanceOfferings,
+    describeReservedInstanceOfferingsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to a
+-- @DescribeReservedInstanceOfferings@ operation.
+--
+-- /See:/ 'newDescribeReservedInstanceOfferings' smart constructor.
+data DescribeReservedInstanceOfferings = DescribeReservedInstanceOfferings'
+  { -- | An optional parameter that specifies the maximum number of results to
+    -- return. You can use @nextToken@ to get the next page of results.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | If your initial @DescribeReservedInstanceOfferings@ operation returns a
+    -- @nextToken@, you can include the returned @nextToken@ in subsequent
+    -- @DescribeReservedInstanceOfferings@ operations, which returns results in
+    -- the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Reserved Instance identifier filter value. Use this parameter to
+    -- show only the available instance types that match the specified
+    -- reservation identifier.
+    reservedInstanceOfferingId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeReservedInstanceOfferings' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'describeReservedInstanceOfferings_maxResults' - An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+--
+-- 'nextToken', 'describeReservedInstanceOfferings_nextToken' - If your initial @DescribeReservedInstanceOfferings@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @DescribeReservedInstanceOfferings@ operations, which returns results in
+-- the next page.
+--
+-- 'reservedInstanceOfferingId', 'describeReservedInstanceOfferings_reservedInstanceOfferingId' - The Reserved Instance identifier filter value. Use this parameter to
+-- show only the available instance types that match the specified
+-- reservation identifier.
+newDescribeReservedInstanceOfferings ::
+  DescribeReservedInstanceOfferings
+newDescribeReservedInstanceOfferings =
+  DescribeReservedInstanceOfferings'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      reservedInstanceOfferingId =
+        Prelude.Nothing
+    }
+
+-- | An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+describeReservedInstanceOfferings_maxResults :: Lens.Lens' DescribeReservedInstanceOfferings (Prelude.Maybe Prelude.Int)
+describeReservedInstanceOfferings_maxResults = Lens.lens (\DescribeReservedInstanceOfferings' {maxResults} -> maxResults) (\s@DescribeReservedInstanceOfferings' {} a -> s {maxResults = a} :: DescribeReservedInstanceOfferings)
+
+-- | If your initial @DescribeReservedInstanceOfferings@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @DescribeReservedInstanceOfferings@ operations, which returns results in
+-- the next page.
+describeReservedInstanceOfferings_nextToken :: Lens.Lens' DescribeReservedInstanceOfferings (Prelude.Maybe Prelude.Text)
+describeReservedInstanceOfferings_nextToken = Lens.lens (\DescribeReservedInstanceOfferings' {nextToken} -> nextToken) (\s@DescribeReservedInstanceOfferings' {} a -> s {nextToken = a} :: DescribeReservedInstanceOfferings)
+
+-- | The Reserved Instance identifier filter value. Use this parameter to
+-- show only the available instance types that match the specified
+-- reservation identifier.
+describeReservedInstanceOfferings_reservedInstanceOfferingId :: Lens.Lens' DescribeReservedInstanceOfferings (Prelude.Maybe Prelude.Text)
+describeReservedInstanceOfferings_reservedInstanceOfferingId = Lens.lens (\DescribeReservedInstanceOfferings' {reservedInstanceOfferingId} -> reservedInstanceOfferingId) (\s@DescribeReservedInstanceOfferings' {} a -> s {reservedInstanceOfferingId = a} :: DescribeReservedInstanceOfferings)
+
+instance
+  Core.AWSRequest
+    DescribeReservedInstanceOfferings
+  where
+  type
+    AWSResponse DescribeReservedInstanceOfferings =
+      DescribeReservedInstanceOfferingsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeReservedInstanceOfferingsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> ( x
+                            Data..?> "ReservedInstanceOfferings"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    DescribeReservedInstanceOfferings
+  where
+  hashWithSalt
+    _salt
+    DescribeReservedInstanceOfferings' {..} =
+      _salt
+        `Prelude.hashWithSalt` maxResults
+        `Prelude.hashWithSalt` nextToken
+        `Prelude.hashWithSalt` reservedInstanceOfferingId
+
+instance
+  Prelude.NFData
+    DescribeReservedInstanceOfferings
+  where
+  rnf DescribeReservedInstanceOfferings' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf reservedInstanceOfferingId
+
+instance
+  Data.ToHeaders
+    DescribeReservedInstanceOfferings
+  where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance
+  Data.ToPath
+    DescribeReservedInstanceOfferings
+  where
+  toPath =
+    Prelude.const
+      "/2021-01-01/opensearch/reservedInstanceOfferings"
+
+instance
+  Data.ToQuery
+    DescribeReservedInstanceOfferings
+  where
+  toQuery DescribeReservedInstanceOfferings' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "offeringId" Data.=: reservedInstanceOfferingId
+      ]
+
+-- | Container for results of a @DescribeReservedInstanceOfferings@ request.
+--
+-- /See:/ 'newDescribeReservedInstanceOfferingsResponse' smart constructor.
+data DescribeReservedInstanceOfferingsResponse = DescribeReservedInstanceOfferingsResponse'
+  { -- | When @nextToken@ is returned, there are more results available. The
+    -- value of @nextToken@ is a unique pagination token for each page. Make
+    -- the call again using the returned token to retrieve the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | List of Reserved Instance offerings.
+    reservedInstanceOfferings :: Prelude.Maybe [ReservedInstanceOffering],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeReservedInstanceOfferingsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeReservedInstanceOfferingsResponse_nextToken' - When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+--
+-- 'reservedInstanceOfferings', 'describeReservedInstanceOfferingsResponse_reservedInstanceOfferings' - List of Reserved Instance offerings.
+--
+-- 'httpStatus', 'describeReservedInstanceOfferingsResponse_httpStatus' - The response's http status code.
+newDescribeReservedInstanceOfferingsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeReservedInstanceOfferingsResponse
+newDescribeReservedInstanceOfferingsResponse
+  pHttpStatus_ =
+    DescribeReservedInstanceOfferingsResponse'
+      { nextToken =
+          Prelude.Nothing,
+        reservedInstanceOfferings =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+describeReservedInstanceOfferingsResponse_nextToken :: Lens.Lens' DescribeReservedInstanceOfferingsResponse (Prelude.Maybe Prelude.Text)
+describeReservedInstanceOfferingsResponse_nextToken = Lens.lens (\DescribeReservedInstanceOfferingsResponse' {nextToken} -> nextToken) (\s@DescribeReservedInstanceOfferingsResponse' {} a -> s {nextToken = a} :: DescribeReservedInstanceOfferingsResponse)
+
+-- | List of Reserved Instance offerings.
+describeReservedInstanceOfferingsResponse_reservedInstanceOfferings :: Lens.Lens' DescribeReservedInstanceOfferingsResponse (Prelude.Maybe [ReservedInstanceOffering])
+describeReservedInstanceOfferingsResponse_reservedInstanceOfferings = Lens.lens (\DescribeReservedInstanceOfferingsResponse' {reservedInstanceOfferings} -> reservedInstanceOfferings) (\s@DescribeReservedInstanceOfferingsResponse' {} a -> s {reservedInstanceOfferings = a} :: DescribeReservedInstanceOfferingsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeReservedInstanceOfferingsResponse_httpStatus :: Lens.Lens' DescribeReservedInstanceOfferingsResponse Prelude.Int
+describeReservedInstanceOfferingsResponse_httpStatus = Lens.lens (\DescribeReservedInstanceOfferingsResponse' {httpStatus} -> httpStatus) (\s@DescribeReservedInstanceOfferingsResponse' {} a -> s {httpStatus = a} :: DescribeReservedInstanceOfferingsResponse)
+
+instance
+  Prelude.NFData
+    DescribeReservedInstanceOfferingsResponse
+  where
+  rnf DescribeReservedInstanceOfferingsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf reservedInstanceOfferings
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/DescribeReservedInstances.hs b/gen/Amazonka/OpenSearch/DescribeReservedInstances.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DescribeReservedInstances.hs
@@ -0,0 +1,232 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DescribeReservedInstances
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the Amazon OpenSearch Service instances that you have reserved
+-- in a given Region. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ri.html Reserved Instances in Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.DescribeReservedInstances
+  ( -- * Creating a Request
+    DescribeReservedInstances (..),
+    newDescribeReservedInstances,
+
+    -- * Request Lenses
+    describeReservedInstances_maxResults,
+    describeReservedInstances_nextToken,
+    describeReservedInstances_reservedInstanceId,
+
+    -- * Destructuring the Response
+    DescribeReservedInstancesResponse (..),
+    newDescribeReservedInstancesResponse,
+
+    -- * Response Lenses
+    describeReservedInstancesResponse_nextToken,
+    describeReservedInstancesResponse_reservedInstances,
+    describeReservedInstancesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to the @DescribeReservedInstances@
+-- operation.
+--
+-- /See:/ 'newDescribeReservedInstances' smart constructor.
+data DescribeReservedInstances = DescribeReservedInstances'
+  { -- | An optional parameter that specifies the maximum number of results to
+    -- return. You can use @nextToken@ to get the next page of results.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | If your initial @DescribeReservedInstances@ operation returns a
+    -- @nextToken@, you can include the returned @nextToken@ in subsequent
+    -- @DescribeReservedInstances@ operations, which returns results in the
+    -- next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The reserved instance identifier filter value. Use this parameter to
+    -- show only the reservation that matches the specified reserved OpenSearch
+    -- instance ID.
+    reservedInstanceId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeReservedInstances' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'describeReservedInstances_maxResults' - An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+--
+-- 'nextToken', 'describeReservedInstances_nextToken' - If your initial @DescribeReservedInstances@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @DescribeReservedInstances@ operations, which returns results in the
+-- next page.
+--
+-- 'reservedInstanceId', 'describeReservedInstances_reservedInstanceId' - The reserved instance identifier filter value. Use this parameter to
+-- show only the reservation that matches the specified reserved OpenSearch
+-- instance ID.
+newDescribeReservedInstances ::
+  DescribeReservedInstances
+newDescribeReservedInstances =
+  DescribeReservedInstances'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      reservedInstanceId = Prelude.Nothing
+    }
+
+-- | An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+describeReservedInstances_maxResults :: Lens.Lens' DescribeReservedInstances (Prelude.Maybe Prelude.Int)
+describeReservedInstances_maxResults = Lens.lens (\DescribeReservedInstances' {maxResults} -> maxResults) (\s@DescribeReservedInstances' {} a -> s {maxResults = a} :: DescribeReservedInstances)
+
+-- | If your initial @DescribeReservedInstances@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @DescribeReservedInstances@ operations, which returns results in the
+-- next page.
+describeReservedInstances_nextToken :: Lens.Lens' DescribeReservedInstances (Prelude.Maybe Prelude.Text)
+describeReservedInstances_nextToken = Lens.lens (\DescribeReservedInstances' {nextToken} -> nextToken) (\s@DescribeReservedInstances' {} a -> s {nextToken = a} :: DescribeReservedInstances)
+
+-- | The reserved instance identifier filter value. Use this parameter to
+-- show only the reservation that matches the specified reserved OpenSearch
+-- instance ID.
+describeReservedInstances_reservedInstanceId :: Lens.Lens' DescribeReservedInstances (Prelude.Maybe Prelude.Text)
+describeReservedInstances_reservedInstanceId = Lens.lens (\DescribeReservedInstances' {reservedInstanceId} -> reservedInstanceId) (\s@DescribeReservedInstances' {} a -> s {reservedInstanceId = a} :: DescribeReservedInstances)
+
+instance Core.AWSRequest DescribeReservedInstances where
+  type
+    AWSResponse DescribeReservedInstances =
+      DescribeReservedInstancesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeReservedInstancesResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> ( x
+                            Data..?> "ReservedInstances"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeReservedInstances where
+  hashWithSalt _salt DescribeReservedInstances' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` reservedInstanceId
+
+instance Prelude.NFData DescribeReservedInstances where
+  rnf DescribeReservedInstances' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf reservedInstanceId
+
+instance Data.ToHeaders DescribeReservedInstances where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DescribeReservedInstances where
+  toPath =
+    Prelude.const
+      "/2021-01-01/opensearch/reservedInstances"
+
+instance Data.ToQuery DescribeReservedInstances where
+  toQuery DescribeReservedInstances' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "reservationId" Data.=: reservedInstanceId
+      ]
+
+-- | Container for results from @DescribeReservedInstances@
+--
+-- /See:/ 'newDescribeReservedInstancesResponse' smart constructor.
+data DescribeReservedInstancesResponse = DescribeReservedInstancesResponse'
+  { -- | When @nextToken@ is returned, there are more results available. The
+    -- value of @nextToken@ is a unique pagination token for each page. Make
+    -- the call again using the returned token to retrieve the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | List of Reserved Instances in the current Region.
+    reservedInstances :: Prelude.Maybe [ReservedInstance],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeReservedInstancesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeReservedInstancesResponse_nextToken' - When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+--
+-- 'reservedInstances', 'describeReservedInstancesResponse_reservedInstances' - List of Reserved Instances in the current Region.
+--
+-- 'httpStatus', 'describeReservedInstancesResponse_httpStatus' - The response's http status code.
+newDescribeReservedInstancesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeReservedInstancesResponse
+newDescribeReservedInstancesResponse pHttpStatus_ =
+  DescribeReservedInstancesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      reservedInstances = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+describeReservedInstancesResponse_nextToken :: Lens.Lens' DescribeReservedInstancesResponse (Prelude.Maybe Prelude.Text)
+describeReservedInstancesResponse_nextToken = Lens.lens (\DescribeReservedInstancesResponse' {nextToken} -> nextToken) (\s@DescribeReservedInstancesResponse' {} a -> s {nextToken = a} :: DescribeReservedInstancesResponse)
+
+-- | List of Reserved Instances in the current Region.
+describeReservedInstancesResponse_reservedInstances :: Lens.Lens' DescribeReservedInstancesResponse (Prelude.Maybe [ReservedInstance])
+describeReservedInstancesResponse_reservedInstances = Lens.lens (\DescribeReservedInstancesResponse' {reservedInstances} -> reservedInstances) (\s@DescribeReservedInstancesResponse' {} a -> s {reservedInstances = a} :: DescribeReservedInstancesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeReservedInstancesResponse_httpStatus :: Lens.Lens' DescribeReservedInstancesResponse Prelude.Int
+describeReservedInstancesResponse_httpStatus = Lens.lens (\DescribeReservedInstancesResponse' {httpStatus} -> httpStatus) (\s@DescribeReservedInstancesResponse' {} a -> s {httpStatus = a} :: DescribeReservedInstancesResponse)
+
+instance
+  Prelude.NFData
+    DescribeReservedInstancesResponse
+  where
+  rnf DescribeReservedInstancesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf reservedInstances
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/DescribeVpcEndpoints.hs b/gen/Amazonka/OpenSearch/DescribeVpcEndpoints.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DescribeVpcEndpoints.hs
@@ -0,0 +1,177 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DescribeVpcEndpoints
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes one or more Amazon OpenSearch Service-managed VPC endpoints.
+module Amazonka.OpenSearch.DescribeVpcEndpoints
+  ( -- * Creating a Request
+    DescribeVpcEndpoints (..),
+    newDescribeVpcEndpoints,
+
+    -- * Request Lenses
+    describeVpcEndpoints_vpcEndpointIds,
+
+    -- * Destructuring the Response
+    DescribeVpcEndpointsResponse (..),
+    newDescribeVpcEndpointsResponse,
+
+    -- * Response Lenses
+    describeVpcEndpointsResponse_httpStatus,
+    describeVpcEndpointsResponse_vpcEndpoints,
+    describeVpcEndpointsResponse_vpcEndpointErrors,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeVpcEndpoints' smart constructor.
+data DescribeVpcEndpoints = DescribeVpcEndpoints'
+  { -- | The unique identifiers of the endpoints to get information about.
+    vpcEndpointIds :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeVpcEndpoints' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'vpcEndpointIds', 'describeVpcEndpoints_vpcEndpointIds' - The unique identifiers of the endpoints to get information about.
+newDescribeVpcEndpoints ::
+  DescribeVpcEndpoints
+newDescribeVpcEndpoints =
+  DescribeVpcEndpoints'
+    { vpcEndpointIds =
+        Prelude.mempty
+    }
+
+-- | The unique identifiers of the endpoints to get information about.
+describeVpcEndpoints_vpcEndpointIds :: Lens.Lens' DescribeVpcEndpoints [Prelude.Text]
+describeVpcEndpoints_vpcEndpointIds = Lens.lens (\DescribeVpcEndpoints' {vpcEndpointIds} -> vpcEndpointIds) (\s@DescribeVpcEndpoints' {} a -> s {vpcEndpointIds = a} :: DescribeVpcEndpoints) Prelude.. Lens.coerced
+
+instance Core.AWSRequest DescribeVpcEndpoints where
+  type
+    AWSResponse DescribeVpcEndpoints =
+      DescribeVpcEndpointsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeVpcEndpointsResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "VpcEndpoints" Core..!@ Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..?> "VpcEndpointErrors"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable DescribeVpcEndpoints where
+  hashWithSalt _salt DescribeVpcEndpoints' {..} =
+    _salt `Prelude.hashWithSalt` vpcEndpointIds
+
+instance Prelude.NFData DescribeVpcEndpoints where
+  rnf DescribeVpcEndpoints' {..} =
+    Prelude.rnf vpcEndpointIds
+
+instance Data.ToHeaders DescribeVpcEndpoints where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON DescribeVpcEndpoints where
+  toJSON DescribeVpcEndpoints' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("VpcEndpointIds" Data..= vpcEndpointIds)
+          ]
+      )
+
+instance Data.ToPath DescribeVpcEndpoints where
+  toPath =
+    Prelude.const
+      "/2021-01-01/opensearch/vpcEndpoints/describe"
+
+instance Data.ToQuery DescribeVpcEndpoints where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeVpcEndpointsResponse' smart constructor.
+data DescribeVpcEndpointsResponse = DescribeVpcEndpointsResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | Information about each requested VPC endpoint.
+    vpcEndpoints :: [VpcEndpoint],
+    -- | Any errors associated with the request.
+    vpcEndpointErrors :: [VpcEndpointError]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeVpcEndpointsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'describeVpcEndpointsResponse_httpStatus' - The response's http status code.
+--
+-- 'vpcEndpoints', 'describeVpcEndpointsResponse_vpcEndpoints' - Information about each requested VPC endpoint.
+--
+-- 'vpcEndpointErrors', 'describeVpcEndpointsResponse_vpcEndpointErrors' - Any errors associated with the request.
+newDescribeVpcEndpointsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeVpcEndpointsResponse
+newDescribeVpcEndpointsResponse pHttpStatus_ =
+  DescribeVpcEndpointsResponse'
+    { httpStatus =
+        pHttpStatus_,
+      vpcEndpoints = Prelude.mempty,
+      vpcEndpointErrors = Prelude.mempty
+    }
+
+-- | The response's http status code.
+describeVpcEndpointsResponse_httpStatus :: Lens.Lens' DescribeVpcEndpointsResponse Prelude.Int
+describeVpcEndpointsResponse_httpStatus = Lens.lens (\DescribeVpcEndpointsResponse' {httpStatus} -> httpStatus) (\s@DescribeVpcEndpointsResponse' {} a -> s {httpStatus = a} :: DescribeVpcEndpointsResponse)
+
+-- | Information about each requested VPC endpoint.
+describeVpcEndpointsResponse_vpcEndpoints :: Lens.Lens' DescribeVpcEndpointsResponse [VpcEndpoint]
+describeVpcEndpointsResponse_vpcEndpoints = Lens.lens (\DescribeVpcEndpointsResponse' {vpcEndpoints} -> vpcEndpoints) (\s@DescribeVpcEndpointsResponse' {} a -> s {vpcEndpoints = a} :: DescribeVpcEndpointsResponse) Prelude.. Lens.coerced
+
+-- | Any errors associated with the request.
+describeVpcEndpointsResponse_vpcEndpointErrors :: Lens.Lens' DescribeVpcEndpointsResponse [VpcEndpointError]
+describeVpcEndpointsResponse_vpcEndpointErrors = Lens.lens (\DescribeVpcEndpointsResponse' {vpcEndpointErrors} -> vpcEndpointErrors) (\s@DescribeVpcEndpointsResponse' {} a -> s {vpcEndpointErrors = a} :: DescribeVpcEndpointsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData DescribeVpcEndpointsResponse where
+  rnf DescribeVpcEndpointsResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf vpcEndpoints
+      `Prelude.seq` Prelude.rnf vpcEndpointErrors
diff --git a/gen/Amazonka/OpenSearch/DissociatePackage.hs b/gen/Amazonka/OpenSearch/DissociatePackage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/DissociatePackage.hs
@@ -0,0 +1,188 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.DissociatePackage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Removes a package from the specified Amazon OpenSearch Service domain.
+-- The package can\'t be in use with any OpenSearch index for the
+-- dissociation to succeed. The package is still available in OpenSearch
+-- Service for association later. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/custom-packages.html Custom packages for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.DissociatePackage
+  ( -- * Creating a Request
+    DissociatePackage (..),
+    newDissociatePackage,
+
+    -- * Request Lenses
+    dissociatePackage_packageID,
+    dissociatePackage_domainName,
+
+    -- * Destructuring the Response
+    DissociatePackageResponse (..),
+    newDissociatePackageResponse,
+
+    -- * Response Lenses
+    dissociatePackageResponse_domainPackageDetails,
+    dissociatePackageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to the @DissociatePackage@
+-- operation.
+--
+-- /See:/ 'newDissociatePackage' smart constructor.
+data DissociatePackage = DissociatePackage'
+  { -- | Internal ID of the package to dissociate from the domain. Use
+    -- @ListPackagesForDomain@ to find this value.
+    packageID :: Prelude.Text,
+    -- | Name of the domain to dissociate the package from.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DissociatePackage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'packageID', 'dissociatePackage_packageID' - Internal ID of the package to dissociate from the domain. Use
+-- @ListPackagesForDomain@ to find this value.
+--
+-- 'domainName', 'dissociatePackage_domainName' - Name of the domain to dissociate the package from.
+newDissociatePackage ::
+  -- | 'packageID'
+  Prelude.Text ->
+  -- | 'domainName'
+  Prelude.Text ->
+  DissociatePackage
+newDissociatePackage pPackageID_ pDomainName_ =
+  DissociatePackage'
+    { packageID = pPackageID_,
+      domainName = pDomainName_
+    }
+
+-- | Internal ID of the package to dissociate from the domain. Use
+-- @ListPackagesForDomain@ to find this value.
+dissociatePackage_packageID :: Lens.Lens' DissociatePackage Prelude.Text
+dissociatePackage_packageID = Lens.lens (\DissociatePackage' {packageID} -> packageID) (\s@DissociatePackage' {} a -> s {packageID = a} :: DissociatePackage)
+
+-- | Name of the domain to dissociate the package from.
+dissociatePackage_domainName :: Lens.Lens' DissociatePackage Prelude.Text
+dissociatePackage_domainName = Lens.lens (\DissociatePackage' {domainName} -> domainName) (\s@DissociatePackage' {} a -> s {domainName = a} :: DissociatePackage)
+
+instance Core.AWSRequest DissociatePackage where
+  type
+    AWSResponse DissociatePackage =
+      DissociatePackageResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DissociatePackageResponse'
+            Prelude.<$> (x Data..?> "DomainPackageDetails")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DissociatePackage where
+  hashWithSalt _salt DissociatePackage' {..} =
+    _salt
+      `Prelude.hashWithSalt` packageID
+      `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData DissociatePackage where
+  rnf DissociatePackage' {..} =
+    Prelude.rnf packageID
+      `Prelude.seq` Prelude.rnf domainName
+
+instance Data.ToHeaders DissociatePackage where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON DissociatePackage where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance Data.ToPath DissociatePackage where
+  toPath DissociatePackage' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/packages/dissociate/",
+        Data.toBS packageID,
+        "/",
+        Data.toBS domainName
+      ]
+
+instance Data.ToQuery DissociatePackage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Container for the response returned by an @DissociatePackage@ operation.
+--
+-- /See:/ 'newDissociatePackageResponse' smart constructor.
+data DissociatePackageResponse = DissociatePackageResponse'
+  { -- | Information about a package that has been dissociated from the domain.
+    domainPackageDetails :: Prelude.Maybe DomainPackageDetails,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DissociatePackageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainPackageDetails', 'dissociatePackageResponse_domainPackageDetails' - Information about a package that has been dissociated from the domain.
+--
+-- 'httpStatus', 'dissociatePackageResponse_httpStatus' - The response's http status code.
+newDissociatePackageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DissociatePackageResponse
+newDissociatePackageResponse pHttpStatus_ =
+  DissociatePackageResponse'
+    { domainPackageDetails =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about a package that has been dissociated from the domain.
+dissociatePackageResponse_domainPackageDetails :: Lens.Lens' DissociatePackageResponse (Prelude.Maybe DomainPackageDetails)
+dissociatePackageResponse_domainPackageDetails = Lens.lens (\DissociatePackageResponse' {domainPackageDetails} -> domainPackageDetails) (\s@DissociatePackageResponse' {} a -> s {domainPackageDetails = a} :: DissociatePackageResponse)
+
+-- | The response's http status code.
+dissociatePackageResponse_httpStatus :: Lens.Lens' DissociatePackageResponse Prelude.Int
+dissociatePackageResponse_httpStatus = Lens.lens (\DissociatePackageResponse' {httpStatus} -> httpStatus) (\s@DissociatePackageResponse' {} a -> s {httpStatus = a} :: DissociatePackageResponse)
+
+instance Prelude.NFData DissociatePackageResponse where
+  rnf DissociatePackageResponse' {..} =
+    Prelude.rnf domainPackageDetails
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/GetCompatibleVersions.hs b/gen/Amazonka/OpenSearch/GetCompatibleVersions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/GetCompatibleVersions.hs
@@ -0,0 +1,170 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.GetCompatibleVersions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a map of OpenSearch or Elasticsearch versions and the versions
+-- you can upgrade them to.
+module Amazonka.OpenSearch.GetCompatibleVersions
+  ( -- * Creating a Request
+    GetCompatibleVersions (..),
+    newGetCompatibleVersions,
+
+    -- * Request Lenses
+    getCompatibleVersions_domainName,
+
+    -- * Destructuring the Response
+    GetCompatibleVersionsResponse (..),
+    newGetCompatibleVersionsResponse,
+
+    -- * Response Lenses
+    getCompatibleVersionsResponse_compatibleVersions,
+    getCompatibleVersionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to @GetCompatibleVersions@
+-- operation.
+--
+-- /See:/ 'newGetCompatibleVersions' smart constructor.
+data GetCompatibleVersions = GetCompatibleVersions'
+  { -- | The name of an existing domain. Provide this parameter to limit the
+    -- results to a single domain.
+    domainName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetCompatibleVersions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainName', 'getCompatibleVersions_domainName' - The name of an existing domain. Provide this parameter to limit the
+-- results to a single domain.
+newGetCompatibleVersions ::
+  GetCompatibleVersions
+newGetCompatibleVersions =
+  GetCompatibleVersions'
+    { domainName =
+        Prelude.Nothing
+    }
+
+-- | The name of an existing domain. Provide this parameter to limit the
+-- results to a single domain.
+getCompatibleVersions_domainName :: Lens.Lens' GetCompatibleVersions (Prelude.Maybe Prelude.Text)
+getCompatibleVersions_domainName = Lens.lens (\GetCompatibleVersions' {domainName} -> domainName) (\s@GetCompatibleVersions' {} a -> s {domainName = a} :: GetCompatibleVersions)
+
+instance Core.AWSRequest GetCompatibleVersions where
+  type
+    AWSResponse GetCompatibleVersions =
+      GetCompatibleVersionsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetCompatibleVersionsResponse'
+            Prelude.<$> ( x
+                            Data..?> "CompatibleVersions"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetCompatibleVersions where
+  hashWithSalt _salt GetCompatibleVersions' {..} =
+    _salt `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData GetCompatibleVersions where
+  rnf GetCompatibleVersions' {..} =
+    Prelude.rnf domainName
+
+instance Data.ToHeaders GetCompatibleVersions where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath GetCompatibleVersions where
+  toPath =
+    Prelude.const
+      "/2021-01-01/opensearch/compatibleVersions"
+
+instance Data.ToQuery GetCompatibleVersions where
+  toQuery GetCompatibleVersions' {..} =
+    Prelude.mconcat ["domainName" Data.=: domainName]
+
+-- | Container for the response returned by the @GetCompatibleVersions@
+-- operation.
+--
+-- /See:/ 'newGetCompatibleVersionsResponse' smart constructor.
+data GetCompatibleVersionsResponse = GetCompatibleVersionsResponse'
+  { -- | A map of OpenSearch or Elasticsearch versions and the versions you can
+    -- upgrade them to.
+    compatibleVersions :: Prelude.Maybe [CompatibleVersionsMap],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetCompatibleVersionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'compatibleVersions', 'getCompatibleVersionsResponse_compatibleVersions' - A map of OpenSearch or Elasticsearch versions and the versions you can
+-- upgrade them to.
+--
+-- 'httpStatus', 'getCompatibleVersionsResponse_httpStatus' - The response's http status code.
+newGetCompatibleVersionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetCompatibleVersionsResponse
+newGetCompatibleVersionsResponse pHttpStatus_ =
+  GetCompatibleVersionsResponse'
+    { compatibleVersions =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A map of OpenSearch or Elasticsearch versions and the versions you can
+-- upgrade them to.
+getCompatibleVersionsResponse_compatibleVersions :: Lens.Lens' GetCompatibleVersionsResponse (Prelude.Maybe [CompatibleVersionsMap])
+getCompatibleVersionsResponse_compatibleVersions = Lens.lens (\GetCompatibleVersionsResponse' {compatibleVersions} -> compatibleVersions) (\s@GetCompatibleVersionsResponse' {} a -> s {compatibleVersions = a} :: GetCompatibleVersionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getCompatibleVersionsResponse_httpStatus :: Lens.Lens' GetCompatibleVersionsResponse Prelude.Int
+getCompatibleVersionsResponse_httpStatus = Lens.lens (\GetCompatibleVersionsResponse' {httpStatus} -> httpStatus) (\s@GetCompatibleVersionsResponse' {} a -> s {httpStatus = a} :: GetCompatibleVersionsResponse)
+
+instance Prelude.NFData GetCompatibleVersionsResponse where
+  rnf GetCompatibleVersionsResponse' {..} =
+    Prelude.rnf compatibleVersions
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/GetPackageVersionHistory.hs b/gen/Amazonka/OpenSearch/GetPackageVersionHistory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/GetPackageVersionHistory.hs
@@ -0,0 +1,246 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.GetPackageVersionHistory
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of Amazon OpenSearch Service package versions, along with
+-- their creation time and commit message. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/custom-packages.html Custom packages for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.GetPackageVersionHistory
+  ( -- * Creating a Request
+    GetPackageVersionHistory (..),
+    newGetPackageVersionHistory,
+
+    -- * Request Lenses
+    getPackageVersionHistory_maxResults,
+    getPackageVersionHistory_nextToken,
+    getPackageVersionHistory_packageID,
+
+    -- * Destructuring the Response
+    GetPackageVersionHistoryResponse (..),
+    newGetPackageVersionHistoryResponse,
+
+    -- * Response Lenses
+    getPackageVersionHistoryResponse_nextToken,
+    getPackageVersionHistoryResponse_packageID,
+    getPackageVersionHistoryResponse_packageVersionHistoryList,
+    getPackageVersionHistoryResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to the @GetPackageVersionHistory@
+-- operation.
+--
+-- /See:/ 'newGetPackageVersionHistory' smart constructor.
+data GetPackageVersionHistory = GetPackageVersionHistory'
+  { -- | An optional parameter that specifies the maximum number of results to
+    -- return. You can use @nextToken@ to get the next page of results.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | If your initial @GetPackageVersionHistory@ operation returns a
+    -- @nextToken@, you can include the returned @nextToken@ in subsequent
+    -- @GetPackageVersionHistory@ operations, which returns results in the next
+    -- page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the package.
+    packageID :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetPackageVersionHistory' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'getPackageVersionHistory_maxResults' - An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+--
+-- 'nextToken', 'getPackageVersionHistory_nextToken' - If your initial @GetPackageVersionHistory@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @GetPackageVersionHistory@ operations, which returns results in the next
+-- page.
+--
+-- 'packageID', 'getPackageVersionHistory_packageID' - The unique identifier of the package.
+newGetPackageVersionHistory ::
+  -- | 'packageID'
+  Prelude.Text ->
+  GetPackageVersionHistory
+newGetPackageVersionHistory pPackageID_ =
+  GetPackageVersionHistory'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      packageID = pPackageID_
+    }
+
+-- | An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+getPackageVersionHistory_maxResults :: Lens.Lens' GetPackageVersionHistory (Prelude.Maybe Prelude.Int)
+getPackageVersionHistory_maxResults = Lens.lens (\GetPackageVersionHistory' {maxResults} -> maxResults) (\s@GetPackageVersionHistory' {} a -> s {maxResults = a} :: GetPackageVersionHistory)
+
+-- | If your initial @GetPackageVersionHistory@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @GetPackageVersionHistory@ operations, which returns results in the next
+-- page.
+getPackageVersionHistory_nextToken :: Lens.Lens' GetPackageVersionHistory (Prelude.Maybe Prelude.Text)
+getPackageVersionHistory_nextToken = Lens.lens (\GetPackageVersionHistory' {nextToken} -> nextToken) (\s@GetPackageVersionHistory' {} a -> s {nextToken = a} :: GetPackageVersionHistory)
+
+-- | The unique identifier of the package.
+getPackageVersionHistory_packageID :: Lens.Lens' GetPackageVersionHistory Prelude.Text
+getPackageVersionHistory_packageID = Lens.lens (\GetPackageVersionHistory' {packageID} -> packageID) (\s@GetPackageVersionHistory' {} a -> s {packageID = a} :: GetPackageVersionHistory)
+
+instance Core.AWSRequest GetPackageVersionHistory where
+  type
+    AWSResponse GetPackageVersionHistory =
+      GetPackageVersionHistoryResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetPackageVersionHistoryResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "PackageID")
+            Prelude.<*> ( x
+                            Data..?> "PackageVersionHistoryList"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetPackageVersionHistory where
+  hashWithSalt _salt GetPackageVersionHistory' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` packageID
+
+instance Prelude.NFData GetPackageVersionHistory where
+  rnf GetPackageVersionHistory' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf packageID
+
+instance Data.ToHeaders GetPackageVersionHistory where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath GetPackageVersionHistory where
+  toPath GetPackageVersionHistory' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/packages/",
+        Data.toBS packageID,
+        "/history"
+      ]
+
+instance Data.ToQuery GetPackageVersionHistory where
+  toQuery GetPackageVersionHistory' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | Container for response returned by @GetPackageVersionHistory@ operation.
+--
+-- /See:/ 'newGetPackageVersionHistoryResponse' smart constructor.
+data GetPackageVersionHistoryResponse = GetPackageVersionHistoryResponse'
+  { -- | When @nextToken@ is returned, there are more results available. The
+    -- value of @nextToken@ is a unique pagination token for each page. Make
+    -- the call again using the returned token to retrieve the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the package.
+    packageID :: Prelude.Maybe Prelude.Text,
+    -- | A list of package versions, along with their creation time and commit
+    -- message.
+    packageVersionHistoryList :: Prelude.Maybe [PackageVersionHistory],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetPackageVersionHistoryResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'getPackageVersionHistoryResponse_nextToken' - When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+--
+-- 'packageID', 'getPackageVersionHistoryResponse_packageID' - The unique identifier of the package.
+--
+-- 'packageVersionHistoryList', 'getPackageVersionHistoryResponse_packageVersionHistoryList' - A list of package versions, along with their creation time and commit
+-- message.
+--
+-- 'httpStatus', 'getPackageVersionHistoryResponse_httpStatus' - The response's http status code.
+newGetPackageVersionHistoryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetPackageVersionHistoryResponse
+newGetPackageVersionHistoryResponse pHttpStatus_ =
+  GetPackageVersionHistoryResponse'
+    { nextToken =
+        Prelude.Nothing,
+      packageID = Prelude.Nothing,
+      packageVersionHistoryList =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+getPackageVersionHistoryResponse_nextToken :: Lens.Lens' GetPackageVersionHistoryResponse (Prelude.Maybe Prelude.Text)
+getPackageVersionHistoryResponse_nextToken = Lens.lens (\GetPackageVersionHistoryResponse' {nextToken} -> nextToken) (\s@GetPackageVersionHistoryResponse' {} a -> s {nextToken = a} :: GetPackageVersionHistoryResponse)
+
+-- | The unique identifier of the package.
+getPackageVersionHistoryResponse_packageID :: Lens.Lens' GetPackageVersionHistoryResponse (Prelude.Maybe Prelude.Text)
+getPackageVersionHistoryResponse_packageID = Lens.lens (\GetPackageVersionHistoryResponse' {packageID} -> packageID) (\s@GetPackageVersionHistoryResponse' {} a -> s {packageID = a} :: GetPackageVersionHistoryResponse)
+
+-- | A list of package versions, along with their creation time and commit
+-- message.
+getPackageVersionHistoryResponse_packageVersionHistoryList :: Lens.Lens' GetPackageVersionHistoryResponse (Prelude.Maybe [PackageVersionHistory])
+getPackageVersionHistoryResponse_packageVersionHistoryList = Lens.lens (\GetPackageVersionHistoryResponse' {packageVersionHistoryList} -> packageVersionHistoryList) (\s@GetPackageVersionHistoryResponse' {} a -> s {packageVersionHistoryList = a} :: GetPackageVersionHistoryResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getPackageVersionHistoryResponse_httpStatus :: Lens.Lens' GetPackageVersionHistoryResponse Prelude.Int
+getPackageVersionHistoryResponse_httpStatus = Lens.lens (\GetPackageVersionHistoryResponse' {httpStatus} -> httpStatus) (\s@GetPackageVersionHistoryResponse' {} a -> s {httpStatus = a} :: GetPackageVersionHistoryResponse)
+
+instance
+  Prelude.NFData
+    GetPackageVersionHistoryResponse
+  where
+  rnf GetPackageVersionHistoryResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf packageID
+      `Prelude.seq` Prelude.rnf packageVersionHistoryList
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/GetUpgradeHistory.hs b/gen/Amazonka/OpenSearch/GetUpgradeHistory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/GetUpgradeHistory.hs
@@ -0,0 +1,226 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.GetUpgradeHistory
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the complete history of the last 10 upgrades performed on an
+-- Amazon OpenSearch Service domain.
+module Amazonka.OpenSearch.GetUpgradeHistory
+  ( -- * Creating a Request
+    GetUpgradeHistory (..),
+    newGetUpgradeHistory,
+
+    -- * Request Lenses
+    getUpgradeHistory_maxResults,
+    getUpgradeHistory_nextToken,
+    getUpgradeHistory_domainName,
+
+    -- * Destructuring the Response
+    GetUpgradeHistoryResponse (..),
+    newGetUpgradeHistoryResponse,
+
+    -- * Response Lenses
+    getUpgradeHistoryResponse_nextToken,
+    getUpgradeHistoryResponse_upgradeHistories,
+    getUpgradeHistoryResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to the @GetUpgradeHistory@
+-- operation.
+--
+-- /See:/ 'newGetUpgradeHistory' smart constructor.
+data GetUpgradeHistory = GetUpgradeHistory'
+  { -- | An optional parameter that specifies the maximum number of results to
+    -- return. You can use @nextToken@ to get the next page of results.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | If your initial @GetUpgradeHistory@ operation returns a @nextToken@, you
+    -- can include the returned @nextToken@ in subsequent @GetUpgradeHistory@
+    -- operations, which returns results in the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of an existing domain.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetUpgradeHistory' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'getUpgradeHistory_maxResults' - An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+--
+-- 'nextToken', 'getUpgradeHistory_nextToken' - If your initial @GetUpgradeHistory@ operation returns a @nextToken@, you
+-- can include the returned @nextToken@ in subsequent @GetUpgradeHistory@
+-- operations, which returns results in the next page.
+--
+-- 'domainName', 'getUpgradeHistory_domainName' - The name of an existing domain.
+newGetUpgradeHistory ::
+  -- | 'domainName'
+  Prelude.Text ->
+  GetUpgradeHistory
+newGetUpgradeHistory pDomainName_ =
+  GetUpgradeHistory'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      domainName = pDomainName_
+    }
+
+-- | An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+getUpgradeHistory_maxResults :: Lens.Lens' GetUpgradeHistory (Prelude.Maybe Prelude.Int)
+getUpgradeHistory_maxResults = Lens.lens (\GetUpgradeHistory' {maxResults} -> maxResults) (\s@GetUpgradeHistory' {} a -> s {maxResults = a} :: GetUpgradeHistory)
+
+-- | If your initial @GetUpgradeHistory@ operation returns a @nextToken@, you
+-- can include the returned @nextToken@ in subsequent @GetUpgradeHistory@
+-- operations, which returns results in the next page.
+getUpgradeHistory_nextToken :: Lens.Lens' GetUpgradeHistory (Prelude.Maybe Prelude.Text)
+getUpgradeHistory_nextToken = Lens.lens (\GetUpgradeHistory' {nextToken} -> nextToken) (\s@GetUpgradeHistory' {} a -> s {nextToken = a} :: GetUpgradeHistory)
+
+-- | The name of an existing domain.
+getUpgradeHistory_domainName :: Lens.Lens' GetUpgradeHistory Prelude.Text
+getUpgradeHistory_domainName = Lens.lens (\GetUpgradeHistory' {domainName} -> domainName) (\s@GetUpgradeHistory' {} a -> s {domainName = a} :: GetUpgradeHistory)
+
+instance Core.AWSRequest GetUpgradeHistory where
+  type
+    AWSResponse GetUpgradeHistory =
+      GetUpgradeHistoryResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetUpgradeHistoryResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> ( x
+                            Data..?> "UpgradeHistories"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetUpgradeHistory where
+  hashWithSalt _salt GetUpgradeHistory' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData GetUpgradeHistory where
+  rnf GetUpgradeHistory' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf domainName
+
+instance Data.ToHeaders GetUpgradeHistory where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath GetUpgradeHistory where
+  toPath GetUpgradeHistory' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/upgradeDomain/",
+        Data.toBS domainName,
+        "/history"
+      ]
+
+instance Data.ToQuery GetUpgradeHistory where
+  toQuery GetUpgradeHistory' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | Container for the response returned by the @GetUpgradeHistory@
+-- operation.
+--
+-- /See:/ 'newGetUpgradeHistoryResponse' smart constructor.
+data GetUpgradeHistoryResponse = GetUpgradeHistoryResponse'
+  { -- | When @nextToken@ is returned, there are more results available. The
+    -- value of @nextToken@ is a unique pagination token for each page. Make
+    -- the call again using the returned token to retrieve the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of objects corresponding to each upgrade or upgrade eligibility
+    -- check performed on a domain.
+    upgradeHistories :: Prelude.Maybe [UpgradeHistory],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetUpgradeHistoryResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'getUpgradeHistoryResponse_nextToken' - When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+--
+-- 'upgradeHistories', 'getUpgradeHistoryResponse_upgradeHistories' - A list of objects corresponding to each upgrade or upgrade eligibility
+-- check performed on a domain.
+--
+-- 'httpStatus', 'getUpgradeHistoryResponse_httpStatus' - The response's http status code.
+newGetUpgradeHistoryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetUpgradeHistoryResponse
+newGetUpgradeHistoryResponse pHttpStatus_ =
+  GetUpgradeHistoryResponse'
+    { nextToken =
+        Prelude.Nothing,
+      upgradeHistories = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+getUpgradeHistoryResponse_nextToken :: Lens.Lens' GetUpgradeHistoryResponse (Prelude.Maybe Prelude.Text)
+getUpgradeHistoryResponse_nextToken = Lens.lens (\GetUpgradeHistoryResponse' {nextToken} -> nextToken) (\s@GetUpgradeHistoryResponse' {} a -> s {nextToken = a} :: GetUpgradeHistoryResponse)
+
+-- | A list of objects corresponding to each upgrade or upgrade eligibility
+-- check performed on a domain.
+getUpgradeHistoryResponse_upgradeHistories :: Lens.Lens' GetUpgradeHistoryResponse (Prelude.Maybe [UpgradeHistory])
+getUpgradeHistoryResponse_upgradeHistories = Lens.lens (\GetUpgradeHistoryResponse' {upgradeHistories} -> upgradeHistories) (\s@GetUpgradeHistoryResponse' {} a -> s {upgradeHistories = a} :: GetUpgradeHistoryResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getUpgradeHistoryResponse_httpStatus :: Lens.Lens' GetUpgradeHistoryResponse Prelude.Int
+getUpgradeHistoryResponse_httpStatus = Lens.lens (\GetUpgradeHistoryResponse' {httpStatus} -> httpStatus) (\s@GetUpgradeHistoryResponse' {} a -> s {httpStatus = a} :: GetUpgradeHistoryResponse)
+
+instance Prelude.NFData GetUpgradeHistoryResponse where
+  rnf GetUpgradeHistoryResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf upgradeHistories
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/GetUpgradeStatus.hs b/gen/Amazonka/OpenSearch/GetUpgradeStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/GetUpgradeStatus.hs
@@ -0,0 +1,187 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.GetUpgradeStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the most recent status of the last upgrade or upgrade
+-- eligibility check performed on an Amazon OpenSearch Service domain.
+module Amazonka.OpenSearch.GetUpgradeStatus
+  ( -- * Creating a Request
+    GetUpgradeStatus (..),
+    newGetUpgradeStatus,
+
+    -- * Request Lenses
+    getUpgradeStatus_domainName,
+
+    -- * Destructuring the Response
+    GetUpgradeStatusResponse (..),
+    newGetUpgradeStatusResponse,
+
+    -- * Response Lenses
+    getUpgradeStatusResponse_stepStatus,
+    getUpgradeStatusResponse_upgradeName,
+    getUpgradeStatusResponse_upgradeStep,
+    getUpgradeStatusResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to the @GetUpgradeStatus@
+-- operation.
+--
+-- /See:/ 'newGetUpgradeStatus' smart constructor.
+data GetUpgradeStatus = GetUpgradeStatus'
+  { -- | The domain of the domain to get upgrade status information for.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetUpgradeStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainName', 'getUpgradeStatus_domainName' - The domain of the domain to get upgrade status information for.
+newGetUpgradeStatus ::
+  -- | 'domainName'
+  Prelude.Text ->
+  GetUpgradeStatus
+newGetUpgradeStatus pDomainName_ =
+  GetUpgradeStatus' {domainName = pDomainName_}
+
+-- | The domain of the domain to get upgrade status information for.
+getUpgradeStatus_domainName :: Lens.Lens' GetUpgradeStatus Prelude.Text
+getUpgradeStatus_domainName = Lens.lens (\GetUpgradeStatus' {domainName} -> domainName) (\s@GetUpgradeStatus' {} a -> s {domainName = a} :: GetUpgradeStatus)
+
+instance Core.AWSRequest GetUpgradeStatus where
+  type
+    AWSResponse GetUpgradeStatus =
+      GetUpgradeStatusResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetUpgradeStatusResponse'
+            Prelude.<$> (x Data..?> "StepStatus")
+            Prelude.<*> (x Data..?> "UpgradeName")
+            Prelude.<*> (x Data..?> "UpgradeStep")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetUpgradeStatus where
+  hashWithSalt _salt GetUpgradeStatus' {..} =
+    _salt `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData GetUpgradeStatus where
+  rnf GetUpgradeStatus' {..} = Prelude.rnf domainName
+
+instance Data.ToHeaders GetUpgradeStatus where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath GetUpgradeStatus where
+  toPath GetUpgradeStatus' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/upgradeDomain/",
+        Data.toBS domainName,
+        "/status"
+      ]
+
+instance Data.ToQuery GetUpgradeStatus where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Container for the response returned by the @GetUpgradeStatus@ operation.
+--
+-- /See:/ 'newGetUpgradeStatusResponse' smart constructor.
+data GetUpgradeStatusResponse = GetUpgradeStatusResponse'
+  { -- | The status of the current step that an upgrade is on.
+    stepStatus :: Prelude.Maybe UpgradeStatus,
+    -- | A string that describes the update.
+    upgradeName :: Prelude.Maybe Prelude.Text,
+    -- | One of three steps that an upgrade or upgrade eligibility check goes
+    -- through.
+    upgradeStep :: Prelude.Maybe UpgradeStep,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetUpgradeStatusResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'stepStatus', 'getUpgradeStatusResponse_stepStatus' - The status of the current step that an upgrade is on.
+--
+-- 'upgradeName', 'getUpgradeStatusResponse_upgradeName' - A string that describes the update.
+--
+-- 'upgradeStep', 'getUpgradeStatusResponse_upgradeStep' - One of three steps that an upgrade or upgrade eligibility check goes
+-- through.
+--
+-- 'httpStatus', 'getUpgradeStatusResponse_httpStatus' - The response's http status code.
+newGetUpgradeStatusResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetUpgradeStatusResponse
+newGetUpgradeStatusResponse pHttpStatus_ =
+  GetUpgradeStatusResponse'
+    { stepStatus =
+        Prelude.Nothing,
+      upgradeName = Prelude.Nothing,
+      upgradeStep = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The status of the current step that an upgrade is on.
+getUpgradeStatusResponse_stepStatus :: Lens.Lens' GetUpgradeStatusResponse (Prelude.Maybe UpgradeStatus)
+getUpgradeStatusResponse_stepStatus = Lens.lens (\GetUpgradeStatusResponse' {stepStatus} -> stepStatus) (\s@GetUpgradeStatusResponse' {} a -> s {stepStatus = a} :: GetUpgradeStatusResponse)
+
+-- | A string that describes the update.
+getUpgradeStatusResponse_upgradeName :: Lens.Lens' GetUpgradeStatusResponse (Prelude.Maybe Prelude.Text)
+getUpgradeStatusResponse_upgradeName = Lens.lens (\GetUpgradeStatusResponse' {upgradeName} -> upgradeName) (\s@GetUpgradeStatusResponse' {} a -> s {upgradeName = a} :: GetUpgradeStatusResponse)
+
+-- | One of three steps that an upgrade or upgrade eligibility check goes
+-- through.
+getUpgradeStatusResponse_upgradeStep :: Lens.Lens' GetUpgradeStatusResponse (Prelude.Maybe UpgradeStep)
+getUpgradeStatusResponse_upgradeStep = Lens.lens (\GetUpgradeStatusResponse' {upgradeStep} -> upgradeStep) (\s@GetUpgradeStatusResponse' {} a -> s {upgradeStep = a} :: GetUpgradeStatusResponse)
+
+-- | The response's http status code.
+getUpgradeStatusResponse_httpStatus :: Lens.Lens' GetUpgradeStatusResponse Prelude.Int
+getUpgradeStatusResponse_httpStatus = Lens.lens (\GetUpgradeStatusResponse' {httpStatus} -> httpStatus) (\s@GetUpgradeStatusResponse' {} a -> s {httpStatus = a} :: GetUpgradeStatusResponse)
+
+instance Prelude.NFData GetUpgradeStatusResponse where
+  rnf GetUpgradeStatusResponse' {..} =
+    Prelude.rnf stepStatus
+      `Prelude.seq` Prelude.rnf upgradeName
+      `Prelude.seq` Prelude.rnf upgradeStep
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/Lens.hs b/gen/Amazonka/OpenSearch/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Lens.hs
@@ -0,0 +1,968 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Lens
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Lens
+  ( -- * Operations
+
+    -- ** AcceptInboundConnection
+    acceptInboundConnection_connectionId,
+    acceptInboundConnectionResponse_connection,
+    acceptInboundConnectionResponse_httpStatus,
+
+    -- ** AddTags
+    addTags_arn,
+    addTags_tagList,
+
+    -- ** AssociatePackage
+    associatePackage_packageID,
+    associatePackage_domainName,
+    associatePackageResponse_domainPackageDetails,
+    associatePackageResponse_httpStatus,
+
+    -- ** AuthorizeVpcEndpointAccess
+    authorizeVpcEndpointAccess_domainName,
+    authorizeVpcEndpointAccess_account,
+    authorizeVpcEndpointAccessResponse_httpStatus,
+    authorizeVpcEndpointAccessResponse_authorizedPrincipal,
+
+    -- ** CancelServiceSoftwareUpdate
+    cancelServiceSoftwareUpdate_domainName,
+    cancelServiceSoftwareUpdateResponse_serviceSoftwareOptions,
+    cancelServiceSoftwareUpdateResponse_httpStatus,
+
+    -- ** CreateDomain
+    createDomain_accessPolicies,
+    createDomain_advancedOptions,
+    createDomain_advancedSecurityOptions,
+    createDomain_autoTuneOptions,
+    createDomain_clusterConfig,
+    createDomain_cognitoOptions,
+    createDomain_domainEndpointOptions,
+    createDomain_eBSOptions,
+    createDomain_encryptionAtRestOptions,
+    createDomain_engineVersion,
+    createDomain_logPublishingOptions,
+    createDomain_nodeToNodeEncryptionOptions,
+    createDomain_snapshotOptions,
+    createDomain_tagList,
+    createDomain_vPCOptions,
+    createDomain_domainName,
+    createDomainResponse_domainStatus,
+    createDomainResponse_httpStatus,
+
+    -- ** CreateOutboundConnection
+    createOutboundConnection_localDomainInfo,
+    createOutboundConnection_remoteDomainInfo,
+    createOutboundConnection_connectionAlias,
+    createOutboundConnectionResponse_connectionAlias,
+    createOutboundConnectionResponse_connectionId,
+    createOutboundConnectionResponse_connectionStatus,
+    createOutboundConnectionResponse_localDomainInfo,
+    createOutboundConnectionResponse_remoteDomainInfo,
+    createOutboundConnectionResponse_httpStatus,
+
+    -- ** CreatePackage
+    createPackage_packageDescription,
+    createPackage_packageName,
+    createPackage_packageType,
+    createPackage_packageSource,
+    createPackageResponse_packageDetails,
+    createPackageResponse_httpStatus,
+
+    -- ** CreateVpcEndpoint
+    createVpcEndpoint_clientToken,
+    createVpcEndpoint_domainArn,
+    createVpcEndpoint_vpcOptions,
+    createVpcEndpointResponse_httpStatus,
+    createVpcEndpointResponse_vpcEndpoint,
+
+    -- ** DeleteDomain
+    deleteDomain_domainName,
+    deleteDomainResponse_domainStatus,
+    deleteDomainResponse_httpStatus,
+
+    -- ** DeleteInboundConnection
+    deleteInboundConnection_connectionId,
+    deleteInboundConnectionResponse_connection,
+    deleteInboundConnectionResponse_httpStatus,
+
+    -- ** DeleteOutboundConnection
+    deleteOutboundConnection_connectionId,
+    deleteOutboundConnectionResponse_connection,
+    deleteOutboundConnectionResponse_httpStatus,
+
+    -- ** DeletePackage
+    deletePackage_packageID,
+    deletePackageResponse_packageDetails,
+    deletePackageResponse_httpStatus,
+
+    -- ** DeleteVpcEndpoint
+    deleteVpcEndpoint_vpcEndpointId,
+    deleteVpcEndpointResponse_httpStatus,
+    deleteVpcEndpointResponse_vpcEndpointSummary,
+
+    -- ** DescribeDomain
+    describeDomain_domainName,
+    describeDomainResponse_httpStatus,
+    describeDomainResponse_domainStatus,
+
+    -- ** DescribeDomainAutoTunes
+    describeDomainAutoTunes_maxResults,
+    describeDomainAutoTunes_nextToken,
+    describeDomainAutoTunes_domainName,
+    describeDomainAutoTunesResponse_autoTunes,
+    describeDomainAutoTunesResponse_nextToken,
+    describeDomainAutoTunesResponse_httpStatus,
+
+    -- ** DescribeDomainChangeProgress
+    describeDomainChangeProgress_changeId,
+    describeDomainChangeProgress_domainName,
+    describeDomainChangeProgressResponse_changeProgressStatus,
+    describeDomainChangeProgressResponse_httpStatus,
+
+    -- ** DescribeDomainConfig
+    describeDomainConfig_domainName,
+    describeDomainConfigResponse_httpStatus,
+    describeDomainConfigResponse_domainConfig,
+
+    -- ** DescribeDomains
+    describeDomains_domainNames,
+    describeDomainsResponse_httpStatus,
+    describeDomainsResponse_domainStatusList,
+
+    -- ** DescribeInboundConnections
+    describeInboundConnections_filters,
+    describeInboundConnections_maxResults,
+    describeInboundConnections_nextToken,
+    describeInboundConnectionsResponse_connections,
+    describeInboundConnectionsResponse_nextToken,
+    describeInboundConnectionsResponse_httpStatus,
+
+    -- ** DescribeInstanceTypeLimits
+    describeInstanceTypeLimits_domainName,
+    describeInstanceTypeLimits_instanceType,
+    describeInstanceTypeLimits_engineVersion,
+    describeInstanceTypeLimitsResponse_limitsByRole,
+    describeInstanceTypeLimitsResponse_httpStatus,
+
+    -- ** DescribeOutboundConnections
+    describeOutboundConnections_filters,
+    describeOutboundConnections_maxResults,
+    describeOutboundConnections_nextToken,
+    describeOutboundConnectionsResponse_connections,
+    describeOutboundConnectionsResponse_nextToken,
+    describeOutboundConnectionsResponse_httpStatus,
+
+    -- ** DescribePackages
+    describePackages_filters,
+    describePackages_maxResults,
+    describePackages_nextToken,
+    describePackagesResponse_nextToken,
+    describePackagesResponse_packageDetailsList,
+    describePackagesResponse_httpStatus,
+
+    -- ** DescribeReservedInstanceOfferings
+    describeReservedInstanceOfferings_maxResults,
+    describeReservedInstanceOfferings_nextToken,
+    describeReservedInstanceOfferings_reservedInstanceOfferingId,
+    describeReservedInstanceOfferingsResponse_nextToken,
+    describeReservedInstanceOfferingsResponse_reservedInstanceOfferings,
+    describeReservedInstanceOfferingsResponse_httpStatus,
+
+    -- ** DescribeReservedInstances
+    describeReservedInstances_maxResults,
+    describeReservedInstances_nextToken,
+    describeReservedInstances_reservedInstanceId,
+    describeReservedInstancesResponse_nextToken,
+    describeReservedInstancesResponse_reservedInstances,
+    describeReservedInstancesResponse_httpStatus,
+
+    -- ** DescribeVpcEndpoints
+    describeVpcEndpoints_vpcEndpointIds,
+    describeVpcEndpointsResponse_httpStatus,
+    describeVpcEndpointsResponse_vpcEndpoints,
+    describeVpcEndpointsResponse_vpcEndpointErrors,
+
+    -- ** DissociatePackage
+    dissociatePackage_packageID,
+    dissociatePackage_domainName,
+    dissociatePackageResponse_domainPackageDetails,
+    dissociatePackageResponse_httpStatus,
+
+    -- ** GetCompatibleVersions
+    getCompatibleVersions_domainName,
+    getCompatibleVersionsResponse_compatibleVersions,
+    getCompatibleVersionsResponse_httpStatus,
+
+    -- ** GetPackageVersionHistory
+    getPackageVersionHistory_maxResults,
+    getPackageVersionHistory_nextToken,
+    getPackageVersionHistory_packageID,
+    getPackageVersionHistoryResponse_nextToken,
+    getPackageVersionHistoryResponse_packageID,
+    getPackageVersionHistoryResponse_packageVersionHistoryList,
+    getPackageVersionHistoryResponse_httpStatus,
+
+    -- ** GetUpgradeHistory
+    getUpgradeHistory_maxResults,
+    getUpgradeHistory_nextToken,
+    getUpgradeHistory_domainName,
+    getUpgradeHistoryResponse_nextToken,
+    getUpgradeHistoryResponse_upgradeHistories,
+    getUpgradeHistoryResponse_httpStatus,
+
+    -- ** GetUpgradeStatus
+    getUpgradeStatus_domainName,
+    getUpgradeStatusResponse_stepStatus,
+    getUpgradeStatusResponse_upgradeName,
+    getUpgradeStatusResponse_upgradeStep,
+    getUpgradeStatusResponse_httpStatus,
+
+    -- ** ListDomainNames
+    listDomainNames_engineType,
+    listDomainNamesResponse_domainNames,
+    listDomainNamesResponse_httpStatus,
+
+    -- ** ListDomainsForPackage
+    listDomainsForPackage_maxResults,
+    listDomainsForPackage_nextToken,
+    listDomainsForPackage_packageID,
+    listDomainsForPackageResponse_domainPackageDetailsList,
+    listDomainsForPackageResponse_nextToken,
+    listDomainsForPackageResponse_httpStatus,
+
+    -- ** ListInstanceTypeDetails
+    listInstanceTypeDetails_domainName,
+    listInstanceTypeDetails_maxResults,
+    listInstanceTypeDetails_nextToken,
+    listInstanceTypeDetails_engineVersion,
+    listInstanceTypeDetailsResponse_instanceTypeDetails,
+    listInstanceTypeDetailsResponse_nextToken,
+    listInstanceTypeDetailsResponse_httpStatus,
+
+    -- ** ListPackagesForDomain
+    listPackagesForDomain_maxResults,
+    listPackagesForDomain_nextToken,
+    listPackagesForDomain_domainName,
+    listPackagesForDomainResponse_domainPackageDetailsList,
+    listPackagesForDomainResponse_nextToken,
+    listPackagesForDomainResponse_httpStatus,
+
+    -- ** ListTags
+    listTags_arn,
+    listTagsResponse_tagList,
+    listTagsResponse_httpStatus,
+
+    -- ** ListVersions
+    listVersions_maxResults,
+    listVersions_nextToken,
+    listVersionsResponse_nextToken,
+    listVersionsResponse_versions,
+    listVersionsResponse_httpStatus,
+
+    -- ** ListVpcEndpointAccess
+    listVpcEndpointAccess_nextToken,
+    listVpcEndpointAccess_domainName,
+    listVpcEndpointAccessResponse_httpStatus,
+    listVpcEndpointAccessResponse_authorizedPrincipalList,
+    listVpcEndpointAccessResponse_nextToken,
+
+    -- ** ListVpcEndpoints
+    listVpcEndpoints_nextToken,
+    listVpcEndpointsResponse_httpStatus,
+    listVpcEndpointsResponse_vpcEndpointSummaryList,
+    listVpcEndpointsResponse_nextToken,
+
+    -- ** ListVpcEndpointsForDomain
+    listVpcEndpointsForDomain_nextToken,
+    listVpcEndpointsForDomain_domainName,
+    listVpcEndpointsForDomainResponse_httpStatus,
+    listVpcEndpointsForDomainResponse_vpcEndpointSummaryList,
+    listVpcEndpointsForDomainResponse_nextToken,
+
+    -- ** PurchaseReservedInstanceOffering
+    purchaseReservedInstanceOffering_instanceCount,
+    purchaseReservedInstanceOffering_reservedInstanceOfferingId,
+    purchaseReservedInstanceOffering_reservationName,
+    purchaseReservedInstanceOfferingResponse_reservationName,
+    purchaseReservedInstanceOfferingResponse_reservedInstanceId,
+    purchaseReservedInstanceOfferingResponse_httpStatus,
+
+    -- ** RejectInboundConnection
+    rejectInboundConnection_connectionId,
+    rejectInboundConnectionResponse_connection,
+    rejectInboundConnectionResponse_httpStatus,
+
+    -- ** RemoveTags
+    removeTags_arn,
+    removeTags_tagKeys,
+
+    -- ** RevokeVpcEndpointAccess
+    revokeVpcEndpointAccess_domainName,
+    revokeVpcEndpointAccess_account,
+    revokeVpcEndpointAccessResponse_httpStatus,
+
+    -- ** StartServiceSoftwareUpdate
+    startServiceSoftwareUpdate_domainName,
+    startServiceSoftwareUpdateResponse_serviceSoftwareOptions,
+    startServiceSoftwareUpdateResponse_httpStatus,
+
+    -- ** UpdateDomainConfig
+    updateDomainConfig_accessPolicies,
+    updateDomainConfig_advancedOptions,
+    updateDomainConfig_advancedSecurityOptions,
+    updateDomainConfig_autoTuneOptions,
+    updateDomainConfig_clusterConfig,
+    updateDomainConfig_cognitoOptions,
+    updateDomainConfig_domainEndpointOptions,
+    updateDomainConfig_dryRun,
+    updateDomainConfig_eBSOptions,
+    updateDomainConfig_encryptionAtRestOptions,
+    updateDomainConfig_logPublishingOptions,
+    updateDomainConfig_nodeToNodeEncryptionOptions,
+    updateDomainConfig_snapshotOptions,
+    updateDomainConfig_vPCOptions,
+    updateDomainConfig_domainName,
+    updateDomainConfigResponse_dryRunResults,
+    updateDomainConfigResponse_httpStatus,
+    updateDomainConfigResponse_domainConfig,
+
+    -- ** UpdatePackage
+    updatePackage_commitMessage,
+    updatePackage_packageDescription,
+    updatePackage_packageID,
+    updatePackage_packageSource,
+    updatePackageResponse_packageDetails,
+    updatePackageResponse_httpStatus,
+
+    -- ** UpdateVpcEndpoint
+    updateVpcEndpoint_vpcEndpointId,
+    updateVpcEndpoint_vpcOptions,
+    updateVpcEndpointResponse_httpStatus,
+    updateVpcEndpointResponse_vpcEndpoint,
+
+    -- ** UpgradeDomain
+    upgradeDomain_advancedOptions,
+    upgradeDomain_performCheckOnly,
+    upgradeDomain_domainName,
+    upgradeDomain_targetVersion,
+    upgradeDomainResponse_advancedOptions,
+    upgradeDomainResponse_changeProgressDetails,
+    upgradeDomainResponse_domainName,
+    upgradeDomainResponse_performCheckOnly,
+    upgradeDomainResponse_targetVersion,
+    upgradeDomainResponse_upgradeId,
+    upgradeDomainResponse_httpStatus,
+
+    -- * Types
+
+    -- ** AWSDomainInformation
+    aWSDomainInformation_ownerId,
+    aWSDomainInformation_region,
+    aWSDomainInformation_domainName,
+
+    -- ** AccessPoliciesStatus
+    accessPoliciesStatus_options,
+    accessPoliciesStatus_status,
+
+    -- ** AdditionalLimit
+    additionalLimit_limitName,
+    additionalLimit_limitValues,
+
+    -- ** AdvancedOptionsStatus
+    advancedOptionsStatus_options,
+    advancedOptionsStatus_status,
+
+    -- ** AdvancedSecurityOptions
+    advancedSecurityOptions_anonymousAuthDisableDate,
+    advancedSecurityOptions_anonymousAuthEnabled,
+    advancedSecurityOptions_enabled,
+    advancedSecurityOptions_internalUserDatabaseEnabled,
+    advancedSecurityOptions_sAMLOptions,
+
+    -- ** AdvancedSecurityOptionsInput
+    advancedSecurityOptionsInput_anonymousAuthEnabled,
+    advancedSecurityOptionsInput_enabled,
+    advancedSecurityOptionsInput_internalUserDatabaseEnabled,
+    advancedSecurityOptionsInput_masterUserOptions,
+    advancedSecurityOptionsInput_sAMLOptions,
+
+    -- ** AdvancedSecurityOptionsStatus
+    advancedSecurityOptionsStatus_options,
+    advancedSecurityOptionsStatus_status,
+
+    -- ** AuthorizedPrincipal
+    authorizedPrincipal_principal,
+    authorizedPrincipal_principalType,
+
+    -- ** AutoTune
+    autoTune_autoTuneDetails,
+    autoTune_autoTuneType,
+
+    -- ** AutoTuneDetails
+    autoTuneDetails_scheduledAutoTuneDetails,
+
+    -- ** AutoTuneMaintenanceSchedule
+    autoTuneMaintenanceSchedule_cronExpressionForRecurrence,
+    autoTuneMaintenanceSchedule_duration,
+    autoTuneMaintenanceSchedule_startAt,
+
+    -- ** AutoTuneOptions
+    autoTuneOptions_desiredState,
+    autoTuneOptions_maintenanceSchedules,
+    autoTuneOptions_rollbackOnDisable,
+
+    -- ** AutoTuneOptionsInput
+    autoTuneOptionsInput_desiredState,
+    autoTuneOptionsInput_maintenanceSchedules,
+
+    -- ** AutoTuneOptionsOutput
+    autoTuneOptionsOutput_errorMessage,
+    autoTuneOptionsOutput_state,
+
+    -- ** AutoTuneOptionsStatus
+    autoTuneOptionsStatus_options,
+    autoTuneOptionsStatus_status,
+
+    -- ** AutoTuneStatus
+    autoTuneStatus_errorMessage,
+    autoTuneStatus_pendingDeletion,
+    autoTuneStatus_updateVersion,
+    autoTuneStatus_creationDate,
+    autoTuneStatus_updateDate,
+    autoTuneStatus_state,
+
+    -- ** ChangeProgressDetails
+    changeProgressDetails_changeId,
+    changeProgressDetails_message,
+
+    -- ** ChangeProgressStage
+    changeProgressStage_description,
+    changeProgressStage_lastUpdated,
+    changeProgressStage_name,
+    changeProgressStage_status,
+
+    -- ** ChangeProgressStatusDetails
+    changeProgressStatusDetails_changeId,
+    changeProgressStatusDetails_changeProgressStages,
+    changeProgressStatusDetails_completedProperties,
+    changeProgressStatusDetails_pendingProperties,
+    changeProgressStatusDetails_startTime,
+    changeProgressStatusDetails_status,
+    changeProgressStatusDetails_totalNumberOfStages,
+
+    -- ** ClusterConfig
+    clusterConfig_coldStorageOptions,
+    clusterConfig_dedicatedMasterCount,
+    clusterConfig_dedicatedMasterEnabled,
+    clusterConfig_dedicatedMasterType,
+    clusterConfig_instanceCount,
+    clusterConfig_instanceType,
+    clusterConfig_warmCount,
+    clusterConfig_warmEnabled,
+    clusterConfig_warmType,
+    clusterConfig_zoneAwarenessConfig,
+    clusterConfig_zoneAwarenessEnabled,
+
+    -- ** ClusterConfigStatus
+    clusterConfigStatus_options,
+    clusterConfigStatus_status,
+
+    -- ** CognitoOptions
+    cognitoOptions_enabled,
+    cognitoOptions_identityPoolId,
+    cognitoOptions_roleArn,
+    cognitoOptions_userPoolId,
+
+    -- ** CognitoOptionsStatus
+    cognitoOptionsStatus_options,
+    cognitoOptionsStatus_status,
+
+    -- ** ColdStorageOptions
+    coldStorageOptions_enabled,
+
+    -- ** CompatibleVersionsMap
+    compatibleVersionsMap_sourceVersion,
+    compatibleVersionsMap_targetVersions,
+
+    -- ** DescribePackagesFilter
+    describePackagesFilter_name,
+    describePackagesFilter_value,
+
+    -- ** DomainConfig
+    domainConfig_accessPolicies,
+    domainConfig_advancedOptions,
+    domainConfig_advancedSecurityOptions,
+    domainConfig_autoTuneOptions,
+    domainConfig_changeProgressDetails,
+    domainConfig_clusterConfig,
+    domainConfig_cognitoOptions,
+    domainConfig_domainEndpointOptions,
+    domainConfig_eBSOptions,
+    domainConfig_encryptionAtRestOptions,
+    domainConfig_engineVersion,
+    domainConfig_logPublishingOptions,
+    domainConfig_nodeToNodeEncryptionOptions,
+    domainConfig_snapshotOptions,
+    domainConfig_vPCOptions,
+
+    -- ** DomainEndpointOptions
+    domainEndpointOptions_customEndpoint,
+    domainEndpointOptions_customEndpointCertificateArn,
+    domainEndpointOptions_customEndpointEnabled,
+    domainEndpointOptions_enforceHTTPS,
+    domainEndpointOptions_tLSSecurityPolicy,
+
+    -- ** DomainEndpointOptionsStatus
+    domainEndpointOptionsStatus_options,
+    domainEndpointOptionsStatus_status,
+
+    -- ** DomainInfo
+    domainInfo_domainName,
+    domainInfo_engineType,
+
+    -- ** DomainInformationContainer
+    domainInformationContainer_aWSDomainInformation,
+
+    -- ** DomainPackageDetails
+    domainPackageDetails_domainName,
+    domainPackageDetails_domainPackageStatus,
+    domainPackageDetails_errorDetails,
+    domainPackageDetails_lastUpdated,
+    domainPackageDetails_packageID,
+    domainPackageDetails_packageName,
+    domainPackageDetails_packageType,
+    domainPackageDetails_packageVersion,
+    domainPackageDetails_referencePath,
+
+    -- ** DomainStatus
+    domainStatus_accessPolicies,
+    domainStatus_advancedOptions,
+    domainStatus_advancedSecurityOptions,
+    domainStatus_autoTuneOptions,
+    domainStatus_changeProgressDetails,
+    domainStatus_cognitoOptions,
+    domainStatus_created,
+    domainStatus_deleted,
+    domainStatus_domainEndpointOptions,
+    domainStatus_eBSOptions,
+    domainStatus_encryptionAtRestOptions,
+    domainStatus_endpoint,
+    domainStatus_endpoints,
+    domainStatus_engineVersion,
+    domainStatus_logPublishingOptions,
+    domainStatus_nodeToNodeEncryptionOptions,
+    domainStatus_processing,
+    domainStatus_serviceSoftwareOptions,
+    domainStatus_snapshotOptions,
+    domainStatus_upgradeProcessing,
+    domainStatus_vPCOptions,
+    domainStatus_domainId,
+    domainStatus_domainName,
+    domainStatus_arn,
+    domainStatus_clusterConfig,
+
+    -- ** DryRunResults
+    dryRunResults_deploymentType,
+    dryRunResults_message,
+
+    -- ** Duration
+    duration_unit,
+    duration_value,
+
+    -- ** EBSOptions
+    eBSOptions_eBSEnabled,
+    eBSOptions_iops,
+    eBSOptions_throughput,
+    eBSOptions_volumeSize,
+    eBSOptions_volumeType,
+
+    -- ** EBSOptionsStatus
+    eBSOptionsStatus_options,
+    eBSOptionsStatus_status,
+
+    -- ** EncryptionAtRestOptions
+    encryptionAtRestOptions_enabled,
+    encryptionAtRestOptions_kmsKeyId,
+
+    -- ** EncryptionAtRestOptionsStatus
+    encryptionAtRestOptionsStatus_options,
+    encryptionAtRestOptionsStatus_status,
+
+    -- ** ErrorDetails
+    errorDetails_errorMessage,
+    errorDetails_errorType,
+
+    -- ** Filter
+    filter_name,
+    filter_values,
+
+    -- ** InboundConnection
+    inboundConnection_connectionId,
+    inboundConnection_connectionStatus,
+    inboundConnection_localDomainInfo,
+    inboundConnection_remoteDomainInfo,
+
+    -- ** InboundConnectionStatus
+    inboundConnectionStatus_message,
+    inboundConnectionStatus_statusCode,
+
+    -- ** InstanceCountLimits
+    instanceCountLimits_maximumInstanceCount,
+    instanceCountLimits_minimumInstanceCount,
+
+    -- ** InstanceLimits
+    instanceLimits_instanceCountLimits,
+
+    -- ** InstanceTypeDetails
+    instanceTypeDetails_advancedSecurityEnabled,
+    instanceTypeDetails_appLogsEnabled,
+    instanceTypeDetails_cognitoEnabled,
+    instanceTypeDetails_encryptionEnabled,
+    instanceTypeDetails_instanceRole,
+    instanceTypeDetails_instanceType,
+    instanceTypeDetails_warmEnabled,
+
+    -- ** Limits
+    limits_additionalLimits,
+    limits_instanceLimits,
+    limits_storageTypes,
+
+    -- ** LogPublishingOption
+    logPublishingOption_cloudWatchLogsLogGroupArn,
+    logPublishingOption_enabled,
+
+    -- ** LogPublishingOptionsStatus
+    logPublishingOptionsStatus_options,
+    logPublishingOptionsStatus_status,
+
+    -- ** MasterUserOptions
+    masterUserOptions_masterUserARN,
+    masterUserOptions_masterUserName,
+    masterUserOptions_masterUserPassword,
+
+    -- ** NodeToNodeEncryptionOptions
+    nodeToNodeEncryptionOptions_enabled,
+
+    -- ** NodeToNodeEncryptionOptionsStatus
+    nodeToNodeEncryptionOptionsStatus_options,
+    nodeToNodeEncryptionOptionsStatus_status,
+
+    -- ** OptionStatus
+    optionStatus_pendingDeletion,
+    optionStatus_updateVersion,
+    optionStatus_creationDate,
+    optionStatus_updateDate,
+    optionStatus_state,
+
+    -- ** OutboundConnection
+    outboundConnection_connectionAlias,
+    outboundConnection_connectionId,
+    outboundConnection_connectionStatus,
+    outboundConnection_localDomainInfo,
+    outboundConnection_remoteDomainInfo,
+
+    -- ** OutboundConnectionStatus
+    outboundConnectionStatus_message,
+    outboundConnectionStatus_statusCode,
+
+    -- ** PackageDetails
+    packageDetails_availablePackageVersion,
+    packageDetails_createdAt,
+    packageDetails_errorDetails,
+    packageDetails_lastUpdatedAt,
+    packageDetails_packageDescription,
+    packageDetails_packageID,
+    packageDetails_packageName,
+    packageDetails_packageStatus,
+    packageDetails_packageType,
+
+    -- ** PackageSource
+    packageSource_s3BucketName,
+    packageSource_s3Key,
+
+    -- ** PackageVersionHistory
+    packageVersionHistory_commitMessage,
+    packageVersionHistory_createdAt,
+    packageVersionHistory_packageVersion,
+
+    -- ** RecurringCharge
+    recurringCharge_recurringChargeAmount,
+    recurringCharge_recurringChargeFrequency,
+
+    -- ** ReservedInstance
+    reservedInstance_billingSubscriptionId,
+    reservedInstance_currencyCode,
+    reservedInstance_duration,
+    reservedInstance_fixedPrice,
+    reservedInstance_instanceCount,
+    reservedInstance_instanceType,
+    reservedInstance_paymentOption,
+    reservedInstance_recurringCharges,
+    reservedInstance_reservationName,
+    reservedInstance_reservedInstanceId,
+    reservedInstance_reservedInstanceOfferingId,
+    reservedInstance_startTime,
+    reservedInstance_state,
+    reservedInstance_usagePrice,
+
+    -- ** ReservedInstanceOffering
+    reservedInstanceOffering_currencyCode,
+    reservedInstanceOffering_duration,
+    reservedInstanceOffering_fixedPrice,
+    reservedInstanceOffering_instanceType,
+    reservedInstanceOffering_paymentOption,
+    reservedInstanceOffering_recurringCharges,
+    reservedInstanceOffering_reservedInstanceOfferingId,
+    reservedInstanceOffering_usagePrice,
+
+    -- ** SAMLIdp
+    sAMLIdp_metadataContent,
+    sAMLIdp_entityId,
+
+    -- ** SAMLOptionsInput
+    sAMLOptionsInput_enabled,
+    sAMLOptionsInput_idp,
+    sAMLOptionsInput_masterBackendRole,
+    sAMLOptionsInput_masterUserName,
+    sAMLOptionsInput_rolesKey,
+    sAMLOptionsInput_sessionTimeoutMinutes,
+    sAMLOptionsInput_subjectKey,
+
+    -- ** SAMLOptionsOutput
+    sAMLOptionsOutput_enabled,
+    sAMLOptionsOutput_idp,
+    sAMLOptionsOutput_rolesKey,
+    sAMLOptionsOutput_sessionTimeoutMinutes,
+    sAMLOptionsOutput_subjectKey,
+
+    -- ** ScheduledAutoTuneDetails
+    scheduledAutoTuneDetails_action,
+    scheduledAutoTuneDetails_actionType,
+    scheduledAutoTuneDetails_date,
+    scheduledAutoTuneDetails_severity,
+
+    -- ** ServiceSoftwareOptions
+    serviceSoftwareOptions_automatedUpdateDate,
+    serviceSoftwareOptions_cancellable,
+    serviceSoftwareOptions_currentVersion,
+    serviceSoftwareOptions_description,
+    serviceSoftwareOptions_newVersion,
+    serviceSoftwareOptions_optionalDeployment,
+    serviceSoftwareOptions_updateAvailable,
+    serviceSoftwareOptions_updateStatus,
+
+    -- ** SnapshotOptions
+    snapshotOptions_automatedSnapshotStartHour,
+
+    -- ** SnapshotOptionsStatus
+    snapshotOptionsStatus_options,
+    snapshotOptionsStatus_status,
+
+    -- ** StorageType
+    storageType_storageSubTypeName,
+    storageType_storageTypeLimits,
+    storageType_storageTypeName,
+
+    -- ** StorageTypeLimit
+    storageTypeLimit_limitName,
+    storageTypeLimit_limitValues,
+
+    -- ** Tag
+    tag_key,
+    tag_value,
+
+    -- ** UpgradeHistory
+    upgradeHistory_startTimestamp,
+    upgradeHistory_stepsList,
+    upgradeHistory_upgradeName,
+    upgradeHistory_upgradeStatus,
+
+    -- ** UpgradeStepItem
+    upgradeStepItem_issues,
+    upgradeStepItem_progressPercent,
+    upgradeStepItem_upgradeStep,
+    upgradeStepItem_upgradeStepStatus,
+
+    -- ** VPCDerivedInfo
+    vPCDerivedInfo_availabilityZones,
+    vPCDerivedInfo_securityGroupIds,
+    vPCDerivedInfo_subnetIds,
+    vPCDerivedInfo_vPCId,
+
+    -- ** VPCDerivedInfoStatus
+    vPCDerivedInfoStatus_options,
+    vPCDerivedInfoStatus_status,
+
+    -- ** VPCOptions
+    vPCOptions_securityGroupIds,
+    vPCOptions_subnetIds,
+
+    -- ** VersionStatus
+    versionStatus_options,
+    versionStatus_status,
+
+    -- ** VpcEndpoint
+    vpcEndpoint_domainArn,
+    vpcEndpoint_endpoint,
+    vpcEndpoint_status,
+    vpcEndpoint_vpcEndpointId,
+    vpcEndpoint_vpcEndpointOwner,
+    vpcEndpoint_vpcOptions,
+
+    -- ** VpcEndpointError
+    vpcEndpointError_errorCode,
+    vpcEndpointError_errorMessage,
+    vpcEndpointError_vpcEndpointId,
+
+    -- ** VpcEndpointSummary
+    vpcEndpointSummary_domainArn,
+    vpcEndpointSummary_status,
+    vpcEndpointSummary_vpcEndpointId,
+    vpcEndpointSummary_vpcEndpointOwner,
+
+    -- ** ZoneAwarenessConfig
+    zoneAwarenessConfig_availabilityZoneCount,
+  )
+where
+
+import Amazonka.OpenSearch.AcceptInboundConnection
+import Amazonka.OpenSearch.AddTags
+import Amazonka.OpenSearch.AssociatePackage
+import Amazonka.OpenSearch.AuthorizeVpcEndpointAccess
+import Amazonka.OpenSearch.CancelServiceSoftwareUpdate
+import Amazonka.OpenSearch.CreateDomain
+import Amazonka.OpenSearch.CreateOutboundConnection
+import Amazonka.OpenSearch.CreatePackage
+import Amazonka.OpenSearch.CreateVpcEndpoint
+import Amazonka.OpenSearch.DeleteDomain
+import Amazonka.OpenSearch.DeleteInboundConnection
+import Amazonka.OpenSearch.DeleteOutboundConnection
+import Amazonka.OpenSearch.DeletePackage
+import Amazonka.OpenSearch.DeleteVpcEndpoint
+import Amazonka.OpenSearch.DescribeDomain
+import Amazonka.OpenSearch.DescribeDomainAutoTunes
+import Amazonka.OpenSearch.DescribeDomainChangeProgress
+import Amazonka.OpenSearch.DescribeDomainConfig
+import Amazonka.OpenSearch.DescribeDomains
+import Amazonka.OpenSearch.DescribeInboundConnections
+import Amazonka.OpenSearch.DescribeInstanceTypeLimits
+import Amazonka.OpenSearch.DescribeOutboundConnections
+import Amazonka.OpenSearch.DescribePackages
+import Amazonka.OpenSearch.DescribeReservedInstanceOfferings
+import Amazonka.OpenSearch.DescribeReservedInstances
+import Amazonka.OpenSearch.DescribeVpcEndpoints
+import Amazonka.OpenSearch.DissociatePackage
+import Amazonka.OpenSearch.GetCompatibleVersions
+import Amazonka.OpenSearch.GetPackageVersionHistory
+import Amazonka.OpenSearch.GetUpgradeHistory
+import Amazonka.OpenSearch.GetUpgradeStatus
+import Amazonka.OpenSearch.ListDomainNames
+import Amazonka.OpenSearch.ListDomainsForPackage
+import Amazonka.OpenSearch.ListInstanceTypeDetails
+import Amazonka.OpenSearch.ListPackagesForDomain
+import Amazonka.OpenSearch.ListTags
+import Amazonka.OpenSearch.ListVersions
+import Amazonka.OpenSearch.ListVpcEndpointAccess
+import Amazonka.OpenSearch.ListVpcEndpoints
+import Amazonka.OpenSearch.ListVpcEndpointsForDomain
+import Amazonka.OpenSearch.PurchaseReservedInstanceOffering
+import Amazonka.OpenSearch.RejectInboundConnection
+import Amazonka.OpenSearch.RemoveTags
+import Amazonka.OpenSearch.RevokeVpcEndpointAccess
+import Amazonka.OpenSearch.StartServiceSoftwareUpdate
+import Amazonka.OpenSearch.Types.AWSDomainInformation
+import Amazonka.OpenSearch.Types.AccessPoliciesStatus
+import Amazonka.OpenSearch.Types.AdditionalLimit
+import Amazonka.OpenSearch.Types.AdvancedOptionsStatus
+import Amazonka.OpenSearch.Types.AdvancedSecurityOptions
+import Amazonka.OpenSearch.Types.AdvancedSecurityOptionsInput
+import Amazonka.OpenSearch.Types.AdvancedSecurityOptionsStatus
+import Amazonka.OpenSearch.Types.AuthorizedPrincipal
+import Amazonka.OpenSearch.Types.AutoTune
+import Amazonka.OpenSearch.Types.AutoTuneDetails
+import Amazonka.OpenSearch.Types.AutoTuneMaintenanceSchedule
+import Amazonka.OpenSearch.Types.AutoTuneOptions
+import Amazonka.OpenSearch.Types.AutoTuneOptionsInput
+import Amazonka.OpenSearch.Types.AutoTuneOptionsOutput
+import Amazonka.OpenSearch.Types.AutoTuneOptionsStatus
+import Amazonka.OpenSearch.Types.AutoTuneStatus
+import Amazonka.OpenSearch.Types.ChangeProgressDetails
+import Amazonka.OpenSearch.Types.ChangeProgressStage
+import Amazonka.OpenSearch.Types.ChangeProgressStatusDetails
+import Amazonka.OpenSearch.Types.ClusterConfig
+import Amazonka.OpenSearch.Types.ClusterConfigStatus
+import Amazonka.OpenSearch.Types.CognitoOptions
+import Amazonka.OpenSearch.Types.CognitoOptionsStatus
+import Amazonka.OpenSearch.Types.ColdStorageOptions
+import Amazonka.OpenSearch.Types.CompatibleVersionsMap
+import Amazonka.OpenSearch.Types.DescribePackagesFilter
+import Amazonka.OpenSearch.Types.DomainConfig
+import Amazonka.OpenSearch.Types.DomainEndpointOptions
+import Amazonka.OpenSearch.Types.DomainEndpointOptionsStatus
+import Amazonka.OpenSearch.Types.DomainInfo
+import Amazonka.OpenSearch.Types.DomainInformationContainer
+import Amazonka.OpenSearch.Types.DomainPackageDetails
+import Amazonka.OpenSearch.Types.DomainStatus
+import Amazonka.OpenSearch.Types.DryRunResults
+import Amazonka.OpenSearch.Types.Duration
+import Amazonka.OpenSearch.Types.EBSOptions
+import Amazonka.OpenSearch.Types.EBSOptionsStatus
+import Amazonka.OpenSearch.Types.EncryptionAtRestOptions
+import Amazonka.OpenSearch.Types.EncryptionAtRestOptionsStatus
+import Amazonka.OpenSearch.Types.ErrorDetails
+import Amazonka.OpenSearch.Types.Filter
+import Amazonka.OpenSearch.Types.InboundConnection
+import Amazonka.OpenSearch.Types.InboundConnectionStatus
+import Amazonka.OpenSearch.Types.InstanceCountLimits
+import Amazonka.OpenSearch.Types.InstanceLimits
+import Amazonka.OpenSearch.Types.InstanceTypeDetails
+import Amazonka.OpenSearch.Types.Limits
+import Amazonka.OpenSearch.Types.LogPublishingOption
+import Amazonka.OpenSearch.Types.LogPublishingOptionsStatus
+import Amazonka.OpenSearch.Types.MasterUserOptions
+import Amazonka.OpenSearch.Types.NodeToNodeEncryptionOptions
+import Amazonka.OpenSearch.Types.NodeToNodeEncryptionOptionsStatus
+import Amazonka.OpenSearch.Types.OptionStatus
+import Amazonka.OpenSearch.Types.OutboundConnection
+import Amazonka.OpenSearch.Types.OutboundConnectionStatus
+import Amazonka.OpenSearch.Types.PackageDetails
+import Amazonka.OpenSearch.Types.PackageSource
+import Amazonka.OpenSearch.Types.PackageVersionHistory
+import Amazonka.OpenSearch.Types.RecurringCharge
+import Amazonka.OpenSearch.Types.ReservedInstance
+import Amazonka.OpenSearch.Types.ReservedInstanceOffering
+import Amazonka.OpenSearch.Types.SAMLIdp
+import Amazonka.OpenSearch.Types.SAMLOptionsInput
+import Amazonka.OpenSearch.Types.SAMLOptionsOutput
+import Amazonka.OpenSearch.Types.ScheduledAutoTuneDetails
+import Amazonka.OpenSearch.Types.ServiceSoftwareOptions
+import Amazonka.OpenSearch.Types.SnapshotOptions
+import Amazonka.OpenSearch.Types.SnapshotOptionsStatus
+import Amazonka.OpenSearch.Types.StorageType
+import Amazonka.OpenSearch.Types.StorageTypeLimit
+import Amazonka.OpenSearch.Types.Tag
+import Amazonka.OpenSearch.Types.UpgradeHistory
+import Amazonka.OpenSearch.Types.UpgradeStepItem
+import Amazonka.OpenSearch.Types.VPCDerivedInfo
+import Amazonka.OpenSearch.Types.VPCDerivedInfoStatus
+import Amazonka.OpenSearch.Types.VPCOptions
+import Amazonka.OpenSearch.Types.VersionStatus
+import Amazonka.OpenSearch.Types.VpcEndpoint
+import Amazonka.OpenSearch.Types.VpcEndpointError
+import Amazonka.OpenSearch.Types.VpcEndpointSummary
+import Amazonka.OpenSearch.Types.ZoneAwarenessConfig
+import Amazonka.OpenSearch.UpdateDomainConfig
+import Amazonka.OpenSearch.UpdatePackage
+import Amazonka.OpenSearch.UpdateVpcEndpoint
+import Amazonka.OpenSearch.UpgradeDomain
diff --git a/gen/Amazonka/OpenSearch/ListDomainNames.hs b/gen/Amazonka/OpenSearch/ListDomainNames.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/ListDomainNames.hs
@@ -0,0 +1,157 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.ListDomainNames
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the names of all Amazon OpenSearch Service domains owned by the
+-- current user in the active Region.
+module Amazonka.OpenSearch.ListDomainNames
+  ( -- * Creating a Request
+    ListDomainNames (..),
+    newListDomainNames,
+
+    -- * Request Lenses
+    listDomainNames_engineType,
+
+    -- * Destructuring the Response
+    ListDomainNamesResponse (..),
+    newListDomainNamesResponse,
+
+    -- * Response Lenses
+    listDomainNamesResponse_domainNames,
+    listDomainNamesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @ListDomainNames@ operation.
+--
+-- /See:/ 'newListDomainNames' smart constructor.
+data ListDomainNames = ListDomainNames'
+  { -- | Filters the output by domain engine type.
+    engineType :: Prelude.Maybe EngineType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDomainNames' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'engineType', 'listDomainNames_engineType' - Filters the output by domain engine type.
+newListDomainNames ::
+  ListDomainNames
+newListDomainNames =
+  ListDomainNames' {engineType = Prelude.Nothing}
+
+-- | Filters the output by domain engine type.
+listDomainNames_engineType :: Lens.Lens' ListDomainNames (Prelude.Maybe EngineType)
+listDomainNames_engineType = Lens.lens (\ListDomainNames' {engineType} -> engineType) (\s@ListDomainNames' {} a -> s {engineType = a} :: ListDomainNames)
+
+instance Core.AWSRequest ListDomainNames where
+  type
+    AWSResponse ListDomainNames =
+      ListDomainNamesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDomainNamesResponse'
+            Prelude.<$> (x Data..?> "DomainNames" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListDomainNames where
+  hashWithSalt _salt ListDomainNames' {..} =
+    _salt `Prelude.hashWithSalt` engineType
+
+instance Prelude.NFData ListDomainNames where
+  rnf ListDomainNames' {..} = Prelude.rnf engineType
+
+instance Data.ToHeaders ListDomainNames where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListDomainNames where
+  toPath = Prelude.const "/2021-01-01/domain"
+
+instance Data.ToQuery ListDomainNames where
+  toQuery ListDomainNames' {..} =
+    Prelude.mconcat ["engineType" Data.=: engineType]
+
+-- | The results of a @ListDomainNames@ operation. Contains the names of all
+-- domains owned by this account and their respective engine types.
+--
+-- /See:/ 'newListDomainNamesResponse' smart constructor.
+data ListDomainNamesResponse = ListDomainNamesResponse'
+  { -- | The names of all OpenSearch Service domains owned by the current user
+    -- and their respective engine types.
+    domainNames :: Prelude.Maybe [DomainInfo],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDomainNamesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainNames', 'listDomainNamesResponse_domainNames' - The names of all OpenSearch Service domains owned by the current user
+-- and their respective engine types.
+--
+-- 'httpStatus', 'listDomainNamesResponse_httpStatus' - The response's http status code.
+newListDomainNamesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDomainNamesResponse
+newListDomainNamesResponse pHttpStatus_ =
+  ListDomainNamesResponse'
+    { domainNames =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The names of all OpenSearch Service domains owned by the current user
+-- and their respective engine types.
+listDomainNamesResponse_domainNames :: Lens.Lens' ListDomainNamesResponse (Prelude.Maybe [DomainInfo])
+listDomainNamesResponse_domainNames = Lens.lens (\ListDomainNamesResponse' {domainNames} -> domainNames) (\s@ListDomainNamesResponse' {} a -> s {domainNames = a} :: ListDomainNamesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listDomainNamesResponse_httpStatus :: Lens.Lens' ListDomainNamesResponse Prelude.Int
+listDomainNamesResponse_httpStatus = Lens.lens (\ListDomainNamesResponse' {httpStatus} -> httpStatus) (\s@ListDomainNamesResponse' {} a -> s {httpStatus = a} :: ListDomainNamesResponse)
+
+instance Prelude.NFData ListDomainNamesResponse where
+  rnf ListDomainNamesResponse' {..} =
+    Prelude.rnf domainNames
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/ListDomainsForPackage.hs b/gen/Amazonka/OpenSearch/ListDomainsForPackage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/ListDomainsForPackage.hs
@@ -0,0 +1,231 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.ListDomainsForPackage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all Amazon OpenSearch Service domains associated with a given
+-- package. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/custom-packages.html Custom packages for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.ListDomainsForPackage
+  ( -- * Creating a Request
+    ListDomainsForPackage (..),
+    newListDomainsForPackage,
+
+    -- * Request Lenses
+    listDomainsForPackage_maxResults,
+    listDomainsForPackage_nextToken,
+    listDomainsForPackage_packageID,
+
+    -- * Destructuring the Response
+    ListDomainsForPackageResponse (..),
+    newListDomainsForPackageResponse,
+
+    -- * Response Lenses
+    listDomainsForPackageResponse_domainPackageDetailsList,
+    listDomainsForPackageResponse_nextToken,
+    listDomainsForPackageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to the @ListDomainsForPackage@
+-- operation.
+--
+-- /See:/ 'newListDomainsForPackage' smart constructor.
+data ListDomainsForPackage = ListDomainsForPackage'
+  { -- | An optional parameter that specifies the maximum number of results to
+    -- return. You can use @nextToken@ to get the next page of results.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | If your initial @ListDomainsForPackage@ operation returns a @nextToken@,
+    -- you can include the returned @nextToken@ in subsequent
+    -- @ListDomainsForPackage@ operations, which returns results in the next
+    -- page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the package for which to list associated
+    -- domains.
+    packageID :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDomainsForPackage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listDomainsForPackage_maxResults' - An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+--
+-- 'nextToken', 'listDomainsForPackage_nextToken' - If your initial @ListDomainsForPackage@ operation returns a @nextToken@,
+-- you can include the returned @nextToken@ in subsequent
+-- @ListDomainsForPackage@ operations, which returns results in the next
+-- page.
+--
+-- 'packageID', 'listDomainsForPackage_packageID' - The unique identifier of the package for which to list associated
+-- domains.
+newListDomainsForPackage ::
+  -- | 'packageID'
+  Prelude.Text ->
+  ListDomainsForPackage
+newListDomainsForPackage pPackageID_ =
+  ListDomainsForPackage'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      packageID = pPackageID_
+    }
+
+-- | An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+listDomainsForPackage_maxResults :: Lens.Lens' ListDomainsForPackage (Prelude.Maybe Prelude.Int)
+listDomainsForPackage_maxResults = Lens.lens (\ListDomainsForPackage' {maxResults} -> maxResults) (\s@ListDomainsForPackage' {} a -> s {maxResults = a} :: ListDomainsForPackage)
+
+-- | If your initial @ListDomainsForPackage@ operation returns a @nextToken@,
+-- you can include the returned @nextToken@ in subsequent
+-- @ListDomainsForPackage@ operations, which returns results in the next
+-- page.
+listDomainsForPackage_nextToken :: Lens.Lens' ListDomainsForPackage (Prelude.Maybe Prelude.Text)
+listDomainsForPackage_nextToken = Lens.lens (\ListDomainsForPackage' {nextToken} -> nextToken) (\s@ListDomainsForPackage' {} a -> s {nextToken = a} :: ListDomainsForPackage)
+
+-- | The unique identifier of the package for which to list associated
+-- domains.
+listDomainsForPackage_packageID :: Lens.Lens' ListDomainsForPackage Prelude.Text
+listDomainsForPackage_packageID = Lens.lens (\ListDomainsForPackage' {packageID} -> packageID) (\s@ListDomainsForPackage' {} a -> s {packageID = a} :: ListDomainsForPackage)
+
+instance Core.AWSRequest ListDomainsForPackage where
+  type
+    AWSResponse ListDomainsForPackage =
+      ListDomainsForPackageResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDomainsForPackageResponse'
+            Prelude.<$> ( x
+                            Data..?> "DomainPackageDetailsList"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListDomainsForPackage where
+  hashWithSalt _salt ListDomainsForPackage' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` packageID
+
+instance Prelude.NFData ListDomainsForPackage where
+  rnf ListDomainsForPackage' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf packageID
+
+instance Data.ToHeaders ListDomainsForPackage where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListDomainsForPackage where
+  toPath ListDomainsForPackage' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/packages/",
+        Data.toBS packageID,
+        "/domains"
+      ]
+
+instance Data.ToQuery ListDomainsForPackage where
+  toQuery ListDomainsForPackage' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | Container for the response parameters to the @ListDomainsForPackage@
+-- operation.
+--
+-- /See:/ 'newListDomainsForPackageResponse' smart constructor.
+data ListDomainsForPackageResponse = ListDomainsForPackageResponse'
+  { -- | Information about all domains associated with a package.
+    domainPackageDetailsList :: Prelude.Maybe [DomainPackageDetails],
+    -- | When @nextToken@ is returned, there are more results available. The
+    -- value of @nextToken@ is a unique pagination token for each page. Make
+    -- the call again using the returned token to retrieve the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDomainsForPackageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainPackageDetailsList', 'listDomainsForPackageResponse_domainPackageDetailsList' - Information about all domains associated with a package.
+--
+-- 'nextToken', 'listDomainsForPackageResponse_nextToken' - When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+--
+-- 'httpStatus', 'listDomainsForPackageResponse_httpStatus' - The response's http status code.
+newListDomainsForPackageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDomainsForPackageResponse
+newListDomainsForPackageResponse pHttpStatus_ =
+  ListDomainsForPackageResponse'
+    { domainPackageDetailsList =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about all domains associated with a package.
+listDomainsForPackageResponse_domainPackageDetailsList :: Lens.Lens' ListDomainsForPackageResponse (Prelude.Maybe [DomainPackageDetails])
+listDomainsForPackageResponse_domainPackageDetailsList = Lens.lens (\ListDomainsForPackageResponse' {domainPackageDetailsList} -> domainPackageDetailsList) (\s@ListDomainsForPackageResponse' {} a -> s {domainPackageDetailsList = a} :: ListDomainsForPackageResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+listDomainsForPackageResponse_nextToken :: Lens.Lens' ListDomainsForPackageResponse (Prelude.Maybe Prelude.Text)
+listDomainsForPackageResponse_nextToken = Lens.lens (\ListDomainsForPackageResponse' {nextToken} -> nextToken) (\s@ListDomainsForPackageResponse' {} a -> s {nextToken = a} :: ListDomainsForPackageResponse)
+
+-- | The response's http status code.
+listDomainsForPackageResponse_httpStatus :: Lens.Lens' ListDomainsForPackageResponse Prelude.Int
+listDomainsForPackageResponse_httpStatus = Lens.lens (\ListDomainsForPackageResponse' {httpStatus} -> httpStatus) (\s@ListDomainsForPackageResponse' {} a -> s {httpStatus = a} :: ListDomainsForPackageResponse)
+
+instance Prelude.NFData ListDomainsForPackageResponse where
+  rnf ListDomainsForPackageResponse' {..} =
+    Prelude.rnf domainPackageDetailsList
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/ListInstanceTypeDetails.hs b/gen/Amazonka/OpenSearch/ListInstanceTypeDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/ListInstanceTypeDetails.hs
@@ -0,0 +1,242 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.ListInstanceTypeDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all instance types and available features for a given OpenSearch
+-- or Elasticsearch version.
+module Amazonka.OpenSearch.ListInstanceTypeDetails
+  ( -- * Creating a Request
+    ListInstanceTypeDetails (..),
+    newListInstanceTypeDetails,
+
+    -- * Request Lenses
+    listInstanceTypeDetails_domainName,
+    listInstanceTypeDetails_maxResults,
+    listInstanceTypeDetails_nextToken,
+    listInstanceTypeDetails_engineVersion,
+
+    -- * Destructuring the Response
+    ListInstanceTypeDetailsResponse (..),
+    newListInstanceTypeDetailsResponse,
+
+    -- * Response Lenses
+    listInstanceTypeDetailsResponse_instanceTypeDetails,
+    listInstanceTypeDetailsResponse_nextToken,
+    listInstanceTypeDetailsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListInstanceTypeDetails' smart constructor.
+data ListInstanceTypeDetails = ListInstanceTypeDetails'
+  { -- | Name of the domain to list instance type details for.
+    domainName :: Prelude.Maybe Prelude.Text,
+    -- | An optional parameter that specifies the maximum number of results to
+    -- return. You can use @nextToken@ to get the next page of results.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | If your initial @ListInstanceTypeDetails@ operation returns a
+    -- @nextToken@, you can include the returned @nextToken@ in subsequent
+    -- @ListInstanceTypeDetails@ operations, which returns results in the next
+    -- page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Version of OpenSearch or Elasticsearch, in the format Elasticsearch_X.Y
+    -- or OpenSearch_X.Y. Defaults to the latest version of OpenSearch.
+    engineVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListInstanceTypeDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainName', 'listInstanceTypeDetails_domainName' - Name of the domain to list instance type details for.
+--
+-- 'maxResults', 'listInstanceTypeDetails_maxResults' - An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+--
+-- 'nextToken', 'listInstanceTypeDetails_nextToken' - If your initial @ListInstanceTypeDetails@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @ListInstanceTypeDetails@ operations, which returns results in the next
+-- page.
+--
+-- 'engineVersion', 'listInstanceTypeDetails_engineVersion' - Version of OpenSearch or Elasticsearch, in the format Elasticsearch_X.Y
+-- or OpenSearch_X.Y. Defaults to the latest version of OpenSearch.
+newListInstanceTypeDetails ::
+  -- | 'engineVersion'
+  Prelude.Text ->
+  ListInstanceTypeDetails
+newListInstanceTypeDetails pEngineVersion_ =
+  ListInstanceTypeDetails'
+    { domainName =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      engineVersion = pEngineVersion_
+    }
+
+-- | Name of the domain to list instance type details for.
+listInstanceTypeDetails_domainName :: Lens.Lens' ListInstanceTypeDetails (Prelude.Maybe Prelude.Text)
+listInstanceTypeDetails_domainName = Lens.lens (\ListInstanceTypeDetails' {domainName} -> domainName) (\s@ListInstanceTypeDetails' {} a -> s {domainName = a} :: ListInstanceTypeDetails)
+
+-- | An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+listInstanceTypeDetails_maxResults :: Lens.Lens' ListInstanceTypeDetails (Prelude.Maybe Prelude.Int)
+listInstanceTypeDetails_maxResults = Lens.lens (\ListInstanceTypeDetails' {maxResults} -> maxResults) (\s@ListInstanceTypeDetails' {} a -> s {maxResults = a} :: ListInstanceTypeDetails)
+
+-- | If your initial @ListInstanceTypeDetails@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @ListInstanceTypeDetails@ operations, which returns results in the next
+-- page.
+listInstanceTypeDetails_nextToken :: Lens.Lens' ListInstanceTypeDetails (Prelude.Maybe Prelude.Text)
+listInstanceTypeDetails_nextToken = Lens.lens (\ListInstanceTypeDetails' {nextToken} -> nextToken) (\s@ListInstanceTypeDetails' {} a -> s {nextToken = a} :: ListInstanceTypeDetails)
+
+-- | Version of OpenSearch or Elasticsearch, in the format Elasticsearch_X.Y
+-- or OpenSearch_X.Y. Defaults to the latest version of OpenSearch.
+listInstanceTypeDetails_engineVersion :: Lens.Lens' ListInstanceTypeDetails Prelude.Text
+listInstanceTypeDetails_engineVersion = Lens.lens (\ListInstanceTypeDetails' {engineVersion} -> engineVersion) (\s@ListInstanceTypeDetails' {} a -> s {engineVersion = a} :: ListInstanceTypeDetails)
+
+instance Core.AWSRequest ListInstanceTypeDetails where
+  type
+    AWSResponse ListInstanceTypeDetails =
+      ListInstanceTypeDetailsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListInstanceTypeDetailsResponse'
+            Prelude.<$> ( x
+                            Data..?> "InstanceTypeDetails"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListInstanceTypeDetails where
+  hashWithSalt _salt ListInstanceTypeDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` domainName
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` engineVersion
+
+instance Prelude.NFData ListInstanceTypeDetails where
+  rnf ListInstanceTypeDetails' {..} =
+    Prelude.rnf domainName
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf engineVersion
+
+instance Data.ToHeaders ListInstanceTypeDetails where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListInstanceTypeDetails where
+  toPath ListInstanceTypeDetails' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/instanceTypeDetails/",
+        Data.toBS engineVersion
+      ]
+
+instance Data.ToQuery ListInstanceTypeDetails where
+  toQuery ListInstanceTypeDetails' {..} =
+    Prelude.mconcat
+      [ "domainName" Data.=: domainName,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListInstanceTypeDetailsResponse' smart constructor.
+data ListInstanceTypeDetailsResponse = ListInstanceTypeDetailsResponse'
+  { -- | Lists all supported instance types and features for the given OpenSearch
+    -- or Elasticsearch version.
+    instanceTypeDetails :: Prelude.Maybe [InstanceTypeDetails],
+    -- | When @nextToken@ is returned, there are more results available. The
+    -- value of @nextToken@ is a unique pagination token for each page. Make
+    -- the call again using the returned token to retrieve the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListInstanceTypeDetailsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'instanceTypeDetails', 'listInstanceTypeDetailsResponse_instanceTypeDetails' - Lists all supported instance types and features for the given OpenSearch
+-- or Elasticsearch version.
+--
+-- 'nextToken', 'listInstanceTypeDetailsResponse_nextToken' - When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+--
+-- 'httpStatus', 'listInstanceTypeDetailsResponse_httpStatus' - The response's http status code.
+newListInstanceTypeDetailsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListInstanceTypeDetailsResponse
+newListInstanceTypeDetailsResponse pHttpStatus_ =
+  ListInstanceTypeDetailsResponse'
+    { instanceTypeDetails =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Lists all supported instance types and features for the given OpenSearch
+-- or Elasticsearch version.
+listInstanceTypeDetailsResponse_instanceTypeDetails :: Lens.Lens' ListInstanceTypeDetailsResponse (Prelude.Maybe [InstanceTypeDetails])
+listInstanceTypeDetailsResponse_instanceTypeDetails = Lens.lens (\ListInstanceTypeDetailsResponse' {instanceTypeDetails} -> instanceTypeDetails) (\s@ListInstanceTypeDetailsResponse' {} a -> s {instanceTypeDetails = a} :: ListInstanceTypeDetailsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+listInstanceTypeDetailsResponse_nextToken :: Lens.Lens' ListInstanceTypeDetailsResponse (Prelude.Maybe Prelude.Text)
+listInstanceTypeDetailsResponse_nextToken = Lens.lens (\ListInstanceTypeDetailsResponse' {nextToken} -> nextToken) (\s@ListInstanceTypeDetailsResponse' {} a -> s {nextToken = a} :: ListInstanceTypeDetailsResponse)
+
+-- | The response's http status code.
+listInstanceTypeDetailsResponse_httpStatus :: Lens.Lens' ListInstanceTypeDetailsResponse Prelude.Int
+listInstanceTypeDetailsResponse_httpStatus = Lens.lens (\ListInstanceTypeDetailsResponse' {httpStatus} -> httpStatus) (\s@ListInstanceTypeDetailsResponse' {} a -> s {httpStatus = a} :: ListInstanceTypeDetailsResponse)
+
+instance
+  Prelude.NFData
+    ListInstanceTypeDetailsResponse
+  where
+  rnf ListInstanceTypeDetailsResponse' {..} =
+    Prelude.rnf instanceTypeDetails
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/ListPackagesForDomain.hs b/gen/Amazonka/OpenSearch/ListPackagesForDomain.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/ListPackagesForDomain.hs
@@ -0,0 +1,228 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.ListPackagesForDomain
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all packages associated with an Amazon OpenSearch Service domain.
+-- For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/custom-packages.html Custom packages for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.ListPackagesForDomain
+  ( -- * Creating a Request
+    ListPackagesForDomain (..),
+    newListPackagesForDomain,
+
+    -- * Request Lenses
+    listPackagesForDomain_maxResults,
+    listPackagesForDomain_nextToken,
+    listPackagesForDomain_domainName,
+
+    -- * Destructuring the Response
+    ListPackagesForDomainResponse (..),
+    newListPackagesForDomainResponse,
+
+    -- * Response Lenses
+    listPackagesForDomainResponse_domainPackageDetailsList,
+    listPackagesForDomainResponse_nextToken,
+    listPackagesForDomainResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to the @ListPackagesForDomain@
+-- operation.
+--
+-- /See:/ 'newListPackagesForDomain' smart constructor.
+data ListPackagesForDomain = ListPackagesForDomain'
+  { -- | An optional parameter that specifies the maximum number of results to
+    -- return. You can use @nextToken@ to get the next page of results.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | If your initial @ListPackagesForDomain@ operation returns a @nextToken@,
+    -- you can include the returned @nextToken@ in subsequent
+    -- @ListPackagesForDomain@ operations, which returns results in the next
+    -- page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the domain for which you want to list associated packages.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPackagesForDomain' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listPackagesForDomain_maxResults' - An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+--
+-- 'nextToken', 'listPackagesForDomain_nextToken' - If your initial @ListPackagesForDomain@ operation returns a @nextToken@,
+-- you can include the returned @nextToken@ in subsequent
+-- @ListPackagesForDomain@ operations, which returns results in the next
+-- page.
+--
+-- 'domainName', 'listPackagesForDomain_domainName' - The name of the domain for which you want to list associated packages.
+newListPackagesForDomain ::
+  -- | 'domainName'
+  Prelude.Text ->
+  ListPackagesForDomain
+newListPackagesForDomain pDomainName_ =
+  ListPackagesForDomain'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      domainName = pDomainName_
+    }
+
+-- | An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+listPackagesForDomain_maxResults :: Lens.Lens' ListPackagesForDomain (Prelude.Maybe Prelude.Int)
+listPackagesForDomain_maxResults = Lens.lens (\ListPackagesForDomain' {maxResults} -> maxResults) (\s@ListPackagesForDomain' {} a -> s {maxResults = a} :: ListPackagesForDomain)
+
+-- | If your initial @ListPackagesForDomain@ operation returns a @nextToken@,
+-- you can include the returned @nextToken@ in subsequent
+-- @ListPackagesForDomain@ operations, which returns results in the next
+-- page.
+listPackagesForDomain_nextToken :: Lens.Lens' ListPackagesForDomain (Prelude.Maybe Prelude.Text)
+listPackagesForDomain_nextToken = Lens.lens (\ListPackagesForDomain' {nextToken} -> nextToken) (\s@ListPackagesForDomain' {} a -> s {nextToken = a} :: ListPackagesForDomain)
+
+-- | The name of the domain for which you want to list associated packages.
+listPackagesForDomain_domainName :: Lens.Lens' ListPackagesForDomain Prelude.Text
+listPackagesForDomain_domainName = Lens.lens (\ListPackagesForDomain' {domainName} -> domainName) (\s@ListPackagesForDomain' {} a -> s {domainName = a} :: ListPackagesForDomain)
+
+instance Core.AWSRequest ListPackagesForDomain where
+  type
+    AWSResponse ListPackagesForDomain =
+      ListPackagesForDomainResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListPackagesForDomainResponse'
+            Prelude.<$> ( x
+                            Data..?> "DomainPackageDetailsList"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListPackagesForDomain where
+  hashWithSalt _salt ListPackagesForDomain' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData ListPackagesForDomain where
+  rnf ListPackagesForDomain' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf domainName
+
+instance Data.ToHeaders ListPackagesForDomain where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListPackagesForDomain where
+  toPath ListPackagesForDomain' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/domain/",
+        Data.toBS domainName,
+        "/packages"
+      ]
+
+instance Data.ToQuery ListPackagesForDomain where
+  toQuery ListPackagesForDomain' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | Container for the response parameters to the @ListPackagesForDomain@
+-- operation.
+--
+-- /See:/ 'newListPackagesForDomainResponse' smart constructor.
+data ListPackagesForDomainResponse = ListPackagesForDomainResponse'
+  { -- | List of all packages associated with a domain.
+    domainPackageDetailsList :: Prelude.Maybe [DomainPackageDetails],
+    -- | When @nextToken@ is returned, there are more results available. The
+    -- value of @nextToken@ is a unique pagination token for each page. Make
+    -- the call again using the returned token to retrieve the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPackagesForDomainResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainPackageDetailsList', 'listPackagesForDomainResponse_domainPackageDetailsList' - List of all packages associated with a domain.
+--
+-- 'nextToken', 'listPackagesForDomainResponse_nextToken' - When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+--
+-- 'httpStatus', 'listPackagesForDomainResponse_httpStatus' - The response's http status code.
+newListPackagesForDomainResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListPackagesForDomainResponse
+newListPackagesForDomainResponse pHttpStatus_ =
+  ListPackagesForDomainResponse'
+    { domainPackageDetailsList =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | List of all packages associated with a domain.
+listPackagesForDomainResponse_domainPackageDetailsList :: Lens.Lens' ListPackagesForDomainResponse (Prelude.Maybe [DomainPackageDetails])
+listPackagesForDomainResponse_domainPackageDetailsList = Lens.lens (\ListPackagesForDomainResponse' {domainPackageDetailsList} -> domainPackageDetailsList) (\s@ListPackagesForDomainResponse' {} a -> s {domainPackageDetailsList = a} :: ListPackagesForDomainResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+listPackagesForDomainResponse_nextToken :: Lens.Lens' ListPackagesForDomainResponse (Prelude.Maybe Prelude.Text)
+listPackagesForDomainResponse_nextToken = Lens.lens (\ListPackagesForDomainResponse' {nextToken} -> nextToken) (\s@ListPackagesForDomainResponse' {} a -> s {nextToken = a} :: ListPackagesForDomainResponse)
+
+-- | The response's http status code.
+listPackagesForDomainResponse_httpStatus :: Lens.Lens' ListPackagesForDomainResponse Prelude.Int
+listPackagesForDomainResponse_httpStatus = Lens.lens (\ListPackagesForDomainResponse' {httpStatus} -> httpStatus) (\s@ListPackagesForDomainResponse' {} a -> s {httpStatus = a} :: ListPackagesForDomainResponse)
+
+instance Prelude.NFData ListPackagesForDomainResponse where
+  rnf ListPackagesForDomainResponse' {..} =
+    Prelude.rnf domainPackageDetailsList
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/ListTags.hs b/gen/Amazonka/OpenSearch/ListTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/ListTags.hs
@@ -0,0 +1,152 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.ListTags
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns all resource tags for an Amazon OpenSearch Service domain. For
+-- more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains-awsresourcetagging.html Tagging Amazon OpenSearch Service domains>.
+module Amazonka.OpenSearch.ListTags
+  ( -- * Creating a Request
+    ListTags (..),
+    newListTags,
+
+    -- * Request Lenses
+    listTags_arn,
+
+    -- * Destructuring the Response
+    ListTagsResponse (..),
+    newListTagsResponse,
+
+    -- * Response Lenses
+    listTagsResponse_tagList,
+    listTagsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the parameters to the @ListTags@ operation.
+--
+-- /See:/ 'newListTags' smart constructor.
+data ListTags = ListTags'
+  { -- | Amazon Resource Name (ARN) for the domain to view tags for.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTags' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'listTags_arn' - Amazon Resource Name (ARN) for the domain to view tags for.
+newListTags ::
+  -- | 'arn'
+  Prelude.Text ->
+  ListTags
+newListTags pARN_ = ListTags' {arn = pARN_}
+
+-- | Amazon Resource Name (ARN) for the domain to view tags for.
+listTags_arn :: Lens.Lens' ListTags Prelude.Text
+listTags_arn = Lens.lens (\ListTags' {arn} -> arn) (\s@ListTags' {} a -> s {arn = a} :: ListTags)
+
+instance Core.AWSRequest ListTags where
+  type AWSResponse ListTags = ListTagsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsResponse'
+            Prelude.<$> (x Data..?> "TagList" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTags where
+  hashWithSalt _salt ListTags' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData ListTags where
+  rnf ListTags' {..} = Prelude.rnf arn
+
+instance Data.ToHeaders ListTags where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListTags where
+  toPath = Prelude.const "/2021-01-01/tags/"
+
+instance Data.ToQuery ListTags where
+  toQuery ListTags' {..} =
+    Prelude.mconcat ["arn" Data.=: arn]
+
+-- | The results of a @ListTags@ operation.
+--
+-- /See:/ 'newListTagsResponse' smart constructor.
+data ListTagsResponse = ListTagsResponse'
+  { -- | List of resource tags associated with the specified domain.
+    tagList :: Prelude.Maybe [Tag],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tagList', 'listTagsResponse_tagList' - List of resource tags associated with the specified domain.
+--
+-- 'httpStatus', 'listTagsResponse_httpStatus' - The response's http status code.
+newListTagsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsResponse
+newListTagsResponse pHttpStatus_ =
+  ListTagsResponse'
+    { tagList = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | List of resource tags associated with the specified domain.
+listTagsResponse_tagList :: Lens.Lens' ListTagsResponse (Prelude.Maybe [Tag])
+listTagsResponse_tagList = Lens.lens (\ListTagsResponse' {tagList} -> tagList) (\s@ListTagsResponse' {} a -> s {tagList = a} :: ListTagsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsResponse_httpStatus :: Lens.Lens' ListTagsResponse Prelude.Int
+listTagsResponse_httpStatus = Lens.lens (\ListTagsResponse' {httpStatus} -> httpStatus) (\s@ListTagsResponse' {} a -> s {httpStatus = a} :: ListTagsResponse)
+
+instance Prelude.NFData ListTagsResponse where
+  rnf ListTagsResponse' {..} =
+    Prelude.rnf tagList
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/ListVersions.hs b/gen/Amazonka/OpenSearch/ListVersions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/ListVersions.hs
@@ -0,0 +1,201 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.ListVersions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all versions of OpenSearch and Elasticsearch that Amazon
+-- OpenSearch Service supports.
+module Amazonka.OpenSearch.ListVersions
+  ( -- * Creating a Request
+    ListVersions (..),
+    newListVersions,
+
+    -- * Request Lenses
+    listVersions_maxResults,
+    listVersions_nextToken,
+
+    -- * Destructuring the Response
+    ListVersionsResponse (..),
+    newListVersionsResponse,
+
+    -- * Response Lenses
+    listVersionsResponse_nextToken,
+    listVersionsResponse_versions,
+    listVersionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to the @ListVersions@ operation.
+--
+-- /See:/ 'newListVersions' smart constructor.
+data ListVersions = ListVersions'
+  { -- | An optional parameter that specifies the maximum number of results to
+    -- return. You can use @nextToken@ to get the next page of results.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | If your initial @ListVersions@ operation returns a @nextToken@, you can
+    -- include the returned @nextToken@ in subsequent @ListVersions@
+    -- operations, which returns results in the next page.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVersions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listVersions_maxResults' - An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+--
+-- 'nextToken', 'listVersions_nextToken' - If your initial @ListVersions@ operation returns a @nextToken@, you can
+-- include the returned @nextToken@ in subsequent @ListVersions@
+-- operations, which returns results in the next page.
+newListVersions ::
+  ListVersions
+newListVersions =
+  ListVersions'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | An optional parameter that specifies the maximum number of results to
+-- return. You can use @nextToken@ to get the next page of results.
+listVersions_maxResults :: Lens.Lens' ListVersions (Prelude.Maybe Prelude.Int)
+listVersions_maxResults = Lens.lens (\ListVersions' {maxResults} -> maxResults) (\s@ListVersions' {} a -> s {maxResults = a} :: ListVersions)
+
+-- | If your initial @ListVersions@ operation returns a @nextToken@, you can
+-- include the returned @nextToken@ in subsequent @ListVersions@
+-- operations, which returns results in the next page.
+listVersions_nextToken :: Lens.Lens' ListVersions (Prelude.Maybe Prelude.Text)
+listVersions_nextToken = Lens.lens (\ListVersions' {nextToken} -> nextToken) (\s@ListVersions' {} a -> s {nextToken = a} :: ListVersions)
+
+instance Core.AWSRequest ListVersions where
+  type AWSResponse ListVersions = ListVersionsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListVersionsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Versions" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListVersions where
+  hashWithSalt _salt ListVersions' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListVersions where
+  rnf ListVersions' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListVersions where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListVersions where
+  toPath =
+    Prelude.const "/2021-01-01/opensearch/versions"
+
+instance Data.ToQuery ListVersions where
+  toQuery ListVersions' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | Container for the parameters for response received from the
+-- @ListVersions@ operation.
+--
+-- /See:/ 'newListVersionsResponse' smart constructor.
+data ListVersionsResponse = ListVersionsResponse'
+  { -- | When @nextToken@ is returned, there are more results available. The
+    -- value of @nextToken@ is a unique pagination token for each page. Make
+    -- the call again using the returned token to retrieve the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of all versions of OpenSearch and Elasticsearch that Amazon
+    -- OpenSearch Service supports.
+    versions :: Prelude.Maybe [Prelude.Text],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVersionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listVersionsResponse_nextToken' - When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+--
+-- 'versions', 'listVersionsResponse_versions' - A list of all versions of OpenSearch and Elasticsearch that Amazon
+-- OpenSearch Service supports.
+--
+-- 'httpStatus', 'listVersionsResponse_httpStatus' - The response's http status code.
+newListVersionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListVersionsResponse
+newListVersionsResponse pHttpStatus_ =
+  ListVersionsResponse'
+    { nextToken = Prelude.Nothing,
+      versions = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+listVersionsResponse_nextToken :: Lens.Lens' ListVersionsResponse (Prelude.Maybe Prelude.Text)
+listVersionsResponse_nextToken = Lens.lens (\ListVersionsResponse' {nextToken} -> nextToken) (\s@ListVersionsResponse' {} a -> s {nextToken = a} :: ListVersionsResponse)
+
+-- | A list of all versions of OpenSearch and Elasticsearch that Amazon
+-- OpenSearch Service supports.
+listVersionsResponse_versions :: Lens.Lens' ListVersionsResponse (Prelude.Maybe [Prelude.Text])
+listVersionsResponse_versions = Lens.lens (\ListVersionsResponse' {versions} -> versions) (\s@ListVersionsResponse' {} a -> s {versions = a} :: ListVersionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listVersionsResponse_httpStatus :: Lens.Lens' ListVersionsResponse Prelude.Int
+listVersionsResponse_httpStatus = Lens.lens (\ListVersionsResponse' {httpStatus} -> httpStatus) (\s@ListVersionsResponse' {} a -> s {httpStatus = a} :: ListVersionsResponse)
+
+instance Prelude.NFData ListVersionsResponse where
+  rnf ListVersionsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf versions
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/ListVpcEndpointAccess.hs b/gen/Amazonka/OpenSearch/ListVpcEndpointAccess.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/ListVpcEndpointAccess.hs
@@ -0,0 +1,216 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.ListVpcEndpointAccess
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about each Amazon Web Services principal that is
+-- allowed to access a given Amazon OpenSearch Service domain through the
+-- use of an interface VPC endpoint.
+module Amazonka.OpenSearch.ListVpcEndpointAccess
+  ( -- * Creating a Request
+    ListVpcEndpointAccess (..),
+    newListVpcEndpointAccess,
+
+    -- * Request Lenses
+    listVpcEndpointAccess_nextToken,
+    listVpcEndpointAccess_domainName,
+
+    -- * Destructuring the Response
+    ListVpcEndpointAccessResponse (..),
+    newListVpcEndpointAccessResponse,
+
+    -- * Response Lenses
+    listVpcEndpointAccessResponse_httpStatus,
+    listVpcEndpointAccessResponse_authorizedPrincipalList,
+    listVpcEndpointAccessResponse_nextToken,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListVpcEndpointAccess' smart constructor.
+data ListVpcEndpointAccess = ListVpcEndpointAccess'
+  { -- | If your initial @ListVpcEndpointAccess@ operation returns a @nextToken@,
+    -- you can include the returned @nextToken@ in subsequent
+    -- @ListVpcEndpointAccess@ operations, which returns results in the next
+    -- page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the OpenSearch Service domain to retrieve access information
+    -- for.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVpcEndpointAccess' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listVpcEndpointAccess_nextToken' - If your initial @ListVpcEndpointAccess@ operation returns a @nextToken@,
+-- you can include the returned @nextToken@ in subsequent
+-- @ListVpcEndpointAccess@ operations, which returns results in the next
+-- page.
+--
+-- 'domainName', 'listVpcEndpointAccess_domainName' - The name of the OpenSearch Service domain to retrieve access information
+-- for.
+newListVpcEndpointAccess ::
+  -- | 'domainName'
+  Prelude.Text ->
+  ListVpcEndpointAccess
+newListVpcEndpointAccess pDomainName_ =
+  ListVpcEndpointAccess'
+    { nextToken = Prelude.Nothing,
+      domainName = pDomainName_
+    }
+
+-- | If your initial @ListVpcEndpointAccess@ operation returns a @nextToken@,
+-- you can include the returned @nextToken@ in subsequent
+-- @ListVpcEndpointAccess@ operations, which returns results in the next
+-- page.
+listVpcEndpointAccess_nextToken :: Lens.Lens' ListVpcEndpointAccess (Prelude.Maybe Prelude.Text)
+listVpcEndpointAccess_nextToken = Lens.lens (\ListVpcEndpointAccess' {nextToken} -> nextToken) (\s@ListVpcEndpointAccess' {} a -> s {nextToken = a} :: ListVpcEndpointAccess)
+
+-- | The name of the OpenSearch Service domain to retrieve access information
+-- for.
+listVpcEndpointAccess_domainName :: Lens.Lens' ListVpcEndpointAccess Prelude.Text
+listVpcEndpointAccess_domainName = Lens.lens (\ListVpcEndpointAccess' {domainName} -> domainName) (\s@ListVpcEndpointAccess' {} a -> s {domainName = a} :: ListVpcEndpointAccess)
+
+instance Core.AWSRequest ListVpcEndpointAccess where
+  type
+    AWSResponse ListVpcEndpointAccess =
+      ListVpcEndpointAccessResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListVpcEndpointAccessResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "AuthorizedPrincipalList"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:> "NextToken")
+      )
+
+instance Prelude.Hashable ListVpcEndpointAccess where
+  hashWithSalt _salt ListVpcEndpointAccess' {..} =
+    _salt
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData ListVpcEndpointAccess where
+  rnf ListVpcEndpointAccess' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf domainName
+
+instance Data.ToHeaders ListVpcEndpointAccess where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListVpcEndpointAccess where
+  toPath ListVpcEndpointAccess' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/domain/",
+        Data.toBS domainName,
+        "/listVpcEndpointAccess"
+      ]
+
+instance Data.ToQuery ListVpcEndpointAccess where
+  toQuery ListVpcEndpointAccess' {..} =
+    Prelude.mconcat ["nextToken" Data.=: nextToken]
+
+-- | /See:/ 'newListVpcEndpointAccessResponse' smart constructor.
+data ListVpcEndpointAccessResponse = ListVpcEndpointAccessResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of
+    -- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html IAM principals>
+    -- that can currently access the domain.
+    authorizedPrincipalList :: [AuthorizedPrincipal],
+    -- | When @nextToken@ is returned, there are more results available. The
+    -- value of @nextToken@ is a unique pagination token for each page. Make
+    -- the call again using the returned token to retrieve the next page.
+    nextToken :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVpcEndpointAccessResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'listVpcEndpointAccessResponse_httpStatus' - The response's http status code.
+--
+-- 'authorizedPrincipalList', 'listVpcEndpointAccessResponse_authorizedPrincipalList' - A list of
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html IAM principals>
+-- that can currently access the domain.
+--
+-- 'nextToken', 'listVpcEndpointAccessResponse_nextToken' - When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+newListVpcEndpointAccessResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'nextToken'
+  Prelude.Text ->
+  ListVpcEndpointAccessResponse
+newListVpcEndpointAccessResponse
+  pHttpStatus_
+  pNextToken_ =
+    ListVpcEndpointAccessResponse'
+      { httpStatus =
+          pHttpStatus_,
+        authorizedPrincipalList = Prelude.mempty,
+        nextToken = pNextToken_
+      }
+
+-- | The response's http status code.
+listVpcEndpointAccessResponse_httpStatus :: Lens.Lens' ListVpcEndpointAccessResponse Prelude.Int
+listVpcEndpointAccessResponse_httpStatus = Lens.lens (\ListVpcEndpointAccessResponse' {httpStatus} -> httpStatus) (\s@ListVpcEndpointAccessResponse' {} a -> s {httpStatus = a} :: ListVpcEndpointAccessResponse)
+
+-- | A list of
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html IAM principals>
+-- that can currently access the domain.
+listVpcEndpointAccessResponse_authorizedPrincipalList :: Lens.Lens' ListVpcEndpointAccessResponse [AuthorizedPrincipal]
+listVpcEndpointAccessResponse_authorizedPrincipalList = Lens.lens (\ListVpcEndpointAccessResponse' {authorizedPrincipalList} -> authorizedPrincipalList) (\s@ListVpcEndpointAccessResponse' {} a -> s {authorizedPrincipalList = a} :: ListVpcEndpointAccessResponse) Prelude.. Lens.coerced
+
+-- | When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+listVpcEndpointAccessResponse_nextToken :: Lens.Lens' ListVpcEndpointAccessResponse Prelude.Text
+listVpcEndpointAccessResponse_nextToken = Lens.lens (\ListVpcEndpointAccessResponse' {nextToken} -> nextToken) (\s@ListVpcEndpointAccessResponse' {} a -> s {nextToken = a} :: ListVpcEndpointAccessResponse)
+
+instance Prelude.NFData ListVpcEndpointAccessResponse where
+  rnf ListVpcEndpointAccessResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf authorizedPrincipalList
+      `Prelude.seq` Prelude.rnf nextToken
diff --git a/gen/Amazonka/OpenSearch/ListVpcEndpoints.hs b/gen/Amazonka/OpenSearch/ListVpcEndpoints.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/ListVpcEndpoints.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.ListVpcEndpoints
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves all Amazon OpenSearch Service-managed VPC endpoints in the
+-- current Amazon Web Services account and Region.
+module Amazonka.OpenSearch.ListVpcEndpoints
+  ( -- * Creating a Request
+    ListVpcEndpoints (..),
+    newListVpcEndpoints,
+
+    -- * Request Lenses
+    listVpcEndpoints_nextToken,
+
+    -- * Destructuring the Response
+    ListVpcEndpointsResponse (..),
+    newListVpcEndpointsResponse,
+
+    -- * Response Lenses
+    listVpcEndpointsResponse_httpStatus,
+    listVpcEndpointsResponse_vpcEndpointSummaryList,
+    listVpcEndpointsResponse_nextToken,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListVpcEndpoints' smart constructor.
+data ListVpcEndpoints = ListVpcEndpoints'
+  { -- | If your initial @ListVpcEndpoints@ operation returns a @nextToken@, you
+    -- can include the returned @nextToken@ in subsequent @ListVpcEndpoints@
+    -- operations, which returns results in the next page.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVpcEndpoints' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listVpcEndpoints_nextToken' - If your initial @ListVpcEndpoints@ operation returns a @nextToken@, you
+-- can include the returned @nextToken@ in subsequent @ListVpcEndpoints@
+-- operations, which returns results in the next page.
+newListVpcEndpoints ::
+  ListVpcEndpoints
+newListVpcEndpoints =
+  ListVpcEndpoints' {nextToken = Prelude.Nothing}
+
+-- | If your initial @ListVpcEndpoints@ operation returns a @nextToken@, you
+-- can include the returned @nextToken@ in subsequent @ListVpcEndpoints@
+-- operations, which returns results in the next page.
+listVpcEndpoints_nextToken :: Lens.Lens' ListVpcEndpoints (Prelude.Maybe Prelude.Text)
+listVpcEndpoints_nextToken = Lens.lens (\ListVpcEndpoints' {nextToken} -> nextToken) (\s@ListVpcEndpoints' {} a -> s {nextToken = a} :: ListVpcEndpoints)
+
+instance Core.AWSRequest ListVpcEndpoints where
+  type
+    AWSResponse ListVpcEndpoints =
+      ListVpcEndpointsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListVpcEndpointsResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "VpcEndpointSummaryList"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:> "NextToken")
+      )
+
+instance Prelude.Hashable ListVpcEndpoints where
+  hashWithSalt _salt ListVpcEndpoints' {..} =
+    _salt `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListVpcEndpoints where
+  rnf ListVpcEndpoints' {..} = Prelude.rnf nextToken
+
+instance Data.ToHeaders ListVpcEndpoints where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListVpcEndpoints where
+  toPath =
+    Prelude.const "/2021-01-01/opensearch/vpcEndpoints"
+
+instance Data.ToQuery ListVpcEndpoints where
+  toQuery ListVpcEndpoints' {..} =
+    Prelude.mconcat ["nextToken" Data.=: nextToken]
+
+-- | /See:/ 'newListVpcEndpointsResponse' smart constructor.
+data ListVpcEndpointsResponse = ListVpcEndpointsResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | Information about each endpoint.
+    vpcEndpointSummaryList :: [VpcEndpointSummary],
+    -- | When @nextToken@ is returned, there are more results available. The
+    -- value of @nextToken@ is a unique pagination token for each page. Make
+    -- the call again using the returned token to retrieve the next page.
+    nextToken :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVpcEndpointsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'listVpcEndpointsResponse_httpStatus' - The response's http status code.
+--
+-- 'vpcEndpointSummaryList', 'listVpcEndpointsResponse_vpcEndpointSummaryList' - Information about each endpoint.
+--
+-- 'nextToken', 'listVpcEndpointsResponse_nextToken' - When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+newListVpcEndpointsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'nextToken'
+  Prelude.Text ->
+  ListVpcEndpointsResponse
+newListVpcEndpointsResponse pHttpStatus_ pNextToken_ =
+  ListVpcEndpointsResponse'
+    { httpStatus =
+        pHttpStatus_,
+      vpcEndpointSummaryList = Prelude.mempty,
+      nextToken = pNextToken_
+    }
+
+-- | The response's http status code.
+listVpcEndpointsResponse_httpStatus :: Lens.Lens' ListVpcEndpointsResponse Prelude.Int
+listVpcEndpointsResponse_httpStatus = Lens.lens (\ListVpcEndpointsResponse' {httpStatus} -> httpStatus) (\s@ListVpcEndpointsResponse' {} a -> s {httpStatus = a} :: ListVpcEndpointsResponse)
+
+-- | Information about each endpoint.
+listVpcEndpointsResponse_vpcEndpointSummaryList :: Lens.Lens' ListVpcEndpointsResponse [VpcEndpointSummary]
+listVpcEndpointsResponse_vpcEndpointSummaryList = Lens.lens (\ListVpcEndpointsResponse' {vpcEndpointSummaryList} -> vpcEndpointSummaryList) (\s@ListVpcEndpointsResponse' {} a -> s {vpcEndpointSummaryList = a} :: ListVpcEndpointsResponse) Prelude.. Lens.coerced
+
+-- | When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+listVpcEndpointsResponse_nextToken :: Lens.Lens' ListVpcEndpointsResponse Prelude.Text
+listVpcEndpointsResponse_nextToken = Lens.lens (\ListVpcEndpointsResponse' {nextToken} -> nextToken) (\s@ListVpcEndpointsResponse' {} a -> s {nextToken = a} :: ListVpcEndpointsResponse)
+
+instance Prelude.NFData ListVpcEndpointsResponse where
+  rnf ListVpcEndpointsResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf vpcEndpointSummaryList
+      `Prelude.seq` Prelude.rnf nextToken
diff --git a/gen/Amazonka/OpenSearch/ListVpcEndpointsForDomain.hs b/gen/Amazonka/OpenSearch/ListVpcEndpointsForDomain.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/ListVpcEndpointsForDomain.hs
@@ -0,0 +1,210 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.ListVpcEndpointsForDomain
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves all Amazon OpenSearch Service-managed VPC endpoints associated
+-- with a particular domain.
+module Amazonka.OpenSearch.ListVpcEndpointsForDomain
+  ( -- * Creating a Request
+    ListVpcEndpointsForDomain (..),
+    newListVpcEndpointsForDomain,
+
+    -- * Request Lenses
+    listVpcEndpointsForDomain_nextToken,
+    listVpcEndpointsForDomain_domainName,
+
+    -- * Destructuring the Response
+    ListVpcEndpointsForDomainResponse (..),
+    newListVpcEndpointsForDomainResponse,
+
+    -- * Response Lenses
+    listVpcEndpointsForDomainResponse_httpStatus,
+    listVpcEndpointsForDomainResponse_vpcEndpointSummaryList,
+    listVpcEndpointsForDomainResponse_nextToken,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListVpcEndpointsForDomain' smart constructor.
+data ListVpcEndpointsForDomain = ListVpcEndpointsForDomain'
+  { -- | If your initial @ListEndpointsForDomain@ operation returns a
+    -- @nextToken@, you can include the returned @nextToken@ in subsequent
+    -- @ListEndpointsForDomain@ operations, which returns results in the next
+    -- page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the domain to list associated VPC endpoints for.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVpcEndpointsForDomain' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listVpcEndpointsForDomain_nextToken' - If your initial @ListEndpointsForDomain@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @ListEndpointsForDomain@ operations, which returns results in the next
+-- page.
+--
+-- 'domainName', 'listVpcEndpointsForDomain_domainName' - The name of the domain to list associated VPC endpoints for.
+newListVpcEndpointsForDomain ::
+  -- | 'domainName'
+  Prelude.Text ->
+  ListVpcEndpointsForDomain
+newListVpcEndpointsForDomain pDomainName_ =
+  ListVpcEndpointsForDomain'
+    { nextToken =
+        Prelude.Nothing,
+      domainName = pDomainName_
+    }
+
+-- | If your initial @ListEndpointsForDomain@ operation returns a
+-- @nextToken@, you can include the returned @nextToken@ in subsequent
+-- @ListEndpointsForDomain@ operations, which returns results in the next
+-- page.
+listVpcEndpointsForDomain_nextToken :: Lens.Lens' ListVpcEndpointsForDomain (Prelude.Maybe Prelude.Text)
+listVpcEndpointsForDomain_nextToken = Lens.lens (\ListVpcEndpointsForDomain' {nextToken} -> nextToken) (\s@ListVpcEndpointsForDomain' {} a -> s {nextToken = a} :: ListVpcEndpointsForDomain)
+
+-- | The name of the domain to list associated VPC endpoints for.
+listVpcEndpointsForDomain_domainName :: Lens.Lens' ListVpcEndpointsForDomain Prelude.Text
+listVpcEndpointsForDomain_domainName = Lens.lens (\ListVpcEndpointsForDomain' {domainName} -> domainName) (\s@ListVpcEndpointsForDomain' {} a -> s {domainName = a} :: ListVpcEndpointsForDomain)
+
+instance Core.AWSRequest ListVpcEndpointsForDomain where
+  type
+    AWSResponse ListVpcEndpointsForDomain =
+      ListVpcEndpointsForDomainResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListVpcEndpointsForDomainResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "VpcEndpointSummaryList"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:> "NextToken")
+      )
+
+instance Prelude.Hashable ListVpcEndpointsForDomain where
+  hashWithSalt _salt ListVpcEndpointsForDomain' {..} =
+    _salt
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData ListVpcEndpointsForDomain where
+  rnf ListVpcEndpointsForDomain' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf domainName
+
+instance Data.ToHeaders ListVpcEndpointsForDomain where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListVpcEndpointsForDomain where
+  toPath ListVpcEndpointsForDomain' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/domain/",
+        Data.toBS domainName,
+        "/vpcEndpoints"
+      ]
+
+instance Data.ToQuery ListVpcEndpointsForDomain where
+  toQuery ListVpcEndpointsForDomain' {..} =
+    Prelude.mconcat ["nextToken" Data.=: nextToken]
+
+-- | /See:/ 'newListVpcEndpointsForDomainResponse' smart constructor.
+data ListVpcEndpointsForDomainResponse = ListVpcEndpointsForDomainResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | Information about each endpoint associated with the domain.
+    vpcEndpointSummaryList :: [VpcEndpointSummary],
+    -- | When @nextToken@ is returned, there are more results available. The
+    -- value of @nextToken@ is a unique pagination token for each page. Make
+    -- the call again using the returned token to retrieve the next page.
+    nextToken :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVpcEndpointsForDomainResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'listVpcEndpointsForDomainResponse_httpStatus' - The response's http status code.
+--
+-- 'vpcEndpointSummaryList', 'listVpcEndpointsForDomainResponse_vpcEndpointSummaryList' - Information about each endpoint associated with the domain.
+--
+-- 'nextToken', 'listVpcEndpointsForDomainResponse_nextToken' - When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+newListVpcEndpointsForDomainResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'nextToken'
+  Prelude.Text ->
+  ListVpcEndpointsForDomainResponse
+newListVpcEndpointsForDomainResponse
+  pHttpStatus_
+  pNextToken_ =
+    ListVpcEndpointsForDomainResponse'
+      { httpStatus =
+          pHttpStatus_,
+        vpcEndpointSummaryList = Prelude.mempty,
+        nextToken = pNextToken_
+      }
+
+-- | The response's http status code.
+listVpcEndpointsForDomainResponse_httpStatus :: Lens.Lens' ListVpcEndpointsForDomainResponse Prelude.Int
+listVpcEndpointsForDomainResponse_httpStatus = Lens.lens (\ListVpcEndpointsForDomainResponse' {httpStatus} -> httpStatus) (\s@ListVpcEndpointsForDomainResponse' {} a -> s {httpStatus = a} :: ListVpcEndpointsForDomainResponse)
+
+-- | Information about each endpoint associated with the domain.
+listVpcEndpointsForDomainResponse_vpcEndpointSummaryList :: Lens.Lens' ListVpcEndpointsForDomainResponse [VpcEndpointSummary]
+listVpcEndpointsForDomainResponse_vpcEndpointSummaryList = Lens.lens (\ListVpcEndpointsForDomainResponse' {vpcEndpointSummaryList} -> vpcEndpointSummaryList) (\s@ListVpcEndpointsForDomainResponse' {} a -> s {vpcEndpointSummaryList = a} :: ListVpcEndpointsForDomainResponse) Prelude.. Lens.coerced
+
+-- | When @nextToken@ is returned, there are more results available. The
+-- value of @nextToken@ is a unique pagination token for each page. Make
+-- the call again using the returned token to retrieve the next page.
+listVpcEndpointsForDomainResponse_nextToken :: Lens.Lens' ListVpcEndpointsForDomainResponse Prelude.Text
+listVpcEndpointsForDomainResponse_nextToken = Lens.lens (\ListVpcEndpointsForDomainResponse' {nextToken} -> nextToken) (\s@ListVpcEndpointsForDomainResponse' {} a -> s {nextToken = a} :: ListVpcEndpointsForDomainResponse)
+
+instance
+  Prelude.NFData
+    ListVpcEndpointsForDomainResponse
+  where
+  rnf ListVpcEndpointsForDomainResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf vpcEndpointSummaryList
+      `Prelude.seq` Prelude.rnf nextToken
diff --git a/gen/Amazonka/OpenSearch/PurchaseReservedInstanceOffering.hs b/gen/Amazonka/OpenSearch/PurchaseReservedInstanceOffering.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/PurchaseReservedInstanceOffering.hs
@@ -0,0 +1,238 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.PurchaseReservedInstanceOffering
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Allows you to purchase Amazon OpenSearch Service Reserved Instances.
+module Amazonka.OpenSearch.PurchaseReservedInstanceOffering
+  ( -- * Creating a Request
+    PurchaseReservedInstanceOffering (..),
+    newPurchaseReservedInstanceOffering,
+
+    -- * Request Lenses
+    purchaseReservedInstanceOffering_instanceCount,
+    purchaseReservedInstanceOffering_reservedInstanceOfferingId,
+    purchaseReservedInstanceOffering_reservationName,
+
+    -- * Destructuring the Response
+    PurchaseReservedInstanceOfferingResponse (..),
+    newPurchaseReservedInstanceOfferingResponse,
+
+    -- * Response Lenses
+    purchaseReservedInstanceOfferingResponse_reservationName,
+    purchaseReservedInstanceOfferingResponse_reservedInstanceId,
+    purchaseReservedInstanceOfferingResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for request parameters to the
+-- @PurchaseReservedInstanceOffering@ operation.
+--
+-- /See:/ 'newPurchaseReservedInstanceOffering' smart constructor.
+data PurchaseReservedInstanceOffering = PurchaseReservedInstanceOffering'
+  { -- | The number of OpenSearch instances to reserve.
+    instanceCount :: Prelude.Maybe Prelude.Natural,
+    -- | The ID of the Reserved Instance offering to purchase.
+    reservedInstanceOfferingId :: Prelude.Text,
+    -- | A customer-specified identifier to track this reservation.
+    reservationName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PurchaseReservedInstanceOffering' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'instanceCount', 'purchaseReservedInstanceOffering_instanceCount' - The number of OpenSearch instances to reserve.
+--
+-- 'reservedInstanceOfferingId', 'purchaseReservedInstanceOffering_reservedInstanceOfferingId' - The ID of the Reserved Instance offering to purchase.
+--
+-- 'reservationName', 'purchaseReservedInstanceOffering_reservationName' - A customer-specified identifier to track this reservation.
+newPurchaseReservedInstanceOffering ::
+  -- | 'reservedInstanceOfferingId'
+  Prelude.Text ->
+  -- | 'reservationName'
+  Prelude.Text ->
+  PurchaseReservedInstanceOffering
+newPurchaseReservedInstanceOffering
+  pReservedInstanceOfferingId_
+  pReservationName_ =
+    PurchaseReservedInstanceOffering'
+      { instanceCount =
+          Prelude.Nothing,
+        reservedInstanceOfferingId =
+          pReservedInstanceOfferingId_,
+        reservationName = pReservationName_
+      }
+
+-- | The number of OpenSearch instances to reserve.
+purchaseReservedInstanceOffering_instanceCount :: Lens.Lens' PurchaseReservedInstanceOffering (Prelude.Maybe Prelude.Natural)
+purchaseReservedInstanceOffering_instanceCount = Lens.lens (\PurchaseReservedInstanceOffering' {instanceCount} -> instanceCount) (\s@PurchaseReservedInstanceOffering' {} a -> s {instanceCount = a} :: PurchaseReservedInstanceOffering)
+
+-- | The ID of the Reserved Instance offering to purchase.
+purchaseReservedInstanceOffering_reservedInstanceOfferingId :: Lens.Lens' PurchaseReservedInstanceOffering Prelude.Text
+purchaseReservedInstanceOffering_reservedInstanceOfferingId = Lens.lens (\PurchaseReservedInstanceOffering' {reservedInstanceOfferingId} -> reservedInstanceOfferingId) (\s@PurchaseReservedInstanceOffering' {} a -> s {reservedInstanceOfferingId = a} :: PurchaseReservedInstanceOffering)
+
+-- | A customer-specified identifier to track this reservation.
+purchaseReservedInstanceOffering_reservationName :: Lens.Lens' PurchaseReservedInstanceOffering Prelude.Text
+purchaseReservedInstanceOffering_reservationName = Lens.lens (\PurchaseReservedInstanceOffering' {reservationName} -> reservationName) (\s@PurchaseReservedInstanceOffering' {} a -> s {reservationName = a} :: PurchaseReservedInstanceOffering)
+
+instance
+  Core.AWSRequest
+    PurchaseReservedInstanceOffering
+  where
+  type
+    AWSResponse PurchaseReservedInstanceOffering =
+      PurchaseReservedInstanceOfferingResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PurchaseReservedInstanceOfferingResponse'
+            Prelude.<$> (x Data..?> "ReservationName")
+            Prelude.<*> (x Data..?> "ReservedInstanceId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    PurchaseReservedInstanceOffering
+  where
+  hashWithSalt
+    _salt
+    PurchaseReservedInstanceOffering' {..} =
+      _salt
+        `Prelude.hashWithSalt` instanceCount
+        `Prelude.hashWithSalt` reservedInstanceOfferingId
+        `Prelude.hashWithSalt` reservationName
+
+instance
+  Prelude.NFData
+    PurchaseReservedInstanceOffering
+  where
+  rnf PurchaseReservedInstanceOffering' {..} =
+    Prelude.rnf instanceCount
+      `Prelude.seq` Prelude.rnf reservedInstanceOfferingId
+      `Prelude.seq` Prelude.rnf reservationName
+
+instance
+  Data.ToHeaders
+    PurchaseReservedInstanceOffering
+  where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON PurchaseReservedInstanceOffering where
+  toJSON PurchaseReservedInstanceOffering' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("InstanceCount" Data..=) Prelude.<$> instanceCount,
+            Prelude.Just
+              ( "ReservedInstanceOfferingId"
+                  Data..= reservedInstanceOfferingId
+              ),
+            Prelude.Just
+              ("ReservationName" Data..= reservationName)
+          ]
+      )
+
+instance Data.ToPath PurchaseReservedInstanceOffering where
+  toPath =
+    Prelude.const
+      "/2021-01-01/opensearch/purchaseReservedInstanceOffering"
+
+instance
+  Data.ToQuery
+    PurchaseReservedInstanceOffering
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Represents the output of a @PurchaseReservedInstanceOffering@ operation.
+--
+-- /See:/ 'newPurchaseReservedInstanceOfferingResponse' smart constructor.
+data PurchaseReservedInstanceOfferingResponse = PurchaseReservedInstanceOfferingResponse'
+  { -- | The customer-specified identifier used to track this reservation.
+    reservationName :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the Reserved Instance offering that was purchased.
+    reservedInstanceId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PurchaseReservedInstanceOfferingResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'reservationName', 'purchaseReservedInstanceOfferingResponse_reservationName' - The customer-specified identifier used to track this reservation.
+--
+-- 'reservedInstanceId', 'purchaseReservedInstanceOfferingResponse_reservedInstanceId' - The ID of the Reserved Instance offering that was purchased.
+--
+-- 'httpStatus', 'purchaseReservedInstanceOfferingResponse_httpStatus' - The response's http status code.
+newPurchaseReservedInstanceOfferingResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PurchaseReservedInstanceOfferingResponse
+newPurchaseReservedInstanceOfferingResponse
+  pHttpStatus_ =
+    PurchaseReservedInstanceOfferingResponse'
+      { reservationName =
+          Prelude.Nothing,
+        reservedInstanceId =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | The customer-specified identifier used to track this reservation.
+purchaseReservedInstanceOfferingResponse_reservationName :: Lens.Lens' PurchaseReservedInstanceOfferingResponse (Prelude.Maybe Prelude.Text)
+purchaseReservedInstanceOfferingResponse_reservationName = Lens.lens (\PurchaseReservedInstanceOfferingResponse' {reservationName} -> reservationName) (\s@PurchaseReservedInstanceOfferingResponse' {} a -> s {reservationName = a} :: PurchaseReservedInstanceOfferingResponse)
+
+-- | The ID of the Reserved Instance offering that was purchased.
+purchaseReservedInstanceOfferingResponse_reservedInstanceId :: Lens.Lens' PurchaseReservedInstanceOfferingResponse (Prelude.Maybe Prelude.Text)
+purchaseReservedInstanceOfferingResponse_reservedInstanceId = Lens.lens (\PurchaseReservedInstanceOfferingResponse' {reservedInstanceId} -> reservedInstanceId) (\s@PurchaseReservedInstanceOfferingResponse' {} a -> s {reservedInstanceId = a} :: PurchaseReservedInstanceOfferingResponse)
+
+-- | The response's http status code.
+purchaseReservedInstanceOfferingResponse_httpStatus :: Lens.Lens' PurchaseReservedInstanceOfferingResponse Prelude.Int
+purchaseReservedInstanceOfferingResponse_httpStatus = Lens.lens (\PurchaseReservedInstanceOfferingResponse' {httpStatus} -> httpStatus) (\s@PurchaseReservedInstanceOfferingResponse' {} a -> s {httpStatus = a} :: PurchaseReservedInstanceOfferingResponse)
+
+instance
+  Prelude.NFData
+    PurchaseReservedInstanceOfferingResponse
+  where
+  rnf PurchaseReservedInstanceOfferingResponse' {..} =
+    Prelude.rnf reservationName
+      `Prelude.seq` Prelude.rnf reservedInstanceId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/RejectInboundConnection.hs b/gen/Amazonka/OpenSearch/RejectInboundConnection.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/RejectInboundConnection.hs
@@ -0,0 +1,170 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.RejectInboundConnection
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Allows the remote Amazon OpenSearch Service domain owner to reject an
+-- inbound cross-cluster connection request.
+module Amazonka.OpenSearch.RejectInboundConnection
+  ( -- * Creating a Request
+    RejectInboundConnection (..),
+    newRejectInboundConnection,
+
+    -- * Request Lenses
+    rejectInboundConnection_connectionId,
+
+    -- * Destructuring the Response
+    RejectInboundConnectionResponse (..),
+    newRejectInboundConnectionResponse,
+
+    -- * Response Lenses
+    rejectInboundConnectionResponse_connection,
+    rejectInboundConnectionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to the @RejectInboundConnection@
+-- operation.
+--
+-- /See:/ 'newRejectInboundConnection' smart constructor.
+data RejectInboundConnection = RejectInboundConnection'
+  { -- | The unique identifier of the inbound connection to reject.
+    connectionId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RejectInboundConnection' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connectionId', 'rejectInboundConnection_connectionId' - The unique identifier of the inbound connection to reject.
+newRejectInboundConnection ::
+  -- | 'connectionId'
+  Prelude.Text ->
+  RejectInboundConnection
+newRejectInboundConnection pConnectionId_ =
+  RejectInboundConnection'
+    { connectionId =
+        pConnectionId_
+    }
+
+-- | The unique identifier of the inbound connection to reject.
+rejectInboundConnection_connectionId :: Lens.Lens' RejectInboundConnection Prelude.Text
+rejectInboundConnection_connectionId = Lens.lens (\RejectInboundConnection' {connectionId} -> connectionId) (\s@RejectInboundConnection' {} a -> s {connectionId = a} :: RejectInboundConnection)
+
+instance Core.AWSRequest RejectInboundConnection where
+  type
+    AWSResponse RejectInboundConnection =
+      RejectInboundConnectionResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          RejectInboundConnectionResponse'
+            Prelude.<$> (x Data..?> "Connection")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable RejectInboundConnection where
+  hashWithSalt _salt RejectInboundConnection' {..} =
+    _salt `Prelude.hashWithSalt` connectionId
+
+instance Prelude.NFData RejectInboundConnection where
+  rnf RejectInboundConnection' {..} =
+    Prelude.rnf connectionId
+
+instance Data.ToHeaders RejectInboundConnection where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON RejectInboundConnection where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance Data.ToPath RejectInboundConnection where
+  toPath RejectInboundConnection' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/cc/inboundConnection/",
+        Data.toBS connectionId,
+        "/reject"
+      ]
+
+instance Data.ToQuery RejectInboundConnection where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Represents the output of a @RejectInboundConnection@ operation.
+--
+-- /See:/ 'newRejectInboundConnectionResponse' smart constructor.
+data RejectInboundConnectionResponse = RejectInboundConnectionResponse'
+  { -- | Contains details about the rejected inbound connection.
+    connection :: Prelude.Maybe InboundConnection,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RejectInboundConnectionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connection', 'rejectInboundConnectionResponse_connection' - Contains details about the rejected inbound connection.
+--
+-- 'httpStatus', 'rejectInboundConnectionResponse_httpStatus' - The response's http status code.
+newRejectInboundConnectionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  RejectInboundConnectionResponse
+newRejectInboundConnectionResponse pHttpStatus_ =
+  RejectInboundConnectionResponse'
+    { connection =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Contains details about the rejected inbound connection.
+rejectInboundConnectionResponse_connection :: Lens.Lens' RejectInboundConnectionResponse (Prelude.Maybe InboundConnection)
+rejectInboundConnectionResponse_connection = Lens.lens (\RejectInboundConnectionResponse' {connection} -> connection) (\s@RejectInboundConnectionResponse' {} a -> s {connection = a} :: RejectInboundConnectionResponse)
+
+-- | The response's http status code.
+rejectInboundConnectionResponse_httpStatus :: Lens.Lens' RejectInboundConnectionResponse Prelude.Int
+rejectInboundConnectionResponse_httpStatus = Lens.lens (\RejectInboundConnectionResponse' {httpStatus} -> httpStatus) (\s@RejectInboundConnectionResponse' {} a -> s {httpStatus = a} :: RejectInboundConnectionResponse)
+
+instance
+  Prelude.NFData
+    RejectInboundConnectionResponse
+  where
+  rnf RejectInboundConnectionResponse' {..} =
+    Prelude.rnf connection
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/RemoveTags.hs b/gen/Amazonka/OpenSearch/RemoveTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/RemoveTags.hs
@@ -0,0 +1,138 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.RemoveTags
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Removes the specified set of tags from an Amazon OpenSearch Service
+-- domain. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains.html#managedomains-awsresorcetagging Tagging Amazon OpenSearch Service domains>.
+module Amazonka.OpenSearch.RemoveTags
+  ( -- * Creating a Request
+    RemoveTags (..),
+    newRemoveTags,
+
+    -- * Request Lenses
+    removeTags_arn,
+    removeTags_tagKeys,
+
+    -- * Destructuring the Response
+    RemoveTagsResponse (..),
+    newRemoveTagsResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to the @RemoveTags@ operation.
+--
+-- /See:/ 'newRemoveTags' smart constructor.
+data RemoveTags = RemoveTags'
+  { -- | The Amazon Resource Name (ARN) of the domain from which you want to
+    -- delete the specified tags.
+    arn :: Prelude.Text,
+    -- | The list of tag keys to remove from the domain.
+    tagKeys :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RemoveTags' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'removeTags_arn' - The Amazon Resource Name (ARN) of the domain from which you want to
+-- delete the specified tags.
+--
+-- 'tagKeys', 'removeTags_tagKeys' - The list of tag keys to remove from the domain.
+newRemoveTags ::
+  -- | 'arn'
+  Prelude.Text ->
+  RemoveTags
+newRemoveTags pARN_ =
+  RemoveTags' {arn = pARN_, tagKeys = Prelude.mempty}
+
+-- | The Amazon Resource Name (ARN) of the domain from which you want to
+-- delete the specified tags.
+removeTags_arn :: Lens.Lens' RemoveTags Prelude.Text
+removeTags_arn = Lens.lens (\RemoveTags' {arn} -> arn) (\s@RemoveTags' {} a -> s {arn = a} :: RemoveTags)
+
+-- | The list of tag keys to remove from the domain.
+removeTags_tagKeys :: Lens.Lens' RemoveTags [Prelude.Text]
+removeTags_tagKeys = Lens.lens (\RemoveTags' {tagKeys} -> tagKeys) (\s@RemoveTags' {} a -> s {tagKeys = a} :: RemoveTags) Prelude.. Lens.coerced
+
+instance Core.AWSRequest RemoveTags where
+  type AWSResponse RemoveTags = RemoveTagsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response = Response.receiveNull RemoveTagsResponse'
+
+instance Prelude.Hashable RemoveTags where
+  hashWithSalt _salt RemoveTags' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData RemoveTags where
+  rnf RemoveTags' {..} =
+    Prelude.rnf arn `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders RemoveTags where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON RemoveTags where
+  toJSON RemoveTags' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("ARN" Data..= arn),
+            Prelude.Just ("TagKeys" Data..= tagKeys)
+          ]
+      )
+
+instance Data.ToPath RemoveTags where
+  toPath = Prelude.const "/2021-01-01/tags-removal"
+
+instance Data.ToQuery RemoveTags where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newRemoveTagsResponse' smart constructor.
+data RemoveTagsResponse = RemoveTagsResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RemoveTagsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newRemoveTagsResponse ::
+  RemoveTagsResponse
+newRemoveTagsResponse = RemoveTagsResponse'
+
+instance Prelude.NFData RemoveTagsResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/OpenSearch/RevokeVpcEndpointAccess.hs b/gen/Amazonka/OpenSearch/RevokeVpcEndpointAccess.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/RevokeVpcEndpointAccess.hs
@@ -0,0 +1,171 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.RevokeVpcEndpointAccess
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Revokes access to an Amazon OpenSearch Service domain that was provided
+-- through an interface VPC endpoint.
+module Amazonka.OpenSearch.RevokeVpcEndpointAccess
+  ( -- * Creating a Request
+    RevokeVpcEndpointAccess (..),
+    newRevokeVpcEndpointAccess,
+
+    -- * Request Lenses
+    revokeVpcEndpointAccess_domainName,
+    revokeVpcEndpointAccess_account,
+
+    -- * Destructuring the Response
+    RevokeVpcEndpointAccessResponse (..),
+    newRevokeVpcEndpointAccessResponse,
+
+    -- * Response Lenses
+    revokeVpcEndpointAccessResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newRevokeVpcEndpointAccess' smart constructor.
+data RevokeVpcEndpointAccess = RevokeVpcEndpointAccess'
+  { -- | The name of the OpenSearch Service domain.
+    domainName :: Prelude.Text,
+    -- | The account ID to revoke access from.
+    account :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RevokeVpcEndpointAccess' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainName', 'revokeVpcEndpointAccess_domainName' - The name of the OpenSearch Service domain.
+--
+-- 'account', 'revokeVpcEndpointAccess_account' - The account ID to revoke access from.
+newRevokeVpcEndpointAccess ::
+  -- | 'domainName'
+  Prelude.Text ->
+  -- | 'account'
+  Prelude.Text ->
+  RevokeVpcEndpointAccess
+newRevokeVpcEndpointAccess pDomainName_ pAccount_ =
+  RevokeVpcEndpointAccess'
+    { domainName = pDomainName_,
+      account = pAccount_
+    }
+
+-- | The name of the OpenSearch Service domain.
+revokeVpcEndpointAccess_domainName :: Lens.Lens' RevokeVpcEndpointAccess Prelude.Text
+revokeVpcEndpointAccess_domainName = Lens.lens (\RevokeVpcEndpointAccess' {domainName} -> domainName) (\s@RevokeVpcEndpointAccess' {} a -> s {domainName = a} :: RevokeVpcEndpointAccess)
+
+-- | The account ID to revoke access from.
+revokeVpcEndpointAccess_account :: Lens.Lens' RevokeVpcEndpointAccess Prelude.Text
+revokeVpcEndpointAccess_account = Lens.lens (\RevokeVpcEndpointAccess' {account} -> account) (\s@RevokeVpcEndpointAccess' {} a -> s {account = a} :: RevokeVpcEndpointAccess)
+
+instance Core.AWSRequest RevokeVpcEndpointAccess where
+  type
+    AWSResponse RevokeVpcEndpointAccess =
+      RevokeVpcEndpointAccessResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          RevokeVpcEndpointAccessResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable RevokeVpcEndpointAccess where
+  hashWithSalt _salt RevokeVpcEndpointAccess' {..} =
+    _salt
+      `Prelude.hashWithSalt` domainName
+      `Prelude.hashWithSalt` account
+
+instance Prelude.NFData RevokeVpcEndpointAccess where
+  rnf RevokeVpcEndpointAccess' {..} =
+    Prelude.rnf domainName
+      `Prelude.seq` Prelude.rnf account
+
+instance Data.ToHeaders RevokeVpcEndpointAccess where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON RevokeVpcEndpointAccess where
+  toJSON RevokeVpcEndpointAccess' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("Account" Data..= account)]
+      )
+
+instance Data.ToPath RevokeVpcEndpointAccess where
+  toPath RevokeVpcEndpointAccess' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/domain/",
+        Data.toBS domainName,
+        "/revokeVpcEndpointAccess"
+      ]
+
+instance Data.ToQuery RevokeVpcEndpointAccess where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newRevokeVpcEndpointAccessResponse' smart constructor.
+data RevokeVpcEndpointAccessResponse = RevokeVpcEndpointAccessResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RevokeVpcEndpointAccessResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'revokeVpcEndpointAccessResponse_httpStatus' - The response's http status code.
+newRevokeVpcEndpointAccessResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  RevokeVpcEndpointAccessResponse
+newRevokeVpcEndpointAccessResponse pHttpStatus_ =
+  RevokeVpcEndpointAccessResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+revokeVpcEndpointAccessResponse_httpStatus :: Lens.Lens' RevokeVpcEndpointAccessResponse Prelude.Int
+revokeVpcEndpointAccessResponse_httpStatus = Lens.lens (\RevokeVpcEndpointAccessResponse' {httpStatus} -> httpStatus) (\s@RevokeVpcEndpointAccessResponse' {} a -> s {httpStatus = a} :: RevokeVpcEndpointAccessResponse)
+
+instance
+  Prelude.NFData
+    RevokeVpcEndpointAccessResponse
+  where
+  rnf RevokeVpcEndpointAccessResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/StartServiceSoftwareUpdate.hs b/gen/Amazonka/OpenSearch/StartServiceSoftwareUpdate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/StartServiceSoftwareUpdate.hs
@@ -0,0 +1,176 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.StartServiceSoftwareUpdate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Schedules a service software update for an Amazon OpenSearch Service
+-- domain. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/service-software.html Service software updates in Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.StartServiceSoftwareUpdate
+  ( -- * Creating a Request
+    StartServiceSoftwareUpdate (..),
+    newStartServiceSoftwareUpdate,
+
+    -- * Request Lenses
+    startServiceSoftwareUpdate_domainName,
+
+    -- * Destructuring the Response
+    StartServiceSoftwareUpdateResponse (..),
+    newStartServiceSoftwareUpdateResponse,
+
+    -- * Response Lenses
+    startServiceSoftwareUpdateResponse_serviceSoftwareOptions,
+    startServiceSoftwareUpdateResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to the @StartServiceSoftwareUpdate@
+-- operation.
+--
+-- /See:/ 'newStartServiceSoftwareUpdate' smart constructor.
+data StartServiceSoftwareUpdate = StartServiceSoftwareUpdate'
+  { -- | The name of the domain that you want to update to the latest service
+    -- software.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartServiceSoftwareUpdate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainName', 'startServiceSoftwareUpdate_domainName' - The name of the domain that you want to update to the latest service
+-- software.
+newStartServiceSoftwareUpdate ::
+  -- | 'domainName'
+  Prelude.Text ->
+  StartServiceSoftwareUpdate
+newStartServiceSoftwareUpdate pDomainName_ =
+  StartServiceSoftwareUpdate'
+    { domainName =
+        pDomainName_
+    }
+
+-- | The name of the domain that you want to update to the latest service
+-- software.
+startServiceSoftwareUpdate_domainName :: Lens.Lens' StartServiceSoftwareUpdate Prelude.Text
+startServiceSoftwareUpdate_domainName = Lens.lens (\StartServiceSoftwareUpdate' {domainName} -> domainName) (\s@StartServiceSoftwareUpdate' {} a -> s {domainName = a} :: StartServiceSoftwareUpdate)
+
+instance Core.AWSRequest StartServiceSoftwareUpdate where
+  type
+    AWSResponse StartServiceSoftwareUpdate =
+      StartServiceSoftwareUpdateResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartServiceSoftwareUpdateResponse'
+            Prelude.<$> (x Data..?> "ServiceSoftwareOptions")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartServiceSoftwareUpdate where
+  hashWithSalt _salt StartServiceSoftwareUpdate' {..} =
+    _salt `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData StartServiceSoftwareUpdate where
+  rnf StartServiceSoftwareUpdate' {..} =
+    Prelude.rnf domainName
+
+instance Data.ToHeaders StartServiceSoftwareUpdate where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON StartServiceSoftwareUpdate where
+  toJSON StartServiceSoftwareUpdate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("DomainName" Data..= domainName)]
+      )
+
+instance Data.ToPath StartServiceSoftwareUpdate where
+  toPath =
+    Prelude.const
+      "/2021-01-01/opensearch/serviceSoftwareUpdate/start"
+
+instance Data.ToQuery StartServiceSoftwareUpdate where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Represents the output of a @StartServiceSoftwareUpdate@ operation.
+-- Contains the status of the update.
+--
+-- /See:/ 'newStartServiceSoftwareUpdateResponse' smart constructor.
+data StartServiceSoftwareUpdateResponse = StartServiceSoftwareUpdateResponse'
+  { -- | The current status of the OpenSearch Service software update.
+    serviceSoftwareOptions :: Prelude.Maybe ServiceSoftwareOptions,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartServiceSoftwareUpdateResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'serviceSoftwareOptions', 'startServiceSoftwareUpdateResponse_serviceSoftwareOptions' - The current status of the OpenSearch Service software update.
+--
+-- 'httpStatus', 'startServiceSoftwareUpdateResponse_httpStatus' - The response's http status code.
+newStartServiceSoftwareUpdateResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartServiceSoftwareUpdateResponse
+newStartServiceSoftwareUpdateResponse pHttpStatus_ =
+  StartServiceSoftwareUpdateResponse'
+    { serviceSoftwareOptions =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The current status of the OpenSearch Service software update.
+startServiceSoftwareUpdateResponse_serviceSoftwareOptions :: Lens.Lens' StartServiceSoftwareUpdateResponse (Prelude.Maybe ServiceSoftwareOptions)
+startServiceSoftwareUpdateResponse_serviceSoftwareOptions = Lens.lens (\StartServiceSoftwareUpdateResponse' {serviceSoftwareOptions} -> serviceSoftwareOptions) (\s@StartServiceSoftwareUpdateResponse' {} a -> s {serviceSoftwareOptions = a} :: StartServiceSoftwareUpdateResponse)
+
+-- | The response's http status code.
+startServiceSoftwareUpdateResponse_httpStatus :: Lens.Lens' StartServiceSoftwareUpdateResponse Prelude.Int
+startServiceSoftwareUpdateResponse_httpStatus = Lens.lens (\StartServiceSoftwareUpdateResponse' {httpStatus} -> httpStatus) (\s@StartServiceSoftwareUpdateResponse' {} a -> s {httpStatus = a} :: StartServiceSoftwareUpdateResponse)
+
+instance
+  Prelude.NFData
+    StartServiceSoftwareUpdateResponse
+  where
+  rnf StartServiceSoftwareUpdateResponse' {..} =
+    Prelude.rnf serviceSoftwareOptions
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/Types.hs b/gen/Amazonka/OpenSearch/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types.hs
@@ -0,0 +1,1029 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _BaseException,
+    _ConflictException,
+    _DisabledOperationException,
+    _InternalException,
+    _InvalidPaginationTokenException,
+    _InvalidTypeException,
+    _LimitExceededException,
+    _ResourceAlreadyExistsException,
+    _ResourceNotFoundException,
+    _ValidationException,
+
+    -- * AutoTuneDesiredState
+    AutoTuneDesiredState (..),
+
+    -- * AutoTuneState
+    AutoTuneState (..),
+
+    -- * AutoTuneType
+    AutoTuneType (..),
+
+    -- * DeploymentStatus
+    DeploymentStatus (..),
+
+    -- * DescribePackagesFilterName
+    DescribePackagesFilterName (..),
+
+    -- * DomainPackageStatus
+    DomainPackageStatus (..),
+
+    -- * EngineType
+    EngineType (..),
+
+    -- * InboundConnectionStatusCode
+    InboundConnectionStatusCode (..),
+
+    -- * LogType
+    LogType (..),
+
+    -- * OpenSearchPartitionInstanceType
+    OpenSearchPartitionInstanceType (..),
+
+    -- * OpenSearchWarmPartitionInstanceType
+    OpenSearchWarmPartitionInstanceType (..),
+
+    -- * OptionState
+    OptionState (..),
+
+    -- * OutboundConnectionStatusCode
+    OutboundConnectionStatusCode (..),
+
+    -- * OverallChangeStatus
+    OverallChangeStatus (..),
+
+    -- * PackageStatus
+    PackageStatus (..),
+
+    -- * PackageType
+    PackageType (..),
+
+    -- * PrincipalType
+    PrincipalType (..),
+
+    -- * ReservedInstancePaymentOption
+    ReservedInstancePaymentOption (..),
+
+    -- * RollbackOnDisable
+    RollbackOnDisable (..),
+
+    -- * ScheduledAutoTuneActionType
+    ScheduledAutoTuneActionType (..),
+
+    -- * ScheduledAutoTuneSeverityType
+    ScheduledAutoTuneSeverityType (..),
+
+    -- * TLSSecurityPolicy
+    TLSSecurityPolicy (..),
+
+    -- * TimeUnit
+    TimeUnit (..),
+
+    -- * UpgradeStatus
+    UpgradeStatus (..),
+
+    -- * UpgradeStep
+    UpgradeStep (..),
+
+    -- * VolumeType
+    VolumeType (..),
+
+    -- * VpcEndpointErrorCode
+    VpcEndpointErrorCode (..),
+
+    -- * VpcEndpointStatus
+    VpcEndpointStatus (..),
+
+    -- * AWSDomainInformation
+    AWSDomainInformation (..),
+    newAWSDomainInformation,
+    aWSDomainInformation_ownerId,
+    aWSDomainInformation_region,
+    aWSDomainInformation_domainName,
+
+    -- * AccessPoliciesStatus
+    AccessPoliciesStatus (..),
+    newAccessPoliciesStatus,
+    accessPoliciesStatus_options,
+    accessPoliciesStatus_status,
+
+    -- * AdditionalLimit
+    AdditionalLimit (..),
+    newAdditionalLimit,
+    additionalLimit_limitName,
+    additionalLimit_limitValues,
+
+    -- * AdvancedOptionsStatus
+    AdvancedOptionsStatus (..),
+    newAdvancedOptionsStatus,
+    advancedOptionsStatus_options,
+    advancedOptionsStatus_status,
+
+    -- * AdvancedSecurityOptions
+    AdvancedSecurityOptions (..),
+    newAdvancedSecurityOptions,
+    advancedSecurityOptions_anonymousAuthDisableDate,
+    advancedSecurityOptions_anonymousAuthEnabled,
+    advancedSecurityOptions_enabled,
+    advancedSecurityOptions_internalUserDatabaseEnabled,
+    advancedSecurityOptions_sAMLOptions,
+
+    -- * AdvancedSecurityOptionsInput
+    AdvancedSecurityOptionsInput (..),
+    newAdvancedSecurityOptionsInput,
+    advancedSecurityOptionsInput_anonymousAuthEnabled,
+    advancedSecurityOptionsInput_enabled,
+    advancedSecurityOptionsInput_internalUserDatabaseEnabled,
+    advancedSecurityOptionsInput_masterUserOptions,
+    advancedSecurityOptionsInput_sAMLOptions,
+
+    -- * AdvancedSecurityOptionsStatus
+    AdvancedSecurityOptionsStatus (..),
+    newAdvancedSecurityOptionsStatus,
+    advancedSecurityOptionsStatus_options,
+    advancedSecurityOptionsStatus_status,
+
+    -- * AuthorizedPrincipal
+    AuthorizedPrincipal (..),
+    newAuthorizedPrincipal,
+    authorizedPrincipal_principal,
+    authorizedPrincipal_principalType,
+
+    -- * AutoTune
+    AutoTune (..),
+    newAutoTune,
+    autoTune_autoTuneDetails,
+    autoTune_autoTuneType,
+
+    -- * AutoTuneDetails
+    AutoTuneDetails (..),
+    newAutoTuneDetails,
+    autoTuneDetails_scheduledAutoTuneDetails,
+
+    -- * AutoTuneMaintenanceSchedule
+    AutoTuneMaintenanceSchedule (..),
+    newAutoTuneMaintenanceSchedule,
+    autoTuneMaintenanceSchedule_cronExpressionForRecurrence,
+    autoTuneMaintenanceSchedule_duration,
+    autoTuneMaintenanceSchedule_startAt,
+
+    -- * AutoTuneOptions
+    AutoTuneOptions (..),
+    newAutoTuneOptions,
+    autoTuneOptions_desiredState,
+    autoTuneOptions_maintenanceSchedules,
+    autoTuneOptions_rollbackOnDisable,
+
+    -- * AutoTuneOptionsInput
+    AutoTuneOptionsInput (..),
+    newAutoTuneOptionsInput,
+    autoTuneOptionsInput_desiredState,
+    autoTuneOptionsInput_maintenanceSchedules,
+
+    -- * AutoTuneOptionsOutput
+    AutoTuneOptionsOutput (..),
+    newAutoTuneOptionsOutput,
+    autoTuneOptionsOutput_errorMessage,
+    autoTuneOptionsOutput_state,
+
+    -- * AutoTuneOptionsStatus
+    AutoTuneOptionsStatus (..),
+    newAutoTuneOptionsStatus,
+    autoTuneOptionsStatus_options,
+    autoTuneOptionsStatus_status,
+
+    -- * AutoTuneStatus
+    AutoTuneStatus (..),
+    newAutoTuneStatus,
+    autoTuneStatus_errorMessage,
+    autoTuneStatus_pendingDeletion,
+    autoTuneStatus_updateVersion,
+    autoTuneStatus_creationDate,
+    autoTuneStatus_updateDate,
+    autoTuneStatus_state,
+
+    -- * ChangeProgressDetails
+    ChangeProgressDetails (..),
+    newChangeProgressDetails,
+    changeProgressDetails_changeId,
+    changeProgressDetails_message,
+
+    -- * ChangeProgressStage
+    ChangeProgressStage (..),
+    newChangeProgressStage,
+    changeProgressStage_description,
+    changeProgressStage_lastUpdated,
+    changeProgressStage_name,
+    changeProgressStage_status,
+
+    -- * ChangeProgressStatusDetails
+    ChangeProgressStatusDetails (..),
+    newChangeProgressStatusDetails,
+    changeProgressStatusDetails_changeId,
+    changeProgressStatusDetails_changeProgressStages,
+    changeProgressStatusDetails_completedProperties,
+    changeProgressStatusDetails_pendingProperties,
+    changeProgressStatusDetails_startTime,
+    changeProgressStatusDetails_status,
+    changeProgressStatusDetails_totalNumberOfStages,
+
+    -- * ClusterConfig
+    ClusterConfig (..),
+    newClusterConfig,
+    clusterConfig_coldStorageOptions,
+    clusterConfig_dedicatedMasterCount,
+    clusterConfig_dedicatedMasterEnabled,
+    clusterConfig_dedicatedMasterType,
+    clusterConfig_instanceCount,
+    clusterConfig_instanceType,
+    clusterConfig_warmCount,
+    clusterConfig_warmEnabled,
+    clusterConfig_warmType,
+    clusterConfig_zoneAwarenessConfig,
+    clusterConfig_zoneAwarenessEnabled,
+
+    -- * ClusterConfigStatus
+    ClusterConfigStatus (..),
+    newClusterConfigStatus,
+    clusterConfigStatus_options,
+    clusterConfigStatus_status,
+
+    -- * CognitoOptions
+    CognitoOptions (..),
+    newCognitoOptions,
+    cognitoOptions_enabled,
+    cognitoOptions_identityPoolId,
+    cognitoOptions_roleArn,
+    cognitoOptions_userPoolId,
+
+    -- * CognitoOptionsStatus
+    CognitoOptionsStatus (..),
+    newCognitoOptionsStatus,
+    cognitoOptionsStatus_options,
+    cognitoOptionsStatus_status,
+
+    -- * ColdStorageOptions
+    ColdStorageOptions (..),
+    newColdStorageOptions,
+    coldStorageOptions_enabled,
+
+    -- * CompatibleVersionsMap
+    CompatibleVersionsMap (..),
+    newCompatibleVersionsMap,
+    compatibleVersionsMap_sourceVersion,
+    compatibleVersionsMap_targetVersions,
+
+    -- * DescribePackagesFilter
+    DescribePackagesFilter (..),
+    newDescribePackagesFilter,
+    describePackagesFilter_name,
+    describePackagesFilter_value,
+
+    -- * DomainConfig
+    DomainConfig (..),
+    newDomainConfig,
+    domainConfig_accessPolicies,
+    domainConfig_advancedOptions,
+    domainConfig_advancedSecurityOptions,
+    domainConfig_autoTuneOptions,
+    domainConfig_changeProgressDetails,
+    domainConfig_clusterConfig,
+    domainConfig_cognitoOptions,
+    domainConfig_domainEndpointOptions,
+    domainConfig_eBSOptions,
+    domainConfig_encryptionAtRestOptions,
+    domainConfig_engineVersion,
+    domainConfig_logPublishingOptions,
+    domainConfig_nodeToNodeEncryptionOptions,
+    domainConfig_snapshotOptions,
+    domainConfig_vPCOptions,
+
+    -- * DomainEndpointOptions
+    DomainEndpointOptions (..),
+    newDomainEndpointOptions,
+    domainEndpointOptions_customEndpoint,
+    domainEndpointOptions_customEndpointCertificateArn,
+    domainEndpointOptions_customEndpointEnabled,
+    domainEndpointOptions_enforceHTTPS,
+    domainEndpointOptions_tLSSecurityPolicy,
+
+    -- * DomainEndpointOptionsStatus
+    DomainEndpointOptionsStatus (..),
+    newDomainEndpointOptionsStatus,
+    domainEndpointOptionsStatus_options,
+    domainEndpointOptionsStatus_status,
+
+    -- * DomainInfo
+    DomainInfo (..),
+    newDomainInfo,
+    domainInfo_domainName,
+    domainInfo_engineType,
+
+    -- * DomainInformationContainer
+    DomainInformationContainer (..),
+    newDomainInformationContainer,
+    domainInformationContainer_aWSDomainInformation,
+
+    -- * DomainPackageDetails
+    DomainPackageDetails (..),
+    newDomainPackageDetails,
+    domainPackageDetails_domainName,
+    domainPackageDetails_domainPackageStatus,
+    domainPackageDetails_errorDetails,
+    domainPackageDetails_lastUpdated,
+    domainPackageDetails_packageID,
+    domainPackageDetails_packageName,
+    domainPackageDetails_packageType,
+    domainPackageDetails_packageVersion,
+    domainPackageDetails_referencePath,
+
+    -- * DomainStatus
+    DomainStatus (..),
+    newDomainStatus,
+    domainStatus_accessPolicies,
+    domainStatus_advancedOptions,
+    domainStatus_advancedSecurityOptions,
+    domainStatus_autoTuneOptions,
+    domainStatus_changeProgressDetails,
+    domainStatus_cognitoOptions,
+    domainStatus_created,
+    domainStatus_deleted,
+    domainStatus_domainEndpointOptions,
+    domainStatus_eBSOptions,
+    domainStatus_encryptionAtRestOptions,
+    domainStatus_endpoint,
+    domainStatus_endpoints,
+    domainStatus_engineVersion,
+    domainStatus_logPublishingOptions,
+    domainStatus_nodeToNodeEncryptionOptions,
+    domainStatus_processing,
+    domainStatus_serviceSoftwareOptions,
+    domainStatus_snapshotOptions,
+    domainStatus_upgradeProcessing,
+    domainStatus_vPCOptions,
+    domainStatus_domainId,
+    domainStatus_domainName,
+    domainStatus_arn,
+    domainStatus_clusterConfig,
+
+    -- * DryRunResults
+    DryRunResults (..),
+    newDryRunResults,
+    dryRunResults_deploymentType,
+    dryRunResults_message,
+
+    -- * Duration
+    Duration (..),
+    newDuration,
+    duration_unit,
+    duration_value,
+
+    -- * EBSOptions
+    EBSOptions (..),
+    newEBSOptions,
+    eBSOptions_eBSEnabled,
+    eBSOptions_iops,
+    eBSOptions_throughput,
+    eBSOptions_volumeSize,
+    eBSOptions_volumeType,
+
+    -- * EBSOptionsStatus
+    EBSOptionsStatus (..),
+    newEBSOptionsStatus,
+    eBSOptionsStatus_options,
+    eBSOptionsStatus_status,
+
+    -- * EncryptionAtRestOptions
+    EncryptionAtRestOptions (..),
+    newEncryptionAtRestOptions,
+    encryptionAtRestOptions_enabled,
+    encryptionAtRestOptions_kmsKeyId,
+
+    -- * EncryptionAtRestOptionsStatus
+    EncryptionAtRestOptionsStatus (..),
+    newEncryptionAtRestOptionsStatus,
+    encryptionAtRestOptionsStatus_options,
+    encryptionAtRestOptionsStatus_status,
+
+    -- * ErrorDetails
+    ErrorDetails (..),
+    newErrorDetails,
+    errorDetails_errorMessage,
+    errorDetails_errorType,
+
+    -- * Filter
+    Filter (..),
+    newFilter,
+    filter_name,
+    filter_values,
+
+    -- * InboundConnection
+    InboundConnection (..),
+    newInboundConnection,
+    inboundConnection_connectionId,
+    inboundConnection_connectionStatus,
+    inboundConnection_localDomainInfo,
+    inboundConnection_remoteDomainInfo,
+
+    -- * InboundConnectionStatus
+    InboundConnectionStatus (..),
+    newInboundConnectionStatus,
+    inboundConnectionStatus_message,
+    inboundConnectionStatus_statusCode,
+
+    -- * InstanceCountLimits
+    InstanceCountLimits (..),
+    newInstanceCountLimits,
+    instanceCountLimits_maximumInstanceCount,
+    instanceCountLimits_minimumInstanceCount,
+
+    -- * InstanceLimits
+    InstanceLimits (..),
+    newInstanceLimits,
+    instanceLimits_instanceCountLimits,
+
+    -- * InstanceTypeDetails
+    InstanceTypeDetails (..),
+    newInstanceTypeDetails,
+    instanceTypeDetails_advancedSecurityEnabled,
+    instanceTypeDetails_appLogsEnabled,
+    instanceTypeDetails_cognitoEnabled,
+    instanceTypeDetails_encryptionEnabled,
+    instanceTypeDetails_instanceRole,
+    instanceTypeDetails_instanceType,
+    instanceTypeDetails_warmEnabled,
+
+    -- * Limits
+    Limits (..),
+    newLimits,
+    limits_additionalLimits,
+    limits_instanceLimits,
+    limits_storageTypes,
+
+    -- * LogPublishingOption
+    LogPublishingOption (..),
+    newLogPublishingOption,
+    logPublishingOption_cloudWatchLogsLogGroupArn,
+    logPublishingOption_enabled,
+
+    -- * LogPublishingOptionsStatus
+    LogPublishingOptionsStatus (..),
+    newLogPublishingOptionsStatus,
+    logPublishingOptionsStatus_options,
+    logPublishingOptionsStatus_status,
+
+    -- * MasterUserOptions
+    MasterUserOptions (..),
+    newMasterUserOptions,
+    masterUserOptions_masterUserARN,
+    masterUserOptions_masterUserName,
+    masterUserOptions_masterUserPassword,
+
+    -- * NodeToNodeEncryptionOptions
+    NodeToNodeEncryptionOptions (..),
+    newNodeToNodeEncryptionOptions,
+    nodeToNodeEncryptionOptions_enabled,
+
+    -- * NodeToNodeEncryptionOptionsStatus
+    NodeToNodeEncryptionOptionsStatus (..),
+    newNodeToNodeEncryptionOptionsStatus,
+    nodeToNodeEncryptionOptionsStatus_options,
+    nodeToNodeEncryptionOptionsStatus_status,
+
+    -- * OptionStatus
+    OptionStatus (..),
+    newOptionStatus,
+    optionStatus_pendingDeletion,
+    optionStatus_updateVersion,
+    optionStatus_creationDate,
+    optionStatus_updateDate,
+    optionStatus_state,
+
+    -- * OutboundConnection
+    OutboundConnection (..),
+    newOutboundConnection,
+    outboundConnection_connectionAlias,
+    outboundConnection_connectionId,
+    outboundConnection_connectionStatus,
+    outboundConnection_localDomainInfo,
+    outboundConnection_remoteDomainInfo,
+
+    -- * OutboundConnectionStatus
+    OutboundConnectionStatus (..),
+    newOutboundConnectionStatus,
+    outboundConnectionStatus_message,
+    outboundConnectionStatus_statusCode,
+
+    -- * PackageDetails
+    PackageDetails (..),
+    newPackageDetails,
+    packageDetails_availablePackageVersion,
+    packageDetails_createdAt,
+    packageDetails_errorDetails,
+    packageDetails_lastUpdatedAt,
+    packageDetails_packageDescription,
+    packageDetails_packageID,
+    packageDetails_packageName,
+    packageDetails_packageStatus,
+    packageDetails_packageType,
+
+    -- * PackageSource
+    PackageSource (..),
+    newPackageSource,
+    packageSource_s3BucketName,
+    packageSource_s3Key,
+
+    -- * PackageVersionHistory
+    PackageVersionHistory (..),
+    newPackageVersionHistory,
+    packageVersionHistory_commitMessage,
+    packageVersionHistory_createdAt,
+    packageVersionHistory_packageVersion,
+
+    -- * RecurringCharge
+    RecurringCharge (..),
+    newRecurringCharge,
+    recurringCharge_recurringChargeAmount,
+    recurringCharge_recurringChargeFrequency,
+
+    -- * ReservedInstance
+    ReservedInstance (..),
+    newReservedInstance,
+    reservedInstance_billingSubscriptionId,
+    reservedInstance_currencyCode,
+    reservedInstance_duration,
+    reservedInstance_fixedPrice,
+    reservedInstance_instanceCount,
+    reservedInstance_instanceType,
+    reservedInstance_paymentOption,
+    reservedInstance_recurringCharges,
+    reservedInstance_reservationName,
+    reservedInstance_reservedInstanceId,
+    reservedInstance_reservedInstanceOfferingId,
+    reservedInstance_startTime,
+    reservedInstance_state,
+    reservedInstance_usagePrice,
+
+    -- * ReservedInstanceOffering
+    ReservedInstanceOffering (..),
+    newReservedInstanceOffering,
+    reservedInstanceOffering_currencyCode,
+    reservedInstanceOffering_duration,
+    reservedInstanceOffering_fixedPrice,
+    reservedInstanceOffering_instanceType,
+    reservedInstanceOffering_paymentOption,
+    reservedInstanceOffering_recurringCharges,
+    reservedInstanceOffering_reservedInstanceOfferingId,
+    reservedInstanceOffering_usagePrice,
+
+    -- * SAMLIdp
+    SAMLIdp (..),
+    newSAMLIdp,
+    sAMLIdp_metadataContent,
+    sAMLIdp_entityId,
+
+    -- * SAMLOptionsInput
+    SAMLOptionsInput (..),
+    newSAMLOptionsInput,
+    sAMLOptionsInput_enabled,
+    sAMLOptionsInput_idp,
+    sAMLOptionsInput_masterBackendRole,
+    sAMLOptionsInput_masterUserName,
+    sAMLOptionsInput_rolesKey,
+    sAMLOptionsInput_sessionTimeoutMinutes,
+    sAMLOptionsInput_subjectKey,
+
+    -- * SAMLOptionsOutput
+    SAMLOptionsOutput (..),
+    newSAMLOptionsOutput,
+    sAMLOptionsOutput_enabled,
+    sAMLOptionsOutput_idp,
+    sAMLOptionsOutput_rolesKey,
+    sAMLOptionsOutput_sessionTimeoutMinutes,
+    sAMLOptionsOutput_subjectKey,
+
+    -- * ScheduledAutoTuneDetails
+    ScheduledAutoTuneDetails (..),
+    newScheduledAutoTuneDetails,
+    scheduledAutoTuneDetails_action,
+    scheduledAutoTuneDetails_actionType,
+    scheduledAutoTuneDetails_date,
+    scheduledAutoTuneDetails_severity,
+
+    -- * ServiceSoftwareOptions
+    ServiceSoftwareOptions (..),
+    newServiceSoftwareOptions,
+    serviceSoftwareOptions_automatedUpdateDate,
+    serviceSoftwareOptions_cancellable,
+    serviceSoftwareOptions_currentVersion,
+    serviceSoftwareOptions_description,
+    serviceSoftwareOptions_newVersion,
+    serviceSoftwareOptions_optionalDeployment,
+    serviceSoftwareOptions_updateAvailable,
+    serviceSoftwareOptions_updateStatus,
+
+    -- * SnapshotOptions
+    SnapshotOptions (..),
+    newSnapshotOptions,
+    snapshotOptions_automatedSnapshotStartHour,
+
+    -- * SnapshotOptionsStatus
+    SnapshotOptionsStatus (..),
+    newSnapshotOptionsStatus,
+    snapshotOptionsStatus_options,
+    snapshotOptionsStatus_status,
+
+    -- * StorageType
+    StorageType (..),
+    newStorageType,
+    storageType_storageSubTypeName,
+    storageType_storageTypeLimits,
+    storageType_storageTypeName,
+
+    -- * StorageTypeLimit
+    StorageTypeLimit (..),
+    newStorageTypeLimit,
+    storageTypeLimit_limitName,
+    storageTypeLimit_limitValues,
+
+    -- * Tag
+    Tag (..),
+    newTag,
+    tag_key,
+    tag_value,
+
+    -- * UpgradeHistory
+    UpgradeHistory (..),
+    newUpgradeHistory,
+    upgradeHistory_startTimestamp,
+    upgradeHistory_stepsList,
+    upgradeHistory_upgradeName,
+    upgradeHistory_upgradeStatus,
+
+    -- * UpgradeStepItem
+    UpgradeStepItem (..),
+    newUpgradeStepItem,
+    upgradeStepItem_issues,
+    upgradeStepItem_progressPercent,
+    upgradeStepItem_upgradeStep,
+    upgradeStepItem_upgradeStepStatus,
+
+    -- * VPCDerivedInfo
+    VPCDerivedInfo (..),
+    newVPCDerivedInfo,
+    vPCDerivedInfo_availabilityZones,
+    vPCDerivedInfo_securityGroupIds,
+    vPCDerivedInfo_subnetIds,
+    vPCDerivedInfo_vPCId,
+
+    -- * VPCDerivedInfoStatus
+    VPCDerivedInfoStatus (..),
+    newVPCDerivedInfoStatus,
+    vPCDerivedInfoStatus_options,
+    vPCDerivedInfoStatus_status,
+
+    -- * VPCOptions
+    VPCOptions (..),
+    newVPCOptions,
+    vPCOptions_securityGroupIds,
+    vPCOptions_subnetIds,
+
+    -- * VersionStatus
+    VersionStatus (..),
+    newVersionStatus,
+    versionStatus_options,
+    versionStatus_status,
+
+    -- * VpcEndpoint
+    VpcEndpoint (..),
+    newVpcEndpoint,
+    vpcEndpoint_domainArn,
+    vpcEndpoint_endpoint,
+    vpcEndpoint_status,
+    vpcEndpoint_vpcEndpointId,
+    vpcEndpoint_vpcEndpointOwner,
+    vpcEndpoint_vpcOptions,
+
+    -- * VpcEndpointError
+    VpcEndpointError (..),
+    newVpcEndpointError,
+    vpcEndpointError_errorCode,
+    vpcEndpointError_errorMessage,
+    vpcEndpointError_vpcEndpointId,
+
+    -- * VpcEndpointSummary
+    VpcEndpointSummary (..),
+    newVpcEndpointSummary,
+    vpcEndpointSummary_domainArn,
+    vpcEndpointSummary_status,
+    vpcEndpointSummary_vpcEndpointId,
+    vpcEndpointSummary_vpcEndpointOwner,
+
+    -- * ZoneAwarenessConfig
+    ZoneAwarenessConfig (..),
+    newZoneAwarenessConfig,
+    zoneAwarenessConfig_availabilityZoneCount,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.OpenSearch.Types.AWSDomainInformation
+import Amazonka.OpenSearch.Types.AccessPoliciesStatus
+import Amazonka.OpenSearch.Types.AdditionalLimit
+import Amazonka.OpenSearch.Types.AdvancedOptionsStatus
+import Amazonka.OpenSearch.Types.AdvancedSecurityOptions
+import Amazonka.OpenSearch.Types.AdvancedSecurityOptionsInput
+import Amazonka.OpenSearch.Types.AdvancedSecurityOptionsStatus
+import Amazonka.OpenSearch.Types.AuthorizedPrincipal
+import Amazonka.OpenSearch.Types.AutoTune
+import Amazonka.OpenSearch.Types.AutoTuneDesiredState
+import Amazonka.OpenSearch.Types.AutoTuneDetails
+import Amazonka.OpenSearch.Types.AutoTuneMaintenanceSchedule
+import Amazonka.OpenSearch.Types.AutoTuneOptions
+import Amazonka.OpenSearch.Types.AutoTuneOptionsInput
+import Amazonka.OpenSearch.Types.AutoTuneOptionsOutput
+import Amazonka.OpenSearch.Types.AutoTuneOptionsStatus
+import Amazonka.OpenSearch.Types.AutoTuneState
+import Amazonka.OpenSearch.Types.AutoTuneStatus
+import Amazonka.OpenSearch.Types.AutoTuneType
+import Amazonka.OpenSearch.Types.ChangeProgressDetails
+import Amazonka.OpenSearch.Types.ChangeProgressStage
+import Amazonka.OpenSearch.Types.ChangeProgressStatusDetails
+import Amazonka.OpenSearch.Types.ClusterConfig
+import Amazonka.OpenSearch.Types.ClusterConfigStatus
+import Amazonka.OpenSearch.Types.CognitoOptions
+import Amazonka.OpenSearch.Types.CognitoOptionsStatus
+import Amazonka.OpenSearch.Types.ColdStorageOptions
+import Amazonka.OpenSearch.Types.CompatibleVersionsMap
+import Amazonka.OpenSearch.Types.DeploymentStatus
+import Amazonka.OpenSearch.Types.DescribePackagesFilter
+import Amazonka.OpenSearch.Types.DescribePackagesFilterName
+import Amazonka.OpenSearch.Types.DomainConfig
+import Amazonka.OpenSearch.Types.DomainEndpointOptions
+import Amazonka.OpenSearch.Types.DomainEndpointOptionsStatus
+import Amazonka.OpenSearch.Types.DomainInfo
+import Amazonka.OpenSearch.Types.DomainInformationContainer
+import Amazonka.OpenSearch.Types.DomainPackageDetails
+import Amazonka.OpenSearch.Types.DomainPackageStatus
+import Amazonka.OpenSearch.Types.DomainStatus
+import Amazonka.OpenSearch.Types.DryRunResults
+import Amazonka.OpenSearch.Types.Duration
+import Amazonka.OpenSearch.Types.EBSOptions
+import Amazonka.OpenSearch.Types.EBSOptionsStatus
+import Amazonka.OpenSearch.Types.EncryptionAtRestOptions
+import Amazonka.OpenSearch.Types.EncryptionAtRestOptionsStatus
+import Amazonka.OpenSearch.Types.EngineType
+import Amazonka.OpenSearch.Types.ErrorDetails
+import Amazonka.OpenSearch.Types.Filter
+import Amazonka.OpenSearch.Types.InboundConnection
+import Amazonka.OpenSearch.Types.InboundConnectionStatus
+import Amazonka.OpenSearch.Types.InboundConnectionStatusCode
+import Amazonka.OpenSearch.Types.InstanceCountLimits
+import Amazonka.OpenSearch.Types.InstanceLimits
+import Amazonka.OpenSearch.Types.InstanceTypeDetails
+import Amazonka.OpenSearch.Types.Limits
+import Amazonka.OpenSearch.Types.LogPublishingOption
+import Amazonka.OpenSearch.Types.LogPublishingOptionsStatus
+import Amazonka.OpenSearch.Types.LogType
+import Amazonka.OpenSearch.Types.MasterUserOptions
+import Amazonka.OpenSearch.Types.NodeToNodeEncryptionOptions
+import Amazonka.OpenSearch.Types.NodeToNodeEncryptionOptionsStatus
+import Amazonka.OpenSearch.Types.OpenSearchPartitionInstanceType
+import Amazonka.OpenSearch.Types.OpenSearchWarmPartitionInstanceType
+import Amazonka.OpenSearch.Types.OptionState
+import Amazonka.OpenSearch.Types.OptionStatus
+import Amazonka.OpenSearch.Types.OutboundConnection
+import Amazonka.OpenSearch.Types.OutboundConnectionStatus
+import Amazonka.OpenSearch.Types.OutboundConnectionStatusCode
+import Amazonka.OpenSearch.Types.OverallChangeStatus
+import Amazonka.OpenSearch.Types.PackageDetails
+import Amazonka.OpenSearch.Types.PackageSource
+import Amazonka.OpenSearch.Types.PackageStatus
+import Amazonka.OpenSearch.Types.PackageType
+import Amazonka.OpenSearch.Types.PackageVersionHistory
+import Amazonka.OpenSearch.Types.PrincipalType
+import Amazonka.OpenSearch.Types.RecurringCharge
+import Amazonka.OpenSearch.Types.ReservedInstance
+import Amazonka.OpenSearch.Types.ReservedInstanceOffering
+import Amazonka.OpenSearch.Types.ReservedInstancePaymentOption
+import Amazonka.OpenSearch.Types.RollbackOnDisable
+import Amazonka.OpenSearch.Types.SAMLIdp
+import Amazonka.OpenSearch.Types.SAMLOptionsInput
+import Amazonka.OpenSearch.Types.SAMLOptionsOutput
+import Amazonka.OpenSearch.Types.ScheduledAutoTuneActionType
+import Amazonka.OpenSearch.Types.ScheduledAutoTuneDetails
+import Amazonka.OpenSearch.Types.ScheduledAutoTuneSeverityType
+import Amazonka.OpenSearch.Types.ServiceSoftwareOptions
+import Amazonka.OpenSearch.Types.SnapshotOptions
+import Amazonka.OpenSearch.Types.SnapshotOptionsStatus
+import Amazonka.OpenSearch.Types.StorageType
+import Amazonka.OpenSearch.Types.StorageTypeLimit
+import Amazonka.OpenSearch.Types.TLSSecurityPolicy
+import Amazonka.OpenSearch.Types.Tag
+import Amazonka.OpenSearch.Types.TimeUnit
+import Amazonka.OpenSearch.Types.UpgradeHistory
+import Amazonka.OpenSearch.Types.UpgradeStatus
+import Amazonka.OpenSearch.Types.UpgradeStep
+import Amazonka.OpenSearch.Types.UpgradeStepItem
+import Amazonka.OpenSearch.Types.VPCDerivedInfo
+import Amazonka.OpenSearch.Types.VPCDerivedInfoStatus
+import Amazonka.OpenSearch.Types.VPCOptions
+import Amazonka.OpenSearch.Types.VersionStatus
+import Amazonka.OpenSearch.Types.VolumeType
+import Amazonka.OpenSearch.Types.VpcEndpoint
+import Amazonka.OpenSearch.Types.VpcEndpointError
+import Amazonka.OpenSearch.Types.VpcEndpointErrorCode
+import Amazonka.OpenSearch.Types.VpcEndpointStatus
+import Amazonka.OpenSearch.Types.VpcEndpointSummary
+import Amazonka.OpenSearch.Types.ZoneAwarenessConfig
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2021-01-01@ of the Amazon OpenSearch Service SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "OpenSearch",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "es",
+      Core.signingName = "es",
+      Core.version = "2021-01-01",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "OpenSearch",
+      Core.retry = retry
+    }
+  where
+    retry =
+      Core.Exponential
+        { Core.base = 5.0e-2,
+          Core.growth = 2,
+          Core.attempts = 5,
+          Core.check = check
+        }
+    check e
+      | Lens.has (Core.hasStatus 502) e =
+          Prelude.Just "bad_gateway"
+      | Lens.has (Core.hasStatus 504) e =
+          Prelude.Just "gateway_timeout"
+      | Lens.has (Core.hasStatus 500) e =
+          Prelude.Just "general_server_error"
+      | Lens.has (Core.hasStatus 509) e =
+          Prelude.Just "limit_exceeded"
+      | Lens.has
+          ( Core.hasCode "RequestThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "request_throttled_exception"
+      | Lens.has (Core.hasStatus 503) e =
+          Prelude.Just "service_unavailable"
+      | Lens.has
+          ( Core.hasCode "ThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttled_exception"
+      | Lens.has
+          ( Core.hasCode "Throttling"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling"
+      | Lens.has
+          ( Core.hasCode "ThrottlingException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling_exception"
+      | Lens.has
+          ( Core.hasCode
+              "ProvisionedThroughputExceededException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throughput_exceeded"
+      | Lens.has (Core.hasStatus 429) e =
+          Prelude.Just "too_many_requests"
+      | Prelude.otherwise = Prelude.Nothing
+
+-- | An error occurred because user does not have permissions to access the
+-- resource. Returns HTTP status code 403.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+    Prelude.. Core.hasStatus 403
+
+-- | An error occurred while processing the request.
+_BaseException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_BaseException =
+  Core._MatchServiceError
+    defaultService
+    "BaseException"
+
+-- | An error occurred because the client attempts to remove a resource that
+-- is currently in use. Returns HTTP status code 409.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+    Prelude.. Core.hasStatus 409
+
+-- | An error occured because the client wanted to access a not supported
+-- operation. Gives http status code of 409.
+_DisabledOperationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_DisabledOperationException =
+  Core._MatchServiceError
+    defaultService
+    "DisabledOperationException"
+    Prelude.. Core.hasStatus 409
+
+-- | The request processing has failed because of an unknown error, exception
+-- or failure (the failure is internal to the service) . Gives http status
+-- code of 500.
+_InternalException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalException =
+  Core._MatchServiceError
+    defaultService
+    "InternalException"
+    Prelude.. Core.hasStatus 500
+
+-- | The request processing has failed because of invalid pagination token
+-- provided by customer. Returns an HTTP status code of 400.
+_InvalidPaginationTokenException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidPaginationTokenException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidPaginationTokenException"
+    Prelude.. Core.hasStatus 400
+
+-- | An exception for trying to create or access sub-resource that is either
+-- invalid or not supported. Gives http status code of 409.
+_InvalidTypeException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidTypeException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidTypeException"
+    Prelude.. Core.hasStatus 409
+
+-- | An exception for trying to create more than allowed resources or
+-- sub-resources. Gives http status code of 409.
+_LimitExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LimitExceededException =
+  Core._MatchServiceError
+    defaultService
+    "LimitExceededException"
+    Prelude.. Core.hasStatus 409
+
+-- | An exception for creating a resource that already exists. Gives http
+-- status code of 400.
+_ResourceAlreadyExistsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceAlreadyExistsException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceAlreadyExistsException"
+    Prelude.. Core.hasStatus 409
+
+-- | An exception for accessing or deleting a resource that does not exist.
+-- Gives http status code of 400.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 409
+
+-- | An exception for missing \/ invalid input fields. Gives http status code
+-- of 400.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
+    Prelude.. Core.hasStatus 400
diff --git a/gen/Amazonka/OpenSearch/Types/AWSDomainInformation.hs b/gen/Amazonka/OpenSearch/Types/AWSDomainInformation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AWSDomainInformation.hs
@@ -0,0 +1,108 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AWSDomainInformation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AWSDomainInformation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about an Amazon OpenSearch Service domain.
+--
+-- /See:/ 'newAWSDomainInformation' smart constructor.
+data AWSDomainInformation = AWSDomainInformation'
+  { -- | The Amazon Web Services account ID of the domain owner.
+    ownerId :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services Region in which the domain is located.
+    region :: Prelude.Maybe Prelude.Text,
+    -- | Name of the domain.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AWSDomainInformation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'ownerId', 'aWSDomainInformation_ownerId' - The Amazon Web Services account ID of the domain owner.
+--
+-- 'region', 'aWSDomainInformation_region' - The Amazon Web Services Region in which the domain is located.
+--
+-- 'domainName', 'aWSDomainInformation_domainName' - Name of the domain.
+newAWSDomainInformation ::
+  -- | 'domainName'
+  Prelude.Text ->
+  AWSDomainInformation
+newAWSDomainInformation pDomainName_ =
+  AWSDomainInformation'
+    { ownerId = Prelude.Nothing,
+      region = Prelude.Nothing,
+      domainName = pDomainName_
+    }
+
+-- | The Amazon Web Services account ID of the domain owner.
+aWSDomainInformation_ownerId :: Lens.Lens' AWSDomainInformation (Prelude.Maybe Prelude.Text)
+aWSDomainInformation_ownerId = Lens.lens (\AWSDomainInformation' {ownerId} -> ownerId) (\s@AWSDomainInformation' {} a -> s {ownerId = a} :: AWSDomainInformation)
+
+-- | The Amazon Web Services Region in which the domain is located.
+aWSDomainInformation_region :: Lens.Lens' AWSDomainInformation (Prelude.Maybe Prelude.Text)
+aWSDomainInformation_region = Lens.lens (\AWSDomainInformation' {region} -> region) (\s@AWSDomainInformation' {} a -> s {region = a} :: AWSDomainInformation)
+
+-- | Name of the domain.
+aWSDomainInformation_domainName :: Lens.Lens' AWSDomainInformation Prelude.Text
+aWSDomainInformation_domainName = Lens.lens (\AWSDomainInformation' {domainName} -> domainName) (\s@AWSDomainInformation' {} a -> s {domainName = a} :: AWSDomainInformation)
+
+instance Data.FromJSON AWSDomainInformation where
+  parseJSON =
+    Data.withObject
+      "AWSDomainInformation"
+      ( \x ->
+          AWSDomainInformation'
+            Prelude.<$> (x Data..:? "OwnerId")
+            Prelude.<*> (x Data..:? "Region")
+            Prelude.<*> (x Data..: "DomainName")
+      )
+
+instance Prelude.Hashable AWSDomainInformation where
+  hashWithSalt _salt AWSDomainInformation' {..} =
+    _salt
+      `Prelude.hashWithSalt` ownerId
+      `Prelude.hashWithSalt` region
+      `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData AWSDomainInformation where
+  rnf AWSDomainInformation' {..} =
+    Prelude.rnf ownerId
+      `Prelude.seq` Prelude.rnf region
+      `Prelude.seq` Prelude.rnf domainName
+
+instance Data.ToJSON AWSDomainInformation where
+  toJSON AWSDomainInformation' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("OwnerId" Data..=) Prelude.<$> ownerId,
+            ("Region" Data..=) Prelude.<$> region,
+            Prelude.Just ("DomainName" Data..= domainName)
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/AccessPoliciesStatus.hs b/gen/Amazonka/OpenSearch/Types/AccessPoliciesStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AccessPoliciesStatus.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AccessPoliciesStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AccessPoliciesStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.OptionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The configured access rules for the domain\'s search endpoint, and the
+-- current status of those rules.
+--
+-- /See:/ 'newAccessPoliciesStatus' smart constructor.
+data AccessPoliciesStatus = AccessPoliciesStatus'
+  { -- | The access policy configured for the domain. Access policies can be
+    -- resource-based, IP-based, or IAM-based. For more information, see
+    -- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomain-configure-access-policies Configuring access policies>.
+    options :: Prelude.Text,
+    -- | The status of the access policy for the domain.
+    status :: OptionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AccessPoliciesStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'options', 'accessPoliciesStatus_options' - The access policy configured for the domain. Access policies can be
+-- resource-based, IP-based, or IAM-based. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomain-configure-access-policies Configuring access policies>.
+--
+-- 'status', 'accessPoliciesStatus_status' - The status of the access policy for the domain.
+newAccessPoliciesStatus ::
+  -- | 'options'
+  Prelude.Text ->
+  -- | 'status'
+  OptionStatus ->
+  AccessPoliciesStatus
+newAccessPoliciesStatus pOptions_ pStatus_ =
+  AccessPoliciesStatus'
+    { options = pOptions_,
+      status = pStatus_
+    }
+
+-- | The access policy configured for the domain. Access policies can be
+-- resource-based, IP-based, or IAM-based. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomain-configure-access-policies Configuring access policies>.
+accessPoliciesStatus_options :: Lens.Lens' AccessPoliciesStatus Prelude.Text
+accessPoliciesStatus_options = Lens.lens (\AccessPoliciesStatus' {options} -> options) (\s@AccessPoliciesStatus' {} a -> s {options = a} :: AccessPoliciesStatus)
+
+-- | The status of the access policy for the domain.
+accessPoliciesStatus_status :: Lens.Lens' AccessPoliciesStatus OptionStatus
+accessPoliciesStatus_status = Lens.lens (\AccessPoliciesStatus' {status} -> status) (\s@AccessPoliciesStatus' {} a -> s {status = a} :: AccessPoliciesStatus)
+
+instance Data.FromJSON AccessPoliciesStatus where
+  parseJSON =
+    Data.withObject
+      "AccessPoliciesStatus"
+      ( \x ->
+          AccessPoliciesStatus'
+            Prelude.<$> (x Data..: "Options")
+            Prelude.<*> (x Data..: "Status")
+      )
+
+instance Prelude.Hashable AccessPoliciesStatus where
+  hashWithSalt _salt AccessPoliciesStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` options
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData AccessPoliciesStatus where
+  rnf AccessPoliciesStatus' {..} =
+    Prelude.rnf options
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/OpenSearch/Types/AdditionalLimit.hs b/gen/Amazonka/OpenSearch/Types/AdditionalLimit.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AdditionalLimit.hs
@@ -0,0 +1,105 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AdditionalLimit
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AdditionalLimit where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | List of limits that are specific to a given instance type.
+--
+-- /See:/ 'newAdditionalLimit' smart constructor.
+data AdditionalLimit = AdditionalLimit'
+  { -- | -   @MaximumNumberOfDataNodesSupported@ - This attribute only applies to
+    --     master nodes and specifies the maximum number of data nodes of a
+    --     given instance type a master node can support.
+    --
+    -- -   @MaximumNumberOfDataNodesWithoutMasterNode@ - This attribute only
+    --     applies to data nodes and specifies the maximum number of data nodes
+    --     of a given instance type can exist without a master node governing
+    --     them.
+    limitName :: Prelude.Maybe Prelude.Text,
+    -- | The values of the additional instance type limits.
+    limitValues :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AdditionalLimit' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'limitName', 'additionalLimit_limitName' - -   @MaximumNumberOfDataNodesSupported@ - This attribute only applies to
+--     master nodes and specifies the maximum number of data nodes of a
+--     given instance type a master node can support.
+--
+-- -   @MaximumNumberOfDataNodesWithoutMasterNode@ - This attribute only
+--     applies to data nodes and specifies the maximum number of data nodes
+--     of a given instance type can exist without a master node governing
+--     them.
+--
+-- 'limitValues', 'additionalLimit_limitValues' - The values of the additional instance type limits.
+newAdditionalLimit ::
+  AdditionalLimit
+newAdditionalLimit =
+  AdditionalLimit'
+    { limitName = Prelude.Nothing,
+      limitValues = Prelude.Nothing
+    }
+
+-- | -   @MaximumNumberOfDataNodesSupported@ - This attribute only applies to
+--     master nodes and specifies the maximum number of data nodes of a
+--     given instance type a master node can support.
+--
+-- -   @MaximumNumberOfDataNodesWithoutMasterNode@ - This attribute only
+--     applies to data nodes and specifies the maximum number of data nodes
+--     of a given instance type can exist without a master node governing
+--     them.
+additionalLimit_limitName :: Lens.Lens' AdditionalLimit (Prelude.Maybe Prelude.Text)
+additionalLimit_limitName = Lens.lens (\AdditionalLimit' {limitName} -> limitName) (\s@AdditionalLimit' {} a -> s {limitName = a} :: AdditionalLimit)
+
+-- | The values of the additional instance type limits.
+additionalLimit_limitValues :: Lens.Lens' AdditionalLimit (Prelude.Maybe [Prelude.Text])
+additionalLimit_limitValues = Lens.lens (\AdditionalLimit' {limitValues} -> limitValues) (\s@AdditionalLimit' {} a -> s {limitValues = a} :: AdditionalLimit) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON AdditionalLimit where
+  parseJSON =
+    Data.withObject
+      "AdditionalLimit"
+      ( \x ->
+          AdditionalLimit'
+            Prelude.<$> (x Data..:? "LimitName")
+            Prelude.<*> (x Data..:? "LimitValues" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable AdditionalLimit where
+  hashWithSalt _salt AdditionalLimit' {..} =
+    _salt
+      `Prelude.hashWithSalt` limitName
+      `Prelude.hashWithSalt` limitValues
+
+instance Prelude.NFData AdditionalLimit where
+  rnf AdditionalLimit' {..} =
+    Prelude.rnf limitName
+      `Prelude.seq` Prelude.rnf limitValues
diff --git a/gen/Amazonka/OpenSearch/Types/AdvancedOptionsStatus.hs b/gen/Amazonka/OpenSearch/Types/AdvancedOptionsStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AdvancedOptionsStatus.hs
@@ -0,0 +1,114 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AdvancedOptionsStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AdvancedOptionsStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.OptionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Status of the advanced options for the specified domain. The following
+-- options are available:
+--
+-- -   @\"rest.action.multi.allow_explicit_index\": \"true\" | \"false\"@ -
+--     Note the use of a string rather than a boolean. Specifies whether
+--     explicit references to indexes are allowed inside the body of HTTP
+--     requests. If you want to configure access policies for domain
+--     sub-resources, such as specific indexes and domain APIs, you must
+--     disable this property. Default is true.
+--
+-- -   @\"indices.fielddata.cache.size\": \"80\" @ - Note the use of a
+--     string rather than a boolean. Specifies the percentage of heap space
+--     allocated to field data. Default is unbounded.
+--
+-- -   @\"indices.query.bool.max_clause_count\": \"1024\"@ - Note the use
+--     of a string rather than a boolean. Specifies the maximum number of
+--     clauses allowed in a Lucene boolean query. Default is 1,024. Queries
+--     with more than the permitted number of clauses result in a
+--     @TooManyClauses@ error.
+--
+-- -   @\"override_main_response_version\": \"true\" | \"false\"@ - Note
+--     the use of a string rather than a boolean. Specifies whether the
+--     domain reports its version as 7.10 to allow Elasticsearch OSS
+--     clients and plugins to continue working with it. Default is false
+--     when creating a domain and true when upgrading a domain.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomain-configure-advanced-options Advanced cluster parameters>.
+--
+-- /See:/ 'newAdvancedOptionsStatus' smart constructor.
+data AdvancedOptionsStatus = AdvancedOptionsStatus'
+  { -- | The status of advanced options for the specified domain.
+    options :: Prelude.HashMap Prelude.Text Prelude.Text,
+    -- | The status of advanced options for the specified domain.
+    status :: OptionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AdvancedOptionsStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'options', 'advancedOptionsStatus_options' - The status of advanced options for the specified domain.
+--
+-- 'status', 'advancedOptionsStatus_status' - The status of advanced options for the specified domain.
+newAdvancedOptionsStatus ::
+  -- | 'status'
+  OptionStatus ->
+  AdvancedOptionsStatus
+newAdvancedOptionsStatus pStatus_ =
+  AdvancedOptionsStatus'
+    { options = Prelude.mempty,
+      status = pStatus_
+    }
+
+-- | The status of advanced options for the specified domain.
+advancedOptionsStatus_options :: Lens.Lens' AdvancedOptionsStatus (Prelude.HashMap Prelude.Text Prelude.Text)
+advancedOptionsStatus_options = Lens.lens (\AdvancedOptionsStatus' {options} -> options) (\s@AdvancedOptionsStatus' {} a -> s {options = a} :: AdvancedOptionsStatus) Prelude.. Lens.coerced
+
+-- | The status of advanced options for the specified domain.
+advancedOptionsStatus_status :: Lens.Lens' AdvancedOptionsStatus OptionStatus
+advancedOptionsStatus_status = Lens.lens (\AdvancedOptionsStatus' {status} -> status) (\s@AdvancedOptionsStatus' {} a -> s {status = a} :: AdvancedOptionsStatus)
+
+instance Data.FromJSON AdvancedOptionsStatus where
+  parseJSON =
+    Data.withObject
+      "AdvancedOptionsStatus"
+      ( \x ->
+          AdvancedOptionsStatus'
+            Prelude.<$> (x Data..:? "Options" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "Status")
+      )
+
+instance Prelude.Hashable AdvancedOptionsStatus where
+  hashWithSalt _salt AdvancedOptionsStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` options
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData AdvancedOptionsStatus where
+  rnf AdvancedOptionsStatus' {..} =
+    Prelude.rnf options
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/OpenSearch/Types/AdvancedSecurityOptions.hs b/gen/Amazonka/OpenSearch/Types/AdvancedSecurityOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AdvancedSecurityOptions.hs
@@ -0,0 +1,137 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AdvancedSecurityOptions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AdvancedSecurityOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.SAMLOptionsOutput
+import qualified Amazonka.Prelude as Prelude
+
+-- | Container for fine-grained access control settings.
+--
+-- /See:/ 'newAdvancedSecurityOptions' smart constructor.
+data AdvancedSecurityOptions = AdvancedSecurityOptions'
+  { -- | Date and time when the migration period will be disabled. Only necessary
+    -- when
+    -- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html#fgac-enabling-existing enabling fine-grained access control on an existing domain>.
+    anonymousAuthDisableDate :: Prelude.Maybe Data.POSIX,
+    -- | True if a 30-day migration period is enabled, during which
+    -- administrators can create role mappings. Only necessary when
+    -- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html#fgac-enabling-existing enabling fine-grained access control on an existing domain>.
+    anonymousAuthEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | True if fine-grained access control is enabled.
+    enabled :: Prelude.Maybe Prelude.Bool,
+    -- | True if the internal user database is enabled.
+    internalUserDatabaseEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | Container for information about the SAML configuration for OpenSearch
+    -- Dashboards.
+    sAMLOptions :: Prelude.Maybe SAMLOptionsOutput
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AdvancedSecurityOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'anonymousAuthDisableDate', 'advancedSecurityOptions_anonymousAuthDisableDate' - Date and time when the migration period will be disabled. Only necessary
+-- when
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html#fgac-enabling-existing enabling fine-grained access control on an existing domain>.
+--
+-- 'anonymousAuthEnabled', 'advancedSecurityOptions_anonymousAuthEnabled' - True if a 30-day migration period is enabled, during which
+-- administrators can create role mappings. Only necessary when
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html#fgac-enabling-existing enabling fine-grained access control on an existing domain>.
+--
+-- 'enabled', 'advancedSecurityOptions_enabled' - True if fine-grained access control is enabled.
+--
+-- 'internalUserDatabaseEnabled', 'advancedSecurityOptions_internalUserDatabaseEnabled' - True if the internal user database is enabled.
+--
+-- 'sAMLOptions', 'advancedSecurityOptions_sAMLOptions' - Container for information about the SAML configuration for OpenSearch
+-- Dashboards.
+newAdvancedSecurityOptions ::
+  AdvancedSecurityOptions
+newAdvancedSecurityOptions =
+  AdvancedSecurityOptions'
+    { anonymousAuthDisableDate =
+        Prelude.Nothing,
+      anonymousAuthEnabled = Prelude.Nothing,
+      enabled = Prelude.Nothing,
+      internalUserDatabaseEnabled = Prelude.Nothing,
+      sAMLOptions = Prelude.Nothing
+    }
+
+-- | Date and time when the migration period will be disabled. Only necessary
+-- when
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html#fgac-enabling-existing enabling fine-grained access control on an existing domain>.
+advancedSecurityOptions_anonymousAuthDisableDate :: Lens.Lens' AdvancedSecurityOptions (Prelude.Maybe Prelude.UTCTime)
+advancedSecurityOptions_anonymousAuthDisableDate = Lens.lens (\AdvancedSecurityOptions' {anonymousAuthDisableDate} -> anonymousAuthDisableDate) (\s@AdvancedSecurityOptions' {} a -> s {anonymousAuthDisableDate = a} :: AdvancedSecurityOptions) Prelude.. Lens.mapping Data._Time
+
+-- | True if a 30-day migration period is enabled, during which
+-- administrators can create role mappings. Only necessary when
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html#fgac-enabling-existing enabling fine-grained access control on an existing domain>.
+advancedSecurityOptions_anonymousAuthEnabled :: Lens.Lens' AdvancedSecurityOptions (Prelude.Maybe Prelude.Bool)
+advancedSecurityOptions_anonymousAuthEnabled = Lens.lens (\AdvancedSecurityOptions' {anonymousAuthEnabled} -> anonymousAuthEnabled) (\s@AdvancedSecurityOptions' {} a -> s {anonymousAuthEnabled = a} :: AdvancedSecurityOptions)
+
+-- | True if fine-grained access control is enabled.
+advancedSecurityOptions_enabled :: Lens.Lens' AdvancedSecurityOptions (Prelude.Maybe Prelude.Bool)
+advancedSecurityOptions_enabled = Lens.lens (\AdvancedSecurityOptions' {enabled} -> enabled) (\s@AdvancedSecurityOptions' {} a -> s {enabled = a} :: AdvancedSecurityOptions)
+
+-- | True if the internal user database is enabled.
+advancedSecurityOptions_internalUserDatabaseEnabled :: Lens.Lens' AdvancedSecurityOptions (Prelude.Maybe Prelude.Bool)
+advancedSecurityOptions_internalUserDatabaseEnabled = Lens.lens (\AdvancedSecurityOptions' {internalUserDatabaseEnabled} -> internalUserDatabaseEnabled) (\s@AdvancedSecurityOptions' {} a -> s {internalUserDatabaseEnabled = a} :: AdvancedSecurityOptions)
+
+-- | Container for information about the SAML configuration for OpenSearch
+-- Dashboards.
+advancedSecurityOptions_sAMLOptions :: Lens.Lens' AdvancedSecurityOptions (Prelude.Maybe SAMLOptionsOutput)
+advancedSecurityOptions_sAMLOptions = Lens.lens (\AdvancedSecurityOptions' {sAMLOptions} -> sAMLOptions) (\s@AdvancedSecurityOptions' {} a -> s {sAMLOptions = a} :: AdvancedSecurityOptions)
+
+instance Data.FromJSON AdvancedSecurityOptions where
+  parseJSON =
+    Data.withObject
+      "AdvancedSecurityOptions"
+      ( \x ->
+          AdvancedSecurityOptions'
+            Prelude.<$> (x Data..:? "AnonymousAuthDisableDate")
+            Prelude.<*> (x Data..:? "AnonymousAuthEnabled")
+            Prelude.<*> (x Data..:? "Enabled")
+            Prelude.<*> (x Data..:? "InternalUserDatabaseEnabled")
+            Prelude.<*> (x Data..:? "SAMLOptions")
+      )
+
+instance Prelude.Hashable AdvancedSecurityOptions where
+  hashWithSalt _salt AdvancedSecurityOptions' {..} =
+    _salt
+      `Prelude.hashWithSalt` anonymousAuthDisableDate
+      `Prelude.hashWithSalt` anonymousAuthEnabled
+      `Prelude.hashWithSalt` enabled
+      `Prelude.hashWithSalt` internalUserDatabaseEnabled
+      `Prelude.hashWithSalt` sAMLOptions
+
+instance Prelude.NFData AdvancedSecurityOptions where
+  rnf AdvancedSecurityOptions' {..} =
+    Prelude.rnf anonymousAuthDisableDate
+      `Prelude.seq` Prelude.rnf anonymousAuthEnabled
+      `Prelude.seq` Prelude.rnf enabled
+      `Prelude.seq` Prelude.rnf internalUserDatabaseEnabled
+      `Prelude.seq` Prelude.rnf sAMLOptions
diff --git a/gen/Amazonka/OpenSearch/Types/AdvancedSecurityOptionsInput.hs b/gen/Amazonka/OpenSearch/Types/AdvancedSecurityOptionsInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AdvancedSecurityOptionsInput.hs
@@ -0,0 +1,139 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AdvancedSecurityOptionsInput
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AdvancedSecurityOptionsInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.MasterUserOptions
+import Amazonka.OpenSearch.Types.SAMLOptionsInput
+import qualified Amazonka.Prelude as Prelude
+
+-- | Options for enabling and configuring fine-grained access control. For
+-- more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html Fine-grained access control in Amazon OpenSearch Service>.
+--
+-- /See:/ 'newAdvancedSecurityOptionsInput' smart constructor.
+data AdvancedSecurityOptionsInput = AdvancedSecurityOptionsInput'
+  { -- | True to enable a 30-day migration period during which administrators can
+    -- create role mappings. Only necessary when
+    -- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html#fgac-enabling-existing enabling fine-grained access control on an existing domain>.
+    anonymousAuthEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | True to enable fine-grained access control.
+    enabled :: Prelude.Maybe Prelude.Bool,
+    -- | True to enable the internal user database.
+    internalUserDatabaseEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | Container for information about the master user.
+    masterUserOptions :: Prelude.Maybe MasterUserOptions,
+    -- | Container for information about the SAML configuration for OpenSearch
+    -- Dashboards.
+    sAMLOptions :: Prelude.Maybe SAMLOptionsInput
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AdvancedSecurityOptionsInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'anonymousAuthEnabled', 'advancedSecurityOptionsInput_anonymousAuthEnabled' - True to enable a 30-day migration period during which administrators can
+-- create role mappings. Only necessary when
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html#fgac-enabling-existing enabling fine-grained access control on an existing domain>.
+--
+-- 'enabled', 'advancedSecurityOptionsInput_enabled' - True to enable fine-grained access control.
+--
+-- 'internalUserDatabaseEnabled', 'advancedSecurityOptionsInput_internalUserDatabaseEnabled' - True to enable the internal user database.
+--
+-- 'masterUserOptions', 'advancedSecurityOptionsInput_masterUserOptions' - Container for information about the master user.
+--
+-- 'sAMLOptions', 'advancedSecurityOptionsInput_sAMLOptions' - Container for information about the SAML configuration for OpenSearch
+-- Dashboards.
+newAdvancedSecurityOptionsInput ::
+  AdvancedSecurityOptionsInput
+newAdvancedSecurityOptionsInput =
+  AdvancedSecurityOptionsInput'
+    { anonymousAuthEnabled =
+        Prelude.Nothing,
+      enabled = Prelude.Nothing,
+      internalUserDatabaseEnabled = Prelude.Nothing,
+      masterUserOptions = Prelude.Nothing,
+      sAMLOptions = Prelude.Nothing
+    }
+
+-- | True to enable a 30-day migration period during which administrators can
+-- create role mappings. Only necessary when
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html#fgac-enabling-existing enabling fine-grained access control on an existing domain>.
+advancedSecurityOptionsInput_anonymousAuthEnabled :: Lens.Lens' AdvancedSecurityOptionsInput (Prelude.Maybe Prelude.Bool)
+advancedSecurityOptionsInput_anonymousAuthEnabled = Lens.lens (\AdvancedSecurityOptionsInput' {anonymousAuthEnabled} -> anonymousAuthEnabled) (\s@AdvancedSecurityOptionsInput' {} a -> s {anonymousAuthEnabled = a} :: AdvancedSecurityOptionsInput)
+
+-- | True to enable fine-grained access control.
+advancedSecurityOptionsInput_enabled :: Lens.Lens' AdvancedSecurityOptionsInput (Prelude.Maybe Prelude.Bool)
+advancedSecurityOptionsInput_enabled = Lens.lens (\AdvancedSecurityOptionsInput' {enabled} -> enabled) (\s@AdvancedSecurityOptionsInput' {} a -> s {enabled = a} :: AdvancedSecurityOptionsInput)
+
+-- | True to enable the internal user database.
+advancedSecurityOptionsInput_internalUserDatabaseEnabled :: Lens.Lens' AdvancedSecurityOptionsInput (Prelude.Maybe Prelude.Bool)
+advancedSecurityOptionsInput_internalUserDatabaseEnabled = Lens.lens (\AdvancedSecurityOptionsInput' {internalUserDatabaseEnabled} -> internalUserDatabaseEnabled) (\s@AdvancedSecurityOptionsInput' {} a -> s {internalUserDatabaseEnabled = a} :: AdvancedSecurityOptionsInput)
+
+-- | Container for information about the master user.
+advancedSecurityOptionsInput_masterUserOptions :: Lens.Lens' AdvancedSecurityOptionsInput (Prelude.Maybe MasterUserOptions)
+advancedSecurityOptionsInput_masterUserOptions = Lens.lens (\AdvancedSecurityOptionsInput' {masterUserOptions} -> masterUserOptions) (\s@AdvancedSecurityOptionsInput' {} a -> s {masterUserOptions = a} :: AdvancedSecurityOptionsInput)
+
+-- | Container for information about the SAML configuration for OpenSearch
+-- Dashboards.
+advancedSecurityOptionsInput_sAMLOptions :: Lens.Lens' AdvancedSecurityOptionsInput (Prelude.Maybe SAMLOptionsInput)
+advancedSecurityOptionsInput_sAMLOptions = Lens.lens (\AdvancedSecurityOptionsInput' {sAMLOptions} -> sAMLOptions) (\s@AdvancedSecurityOptionsInput' {} a -> s {sAMLOptions = a} :: AdvancedSecurityOptionsInput)
+
+instance
+  Prelude.Hashable
+    AdvancedSecurityOptionsInput
+  where
+  hashWithSalt _salt AdvancedSecurityOptionsInput' {..} =
+    _salt
+      `Prelude.hashWithSalt` anonymousAuthEnabled
+      `Prelude.hashWithSalt` enabled
+      `Prelude.hashWithSalt` internalUserDatabaseEnabled
+      `Prelude.hashWithSalt` masterUserOptions
+      `Prelude.hashWithSalt` sAMLOptions
+
+instance Prelude.NFData AdvancedSecurityOptionsInput where
+  rnf AdvancedSecurityOptionsInput' {..} =
+    Prelude.rnf anonymousAuthEnabled
+      `Prelude.seq` Prelude.rnf enabled
+      `Prelude.seq` Prelude.rnf internalUserDatabaseEnabled
+      `Prelude.seq` Prelude.rnf masterUserOptions
+      `Prelude.seq` Prelude.rnf sAMLOptions
+
+instance Data.ToJSON AdvancedSecurityOptionsInput where
+  toJSON AdvancedSecurityOptionsInput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AnonymousAuthEnabled" Data..=)
+              Prelude.<$> anonymousAuthEnabled,
+            ("Enabled" Data..=) Prelude.<$> enabled,
+            ("InternalUserDatabaseEnabled" Data..=)
+              Prelude.<$> internalUserDatabaseEnabled,
+            ("MasterUserOptions" Data..=)
+              Prelude.<$> masterUserOptions,
+            ("SAMLOptions" Data..=) Prelude.<$> sAMLOptions
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/AdvancedSecurityOptionsStatus.hs b/gen/Amazonka/OpenSearch/Types/AdvancedSecurityOptionsStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AdvancedSecurityOptionsStatus.hs
@@ -0,0 +1,93 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AdvancedSecurityOptionsStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AdvancedSecurityOptionsStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.AdvancedSecurityOptions
+import Amazonka.OpenSearch.Types.OptionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The status of fine-grained access control settings for a domain.
+--
+-- /See:/ 'newAdvancedSecurityOptionsStatus' smart constructor.
+data AdvancedSecurityOptionsStatus = AdvancedSecurityOptionsStatus'
+  { -- | Container for fine-grained access control settings.
+    options :: AdvancedSecurityOptions,
+    -- | Status of the fine-grained access control settings for a domain.
+    status :: OptionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AdvancedSecurityOptionsStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'options', 'advancedSecurityOptionsStatus_options' - Container for fine-grained access control settings.
+--
+-- 'status', 'advancedSecurityOptionsStatus_status' - Status of the fine-grained access control settings for a domain.
+newAdvancedSecurityOptionsStatus ::
+  -- | 'options'
+  AdvancedSecurityOptions ->
+  -- | 'status'
+  OptionStatus ->
+  AdvancedSecurityOptionsStatus
+newAdvancedSecurityOptionsStatus pOptions_ pStatus_ =
+  AdvancedSecurityOptionsStatus'
+    { options = pOptions_,
+      status = pStatus_
+    }
+
+-- | Container for fine-grained access control settings.
+advancedSecurityOptionsStatus_options :: Lens.Lens' AdvancedSecurityOptionsStatus AdvancedSecurityOptions
+advancedSecurityOptionsStatus_options = Lens.lens (\AdvancedSecurityOptionsStatus' {options} -> options) (\s@AdvancedSecurityOptionsStatus' {} a -> s {options = a} :: AdvancedSecurityOptionsStatus)
+
+-- | Status of the fine-grained access control settings for a domain.
+advancedSecurityOptionsStatus_status :: Lens.Lens' AdvancedSecurityOptionsStatus OptionStatus
+advancedSecurityOptionsStatus_status = Lens.lens (\AdvancedSecurityOptionsStatus' {status} -> status) (\s@AdvancedSecurityOptionsStatus' {} a -> s {status = a} :: AdvancedSecurityOptionsStatus)
+
+instance Data.FromJSON AdvancedSecurityOptionsStatus where
+  parseJSON =
+    Data.withObject
+      "AdvancedSecurityOptionsStatus"
+      ( \x ->
+          AdvancedSecurityOptionsStatus'
+            Prelude.<$> (x Data..: "Options")
+            Prelude.<*> (x Data..: "Status")
+      )
+
+instance
+  Prelude.Hashable
+    AdvancedSecurityOptionsStatus
+  where
+  hashWithSalt _salt AdvancedSecurityOptionsStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` options
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData AdvancedSecurityOptionsStatus where
+  rnf AdvancedSecurityOptionsStatus' {..} =
+    Prelude.rnf options
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/OpenSearch/Types/AuthorizedPrincipal.hs b/gen/Amazonka/OpenSearch/Types/AuthorizedPrincipal.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AuthorizedPrincipal.hs
@@ -0,0 +1,93 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AuthorizedPrincipal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AuthorizedPrincipal where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.PrincipalType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about an Amazon Web Services account or service that has
+-- access to an Amazon OpenSearch Service domain through the use of an
+-- interface VPC endpoint.
+--
+-- /See:/ 'newAuthorizedPrincipal' smart constructor.
+data AuthorizedPrincipal = AuthorizedPrincipal'
+  { -- | The
+    -- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html IAM principal>
+    -- that is allowed access to the domain.
+    principal :: Prelude.Maybe Prelude.Text,
+    -- | The type of principal.
+    principalType :: Prelude.Maybe PrincipalType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AuthorizedPrincipal' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'principal', 'authorizedPrincipal_principal' - The
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html IAM principal>
+-- that is allowed access to the domain.
+--
+-- 'principalType', 'authorizedPrincipal_principalType' - The type of principal.
+newAuthorizedPrincipal ::
+  AuthorizedPrincipal
+newAuthorizedPrincipal =
+  AuthorizedPrincipal'
+    { principal = Prelude.Nothing,
+      principalType = Prelude.Nothing
+    }
+
+-- | The
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html IAM principal>
+-- that is allowed access to the domain.
+authorizedPrincipal_principal :: Lens.Lens' AuthorizedPrincipal (Prelude.Maybe Prelude.Text)
+authorizedPrincipal_principal = Lens.lens (\AuthorizedPrincipal' {principal} -> principal) (\s@AuthorizedPrincipal' {} a -> s {principal = a} :: AuthorizedPrincipal)
+
+-- | The type of principal.
+authorizedPrincipal_principalType :: Lens.Lens' AuthorizedPrincipal (Prelude.Maybe PrincipalType)
+authorizedPrincipal_principalType = Lens.lens (\AuthorizedPrincipal' {principalType} -> principalType) (\s@AuthorizedPrincipal' {} a -> s {principalType = a} :: AuthorizedPrincipal)
+
+instance Data.FromJSON AuthorizedPrincipal where
+  parseJSON =
+    Data.withObject
+      "AuthorizedPrincipal"
+      ( \x ->
+          AuthorizedPrincipal'
+            Prelude.<$> (x Data..:? "Principal")
+            Prelude.<*> (x Data..:? "PrincipalType")
+      )
+
+instance Prelude.Hashable AuthorizedPrincipal where
+  hashWithSalt _salt AuthorizedPrincipal' {..} =
+    _salt
+      `Prelude.hashWithSalt` principal
+      `Prelude.hashWithSalt` principalType
+
+instance Prelude.NFData AuthorizedPrincipal where
+  rnf AuthorizedPrincipal' {..} =
+    Prelude.rnf principal
+      `Prelude.seq` Prelude.rnf principalType
diff --git a/gen/Amazonka/OpenSearch/Types/AutoTune.hs b/gen/Amazonka/OpenSearch/Types/AutoTune.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AutoTune.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AutoTune
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AutoTune where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.AutoTuneDetails
+import Amazonka.OpenSearch.Types.AutoTuneType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about an Auto-Tune action. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/auto-tune.html Auto-Tune for Amazon OpenSearch Service>.
+--
+-- /See:/ 'newAutoTune' smart constructor.
+data AutoTune = AutoTune'
+  { -- | Details about an Auto-Tune action.
+    autoTuneDetails :: Prelude.Maybe AutoTuneDetails,
+    -- | The type of Auto-Tune action.
+    autoTuneType :: Prelude.Maybe AutoTuneType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AutoTune' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'autoTuneDetails', 'autoTune_autoTuneDetails' - Details about an Auto-Tune action.
+--
+-- 'autoTuneType', 'autoTune_autoTuneType' - The type of Auto-Tune action.
+newAutoTune ::
+  AutoTune
+newAutoTune =
+  AutoTune'
+    { autoTuneDetails = Prelude.Nothing,
+      autoTuneType = Prelude.Nothing
+    }
+
+-- | Details about an Auto-Tune action.
+autoTune_autoTuneDetails :: Lens.Lens' AutoTune (Prelude.Maybe AutoTuneDetails)
+autoTune_autoTuneDetails = Lens.lens (\AutoTune' {autoTuneDetails} -> autoTuneDetails) (\s@AutoTune' {} a -> s {autoTuneDetails = a} :: AutoTune)
+
+-- | The type of Auto-Tune action.
+autoTune_autoTuneType :: Lens.Lens' AutoTune (Prelude.Maybe AutoTuneType)
+autoTune_autoTuneType = Lens.lens (\AutoTune' {autoTuneType} -> autoTuneType) (\s@AutoTune' {} a -> s {autoTuneType = a} :: AutoTune)
+
+instance Data.FromJSON AutoTune where
+  parseJSON =
+    Data.withObject
+      "AutoTune"
+      ( \x ->
+          AutoTune'
+            Prelude.<$> (x Data..:? "AutoTuneDetails")
+            Prelude.<*> (x Data..:? "AutoTuneType")
+      )
+
+instance Prelude.Hashable AutoTune where
+  hashWithSalt _salt AutoTune' {..} =
+    _salt
+      `Prelude.hashWithSalt` autoTuneDetails
+      `Prelude.hashWithSalt` autoTuneType
+
+instance Prelude.NFData AutoTune where
+  rnf AutoTune' {..} =
+    Prelude.rnf autoTuneDetails
+      `Prelude.seq` Prelude.rnf autoTuneType
diff --git a/gen/Amazonka/OpenSearch/Types/AutoTuneDesiredState.hs b/gen/Amazonka/OpenSearch/Types/AutoTuneDesiredState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AutoTuneDesiredState.hs
@@ -0,0 +1,72 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AutoTuneDesiredState
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AutoTuneDesiredState
+  ( AutoTuneDesiredState
+      ( ..,
+        AutoTuneDesiredState_DISABLED,
+        AutoTuneDesiredState_ENABLED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The Auto-Tune desired state. Valid values are ENABLED and DISABLED.
+newtype AutoTuneDesiredState = AutoTuneDesiredState'
+  { fromAutoTuneDesiredState ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern AutoTuneDesiredState_DISABLED :: AutoTuneDesiredState
+pattern AutoTuneDesiredState_DISABLED = AutoTuneDesiredState' "DISABLED"
+
+pattern AutoTuneDesiredState_ENABLED :: AutoTuneDesiredState
+pattern AutoTuneDesiredState_ENABLED = AutoTuneDesiredState' "ENABLED"
+
+{-# COMPLETE
+  AutoTuneDesiredState_DISABLED,
+  AutoTuneDesiredState_ENABLED,
+  AutoTuneDesiredState'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/AutoTuneDetails.hs b/gen/Amazonka/OpenSearch/Types/AutoTuneDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AutoTuneDetails.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AutoTuneDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AutoTuneDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.ScheduledAutoTuneDetails
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies details about a scheduled Auto-Tune action. For more
+-- information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/auto-tune.html Auto-Tune for Amazon OpenSearch Service>.
+--
+-- /See:/ 'newAutoTuneDetails' smart constructor.
+data AutoTuneDetails = AutoTuneDetails'
+  { -- | Container for details about a scheduled Auto-Tune action.
+    scheduledAutoTuneDetails :: Prelude.Maybe ScheduledAutoTuneDetails
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AutoTuneDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'scheduledAutoTuneDetails', 'autoTuneDetails_scheduledAutoTuneDetails' - Container for details about a scheduled Auto-Tune action.
+newAutoTuneDetails ::
+  AutoTuneDetails
+newAutoTuneDetails =
+  AutoTuneDetails'
+    { scheduledAutoTuneDetails =
+        Prelude.Nothing
+    }
+
+-- | Container for details about a scheduled Auto-Tune action.
+autoTuneDetails_scheduledAutoTuneDetails :: Lens.Lens' AutoTuneDetails (Prelude.Maybe ScheduledAutoTuneDetails)
+autoTuneDetails_scheduledAutoTuneDetails = Lens.lens (\AutoTuneDetails' {scheduledAutoTuneDetails} -> scheduledAutoTuneDetails) (\s@AutoTuneDetails' {} a -> s {scheduledAutoTuneDetails = a} :: AutoTuneDetails)
+
+instance Data.FromJSON AutoTuneDetails where
+  parseJSON =
+    Data.withObject
+      "AutoTuneDetails"
+      ( \x ->
+          AutoTuneDetails'
+            Prelude.<$> (x Data..:? "ScheduledAutoTuneDetails")
+      )
+
+instance Prelude.Hashable AutoTuneDetails where
+  hashWithSalt _salt AutoTuneDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` scheduledAutoTuneDetails
+
+instance Prelude.NFData AutoTuneDetails where
+  rnf AutoTuneDetails' {..} =
+    Prelude.rnf scheduledAutoTuneDetails
diff --git a/gen/Amazonka/OpenSearch/Types/AutoTuneMaintenanceSchedule.hs b/gen/Amazonka/OpenSearch/Types/AutoTuneMaintenanceSchedule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AutoTuneMaintenanceSchedule.hs
@@ -0,0 +1,116 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AutoTuneMaintenanceSchedule
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AutoTuneMaintenanceSchedule where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.Duration
+import qualified Amazonka.Prelude as Prelude
+
+-- | The Auto-Tune maintenance schedule. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/auto-tune.html Auto-Tune for Amazon OpenSearch Service>.
+--
+-- /See:/ 'newAutoTuneMaintenanceSchedule' smart constructor.
+data AutoTuneMaintenanceSchedule = AutoTuneMaintenanceSchedule'
+  { -- | A cron expression for a recurring maintenance schedule during which
+    -- Auto-Tune can deploy changes.
+    cronExpressionForRecurrence :: Prelude.Maybe Prelude.Text,
+    -- | The duration of the maintenance schedule. For example,
+    -- @\"Duration\": {\"Value\": 2, \"Unit\": \"HOURS\"}@.
+    duration :: Prelude.Maybe Duration,
+    -- | The Epoch timestamp at which the Auto-Tune maintenance schedule starts.
+    startAt :: Prelude.Maybe Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AutoTuneMaintenanceSchedule' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cronExpressionForRecurrence', 'autoTuneMaintenanceSchedule_cronExpressionForRecurrence' - A cron expression for a recurring maintenance schedule during which
+-- Auto-Tune can deploy changes.
+--
+-- 'duration', 'autoTuneMaintenanceSchedule_duration' - The duration of the maintenance schedule. For example,
+-- @\"Duration\": {\"Value\": 2, \"Unit\": \"HOURS\"}@.
+--
+-- 'startAt', 'autoTuneMaintenanceSchedule_startAt' - The Epoch timestamp at which the Auto-Tune maintenance schedule starts.
+newAutoTuneMaintenanceSchedule ::
+  AutoTuneMaintenanceSchedule
+newAutoTuneMaintenanceSchedule =
+  AutoTuneMaintenanceSchedule'
+    { cronExpressionForRecurrence =
+        Prelude.Nothing,
+      duration = Prelude.Nothing,
+      startAt = Prelude.Nothing
+    }
+
+-- | A cron expression for a recurring maintenance schedule during which
+-- Auto-Tune can deploy changes.
+autoTuneMaintenanceSchedule_cronExpressionForRecurrence :: Lens.Lens' AutoTuneMaintenanceSchedule (Prelude.Maybe Prelude.Text)
+autoTuneMaintenanceSchedule_cronExpressionForRecurrence = Lens.lens (\AutoTuneMaintenanceSchedule' {cronExpressionForRecurrence} -> cronExpressionForRecurrence) (\s@AutoTuneMaintenanceSchedule' {} a -> s {cronExpressionForRecurrence = a} :: AutoTuneMaintenanceSchedule)
+
+-- | The duration of the maintenance schedule. For example,
+-- @\"Duration\": {\"Value\": 2, \"Unit\": \"HOURS\"}@.
+autoTuneMaintenanceSchedule_duration :: Lens.Lens' AutoTuneMaintenanceSchedule (Prelude.Maybe Duration)
+autoTuneMaintenanceSchedule_duration = Lens.lens (\AutoTuneMaintenanceSchedule' {duration} -> duration) (\s@AutoTuneMaintenanceSchedule' {} a -> s {duration = a} :: AutoTuneMaintenanceSchedule)
+
+-- | The Epoch timestamp at which the Auto-Tune maintenance schedule starts.
+autoTuneMaintenanceSchedule_startAt :: Lens.Lens' AutoTuneMaintenanceSchedule (Prelude.Maybe Prelude.UTCTime)
+autoTuneMaintenanceSchedule_startAt = Lens.lens (\AutoTuneMaintenanceSchedule' {startAt} -> startAt) (\s@AutoTuneMaintenanceSchedule' {} a -> s {startAt = a} :: AutoTuneMaintenanceSchedule) Prelude.. Lens.mapping Data._Time
+
+instance Data.FromJSON AutoTuneMaintenanceSchedule where
+  parseJSON =
+    Data.withObject
+      "AutoTuneMaintenanceSchedule"
+      ( \x ->
+          AutoTuneMaintenanceSchedule'
+            Prelude.<$> (x Data..:? "CronExpressionForRecurrence")
+            Prelude.<*> (x Data..:? "Duration")
+            Prelude.<*> (x Data..:? "StartAt")
+      )
+
+instance Prelude.Hashable AutoTuneMaintenanceSchedule where
+  hashWithSalt _salt AutoTuneMaintenanceSchedule' {..} =
+    _salt
+      `Prelude.hashWithSalt` cronExpressionForRecurrence
+      `Prelude.hashWithSalt` duration
+      `Prelude.hashWithSalt` startAt
+
+instance Prelude.NFData AutoTuneMaintenanceSchedule where
+  rnf AutoTuneMaintenanceSchedule' {..} =
+    Prelude.rnf cronExpressionForRecurrence
+      `Prelude.seq` Prelude.rnf duration
+      `Prelude.seq` Prelude.rnf startAt
+
+instance Data.ToJSON AutoTuneMaintenanceSchedule where
+  toJSON AutoTuneMaintenanceSchedule' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CronExpressionForRecurrence" Data..=)
+              Prelude.<$> cronExpressionForRecurrence,
+            ("Duration" Data..=) Prelude.<$> duration,
+            ("StartAt" Data..=) Prelude.<$> startAt
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/AutoTuneOptions.hs b/gen/Amazonka/OpenSearch/Types/AutoTuneOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AutoTuneOptions.hs
@@ -0,0 +1,130 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AutoTuneOptions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AutoTuneOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.AutoTuneDesiredState
+import Amazonka.OpenSearch.Types.AutoTuneMaintenanceSchedule
+import Amazonka.OpenSearch.Types.RollbackOnDisable
+import qualified Amazonka.Prelude as Prelude
+
+-- | Auto-Tune settings when updating a domain. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/auto-tune.html Auto-Tune for Amazon OpenSearch Service>.
+--
+-- /See:/ 'newAutoTuneOptions' smart constructor.
+data AutoTuneOptions = AutoTuneOptions'
+  { -- | Whether Auto-Tune is enabled or disabled.
+    desiredState :: Prelude.Maybe AutoTuneDesiredState,
+    -- | A list of maintenance schedules during which Auto-Tune can deploy
+    -- changes.
+    maintenanceSchedules :: Prelude.Maybe [AutoTuneMaintenanceSchedule],
+    -- | When disabling Auto-Tune, specify @NO_ROLLBACK@ to retain all prior
+    -- Auto-Tune settings or @DEFAULT_ROLLBACK@ to revert to the OpenSearch
+    -- Service defaults. If you specify @DEFAULT_ROLLBACK@, you must include a
+    -- @MaintenanceSchedule@ in the request. Otherwise, OpenSearch Service is
+    -- unable to perform the rollback.
+    rollbackOnDisable :: Prelude.Maybe RollbackOnDisable
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AutoTuneOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'desiredState', 'autoTuneOptions_desiredState' - Whether Auto-Tune is enabled or disabled.
+--
+-- 'maintenanceSchedules', 'autoTuneOptions_maintenanceSchedules' - A list of maintenance schedules during which Auto-Tune can deploy
+-- changes.
+--
+-- 'rollbackOnDisable', 'autoTuneOptions_rollbackOnDisable' - When disabling Auto-Tune, specify @NO_ROLLBACK@ to retain all prior
+-- Auto-Tune settings or @DEFAULT_ROLLBACK@ to revert to the OpenSearch
+-- Service defaults. If you specify @DEFAULT_ROLLBACK@, you must include a
+-- @MaintenanceSchedule@ in the request. Otherwise, OpenSearch Service is
+-- unable to perform the rollback.
+newAutoTuneOptions ::
+  AutoTuneOptions
+newAutoTuneOptions =
+  AutoTuneOptions'
+    { desiredState = Prelude.Nothing,
+      maintenanceSchedules = Prelude.Nothing,
+      rollbackOnDisable = Prelude.Nothing
+    }
+
+-- | Whether Auto-Tune is enabled or disabled.
+autoTuneOptions_desiredState :: Lens.Lens' AutoTuneOptions (Prelude.Maybe AutoTuneDesiredState)
+autoTuneOptions_desiredState = Lens.lens (\AutoTuneOptions' {desiredState} -> desiredState) (\s@AutoTuneOptions' {} a -> s {desiredState = a} :: AutoTuneOptions)
+
+-- | A list of maintenance schedules during which Auto-Tune can deploy
+-- changes.
+autoTuneOptions_maintenanceSchedules :: Lens.Lens' AutoTuneOptions (Prelude.Maybe [AutoTuneMaintenanceSchedule])
+autoTuneOptions_maintenanceSchedules = Lens.lens (\AutoTuneOptions' {maintenanceSchedules} -> maintenanceSchedules) (\s@AutoTuneOptions' {} a -> s {maintenanceSchedules = a} :: AutoTuneOptions) Prelude.. Lens.mapping Lens.coerced
+
+-- | When disabling Auto-Tune, specify @NO_ROLLBACK@ to retain all prior
+-- Auto-Tune settings or @DEFAULT_ROLLBACK@ to revert to the OpenSearch
+-- Service defaults. If you specify @DEFAULT_ROLLBACK@, you must include a
+-- @MaintenanceSchedule@ in the request. Otherwise, OpenSearch Service is
+-- unable to perform the rollback.
+autoTuneOptions_rollbackOnDisable :: Lens.Lens' AutoTuneOptions (Prelude.Maybe RollbackOnDisable)
+autoTuneOptions_rollbackOnDisable = Lens.lens (\AutoTuneOptions' {rollbackOnDisable} -> rollbackOnDisable) (\s@AutoTuneOptions' {} a -> s {rollbackOnDisable = a} :: AutoTuneOptions)
+
+instance Data.FromJSON AutoTuneOptions where
+  parseJSON =
+    Data.withObject
+      "AutoTuneOptions"
+      ( \x ->
+          AutoTuneOptions'
+            Prelude.<$> (x Data..:? "DesiredState")
+            Prelude.<*> ( x
+                            Data..:? "MaintenanceSchedules"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "RollbackOnDisable")
+      )
+
+instance Prelude.Hashable AutoTuneOptions where
+  hashWithSalt _salt AutoTuneOptions' {..} =
+    _salt
+      `Prelude.hashWithSalt` desiredState
+      `Prelude.hashWithSalt` maintenanceSchedules
+      `Prelude.hashWithSalt` rollbackOnDisable
+
+instance Prelude.NFData AutoTuneOptions where
+  rnf AutoTuneOptions' {..} =
+    Prelude.rnf desiredState
+      `Prelude.seq` Prelude.rnf maintenanceSchedules
+      `Prelude.seq` Prelude.rnf rollbackOnDisable
+
+instance Data.ToJSON AutoTuneOptions where
+  toJSON AutoTuneOptions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DesiredState" Data..=) Prelude.<$> desiredState,
+            ("MaintenanceSchedules" Data..=)
+              Prelude.<$> maintenanceSchedules,
+            ("RollbackOnDisable" Data..=)
+              Prelude.<$> rollbackOnDisable
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/AutoTuneOptionsInput.hs b/gen/Amazonka/OpenSearch/Types/AutoTuneOptionsInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AutoTuneOptionsInput.hs
@@ -0,0 +1,103 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AutoTuneOptionsInput
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AutoTuneOptionsInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.AutoTuneDesiredState
+import Amazonka.OpenSearch.Types.AutoTuneMaintenanceSchedule
+import qualified Amazonka.Prelude as Prelude
+
+-- | Options for configuring Auto-Tune. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/auto-tune.html Auto-Tune for Amazon OpenSearch Service>.
+--
+-- /See:/ 'newAutoTuneOptionsInput' smart constructor.
+data AutoTuneOptionsInput = AutoTuneOptionsInput'
+  { -- | Whether Auto-Tune is enabled or disabled.
+    desiredState :: Prelude.Maybe AutoTuneDesiredState,
+    -- | A list of maintenance schedules during which Auto-Tune can deploy
+    -- changes. Maintenance schedules are overwrite, not append. If your
+    -- request includes no schedules, the request deletes all existing
+    -- schedules. To preserve existing schedules, make a call to
+    -- @DescribeDomainConfig@ first and use the @MaintenanceSchedules@ portion
+    -- of the response as the basis for this section.
+    maintenanceSchedules :: Prelude.Maybe [AutoTuneMaintenanceSchedule]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AutoTuneOptionsInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'desiredState', 'autoTuneOptionsInput_desiredState' - Whether Auto-Tune is enabled or disabled.
+--
+-- 'maintenanceSchedules', 'autoTuneOptionsInput_maintenanceSchedules' - A list of maintenance schedules during which Auto-Tune can deploy
+-- changes. Maintenance schedules are overwrite, not append. If your
+-- request includes no schedules, the request deletes all existing
+-- schedules. To preserve existing schedules, make a call to
+-- @DescribeDomainConfig@ first and use the @MaintenanceSchedules@ portion
+-- of the response as the basis for this section.
+newAutoTuneOptionsInput ::
+  AutoTuneOptionsInput
+newAutoTuneOptionsInput =
+  AutoTuneOptionsInput'
+    { desiredState =
+        Prelude.Nothing,
+      maintenanceSchedules = Prelude.Nothing
+    }
+
+-- | Whether Auto-Tune is enabled or disabled.
+autoTuneOptionsInput_desiredState :: Lens.Lens' AutoTuneOptionsInput (Prelude.Maybe AutoTuneDesiredState)
+autoTuneOptionsInput_desiredState = Lens.lens (\AutoTuneOptionsInput' {desiredState} -> desiredState) (\s@AutoTuneOptionsInput' {} a -> s {desiredState = a} :: AutoTuneOptionsInput)
+
+-- | A list of maintenance schedules during which Auto-Tune can deploy
+-- changes. Maintenance schedules are overwrite, not append. If your
+-- request includes no schedules, the request deletes all existing
+-- schedules. To preserve existing schedules, make a call to
+-- @DescribeDomainConfig@ first and use the @MaintenanceSchedules@ portion
+-- of the response as the basis for this section.
+autoTuneOptionsInput_maintenanceSchedules :: Lens.Lens' AutoTuneOptionsInput (Prelude.Maybe [AutoTuneMaintenanceSchedule])
+autoTuneOptionsInput_maintenanceSchedules = Lens.lens (\AutoTuneOptionsInput' {maintenanceSchedules} -> maintenanceSchedules) (\s@AutoTuneOptionsInput' {} a -> s {maintenanceSchedules = a} :: AutoTuneOptionsInput) Prelude.. Lens.mapping Lens.coerced
+
+instance Prelude.Hashable AutoTuneOptionsInput where
+  hashWithSalt _salt AutoTuneOptionsInput' {..} =
+    _salt
+      `Prelude.hashWithSalt` desiredState
+      `Prelude.hashWithSalt` maintenanceSchedules
+
+instance Prelude.NFData AutoTuneOptionsInput where
+  rnf AutoTuneOptionsInput' {..} =
+    Prelude.rnf desiredState
+      `Prelude.seq` Prelude.rnf maintenanceSchedules
+
+instance Data.ToJSON AutoTuneOptionsInput where
+  toJSON AutoTuneOptionsInput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DesiredState" Data..=) Prelude.<$> desiredState,
+            ("MaintenanceSchedules" Data..=)
+              Prelude.<$> maintenanceSchedules
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/AutoTuneOptionsOutput.hs b/gen/Amazonka/OpenSearch/Types/AutoTuneOptionsOutput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AutoTuneOptionsOutput.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AutoTuneOptionsOutput
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AutoTuneOptionsOutput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.AutoTuneState
+import qualified Amazonka.Prelude as Prelude
+
+-- | The Auto-Tune settings for a domain, displayed when enabling or
+-- disabling Auto-Tune.
+--
+-- /See:/ 'newAutoTuneOptionsOutput' smart constructor.
+data AutoTuneOptionsOutput = AutoTuneOptionsOutput'
+  { -- | Any errors that occurred while enabling or disabling Auto-Tune.
+    errorMessage :: Prelude.Maybe Prelude.Text,
+    -- | The current state of Auto-Tune on the domain.
+    state :: Prelude.Maybe AutoTuneState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AutoTuneOptionsOutput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorMessage', 'autoTuneOptionsOutput_errorMessage' - Any errors that occurred while enabling or disabling Auto-Tune.
+--
+-- 'state', 'autoTuneOptionsOutput_state' - The current state of Auto-Tune on the domain.
+newAutoTuneOptionsOutput ::
+  AutoTuneOptionsOutput
+newAutoTuneOptionsOutput =
+  AutoTuneOptionsOutput'
+    { errorMessage =
+        Prelude.Nothing,
+      state = Prelude.Nothing
+    }
+
+-- | Any errors that occurred while enabling or disabling Auto-Tune.
+autoTuneOptionsOutput_errorMessage :: Lens.Lens' AutoTuneOptionsOutput (Prelude.Maybe Prelude.Text)
+autoTuneOptionsOutput_errorMessage = Lens.lens (\AutoTuneOptionsOutput' {errorMessage} -> errorMessage) (\s@AutoTuneOptionsOutput' {} a -> s {errorMessage = a} :: AutoTuneOptionsOutput)
+
+-- | The current state of Auto-Tune on the domain.
+autoTuneOptionsOutput_state :: Lens.Lens' AutoTuneOptionsOutput (Prelude.Maybe AutoTuneState)
+autoTuneOptionsOutput_state = Lens.lens (\AutoTuneOptionsOutput' {state} -> state) (\s@AutoTuneOptionsOutput' {} a -> s {state = a} :: AutoTuneOptionsOutput)
+
+instance Data.FromJSON AutoTuneOptionsOutput where
+  parseJSON =
+    Data.withObject
+      "AutoTuneOptionsOutput"
+      ( \x ->
+          AutoTuneOptionsOutput'
+            Prelude.<$> (x Data..:? "ErrorMessage")
+            Prelude.<*> (x Data..:? "State")
+      )
+
+instance Prelude.Hashable AutoTuneOptionsOutput where
+  hashWithSalt _salt AutoTuneOptionsOutput' {..} =
+    _salt
+      `Prelude.hashWithSalt` errorMessage
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData AutoTuneOptionsOutput where
+  rnf AutoTuneOptionsOutput' {..} =
+    Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/OpenSearch/Types/AutoTuneOptionsStatus.hs b/gen/Amazonka/OpenSearch/Types/AutoTuneOptionsStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AutoTuneOptionsStatus.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AutoTuneOptionsStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AutoTuneOptionsStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.AutoTuneOptions
+import Amazonka.OpenSearch.Types.AutoTuneStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The Auto-Tune status for the domain.
+--
+-- /See:/ 'newAutoTuneOptionsStatus' smart constructor.
+data AutoTuneOptionsStatus = AutoTuneOptionsStatus'
+  { -- | Auto-Tune settings for updating a domain.
+    options :: Prelude.Maybe AutoTuneOptions,
+    -- | The current status of Auto-Tune for a domain.
+    status :: Prelude.Maybe AutoTuneStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AutoTuneOptionsStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'options', 'autoTuneOptionsStatus_options' - Auto-Tune settings for updating a domain.
+--
+-- 'status', 'autoTuneOptionsStatus_status' - The current status of Auto-Tune for a domain.
+newAutoTuneOptionsStatus ::
+  AutoTuneOptionsStatus
+newAutoTuneOptionsStatus =
+  AutoTuneOptionsStatus'
+    { options = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | Auto-Tune settings for updating a domain.
+autoTuneOptionsStatus_options :: Lens.Lens' AutoTuneOptionsStatus (Prelude.Maybe AutoTuneOptions)
+autoTuneOptionsStatus_options = Lens.lens (\AutoTuneOptionsStatus' {options} -> options) (\s@AutoTuneOptionsStatus' {} a -> s {options = a} :: AutoTuneOptionsStatus)
+
+-- | The current status of Auto-Tune for a domain.
+autoTuneOptionsStatus_status :: Lens.Lens' AutoTuneOptionsStatus (Prelude.Maybe AutoTuneStatus)
+autoTuneOptionsStatus_status = Lens.lens (\AutoTuneOptionsStatus' {status} -> status) (\s@AutoTuneOptionsStatus' {} a -> s {status = a} :: AutoTuneOptionsStatus)
+
+instance Data.FromJSON AutoTuneOptionsStatus where
+  parseJSON =
+    Data.withObject
+      "AutoTuneOptionsStatus"
+      ( \x ->
+          AutoTuneOptionsStatus'
+            Prelude.<$> (x Data..:? "Options")
+            Prelude.<*> (x Data..:? "Status")
+      )
+
+instance Prelude.Hashable AutoTuneOptionsStatus where
+  hashWithSalt _salt AutoTuneOptionsStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` options
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData AutoTuneOptionsStatus where
+  rnf AutoTuneOptionsStatus' {..} =
+    Prelude.rnf options
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/OpenSearch/Types/AutoTuneState.hs b/gen/Amazonka/OpenSearch/Types/AutoTuneState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AutoTuneState.hs
@@ -0,0 +1,108 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AutoTuneState
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AutoTuneState
+  ( AutoTuneState
+      ( ..,
+        AutoTuneState_DISABLED,
+        AutoTuneState_DISABLED_AND_ROLLBACK_COMPLETE,
+        AutoTuneState_DISABLED_AND_ROLLBACK_ERROR,
+        AutoTuneState_DISABLED_AND_ROLLBACK_IN_PROGRESS,
+        AutoTuneState_DISABLED_AND_ROLLBACK_SCHEDULED,
+        AutoTuneState_DISABLE_IN_PROGRESS,
+        AutoTuneState_ENABLED,
+        AutoTuneState_ENABLE_IN_PROGRESS,
+        AutoTuneState_ERROR
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The Auto-Tune state for the domain. For valid states see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/auto-tune.html Auto-Tune for Amazon OpenSearch Service>.
+newtype AutoTuneState = AutoTuneState'
+  { fromAutoTuneState ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern AutoTuneState_DISABLED :: AutoTuneState
+pattern AutoTuneState_DISABLED = AutoTuneState' "DISABLED"
+
+pattern AutoTuneState_DISABLED_AND_ROLLBACK_COMPLETE :: AutoTuneState
+pattern AutoTuneState_DISABLED_AND_ROLLBACK_COMPLETE = AutoTuneState' "DISABLED_AND_ROLLBACK_COMPLETE"
+
+pattern AutoTuneState_DISABLED_AND_ROLLBACK_ERROR :: AutoTuneState
+pattern AutoTuneState_DISABLED_AND_ROLLBACK_ERROR = AutoTuneState' "DISABLED_AND_ROLLBACK_ERROR"
+
+pattern AutoTuneState_DISABLED_AND_ROLLBACK_IN_PROGRESS :: AutoTuneState
+pattern AutoTuneState_DISABLED_AND_ROLLBACK_IN_PROGRESS = AutoTuneState' "DISABLED_AND_ROLLBACK_IN_PROGRESS"
+
+pattern AutoTuneState_DISABLED_AND_ROLLBACK_SCHEDULED :: AutoTuneState
+pattern AutoTuneState_DISABLED_AND_ROLLBACK_SCHEDULED = AutoTuneState' "DISABLED_AND_ROLLBACK_SCHEDULED"
+
+pattern AutoTuneState_DISABLE_IN_PROGRESS :: AutoTuneState
+pattern AutoTuneState_DISABLE_IN_PROGRESS = AutoTuneState' "DISABLE_IN_PROGRESS"
+
+pattern AutoTuneState_ENABLED :: AutoTuneState
+pattern AutoTuneState_ENABLED = AutoTuneState' "ENABLED"
+
+pattern AutoTuneState_ENABLE_IN_PROGRESS :: AutoTuneState
+pattern AutoTuneState_ENABLE_IN_PROGRESS = AutoTuneState' "ENABLE_IN_PROGRESS"
+
+pattern AutoTuneState_ERROR :: AutoTuneState
+pattern AutoTuneState_ERROR = AutoTuneState' "ERROR"
+
+{-# COMPLETE
+  AutoTuneState_DISABLED,
+  AutoTuneState_DISABLED_AND_ROLLBACK_COMPLETE,
+  AutoTuneState_DISABLED_AND_ROLLBACK_ERROR,
+  AutoTuneState_DISABLED_AND_ROLLBACK_IN_PROGRESS,
+  AutoTuneState_DISABLED_AND_ROLLBACK_SCHEDULED,
+  AutoTuneState_DISABLE_IN_PROGRESS,
+  AutoTuneState_ENABLED,
+  AutoTuneState_ENABLE_IN_PROGRESS,
+  AutoTuneState_ERROR,
+  AutoTuneState'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/AutoTuneStatus.hs b/gen/Amazonka/OpenSearch/Types/AutoTuneStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AutoTuneStatus.hs
@@ -0,0 +1,144 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AutoTuneStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AutoTuneStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.AutoTuneState
+import qualified Amazonka.Prelude as Prelude
+
+-- | The current status of Auto-Tune for the domain. For more information,
+-- see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/auto-tune.html Auto-Tune for Amazon OpenSearch Service>.
+--
+-- /See:/ 'newAutoTuneStatus' smart constructor.
+data AutoTuneStatus = AutoTuneStatus'
+  { -- | Any errors that occurred while enabling or disabling Auto-Tune.
+    errorMessage :: Prelude.Maybe Prelude.Text,
+    -- | Indicates whether the domain is being deleted.
+    pendingDeletion :: Prelude.Maybe Prelude.Bool,
+    -- | The latest version of the Auto-Tune options.
+    updateVersion :: Prelude.Maybe Prelude.Natural,
+    -- | Date and time when Auto-Tune was enabled for the domain.
+    creationDate :: Data.POSIX,
+    -- | Date and time when the Auto-Tune options were last updated for the
+    -- domain.
+    updateDate :: Data.POSIX,
+    -- | The current state of Auto-Tune on the domain.
+    state :: AutoTuneState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AutoTuneStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorMessage', 'autoTuneStatus_errorMessage' - Any errors that occurred while enabling or disabling Auto-Tune.
+--
+-- 'pendingDeletion', 'autoTuneStatus_pendingDeletion' - Indicates whether the domain is being deleted.
+--
+-- 'updateVersion', 'autoTuneStatus_updateVersion' - The latest version of the Auto-Tune options.
+--
+-- 'creationDate', 'autoTuneStatus_creationDate' - Date and time when Auto-Tune was enabled for the domain.
+--
+-- 'updateDate', 'autoTuneStatus_updateDate' - Date and time when the Auto-Tune options were last updated for the
+-- domain.
+--
+-- 'state', 'autoTuneStatus_state' - The current state of Auto-Tune on the domain.
+newAutoTuneStatus ::
+  -- | 'creationDate'
+  Prelude.UTCTime ->
+  -- | 'updateDate'
+  Prelude.UTCTime ->
+  -- | 'state'
+  AutoTuneState ->
+  AutoTuneStatus
+newAutoTuneStatus pCreationDate_ pUpdateDate_ pState_ =
+  AutoTuneStatus'
+    { errorMessage = Prelude.Nothing,
+      pendingDeletion = Prelude.Nothing,
+      updateVersion = Prelude.Nothing,
+      creationDate = Data._Time Lens.# pCreationDate_,
+      updateDate = Data._Time Lens.# pUpdateDate_,
+      state = pState_
+    }
+
+-- | Any errors that occurred while enabling or disabling Auto-Tune.
+autoTuneStatus_errorMessage :: Lens.Lens' AutoTuneStatus (Prelude.Maybe Prelude.Text)
+autoTuneStatus_errorMessage = Lens.lens (\AutoTuneStatus' {errorMessage} -> errorMessage) (\s@AutoTuneStatus' {} a -> s {errorMessage = a} :: AutoTuneStatus)
+
+-- | Indicates whether the domain is being deleted.
+autoTuneStatus_pendingDeletion :: Lens.Lens' AutoTuneStatus (Prelude.Maybe Prelude.Bool)
+autoTuneStatus_pendingDeletion = Lens.lens (\AutoTuneStatus' {pendingDeletion} -> pendingDeletion) (\s@AutoTuneStatus' {} a -> s {pendingDeletion = a} :: AutoTuneStatus)
+
+-- | The latest version of the Auto-Tune options.
+autoTuneStatus_updateVersion :: Lens.Lens' AutoTuneStatus (Prelude.Maybe Prelude.Natural)
+autoTuneStatus_updateVersion = Lens.lens (\AutoTuneStatus' {updateVersion} -> updateVersion) (\s@AutoTuneStatus' {} a -> s {updateVersion = a} :: AutoTuneStatus)
+
+-- | Date and time when Auto-Tune was enabled for the domain.
+autoTuneStatus_creationDate :: Lens.Lens' AutoTuneStatus Prelude.UTCTime
+autoTuneStatus_creationDate = Lens.lens (\AutoTuneStatus' {creationDate} -> creationDate) (\s@AutoTuneStatus' {} a -> s {creationDate = a} :: AutoTuneStatus) Prelude.. Data._Time
+
+-- | Date and time when the Auto-Tune options were last updated for the
+-- domain.
+autoTuneStatus_updateDate :: Lens.Lens' AutoTuneStatus Prelude.UTCTime
+autoTuneStatus_updateDate = Lens.lens (\AutoTuneStatus' {updateDate} -> updateDate) (\s@AutoTuneStatus' {} a -> s {updateDate = a} :: AutoTuneStatus) Prelude.. Data._Time
+
+-- | The current state of Auto-Tune on the domain.
+autoTuneStatus_state :: Lens.Lens' AutoTuneStatus AutoTuneState
+autoTuneStatus_state = Lens.lens (\AutoTuneStatus' {state} -> state) (\s@AutoTuneStatus' {} a -> s {state = a} :: AutoTuneStatus)
+
+instance Data.FromJSON AutoTuneStatus where
+  parseJSON =
+    Data.withObject
+      "AutoTuneStatus"
+      ( \x ->
+          AutoTuneStatus'
+            Prelude.<$> (x Data..:? "ErrorMessage")
+            Prelude.<*> (x Data..:? "PendingDeletion")
+            Prelude.<*> (x Data..:? "UpdateVersion")
+            Prelude.<*> (x Data..: "CreationDate")
+            Prelude.<*> (x Data..: "UpdateDate")
+            Prelude.<*> (x Data..: "State")
+      )
+
+instance Prelude.Hashable AutoTuneStatus where
+  hashWithSalt _salt AutoTuneStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` errorMessage
+      `Prelude.hashWithSalt` pendingDeletion
+      `Prelude.hashWithSalt` updateVersion
+      `Prelude.hashWithSalt` creationDate
+      `Prelude.hashWithSalt` updateDate
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData AutoTuneStatus where
+  rnf AutoTuneStatus' {..} =
+    Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf pendingDeletion
+      `Prelude.seq` Prelude.rnf updateVersion
+      `Prelude.seq` Prelude.rnf creationDate
+      `Prelude.seq` Prelude.rnf updateDate
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/OpenSearch/Types/AutoTuneType.hs b/gen/Amazonka/OpenSearch/Types/AutoTuneType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/AutoTuneType.hs
@@ -0,0 +1,67 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.AutoTuneType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.AutoTuneType
+  ( AutoTuneType
+      ( ..,
+        AutoTuneType_SCHEDULED_ACTION
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies the Auto-Tune type. Valid value is SCHEDULED_ACTION.
+newtype AutoTuneType = AutoTuneType'
+  { fromAutoTuneType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern AutoTuneType_SCHEDULED_ACTION :: AutoTuneType
+pattern AutoTuneType_SCHEDULED_ACTION = AutoTuneType' "SCHEDULED_ACTION"
+
+{-# COMPLETE
+  AutoTuneType_SCHEDULED_ACTION,
+  AutoTuneType'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/ChangeProgressDetails.hs b/gen/Amazonka/OpenSearch/Types/ChangeProgressDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/ChangeProgressDetails.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.ChangeProgressDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.ChangeProgressDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Container for information about a configuration change happening on a
+-- domain.
+--
+-- /See:/ 'newChangeProgressDetails' smart constructor.
+data ChangeProgressDetails = ChangeProgressDetails'
+  { -- | The ID of the configuration change.
+    changeId :: Prelude.Maybe Prelude.Text,
+    -- | A message corresponding to the status of the configuration change.
+    message :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ChangeProgressDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'changeId', 'changeProgressDetails_changeId' - The ID of the configuration change.
+--
+-- 'message', 'changeProgressDetails_message' - A message corresponding to the status of the configuration change.
+newChangeProgressDetails ::
+  ChangeProgressDetails
+newChangeProgressDetails =
+  ChangeProgressDetails'
+    { changeId = Prelude.Nothing,
+      message = Prelude.Nothing
+    }
+
+-- | The ID of the configuration change.
+changeProgressDetails_changeId :: Lens.Lens' ChangeProgressDetails (Prelude.Maybe Prelude.Text)
+changeProgressDetails_changeId = Lens.lens (\ChangeProgressDetails' {changeId} -> changeId) (\s@ChangeProgressDetails' {} a -> s {changeId = a} :: ChangeProgressDetails)
+
+-- | A message corresponding to the status of the configuration change.
+changeProgressDetails_message :: Lens.Lens' ChangeProgressDetails (Prelude.Maybe Prelude.Text)
+changeProgressDetails_message = Lens.lens (\ChangeProgressDetails' {message} -> message) (\s@ChangeProgressDetails' {} a -> s {message = a} :: ChangeProgressDetails)
+
+instance Data.FromJSON ChangeProgressDetails where
+  parseJSON =
+    Data.withObject
+      "ChangeProgressDetails"
+      ( \x ->
+          ChangeProgressDetails'
+            Prelude.<$> (x Data..:? "ChangeId")
+            Prelude.<*> (x Data..:? "Message")
+      )
+
+instance Prelude.Hashable ChangeProgressDetails where
+  hashWithSalt _salt ChangeProgressDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` changeId
+      `Prelude.hashWithSalt` message
+
+instance Prelude.NFData ChangeProgressDetails where
+  rnf ChangeProgressDetails' {..} =
+    Prelude.rnf changeId
+      `Prelude.seq` Prelude.rnf message
diff --git a/gen/Amazonka/OpenSearch/Types/ChangeProgressStage.hs b/gen/Amazonka/OpenSearch/Types/ChangeProgressStage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/ChangeProgressStage.hs
@@ -0,0 +1,108 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.ChangeProgressStage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.ChangeProgressStage where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Progress details for each stage of a domain update.
+--
+-- /See:/ 'newChangeProgressStage' smart constructor.
+data ChangeProgressStage = ChangeProgressStage'
+  { -- | The description of the stage.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The most recent updated timestamp of the stage.
+    lastUpdated :: Prelude.Maybe Data.POSIX,
+    -- | The name of the stage.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The status of the stage.
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ChangeProgressStage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'changeProgressStage_description' - The description of the stage.
+--
+-- 'lastUpdated', 'changeProgressStage_lastUpdated' - The most recent updated timestamp of the stage.
+--
+-- 'name', 'changeProgressStage_name' - The name of the stage.
+--
+-- 'status', 'changeProgressStage_status' - The status of the stage.
+newChangeProgressStage ::
+  ChangeProgressStage
+newChangeProgressStage =
+  ChangeProgressStage'
+    { description = Prelude.Nothing,
+      lastUpdated = Prelude.Nothing,
+      name = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The description of the stage.
+changeProgressStage_description :: Lens.Lens' ChangeProgressStage (Prelude.Maybe Prelude.Text)
+changeProgressStage_description = Lens.lens (\ChangeProgressStage' {description} -> description) (\s@ChangeProgressStage' {} a -> s {description = a} :: ChangeProgressStage)
+
+-- | The most recent updated timestamp of the stage.
+changeProgressStage_lastUpdated :: Lens.Lens' ChangeProgressStage (Prelude.Maybe Prelude.UTCTime)
+changeProgressStage_lastUpdated = Lens.lens (\ChangeProgressStage' {lastUpdated} -> lastUpdated) (\s@ChangeProgressStage' {} a -> s {lastUpdated = a} :: ChangeProgressStage) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the stage.
+changeProgressStage_name :: Lens.Lens' ChangeProgressStage (Prelude.Maybe Prelude.Text)
+changeProgressStage_name = Lens.lens (\ChangeProgressStage' {name} -> name) (\s@ChangeProgressStage' {} a -> s {name = a} :: ChangeProgressStage)
+
+-- | The status of the stage.
+changeProgressStage_status :: Lens.Lens' ChangeProgressStage (Prelude.Maybe Prelude.Text)
+changeProgressStage_status = Lens.lens (\ChangeProgressStage' {status} -> status) (\s@ChangeProgressStage' {} a -> s {status = a} :: ChangeProgressStage)
+
+instance Data.FromJSON ChangeProgressStage where
+  parseJSON =
+    Data.withObject
+      "ChangeProgressStage"
+      ( \x ->
+          ChangeProgressStage'
+            Prelude.<$> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "LastUpdated")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "Status")
+      )
+
+instance Prelude.Hashable ChangeProgressStage where
+  hashWithSalt _salt ChangeProgressStage' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` lastUpdated
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData ChangeProgressStage where
+  rnf ChangeProgressStage' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf lastUpdated
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/OpenSearch/Types/ChangeProgressStatusDetails.hs b/gen/Amazonka/OpenSearch/Types/ChangeProgressStatusDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/ChangeProgressStatusDetails.hs
@@ -0,0 +1,168 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.ChangeProgressStatusDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.ChangeProgressStatusDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.ChangeProgressStage
+import Amazonka.OpenSearch.Types.OverallChangeStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The progress details of a specific domain configuration change.
+--
+-- /See:/ 'newChangeProgressStatusDetails' smart constructor.
+data ChangeProgressStatusDetails = ChangeProgressStatusDetails'
+  { -- | The unique change identifier associated with a specific domain
+    -- configuration change.
+    changeId :: Prelude.Maybe Prelude.Text,
+    -- | The specific stages that the domain is going through to perform the
+    -- configuration change.
+    changeProgressStages :: Prelude.Maybe [ChangeProgressStage],
+    -- | The list of properties in the domain configuration change that have
+    -- completed.
+    completedProperties :: Prelude.Maybe [Prelude.Text],
+    -- | The list of properties in the domain configuration change that are still
+    -- pending.
+    pendingProperties :: Prelude.Maybe [Prelude.Text],
+    -- | The time at which the configuration change is made on the domain.
+    startTime :: Prelude.Maybe Data.POSIX,
+    -- | The overall status of the domain configuration change.
+    status :: Prelude.Maybe OverallChangeStatus,
+    -- | The total number of stages required for the configuration change.
+    totalNumberOfStages :: Prelude.Maybe Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ChangeProgressStatusDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'changeId', 'changeProgressStatusDetails_changeId' - The unique change identifier associated with a specific domain
+-- configuration change.
+--
+-- 'changeProgressStages', 'changeProgressStatusDetails_changeProgressStages' - The specific stages that the domain is going through to perform the
+-- configuration change.
+--
+-- 'completedProperties', 'changeProgressStatusDetails_completedProperties' - The list of properties in the domain configuration change that have
+-- completed.
+--
+-- 'pendingProperties', 'changeProgressStatusDetails_pendingProperties' - The list of properties in the domain configuration change that are still
+-- pending.
+--
+-- 'startTime', 'changeProgressStatusDetails_startTime' - The time at which the configuration change is made on the domain.
+--
+-- 'status', 'changeProgressStatusDetails_status' - The overall status of the domain configuration change.
+--
+-- 'totalNumberOfStages', 'changeProgressStatusDetails_totalNumberOfStages' - The total number of stages required for the configuration change.
+newChangeProgressStatusDetails ::
+  ChangeProgressStatusDetails
+newChangeProgressStatusDetails =
+  ChangeProgressStatusDetails'
+    { changeId =
+        Prelude.Nothing,
+      changeProgressStages = Prelude.Nothing,
+      completedProperties = Prelude.Nothing,
+      pendingProperties = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      status = Prelude.Nothing,
+      totalNumberOfStages = Prelude.Nothing
+    }
+
+-- | The unique change identifier associated with a specific domain
+-- configuration change.
+changeProgressStatusDetails_changeId :: Lens.Lens' ChangeProgressStatusDetails (Prelude.Maybe Prelude.Text)
+changeProgressStatusDetails_changeId = Lens.lens (\ChangeProgressStatusDetails' {changeId} -> changeId) (\s@ChangeProgressStatusDetails' {} a -> s {changeId = a} :: ChangeProgressStatusDetails)
+
+-- | The specific stages that the domain is going through to perform the
+-- configuration change.
+changeProgressStatusDetails_changeProgressStages :: Lens.Lens' ChangeProgressStatusDetails (Prelude.Maybe [ChangeProgressStage])
+changeProgressStatusDetails_changeProgressStages = Lens.lens (\ChangeProgressStatusDetails' {changeProgressStages} -> changeProgressStages) (\s@ChangeProgressStatusDetails' {} a -> s {changeProgressStages = a} :: ChangeProgressStatusDetails) Prelude.. Lens.mapping Lens.coerced
+
+-- | The list of properties in the domain configuration change that have
+-- completed.
+changeProgressStatusDetails_completedProperties :: Lens.Lens' ChangeProgressStatusDetails (Prelude.Maybe [Prelude.Text])
+changeProgressStatusDetails_completedProperties = Lens.lens (\ChangeProgressStatusDetails' {completedProperties} -> completedProperties) (\s@ChangeProgressStatusDetails' {} a -> s {completedProperties = a} :: ChangeProgressStatusDetails) Prelude.. Lens.mapping Lens.coerced
+
+-- | The list of properties in the domain configuration change that are still
+-- pending.
+changeProgressStatusDetails_pendingProperties :: Lens.Lens' ChangeProgressStatusDetails (Prelude.Maybe [Prelude.Text])
+changeProgressStatusDetails_pendingProperties = Lens.lens (\ChangeProgressStatusDetails' {pendingProperties} -> pendingProperties) (\s@ChangeProgressStatusDetails' {} a -> s {pendingProperties = a} :: ChangeProgressStatusDetails) Prelude.. Lens.mapping Lens.coerced
+
+-- | The time at which the configuration change is made on the domain.
+changeProgressStatusDetails_startTime :: Lens.Lens' ChangeProgressStatusDetails (Prelude.Maybe Prelude.UTCTime)
+changeProgressStatusDetails_startTime = Lens.lens (\ChangeProgressStatusDetails' {startTime} -> startTime) (\s@ChangeProgressStatusDetails' {} a -> s {startTime = a} :: ChangeProgressStatusDetails) Prelude.. Lens.mapping Data._Time
+
+-- | The overall status of the domain configuration change.
+changeProgressStatusDetails_status :: Lens.Lens' ChangeProgressStatusDetails (Prelude.Maybe OverallChangeStatus)
+changeProgressStatusDetails_status = Lens.lens (\ChangeProgressStatusDetails' {status} -> status) (\s@ChangeProgressStatusDetails' {} a -> s {status = a} :: ChangeProgressStatusDetails)
+
+-- | The total number of stages required for the configuration change.
+changeProgressStatusDetails_totalNumberOfStages :: Lens.Lens' ChangeProgressStatusDetails (Prelude.Maybe Prelude.Int)
+changeProgressStatusDetails_totalNumberOfStages = Lens.lens (\ChangeProgressStatusDetails' {totalNumberOfStages} -> totalNumberOfStages) (\s@ChangeProgressStatusDetails' {} a -> s {totalNumberOfStages = a} :: ChangeProgressStatusDetails)
+
+instance Data.FromJSON ChangeProgressStatusDetails where
+  parseJSON =
+    Data.withObject
+      "ChangeProgressStatusDetails"
+      ( \x ->
+          ChangeProgressStatusDetails'
+            Prelude.<$> (x Data..:? "ChangeId")
+            Prelude.<*> ( x
+                            Data..:? "ChangeProgressStages"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..:? "CompletedProperties"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..:? "PendingProperties"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "StartTime")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "TotalNumberOfStages")
+      )
+
+instance Prelude.Hashable ChangeProgressStatusDetails where
+  hashWithSalt _salt ChangeProgressStatusDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` changeId
+      `Prelude.hashWithSalt` changeProgressStages
+      `Prelude.hashWithSalt` completedProperties
+      `Prelude.hashWithSalt` pendingProperties
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` totalNumberOfStages
+
+instance Prelude.NFData ChangeProgressStatusDetails where
+  rnf ChangeProgressStatusDetails' {..} =
+    Prelude.rnf changeId
+      `Prelude.seq` Prelude.rnf changeProgressStages
+      `Prelude.seq` Prelude.rnf completedProperties
+      `Prelude.seq` Prelude.rnf pendingProperties
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf totalNumberOfStages
diff --git a/gen/Amazonka/OpenSearch/Types/ClusterConfig.hs b/gen/Amazonka/OpenSearch/Types/ClusterConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/ClusterConfig.hs
@@ -0,0 +1,247 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.ClusterConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.ClusterConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.ColdStorageOptions
+import Amazonka.OpenSearch.Types.OpenSearchPartitionInstanceType
+import Amazonka.OpenSearch.Types.OpenSearchWarmPartitionInstanceType
+import Amazonka.OpenSearch.Types.ZoneAwarenessConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | Container for the cluster configuration of an OpenSearch Service domain.
+-- For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html Creating and managing Amazon OpenSearch Service domains>.
+--
+-- /See:/ 'newClusterConfig' smart constructor.
+data ClusterConfig = ClusterConfig'
+  { -- | Container for cold storage configuration options.
+    coldStorageOptions :: Prelude.Maybe ColdStorageOptions,
+    -- | Number of dedicated master nodes in the cluster. This number must be
+    -- greater than 1, otherwise you receive a validation exception.
+    dedicatedMasterCount :: Prelude.Maybe Prelude.Int,
+    -- | Indicates whether dedicated master nodes are enabled for the
+    -- cluster.@True@ if the cluster will use a dedicated master node.@False@
+    -- if the cluster will not.
+    dedicatedMasterEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | OpenSearch Service instance type of the dedicated master nodes in the
+    -- cluster.
+    dedicatedMasterType :: Prelude.Maybe OpenSearchPartitionInstanceType,
+    -- | Number of dedicated master nodes in the cluster. This number must be
+    -- greater than 1, otherwise you receive a validation exception.
+    instanceCount :: Prelude.Maybe Prelude.Int,
+    -- | Instance type of data nodes in the cluster.
+    instanceType :: Prelude.Maybe OpenSearchPartitionInstanceType,
+    -- | The number of warm nodes in the cluster.
+    warmCount :: Prelude.Maybe Prelude.Int,
+    -- | Whether to enable warm storage for the cluster.
+    warmEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The instance type for the cluster\'s warm nodes.
+    warmType :: Prelude.Maybe OpenSearchWarmPartitionInstanceType,
+    -- | Container for zone awareness configuration options. Only required if
+    -- @ZoneAwarenessEnabled@ is @true@.
+    zoneAwarenessConfig :: Prelude.Maybe ZoneAwarenessConfig,
+    -- | Indicates whether multiple Availability Zones are enabled. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains-multiaz.html Configuring a multi-AZ domain in Amazon OpenSearch Service>.
+    zoneAwarenessEnabled :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ClusterConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'coldStorageOptions', 'clusterConfig_coldStorageOptions' - Container for cold storage configuration options.
+--
+-- 'dedicatedMasterCount', 'clusterConfig_dedicatedMasterCount' - Number of dedicated master nodes in the cluster. This number must be
+-- greater than 1, otherwise you receive a validation exception.
+--
+-- 'dedicatedMasterEnabled', 'clusterConfig_dedicatedMasterEnabled' - Indicates whether dedicated master nodes are enabled for the
+-- cluster.@True@ if the cluster will use a dedicated master node.@False@
+-- if the cluster will not.
+--
+-- 'dedicatedMasterType', 'clusterConfig_dedicatedMasterType' - OpenSearch Service instance type of the dedicated master nodes in the
+-- cluster.
+--
+-- 'instanceCount', 'clusterConfig_instanceCount' - Number of dedicated master nodes in the cluster. This number must be
+-- greater than 1, otherwise you receive a validation exception.
+--
+-- 'instanceType', 'clusterConfig_instanceType' - Instance type of data nodes in the cluster.
+--
+-- 'warmCount', 'clusterConfig_warmCount' - The number of warm nodes in the cluster.
+--
+-- 'warmEnabled', 'clusterConfig_warmEnabled' - Whether to enable warm storage for the cluster.
+--
+-- 'warmType', 'clusterConfig_warmType' - The instance type for the cluster\'s warm nodes.
+--
+-- 'zoneAwarenessConfig', 'clusterConfig_zoneAwarenessConfig' - Container for zone awareness configuration options. Only required if
+-- @ZoneAwarenessEnabled@ is @true@.
+--
+-- 'zoneAwarenessEnabled', 'clusterConfig_zoneAwarenessEnabled' - Indicates whether multiple Availability Zones are enabled. For more
+-- information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains-multiaz.html Configuring a multi-AZ domain in Amazon OpenSearch Service>.
+newClusterConfig ::
+  ClusterConfig
+newClusterConfig =
+  ClusterConfig'
+    { coldStorageOptions =
+        Prelude.Nothing,
+      dedicatedMasterCount = Prelude.Nothing,
+      dedicatedMasterEnabled = Prelude.Nothing,
+      dedicatedMasterType = Prelude.Nothing,
+      instanceCount = Prelude.Nothing,
+      instanceType = Prelude.Nothing,
+      warmCount = Prelude.Nothing,
+      warmEnabled = Prelude.Nothing,
+      warmType = Prelude.Nothing,
+      zoneAwarenessConfig = Prelude.Nothing,
+      zoneAwarenessEnabled = Prelude.Nothing
+    }
+
+-- | Container for cold storage configuration options.
+clusterConfig_coldStorageOptions :: Lens.Lens' ClusterConfig (Prelude.Maybe ColdStorageOptions)
+clusterConfig_coldStorageOptions = Lens.lens (\ClusterConfig' {coldStorageOptions} -> coldStorageOptions) (\s@ClusterConfig' {} a -> s {coldStorageOptions = a} :: ClusterConfig)
+
+-- | Number of dedicated master nodes in the cluster. This number must be
+-- greater than 1, otherwise you receive a validation exception.
+clusterConfig_dedicatedMasterCount :: Lens.Lens' ClusterConfig (Prelude.Maybe Prelude.Int)
+clusterConfig_dedicatedMasterCount = Lens.lens (\ClusterConfig' {dedicatedMasterCount} -> dedicatedMasterCount) (\s@ClusterConfig' {} a -> s {dedicatedMasterCount = a} :: ClusterConfig)
+
+-- | Indicates whether dedicated master nodes are enabled for the
+-- cluster.@True@ if the cluster will use a dedicated master node.@False@
+-- if the cluster will not.
+clusterConfig_dedicatedMasterEnabled :: Lens.Lens' ClusterConfig (Prelude.Maybe Prelude.Bool)
+clusterConfig_dedicatedMasterEnabled = Lens.lens (\ClusterConfig' {dedicatedMasterEnabled} -> dedicatedMasterEnabled) (\s@ClusterConfig' {} a -> s {dedicatedMasterEnabled = a} :: ClusterConfig)
+
+-- | OpenSearch Service instance type of the dedicated master nodes in the
+-- cluster.
+clusterConfig_dedicatedMasterType :: Lens.Lens' ClusterConfig (Prelude.Maybe OpenSearchPartitionInstanceType)
+clusterConfig_dedicatedMasterType = Lens.lens (\ClusterConfig' {dedicatedMasterType} -> dedicatedMasterType) (\s@ClusterConfig' {} a -> s {dedicatedMasterType = a} :: ClusterConfig)
+
+-- | Number of dedicated master nodes in the cluster. This number must be
+-- greater than 1, otherwise you receive a validation exception.
+clusterConfig_instanceCount :: Lens.Lens' ClusterConfig (Prelude.Maybe Prelude.Int)
+clusterConfig_instanceCount = Lens.lens (\ClusterConfig' {instanceCount} -> instanceCount) (\s@ClusterConfig' {} a -> s {instanceCount = a} :: ClusterConfig)
+
+-- | Instance type of data nodes in the cluster.
+clusterConfig_instanceType :: Lens.Lens' ClusterConfig (Prelude.Maybe OpenSearchPartitionInstanceType)
+clusterConfig_instanceType = Lens.lens (\ClusterConfig' {instanceType} -> instanceType) (\s@ClusterConfig' {} a -> s {instanceType = a} :: ClusterConfig)
+
+-- | The number of warm nodes in the cluster.
+clusterConfig_warmCount :: Lens.Lens' ClusterConfig (Prelude.Maybe Prelude.Int)
+clusterConfig_warmCount = Lens.lens (\ClusterConfig' {warmCount} -> warmCount) (\s@ClusterConfig' {} a -> s {warmCount = a} :: ClusterConfig)
+
+-- | Whether to enable warm storage for the cluster.
+clusterConfig_warmEnabled :: Lens.Lens' ClusterConfig (Prelude.Maybe Prelude.Bool)
+clusterConfig_warmEnabled = Lens.lens (\ClusterConfig' {warmEnabled} -> warmEnabled) (\s@ClusterConfig' {} a -> s {warmEnabled = a} :: ClusterConfig)
+
+-- | The instance type for the cluster\'s warm nodes.
+clusterConfig_warmType :: Lens.Lens' ClusterConfig (Prelude.Maybe OpenSearchWarmPartitionInstanceType)
+clusterConfig_warmType = Lens.lens (\ClusterConfig' {warmType} -> warmType) (\s@ClusterConfig' {} a -> s {warmType = a} :: ClusterConfig)
+
+-- | Container for zone awareness configuration options. Only required if
+-- @ZoneAwarenessEnabled@ is @true@.
+clusterConfig_zoneAwarenessConfig :: Lens.Lens' ClusterConfig (Prelude.Maybe ZoneAwarenessConfig)
+clusterConfig_zoneAwarenessConfig = Lens.lens (\ClusterConfig' {zoneAwarenessConfig} -> zoneAwarenessConfig) (\s@ClusterConfig' {} a -> s {zoneAwarenessConfig = a} :: ClusterConfig)
+
+-- | Indicates whether multiple Availability Zones are enabled. For more
+-- information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains-multiaz.html Configuring a multi-AZ domain in Amazon OpenSearch Service>.
+clusterConfig_zoneAwarenessEnabled :: Lens.Lens' ClusterConfig (Prelude.Maybe Prelude.Bool)
+clusterConfig_zoneAwarenessEnabled = Lens.lens (\ClusterConfig' {zoneAwarenessEnabled} -> zoneAwarenessEnabled) (\s@ClusterConfig' {} a -> s {zoneAwarenessEnabled = a} :: ClusterConfig)
+
+instance Data.FromJSON ClusterConfig where
+  parseJSON =
+    Data.withObject
+      "ClusterConfig"
+      ( \x ->
+          ClusterConfig'
+            Prelude.<$> (x Data..:? "ColdStorageOptions")
+            Prelude.<*> (x Data..:? "DedicatedMasterCount")
+            Prelude.<*> (x Data..:? "DedicatedMasterEnabled")
+            Prelude.<*> (x Data..:? "DedicatedMasterType")
+            Prelude.<*> (x Data..:? "InstanceCount")
+            Prelude.<*> (x Data..:? "InstanceType")
+            Prelude.<*> (x Data..:? "WarmCount")
+            Prelude.<*> (x Data..:? "WarmEnabled")
+            Prelude.<*> (x Data..:? "WarmType")
+            Prelude.<*> (x Data..:? "ZoneAwarenessConfig")
+            Prelude.<*> (x Data..:? "ZoneAwarenessEnabled")
+      )
+
+instance Prelude.Hashable ClusterConfig where
+  hashWithSalt _salt ClusterConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` coldStorageOptions
+      `Prelude.hashWithSalt` dedicatedMasterCount
+      `Prelude.hashWithSalt` dedicatedMasterEnabled
+      `Prelude.hashWithSalt` dedicatedMasterType
+      `Prelude.hashWithSalt` instanceCount
+      `Prelude.hashWithSalt` instanceType
+      `Prelude.hashWithSalt` warmCount
+      `Prelude.hashWithSalt` warmEnabled
+      `Prelude.hashWithSalt` warmType
+      `Prelude.hashWithSalt` zoneAwarenessConfig
+      `Prelude.hashWithSalt` zoneAwarenessEnabled
+
+instance Prelude.NFData ClusterConfig where
+  rnf ClusterConfig' {..} =
+    Prelude.rnf coldStorageOptions
+      `Prelude.seq` Prelude.rnf dedicatedMasterCount
+      `Prelude.seq` Prelude.rnf dedicatedMasterEnabled
+      `Prelude.seq` Prelude.rnf dedicatedMasterType
+      `Prelude.seq` Prelude.rnf instanceCount
+      `Prelude.seq` Prelude.rnf instanceType
+      `Prelude.seq` Prelude.rnf warmCount
+      `Prelude.seq` Prelude.rnf warmEnabled
+      `Prelude.seq` Prelude.rnf warmType
+      `Prelude.seq` Prelude.rnf zoneAwarenessConfig
+      `Prelude.seq` Prelude.rnf zoneAwarenessEnabled
+
+instance Data.ToJSON ClusterConfig where
+  toJSON ClusterConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ColdStorageOptions" Data..=)
+              Prelude.<$> coldStorageOptions,
+            ("DedicatedMasterCount" Data..=)
+              Prelude.<$> dedicatedMasterCount,
+            ("DedicatedMasterEnabled" Data..=)
+              Prelude.<$> dedicatedMasterEnabled,
+            ("DedicatedMasterType" Data..=)
+              Prelude.<$> dedicatedMasterType,
+            ("InstanceCount" Data..=) Prelude.<$> instanceCount,
+            ("InstanceType" Data..=) Prelude.<$> instanceType,
+            ("WarmCount" Data..=) Prelude.<$> warmCount,
+            ("WarmEnabled" Data..=) Prelude.<$> warmEnabled,
+            ("WarmType" Data..=) Prelude.<$> warmType,
+            ("ZoneAwarenessConfig" Data..=)
+              Prelude.<$> zoneAwarenessConfig,
+            ("ZoneAwarenessEnabled" Data..=)
+              Prelude.<$> zoneAwarenessEnabled
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/ClusterConfigStatus.hs b/gen/Amazonka/OpenSearch/Types/ClusterConfigStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/ClusterConfigStatus.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.ClusterConfigStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.ClusterConfigStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.ClusterConfig
+import Amazonka.OpenSearch.Types.OptionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The cluster configuration status for a domain.
+--
+-- /See:/ 'newClusterConfigStatus' smart constructor.
+data ClusterConfigStatus = ClusterConfigStatus'
+  { -- | Cluster configuration options for the specified domain.
+    options :: ClusterConfig,
+    -- | The status of cluster configuration options for the specified domain.
+    status :: OptionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ClusterConfigStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'options', 'clusterConfigStatus_options' - Cluster configuration options for the specified domain.
+--
+-- 'status', 'clusterConfigStatus_status' - The status of cluster configuration options for the specified domain.
+newClusterConfigStatus ::
+  -- | 'options'
+  ClusterConfig ->
+  -- | 'status'
+  OptionStatus ->
+  ClusterConfigStatus
+newClusterConfigStatus pOptions_ pStatus_ =
+  ClusterConfigStatus'
+    { options = pOptions_,
+      status = pStatus_
+    }
+
+-- | Cluster configuration options for the specified domain.
+clusterConfigStatus_options :: Lens.Lens' ClusterConfigStatus ClusterConfig
+clusterConfigStatus_options = Lens.lens (\ClusterConfigStatus' {options} -> options) (\s@ClusterConfigStatus' {} a -> s {options = a} :: ClusterConfigStatus)
+
+-- | The status of cluster configuration options for the specified domain.
+clusterConfigStatus_status :: Lens.Lens' ClusterConfigStatus OptionStatus
+clusterConfigStatus_status = Lens.lens (\ClusterConfigStatus' {status} -> status) (\s@ClusterConfigStatus' {} a -> s {status = a} :: ClusterConfigStatus)
+
+instance Data.FromJSON ClusterConfigStatus where
+  parseJSON =
+    Data.withObject
+      "ClusterConfigStatus"
+      ( \x ->
+          ClusterConfigStatus'
+            Prelude.<$> (x Data..: "Options")
+            Prelude.<*> (x Data..: "Status")
+      )
+
+instance Prelude.Hashable ClusterConfigStatus where
+  hashWithSalt _salt ClusterConfigStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` options
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData ClusterConfigStatus where
+  rnf ClusterConfigStatus' {..} =
+    Prelude.rnf options
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/OpenSearch/Types/CognitoOptions.hs b/gen/Amazonka/OpenSearch/Types/CognitoOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/CognitoOptions.hs
@@ -0,0 +1,134 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.CognitoOptions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.CognitoOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Container for the parameters required to enable Cognito authentication
+-- for an OpenSearch Service domain. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/cognito-auth.html Configuring Amazon Cognito authentication for OpenSearch Dashboards>.
+--
+-- /See:/ 'newCognitoOptions' smart constructor.
+data CognitoOptions = CognitoOptions'
+  { -- | Whether to enable or disable Amazon Cognito authentication for
+    -- OpenSearch Dashboards.
+    enabled :: Prelude.Maybe Prelude.Bool,
+    -- | The Amazon Cognito identity pool ID that you want OpenSearch Service to
+    -- use for OpenSearch Dashboards authentication.
+    identityPoolId :: Prelude.Maybe Prelude.Text,
+    -- | The @AmazonOpenSearchServiceCognitoAccess@ role that allows OpenSearch
+    -- Service to configure your user pool and identity pool.
+    roleArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Cognito user pool ID that you want OpenSearch Service to use
+    -- for OpenSearch Dashboards authentication.
+    userPoolId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CognitoOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enabled', 'cognitoOptions_enabled' - Whether to enable or disable Amazon Cognito authentication for
+-- OpenSearch Dashboards.
+--
+-- 'identityPoolId', 'cognitoOptions_identityPoolId' - The Amazon Cognito identity pool ID that you want OpenSearch Service to
+-- use for OpenSearch Dashboards authentication.
+--
+-- 'roleArn', 'cognitoOptions_roleArn' - The @AmazonOpenSearchServiceCognitoAccess@ role that allows OpenSearch
+-- Service to configure your user pool and identity pool.
+--
+-- 'userPoolId', 'cognitoOptions_userPoolId' - The Amazon Cognito user pool ID that you want OpenSearch Service to use
+-- for OpenSearch Dashboards authentication.
+newCognitoOptions ::
+  CognitoOptions
+newCognitoOptions =
+  CognitoOptions'
+    { enabled = Prelude.Nothing,
+      identityPoolId = Prelude.Nothing,
+      roleArn = Prelude.Nothing,
+      userPoolId = Prelude.Nothing
+    }
+
+-- | Whether to enable or disable Amazon Cognito authentication for
+-- OpenSearch Dashboards.
+cognitoOptions_enabled :: Lens.Lens' CognitoOptions (Prelude.Maybe Prelude.Bool)
+cognitoOptions_enabled = Lens.lens (\CognitoOptions' {enabled} -> enabled) (\s@CognitoOptions' {} a -> s {enabled = a} :: CognitoOptions)
+
+-- | The Amazon Cognito identity pool ID that you want OpenSearch Service to
+-- use for OpenSearch Dashboards authentication.
+cognitoOptions_identityPoolId :: Lens.Lens' CognitoOptions (Prelude.Maybe Prelude.Text)
+cognitoOptions_identityPoolId = Lens.lens (\CognitoOptions' {identityPoolId} -> identityPoolId) (\s@CognitoOptions' {} a -> s {identityPoolId = a} :: CognitoOptions)
+
+-- | The @AmazonOpenSearchServiceCognitoAccess@ role that allows OpenSearch
+-- Service to configure your user pool and identity pool.
+cognitoOptions_roleArn :: Lens.Lens' CognitoOptions (Prelude.Maybe Prelude.Text)
+cognitoOptions_roleArn = Lens.lens (\CognitoOptions' {roleArn} -> roleArn) (\s@CognitoOptions' {} a -> s {roleArn = a} :: CognitoOptions)
+
+-- | The Amazon Cognito user pool ID that you want OpenSearch Service to use
+-- for OpenSearch Dashboards authentication.
+cognitoOptions_userPoolId :: Lens.Lens' CognitoOptions (Prelude.Maybe Prelude.Text)
+cognitoOptions_userPoolId = Lens.lens (\CognitoOptions' {userPoolId} -> userPoolId) (\s@CognitoOptions' {} a -> s {userPoolId = a} :: CognitoOptions)
+
+instance Data.FromJSON CognitoOptions where
+  parseJSON =
+    Data.withObject
+      "CognitoOptions"
+      ( \x ->
+          CognitoOptions'
+            Prelude.<$> (x Data..:? "Enabled")
+            Prelude.<*> (x Data..:? "IdentityPoolId")
+            Prelude.<*> (x Data..:? "RoleArn")
+            Prelude.<*> (x Data..:? "UserPoolId")
+      )
+
+instance Prelude.Hashable CognitoOptions where
+  hashWithSalt _salt CognitoOptions' {..} =
+    _salt
+      `Prelude.hashWithSalt` enabled
+      `Prelude.hashWithSalt` identityPoolId
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` userPoolId
+
+instance Prelude.NFData CognitoOptions where
+  rnf CognitoOptions' {..} =
+    Prelude.rnf enabled
+      `Prelude.seq` Prelude.rnf identityPoolId
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf userPoolId
+
+instance Data.ToJSON CognitoOptions where
+  toJSON CognitoOptions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Enabled" Data..=) Prelude.<$> enabled,
+            ("IdentityPoolId" Data..=)
+              Prelude.<$> identityPoolId,
+            ("RoleArn" Data..=) Prelude.<$> roleArn,
+            ("UserPoolId" Data..=) Prelude.<$> userPoolId
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/CognitoOptionsStatus.hs b/gen/Amazonka/OpenSearch/Types/CognitoOptionsStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/CognitoOptionsStatus.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.CognitoOptionsStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.CognitoOptionsStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.CognitoOptions
+import Amazonka.OpenSearch.Types.OptionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The status of the Cognito options for the specified domain.
+--
+-- /See:/ 'newCognitoOptionsStatus' smart constructor.
+data CognitoOptionsStatus = CognitoOptionsStatus'
+  { -- | Cognito options for the specified domain.
+    options :: CognitoOptions,
+    -- | The status of the Cognito options for the specified domain.
+    status :: OptionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CognitoOptionsStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'options', 'cognitoOptionsStatus_options' - Cognito options for the specified domain.
+--
+-- 'status', 'cognitoOptionsStatus_status' - The status of the Cognito options for the specified domain.
+newCognitoOptionsStatus ::
+  -- | 'options'
+  CognitoOptions ->
+  -- | 'status'
+  OptionStatus ->
+  CognitoOptionsStatus
+newCognitoOptionsStatus pOptions_ pStatus_ =
+  CognitoOptionsStatus'
+    { options = pOptions_,
+      status = pStatus_
+    }
+
+-- | Cognito options for the specified domain.
+cognitoOptionsStatus_options :: Lens.Lens' CognitoOptionsStatus CognitoOptions
+cognitoOptionsStatus_options = Lens.lens (\CognitoOptionsStatus' {options} -> options) (\s@CognitoOptionsStatus' {} a -> s {options = a} :: CognitoOptionsStatus)
+
+-- | The status of the Cognito options for the specified domain.
+cognitoOptionsStatus_status :: Lens.Lens' CognitoOptionsStatus OptionStatus
+cognitoOptionsStatus_status = Lens.lens (\CognitoOptionsStatus' {status} -> status) (\s@CognitoOptionsStatus' {} a -> s {status = a} :: CognitoOptionsStatus)
+
+instance Data.FromJSON CognitoOptionsStatus where
+  parseJSON =
+    Data.withObject
+      "CognitoOptionsStatus"
+      ( \x ->
+          CognitoOptionsStatus'
+            Prelude.<$> (x Data..: "Options")
+            Prelude.<*> (x Data..: "Status")
+      )
+
+instance Prelude.Hashable CognitoOptionsStatus where
+  hashWithSalt _salt CognitoOptionsStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` options
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData CognitoOptionsStatus where
+  rnf CognitoOptionsStatus' {..} =
+    Prelude.rnf options
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/OpenSearch/Types/ColdStorageOptions.hs b/gen/Amazonka/OpenSearch/Types/ColdStorageOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/ColdStorageOptions.hs
@@ -0,0 +1,79 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.ColdStorageOptions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.ColdStorageOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Container for the parameters required to enable cold storage for an
+-- OpenSearch Service domain. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/cold-storage.html Cold storage for Amazon OpenSearch Service>.
+--
+-- /See:/ 'newColdStorageOptions' smart constructor.
+data ColdStorageOptions = ColdStorageOptions'
+  { -- | Whether to enable or disable cold storage on the domain.
+    enabled :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ColdStorageOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enabled', 'coldStorageOptions_enabled' - Whether to enable or disable cold storage on the domain.
+newColdStorageOptions ::
+  -- | 'enabled'
+  Prelude.Bool ->
+  ColdStorageOptions
+newColdStorageOptions pEnabled_ =
+  ColdStorageOptions' {enabled = pEnabled_}
+
+-- | Whether to enable or disable cold storage on the domain.
+coldStorageOptions_enabled :: Lens.Lens' ColdStorageOptions Prelude.Bool
+coldStorageOptions_enabled = Lens.lens (\ColdStorageOptions' {enabled} -> enabled) (\s@ColdStorageOptions' {} a -> s {enabled = a} :: ColdStorageOptions)
+
+instance Data.FromJSON ColdStorageOptions where
+  parseJSON =
+    Data.withObject
+      "ColdStorageOptions"
+      ( \x ->
+          ColdStorageOptions'
+            Prelude.<$> (x Data..: "Enabled")
+      )
+
+instance Prelude.Hashable ColdStorageOptions where
+  hashWithSalt _salt ColdStorageOptions' {..} =
+    _salt `Prelude.hashWithSalt` enabled
+
+instance Prelude.NFData ColdStorageOptions where
+  rnf ColdStorageOptions' {..} = Prelude.rnf enabled
+
+instance Data.ToJSON ColdStorageOptions where
+  toJSON ColdStorageOptions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("Enabled" Data..= enabled)]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/CompatibleVersionsMap.hs b/gen/Amazonka/OpenSearch/Types/CompatibleVersionsMap.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/CompatibleVersionsMap.hs
@@ -0,0 +1,89 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.CompatibleVersionsMap
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.CompatibleVersionsMap where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A map of OpenSearch or Elasticsearch versions and the versions you can
+-- upgrade them to.
+--
+-- /See:/ 'newCompatibleVersionsMap' smart constructor.
+data CompatibleVersionsMap = CompatibleVersionsMap'
+  { -- | The current version that the OpenSearch Service domain is running.
+    sourceVersion :: Prelude.Maybe Prelude.Text,
+    -- | The possible versions that you can upgrade the domain to.
+    targetVersions :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CompatibleVersionsMap' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'sourceVersion', 'compatibleVersionsMap_sourceVersion' - The current version that the OpenSearch Service domain is running.
+--
+-- 'targetVersions', 'compatibleVersionsMap_targetVersions' - The possible versions that you can upgrade the domain to.
+newCompatibleVersionsMap ::
+  CompatibleVersionsMap
+newCompatibleVersionsMap =
+  CompatibleVersionsMap'
+    { sourceVersion =
+        Prelude.Nothing,
+      targetVersions = Prelude.Nothing
+    }
+
+-- | The current version that the OpenSearch Service domain is running.
+compatibleVersionsMap_sourceVersion :: Lens.Lens' CompatibleVersionsMap (Prelude.Maybe Prelude.Text)
+compatibleVersionsMap_sourceVersion = Lens.lens (\CompatibleVersionsMap' {sourceVersion} -> sourceVersion) (\s@CompatibleVersionsMap' {} a -> s {sourceVersion = a} :: CompatibleVersionsMap)
+
+-- | The possible versions that you can upgrade the domain to.
+compatibleVersionsMap_targetVersions :: Lens.Lens' CompatibleVersionsMap (Prelude.Maybe [Prelude.Text])
+compatibleVersionsMap_targetVersions = Lens.lens (\CompatibleVersionsMap' {targetVersions} -> targetVersions) (\s@CompatibleVersionsMap' {} a -> s {targetVersions = a} :: CompatibleVersionsMap) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON CompatibleVersionsMap where
+  parseJSON =
+    Data.withObject
+      "CompatibleVersionsMap"
+      ( \x ->
+          CompatibleVersionsMap'
+            Prelude.<$> (x Data..:? "SourceVersion")
+            Prelude.<*> ( x
+                            Data..:? "TargetVersions"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable CompatibleVersionsMap where
+  hashWithSalt _salt CompatibleVersionsMap' {..} =
+    _salt
+      `Prelude.hashWithSalt` sourceVersion
+      `Prelude.hashWithSalt` targetVersions
+
+instance Prelude.NFData CompatibleVersionsMap where
+  rnf CompatibleVersionsMap' {..} =
+    Prelude.rnf sourceVersion
+      `Prelude.seq` Prelude.rnf targetVersions
diff --git a/gen/Amazonka/OpenSearch/Types/DeploymentStatus.hs b/gen/Amazonka/OpenSearch/Types/DeploymentStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/DeploymentStatus.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.DeploymentStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.DeploymentStatus
+  ( DeploymentStatus
+      ( ..,
+        DeploymentStatus_COMPLETED,
+        DeploymentStatus_ELIGIBLE,
+        DeploymentStatus_IN_PROGRESS,
+        DeploymentStatus_NOT_ELIGIBLE,
+        DeploymentStatus_PENDING_UPDATE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DeploymentStatus = DeploymentStatus'
+  { fromDeploymentStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern DeploymentStatus_COMPLETED :: DeploymentStatus
+pattern DeploymentStatus_COMPLETED = DeploymentStatus' "COMPLETED"
+
+pattern DeploymentStatus_ELIGIBLE :: DeploymentStatus
+pattern DeploymentStatus_ELIGIBLE = DeploymentStatus' "ELIGIBLE"
+
+pattern DeploymentStatus_IN_PROGRESS :: DeploymentStatus
+pattern DeploymentStatus_IN_PROGRESS = DeploymentStatus' "IN_PROGRESS"
+
+pattern DeploymentStatus_NOT_ELIGIBLE :: DeploymentStatus
+pattern DeploymentStatus_NOT_ELIGIBLE = DeploymentStatus' "NOT_ELIGIBLE"
+
+pattern DeploymentStatus_PENDING_UPDATE :: DeploymentStatus
+pattern DeploymentStatus_PENDING_UPDATE = DeploymentStatus' "PENDING_UPDATE"
+
+{-# COMPLETE
+  DeploymentStatus_COMPLETED,
+  DeploymentStatus_ELIGIBLE,
+  DeploymentStatus_IN_PROGRESS,
+  DeploymentStatus_NOT_ELIGIBLE,
+  DeploymentStatus_PENDING_UPDATE,
+  DeploymentStatus'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/DescribePackagesFilter.hs b/gen/Amazonka/OpenSearch/Types/DescribePackagesFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/DescribePackagesFilter.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.DescribePackagesFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.DescribePackagesFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.DescribePackagesFilterName
+import qualified Amazonka.Prelude as Prelude
+
+-- | A filter to apply to the @DescribePackage@ response.
+--
+-- /See:/ 'newDescribePackagesFilter' smart constructor.
+data DescribePackagesFilter = DescribePackagesFilter'
+  { -- | Any field from @PackageDetails@.
+    name :: Prelude.Maybe DescribePackagesFilterName,
+    -- | A list of values for the specified filter field.
+    value :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePackagesFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'describePackagesFilter_name' - Any field from @PackageDetails@.
+--
+-- 'value', 'describePackagesFilter_value' - A list of values for the specified filter field.
+newDescribePackagesFilter ::
+  DescribePackagesFilter
+newDescribePackagesFilter =
+  DescribePackagesFilter'
+    { name = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | Any field from @PackageDetails@.
+describePackagesFilter_name :: Lens.Lens' DescribePackagesFilter (Prelude.Maybe DescribePackagesFilterName)
+describePackagesFilter_name = Lens.lens (\DescribePackagesFilter' {name} -> name) (\s@DescribePackagesFilter' {} a -> s {name = a} :: DescribePackagesFilter)
+
+-- | A list of values for the specified filter field.
+describePackagesFilter_value :: Lens.Lens' DescribePackagesFilter (Prelude.Maybe [Prelude.Text])
+describePackagesFilter_value = Lens.lens (\DescribePackagesFilter' {value} -> value) (\s@DescribePackagesFilter' {} a -> s {value = a} :: DescribePackagesFilter) Prelude.. Lens.mapping Lens.coerced
+
+instance Prelude.Hashable DescribePackagesFilter where
+  hashWithSalt _salt DescribePackagesFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData DescribePackagesFilter where
+  rnf DescribePackagesFilter' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON DescribePackagesFilter where
+  toJSON DescribePackagesFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Name" Data..=) Prelude.<$> name,
+            ("Value" Data..=) Prelude.<$> value
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/DescribePackagesFilterName.hs b/gen/Amazonka/OpenSearch/Types/DescribePackagesFilterName.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/DescribePackagesFilterName.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.DescribePackagesFilterName
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.DescribePackagesFilterName
+  ( DescribePackagesFilterName
+      ( ..,
+        DescribePackagesFilterName_PackageID,
+        DescribePackagesFilterName_PackageName,
+        DescribePackagesFilterName_PackageStatus
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DescribePackagesFilterName = DescribePackagesFilterName'
+  { fromDescribePackagesFilterName ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern DescribePackagesFilterName_PackageID :: DescribePackagesFilterName
+pattern DescribePackagesFilterName_PackageID = DescribePackagesFilterName' "PackageID"
+
+pattern DescribePackagesFilterName_PackageName :: DescribePackagesFilterName
+pattern DescribePackagesFilterName_PackageName = DescribePackagesFilterName' "PackageName"
+
+pattern DescribePackagesFilterName_PackageStatus :: DescribePackagesFilterName
+pattern DescribePackagesFilterName_PackageStatus = DescribePackagesFilterName' "PackageStatus"
+
+{-# COMPLETE
+  DescribePackagesFilterName_PackageID,
+  DescribePackagesFilterName_PackageName,
+  DescribePackagesFilterName_PackageStatus,
+  DescribePackagesFilterName'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/DomainConfig.hs b/gen/Amazonka/OpenSearch/Types/DomainConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/DomainConfig.hs
@@ -0,0 +1,273 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.DomainConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.DomainConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.AccessPoliciesStatus
+import Amazonka.OpenSearch.Types.AdvancedOptionsStatus
+import Amazonka.OpenSearch.Types.AdvancedSecurityOptionsStatus
+import Amazonka.OpenSearch.Types.AutoTuneOptionsStatus
+import Amazonka.OpenSearch.Types.ChangeProgressDetails
+import Amazonka.OpenSearch.Types.ClusterConfigStatus
+import Amazonka.OpenSearch.Types.CognitoOptionsStatus
+import Amazonka.OpenSearch.Types.DomainEndpointOptionsStatus
+import Amazonka.OpenSearch.Types.EBSOptionsStatus
+import Amazonka.OpenSearch.Types.EncryptionAtRestOptionsStatus
+import Amazonka.OpenSearch.Types.LogPublishingOptionsStatus
+import Amazonka.OpenSearch.Types.NodeToNodeEncryptionOptionsStatus
+import Amazonka.OpenSearch.Types.SnapshotOptionsStatus
+import Amazonka.OpenSearch.Types.VPCDerivedInfoStatus
+import Amazonka.OpenSearch.Types.VersionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Container for the configuration of an OpenSearch Service domain.
+--
+-- /See:/ 'newDomainConfig' smart constructor.
+data DomainConfig = DomainConfig'
+  { -- | Specifies the access policies for the domain.
+    accessPolicies :: Prelude.Maybe AccessPoliciesStatus,
+    -- | Key-value pairs to specify advanced configuration options. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomain-configure-advanced-options Advanced options>.
+    advancedOptions :: Prelude.Maybe AdvancedOptionsStatus,
+    -- | Container for fine-grained access control settings for the domain.
+    advancedSecurityOptions :: Prelude.Maybe AdvancedSecurityOptionsStatus,
+    -- | Container for Auto-Tune settings for the domain.
+    autoTuneOptions :: Prelude.Maybe AutoTuneOptionsStatus,
+    -- | Container for information about the progress of an existing
+    -- configuration change.
+    changeProgressDetails :: Prelude.Maybe ChangeProgressDetails,
+    -- | Container for the cluster configuration of a the domain.
+    clusterConfig :: Prelude.Maybe ClusterConfigStatus,
+    -- | Container for Amazon Cognito options for the domain.
+    cognitoOptions :: Prelude.Maybe CognitoOptionsStatus,
+    -- | Additional options for the domain endpoint, such as whether to require
+    -- HTTPS for all traffic.
+    domainEndpointOptions :: Prelude.Maybe DomainEndpointOptionsStatus,
+    -- | Container for EBS options configured for an OpenSearch Service domain.
+    eBSOptions :: Prelude.Maybe EBSOptionsStatus,
+    -- | Key-value pairs to enable encryption at rest.
+    encryptionAtRestOptions :: Prelude.Maybe EncryptionAtRestOptionsStatus,
+    -- | The OpenSearch or Elasticsearch version that the domain is running.
+    engineVersion :: Prelude.Maybe VersionStatus,
+    -- | Key-value pairs to configure slow log publishing.
+    logPublishingOptions :: Prelude.Maybe LogPublishingOptionsStatus,
+    -- | Whether node-to-node encryption is enabled or disabled.
+    nodeToNodeEncryptionOptions :: Prelude.Maybe NodeToNodeEncryptionOptionsStatus,
+    -- | DEPRECATED. Container for parameters required to configure automated
+    -- snapshots of domain indexes.
+    snapshotOptions :: Prelude.Maybe SnapshotOptionsStatus,
+    -- | The current VPC options for the domain and the status of any updates to
+    -- their configuration.
+    vPCOptions :: Prelude.Maybe VPCDerivedInfoStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DomainConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'accessPolicies', 'domainConfig_accessPolicies' - Specifies the access policies for the domain.
+--
+-- 'advancedOptions', 'domainConfig_advancedOptions' - Key-value pairs to specify advanced configuration options. For more
+-- information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomain-configure-advanced-options Advanced options>.
+--
+-- 'advancedSecurityOptions', 'domainConfig_advancedSecurityOptions' - Container for fine-grained access control settings for the domain.
+--
+-- 'autoTuneOptions', 'domainConfig_autoTuneOptions' - Container for Auto-Tune settings for the domain.
+--
+-- 'changeProgressDetails', 'domainConfig_changeProgressDetails' - Container for information about the progress of an existing
+-- configuration change.
+--
+-- 'clusterConfig', 'domainConfig_clusterConfig' - Container for the cluster configuration of a the domain.
+--
+-- 'cognitoOptions', 'domainConfig_cognitoOptions' - Container for Amazon Cognito options for the domain.
+--
+-- 'domainEndpointOptions', 'domainConfig_domainEndpointOptions' - Additional options for the domain endpoint, such as whether to require
+-- HTTPS for all traffic.
+--
+-- 'eBSOptions', 'domainConfig_eBSOptions' - Container for EBS options configured for an OpenSearch Service domain.
+--
+-- 'encryptionAtRestOptions', 'domainConfig_encryptionAtRestOptions' - Key-value pairs to enable encryption at rest.
+--
+-- 'engineVersion', 'domainConfig_engineVersion' - The OpenSearch or Elasticsearch version that the domain is running.
+--
+-- 'logPublishingOptions', 'domainConfig_logPublishingOptions' - Key-value pairs to configure slow log publishing.
+--
+-- 'nodeToNodeEncryptionOptions', 'domainConfig_nodeToNodeEncryptionOptions' - Whether node-to-node encryption is enabled or disabled.
+--
+-- 'snapshotOptions', 'domainConfig_snapshotOptions' - DEPRECATED. Container for parameters required to configure automated
+-- snapshots of domain indexes.
+--
+-- 'vPCOptions', 'domainConfig_vPCOptions' - The current VPC options for the domain and the status of any updates to
+-- their configuration.
+newDomainConfig ::
+  DomainConfig
+newDomainConfig =
+  DomainConfig'
+    { accessPolicies = Prelude.Nothing,
+      advancedOptions = Prelude.Nothing,
+      advancedSecurityOptions = Prelude.Nothing,
+      autoTuneOptions = Prelude.Nothing,
+      changeProgressDetails = Prelude.Nothing,
+      clusterConfig = Prelude.Nothing,
+      cognitoOptions = Prelude.Nothing,
+      domainEndpointOptions = Prelude.Nothing,
+      eBSOptions = Prelude.Nothing,
+      encryptionAtRestOptions = Prelude.Nothing,
+      engineVersion = Prelude.Nothing,
+      logPublishingOptions = Prelude.Nothing,
+      nodeToNodeEncryptionOptions = Prelude.Nothing,
+      snapshotOptions = Prelude.Nothing,
+      vPCOptions = Prelude.Nothing
+    }
+
+-- | Specifies the access policies for the domain.
+domainConfig_accessPolicies :: Lens.Lens' DomainConfig (Prelude.Maybe AccessPoliciesStatus)
+domainConfig_accessPolicies = Lens.lens (\DomainConfig' {accessPolicies} -> accessPolicies) (\s@DomainConfig' {} a -> s {accessPolicies = a} :: DomainConfig)
+
+-- | Key-value pairs to specify advanced configuration options. For more
+-- information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomain-configure-advanced-options Advanced options>.
+domainConfig_advancedOptions :: Lens.Lens' DomainConfig (Prelude.Maybe AdvancedOptionsStatus)
+domainConfig_advancedOptions = Lens.lens (\DomainConfig' {advancedOptions} -> advancedOptions) (\s@DomainConfig' {} a -> s {advancedOptions = a} :: DomainConfig)
+
+-- | Container for fine-grained access control settings for the domain.
+domainConfig_advancedSecurityOptions :: Lens.Lens' DomainConfig (Prelude.Maybe AdvancedSecurityOptionsStatus)
+domainConfig_advancedSecurityOptions = Lens.lens (\DomainConfig' {advancedSecurityOptions} -> advancedSecurityOptions) (\s@DomainConfig' {} a -> s {advancedSecurityOptions = a} :: DomainConfig)
+
+-- | Container for Auto-Tune settings for the domain.
+domainConfig_autoTuneOptions :: Lens.Lens' DomainConfig (Prelude.Maybe AutoTuneOptionsStatus)
+domainConfig_autoTuneOptions = Lens.lens (\DomainConfig' {autoTuneOptions} -> autoTuneOptions) (\s@DomainConfig' {} a -> s {autoTuneOptions = a} :: DomainConfig)
+
+-- | Container for information about the progress of an existing
+-- configuration change.
+domainConfig_changeProgressDetails :: Lens.Lens' DomainConfig (Prelude.Maybe ChangeProgressDetails)
+domainConfig_changeProgressDetails = Lens.lens (\DomainConfig' {changeProgressDetails} -> changeProgressDetails) (\s@DomainConfig' {} a -> s {changeProgressDetails = a} :: DomainConfig)
+
+-- | Container for the cluster configuration of a the domain.
+domainConfig_clusterConfig :: Lens.Lens' DomainConfig (Prelude.Maybe ClusterConfigStatus)
+domainConfig_clusterConfig = Lens.lens (\DomainConfig' {clusterConfig} -> clusterConfig) (\s@DomainConfig' {} a -> s {clusterConfig = a} :: DomainConfig)
+
+-- | Container for Amazon Cognito options for the domain.
+domainConfig_cognitoOptions :: Lens.Lens' DomainConfig (Prelude.Maybe CognitoOptionsStatus)
+domainConfig_cognitoOptions = Lens.lens (\DomainConfig' {cognitoOptions} -> cognitoOptions) (\s@DomainConfig' {} a -> s {cognitoOptions = a} :: DomainConfig)
+
+-- | Additional options for the domain endpoint, such as whether to require
+-- HTTPS for all traffic.
+domainConfig_domainEndpointOptions :: Lens.Lens' DomainConfig (Prelude.Maybe DomainEndpointOptionsStatus)
+domainConfig_domainEndpointOptions = Lens.lens (\DomainConfig' {domainEndpointOptions} -> domainEndpointOptions) (\s@DomainConfig' {} a -> s {domainEndpointOptions = a} :: DomainConfig)
+
+-- | Container for EBS options configured for an OpenSearch Service domain.
+domainConfig_eBSOptions :: Lens.Lens' DomainConfig (Prelude.Maybe EBSOptionsStatus)
+domainConfig_eBSOptions = Lens.lens (\DomainConfig' {eBSOptions} -> eBSOptions) (\s@DomainConfig' {} a -> s {eBSOptions = a} :: DomainConfig)
+
+-- | Key-value pairs to enable encryption at rest.
+domainConfig_encryptionAtRestOptions :: Lens.Lens' DomainConfig (Prelude.Maybe EncryptionAtRestOptionsStatus)
+domainConfig_encryptionAtRestOptions = Lens.lens (\DomainConfig' {encryptionAtRestOptions} -> encryptionAtRestOptions) (\s@DomainConfig' {} a -> s {encryptionAtRestOptions = a} :: DomainConfig)
+
+-- | The OpenSearch or Elasticsearch version that the domain is running.
+domainConfig_engineVersion :: Lens.Lens' DomainConfig (Prelude.Maybe VersionStatus)
+domainConfig_engineVersion = Lens.lens (\DomainConfig' {engineVersion} -> engineVersion) (\s@DomainConfig' {} a -> s {engineVersion = a} :: DomainConfig)
+
+-- | Key-value pairs to configure slow log publishing.
+domainConfig_logPublishingOptions :: Lens.Lens' DomainConfig (Prelude.Maybe LogPublishingOptionsStatus)
+domainConfig_logPublishingOptions = Lens.lens (\DomainConfig' {logPublishingOptions} -> logPublishingOptions) (\s@DomainConfig' {} a -> s {logPublishingOptions = a} :: DomainConfig)
+
+-- | Whether node-to-node encryption is enabled or disabled.
+domainConfig_nodeToNodeEncryptionOptions :: Lens.Lens' DomainConfig (Prelude.Maybe NodeToNodeEncryptionOptionsStatus)
+domainConfig_nodeToNodeEncryptionOptions = Lens.lens (\DomainConfig' {nodeToNodeEncryptionOptions} -> nodeToNodeEncryptionOptions) (\s@DomainConfig' {} a -> s {nodeToNodeEncryptionOptions = a} :: DomainConfig)
+
+-- | DEPRECATED. Container for parameters required to configure automated
+-- snapshots of domain indexes.
+domainConfig_snapshotOptions :: Lens.Lens' DomainConfig (Prelude.Maybe SnapshotOptionsStatus)
+domainConfig_snapshotOptions = Lens.lens (\DomainConfig' {snapshotOptions} -> snapshotOptions) (\s@DomainConfig' {} a -> s {snapshotOptions = a} :: DomainConfig)
+
+-- | The current VPC options for the domain and the status of any updates to
+-- their configuration.
+domainConfig_vPCOptions :: Lens.Lens' DomainConfig (Prelude.Maybe VPCDerivedInfoStatus)
+domainConfig_vPCOptions = Lens.lens (\DomainConfig' {vPCOptions} -> vPCOptions) (\s@DomainConfig' {} a -> s {vPCOptions = a} :: DomainConfig)
+
+instance Data.FromJSON DomainConfig where
+  parseJSON =
+    Data.withObject
+      "DomainConfig"
+      ( \x ->
+          DomainConfig'
+            Prelude.<$> (x Data..:? "AccessPolicies")
+            Prelude.<*> (x Data..:? "AdvancedOptions")
+            Prelude.<*> (x Data..:? "AdvancedSecurityOptions")
+            Prelude.<*> (x Data..:? "AutoTuneOptions")
+            Prelude.<*> (x Data..:? "ChangeProgressDetails")
+            Prelude.<*> (x Data..:? "ClusterConfig")
+            Prelude.<*> (x Data..:? "CognitoOptions")
+            Prelude.<*> (x Data..:? "DomainEndpointOptions")
+            Prelude.<*> (x Data..:? "EBSOptions")
+            Prelude.<*> (x Data..:? "EncryptionAtRestOptions")
+            Prelude.<*> (x Data..:? "EngineVersion")
+            Prelude.<*> (x Data..:? "LogPublishingOptions")
+            Prelude.<*> (x Data..:? "NodeToNodeEncryptionOptions")
+            Prelude.<*> (x Data..:? "SnapshotOptions")
+            Prelude.<*> (x Data..:? "VPCOptions")
+      )
+
+instance Prelude.Hashable DomainConfig where
+  hashWithSalt _salt DomainConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` accessPolicies
+      `Prelude.hashWithSalt` advancedOptions
+      `Prelude.hashWithSalt` advancedSecurityOptions
+      `Prelude.hashWithSalt` autoTuneOptions
+      `Prelude.hashWithSalt` changeProgressDetails
+      `Prelude.hashWithSalt` clusterConfig
+      `Prelude.hashWithSalt` cognitoOptions
+      `Prelude.hashWithSalt` domainEndpointOptions
+      `Prelude.hashWithSalt` eBSOptions
+      `Prelude.hashWithSalt` encryptionAtRestOptions
+      `Prelude.hashWithSalt` engineVersion
+      `Prelude.hashWithSalt` logPublishingOptions
+      `Prelude.hashWithSalt` nodeToNodeEncryptionOptions
+      `Prelude.hashWithSalt` snapshotOptions
+      `Prelude.hashWithSalt` vPCOptions
+
+instance Prelude.NFData DomainConfig where
+  rnf DomainConfig' {..} =
+    Prelude.rnf accessPolicies
+      `Prelude.seq` Prelude.rnf advancedOptions
+      `Prelude.seq` Prelude.rnf advancedSecurityOptions
+      `Prelude.seq` Prelude.rnf autoTuneOptions
+      `Prelude.seq` Prelude.rnf changeProgressDetails
+      `Prelude.seq` Prelude.rnf clusterConfig
+      `Prelude.seq` Prelude.rnf cognitoOptions
+      `Prelude.seq` Prelude.rnf domainEndpointOptions
+      `Prelude.seq` Prelude.rnf eBSOptions
+      `Prelude.seq` Prelude.rnf encryptionAtRestOptions
+      `Prelude.seq` Prelude.rnf engineVersion
+      `Prelude.seq` Prelude.rnf logPublishingOptions
+      `Prelude.seq` Prelude.rnf nodeToNodeEncryptionOptions
+      `Prelude.seq` Prelude.rnf snapshotOptions
+      `Prelude.seq` Prelude.rnf vPCOptions
diff --git a/gen/Amazonka/OpenSearch/Types/DomainEndpointOptions.hs b/gen/Amazonka/OpenSearch/Types/DomainEndpointOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/DomainEndpointOptions.hs
@@ -0,0 +1,168 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.DomainEndpointOptions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.DomainEndpointOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.TLSSecurityPolicy
+import qualified Amazonka.Prelude as Prelude
+
+-- | Options to configure a custom endpoint for an OpenSearch Service domain.
+--
+-- /See:/ 'newDomainEndpointOptions' smart constructor.
+data DomainEndpointOptions = DomainEndpointOptions'
+  { -- | The fully qualified URL for the custom endpoint.
+    customEndpoint :: Prelude.Maybe Prelude.Text,
+    -- | The ARN for your security certificate, managed in Amazon Web Services
+    -- Certificate Manager (ACM).
+    customEndpointCertificateArn :: Prelude.Maybe Prelude.Text,
+    -- | Whether to enable a custom endpoint for the domain.
+    customEndpointEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | True to require that all traffic to the domain arrive over HTTPS.
+    enforceHTTPS :: Prelude.Maybe Prelude.Bool,
+    -- | Specify the TLS security policy to apply to the HTTPS endpoint of the
+    -- domain.
+    --
+    -- Can be one of the following values:
+    --
+    -- -   __Policy-Min-TLS-1-0-2019-07:__ TLS security policy which supports
+    --     TLS version 1.0 and higher.
+    --
+    -- -   __Policy-Min-TLS-1-2-2019-07:__ TLS security policy which supports
+    --     only TLS version 1.2
+    tLSSecurityPolicy :: Prelude.Maybe TLSSecurityPolicy
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DomainEndpointOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'customEndpoint', 'domainEndpointOptions_customEndpoint' - The fully qualified URL for the custom endpoint.
+--
+-- 'customEndpointCertificateArn', 'domainEndpointOptions_customEndpointCertificateArn' - The ARN for your security certificate, managed in Amazon Web Services
+-- Certificate Manager (ACM).
+--
+-- 'customEndpointEnabled', 'domainEndpointOptions_customEndpointEnabled' - Whether to enable a custom endpoint for the domain.
+--
+-- 'enforceHTTPS', 'domainEndpointOptions_enforceHTTPS' - True to require that all traffic to the domain arrive over HTTPS.
+--
+-- 'tLSSecurityPolicy', 'domainEndpointOptions_tLSSecurityPolicy' - Specify the TLS security policy to apply to the HTTPS endpoint of the
+-- domain.
+--
+-- Can be one of the following values:
+--
+-- -   __Policy-Min-TLS-1-0-2019-07:__ TLS security policy which supports
+--     TLS version 1.0 and higher.
+--
+-- -   __Policy-Min-TLS-1-2-2019-07:__ TLS security policy which supports
+--     only TLS version 1.2
+newDomainEndpointOptions ::
+  DomainEndpointOptions
+newDomainEndpointOptions =
+  DomainEndpointOptions'
+    { customEndpoint =
+        Prelude.Nothing,
+      customEndpointCertificateArn = Prelude.Nothing,
+      customEndpointEnabled = Prelude.Nothing,
+      enforceHTTPS = Prelude.Nothing,
+      tLSSecurityPolicy = Prelude.Nothing
+    }
+
+-- | The fully qualified URL for the custom endpoint.
+domainEndpointOptions_customEndpoint :: Lens.Lens' DomainEndpointOptions (Prelude.Maybe Prelude.Text)
+domainEndpointOptions_customEndpoint = Lens.lens (\DomainEndpointOptions' {customEndpoint} -> customEndpoint) (\s@DomainEndpointOptions' {} a -> s {customEndpoint = a} :: DomainEndpointOptions)
+
+-- | The ARN for your security certificate, managed in Amazon Web Services
+-- Certificate Manager (ACM).
+domainEndpointOptions_customEndpointCertificateArn :: Lens.Lens' DomainEndpointOptions (Prelude.Maybe Prelude.Text)
+domainEndpointOptions_customEndpointCertificateArn = Lens.lens (\DomainEndpointOptions' {customEndpointCertificateArn} -> customEndpointCertificateArn) (\s@DomainEndpointOptions' {} a -> s {customEndpointCertificateArn = a} :: DomainEndpointOptions)
+
+-- | Whether to enable a custom endpoint for the domain.
+domainEndpointOptions_customEndpointEnabled :: Lens.Lens' DomainEndpointOptions (Prelude.Maybe Prelude.Bool)
+domainEndpointOptions_customEndpointEnabled = Lens.lens (\DomainEndpointOptions' {customEndpointEnabled} -> customEndpointEnabled) (\s@DomainEndpointOptions' {} a -> s {customEndpointEnabled = a} :: DomainEndpointOptions)
+
+-- | True to require that all traffic to the domain arrive over HTTPS.
+domainEndpointOptions_enforceHTTPS :: Lens.Lens' DomainEndpointOptions (Prelude.Maybe Prelude.Bool)
+domainEndpointOptions_enforceHTTPS = Lens.lens (\DomainEndpointOptions' {enforceHTTPS} -> enforceHTTPS) (\s@DomainEndpointOptions' {} a -> s {enforceHTTPS = a} :: DomainEndpointOptions)
+
+-- | Specify the TLS security policy to apply to the HTTPS endpoint of the
+-- domain.
+--
+-- Can be one of the following values:
+--
+-- -   __Policy-Min-TLS-1-0-2019-07:__ TLS security policy which supports
+--     TLS version 1.0 and higher.
+--
+-- -   __Policy-Min-TLS-1-2-2019-07:__ TLS security policy which supports
+--     only TLS version 1.2
+domainEndpointOptions_tLSSecurityPolicy :: Lens.Lens' DomainEndpointOptions (Prelude.Maybe TLSSecurityPolicy)
+domainEndpointOptions_tLSSecurityPolicy = Lens.lens (\DomainEndpointOptions' {tLSSecurityPolicy} -> tLSSecurityPolicy) (\s@DomainEndpointOptions' {} a -> s {tLSSecurityPolicy = a} :: DomainEndpointOptions)
+
+instance Data.FromJSON DomainEndpointOptions where
+  parseJSON =
+    Data.withObject
+      "DomainEndpointOptions"
+      ( \x ->
+          DomainEndpointOptions'
+            Prelude.<$> (x Data..:? "CustomEndpoint")
+            Prelude.<*> (x Data..:? "CustomEndpointCertificateArn")
+            Prelude.<*> (x Data..:? "CustomEndpointEnabled")
+            Prelude.<*> (x Data..:? "EnforceHTTPS")
+            Prelude.<*> (x Data..:? "TLSSecurityPolicy")
+      )
+
+instance Prelude.Hashable DomainEndpointOptions where
+  hashWithSalt _salt DomainEndpointOptions' {..} =
+    _salt
+      `Prelude.hashWithSalt` customEndpoint
+      `Prelude.hashWithSalt` customEndpointCertificateArn
+      `Prelude.hashWithSalt` customEndpointEnabled
+      `Prelude.hashWithSalt` enforceHTTPS
+      `Prelude.hashWithSalt` tLSSecurityPolicy
+
+instance Prelude.NFData DomainEndpointOptions where
+  rnf DomainEndpointOptions' {..} =
+    Prelude.rnf customEndpoint
+      `Prelude.seq` Prelude.rnf customEndpointCertificateArn
+      `Prelude.seq` Prelude.rnf customEndpointEnabled
+      `Prelude.seq` Prelude.rnf enforceHTTPS
+      `Prelude.seq` Prelude.rnf tLSSecurityPolicy
+
+instance Data.ToJSON DomainEndpointOptions where
+  toJSON DomainEndpointOptions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CustomEndpoint" Data..=)
+              Prelude.<$> customEndpoint,
+            ("CustomEndpointCertificateArn" Data..=)
+              Prelude.<$> customEndpointCertificateArn,
+            ("CustomEndpointEnabled" Data..=)
+              Prelude.<$> customEndpointEnabled,
+            ("EnforceHTTPS" Data..=) Prelude.<$> enforceHTTPS,
+            ("TLSSecurityPolicy" Data..=)
+              Prelude.<$> tLSSecurityPolicy
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/DomainEndpointOptionsStatus.hs b/gen/Amazonka/OpenSearch/Types/DomainEndpointOptionsStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/DomainEndpointOptionsStatus.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.DomainEndpointOptionsStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.DomainEndpointOptionsStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.DomainEndpointOptions
+import Amazonka.OpenSearch.Types.OptionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The configured endpoint options for a domain and their current status.
+--
+-- /See:/ 'newDomainEndpointOptionsStatus' smart constructor.
+data DomainEndpointOptionsStatus = DomainEndpointOptionsStatus'
+  { -- | Options to configure the endpoint for a domain.
+    options :: DomainEndpointOptions,
+    -- | The status of the endpoint options for a domain.
+    status :: OptionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DomainEndpointOptionsStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'options', 'domainEndpointOptionsStatus_options' - Options to configure the endpoint for a domain.
+--
+-- 'status', 'domainEndpointOptionsStatus_status' - The status of the endpoint options for a domain.
+newDomainEndpointOptionsStatus ::
+  -- | 'options'
+  DomainEndpointOptions ->
+  -- | 'status'
+  OptionStatus ->
+  DomainEndpointOptionsStatus
+newDomainEndpointOptionsStatus pOptions_ pStatus_ =
+  DomainEndpointOptionsStatus'
+    { options = pOptions_,
+      status = pStatus_
+    }
+
+-- | Options to configure the endpoint for a domain.
+domainEndpointOptionsStatus_options :: Lens.Lens' DomainEndpointOptionsStatus DomainEndpointOptions
+domainEndpointOptionsStatus_options = Lens.lens (\DomainEndpointOptionsStatus' {options} -> options) (\s@DomainEndpointOptionsStatus' {} a -> s {options = a} :: DomainEndpointOptionsStatus)
+
+-- | The status of the endpoint options for a domain.
+domainEndpointOptionsStatus_status :: Lens.Lens' DomainEndpointOptionsStatus OptionStatus
+domainEndpointOptionsStatus_status = Lens.lens (\DomainEndpointOptionsStatus' {status} -> status) (\s@DomainEndpointOptionsStatus' {} a -> s {status = a} :: DomainEndpointOptionsStatus)
+
+instance Data.FromJSON DomainEndpointOptionsStatus where
+  parseJSON =
+    Data.withObject
+      "DomainEndpointOptionsStatus"
+      ( \x ->
+          DomainEndpointOptionsStatus'
+            Prelude.<$> (x Data..: "Options")
+            Prelude.<*> (x Data..: "Status")
+      )
+
+instance Prelude.Hashable DomainEndpointOptionsStatus where
+  hashWithSalt _salt DomainEndpointOptionsStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` options
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData DomainEndpointOptionsStatus where
+  rnf DomainEndpointOptionsStatus' {..} =
+    Prelude.rnf options
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/OpenSearch/Types/DomainInfo.hs b/gen/Amazonka/OpenSearch/Types/DomainInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/DomainInfo.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.DomainInfo
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.DomainInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.EngineType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about an OpenSearch Service domain.
+--
+-- /See:/ 'newDomainInfo' smart constructor.
+data DomainInfo = DomainInfo'
+  { -- | Name of the domain.
+    domainName :: Prelude.Maybe Prelude.Text,
+    -- | The type of search engine that the domain is running.@OpenSearch@ for an
+    -- OpenSearch engine, or @Elasticsearch@ for a legacy Elasticsearch OSS
+    -- engine.
+    engineType :: Prelude.Maybe EngineType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DomainInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainName', 'domainInfo_domainName' - Name of the domain.
+--
+-- 'engineType', 'domainInfo_engineType' - The type of search engine that the domain is running.@OpenSearch@ for an
+-- OpenSearch engine, or @Elasticsearch@ for a legacy Elasticsearch OSS
+-- engine.
+newDomainInfo ::
+  DomainInfo
+newDomainInfo =
+  DomainInfo'
+    { domainName = Prelude.Nothing,
+      engineType = Prelude.Nothing
+    }
+
+-- | Name of the domain.
+domainInfo_domainName :: Lens.Lens' DomainInfo (Prelude.Maybe Prelude.Text)
+domainInfo_domainName = Lens.lens (\DomainInfo' {domainName} -> domainName) (\s@DomainInfo' {} a -> s {domainName = a} :: DomainInfo)
+
+-- | The type of search engine that the domain is running.@OpenSearch@ for an
+-- OpenSearch engine, or @Elasticsearch@ for a legacy Elasticsearch OSS
+-- engine.
+domainInfo_engineType :: Lens.Lens' DomainInfo (Prelude.Maybe EngineType)
+domainInfo_engineType = Lens.lens (\DomainInfo' {engineType} -> engineType) (\s@DomainInfo' {} a -> s {engineType = a} :: DomainInfo)
+
+instance Data.FromJSON DomainInfo where
+  parseJSON =
+    Data.withObject
+      "DomainInfo"
+      ( \x ->
+          DomainInfo'
+            Prelude.<$> (x Data..:? "DomainName")
+            Prelude.<*> (x Data..:? "EngineType")
+      )
+
+instance Prelude.Hashable DomainInfo where
+  hashWithSalt _salt DomainInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` domainName
+      `Prelude.hashWithSalt` engineType
+
+instance Prelude.NFData DomainInfo where
+  rnf DomainInfo' {..} =
+    Prelude.rnf domainName
+      `Prelude.seq` Prelude.rnf engineType
diff --git a/gen/Amazonka/OpenSearch/Types/DomainInformationContainer.hs b/gen/Amazonka/OpenSearch/Types/DomainInformationContainer.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/DomainInformationContainer.hs
@@ -0,0 +1,82 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.DomainInformationContainer
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.DomainInformationContainer where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.AWSDomainInformation
+import qualified Amazonka.Prelude as Prelude
+
+-- | Container for information about an OpenSearch Service domain.
+--
+-- /See:/ 'newDomainInformationContainer' smart constructor.
+data DomainInformationContainer = DomainInformationContainer'
+  { -- | Information about an Amazon OpenSearch Service domain.
+    aWSDomainInformation :: Prelude.Maybe AWSDomainInformation
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DomainInformationContainer' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'aWSDomainInformation', 'domainInformationContainer_aWSDomainInformation' - Information about an Amazon OpenSearch Service domain.
+newDomainInformationContainer ::
+  DomainInformationContainer
+newDomainInformationContainer =
+  DomainInformationContainer'
+    { aWSDomainInformation =
+        Prelude.Nothing
+    }
+
+-- | Information about an Amazon OpenSearch Service domain.
+domainInformationContainer_aWSDomainInformation :: Lens.Lens' DomainInformationContainer (Prelude.Maybe AWSDomainInformation)
+domainInformationContainer_aWSDomainInformation = Lens.lens (\DomainInformationContainer' {aWSDomainInformation} -> aWSDomainInformation) (\s@DomainInformationContainer' {} a -> s {aWSDomainInformation = a} :: DomainInformationContainer)
+
+instance Data.FromJSON DomainInformationContainer where
+  parseJSON =
+    Data.withObject
+      "DomainInformationContainer"
+      ( \x ->
+          DomainInformationContainer'
+            Prelude.<$> (x Data..:? "AWSDomainInformation")
+      )
+
+instance Prelude.Hashable DomainInformationContainer where
+  hashWithSalt _salt DomainInformationContainer' {..} =
+    _salt `Prelude.hashWithSalt` aWSDomainInformation
+
+instance Prelude.NFData DomainInformationContainer where
+  rnf DomainInformationContainer' {..} =
+    Prelude.rnf aWSDomainInformation
+
+instance Data.ToJSON DomainInformationContainer where
+  toJSON DomainInformationContainer' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AWSDomainInformation" Data..=)
+              Prelude.<$> aWSDomainInformation
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/DomainPackageDetails.hs b/gen/Amazonka/OpenSearch/Types/DomainPackageDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/DomainPackageDetails.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.DomainPackageDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.DomainPackageDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.DomainPackageStatus
+import Amazonka.OpenSearch.Types.ErrorDetails
+import Amazonka.OpenSearch.Types.PackageType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about a package that is associated with a domain. For more
+-- information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/custom-packages.html Custom packages for Amazon OpenSearch Service>.
+--
+-- /See:/ 'newDomainPackageDetails' smart constructor.
+data DomainPackageDetails = DomainPackageDetails'
+  { -- | Name of the domain that the package is associated with.
+    domainName :: Prelude.Maybe Prelude.Text,
+    -- | State of the association.
+    domainPackageStatus :: Prelude.Maybe DomainPackageStatus,
+    -- | Additional information if the package is in an error state. Null
+    -- otherwise.
+    errorDetails :: Prelude.Maybe ErrorDetails,
+    -- | Timestamp of the most recent update to the package association status.
+    lastUpdated :: Prelude.Maybe Data.POSIX,
+    -- | Internal ID of the package.
+    packageID :: Prelude.Maybe Prelude.Text,
+    -- | User-specified name of the package.
+    packageName :: Prelude.Maybe Prelude.Text,
+    -- | The type of package.
+    packageType :: Prelude.Maybe PackageType,
+    -- | The current version of the package.
+    packageVersion :: Prelude.Maybe Prelude.Text,
+    -- | Denotes the location of the package on the OpenSearch Service cluster
+    -- nodes. It\'s the same as @synonym_path@ for dictionary files.
+    referencePath :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DomainPackageDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainName', 'domainPackageDetails_domainName' - Name of the domain that the package is associated with.
+--
+-- 'domainPackageStatus', 'domainPackageDetails_domainPackageStatus' - State of the association.
+--
+-- 'errorDetails', 'domainPackageDetails_errorDetails' - Additional information if the package is in an error state. Null
+-- otherwise.
+--
+-- 'lastUpdated', 'domainPackageDetails_lastUpdated' - Timestamp of the most recent update to the package association status.
+--
+-- 'packageID', 'domainPackageDetails_packageID' - Internal ID of the package.
+--
+-- 'packageName', 'domainPackageDetails_packageName' - User-specified name of the package.
+--
+-- 'packageType', 'domainPackageDetails_packageType' - The type of package.
+--
+-- 'packageVersion', 'domainPackageDetails_packageVersion' - The current version of the package.
+--
+-- 'referencePath', 'domainPackageDetails_referencePath' - Denotes the location of the package on the OpenSearch Service cluster
+-- nodes. It\'s the same as @synonym_path@ for dictionary files.
+newDomainPackageDetails ::
+  DomainPackageDetails
+newDomainPackageDetails =
+  DomainPackageDetails'
+    { domainName = Prelude.Nothing,
+      domainPackageStatus = Prelude.Nothing,
+      errorDetails = Prelude.Nothing,
+      lastUpdated = Prelude.Nothing,
+      packageID = Prelude.Nothing,
+      packageName = Prelude.Nothing,
+      packageType = Prelude.Nothing,
+      packageVersion = Prelude.Nothing,
+      referencePath = Prelude.Nothing
+    }
+
+-- | Name of the domain that the package is associated with.
+domainPackageDetails_domainName :: Lens.Lens' DomainPackageDetails (Prelude.Maybe Prelude.Text)
+domainPackageDetails_domainName = Lens.lens (\DomainPackageDetails' {domainName} -> domainName) (\s@DomainPackageDetails' {} a -> s {domainName = a} :: DomainPackageDetails)
+
+-- | State of the association.
+domainPackageDetails_domainPackageStatus :: Lens.Lens' DomainPackageDetails (Prelude.Maybe DomainPackageStatus)
+domainPackageDetails_domainPackageStatus = Lens.lens (\DomainPackageDetails' {domainPackageStatus} -> domainPackageStatus) (\s@DomainPackageDetails' {} a -> s {domainPackageStatus = a} :: DomainPackageDetails)
+
+-- | Additional information if the package is in an error state. Null
+-- otherwise.
+domainPackageDetails_errorDetails :: Lens.Lens' DomainPackageDetails (Prelude.Maybe ErrorDetails)
+domainPackageDetails_errorDetails = Lens.lens (\DomainPackageDetails' {errorDetails} -> errorDetails) (\s@DomainPackageDetails' {} a -> s {errorDetails = a} :: DomainPackageDetails)
+
+-- | Timestamp of the most recent update to the package association status.
+domainPackageDetails_lastUpdated :: Lens.Lens' DomainPackageDetails (Prelude.Maybe Prelude.UTCTime)
+domainPackageDetails_lastUpdated = Lens.lens (\DomainPackageDetails' {lastUpdated} -> lastUpdated) (\s@DomainPackageDetails' {} a -> s {lastUpdated = a} :: DomainPackageDetails) Prelude.. Lens.mapping Data._Time
+
+-- | Internal ID of the package.
+domainPackageDetails_packageID :: Lens.Lens' DomainPackageDetails (Prelude.Maybe Prelude.Text)
+domainPackageDetails_packageID = Lens.lens (\DomainPackageDetails' {packageID} -> packageID) (\s@DomainPackageDetails' {} a -> s {packageID = a} :: DomainPackageDetails)
+
+-- | User-specified name of the package.
+domainPackageDetails_packageName :: Lens.Lens' DomainPackageDetails (Prelude.Maybe Prelude.Text)
+domainPackageDetails_packageName = Lens.lens (\DomainPackageDetails' {packageName} -> packageName) (\s@DomainPackageDetails' {} a -> s {packageName = a} :: DomainPackageDetails)
+
+-- | The type of package.
+domainPackageDetails_packageType :: Lens.Lens' DomainPackageDetails (Prelude.Maybe PackageType)
+domainPackageDetails_packageType = Lens.lens (\DomainPackageDetails' {packageType} -> packageType) (\s@DomainPackageDetails' {} a -> s {packageType = a} :: DomainPackageDetails)
+
+-- | The current version of the package.
+domainPackageDetails_packageVersion :: Lens.Lens' DomainPackageDetails (Prelude.Maybe Prelude.Text)
+domainPackageDetails_packageVersion = Lens.lens (\DomainPackageDetails' {packageVersion} -> packageVersion) (\s@DomainPackageDetails' {} a -> s {packageVersion = a} :: DomainPackageDetails)
+
+-- | Denotes the location of the package on the OpenSearch Service cluster
+-- nodes. It\'s the same as @synonym_path@ for dictionary files.
+domainPackageDetails_referencePath :: Lens.Lens' DomainPackageDetails (Prelude.Maybe Prelude.Text)
+domainPackageDetails_referencePath = Lens.lens (\DomainPackageDetails' {referencePath} -> referencePath) (\s@DomainPackageDetails' {} a -> s {referencePath = a} :: DomainPackageDetails)
+
+instance Data.FromJSON DomainPackageDetails where
+  parseJSON =
+    Data.withObject
+      "DomainPackageDetails"
+      ( \x ->
+          DomainPackageDetails'
+            Prelude.<$> (x Data..:? "DomainName")
+            Prelude.<*> (x Data..:? "DomainPackageStatus")
+            Prelude.<*> (x Data..:? "ErrorDetails")
+            Prelude.<*> (x Data..:? "LastUpdated")
+            Prelude.<*> (x Data..:? "PackageID")
+            Prelude.<*> (x Data..:? "PackageName")
+            Prelude.<*> (x Data..:? "PackageType")
+            Prelude.<*> (x Data..:? "PackageVersion")
+            Prelude.<*> (x Data..:? "ReferencePath")
+      )
+
+instance Prelude.Hashable DomainPackageDetails where
+  hashWithSalt _salt DomainPackageDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` domainName
+      `Prelude.hashWithSalt` domainPackageStatus
+      `Prelude.hashWithSalt` errorDetails
+      `Prelude.hashWithSalt` lastUpdated
+      `Prelude.hashWithSalt` packageID
+      `Prelude.hashWithSalt` packageName
+      `Prelude.hashWithSalt` packageType
+      `Prelude.hashWithSalt` packageVersion
+      `Prelude.hashWithSalt` referencePath
+
+instance Prelude.NFData DomainPackageDetails where
+  rnf DomainPackageDetails' {..} =
+    Prelude.rnf domainName
+      `Prelude.seq` Prelude.rnf domainPackageStatus
+      `Prelude.seq` Prelude.rnf errorDetails
+      `Prelude.seq` Prelude.rnf lastUpdated
+      `Prelude.seq` Prelude.rnf packageID
+      `Prelude.seq` Prelude.rnf packageName
+      `Prelude.seq` Prelude.rnf packageType
+      `Prelude.seq` Prelude.rnf packageVersion
+      `Prelude.seq` Prelude.rnf referencePath
diff --git a/gen/Amazonka/OpenSearch/Types/DomainPackageStatus.hs b/gen/Amazonka/OpenSearch/Types/DomainPackageStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/DomainPackageStatus.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.DomainPackageStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.DomainPackageStatus
+  ( DomainPackageStatus
+      ( ..,
+        DomainPackageStatus_ACTIVE,
+        DomainPackageStatus_ASSOCIATING,
+        DomainPackageStatus_ASSOCIATION_FAILED,
+        DomainPackageStatus_DISSOCIATING,
+        DomainPackageStatus_DISSOCIATION_FAILED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DomainPackageStatus = DomainPackageStatus'
+  { fromDomainPackageStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern DomainPackageStatus_ACTIVE :: DomainPackageStatus
+pattern DomainPackageStatus_ACTIVE = DomainPackageStatus' "ACTIVE"
+
+pattern DomainPackageStatus_ASSOCIATING :: DomainPackageStatus
+pattern DomainPackageStatus_ASSOCIATING = DomainPackageStatus' "ASSOCIATING"
+
+pattern DomainPackageStatus_ASSOCIATION_FAILED :: DomainPackageStatus
+pattern DomainPackageStatus_ASSOCIATION_FAILED = DomainPackageStatus' "ASSOCIATION_FAILED"
+
+pattern DomainPackageStatus_DISSOCIATING :: DomainPackageStatus
+pattern DomainPackageStatus_DISSOCIATING = DomainPackageStatus' "DISSOCIATING"
+
+pattern DomainPackageStatus_DISSOCIATION_FAILED :: DomainPackageStatus
+pattern DomainPackageStatus_DISSOCIATION_FAILED = DomainPackageStatus' "DISSOCIATION_FAILED"
+
+{-# COMPLETE
+  DomainPackageStatus_ACTIVE,
+  DomainPackageStatus_ASSOCIATING,
+  DomainPackageStatus_ASSOCIATION_FAILED,
+  DomainPackageStatus_DISSOCIATING,
+  DomainPackageStatus_DISSOCIATION_FAILED,
+  DomainPackageStatus'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/DomainStatus.hs b/gen/Amazonka/OpenSearch/Types/DomainStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/DomainStatus.hs
@@ -0,0 +1,445 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.DomainStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.DomainStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.AdvancedSecurityOptions
+import Amazonka.OpenSearch.Types.AutoTuneOptionsOutput
+import Amazonka.OpenSearch.Types.ChangeProgressDetails
+import Amazonka.OpenSearch.Types.ClusterConfig
+import Amazonka.OpenSearch.Types.CognitoOptions
+import Amazonka.OpenSearch.Types.DomainEndpointOptions
+import Amazonka.OpenSearch.Types.EBSOptions
+import Amazonka.OpenSearch.Types.EncryptionAtRestOptions
+import Amazonka.OpenSearch.Types.LogPublishingOption
+import Amazonka.OpenSearch.Types.LogType
+import Amazonka.OpenSearch.Types.NodeToNodeEncryptionOptions
+import Amazonka.OpenSearch.Types.ServiceSoftwareOptions
+import Amazonka.OpenSearch.Types.SnapshotOptions
+import Amazonka.OpenSearch.Types.VPCDerivedInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | The current status of an OpenSearch Service domain.
+--
+-- /See:/ 'newDomainStatus' smart constructor.
+data DomainStatus = DomainStatus'
+  { -- | Identity and Access Management (IAM) policy document specifying the
+    -- access policies for the domain.
+    accessPolicies :: Prelude.Maybe Prelude.Text,
+    -- | Key-value pairs that specify advanced configuration options.
+    advancedOptions :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Settings for fine-grained access control.
+    advancedSecurityOptions :: Prelude.Maybe AdvancedSecurityOptions,
+    -- | Auto-Tune settings for the domain.
+    autoTuneOptions :: Prelude.Maybe AutoTuneOptionsOutput,
+    -- | Information about a configuration change happening on the domain.
+    changeProgressDetails :: Prelude.Maybe ChangeProgressDetails,
+    -- | Key-value pairs to configure Amazon Cognito authentication for
+    -- OpenSearch Dashboards.
+    cognitoOptions :: Prelude.Maybe CognitoOptions,
+    -- | Creation status of an OpenSearch Service domain. True if domain creation
+    -- is complete. False if domain creation is still in progress.
+    created :: Prelude.Maybe Prelude.Bool,
+    -- | Deletion status of an OpenSearch Service domain. True if domain deletion
+    -- is complete. False if domain deletion is still in progress. Once
+    -- deletion is complete, the status of the domain is no longer returned.
+    deleted :: Prelude.Maybe Prelude.Bool,
+    -- | Additional options for the domain endpoint, such as whether to require
+    -- HTTPS for all traffic.
+    domainEndpointOptions :: Prelude.Maybe DomainEndpointOptions,
+    -- | Container for EBS-based storage settings for the domain.
+    eBSOptions :: Prelude.Maybe EBSOptions,
+    -- | Encryption at rest settings for the domain.
+    encryptionAtRestOptions :: Prelude.Maybe EncryptionAtRestOptions,
+    -- | Domain-specific endpoint used to submit index, search, and data upload
+    -- requests to the domain.
+    endpoint :: Prelude.Maybe Prelude.Text,
+    -- | The key-value pair that exists if the OpenSearch Service domain uses VPC
+    -- endpoints.. Example @key, value@:
+    -- @\'vpc\',\'vpc-endpoint-h2dsd34efgyghrtguk5gt6j2foh4.us-east-1.es.amazonaws.com\'@.
+    endpoints :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Version of OpenSearch or Elasticsearch that the domain is running, in
+    -- the format @Elasticsearch_X.Y@ or @OpenSearch_X.Y@.
+    engineVersion :: Prelude.Maybe Prelude.Text,
+    -- | Log publishing options for the domain.
+    logPublishingOptions :: Prelude.Maybe (Prelude.HashMap LogType LogPublishingOption),
+    -- | Whether node-to-node encryption is enabled or disabled.
+    nodeToNodeEncryptionOptions :: Prelude.Maybe NodeToNodeEncryptionOptions,
+    -- | The status of the domain configuration. True if OpenSearch Service is
+    -- processing configuration changes. False if the configuration is active.
+    processing :: Prelude.Maybe Prelude.Bool,
+    -- | The current status of the domain\'s service software.
+    serviceSoftwareOptions :: Prelude.Maybe ServiceSoftwareOptions,
+    -- | DEPRECATED. Container for parameters required to configure automated
+    -- snapshots of domain indexes.
+    snapshotOptions :: Prelude.Maybe SnapshotOptions,
+    -- | The status of a domain version upgrade to a new version of OpenSearch or
+    -- Elasticsearch. True if OpenSearch Service is in the process of a version
+    -- upgrade. False if the configuration is active.
+    upgradeProcessing :: Prelude.Maybe Prelude.Bool,
+    -- | The VPC configuration for the domain.
+    vPCOptions :: Prelude.Maybe VPCDerivedInfo,
+    -- | Unique identifier for the domain.
+    domainId :: Prelude.Text,
+    -- | Name of the domain. Domain names are unique across all domains owned by
+    -- the same account within an Amazon Web Services Region.
+    domainName :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the domain. For more information, see
+    -- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html IAM identifiers>
+    -- in the /AWS Identity and Access Management User Guide/.
+    arn :: Prelude.Text,
+    -- | Container for the cluster configuration of the domain.
+    clusterConfig :: ClusterConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DomainStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'accessPolicies', 'domainStatus_accessPolicies' - Identity and Access Management (IAM) policy document specifying the
+-- access policies for the domain.
+--
+-- 'advancedOptions', 'domainStatus_advancedOptions' - Key-value pairs that specify advanced configuration options.
+--
+-- 'advancedSecurityOptions', 'domainStatus_advancedSecurityOptions' - Settings for fine-grained access control.
+--
+-- 'autoTuneOptions', 'domainStatus_autoTuneOptions' - Auto-Tune settings for the domain.
+--
+-- 'changeProgressDetails', 'domainStatus_changeProgressDetails' - Information about a configuration change happening on the domain.
+--
+-- 'cognitoOptions', 'domainStatus_cognitoOptions' - Key-value pairs to configure Amazon Cognito authentication for
+-- OpenSearch Dashboards.
+--
+-- 'created', 'domainStatus_created' - Creation status of an OpenSearch Service domain. True if domain creation
+-- is complete. False if domain creation is still in progress.
+--
+-- 'deleted', 'domainStatus_deleted' - Deletion status of an OpenSearch Service domain. True if domain deletion
+-- is complete. False if domain deletion is still in progress. Once
+-- deletion is complete, the status of the domain is no longer returned.
+--
+-- 'domainEndpointOptions', 'domainStatus_domainEndpointOptions' - Additional options for the domain endpoint, such as whether to require
+-- HTTPS for all traffic.
+--
+-- 'eBSOptions', 'domainStatus_eBSOptions' - Container for EBS-based storage settings for the domain.
+--
+-- 'encryptionAtRestOptions', 'domainStatus_encryptionAtRestOptions' - Encryption at rest settings for the domain.
+--
+-- 'endpoint', 'domainStatus_endpoint' - Domain-specific endpoint used to submit index, search, and data upload
+-- requests to the domain.
+--
+-- 'endpoints', 'domainStatus_endpoints' - The key-value pair that exists if the OpenSearch Service domain uses VPC
+-- endpoints.. Example @key, value@:
+-- @\'vpc\',\'vpc-endpoint-h2dsd34efgyghrtguk5gt6j2foh4.us-east-1.es.amazonaws.com\'@.
+--
+-- 'engineVersion', 'domainStatus_engineVersion' - Version of OpenSearch or Elasticsearch that the domain is running, in
+-- the format @Elasticsearch_X.Y@ or @OpenSearch_X.Y@.
+--
+-- 'logPublishingOptions', 'domainStatus_logPublishingOptions' - Log publishing options for the domain.
+--
+-- 'nodeToNodeEncryptionOptions', 'domainStatus_nodeToNodeEncryptionOptions' - Whether node-to-node encryption is enabled or disabled.
+--
+-- 'processing', 'domainStatus_processing' - The status of the domain configuration. True if OpenSearch Service is
+-- processing configuration changes. False if the configuration is active.
+--
+-- 'serviceSoftwareOptions', 'domainStatus_serviceSoftwareOptions' - The current status of the domain\'s service software.
+--
+-- 'snapshotOptions', 'domainStatus_snapshotOptions' - DEPRECATED. Container for parameters required to configure automated
+-- snapshots of domain indexes.
+--
+-- 'upgradeProcessing', 'domainStatus_upgradeProcessing' - The status of a domain version upgrade to a new version of OpenSearch or
+-- Elasticsearch. True if OpenSearch Service is in the process of a version
+-- upgrade. False if the configuration is active.
+--
+-- 'vPCOptions', 'domainStatus_vPCOptions' - The VPC configuration for the domain.
+--
+-- 'domainId', 'domainStatus_domainId' - Unique identifier for the domain.
+--
+-- 'domainName', 'domainStatus_domainName' - Name of the domain. Domain names are unique across all domains owned by
+-- the same account within an Amazon Web Services Region.
+--
+-- 'arn', 'domainStatus_arn' - The Amazon Resource Name (ARN) of the domain. For more information, see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html IAM identifiers>
+-- in the /AWS Identity and Access Management User Guide/.
+--
+-- 'clusterConfig', 'domainStatus_clusterConfig' - Container for the cluster configuration of the domain.
+newDomainStatus ::
+  -- | 'domainId'
+  Prelude.Text ->
+  -- | 'domainName'
+  Prelude.Text ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'clusterConfig'
+  ClusterConfig ->
+  DomainStatus
+newDomainStatus
+  pDomainId_
+  pDomainName_
+  pARN_
+  pClusterConfig_ =
+    DomainStatus'
+      { accessPolicies = Prelude.Nothing,
+        advancedOptions = Prelude.Nothing,
+        advancedSecurityOptions = Prelude.Nothing,
+        autoTuneOptions = Prelude.Nothing,
+        changeProgressDetails = Prelude.Nothing,
+        cognitoOptions = Prelude.Nothing,
+        created = Prelude.Nothing,
+        deleted = Prelude.Nothing,
+        domainEndpointOptions = Prelude.Nothing,
+        eBSOptions = Prelude.Nothing,
+        encryptionAtRestOptions = Prelude.Nothing,
+        endpoint = Prelude.Nothing,
+        endpoints = Prelude.Nothing,
+        engineVersion = Prelude.Nothing,
+        logPublishingOptions = Prelude.Nothing,
+        nodeToNodeEncryptionOptions = Prelude.Nothing,
+        processing = Prelude.Nothing,
+        serviceSoftwareOptions = Prelude.Nothing,
+        snapshotOptions = Prelude.Nothing,
+        upgradeProcessing = Prelude.Nothing,
+        vPCOptions = Prelude.Nothing,
+        domainId = pDomainId_,
+        domainName = pDomainName_,
+        arn = pARN_,
+        clusterConfig = pClusterConfig_
+      }
+
+-- | Identity and Access Management (IAM) policy document specifying the
+-- access policies for the domain.
+domainStatus_accessPolicies :: Lens.Lens' DomainStatus (Prelude.Maybe Prelude.Text)
+domainStatus_accessPolicies = Lens.lens (\DomainStatus' {accessPolicies} -> accessPolicies) (\s@DomainStatus' {} a -> s {accessPolicies = a} :: DomainStatus)
+
+-- | Key-value pairs that specify advanced configuration options.
+domainStatus_advancedOptions :: Lens.Lens' DomainStatus (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+domainStatus_advancedOptions = Lens.lens (\DomainStatus' {advancedOptions} -> advancedOptions) (\s@DomainStatus' {} a -> s {advancedOptions = a} :: DomainStatus) Prelude.. Lens.mapping Lens.coerced
+
+-- | Settings for fine-grained access control.
+domainStatus_advancedSecurityOptions :: Lens.Lens' DomainStatus (Prelude.Maybe AdvancedSecurityOptions)
+domainStatus_advancedSecurityOptions = Lens.lens (\DomainStatus' {advancedSecurityOptions} -> advancedSecurityOptions) (\s@DomainStatus' {} a -> s {advancedSecurityOptions = a} :: DomainStatus)
+
+-- | Auto-Tune settings for the domain.
+domainStatus_autoTuneOptions :: Lens.Lens' DomainStatus (Prelude.Maybe AutoTuneOptionsOutput)
+domainStatus_autoTuneOptions = Lens.lens (\DomainStatus' {autoTuneOptions} -> autoTuneOptions) (\s@DomainStatus' {} a -> s {autoTuneOptions = a} :: DomainStatus)
+
+-- | Information about a configuration change happening on the domain.
+domainStatus_changeProgressDetails :: Lens.Lens' DomainStatus (Prelude.Maybe ChangeProgressDetails)
+domainStatus_changeProgressDetails = Lens.lens (\DomainStatus' {changeProgressDetails} -> changeProgressDetails) (\s@DomainStatus' {} a -> s {changeProgressDetails = a} :: DomainStatus)
+
+-- | Key-value pairs to configure Amazon Cognito authentication for
+-- OpenSearch Dashboards.
+domainStatus_cognitoOptions :: Lens.Lens' DomainStatus (Prelude.Maybe CognitoOptions)
+domainStatus_cognitoOptions = Lens.lens (\DomainStatus' {cognitoOptions} -> cognitoOptions) (\s@DomainStatus' {} a -> s {cognitoOptions = a} :: DomainStatus)
+
+-- | Creation status of an OpenSearch Service domain. True if domain creation
+-- is complete. False if domain creation is still in progress.
+domainStatus_created :: Lens.Lens' DomainStatus (Prelude.Maybe Prelude.Bool)
+domainStatus_created = Lens.lens (\DomainStatus' {created} -> created) (\s@DomainStatus' {} a -> s {created = a} :: DomainStatus)
+
+-- | Deletion status of an OpenSearch Service domain. True if domain deletion
+-- is complete. False if domain deletion is still in progress. Once
+-- deletion is complete, the status of the domain is no longer returned.
+domainStatus_deleted :: Lens.Lens' DomainStatus (Prelude.Maybe Prelude.Bool)
+domainStatus_deleted = Lens.lens (\DomainStatus' {deleted} -> deleted) (\s@DomainStatus' {} a -> s {deleted = a} :: DomainStatus)
+
+-- | Additional options for the domain endpoint, such as whether to require
+-- HTTPS for all traffic.
+domainStatus_domainEndpointOptions :: Lens.Lens' DomainStatus (Prelude.Maybe DomainEndpointOptions)
+domainStatus_domainEndpointOptions = Lens.lens (\DomainStatus' {domainEndpointOptions} -> domainEndpointOptions) (\s@DomainStatus' {} a -> s {domainEndpointOptions = a} :: DomainStatus)
+
+-- | Container for EBS-based storage settings for the domain.
+domainStatus_eBSOptions :: Lens.Lens' DomainStatus (Prelude.Maybe EBSOptions)
+domainStatus_eBSOptions = Lens.lens (\DomainStatus' {eBSOptions} -> eBSOptions) (\s@DomainStatus' {} a -> s {eBSOptions = a} :: DomainStatus)
+
+-- | Encryption at rest settings for the domain.
+domainStatus_encryptionAtRestOptions :: Lens.Lens' DomainStatus (Prelude.Maybe EncryptionAtRestOptions)
+domainStatus_encryptionAtRestOptions = Lens.lens (\DomainStatus' {encryptionAtRestOptions} -> encryptionAtRestOptions) (\s@DomainStatus' {} a -> s {encryptionAtRestOptions = a} :: DomainStatus)
+
+-- | Domain-specific endpoint used to submit index, search, and data upload
+-- requests to the domain.
+domainStatus_endpoint :: Lens.Lens' DomainStatus (Prelude.Maybe Prelude.Text)
+domainStatus_endpoint = Lens.lens (\DomainStatus' {endpoint} -> endpoint) (\s@DomainStatus' {} a -> s {endpoint = a} :: DomainStatus)
+
+-- | The key-value pair that exists if the OpenSearch Service domain uses VPC
+-- endpoints.. Example @key, value@:
+-- @\'vpc\',\'vpc-endpoint-h2dsd34efgyghrtguk5gt6j2foh4.us-east-1.es.amazonaws.com\'@.
+domainStatus_endpoints :: Lens.Lens' DomainStatus (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+domainStatus_endpoints = Lens.lens (\DomainStatus' {endpoints} -> endpoints) (\s@DomainStatus' {} a -> s {endpoints = a} :: DomainStatus) Prelude.. Lens.mapping Lens.coerced
+
+-- | Version of OpenSearch or Elasticsearch that the domain is running, in
+-- the format @Elasticsearch_X.Y@ or @OpenSearch_X.Y@.
+domainStatus_engineVersion :: Lens.Lens' DomainStatus (Prelude.Maybe Prelude.Text)
+domainStatus_engineVersion = Lens.lens (\DomainStatus' {engineVersion} -> engineVersion) (\s@DomainStatus' {} a -> s {engineVersion = a} :: DomainStatus)
+
+-- | Log publishing options for the domain.
+domainStatus_logPublishingOptions :: Lens.Lens' DomainStatus (Prelude.Maybe (Prelude.HashMap LogType LogPublishingOption))
+domainStatus_logPublishingOptions = Lens.lens (\DomainStatus' {logPublishingOptions} -> logPublishingOptions) (\s@DomainStatus' {} a -> s {logPublishingOptions = a} :: DomainStatus) Prelude.. Lens.mapping Lens.coerced
+
+-- | Whether node-to-node encryption is enabled or disabled.
+domainStatus_nodeToNodeEncryptionOptions :: Lens.Lens' DomainStatus (Prelude.Maybe NodeToNodeEncryptionOptions)
+domainStatus_nodeToNodeEncryptionOptions = Lens.lens (\DomainStatus' {nodeToNodeEncryptionOptions} -> nodeToNodeEncryptionOptions) (\s@DomainStatus' {} a -> s {nodeToNodeEncryptionOptions = a} :: DomainStatus)
+
+-- | The status of the domain configuration. True if OpenSearch Service is
+-- processing configuration changes. False if the configuration is active.
+domainStatus_processing :: Lens.Lens' DomainStatus (Prelude.Maybe Prelude.Bool)
+domainStatus_processing = Lens.lens (\DomainStatus' {processing} -> processing) (\s@DomainStatus' {} a -> s {processing = a} :: DomainStatus)
+
+-- | The current status of the domain\'s service software.
+domainStatus_serviceSoftwareOptions :: Lens.Lens' DomainStatus (Prelude.Maybe ServiceSoftwareOptions)
+domainStatus_serviceSoftwareOptions = Lens.lens (\DomainStatus' {serviceSoftwareOptions} -> serviceSoftwareOptions) (\s@DomainStatus' {} a -> s {serviceSoftwareOptions = a} :: DomainStatus)
+
+-- | DEPRECATED. Container for parameters required to configure automated
+-- snapshots of domain indexes.
+domainStatus_snapshotOptions :: Lens.Lens' DomainStatus (Prelude.Maybe SnapshotOptions)
+domainStatus_snapshotOptions = Lens.lens (\DomainStatus' {snapshotOptions} -> snapshotOptions) (\s@DomainStatus' {} a -> s {snapshotOptions = a} :: DomainStatus)
+
+-- | The status of a domain version upgrade to a new version of OpenSearch or
+-- Elasticsearch. True if OpenSearch Service is in the process of a version
+-- upgrade. False if the configuration is active.
+domainStatus_upgradeProcessing :: Lens.Lens' DomainStatus (Prelude.Maybe Prelude.Bool)
+domainStatus_upgradeProcessing = Lens.lens (\DomainStatus' {upgradeProcessing} -> upgradeProcessing) (\s@DomainStatus' {} a -> s {upgradeProcessing = a} :: DomainStatus)
+
+-- | The VPC configuration for the domain.
+domainStatus_vPCOptions :: Lens.Lens' DomainStatus (Prelude.Maybe VPCDerivedInfo)
+domainStatus_vPCOptions = Lens.lens (\DomainStatus' {vPCOptions} -> vPCOptions) (\s@DomainStatus' {} a -> s {vPCOptions = a} :: DomainStatus)
+
+-- | Unique identifier for the domain.
+domainStatus_domainId :: Lens.Lens' DomainStatus Prelude.Text
+domainStatus_domainId = Lens.lens (\DomainStatus' {domainId} -> domainId) (\s@DomainStatus' {} a -> s {domainId = a} :: DomainStatus)
+
+-- | Name of the domain. Domain names are unique across all domains owned by
+-- the same account within an Amazon Web Services Region.
+domainStatus_domainName :: Lens.Lens' DomainStatus Prelude.Text
+domainStatus_domainName = Lens.lens (\DomainStatus' {domainName} -> domainName) (\s@DomainStatus' {} a -> s {domainName = a} :: DomainStatus)
+
+-- | The Amazon Resource Name (ARN) of the domain. For more information, see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html IAM identifiers>
+-- in the /AWS Identity and Access Management User Guide/.
+domainStatus_arn :: Lens.Lens' DomainStatus Prelude.Text
+domainStatus_arn = Lens.lens (\DomainStatus' {arn} -> arn) (\s@DomainStatus' {} a -> s {arn = a} :: DomainStatus)
+
+-- | Container for the cluster configuration of the domain.
+domainStatus_clusterConfig :: Lens.Lens' DomainStatus ClusterConfig
+domainStatus_clusterConfig = Lens.lens (\DomainStatus' {clusterConfig} -> clusterConfig) (\s@DomainStatus' {} a -> s {clusterConfig = a} :: DomainStatus)
+
+instance Data.FromJSON DomainStatus where
+  parseJSON =
+    Data.withObject
+      "DomainStatus"
+      ( \x ->
+          DomainStatus'
+            Prelude.<$> (x Data..:? "AccessPolicies")
+            Prelude.<*> ( x
+                            Data..:? "AdvancedOptions"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "AdvancedSecurityOptions")
+            Prelude.<*> (x Data..:? "AutoTuneOptions")
+            Prelude.<*> (x Data..:? "ChangeProgressDetails")
+            Prelude.<*> (x Data..:? "CognitoOptions")
+            Prelude.<*> (x Data..:? "Created")
+            Prelude.<*> (x Data..:? "Deleted")
+            Prelude.<*> (x Data..:? "DomainEndpointOptions")
+            Prelude.<*> (x Data..:? "EBSOptions")
+            Prelude.<*> (x Data..:? "EncryptionAtRestOptions")
+            Prelude.<*> (x Data..:? "Endpoint")
+            Prelude.<*> (x Data..:? "Endpoints" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "EngineVersion")
+            Prelude.<*> ( x
+                            Data..:? "LogPublishingOptions"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "NodeToNodeEncryptionOptions")
+            Prelude.<*> (x Data..:? "Processing")
+            Prelude.<*> (x Data..:? "ServiceSoftwareOptions")
+            Prelude.<*> (x Data..:? "SnapshotOptions")
+            Prelude.<*> (x Data..:? "UpgradeProcessing")
+            Prelude.<*> (x Data..:? "VPCOptions")
+            Prelude.<*> (x Data..: "DomainId")
+            Prelude.<*> (x Data..: "DomainName")
+            Prelude.<*> (x Data..: "ARN")
+            Prelude.<*> (x Data..: "ClusterConfig")
+      )
+
+instance Prelude.Hashable DomainStatus where
+  hashWithSalt _salt DomainStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` accessPolicies
+      `Prelude.hashWithSalt` advancedOptions
+      `Prelude.hashWithSalt` advancedSecurityOptions
+      `Prelude.hashWithSalt` autoTuneOptions
+      `Prelude.hashWithSalt` changeProgressDetails
+      `Prelude.hashWithSalt` cognitoOptions
+      `Prelude.hashWithSalt` created
+      `Prelude.hashWithSalt` deleted
+      `Prelude.hashWithSalt` domainEndpointOptions
+      `Prelude.hashWithSalt` eBSOptions
+      `Prelude.hashWithSalt` encryptionAtRestOptions
+      `Prelude.hashWithSalt` endpoint
+      `Prelude.hashWithSalt` endpoints
+      `Prelude.hashWithSalt` engineVersion
+      `Prelude.hashWithSalt` logPublishingOptions
+      `Prelude.hashWithSalt` nodeToNodeEncryptionOptions
+      `Prelude.hashWithSalt` processing
+      `Prelude.hashWithSalt` serviceSoftwareOptions
+      `Prelude.hashWithSalt` snapshotOptions
+      `Prelude.hashWithSalt` upgradeProcessing
+      `Prelude.hashWithSalt` vPCOptions
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` domainName
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` clusterConfig
+
+instance Prelude.NFData DomainStatus where
+  rnf DomainStatus' {..} =
+    Prelude.rnf accessPolicies
+      `Prelude.seq` Prelude.rnf advancedOptions
+      `Prelude.seq` Prelude.rnf advancedSecurityOptions
+      `Prelude.seq` Prelude.rnf autoTuneOptions
+      `Prelude.seq` Prelude.rnf changeProgressDetails
+      `Prelude.seq` Prelude.rnf cognitoOptions
+      `Prelude.seq` Prelude.rnf created
+      `Prelude.seq` Prelude.rnf deleted
+      `Prelude.seq` Prelude.rnf domainEndpointOptions
+      `Prelude.seq` Prelude.rnf eBSOptions
+      `Prelude.seq` Prelude.rnf encryptionAtRestOptions
+      `Prelude.seq` Prelude.rnf endpoint
+      `Prelude.seq` Prelude.rnf endpoints
+      `Prelude.seq` Prelude.rnf engineVersion
+      `Prelude.seq` Prelude.rnf logPublishingOptions
+      `Prelude.seq` Prelude.rnf
+        nodeToNodeEncryptionOptions
+      `Prelude.seq` Prelude.rnf processing
+      `Prelude.seq` Prelude.rnf serviceSoftwareOptions
+      `Prelude.seq` Prelude.rnf snapshotOptions
+      `Prelude.seq` Prelude.rnf upgradeProcessing
+      `Prelude.seq` Prelude.rnf vPCOptions
+      `Prelude.seq` Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf domainName
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf
+        clusterConfig
diff --git a/gen/Amazonka/OpenSearch/Types/DryRunResults.hs b/gen/Amazonka/OpenSearch/Types/DryRunResults.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/DryRunResults.hs
@@ -0,0 +1,117 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.DryRunResults
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.DryRunResults where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Results of a dry run performed in an update domain request.
+--
+-- /See:/ 'newDryRunResults' smart constructor.
+data DryRunResults = DryRunResults'
+  { -- | Specifies the way in which OpenSearch Service will apply an update.
+    -- Possible values are:
+    --
+    -- -   __Blue\/Green__ - The update requires a blue\/green deployment.
+    --
+    -- -   __DynamicUpdate__ - No blue\/green deployment required
+    --
+    -- -   __Undetermined__ - The domain is in the middle of an update and
+    --     can\'t predict the deployment type. Try again after the update is
+    --     complete.
+    --
+    -- -   __None__ - The request doesn\'t include any configuration changes.
+    deploymentType :: Prelude.Maybe Prelude.Text,
+    -- | A message corresponding to the deployment type.
+    message :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DryRunResults' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'deploymentType', 'dryRunResults_deploymentType' - Specifies the way in which OpenSearch Service will apply an update.
+-- Possible values are:
+--
+-- -   __Blue\/Green__ - The update requires a blue\/green deployment.
+--
+-- -   __DynamicUpdate__ - No blue\/green deployment required
+--
+-- -   __Undetermined__ - The domain is in the middle of an update and
+--     can\'t predict the deployment type. Try again after the update is
+--     complete.
+--
+-- -   __None__ - The request doesn\'t include any configuration changes.
+--
+-- 'message', 'dryRunResults_message' - A message corresponding to the deployment type.
+newDryRunResults ::
+  DryRunResults
+newDryRunResults =
+  DryRunResults'
+    { deploymentType = Prelude.Nothing,
+      message = Prelude.Nothing
+    }
+
+-- | Specifies the way in which OpenSearch Service will apply an update.
+-- Possible values are:
+--
+-- -   __Blue\/Green__ - The update requires a blue\/green deployment.
+--
+-- -   __DynamicUpdate__ - No blue\/green deployment required
+--
+-- -   __Undetermined__ - The domain is in the middle of an update and
+--     can\'t predict the deployment type. Try again after the update is
+--     complete.
+--
+-- -   __None__ - The request doesn\'t include any configuration changes.
+dryRunResults_deploymentType :: Lens.Lens' DryRunResults (Prelude.Maybe Prelude.Text)
+dryRunResults_deploymentType = Lens.lens (\DryRunResults' {deploymentType} -> deploymentType) (\s@DryRunResults' {} a -> s {deploymentType = a} :: DryRunResults)
+
+-- | A message corresponding to the deployment type.
+dryRunResults_message :: Lens.Lens' DryRunResults (Prelude.Maybe Prelude.Text)
+dryRunResults_message = Lens.lens (\DryRunResults' {message} -> message) (\s@DryRunResults' {} a -> s {message = a} :: DryRunResults)
+
+instance Data.FromJSON DryRunResults where
+  parseJSON =
+    Data.withObject
+      "DryRunResults"
+      ( \x ->
+          DryRunResults'
+            Prelude.<$> (x Data..:? "DeploymentType")
+            Prelude.<*> (x Data..:? "Message")
+      )
+
+instance Prelude.Hashable DryRunResults where
+  hashWithSalt _salt DryRunResults' {..} =
+    _salt
+      `Prelude.hashWithSalt` deploymentType
+      `Prelude.hashWithSalt` message
+
+instance Prelude.NFData DryRunResults where
+  rnf DryRunResults' {..} =
+    Prelude.rnf deploymentType
+      `Prelude.seq` Prelude.rnf message
diff --git a/gen/Amazonka/OpenSearch/Types/Duration.hs b/gen/Amazonka/OpenSearch/Types/Duration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/Duration.hs
@@ -0,0 +1,94 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.Duration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.Duration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.TimeUnit
+import qualified Amazonka.Prelude as Prelude
+
+-- | The duration of a maintenance schedule. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/auto-tune.html Auto-Tune for Amazon OpenSearch Service>.
+--
+-- /See:/ 'newDuration' smart constructor.
+data Duration = Duration'
+  { -- | The unit of measurement for the duration of a maintenance schedule.
+    unit :: Prelude.Maybe TimeUnit,
+    -- | Integer to specify the value of a maintenance schedule duration.
+    value :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Duration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'unit', 'duration_unit' - The unit of measurement for the duration of a maintenance schedule.
+--
+-- 'value', 'duration_value' - Integer to specify the value of a maintenance schedule duration.
+newDuration ::
+  Duration
+newDuration =
+  Duration'
+    { unit = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | The unit of measurement for the duration of a maintenance schedule.
+duration_unit :: Lens.Lens' Duration (Prelude.Maybe TimeUnit)
+duration_unit = Lens.lens (\Duration' {unit} -> unit) (\s@Duration' {} a -> s {unit = a} :: Duration)
+
+-- | Integer to specify the value of a maintenance schedule duration.
+duration_value :: Lens.Lens' Duration (Prelude.Maybe Prelude.Natural)
+duration_value = Lens.lens (\Duration' {value} -> value) (\s@Duration' {} a -> s {value = a} :: Duration)
+
+instance Data.FromJSON Duration where
+  parseJSON =
+    Data.withObject
+      "Duration"
+      ( \x ->
+          Duration'
+            Prelude.<$> (x Data..:? "Unit")
+            Prelude.<*> (x Data..:? "Value")
+      )
+
+instance Prelude.Hashable Duration where
+  hashWithSalt _salt Duration' {..} =
+    _salt
+      `Prelude.hashWithSalt` unit
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Duration where
+  rnf Duration' {..} =
+    Prelude.rnf unit `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON Duration where
+  toJSON Duration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Unit" Data..=) Prelude.<$> unit,
+            ("Value" Data..=) Prelude.<$> value
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/EBSOptions.hs b/gen/Amazonka/OpenSearch/Types/EBSOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/EBSOptions.hs
@@ -0,0 +1,146 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.EBSOptions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.EBSOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.VolumeType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Container for the parameters required to enable EBS-based storage for an
+-- OpenSearch Service domain.
+--
+-- /See:/ 'newEBSOptions' smart constructor.
+data EBSOptions = EBSOptions'
+  { -- | Indicates whether EBS volumes are attached to data nodes in an
+    -- OpenSearch Service domain.
+    eBSEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | Specifies the baseline input\/output (I\/O) performance of EBS volumes
+    -- attached to data nodes. Applicable only for the @gp3@ and provisioned
+    -- IOPS EBS volume types.
+    iops :: Prelude.Maybe Prelude.Int,
+    -- | Specifies the throughput (in MiB\/s) of the EBS volumes attached to data
+    -- nodes. Applicable only for the @gp3@ volume type.
+    throughput :: Prelude.Maybe Prelude.Int,
+    -- | Specifies the size (in GiB) of EBS volumes attached to data nodes.
+    volumeSize :: Prelude.Maybe Prelude.Int,
+    -- | Specifies the type of EBS volumes attached to data nodes.
+    volumeType :: Prelude.Maybe VolumeType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EBSOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'eBSEnabled', 'eBSOptions_eBSEnabled' - Indicates whether EBS volumes are attached to data nodes in an
+-- OpenSearch Service domain.
+--
+-- 'iops', 'eBSOptions_iops' - Specifies the baseline input\/output (I\/O) performance of EBS volumes
+-- attached to data nodes. Applicable only for the @gp3@ and provisioned
+-- IOPS EBS volume types.
+--
+-- 'throughput', 'eBSOptions_throughput' - Specifies the throughput (in MiB\/s) of the EBS volumes attached to data
+-- nodes. Applicable only for the @gp3@ volume type.
+--
+-- 'volumeSize', 'eBSOptions_volumeSize' - Specifies the size (in GiB) of EBS volumes attached to data nodes.
+--
+-- 'volumeType', 'eBSOptions_volumeType' - Specifies the type of EBS volumes attached to data nodes.
+newEBSOptions ::
+  EBSOptions
+newEBSOptions =
+  EBSOptions'
+    { eBSEnabled = Prelude.Nothing,
+      iops = Prelude.Nothing,
+      throughput = Prelude.Nothing,
+      volumeSize = Prelude.Nothing,
+      volumeType = Prelude.Nothing
+    }
+
+-- | Indicates whether EBS volumes are attached to data nodes in an
+-- OpenSearch Service domain.
+eBSOptions_eBSEnabled :: Lens.Lens' EBSOptions (Prelude.Maybe Prelude.Bool)
+eBSOptions_eBSEnabled = Lens.lens (\EBSOptions' {eBSEnabled} -> eBSEnabled) (\s@EBSOptions' {} a -> s {eBSEnabled = a} :: EBSOptions)
+
+-- | Specifies the baseline input\/output (I\/O) performance of EBS volumes
+-- attached to data nodes. Applicable only for the @gp3@ and provisioned
+-- IOPS EBS volume types.
+eBSOptions_iops :: Lens.Lens' EBSOptions (Prelude.Maybe Prelude.Int)
+eBSOptions_iops = Lens.lens (\EBSOptions' {iops} -> iops) (\s@EBSOptions' {} a -> s {iops = a} :: EBSOptions)
+
+-- | Specifies the throughput (in MiB\/s) of the EBS volumes attached to data
+-- nodes. Applicable only for the @gp3@ volume type.
+eBSOptions_throughput :: Lens.Lens' EBSOptions (Prelude.Maybe Prelude.Int)
+eBSOptions_throughput = Lens.lens (\EBSOptions' {throughput} -> throughput) (\s@EBSOptions' {} a -> s {throughput = a} :: EBSOptions)
+
+-- | Specifies the size (in GiB) of EBS volumes attached to data nodes.
+eBSOptions_volumeSize :: Lens.Lens' EBSOptions (Prelude.Maybe Prelude.Int)
+eBSOptions_volumeSize = Lens.lens (\EBSOptions' {volumeSize} -> volumeSize) (\s@EBSOptions' {} a -> s {volumeSize = a} :: EBSOptions)
+
+-- | Specifies the type of EBS volumes attached to data nodes.
+eBSOptions_volumeType :: Lens.Lens' EBSOptions (Prelude.Maybe VolumeType)
+eBSOptions_volumeType = Lens.lens (\EBSOptions' {volumeType} -> volumeType) (\s@EBSOptions' {} a -> s {volumeType = a} :: EBSOptions)
+
+instance Data.FromJSON EBSOptions where
+  parseJSON =
+    Data.withObject
+      "EBSOptions"
+      ( \x ->
+          EBSOptions'
+            Prelude.<$> (x Data..:? "EBSEnabled")
+            Prelude.<*> (x Data..:? "Iops")
+            Prelude.<*> (x Data..:? "Throughput")
+            Prelude.<*> (x Data..:? "VolumeSize")
+            Prelude.<*> (x Data..:? "VolumeType")
+      )
+
+instance Prelude.Hashable EBSOptions where
+  hashWithSalt _salt EBSOptions' {..} =
+    _salt
+      `Prelude.hashWithSalt` eBSEnabled
+      `Prelude.hashWithSalt` iops
+      `Prelude.hashWithSalt` throughput
+      `Prelude.hashWithSalt` volumeSize
+      `Prelude.hashWithSalt` volumeType
+
+instance Prelude.NFData EBSOptions where
+  rnf EBSOptions' {..} =
+    Prelude.rnf eBSEnabled
+      `Prelude.seq` Prelude.rnf iops
+      `Prelude.seq` Prelude.rnf throughput
+      `Prelude.seq` Prelude.rnf volumeSize
+      `Prelude.seq` Prelude.rnf volumeType
+
+instance Data.ToJSON EBSOptions where
+  toJSON EBSOptions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("EBSEnabled" Data..=) Prelude.<$> eBSEnabled,
+            ("Iops" Data..=) Prelude.<$> iops,
+            ("Throughput" Data..=) Prelude.<$> throughput,
+            ("VolumeSize" Data..=) Prelude.<$> volumeSize,
+            ("VolumeType" Data..=) Prelude.<$> volumeType
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/EBSOptionsStatus.hs b/gen/Amazonka/OpenSearch/Types/EBSOptionsStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/EBSOptionsStatus.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.EBSOptionsStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.EBSOptionsStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.EBSOptions
+import Amazonka.OpenSearch.Types.OptionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The status of the EBS options for the specified OpenSearch Service
+-- domain.
+--
+-- /See:/ 'newEBSOptionsStatus' smart constructor.
+data EBSOptionsStatus = EBSOptionsStatus'
+  { -- | The configured EBS options for the specified domain.
+    options :: EBSOptions,
+    -- | The status of the EBS options for the specified domain.
+    status :: OptionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EBSOptionsStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'options', 'eBSOptionsStatus_options' - The configured EBS options for the specified domain.
+--
+-- 'status', 'eBSOptionsStatus_status' - The status of the EBS options for the specified domain.
+newEBSOptionsStatus ::
+  -- | 'options'
+  EBSOptions ->
+  -- | 'status'
+  OptionStatus ->
+  EBSOptionsStatus
+newEBSOptionsStatus pOptions_ pStatus_ =
+  EBSOptionsStatus'
+    { options = pOptions_,
+      status = pStatus_
+    }
+
+-- | The configured EBS options for the specified domain.
+eBSOptionsStatus_options :: Lens.Lens' EBSOptionsStatus EBSOptions
+eBSOptionsStatus_options = Lens.lens (\EBSOptionsStatus' {options} -> options) (\s@EBSOptionsStatus' {} a -> s {options = a} :: EBSOptionsStatus)
+
+-- | The status of the EBS options for the specified domain.
+eBSOptionsStatus_status :: Lens.Lens' EBSOptionsStatus OptionStatus
+eBSOptionsStatus_status = Lens.lens (\EBSOptionsStatus' {status} -> status) (\s@EBSOptionsStatus' {} a -> s {status = a} :: EBSOptionsStatus)
+
+instance Data.FromJSON EBSOptionsStatus where
+  parseJSON =
+    Data.withObject
+      "EBSOptionsStatus"
+      ( \x ->
+          EBSOptionsStatus'
+            Prelude.<$> (x Data..: "Options")
+            Prelude.<*> (x Data..: "Status")
+      )
+
+instance Prelude.Hashable EBSOptionsStatus where
+  hashWithSalt _salt EBSOptionsStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` options
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData EBSOptionsStatus where
+  rnf EBSOptionsStatus' {..} =
+    Prelude.rnf options
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/OpenSearch/Types/EncryptionAtRestOptions.hs b/gen/Amazonka/OpenSearch/Types/EncryptionAtRestOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/EncryptionAtRestOptions.hs
@@ -0,0 +1,95 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.EncryptionAtRestOptions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.EncryptionAtRestOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies whether the domain should encrypt data at rest, and if so, the
+-- Key Management Service (KMS) key to use. Can be used only to create a
+-- new domain, not update an existing one.
+--
+-- /See:/ 'newEncryptionAtRestOptions' smart constructor.
+data EncryptionAtRestOptions = EncryptionAtRestOptions'
+  { -- | True to enable encryption at rest.
+    enabled :: Prelude.Maybe Prelude.Bool,
+    -- | The KMS key ID. Takes the form @1a2a3a4-1a2a-3a4a-5a6a-1a2a3a4a5a6a@.
+    kmsKeyId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EncryptionAtRestOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enabled', 'encryptionAtRestOptions_enabled' - True to enable encryption at rest.
+--
+-- 'kmsKeyId', 'encryptionAtRestOptions_kmsKeyId' - The KMS key ID. Takes the form @1a2a3a4-1a2a-3a4a-5a6a-1a2a3a4a5a6a@.
+newEncryptionAtRestOptions ::
+  EncryptionAtRestOptions
+newEncryptionAtRestOptions =
+  EncryptionAtRestOptions'
+    { enabled = Prelude.Nothing,
+      kmsKeyId = Prelude.Nothing
+    }
+
+-- | True to enable encryption at rest.
+encryptionAtRestOptions_enabled :: Lens.Lens' EncryptionAtRestOptions (Prelude.Maybe Prelude.Bool)
+encryptionAtRestOptions_enabled = Lens.lens (\EncryptionAtRestOptions' {enabled} -> enabled) (\s@EncryptionAtRestOptions' {} a -> s {enabled = a} :: EncryptionAtRestOptions)
+
+-- | The KMS key ID. Takes the form @1a2a3a4-1a2a-3a4a-5a6a-1a2a3a4a5a6a@.
+encryptionAtRestOptions_kmsKeyId :: Lens.Lens' EncryptionAtRestOptions (Prelude.Maybe Prelude.Text)
+encryptionAtRestOptions_kmsKeyId = Lens.lens (\EncryptionAtRestOptions' {kmsKeyId} -> kmsKeyId) (\s@EncryptionAtRestOptions' {} a -> s {kmsKeyId = a} :: EncryptionAtRestOptions)
+
+instance Data.FromJSON EncryptionAtRestOptions where
+  parseJSON =
+    Data.withObject
+      "EncryptionAtRestOptions"
+      ( \x ->
+          EncryptionAtRestOptions'
+            Prelude.<$> (x Data..:? "Enabled")
+            Prelude.<*> (x Data..:? "KmsKeyId")
+      )
+
+instance Prelude.Hashable EncryptionAtRestOptions where
+  hashWithSalt _salt EncryptionAtRestOptions' {..} =
+    _salt
+      `Prelude.hashWithSalt` enabled
+      `Prelude.hashWithSalt` kmsKeyId
+
+instance Prelude.NFData EncryptionAtRestOptions where
+  rnf EncryptionAtRestOptions' {..} =
+    Prelude.rnf enabled
+      `Prelude.seq` Prelude.rnf kmsKeyId
+
+instance Data.ToJSON EncryptionAtRestOptions where
+  toJSON EncryptionAtRestOptions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Enabled" Data..=) Prelude.<$> enabled,
+            ("KmsKeyId" Data..=) Prelude.<$> kmsKeyId
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/EncryptionAtRestOptionsStatus.hs b/gen/Amazonka/OpenSearch/Types/EncryptionAtRestOptionsStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/EncryptionAtRestOptionsStatus.hs
@@ -0,0 +1,94 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.EncryptionAtRestOptionsStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.EncryptionAtRestOptionsStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.EncryptionAtRestOptions
+import Amazonka.OpenSearch.Types.OptionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Status of the encryption at rest options for the specified OpenSearch
+-- Service domain.
+--
+-- /See:/ 'newEncryptionAtRestOptionsStatus' smart constructor.
+data EncryptionAtRestOptionsStatus = EncryptionAtRestOptionsStatus'
+  { -- | Encryption at rest options for the specified domain.
+    options :: EncryptionAtRestOptions,
+    -- | The status of the encryption at rest options for the specified domain.
+    status :: OptionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EncryptionAtRestOptionsStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'options', 'encryptionAtRestOptionsStatus_options' - Encryption at rest options for the specified domain.
+--
+-- 'status', 'encryptionAtRestOptionsStatus_status' - The status of the encryption at rest options for the specified domain.
+newEncryptionAtRestOptionsStatus ::
+  -- | 'options'
+  EncryptionAtRestOptions ->
+  -- | 'status'
+  OptionStatus ->
+  EncryptionAtRestOptionsStatus
+newEncryptionAtRestOptionsStatus pOptions_ pStatus_ =
+  EncryptionAtRestOptionsStatus'
+    { options = pOptions_,
+      status = pStatus_
+    }
+
+-- | Encryption at rest options for the specified domain.
+encryptionAtRestOptionsStatus_options :: Lens.Lens' EncryptionAtRestOptionsStatus EncryptionAtRestOptions
+encryptionAtRestOptionsStatus_options = Lens.lens (\EncryptionAtRestOptionsStatus' {options} -> options) (\s@EncryptionAtRestOptionsStatus' {} a -> s {options = a} :: EncryptionAtRestOptionsStatus)
+
+-- | The status of the encryption at rest options for the specified domain.
+encryptionAtRestOptionsStatus_status :: Lens.Lens' EncryptionAtRestOptionsStatus OptionStatus
+encryptionAtRestOptionsStatus_status = Lens.lens (\EncryptionAtRestOptionsStatus' {status} -> status) (\s@EncryptionAtRestOptionsStatus' {} a -> s {status = a} :: EncryptionAtRestOptionsStatus)
+
+instance Data.FromJSON EncryptionAtRestOptionsStatus where
+  parseJSON =
+    Data.withObject
+      "EncryptionAtRestOptionsStatus"
+      ( \x ->
+          EncryptionAtRestOptionsStatus'
+            Prelude.<$> (x Data..: "Options")
+            Prelude.<*> (x Data..: "Status")
+      )
+
+instance
+  Prelude.Hashable
+    EncryptionAtRestOptionsStatus
+  where
+  hashWithSalt _salt EncryptionAtRestOptionsStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` options
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData EncryptionAtRestOptionsStatus where
+  rnf EncryptionAtRestOptionsStatus' {..} =
+    Prelude.rnf options
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/OpenSearch/Types/EngineType.hs b/gen/Amazonka/OpenSearch/Types/EngineType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/EngineType.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.EngineType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.EngineType
+  ( EngineType
+      ( ..,
+        EngineType_Elasticsearch,
+        EngineType_OpenSearch
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EngineType = EngineType'
+  { fromEngineType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern EngineType_Elasticsearch :: EngineType
+pattern EngineType_Elasticsearch = EngineType' "Elasticsearch"
+
+pattern EngineType_OpenSearch :: EngineType
+pattern EngineType_OpenSearch = EngineType' "OpenSearch"
+
+{-# COMPLETE
+  EngineType_Elasticsearch,
+  EngineType_OpenSearch,
+  EngineType'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/ErrorDetails.hs b/gen/Amazonka/OpenSearch/Types/ErrorDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/ErrorDetails.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.ErrorDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.ErrorDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Additional information if the package is in an error state. Null
+-- otherwise.
+--
+-- /See:/ 'newErrorDetails' smart constructor.
+data ErrorDetails = ErrorDetails'
+  { -- | A message describing the error.
+    errorMessage :: Prelude.Maybe Prelude.Text,
+    -- | The type of error that occurred.
+    errorType :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ErrorDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorMessage', 'errorDetails_errorMessage' - A message describing the error.
+--
+-- 'errorType', 'errorDetails_errorType' - The type of error that occurred.
+newErrorDetails ::
+  ErrorDetails
+newErrorDetails =
+  ErrorDetails'
+    { errorMessage = Prelude.Nothing,
+      errorType = Prelude.Nothing
+    }
+
+-- | A message describing the error.
+errorDetails_errorMessage :: Lens.Lens' ErrorDetails (Prelude.Maybe Prelude.Text)
+errorDetails_errorMessage = Lens.lens (\ErrorDetails' {errorMessage} -> errorMessage) (\s@ErrorDetails' {} a -> s {errorMessage = a} :: ErrorDetails)
+
+-- | The type of error that occurred.
+errorDetails_errorType :: Lens.Lens' ErrorDetails (Prelude.Maybe Prelude.Text)
+errorDetails_errorType = Lens.lens (\ErrorDetails' {errorType} -> errorType) (\s@ErrorDetails' {} a -> s {errorType = a} :: ErrorDetails)
+
+instance Data.FromJSON ErrorDetails where
+  parseJSON =
+    Data.withObject
+      "ErrorDetails"
+      ( \x ->
+          ErrorDetails'
+            Prelude.<$> (x Data..:? "ErrorMessage")
+            Prelude.<*> (x Data..:? "ErrorType")
+      )
+
+instance Prelude.Hashable ErrorDetails where
+  hashWithSalt _salt ErrorDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` errorMessage
+      `Prelude.hashWithSalt` errorType
+
+instance Prelude.NFData ErrorDetails where
+  rnf ErrorDetails' {..} =
+    Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf errorType
diff --git a/gen/Amazonka/OpenSearch/Types/Filter.hs b/gen/Amazonka/OpenSearch/Types/Filter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/Filter.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.Filter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.Filter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A filter used to limit results when describing inbound or outbound
+-- cross-cluster connections. You can specify multiple values per filter. A
+-- cross-cluster connection must match at least one of the specified values
+-- for it to be returned from an operation.
+--
+-- /See:/ 'newFilter' smart constructor.
+data Filter = Filter'
+  { -- | The name of the filter.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | One or more values for the filter.
+    values :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Filter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'filter_name' - The name of the filter.
+--
+-- 'values', 'filter_values' - One or more values for the filter.
+newFilter ::
+  Filter
+newFilter =
+  Filter'
+    { name = Prelude.Nothing,
+      values = Prelude.Nothing
+    }
+
+-- | The name of the filter.
+filter_name :: Lens.Lens' Filter (Prelude.Maybe Prelude.Text)
+filter_name = Lens.lens (\Filter' {name} -> name) (\s@Filter' {} a -> s {name = a} :: Filter)
+
+-- | One or more values for the filter.
+filter_values :: Lens.Lens' Filter (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+filter_values = Lens.lens (\Filter' {values} -> values) (\s@Filter' {} a -> s {values = a} :: Filter) Prelude.. Lens.mapping Lens.coerced
+
+instance Prelude.Hashable Filter where
+  hashWithSalt _salt Filter' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` values
+
+instance Prelude.NFData Filter where
+  rnf Filter' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf values
+
+instance Data.ToJSON Filter where
+  toJSON Filter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Name" Data..=) Prelude.<$> name,
+            ("Values" Data..=) Prelude.<$> values
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/InboundConnection.hs b/gen/Amazonka/OpenSearch/Types/InboundConnection.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/InboundConnection.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.InboundConnection
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.InboundConnection where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.DomainInformationContainer
+import Amazonka.OpenSearch.Types.InboundConnectionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes an inbound cross-cluster connection for Amazon OpenSearch
+-- Service. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/cross-cluster-search.html Cross-cluster search for Amazon OpenSearch Service>.
+--
+-- /See:/ 'newInboundConnection' smart constructor.
+data InboundConnection = InboundConnection'
+  { -- | The unique identifier of the connection.
+    connectionId :: Prelude.Maybe Prelude.Text,
+    -- | The current status of the connection.
+    connectionStatus :: Prelude.Maybe InboundConnectionStatus,
+    -- | Information about the source (local) domain.
+    localDomainInfo :: Prelude.Maybe DomainInformationContainer,
+    -- | Information about the destination (remote) domain.
+    remoteDomainInfo :: Prelude.Maybe DomainInformationContainer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InboundConnection' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connectionId', 'inboundConnection_connectionId' - The unique identifier of the connection.
+--
+-- 'connectionStatus', 'inboundConnection_connectionStatus' - The current status of the connection.
+--
+-- 'localDomainInfo', 'inboundConnection_localDomainInfo' - Information about the source (local) domain.
+--
+-- 'remoteDomainInfo', 'inboundConnection_remoteDomainInfo' - Information about the destination (remote) domain.
+newInboundConnection ::
+  InboundConnection
+newInboundConnection =
+  InboundConnection'
+    { connectionId = Prelude.Nothing,
+      connectionStatus = Prelude.Nothing,
+      localDomainInfo = Prelude.Nothing,
+      remoteDomainInfo = Prelude.Nothing
+    }
+
+-- | The unique identifier of the connection.
+inboundConnection_connectionId :: Lens.Lens' InboundConnection (Prelude.Maybe Prelude.Text)
+inboundConnection_connectionId = Lens.lens (\InboundConnection' {connectionId} -> connectionId) (\s@InboundConnection' {} a -> s {connectionId = a} :: InboundConnection)
+
+-- | The current status of the connection.
+inboundConnection_connectionStatus :: Lens.Lens' InboundConnection (Prelude.Maybe InboundConnectionStatus)
+inboundConnection_connectionStatus = Lens.lens (\InboundConnection' {connectionStatus} -> connectionStatus) (\s@InboundConnection' {} a -> s {connectionStatus = a} :: InboundConnection)
+
+-- | Information about the source (local) domain.
+inboundConnection_localDomainInfo :: Lens.Lens' InboundConnection (Prelude.Maybe DomainInformationContainer)
+inboundConnection_localDomainInfo = Lens.lens (\InboundConnection' {localDomainInfo} -> localDomainInfo) (\s@InboundConnection' {} a -> s {localDomainInfo = a} :: InboundConnection)
+
+-- | Information about the destination (remote) domain.
+inboundConnection_remoteDomainInfo :: Lens.Lens' InboundConnection (Prelude.Maybe DomainInformationContainer)
+inboundConnection_remoteDomainInfo = Lens.lens (\InboundConnection' {remoteDomainInfo} -> remoteDomainInfo) (\s@InboundConnection' {} a -> s {remoteDomainInfo = a} :: InboundConnection)
+
+instance Data.FromJSON InboundConnection where
+  parseJSON =
+    Data.withObject
+      "InboundConnection"
+      ( \x ->
+          InboundConnection'
+            Prelude.<$> (x Data..:? "ConnectionId")
+            Prelude.<*> (x Data..:? "ConnectionStatus")
+            Prelude.<*> (x Data..:? "LocalDomainInfo")
+            Prelude.<*> (x Data..:? "RemoteDomainInfo")
+      )
+
+instance Prelude.Hashable InboundConnection where
+  hashWithSalt _salt InboundConnection' {..} =
+    _salt
+      `Prelude.hashWithSalt` connectionId
+      `Prelude.hashWithSalt` connectionStatus
+      `Prelude.hashWithSalt` localDomainInfo
+      `Prelude.hashWithSalt` remoteDomainInfo
+
+instance Prelude.NFData InboundConnection where
+  rnf InboundConnection' {..} =
+    Prelude.rnf connectionId
+      `Prelude.seq` Prelude.rnf connectionStatus
+      `Prelude.seq` Prelude.rnf localDomainInfo
+      `Prelude.seq` Prelude.rnf remoteDomainInfo
diff --git a/gen/Amazonka/OpenSearch/Types/InboundConnectionStatus.hs b/gen/Amazonka/OpenSearch/Types/InboundConnectionStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/InboundConnectionStatus.hs
@@ -0,0 +1,143 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.InboundConnectionStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.InboundConnectionStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.InboundConnectionStatusCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | The status of an inbound cross-cluster connection for OpenSearch
+-- Service.
+--
+-- /See:/ 'newInboundConnectionStatus' smart constructor.
+data InboundConnectionStatus = InboundConnectionStatus'
+  { -- | Information about the connection.
+    message :: Prelude.Maybe Prelude.Text,
+    -- | The status code for the connection. Can be one of the following:
+    --
+    -- -   __PENDING_ACCEPTANCE__ - Inbound connection is not yet accepted by
+    --     the remote domain owner.
+    --
+    -- -   __APPROVED__: Inbound connection is pending acceptance by the remote
+    --     domain owner.
+    --
+    -- -   __PROVISIONING__: Inbound connection is being provisioned.
+    --
+    -- -   __ACTIVE__: Inbound connection is active and ready to use.
+    --
+    -- -   __REJECTING__: Inbound connection rejection is in process.
+    --
+    -- -   __REJECTED__: Inbound connection is rejected.
+    --
+    -- -   __DELETING__: Inbound connection deletion is in progress.
+    --
+    -- -   __DELETED__: Inbound connection is deleted and can no longer be
+    --     used.
+    statusCode :: Prelude.Maybe InboundConnectionStatusCode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InboundConnectionStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'message', 'inboundConnectionStatus_message' - Information about the connection.
+--
+-- 'statusCode', 'inboundConnectionStatus_statusCode' - The status code for the connection. Can be one of the following:
+--
+-- -   __PENDING_ACCEPTANCE__ - Inbound connection is not yet accepted by
+--     the remote domain owner.
+--
+-- -   __APPROVED__: Inbound connection is pending acceptance by the remote
+--     domain owner.
+--
+-- -   __PROVISIONING__: Inbound connection is being provisioned.
+--
+-- -   __ACTIVE__: Inbound connection is active and ready to use.
+--
+-- -   __REJECTING__: Inbound connection rejection is in process.
+--
+-- -   __REJECTED__: Inbound connection is rejected.
+--
+-- -   __DELETING__: Inbound connection deletion is in progress.
+--
+-- -   __DELETED__: Inbound connection is deleted and can no longer be
+--     used.
+newInboundConnectionStatus ::
+  InboundConnectionStatus
+newInboundConnectionStatus =
+  InboundConnectionStatus'
+    { message = Prelude.Nothing,
+      statusCode = Prelude.Nothing
+    }
+
+-- | Information about the connection.
+inboundConnectionStatus_message :: Lens.Lens' InboundConnectionStatus (Prelude.Maybe Prelude.Text)
+inboundConnectionStatus_message = Lens.lens (\InboundConnectionStatus' {message} -> message) (\s@InboundConnectionStatus' {} a -> s {message = a} :: InboundConnectionStatus)
+
+-- | The status code for the connection. Can be one of the following:
+--
+-- -   __PENDING_ACCEPTANCE__ - Inbound connection is not yet accepted by
+--     the remote domain owner.
+--
+-- -   __APPROVED__: Inbound connection is pending acceptance by the remote
+--     domain owner.
+--
+-- -   __PROVISIONING__: Inbound connection is being provisioned.
+--
+-- -   __ACTIVE__: Inbound connection is active and ready to use.
+--
+-- -   __REJECTING__: Inbound connection rejection is in process.
+--
+-- -   __REJECTED__: Inbound connection is rejected.
+--
+-- -   __DELETING__: Inbound connection deletion is in progress.
+--
+-- -   __DELETED__: Inbound connection is deleted and can no longer be
+--     used.
+inboundConnectionStatus_statusCode :: Lens.Lens' InboundConnectionStatus (Prelude.Maybe InboundConnectionStatusCode)
+inboundConnectionStatus_statusCode = Lens.lens (\InboundConnectionStatus' {statusCode} -> statusCode) (\s@InboundConnectionStatus' {} a -> s {statusCode = a} :: InboundConnectionStatus)
+
+instance Data.FromJSON InboundConnectionStatus where
+  parseJSON =
+    Data.withObject
+      "InboundConnectionStatus"
+      ( \x ->
+          InboundConnectionStatus'
+            Prelude.<$> (x Data..:? "Message")
+            Prelude.<*> (x Data..:? "StatusCode")
+      )
+
+instance Prelude.Hashable InboundConnectionStatus where
+  hashWithSalt _salt InboundConnectionStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` message
+      `Prelude.hashWithSalt` statusCode
+
+instance Prelude.NFData InboundConnectionStatus where
+  rnf InboundConnectionStatus' {..} =
+    Prelude.rnf message
+      `Prelude.seq` Prelude.rnf statusCode
diff --git a/gen/Amazonka/OpenSearch/Types/InboundConnectionStatusCode.hs b/gen/Amazonka/OpenSearch/Types/InboundConnectionStatusCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/InboundConnectionStatusCode.hs
@@ -0,0 +1,101 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.InboundConnectionStatusCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.InboundConnectionStatusCode
+  ( InboundConnectionStatusCode
+      ( ..,
+        InboundConnectionStatusCode_ACTIVE,
+        InboundConnectionStatusCode_APPROVED,
+        InboundConnectionStatusCode_DELETED,
+        InboundConnectionStatusCode_DELETING,
+        InboundConnectionStatusCode_PENDING_ACCEPTANCE,
+        InboundConnectionStatusCode_PROVISIONING,
+        InboundConnectionStatusCode_REJECTED,
+        InboundConnectionStatusCode_REJECTING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype InboundConnectionStatusCode = InboundConnectionStatusCode'
+  { fromInboundConnectionStatusCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern InboundConnectionStatusCode_ACTIVE :: InboundConnectionStatusCode
+pattern InboundConnectionStatusCode_ACTIVE = InboundConnectionStatusCode' "ACTIVE"
+
+pattern InboundConnectionStatusCode_APPROVED :: InboundConnectionStatusCode
+pattern InboundConnectionStatusCode_APPROVED = InboundConnectionStatusCode' "APPROVED"
+
+pattern InboundConnectionStatusCode_DELETED :: InboundConnectionStatusCode
+pattern InboundConnectionStatusCode_DELETED = InboundConnectionStatusCode' "DELETED"
+
+pattern InboundConnectionStatusCode_DELETING :: InboundConnectionStatusCode
+pattern InboundConnectionStatusCode_DELETING = InboundConnectionStatusCode' "DELETING"
+
+pattern InboundConnectionStatusCode_PENDING_ACCEPTANCE :: InboundConnectionStatusCode
+pattern InboundConnectionStatusCode_PENDING_ACCEPTANCE = InboundConnectionStatusCode' "PENDING_ACCEPTANCE"
+
+pattern InboundConnectionStatusCode_PROVISIONING :: InboundConnectionStatusCode
+pattern InboundConnectionStatusCode_PROVISIONING = InboundConnectionStatusCode' "PROVISIONING"
+
+pattern InboundConnectionStatusCode_REJECTED :: InboundConnectionStatusCode
+pattern InboundConnectionStatusCode_REJECTED = InboundConnectionStatusCode' "REJECTED"
+
+pattern InboundConnectionStatusCode_REJECTING :: InboundConnectionStatusCode
+pattern InboundConnectionStatusCode_REJECTING = InboundConnectionStatusCode' "REJECTING"
+
+{-# COMPLETE
+  InboundConnectionStatusCode_ACTIVE,
+  InboundConnectionStatusCode_APPROVED,
+  InboundConnectionStatusCode_DELETED,
+  InboundConnectionStatusCode_DELETING,
+  InboundConnectionStatusCode_PENDING_ACCEPTANCE,
+  InboundConnectionStatusCode_PROVISIONING,
+  InboundConnectionStatusCode_REJECTED,
+  InboundConnectionStatusCode_REJECTING,
+  InboundConnectionStatusCode'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/InstanceCountLimits.hs b/gen/Amazonka/OpenSearch/Types/InstanceCountLimits.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/InstanceCountLimits.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.InstanceCountLimits
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.InstanceCountLimits where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Limits on the number of instances that can be created in OpenSearch
+-- Service for a given instance type.
+--
+-- /See:/ 'newInstanceCountLimits' smart constructor.
+data InstanceCountLimits = InstanceCountLimits'
+  { -- | The minimum allowed number of instances.
+    maximumInstanceCount :: Prelude.Maybe Prelude.Int,
+    -- | The maximum allowed number of instances.
+    minimumInstanceCount :: Prelude.Maybe Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InstanceCountLimits' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maximumInstanceCount', 'instanceCountLimits_maximumInstanceCount' - The minimum allowed number of instances.
+--
+-- 'minimumInstanceCount', 'instanceCountLimits_minimumInstanceCount' - The maximum allowed number of instances.
+newInstanceCountLimits ::
+  InstanceCountLimits
+newInstanceCountLimits =
+  InstanceCountLimits'
+    { maximumInstanceCount =
+        Prelude.Nothing,
+      minimumInstanceCount = Prelude.Nothing
+    }
+
+-- | The minimum allowed number of instances.
+instanceCountLimits_maximumInstanceCount :: Lens.Lens' InstanceCountLimits (Prelude.Maybe Prelude.Int)
+instanceCountLimits_maximumInstanceCount = Lens.lens (\InstanceCountLimits' {maximumInstanceCount} -> maximumInstanceCount) (\s@InstanceCountLimits' {} a -> s {maximumInstanceCount = a} :: InstanceCountLimits)
+
+-- | The maximum allowed number of instances.
+instanceCountLimits_minimumInstanceCount :: Lens.Lens' InstanceCountLimits (Prelude.Maybe Prelude.Int)
+instanceCountLimits_minimumInstanceCount = Lens.lens (\InstanceCountLimits' {minimumInstanceCount} -> minimumInstanceCount) (\s@InstanceCountLimits' {} a -> s {minimumInstanceCount = a} :: InstanceCountLimits)
+
+instance Data.FromJSON InstanceCountLimits where
+  parseJSON =
+    Data.withObject
+      "InstanceCountLimits"
+      ( \x ->
+          InstanceCountLimits'
+            Prelude.<$> (x Data..:? "MaximumInstanceCount")
+            Prelude.<*> (x Data..:? "MinimumInstanceCount")
+      )
+
+instance Prelude.Hashable InstanceCountLimits where
+  hashWithSalt _salt InstanceCountLimits' {..} =
+    _salt
+      `Prelude.hashWithSalt` maximumInstanceCount
+      `Prelude.hashWithSalt` minimumInstanceCount
+
+instance Prelude.NFData InstanceCountLimits where
+  rnf InstanceCountLimits' {..} =
+    Prelude.rnf maximumInstanceCount
+      `Prelude.seq` Prelude.rnf minimumInstanceCount
diff --git a/gen/Amazonka/OpenSearch/Types/InstanceLimits.hs b/gen/Amazonka/OpenSearch/Types/InstanceLimits.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/InstanceLimits.hs
@@ -0,0 +1,77 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.InstanceLimits
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.InstanceLimits where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.InstanceCountLimits
+import qualified Amazonka.Prelude as Prelude
+
+-- | Instance-related attributes that are available for a given instance
+-- type.
+--
+-- /See:/ 'newInstanceLimits' smart constructor.
+data InstanceLimits = InstanceLimits'
+  { -- | Limits on the number of instances that can be created for a given
+    -- instance type.
+    instanceCountLimits :: Prelude.Maybe InstanceCountLimits
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InstanceLimits' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'instanceCountLimits', 'instanceLimits_instanceCountLimits' - Limits on the number of instances that can be created for a given
+-- instance type.
+newInstanceLimits ::
+  InstanceLimits
+newInstanceLimits =
+  InstanceLimits'
+    { instanceCountLimits =
+        Prelude.Nothing
+    }
+
+-- | Limits on the number of instances that can be created for a given
+-- instance type.
+instanceLimits_instanceCountLimits :: Lens.Lens' InstanceLimits (Prelude.Maybe InstanceCountLimits)
+instanceLimits_instanceCountLimits = Lens.lens (\InstanceLimits' {instanceCountLimits} -> instanceCountLimits) (\s@InstanceLimits' {} a -> s {instanceCountLimits = a} :: InstanceLimits)
+
+instance Data.FromJSON InstanceLimits where
+  parseJSON =
+    Data.withObject
+      "InstanceLimits"
+      ( \x ->
+          InstanceLimits'
+            Prelude.<$> (x Data..:? "InstanceCountLimits")
+      )
+
+instance Prelude.Hashable InstanceLimits where
+  hashWithSalt _salt InstanceLimits' {..} =
+    _salt `Prelude.hashWithSalt` instanceCountLimits
+
+instance Prelude.NFData InstanceLimits where
+  rnf InstanceLimits' {..} =
+    Prelude.rnf instanceCountLimits
diff --git a/gen/Amazonka/OpenSearch/Types/InstanceTypeDetails.hs b/gen/Amazonka/OpenSearch/Types/InstanceTypeDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/InstanceTypeDetails.hs
@@ -0,0 +1,153 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.InstanceTypeDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.InstanceTypeDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.OpenSearchPartitionInstanceType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Lists all instance types and available features for a given OpenSearch
+-- or Elasticsearch version.
+--
+-- /See:/ 'newInstanceTypeDetails' smart constructor.
+data InstanceTypeDetails = InstanceTypeDetails'
+  { -- | Whether fine-grained access control is supported for the instance type.
+    advancedSecurityEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | Whether logging is supported for the instance type.
+    appLogsEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | Whether Amazon Cognito access is supported for the instance type.
+    cognitoEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | Whether encryption at rest and node-to-node encryption are supported for
+    -- the instance type.
+    encryptionEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | Whether the instance acts as a data node, a dedicated master node, or an
+    -- UltraWarm node.
+    instanceRole :: Prelude.Maybe [Prelude.Text],
+    -- | The instance type.
+    instanceType :: Prelude.Maybe OpenSearchPartitionInstanceType,
+    -- | Whether UltraWarm is supported for the instance type.
+    warmEnabled :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InstanceTypeDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'advancedSecurityEnabled', 'instanceTypeDetails_advancedSecurityEnabled' - Whether fine-grained access control is supported for the instance type.
+--
+-- 'appLogsEnabled', 'instanceTypeDetails_appLogsEnabled' - Whether logging is supported for the instance type.
+--
+-- 'cognitoEnabled', 'instanceTypeDetails_cognitoEnabled' - Whether Amazon Cognito access is supported for the instance type.
+--
+-- 'encryptionEnabled', 'instanceTypeDetails_encryptionEnabled' - Whether encryption at rest and node-to-node encryption are supported for
+-- the instance type.
+--
+-- 'instanceRole', 'instanceTypeDetails_instanceRole' - Whether the instance acts as a data node, a dedicated master node, or an
+-- UltraWarm node.
+--
+-- 'instanceType', 'instanceTypeDetails_instanceType' - The instance type.
+--
+-- 'warmEnabled', 'instanceTypeDetails_warmEnabled' - Whether UltraWarm is supported for the instance type.
+newInstanceTypeDetails ::
+  InstanceTypeDetails
+newInstanceTypeDetails =
+  InstanceTypeDetails'
+    { advancedSecurityEnabled =
+        Prelude.Nothing,
+      appLogsEnabled = Prelude.Nothing,
+      cognitoEnabled = Prelude.Nothing,
+      encryptionEnabled = Prelude.Nothing,
+      instanceRole = Prelude.Nothing,
+      instanceType = Prelude.Nothing,
+      warmEnabled = Prelude.Nothing
+    }
+
+-- | Whether fine-grained access control is supported for the instance type.
+instanceTypeDetails_advancedSecurityEnabled :: Lens.Lens' InstanceTypeDetails (Prelude.Maybe Prelude.Bool)
+instanceTypeDetails_advancedSecurityEnabled = Lens.lens (\InstanceTypeDetails' {advancedSecurityEnabled} -> advancedSecurityEnabled) (\s@InstanceTypeDetails' {} a -> s {advancedSecurityEnabled = a} :: InstanceTypeDetails)
+
+-- | Whether logging is supported for the instance type.
+instanceTypeDetails_appLogsEnabled :: Lens.Lens' InstanceTypeDetails (Prelude.Maybe Prelude.Bool)
+instanceTypeDetails_appLogsEnabled = Lens.lens (\InstanceTypeDetails' {appLogsEnabled} -> appLogsEnabled) (\s@InstanceTypeDetails' {} a -> s {appLogsEnabled = a} :: InstanceTypeDetails)
+
+-- | Whether Amazon Cognito access is supported for the instance type.
+instanceTypeDetails_cognitoEnabled :: Lens.Lens' InstanceTypeDetails (Prelude.Maybe Prelude.Bool)
+instanceTypeDetails_cognitoEnabled = Lens.lens (\InstanceTypeDetails' {cognitoEnabled} -> cognitoEnabled) (\s@InstanceTypeDetails' {} a -> s {cognitoEnabled = a} :: InstanceTypeDetails)
+
+-- | Whether encryption at rest and node-to-node encryption are supported for
+-- the instance type.
+instanceTypeDetails_encryptionEnabled :: Lens.Lens' InstanceTypeDetails (Prelude.Maybe Prelude.Bool)
+instanceTypeDetails_encryptionEnabled = Lens.lens (\InstanceTypeDetails' {encryptionEnabled} -> encryptionEnabled) (\s@InstanceTypeDetails' {} a -> s {encryptionEnabled = a} :: InstanceTypeDetails)
+
+-- | Whether the instance acts as a data node, a dedicated master node, or an
+-- UltraWarm node.
+instanceTypeDetails_instanceRole :: Lens.Lens' InstanceTypeDetails (Prelude.Maybe [Prelude.Text])
+instanceTypeDetails_instanceRole = Lens.lens (\InstanceTypeDetails' {instanceRole} -> instanceRole) (\s@InstanceTypeDetails' {} a -> s {instanceRole = a} :: InstanceTypeDetails) Prelude.. Lens.mapping Lens.coerced
+
+-- | The instance type.
+instanceTypeDetails_instanceType :: Lens.Lens' InstanceTypeDetails (Prelude.Maybe OpenSearchPartitionInstanceType)
+instanceTypeDetails_instanceType = Lens.lens (\InstanceTypeDetails' {instanceType} -> instanceType) (\s@InstanceTypeDetails' {} a -> s {instanceType = a} :: InstanceTypeDetails)
+
+-- | Whether UltraWarm is supported for the instance type.
+instanceTypeDetails_warmEnabled :: Lens.Lens' InstanceTypeDetails (Prelude.Maybe Prelude.Bool)
+instanceTypeDetails_warmEnabled = Lens.lens (\InstanceTypeDetails' {warmEnabled} -> warmEnabled) (\s@InstanceTypeDetails' {} a -> s {warmEnabled = a} :: InstanceTypeDetails)
+
+instance Data.FromJSON InstanceTypeDetails where
+  parseJSON =
+    Data.withObject
+      "InstanceTypeDetails"
+      ( \x ->
+          InstanceTypeDetails'
+            Prelude.<$> (x Data..:? "AdvancedSecurityEnabled")
+            Prelude.<*> (x Data..:? "AppLogsEnabled")
+            Prelude.<*> (x Data..:? "CognitoEnabled")
+            Prelude.<*> (x Data..:? "EncryptionEnabled")
+            Prelude.<*> (x Data..:? "InstanceRole" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "InstanceType")
+            Prelude.<*> (x Data..:? "WarmEnabled")
+      )
+
+instance Prelude.Hashable InstanceTypeDetails where
+  hashWithSalt _salt InstanceTypeDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` advancedSecurityEnabled
+      `Prelude.hashWithSalt` appLogsEnabled
+      `Prelude.hashWithSalt` cognitoEnabled
+      `Prelude.hashWithSalt` encryptionEnabled
+      `Prelude.hashWithSalt` instanceRole
+      `Prelude.hashWithSalt` instanceType
+      `Prelude.hashWithSalt` warmEnabled
+
+instance Prelude.NFData InstanceTypeDetails where
+  rnf InstanceTypeDetails' {..} =
+    Prelude.rnf advancedSecurityEnabled
+      `Prelude.seq` Prelude.rnf appLogsEnabled
+      `Prelude.seq` Prelude.rnf cognitoEnabled
+      `Prelude.seq` Prelude.rnf encryptionEnabled
+      `Prelude.seq` Prelude.rnf instanceRole
+      `Prelude.seq` Prelude.rnf instanceType
+      `Prelude.seq` Prelude.rnf warmEnabled
diff --git a/gen/Amazonka/OpenSearch/Types/Limits.hs b/gen/Amazonka/OpenSearch/Types/Limits.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/Limits.hs
@@ -0,0 +1,105 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.Limits
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.Limits where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.AdditionalLimit
+import Amazonka.OpenSearch.Types.InstanceLimits
+import Amazonka.OpenSearch.Types.StorageType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Limits for a given instance type and for each of its roles.
+--
+-- /See:/ 'newLimits' smart constructor.
+data Limits = Limits'
+  { -- | List of additional limits that are specific to a given instance type for
+    -- each of its instance roles.
+    additionalLimits :: Prelude.Maybe [AdditionalLimit],
+    -- | The limits for a given instance type.
+    instanceLimits :: Prelude.Maybe InstanceLimits,
+    -- | Storage-related attributes that are available for a given instance type.
+    storageTypes :: Prelude.Maybe [StorageType]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Limits' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'additionalLimits', 'limits_additionalLimits' - List of additional limits that are specific to a given instance type for
+-- each of its instance roles.
+--
+-- 'instanceLimits', 'limits_instanceLimits' - The limits for a given instance type.
+--
+-- 'storageTypes', 'limits_storageTypes' - Storage-related attributes that are available for a given instance type.
+newLimits ::
+  Limits
+newLimits =
+  Limits'
+    { additionalLimits = Prelude.Nothing,
+      instanceLimits = Prelude.Nothing,
+      storageTypes = Prelude.Nothing
+    }
+
+-- | List of additional limits that are specific to a given instance type for
+-- each of its instance roles.
+limits_additionalLimits :: Lens.Lens' Limits (Prelude.Maybe [AdditionalLimit])
+limits_additionalLimits = Lens.lens (\Limits' {additionalLimits} -> additionalLimits) (\s@Limits' {} a -> s {additionalLimits = a} :: Limits) Prelude.. Lens.mapping Lens.coerced
+
+-- | The limits for a given instance type.
+limits_instanceLimits :: Lens.Lens' Limits (Prelude.Maybe InstanceLimits)
+limits_instanceLimits = Lens.lens (\Limits' {instanceLimits} -> instanceLimits) (\s@Limits' {} a -> s {instanceLimits = a} :: Limits)
+
+-- | Storage-related attributes that are available for a given instance type.
+limits_storageTypes :: Lens.Lens' Limits (Prelude.Maybe [StorageType])
+limits_storageTypes = Lens.lens (\Limits' {storageTypes} -> storageTypes) (\s@Limits' {} a -> s {storageTypes = a} :: Limits) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON Limits where
+  parseJSON =
+    Data.withObject
+      "Limits"
+      ( \x ->
+          Limits'
+            Prelude.<$> ( x
+                            Data..:? "AdditionalLimits"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "InstanceLimits")
+            Prelude.<*> (x Data..:? "StorageTypes" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable Limits where
+  hashWithSalt _salt Limits' {..} =
+    _salt
+      `Prelude.hashWithSalt` additionalLimits
+      `Prelude.hashWithSalt` instanceLimits
+      `Prelude.hashWithSalt` storageTypes
+
+instance Prelude.NFData Limits where
+  rnf Limits' {..} =
+    Prelude.rnf additionalLimits
+      `Prelude.seq` Prelude.rnf instanceLimits
+      `Prelude.seq` Prelude.rnf storageTypes
diff --git a/gen/Amazonka/OpenSearch/Types/LogPublishingOption.hs b/gen/Amazonka/OpenSearch/Types/LogPublishingOption.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/LogPublishingOption.hs
@@ -0,0 +1,104 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.LogPublishingOption
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.LogPublishingOption where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies whether the Amazon OpenSearch Service domain publishes the
+-- OpenSearch application and slow logs to Amazon CloudWatch. For more
+-- information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createdomain-configure-slow-logs.html Monitoring OpenSearch logs with Amazon CloudWatch Logs>.
+--
+-- After you enable log publishing, you still have to enable the collection
+-- of slow logs using the OpenSearch REST API.
+--
+-- /See:/ 'newLogPublishingOption' smart constructor.
+data LogPublishingOption = LogPublishingOption'
+  { -- | The Amazon Resource Name (ARN) of the CloudWatch Logs group to publish
+    -- logs to.
+    cloudWatchLogsLogGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | Whether the log should be published.
+    enabled :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LogPublishingOption' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cloudWatchLogsLogGroupArn', 'logPublishingOption_cloudWatchLogsLogGroupArn' - The Amazon Resource Name (ARN) of the CloudWatch Logs group to publish
+-- logs to.
+--
+-- 'enabled', 'logPublishingOption_enabled' - Whether the log should be published.
+newLogPublishingOption ::
+  LogPublishingOption
+newLogPublishingOption =
+  LogPublishingOption'
+    { cloudWatchLogsLogGroupArn =
+        Prelude.Nothing,
+      enabled = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the CloudWatch Logs group to publish
+-- logs to.
+logPublishingOption_cloudWatchLogsLogGroupArn :: Lens.Lens' LogPublishingOption (Prelude.Maybe Prelude.Text)
+logPublishingOption_cloudWatchLogsLogGroupArn = Lens.lens (\LogPublishingOption' {cloudWatchLogsLogGroupArn} -> cloudWatchLogsLogGroupArn) (\s@LogPublishingOption' {} a -> s {cloudWatchLogsLogGroupArn = a} :: LogPublishingOption)
+
+-- | Whether the log should be published.
+logPublishingOption_enabled :: Lens.Lens' LogPublishingOption (Prelude.Maybe Prelude.Bool)
+logPublishingOption_enabled = Lens.lens (\LogPublishingOption' {enabled} -> enabled) (\s@LogPublishingOption' {} a -> s {enabled = a} :: LogPublishingOption)
+
+instance Data.FromJSON LogPublishingOption where
+  parseJSON =
+    Data.withObject
+      "LogPublishingOption"
+      ( \x ->
+          LogPublishingOption'
+            Prelude.<$> (x Data..:? "CloudWatchLogsLogGroupArn")
+            Prelude.<*> (x Data..:? "Enabled")
+      )
+
+instance Prelude.Hashable LogPublishingOption where
+  hashWithSalt _salt LogPublishingOption' {..} =
+    _salt
+      `Prelude.hashWithSalt` cloudWatchLogsLogGroupArn
+      `Prelude.hashWithSalt` enabled
+
+instance Prelude.NFData LogPublishingOption where
+  rnf LogPublishingOption' {..} =
+    Prelude.rnf cloudWatchLogsLogGroupArn
+      `Prelude.seq` Prelude.rnf enabled
+
+instance Data.ToJSON LogPublishingOption where
+  toJSON LogPublishingOption' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CloudWatchLogsLogGroupArn" Data..=)
+              Prelude.<$> cloudWatchLogsLogGroupArn,
+            ("Enabled" Data..=) Prelude.<$> enabled
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/LogPublishingOptionsStatus.hs b/gen/Amazonka/OpenSearch/Types/LogPublishingOptionsStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/LogPublishingOptionsStatus.hs
@@ -0,0 +1,89 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.LogPublishingOptionsStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.LogPublishingOptionsStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.LogPublishingOption
+import Amazonka.OpenSearch.Types.LogType
+import Amazonka.OpenSearch.Types.OptionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The configured log publishing options for the domain and their current
+-- status.
+--
+-- /See:/ 'newLogPublishingOptionsStatus' smart constructor.
+data LogPublishingOptionsStatus = LogPublishingOptionsStatus'
+  { -- | The log publishing options configured for the domain.
+    options :: Prelude.Maybe (Prelude.HashMap LogType LogPublishingOption),
+    -- | The status of the log publishing options for the domain.
+    status :: Prelude.Maybe OptionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LogPublishingOptionsStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'options', 'logPublishingOptionsStatus_options' - The log publishing options configured for the domain.
+--
+-- 'status', 'logPublishingOptionsStatus_status' - The status of the log publishing options for the domain.
+newLogPublishingOptionsStatus ::
+  LogPublishingOptionsStatus
+newLogPublishingOptionsStatus =
+  LogPublishingOptionsStatus'
+    { options =
+        Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The log publishing options configured for the domain.
+logPublishingOptionsStatus_options :: Lens.Lens' LogPublishingOptionsStatus (Prelude.Maybe (Prelude.HashMap LogType LogPublishingOption))
+logPublishingOptionsStatus_options = Lens.lens (\LogPublishingOptionsStatus' {options} -> options) (\s@LogPublishingOptionsStatus' {} a -> s {options = a} :: LogPublishingOptionsStatus) Prelude.. Lens.mapping Lens.coerced
+
+-- | The status of the log publishing options for the domain.
+logPublishingOptionsStatus_status :: Lens.Lens' LogPublishingOptionsStatus (Prelude.Maybe OptionStatus)
+logPublishingOptionsStatus_status = Lens.lens (\LogPublishingOptionsStatus' {status} -> status) (\s@LogPublishingOptionsStatus' {} a -> s {status = a} :: LogPublishingOptionsStatus)
+
+instance Data.FromJSON LogPublishingOptionsStatus where
+  parseJSON =
+    Data.withObject
+      "LogPublishingOptionsStatus"
+      ( \x ->
+          LogPublishingOptionsStatus'
+            Prelude.<$> (x Data..:? "Options" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "Status")
+      )
+
+instance Prelude.Hashable LogPublishingOptionsStatus where
+  hashWithSalt _salt LogPublishingOptionsStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` options
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData LogPublishingOptionsStatus where
+  rnf LogPublishingOptionsStatus' {..} =
+    Prelude.rnf options
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/OpenSearch/Types/LogType.hs b/gen/Amazonka/OpenSearch/Types/LogType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/LogType.hs
@@ -0,0 +1,94 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.LogType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.LogType
+  ( LogType
+      ( ..,
+        LogType_AUDIT_LOGS,
+        LogType_ES_APPLICATION_LOGS,
+        LogType_INDEX_SLOW_LOGS,
+        LogType_SEARCH_SLOW_LOGS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The type of log file. Can be one of the following:
+--
+-- -   __INDEX_SLOW_LOGS__ - Index slow logs contain insert requests that
+--     took more time than the configured index query log threshold to
+--     execute.
+--
+-- -   __SEARCH_SLOW_LOGS__ - Search slow logs contain search queries that
+--     took more time than the configured search query log threshold to
+--     execute.
+--
+-- -   __ES_APPLICATION_LOGS__ - OpenSearch application logs contain
+--     information about errors and warnings raised during the operation of
+--     the service and can be useful for troubleshooting.
+--
+-- -   __AUDIT_LOGS__ - Audit logs contain records of user requests for
+--     access to the domain.
+newtype LogType = LogType' {fromLogType :: Data.Text}
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern LogType_AUDIT_LOGS :: LogType
+pattern LogType_AUDIT_LOGS = LogType' "AUDIT_LOGS"
+
+pattern LogType_ES_APPLICATION_LOGS :: LogType
+pattern LogType_ES_APPLICATION_LOGS = LogType' "ES_APPLICATION_LOGS"
+
+pattern LogType_INDEX_SLOW_LOGS :: LogType
+pattern LogType_INDEX_SLOW_LOGS = LogType' "INDEX_SLOW_LOGS"
+
+pattern LogType_SEARCH_SLOW_LOGS :: LogType
+pattern LogType_SEARCH_SLOW_LOGS = LogType' "SEARCH_SLOW_LOGS"
+
+{-# COMPLETE
+  LogType_AUDIT_LOGS,
+  LogType_ES_APPLICATION_LOGS,
+  LogType_INDEX_SLOW_LOGS,
+  LogType_SEARCH_SLOW_LOGS,
+  LogType'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/MasterUserOptions.hs b/gen/Amazonka/OpenSearch/Types/MasterUserOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/MasterUserOptions.hs
@@ -0,0 +1,106 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.MasterUserOptions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.MasterUserOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Credentials for the master user for a domain.
+--
+-- /See:/ 'newMasterUserOptions' smart constructor.
+data MasterUserOptions = MasterUserOptions'
+  { -- | Amazon Resource Name (ARN) for the master user. Only specify if
+    -- @InternalUserDatabaseEnabled@ is @false@.
+    masterUserARN :: Prelude.Maybe Prelude.Text,
+    -- | User name for the master user. Only specify if
+    -- @InternalUserDatabaseEnabled@ is @true@.
+    masterUserName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | Password for the master user. Only specify if
+    -- @InternalUserDatabaseEnabled@ is @true@.
+    masterUserPassword :: Prelude.Maybe (Data.Sensitive Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MasterUserOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'masterUserARN', 'masterUserOptions_masterUserARN' - Amazon Resource Name (ARN) for the master user. Only specify if
+-- @InternalUserDatabaseEnabled@ is @false@.
+--
+-- 'masterUserName', 'masterUserOptions_masterUserName' - User name for the master user. Only specify if
+-- @InternalUserDatabaseEnabled@ is @true@.
+--
+-- 'masterUserPassword', 'masterUserOptions_masterUserPassword' - Password for the master user. Only specify if
+-- @InternalUserDatabaseEnabled@ is @true@.
+newMasterUserOptions ::
+  MasterUserOptions
+newMasterUserOptions =
+  MasterUserOptions'
+    { masterUserARN = Prelude.Nothing,
+      masterUserName = Prelude.Nothing,
+      masterUserPassword = Prelude.Nothing
+    }
+
+-- | Amazon Resource Name (ARN) for the master user. Only specify if
+-- @InternalUserDatabaseEnabled@ is @false@.
+masterUserOptions_masterUserARN :: Lens.Lens' MasterUserOptions (Prelude.Maybe Prelude.Text)
+masterUserOptions_masterUserARN = Lens.lens (\MasterUserOptions' {masterUserARN} -> masterUserARN) (\s@MasterUserOptions' {} a -> s {masterUserARN = a} :: MasterUserOptions)
+
+-- | User name for the master user. Only specify if
+-- @InternalUserDatabaseEnabled@ is @true@.
+masterUserOptions_masterUserName :: Lens.Lens' MasterUserOptions (Prelude.Maybe Prelude.Text)
+masterUserOptions_masterUserName = Lens.lens (\MasterUserOptions' {masterUserName} -> masterUserName) (\s@MasterUserOptions' {} a -> s {masterUserName = a} :: MasterUserOptions) Prelude.. Lens.mapping Data._Sensitive
+
+-- | Password for the master user. Only specify if
+-- @InternalUserDatabaseEnabled@ is @true@.
+masterUserOptions_masterUserPassword :: Lens.Lens' MasterUserOptions (Prelude.Maybe Prelude.Text)
+masterUserOptions_masterUserPassword = Lens.lens (\MasterUserOptions' {masterUserPassword} -> masterUserPassword) (\s@MasterUserOptions' {} a -> s {masterUserPassword = a} :: MasterUserOptions) Prelude.. Lens.mapping Data._Sensitive
+
+instance Prelude.Hashable MasterUserOptions where
+  hashWithSalt _salt MasterUserOptions' {..} =
+    _salt
+      `Prelude.hashWithSalt` masterUserARN
+      `Prelude.hashWithSalt` masterUserName
+      `Prelude.hashWithSalt` masterUserPassword
+
+instance Prelude.NFData MasterUserOptions where
+  rnf MasterUserOptions' {..} =
+    Prelude.rnf masterUserARN
+      `Prelude.seq` Prelude.rnf masterUserName
+      `Prelude.seq` Prelude.rnf masterUserPassword
+
+instance Data.ToJSON MasterUserOptions where
+  toJSON MasterUserOptions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MasterUserARN" Data..=) Prelude.<$> masterUserARN,
+            ("MasterUserName" Data..=)
+              Prelude.<$> masterUserName,
+            ("MasterUserPassword" Data..=)
+              Prelude.<$> masterUserPassword
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/NodeToNodeEncryptionOptions.hs b/gen/Amazonka/OpenSearch/Types/NodeToNodeEncryptionOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/NodeToNodeEncryptionOptions.hs
@@ -0,0 +1,80 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.NodeToNodeEncryptionOptions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.NodeToNodeEncryptionOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Enables or disables node-to-node encryption. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ntn.html Node-to-node encryption for Amazon OpenSearch Service>.
+--
+-- /See:/ 'newNodeToNodeEncryptionOptions' smart constructor.
+data NodeToNodeEncryptionOptions = NodeToNodeEncryptionOptions'
+  { -- | True to enable node-to-node encryption.
+    enabled :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NodeToNodeEncryptionOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enabled', 'nodeToNodeEncryptionOptions_enabled' - True to enable node-to-node encryption.
+newNodeToNodeEncryptionOptions ::
+  NodeToNodeEncryptionOptions
+newNodeToNodeEncryptionOptions =
+  NodeToNodeEncryptionOptions'
+    { enabled =
+        Prelude.Nothing
+    }
+
+-- | True to enable node-to-node encryption.
+nodeToNodeEncryptionOptions_enabled :: Lens.Lens' NodeToNodeEncryptionOptions (Prelude.Maybe Prelude.Bool)
+nodeToNodeEncryptionOptions_enabled = Lens.lens (\NodeToNodeEncryptionOptions' {enabled} -> enabled) (\s@NodeToNodeEncryptionOptions' {} a -> s {enabled = a} :: NodeToNodeEncryptionOptions)
+
+instance Data.FromJSON NodeToNodeEncryptionOptions where
+  parseJSON =
+    Data.withObject
+      "NodeToNodeEncryptionOptions"
+      ( \x ->
+          NodeToNodeEncryptionOptions'
+            Prelude.<$> (x Data..:? "Enabled")
+      )
+
+instance Prelude.Hashable NodeToNodeEncryptionOptions where
+  hashWithSalt _salt NodeToNodeEncryptionOptions' {..} =
+    _salt `Prelude.hashWithSalt` enabled
+
+instance Prelude.NFData NodeToNodeEncryptionOptions where
+  rnf NodeToNodeEncryptionOptions' {..} =
+    Prelude.rnf enabled
+
+instance Data.ToJSON NodeToNodeEncryptionOptions where
+  toJSON NodeToNodeEncryptionOptions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("Enabled" Data..=) Prelude.<$> enabled]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/NodeToNodeEncryptionOptionsStatus.hs b/gen/Amazonka/OpenSearch/Types/NodeToNodeEncryptionOptionsStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/NodeToNodeEncryptionOptionsStatus.hs
@@ -0,0 +1,107 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.NodeToNodeEncryptionOptionsStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.NodeToNodeEncryptionOptionsStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.NodeToNodeEncryptionOptions
+import Amazonka.OpenSearch.Types.OptionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Status of the node-to-node encryption options for the specified domain.
+--
+-- /See:/ 'newNodeToNodeEncryptionOptionsStatus' smart constructor.
+data NodeToNodeEncryptionOptionsStatus = NodeToNodeEncryptionOptionsStatus'
+  { -- | The node-to-node encryption options for the specified domain.
+    options :: NodeToNodeEncryptionOptions,
+    -- | The status of the node-to-node encryption options for the specified
+    -- domain.
+    status :: OptionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NodeToNodeEncryptionOptionsStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'options', 'nodeToNodeEncryptionOptionsStatus_options' - The node-to-node encryption options for the specified domain.
+--
+-- 'status', 'nodeToNodeEncryptionOptionsStatus_status' - The status of the node-to-node encryption options for the specified
+-- domain.
+newNodeToNodeEncryptionOptionsStatus ::
+  -- | 'options'
+  NodeToNodeEncryptionOptions ->
+  -- | 'status'
+  OptionStatus ->
+  NodeToNodeEncryptionOptionsStatus
+newNodeToNodeEncryptionOptionsStatus
+  pOptions_
+  pStatus_ =
+    NodeToNodeEncryptionOptionsStatus'
+      { options =
+          pOptions_,
+        status = pStatus_
+      }
+
+-- | The node-to-node encryption options for the specified domain.
+nodeToNodeEncryptionOptionsStatus_options :: Lens.Lens' NodeToNodeEncryptionOptionsStatus NodeToNodeEncryptionOptions
+nodeToNodeEncryptionOptionsStatus_options = Lens.lens (\NodeToNodeEncryptionOptionsStatus' {options} -> options) (\s@NodeToNodeEncryptionOptionsStatus' {} a -> s {options = a} :: NodeToNodeEncryptionOptionsStatus)
+
+-- | The status of the node-to-node encryption options for the specified
+-- domain.
+nodeToNodeEncryptionOptionsStatus_status :: Lens.Lens' NodeToNodeEncryptionOptionsStatus OptionStatus
+nodeToNodeEncryptionOptionsStatus_status = Lens.lens (\NodeToNodeEncryptionOptionsStatus' {status} -> status) (\s@NodeToNodeEncryptionOptionsStatus' {} a -> s {status = a} :: NodeToNodeEncryptionOptionsStatus)
+
+instance
+  Data.FromJSON
+    NodeToNodeEncryptionOptionsStatus
+  where
+  parseJSON =
+    Data.withObject
+      "NodeToNodeEncryptionOptionsStatus"
+      ( \x ->
+          NodeToNodeEncryptionOptionsStatus'
+            Prelude.<$> (x Data..: "Options")
+            Prelude.<*> (x Data..: "Status")
+      )
+
+instance
+  Prelude.Hashable
+    NodeToNodeEncryptionOptionsStatus
+  where
+  hashWithSalt
+    _salt
+    NodeToNodeEncryptionOptionsStatus' {..} =
+      _salt
+        `Prelude.hashWithSalt` options
+        `Prelude.hashWithSalt` status
+
+instance
+  Prelude.NFData
+    NodeToNodeEncryptionOptionsStatus
+  where
+  rnf NodeToNodeEncryptionOptionsStatus' {..} =
+    Prelude.rnf options
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/OpenSearch/Types/OpenSearchPartitionInstanceType.hs b/gen/Amazonka/OpenSearch/Types/OpenSearchPartitionInstanceType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/OpenSearchPartitionInstanceType.hs
@@ -0,0 +1,536 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.OpenSearchPartitionInstanceType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.OpenSearchPartitionInstanceType
+  ( OpenSearchPartitionInstanceType
+      ( ..,
+        OpenSearchPartitionInstanceType_C4_2xlarge_search,
+        OpenSearchPartitionInstanceType_C4_4xlarge_search,
+        OpenSearchPartitionInstanceType_C4_8xlarge_search,
+        OpenSearchPartitionInstanceType_C4_large_search,
+        OpenSearchPartitionInstanceType_C4_xlarge_search,
+        OpenSearchPartitionInstanceType_C5_18xlarge_search,
+        OpenSearchPartitionInstanceType_C5_2xlarge_search,
+        OpenSearchPartitionInstanceType_C5_4xlarge_search,
+        OpenSearchPartitionInstanceType_C5_9xlarge_search,
+        OpenSearchPartitionInstanceType_C5_large_search,
+        OpenSearchPartitionInstanceType_C5_xlarge_search,
+        OpenSearchPartitionInstanceType_C6g_12xlarge_search,
+        OpenSearchPartitionInstanceType_C6g_2xlarge_search,
+        OpenSearchPartitionInstanceType_C6g_4xlarge_search,
+        OpenSearchPartitionInstanceType_C6g_8xlarge_search,
+        OpenSearchPartitionInstanceType_C6g_large_search,
+        OpenSearchPartitionInstanceType_C6g_xlarge_search,
+        OpenSearchPartitionInstanceType_D2_2xlarge_search,
+        OpenSearchPartitionInstanceType_D2_4xlarge_search,
+        OpenSearchPartitionInstanceType_D2_8xlarge_search,
+        OpenSearchPartitionInstanceType_D2_xlarge_search,
+        OpenSearchPartitionInstanceType_I2_2xlarge_search,
+        OpenSearchPartitionInstanceType_I2_xlarge_search,
+        OpenSearchPartitionInstanceType_I3_16xlarge_search,
+        OpenSearchPartitionInstanceType_I3_2xlarge_search,
+        OpenSearchPartitionInstanceType_I3_4xlarge_search,
+        OpenSearchPartitionInstanceType_I3_8xlarge_search,
+        OpenSearchPartitionInstanceType_I3_large_search,
+        OpenSearchPartitionInstanceType_I3_xlarge_search,
+        OpenSearchPartitionInstanceType_M3_2xlarge_search,
+        OpenSearchPartitionInstanceType_M3_large_search,
+        OpenSearchPartitionInstanceType_M3_medium_search,
+        OpenSearchPartitionInstanceType_M3_xlarge_search,
+        OpenSearchPartitionInstanceType_M4_10xlarge_search,
+        OpenSearchPartitionInstanceType_M4_2xlarge_search,
+        OpenSearchPartitionInstanceType_M4_4xlarge_search,
+        OpenSearchPartitionInstanceType_M4_large_search,
+        OpenSearchPartitionInstanceType_M4_xlarge_search,
+        OpenSearchPartitionInstanceType_M5_12xlarge_search,
+        OpenSearchPartitionInstanceType_M5_24xlarge_search,
+        OpenSearchPartitionInstanceType_M5_2xlarge_search,
+        OpenSearchPartitionInstanceType_M5_4xlarge_search,
+        OpenSearchPartitionInstanceType_M5_large_search,
+        OpenSearchPartitionInstanceType_M5_xlarge_search,
+        OpenSearchPartitionInstanceType_M6g_12xlarge_search,
+        OpenSearchPartitionInstanceType_M6g_2xlarge_search,
+        OpenSearchPartitionInstanceType_M6g_4xlarge_search,
+        OpenSearchPartitionInstanceType_M6g_8xlarge_search,
+        OpenSearchPartitionInstanceType_M6g_large_search,
+        OpenSearchPartitionInstanceType_M6g_xlarge_search,
+        OpenSearchPartitionInstanceType_R3_2xlarge_search,
+        OpenSearchPartitionInstanceType_R3_4xlarge_search,
+        OpenSearchPartitionInstanceType_R3_8xlarge_search,
+        OpenSearchPartitionInstanceType_R3_large_search,
+        OpenSearchPartitionInstanceType_R3_xlarge_search,
+        OpenSearchPartitionInstanceType_R4_16xlarge_search,
+        OpenSearchPartitionInstanceType_R4_2xlarge_search,
+        OpenSearchPartitionInstanceType_R4_4xlarge_search,
+        OpenSearchPartitionInstanceType_R4_8xlarge_search,
+        OpenSearchPartitionInstanceType_R4_large_search,
+        OpenSearchPartitionInstanceType_R4_xlarge_search,
+        OpenSearchPartitionInstanceType_R5_12xlarge_search,
+        OpenSearchPartitionInstanceType_R5_24xlarge_search,
+        OpenSearchPartitionInstanceType_R5_2xlarge_search,
+        OpenSearchPartitionInstanceType_R5_4xlarge_search,
+        OpenSearchPartitionInstanceType_R5_large_search,
+        OpenSearchPartitionInstanceType_R5_xlarge_search,
+        OpenSearchPartitionInstanceType_R6g_12xlarge_search,
+        OpenSearchPartitionInstanceType_R6g_2xlarge_search,
+        OpenSearchPartitionInstanceType_R6g_4xlarge_search,
+        OpenSearchPartitionInstanceType_R6g_8xlarge_search,
+        OpenSearchPartitionInstanceType_R6g_large_search,
+        OpenSearchPartitionInstanceType_R6g_xlarge_search,
+        OpenSearchPartitionInstanceType_R6gd_12xlarge_search,
+        OpenSearchPartitionInstanceType_R6gd_16xlarge_search,
+        OpenSearchPartitionInstanceType_R6gd_2xlarge_search,
+        OpenSearchPartitionInstanceType_R6gd_4xlarge_search,
+        OpenSearchPartitionInstanceType_R6gd_8xlarge_search,
+        OpenSearchPartitionInstanceType_R6gd_large_search,
+        OpenSearchPartitionInstanceType_R6gd_xlarge_search,
+        OpenSearchPartitionInstanceType_T2_medium_search,
+        OpenSearchPartitionInstanceType_T2_micro_search,
+        OpenSearchPartitionInstanceType_T2_small_search,
+        OpenSearchPartitionInstanceType_T3_2xlarge_search,
+        OpenSearchPartitionInstanceType_T3_large_search,
+        OpenSearchPartitionInstanceType_T3_medium_search,
+        OpenSearchPartitionInstanceType_T3_micro_search,
+        OpenSearchPartitionInstanceType_T3_nano_search,
+        OpenSearchPartitionInstanceType_T3_small_search,
+        OpenSearchPartitionInstanceType_T3_xlarge_search,
+        OpenSearchPartitionInstanceType_T4g_medium_search,
+        OpenSearchPartitionInstanceType_T4g_small_search,
+        OpenSearchPartitionInstanceType_Ultrawarm1_large_search,
+        OpenSearchPartitionInstanceType_Ultrawarm1_medium_search,
+        OpenSearchPartitionInstanceType_Ultrawarm1_xlarge_search
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype OpenSearchPartitionInstanceType = OpenSearchPartitionInstanceType'
+  { fromOpenSearchPartitionInstanceType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern OpenSearchPartitionInstanceType_C4_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C4_2xlarge_search = OpenSearchPartitionInstanceType' "c4.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_C4_4xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C4_4xlarge_search = OpenSearchPartitionInstanceType' "c4.4xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_C4_8xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C4_8xlarge_search = OpenSearchPartitionInstanceType' "c4.8xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_C4_large_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C4_large_search = OpenSearchPartitionInstanceType' "c4.large.search"
+
+pattern OpenSearchPartitionInstanceType_C4_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C4_xlarge_search = OpenSearchPartitionInstanceType' "c4.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_C5_18xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C5_18xlarge_search = OpenSearchPartitionInstanceType' "c5.18xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_C5_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C5_2xlarge_search = OpenSearchPartitionInstanceType' "c5.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_C5_4xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C5_4xlarge_search = OpenSearchPartitionInstanceType' "c5.4xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_C5_9xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C5_9xlarge_search = OpenSearchPartitionInstanceType' "c5.9xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_C5_large_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C5_large_search = OpenSearchPartitionInstanceType' "c5.large.search"
+
+pattern OpenSearchPartitionInstanceType_C5_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C5_xlarge_search = OpenSearchPartitionInstanceType' "c5.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_C6g_12xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C6g_12xlarge_search = OpenSearchPartitionInstanceType' "c6g.12xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_C6g_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C6g_2xlarge_search = OpenSearchPartitionInstanceType' "c6g.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_C6g_4xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C6g_4xlarge_search = OpenSearchPartitionInstanceType' "c6g.4xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_C6g_8xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C6g_8xlarge_search = OpenSearchPartitionInstanceType' "c6g.8xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_C6g_large_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C6g_large_search = OpenSearchPartitionInstanceType' "c6g.large.search"
+
+pattern OpenSearchPartitionInstanceType_C6g_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_C6g_xlarge_search = OpenSearchPartitionInstanceType' "c6g.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_D2_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_D2_2xlarge_search = OpenSearchPartitionInstanceType' "d2.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_D2_4xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_D2_4xlarge_search = OpenSearchPartitionInstanceType' "d2.4xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_D2_8xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_D2_8xlarge_search = OpenSearchPartitionInstanceType' "d2.8xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_D2_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_D2_xlarge_search = OpenSearchPartitionInstanceType' "d2.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_I2_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_I2_2xlarge_search = OpenSearchPartitionInstanceType' "i2.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_I2_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_I2_xlarge_search = OpenSearchPartitionInstanceType' "i2.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_I3_16xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_I3_16xlarge_search = OpenSearchPartitionInstanceType' "i3.16xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_I3_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_I3_2xlarge_search = OpenSearchPartitionInstanceType' "i3.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_I3_4xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_I3_4xlarge_search = OpenSearchPartitionInstanceType' "i3.4xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_I3_8xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_I3_8xlarge_search = OpenSearchPartitionInstanceType' "i3.8xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_I3_large_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_I3_large_search = OpenSearchPartitionInstanceType' "i3.large.search"
+
+pattern OpenSearchPartitionInstanceType_I3_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_I3_xlarge_search = OpenSearchPartitionInstanceType' "i3.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M3_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M3_2xlarge_search = OpenSearchPartitionInstanceType' "m3.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M3_large_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M3_large_search = OpenSearchPartitionInstanceType' "m3.large.search"
+
+pattern OpenSearchPartitionInstanceType_M3_medium_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M3_medium_search = OpenSearchPartitionInstanceType' "m3.medium.search"
+
+pattern OpenSearchPartitionInstanceType_M3_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M3_xlarge_search = OpenSearchPartitionInstanceType' "m3.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M4_10xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M4_10xlarge_search = OpenSearchPartitionInstanceType' "m4.10xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M4_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M4_2xlarge_search = OpenSearchPartitionInstanceType' "m4.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M4_4xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M4_4xlarge_search = OpenSearchPartitionInstanceType' "m4.4xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M4_large_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M4_large_search = OpenSearchPartitionInstanceType' "m4.large.search"
+
+pattern OpenSearchPartitionInstanceType_M4_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M4_xlarge_search = OpenSearchPartitionInstanceType' "m4.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M5_12xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M5_12xlarge_search = OpenSearchPartitionInstanceType' "m5.12xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M5_24xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M5_24xlarge_search = OpenSearchPartitionInstanceType' "m5.24xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M5_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M5_2xlarge_search = OpenSearchPartitionInstanceType' "m5.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M5_4xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M5_4xlarge_search = OpenSearchPartitionInstanceType' "m5.4xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M5_large_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M5_large_search = OpenSearchPartitionInstanceType' "m5.large.search"
+
+pattern OpenSearchPartitionInstanceType_M5_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M5_xlarge_search = OpenSearchPartitionInstanceType' "m5.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M6g_12xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M6g_12xlarge_search = OpenSearchPartitionInstanceType' "m6g.12xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M6g_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M6g_2xlarge_search = OpenSearchPartitionInstanceType' "m6g.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M6g_4xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M6g_4xlarge_search = OpenSearchPartitionInstanceType' "m6g.4xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M6g_8xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M6g_8xlarge_search = OpenSearchPartitionInstanceType' "m6g.8xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_M6g_large_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M6g_large_search = OpenSearchPartitionInstanceType' "m6g.large.search"
+
+pattern OpenSearchPartitionInstanceType_M6g_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_M6g_xlarge_search = OpenSearchPartitionInstanceType' "m6g.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R3_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R3_2xlarge_search = OpenSearchPartitionInstanceType' "r3.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R3_4xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R3_4xlarge_search = OpenSearchPartitionInstanceType' "r3.4xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R3_8xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R3_8xlarge_search = OpenSearchPartitionInstanceType' "r3.8xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R3_large_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R3_large_search = OpenSearchPartitionInstanceType' "r3.large.search"
+
+pattern OpenSearchPartitionInstanceType_R3_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R3_xlarge_search = OpenSearchPartitionInstanceType' "r3.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R4_16xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R4_16xlarge_search = OpenSearchPartitionInstanceType' "r4.16xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R4_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R4_2xlarge_search = OpenSearchPartitionInstanceType' "r4.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R4_4xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R4_4xlarge_search = OpenSearchPartitionInstanceType' "r4.4xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R4_8xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R4_8xlarge_search = OpenSearchPartitionInstanceType' "r4.8xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R4_large_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R4_large_search = OpenSearchPartitionInstanceType' "r4.large.search"
+
+pattern OpenSearchPartitionInstanceType_R4_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R4_xlarge_search = OpenSearchPartitionInstanceType' "r4.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R5_12xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R5_12xlarge_search = OpenSearchPartitionInstanceType' "r5.12xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R5_24xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R5_24xlarge_search = OpenSearchPartitionInstanceType' "r5.24xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R5_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R5_2xlarge_search = OpenSearchPartitionInstanceType' "r5.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R5_4xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R5_4xlarge_search = OpenSearchPartitionInstanceType' "r5.4xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R5_large_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R5_large_search = OpenSearchPartitionInstanceType' "r5.large.search"
+
+pattern OpenSearchPartitionInstanceType_R5_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R5_xlarge_search = OpenSearchPartitionInstanceType' "r5.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R6g_12xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R6g_12xlarge_search = OpenSearchPartitionInstanceType' "r6g.12xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R6g_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R6g_2xlarge_search = OpenSearchPartitionInstanceType' "r6g.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R6g_4xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R6g_4xlarge_search = OpenSearchPartitionInstanceType' "r6g.4xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R6g_8xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R6g_8xlarge_search = OpenSearchPartitionInstanceType' "r6g.8xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R6g_large_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R6g_large_search = OpenSearchPartitionInstanceType' "r6g.large.search"
+
+pattern OpenSearchPartitionInstanceType_R6g_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R6g_xlarge_search = OpenSearchPartitionInstanceType' "r6g.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R6gd_12xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R6gd_12xlarge_search = OpenSearchPartitionInstanceType' "r6gd.12xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R6gd_16xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R6gd_16xlarge_search = OpenSearchPartitionInstanceType' "r6gd.16xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R6gd_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R6gd_2xlarge_search = OpenSearchPartitionInstanceType' "r6gd.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R6gd_4xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R6gd_4xlarge_search = OpenSearchPartitionInstanceType' "r6gd.4xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R6gd_8xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R6gd_8xlarge_search = OpenSearchPartitionInstanceType' "r6gd.8xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_R6gd_large_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R6gd_large_search = OpenSearchPartitionInstanceType' "r6gd.large.search"
+
+pattern OpenSearchPartitionInstanceType_R6gd_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_R6gd_xlarge_search = OpenSearchPartitionInstanceType' "r6gd.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_T2_medium_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_T2_medium_search = OpenSearchPartitionInstanceType' "t2.medium.search"
+
+pattern OpenSearchPartitionInstanceType_T2_micro_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_T2_micro_search = OpenSearchPartitionInstanceType' "t2.micro.search"
+
+pattern OpenSearchPartitionInstanceType_T2_small_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_T2_small_search = OpenSearchPartitionInstanceType' "t2.small.search"
+
+pattern OpenSearchPartitionInstanceType_T3_2xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_T3_2xlarge_search = OpenSearchPartitionInstanceType' "t3.2xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_T3_large_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_T3_large_search = OpenSearchPartitionInstanceType' "t3.large.search"
+
+pattern OpenSearchPartitionInstanceType_T3_medium_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_T3_medium_search = OpenSearchPartitionInstanceType' "t3.medium.search"
+
+pattern OpenSearchPartitionInstanceType_T3_micro_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_T3_micro_search = OpenSearchPartitionInstanceType' "t3.micro.search"
+
+pattern OpenSearchPartitionInstanceType_T3_nano_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_T3_nano_search = OpenSearchPartitionInstanceType' "t3.nano.search"
+
+pattern OpenSearchPartitionInstanceType_T3_small_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_T3_small_search = OpenSearchPartitionInstanceType' "t3.small.search"
+
+pattern OpenSearchPartitionInstanceType_T3_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_T3_xlarge_search = OpenSearchPartitionInstanceType' "t3.xlarge.search"
+
+pattern OpenSearchPartitionInstanceType_T4g_medium_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_T4g_medium_search = OpenSearchPartitionInstanceType' "t4g.medium.search"
+
+pattern OpenSearchPartitionInstanceType_T4g_small_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_T4g_small_search = OpenSearchPartitionInstanceType' "t4g.small.search"
+
+pattern OpenSearchPartitionInstanceType_Ultrawarm1_large_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_Ultrawarm1_large_search = OpenSearchPartitionInstanceType' "ultrawarm1.large.search"
+
+pattern OpenSearchPartitionInstanceType_Ultrawarm1_medium_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_Ultrawarm1_medium_search = OpenSearchPartitionInstanceType' "ultrawarm1.medium.search"
+
+pattern OpenSearchPartitionInstanceType_Ultrawarm1_xlarge_search :: OpenSearchPartitionInstanceType
+pattern OpenSearchPartitionInstanceType_Ultrawarm1_xlarge_search = OpenSearchPartitionInstanceType' "ultrawarm1.xlarge.search"
+
+{-# COMPLETE
+  OpenSearchPartitionInstanceType_C4_2xlarge_search,
+  OpenSearchPartitionInstanceType_C4_4xlarge_search,
+  OpenSearchPartitionInstanceType_C4_8xlarge_search,
+  OpenSearchPartitionInstanceType_C4_large_search,
+  OpenSearchPartitionInstanceType_C4_xlarge_search,
+  OpenSearchPartitionInstanceType_C5_18xlarge_search,
+  OpenSearchPartitionInstanceType_C5_2xlarge_search,
+  OpenSearchPartitionInstanceType_C5_4xlarge_search,
+  OpenSearchPartitionInstanceType_C5_9xlarge_search,
+  OpenSearchPartitionInstanceType_C5_large_search,
+  OpenSearchPartitionInstanceType_C5_xlarge_search,
+  OpenSearchPartitionInstanceType_C6g_12xlarge_search,
+  OpenSearchPartitionInstanceType_C6g_2xlarge_search,
+  OpenSearchPartitionInstanceType_C6g_4xlarge_search,
+  OpenSearchPartitionInstanceType_C6g_8xlarge_search,
+  OpenSearchPartitionInstanceType_C6g_large_search,
+  OpenSearchPartitionInstanceType_C6g_xlarge_search,
+  OpenSearchPartitionInstanceType_D2_2xlarge_search,
+  OpenSearchPartitionInstanceType_D2_4xlarge_search,
+  OpenSearchPartitionInstanceType_D2_8xlarge_search,
+  OpenSearchPartitionInstanceType_D2_xlarge_search,
+  OpenSearchPartitionInstanceType_I2_2xlarge_search,
+  OpenSearchPartitionInstanceType_I2_xlarge_search,
+  OpenSearchPartitionInstanceType_I3_16xlarge_search,
+  OpenSearchPartitionInstanceType_I3_2xlarge_search,
+  OpenSearchPartitionInstanceType_I3_4xlarge_search,
+  OpenSearchPartitionInstanceType_I3_8xlarge_search,
+  OpenSearchPartitionInstanceType_I3_large_search,
+  OpenSearchPartitionInstanceType_I3_xlarge_search,
+  OpenSearchPartitionInstanceType_M3_2xlarge_search,
+  OpenSearchPartitionInstanceType_M3_large_search,
+  OpenSearchPartitionInstanceType_M3_medium_search,
+  OpenSearchPartitionInstanceType_M3_xlarge_search,
+  OpenSearchPartitionInstanceType_M4_10xlarge_search,
+  OpenSearchPartitionInstanceType_M4_2xlarge_search,
+  OpenSearchPartitionInstanceType_M4_4xlarge_search,
+  OpenSearchPartitionInstanceType_M4_large_search,
+  OpenSearchPartitionInstanceType_M4_xlarge_search,
+  OpenSearchPartitionInstanceType_M5_12xlarge_search,
+  OpenSearchPartitionInstanceType_M5_24xlarge_search,
+  OpenSearchPartitionInstanceType_M5_2xlarge_search,
+  OpenSearchPartitionInstanceType_M5_4xlarge_search,
+  OpenSearchPartitionInstanceType_M5_large_search,
+  OpenSearchPartitionInstanceType_M5_xlarge_search,
+  OpenSearchPartitionInstanceType_M6g_12xlarge_search,
+  OpenSearchPartitionInstanceType_M6g_2xlarge_search,
+  OpenSearchPartitionInstanceType_M6g_4xlarge_search,
+  OpenSearchPartitionInstanceType_M6g_8xlarge_search,
+  OpenSearchPartitionInstanceType_M6g_large_search,
+  OpenSearchPartitionInstanceType_M6g_xlarge_search,
+  OpenSearchPartitionInstanceType_R3_2xlarge_search,
+  OpenSearchPartitionInstanceType_R3_4xlarge_search,
+  OpenSearchPartitionInstanceType_R3_8xlarge_search,
+  OpenSearchPartitionInstanceType_R3_large_search,
+  OpenSearchPartitionInstanceType_R3_xlarge_search,
+  OpenSearchPartitionInstanceType_R4_16xlarge_search,
+  OpenSearchPartitionInstanceType_R4_2xlarge_search,
+  OpenSearchPartitionInstanceType_R4_4xlarge_search,
+  OpenSearchPartitionInstanceType_R4_8xlarge_search,
+  OpenSearchPartitionInstanceType_R4_large_search,
+  OpenSearchPartitionInstanceType_R4_xlarge_search,
+  OpenSearchPartitionInstanceType_R5_12xlarge_search,
+  OpenSearchPartitionInstanceType_R5_24xlarge_search,
+  OpenSearchPartitionInstanceType_R5_2xlarge_search,
+  OpenSearchPartitionInstanceType_R5_4xlarge_search,
+  OpenSearchPartitionInstanceType_R5_large_search,
+  OpenSearchPartitionInstanceType_R5_xlarge_search,
+  OpenSearchPartitionInstanceType_R6g_12xlarge_search,
+  OpenSearchPartitionInstanceType_R6g_2xlarge_search,
+  OpenSearchPartitionInstanceType_R6g_4xlarge_search,
+  OpenSearchPartitionInstanceType_R6g_8xlarge_search,
+  OpenSearchPartitionInstanceType_R6g_large_search,
+  OpenSearchPartitionInstanceType_R6g_xlarge_search,
+  OpenSearchPartitionInstanceType_R6gd_12xlarge_search,
+  OpenSearchPartitionInstanceType_R6gd_16xlarge_search,
+  OpenSearchPartitionInstanceType_R6gd_2xlarge_search,
+  OpenSearchPartitionInstanceType_R6gd_4xlarge_search,
+  OpenSearchPartitionInstanceType_R6gd_8xlarge_search,
+  OpenSearchPartitionInstanceType_R6gd_large_search,
+  OpenSearchPartitionInstanceType_R6gd_xlarge_search,
+  OpenSearchPartitionInstanceType_T2_medium_search,
+  OpenSearchPartitionInstanceType_T2_micro_search,
+  OpenSearchPartitionInstanceType_T2_small_search,
+  OpenSearchPartitionInstanceType_T3_2xlarge_search,
+  OpenSearchPartitionInstanceType_T3_large_search,
+  OpenSearchPartitionInstanceType_T3_medium_search,
+  OpenSearchPartitionInstanceType_T3_micro_search,
+  OpenSearchPartitionInstanceType_T3_nano_search,
+  OpenSearchPartitionInstanceType_T3_small_search,
+  OpenSearchPartitionInstanceType_T3_xlarge_search,
+  OpenSearchPartitionInstanceType_T4g_medium_search,
+  OpenSearchPartitionInstanceType_T4g_small_search,
+  OpenSearchPartitionInstanceType_Ultrawarm1_large_search,
+  OpenSearchPartitionInstanceType_Ultrawarm1_medium_search,
+  OpenSearchPartitionInstanceType_Ultrawarm1_xlarge_search,
+  OpenSearchPartitionInstanceType'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/OpenSearchWarmPartitionInstanceType.hs b/gen/Amazonka/OpenSearch/Types/OpenSearchWarmPartitionInstanceType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/OpenSearchWarmPartitionInstanceType.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.OpenSearchWarmPartitionInstanceType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.OpenSearchWarmPartitionInstanceType
+  ( OpenSearchWarmPartitionInstanceType
+      ( ..,
+        OpenSearchWarmPartitionInstanceType_Ultrawarm1_large_search,
+        OpenSearchWarmPartitionInstanceType_Ultrawarm1_medium_search,
+        OpenSearchWarmPartitionInstanceType_Ultrawarm1_xlarge_search
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype OpenSearchWarmPartitionInstanceType = OpenSearchWarmPartitionInstanceType'
+  { fromOpenSearchWarmPartitionInstanceType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern OpenSearchWarmPartitionInstanceType_Ultrawarm1_large_search :: OpenSearchWarmPartitionInstanceType
+pattern OpenSearchWarmPartitionInstanceType_Ultrawarm1_large_search = OpenSearchWarmPartitionInstanceType' "ultrawarm1.large.search"
+
+pattern OpenSearchWarmPartitionInstanceType_Ultrawarm1_medium_search :: OpenSearchWarmPartitionInstanceType
+pattern OpenSearchWarmPartitionInstanceType_Ultrawarm1_medium_search = OpenSearchWarmPartitionInstanceType' "ultrawarm1.medium.search"
+
+pattern OpenSearchWarmPartitionInstanceType_Ultrawarm1_xlarge_search :: OpenSearchWarmPartitionInstanceType
+pattern OpenSearchWarmPartitionInstanceType_Ultrawarm1_xlarge_search = OpenSearchWarmPartitionInstanceType' "ultrawarm1.xlarge.search"
+
+{-# COMPLETE
+  OpenSearchWarmPartitionInstanceType_Ultrawarm1_large_search,
+  OpenSearchWarmPartitionInstanceType_Ultrawarm1_medium_search,
+  OpenSearchWarmPartitionInstanceType_Ultrawarm1_xlarge_search,
+  OpenSearchWarmPartitionInstanceType'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/OptionState.hs b/gen/Amazonka/OpenSearch/Types/OptionState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/OptionState.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.OptionState
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.OptionState
+  ( OptionState
+      ( ..,
+        OptionState_Active,
+        OptionState_Processing,
+        OptionState_RequiresIndexDocuments
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The state of a requested domain configuration change. Can be one of the
+-- following:
+--
+-- -   __Processing__ - The requested change is still in progress.
+--
+-- -   __Active__ - The requested change is processed and deployed to the
+--     domain.
+newtype OptionState = OptionState'
+  { fromOptionState ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern OptionState_Active :: OptionState
+pattern OptionState_Active = OptionState' "Active"
+
+pattern OptionState_Processing :: OptionState
+pattern OptionState_Processing = OptionState' "Processing"
+
+pattern OptionState_RequiresIndexDocuments :: OptionState
+pattern OptionState_RequiresIndexDocuments = OptionState' "RequiresIndexDocuments"
+
+{-# COMPLETE
+  OptionState_Active,
+  OptionState_Processing,
+  OptionState_RequiresIndexDocuments,
+  OptionState'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/OptionStatus.hs b/gen/Amazonka/OpenSearch/Types/OptionStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/OptionStatus.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.OptionStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.OptionStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.OptionState
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides the current status of an entity.
+--
+-- /See:/ 'newOptionStatus' smart constructor.
+data OptionStatus = OptionStatus'
+  { -- | Indicates whether the entity is being deleted.
+    pendingDeletion :: Prelude.Maybe Prelude.Bool,
+    -- | The latest version of the entity.
+    updateVersion :: Prelude.Maybe Prelude.Natural,
+    -- | The timestamp when the entity was created.
+    creationDate :: Data.POSIX,
+    -- | The timestamp of the last time the entity was updated.
+    updateDate :: Data.POSIX,
+    -- | The state of the entity.
+    state :: OptionState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OptionStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'pendingDeletion', 'optionStatus_pendingDeletion' - Indicates whether the entity is being deleted.
+--
+-- 'updateVersion', 'optionStatus_updateVersion' - The latest version of the entity.
+--
+-- 'creationDate', 'optionStatus_creationDate' - The timestamp when the entity was created.
+--
+-- 'updateDate', 'optionStatus_updateDate' - The timestamp of the last time the entity was updated.
+--
+-- 'state', 'optionStatus_state' - The state of the entity.
+newOptionStatus ::
+  -- | 'creationDate'
+  Prelude.UTCTime ->
+  -- | 'updateDate'
+  Prelude.UTCTime ->
+  -- | 'state'
+  OptionState ->
+  OptionStatus
+newOptionStatus pCreationDate_ pUpdateDate_ pState_ =
+  OptionStatus'
+    { pendingDeletion = Prelude.Nothing,
+      updateVersion = Prelude.Nothing,
+      creationDate = Data._Time Lens.# pCreationDate_,
+      updateDate = Data._Time Lens.# pUpdateDate_,
+      state = pState_
+    }
+
+-- | Indicates whether the entity is being deleted.
+optionStatus_pendingDeletion :: Lens.Lens' OptionStatus (Prelude.Maybe Prelude.Bool)
+optionStatus_pendingDeletion = Lens.lens (\OptionStatus' {pendingDeletion} -> pendingDeletion) (\s@OptionStatus' {} a -> s {pendingDeletion = a} :: OptionStatus)
+
+-- | The latest version of the entity.
+optionStatus_updateVersion :: Lens.Lens' OptionStatus (Prelude.Maybe Prelude.Natural)
+optionStatus_updateVersion = Lens.lens (\OptionStatus' {updateVersion} -> updateVersion) (\s@OptionStatus' {} a -> s {updateVersion = a} :: OptionStatus)
+
+-- | The timestamp when the entity was created.
+optionStatus_creationDate :: Lens.Lens' OptionStatus Prelude.UTCTime
+optionStatus_creationDate = Lens.lens (\OptionStatus' {creationDate} -> creationDate) (\s@OptionStatus' {} a -> s {creationDate = a} :: OptionStatus) Prelude.. Data._Time
+
+-- | The timestamp of the last time the entity was updated.
+optionStatus_updateDate :: Lens.Lens' OptionStatus Prelude.UTCTime
+optionStatus_updateDate = Lens.lens (\OptionStatus' {updateDate} -> updateDate) (\s@OptionStatus' {} a -> s {updateDate = a} :: OptionStatus) Prelude.. Data._Time
+
+-- | The state of the entity.
+optionStatus_state :: Lens.Lens' OptionStatus OptionState
+optionStatus_state = Lens.lens (\OptionStatus' {state} -> state) (\s@OptionStatus' {} a -> s {state = a} :: OptionStatus)
+
+instance Data.FromJSON OptionStatus where
+  parseJSON =
+    Data.withObject
+      "OptionStatus"
+      ( \x ->
+          OptionStatus'
+            Prelude.<$> (x Data..:? "PendingDeletion")
+            Prelude.<*> (x Data..:? "UpdateVersion")
+            Prelude.<*> (x Data..: "CreationDate")
+            Prelude.<*> (x Data..: "UpdateDate")
+            Prelude.<*> (x Data..: "State")
+      )
+
+instance Prelude.Hashable OptionStatus where
+  hashWithSalt _salt OptionStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` pendingDeletion
+      `Prelude.hashWithSalt` updateVersion
+      `Prelude.hashWithSalt` creationDate
+      `Prelude.hashWithSalt` updateDate
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData OptionStatus where
+  rnf OptionStatus' {..} =
+    Prelude.rnf pendingDeletion
+      `Prelude.seq` Prelude.rnf updateVersion
+      `Prelude.seq` Prelude.rnf creationDate
+      `Prelude.seq` Prelude.rnf updateDate
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/OpenSearch/Types/OutboundConnection.hs b/gen/Amazonka/OpenSearch/Types/OutboundConnection.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/OutboundConnection.hs
@@ -0,0 +1,123 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.OutboundConnection
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.OutboundConnection where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.DomainInformationContainer
+import Amazonka.OpenSearch.Types.OutboundConnectionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies details about an outbound cross-cluster connection.
+--
+-- /See:/ 'newOutboundConnection' smart constructor.
+data OutboundConnection = OutboundConnection'
+  { -- | Name of the connection.
+    connectionAlias :: Prelude.Maybe Prelude.Text,
+    -- | Unique identifier of the connection.
+    connectionId :: Prelude.Maybe Prelude.Text,
+    -- | Status of the connection.
+    connectionStatus :: Prelude.Maybe OutboundConnectionStatus,
+    -- | Information about the source (local) domain.
+    localDomainInfo :: Prelude.Maybe DomainInformationContainer,
+    -- | Information about the destination (remote) domain.
+    remoteDomainInfo :: Prelude.Maybe DomainInformationContainer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OutboundConnection' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connectionAlias', 'outboundConnection_connectionAlias' - Name of the connection.
+--
+-- 'connectionId', 'outboundConnection_connectionId' - Unique identifier of the connection.
+--
+-- 'connectionStatus', 'outboundConnection_connectionStatus' - Status of the connection.
+--
+-- 'localDomainInfo', 'outboundConnection_localDomainInfo' - Information about the source (local) domain.
+--
+-- 'remoteDomainInfo', 'outboundConnection_remoteDomainInfo' - Information about the destination (remote) domain.
+newOutboundConnection ::
+  OutboundConnection
+newOutboundConnection =
+  OutboundConnection'
+    { connectionAlias =
+        Prelude.Nothing,
+      connectionId = Prelude.Nothing,
+      connectionStatus = Prelude.Nothing,
+      localDomainInfo = Prelude.Nothing,
+      remoteDomainInfo = Prelude.Nothing
+    }
+
+-- | Name of the connection.
+outboundConnection_connectionAlias :: Lens.Lens' OutboundConnection (Prelude.Maybe Prelude.Text)
+outboundConnection_connectionAlias = Lens.lens (\OutboundConnection' {connectionAlias} -> connectionAlias) (\s@OutboundConnection' {} a -> s {connectionAlias = a} :: OutboundConnection)
+
+-- | Unique identifier of the connection.
+outboundConnection_connectionId :: Lens.Lens' OutboundConnection (Prelude.Maybe Prelude.Text)
+outboundConnection_connectionId = Lens.lens (\OutboundConnection' {connectionId} -> connectionId) (\s@OutboundConnection' {} a -> s {connectionId = a} :: OutboundConnection)
+
+-- | Status of the connection.
+outboundConnection_connectionStatus :: Lens.Lens' OutboundConnection (Prelude.Maybe OutboundConnectionStatus)
+outboundConnection_connectionStatus = Lens.lens (\OutboundConnection' {connectionStatus} -> connectionStatus) (\s@OutboundConnection' {} a -> s {connectionStatus = a} :: OutboundConnection)
+
+-- | Information about the source (local) domain.
+outboundConnection_localDomainInfo :: Lens.Lens' OutboundConnection (Prelude.Maybe DomainInformationContainer)
+outboundConnection_localDomainInfo = Lens.lens (\OutboundConnection' {localDomainInfo} -> localDomainInfo) (\s@OutboundConnection' {} a -> s {localDomainInfo = a} :: OutboundConnection)
+
+-- | Information about the destination (remote) domain.
+outboundConnection_remoteDomainInfo :: Lens.Lens' OutboundConnection (Prelude.Maybe DomainInformationContainer)
+outboundConnection_remoteDomainInfo = Lens.lens (\OutboundConnection' {remoteDomainInfo} -> remoteDomainInfo) (\s@OutboundConnection' {} a -> s {remoteDomainInfo = a} :: OutboundConnection)
+
+instance Data.FromJSON OutboundConnection where
+  parseJSON =
+    Data.withObject
+      "OutboundConnection"
+      ( \x ->
+          OutboundConnection'
+            Prelude.<$> (x Data..:? "ConnectionAlias")
+            Prelude.<*> (x Data..:? "ConnectionId")
+            Prelude.<*> (x Data..:? "ConnectionStatus")
+            Prelude.<*> (x Data..:? "LocalDomainInfo")
+            Prelude.<*> (x Data..:? "RemoteDomainInfo")
+      )
+
+instance Prelude.Hashable OutboundConnection where
+  hashWithSalt _salt OutboundConnection' {..} =
+    _salt
+      `Prelude.hashWithSalt` connectionAlias
+      `Prelude.hashWithSalt` connectionId
+      `Prelude.hashWithSalt` connectionStatus
+      `Prelude.hashWithSalt` localDomainInfo
+      `Prelude.hashWithSalt` remoteDomainInfo
+
+instance Prelude.NFData OutboundConnection where
+  rnf OutboundConnection' {..} =
+    Prelude.rnf connectionAlias
+      `Prelude.seq` Prelude.rnf connectionId
+      `Prelude.seq` Prelude.rnf connectionStatus
+      `Prelude.seq` Prelude.rnf localDomainInfo
+      `Prelude.seq` Prelude.rnf remoteDomainInfo
diff --git a/gen/Amazonka/OpenSearch/Types/OutboundConnectionStatus.hs b/gen/Amazonka/OpenSearch/Types/OutboundConnectionStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/OutboundConnectionStatus.hs
@@ -0,0 +1,167 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.OutboundConnectionStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.OutboundConnectionStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.OutboundConnectionStatusCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | The status of an outbound cross-cluster connection.
+--
+-- /See:/ 'newOutboundConnectionStatus' smart constructor.
+data OutboundConnectionStatus = OutboundConnectionStatus'
+  { -- | Verbose information for the outbound connection.
+    message :: Prelude.Maybe Prelude.Text,
+    -- | The status code for the outbound connection. Can be one of the
+    -- following:
+    --
+    -- -   __VALIDATING__ - The outbound connection request is being validated.
+    --
+    -- -   __VALIDATION_FAILED__ - Validation failed for the connection
+    --     request.
+    --
+    -- -   __PENDING_ACCEPTANCE__: Outbound connection request is validated and
+    --     is not yet accepted by the remote domain owner.
+    --
+    -- -   __APPROVED__ - Outbound connection has been approved by the remote
+    --     domain owner for getting provisioned.
+    --
+    -- -   __PROVISIONING__ - Outbound connection request is in process.
+    --
+    -- -   __ACTIVE__ - Outbound connection is active and ready to use.
+    --
+    -- -   __REJECTING__ - Outbound connection rejection by remote domain owner
+    --     is in progress.
+    --
+    -- -   __REJECTED__ - Outbound connection request is rejected by remote
+    --     domain owner.
+    --
+    -- -   __DELETING__ - Outbound connection deletion is in progress.
+    --
+    -- -   __DELETED__ - Outbound connection is deleted and can no longer be
+    --     used.
+    statusCode :: Prelude.Maybe OutboundConnectionStatusCode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OutboundConnectionStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'message', 'outboundConnectionStatus_message' - Verbose information for the outbound connection.
+--
+-- 'statusCode', 'outboundConnectionStatus_statusCode' - The status code for the outbound connection. Can be one of the
+-- following:
+--
+-- -   __VALIDATING__ - The outbound connection request is being validated.
+--
+-- -   __VALIDATION_FAILED__ - Validation failed for the connection
+--     request.
+--
+-- -   __PENDING_ACCEPTANCE__: Outbound connection request is validated and
+--     is not yet accepted by the remote domain owner.
+--
+-- -   __APPROVED__ - Outbound connection has been approved by the remote
+--     domain owner for getting provisioned.
+--
+-- -   __PROVISIONING__ - Outbound connection request is in process.
+--
+-- -   __ACTIVE__ - Outbound connection is active and ready to use.
+--
+-- -   __REJECTING__ - Outbound connection rejection by remote domain owner
+--     is in progress.
+--
+-- -   __REJECTED__ - Outbound connection request is rejected by remote
+--     domain owner.
+--
+-- -   __DELETING__ - Outbound connection deletion is in progress.
+--
+-- -   __DELETED__ - Outbound connection is deleted and can no longer be
+--     used.
+newOutboundConnectionStatus ::
+  OutboundConnectionStatus
+newOutboundConnectionStatus =
+  OutboundConnectionStatus'
+    { message =
+        Prelude.Nothing,
+      statusCode = Prelude.Nothing
+    }
+
+-- | Verbose information for the outbound connection.
+outboundConnectionStatus_message :: Lens.Lens' OutboundConnectionStatus (Prelude.Maybe Prelude.Text)
+outboundConnectionStatus_message = Lens.lens (\OutboundConnectionStatus' {message} -> message) (\s@OutboundConnectionStatus' {} a -> s {message = a} :: OutboundConnectionStatus)
+
+-- | The status code for the outbound connection. Can be one of the
+-- following:
+--
+-- -   __VALIDATING__ - The outbound connection request is being validated.
+--
+-- -   __VALIDATION_FAILED__ - Validation failed for the connection
+--     request.
+--
+-- -   __PENDING_ACCEPTANCE__: Outbound connection request is validated and
+--     is not yet accepted by the remote domain owner.
+--
+-- -   __APPROVED__ - Outbound connection has been approved by the remote
+--     domain owner for getting provisioned.
+--
+-- -   __PROVISIONING__ - Outbound connection request is in process.
+--
+-- -   __ACTIVE__ - Outbound connection is active and ready to use.
+--
+-- -   __REJECTING__ - Outbound connection rejection by remote domain owner
+--     is in progress.
+--
+-- -   __REJECTED__ - Outbound connection request is rejected by remote
+--     domain owner.
+--
+-- -   __DELETING__ - Outbound connection deletion is in progress.
+--
+-- -   __DELETED__ - Outbound connection is deleted and can no longer be
+--     used.
+outboundConnectionStatus_statusCode :: Lens.Lens' OutboundConnectionStatus (Prelude.Maybe OutboundConnectionStatusCode)
+outboundConnectionStatus_statusCode = Lens.lens (\OutboundConnectionStatus' {statusCode} -> statusCode) (\s@OutboundConnectionStatus' {} a -> s {statusCode = a} :: OutboundConnectionStatus)
+
+instance Data.FromJSON OutboundConnectionStatus where
+  parseJSON =
+    Data.withObject
+      "OutboundConnectionStatus"
+      ( \x ->
+          OutboundConnectionStatus'
+            Prelude.<$> (x Data..:? "Message")
+            Prelude.<*> (x Data..:? "StatusCode")
+      )
+
+instance Prelude.Hashable OutboundConnectionStatus where
+  hashWithSalt _salt OutboundConnectionStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` message
+      `Prelude.hashWithSalt` statusCode
+
+instance Prelude.NFData OutboundConnectionStatus where
+  rnf OutboundConnectionStatus' {..} =
+    Prelude.rnf message
+      `Prelude.seq` Prelude.rnf statusCode
diff --git a/gen/Amazonka/OpenSearch/Types/OutboundConnectionStatusCode.hs b/gen/Amazonka/OpenSearch/Types/OutboundConnectionStatusCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/OutboundConnectionStatusCode.hs
@@ -0,0 +1,111 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.OutboundConnectionStatusCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.OutboundConnectionStatusCode
+  ( OutboundConnectionStatusCode
+      ( ..,
+        OutboundConnectionStatusCode_ACTIVE,
+        OutboundConnectionStatusCode_APPROVED,
+        OutboundConnectionStatusCode_DELETED,
+        OutboundConnectionStatusCode_DELETING,
+        OutboundConnectionStatusCode_PENDING_ACCEPTANCE,
+        OutboundConnectionStatusCode_PROVISIONING,
+        OutboundConnectionStatusCode_REJECTED,
+        OutboundConnectionStatusCode_REJECTING,
+        OutboundConnectionStatusCode_VALIDATING,
+        OutboundConnectionStatusCode_VALIDATION_FAILED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype OutboundConnectionStatusCode = OutboundConnectionStatusCode'
+  { fromOutboundConnectionStatusCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern OutboundConnectionStatusCode_ACTIVE :: OutboundConnectionStatusCode
+pattern OutboundConnectionStatusCode_ACTIVE = OutboundConnectionStatusCode' "ACTIVE"
+
+pattern OutboundConnectionStatusCode_APPROVED :: OutboundConnectionStatusCode
+pattern OutboundConnectionStatusCode_APPROVED = OutboundConnectionStatusCode' "APPROVED"
+
+pattern OutboundConnectionStatusCode_DELETED :: OutboundConnectionStatusCode
+pattern OutboundConnectionStatusCode_DELETED = OutboundConnectionStatusCode' "DELETED"
+
+pattern OutboundConnectionStatusCode_DELETING :: OutboundConnectionStatusCode
+pattern OutboundConnectionStatusCode_DELETING = OutboundConnectionStatusCode' "DELETING"
+
+pattern OutboundConnectionStatusCode_PENDING_ACCEPTANCE :: OutboundConnectionStatusCode
+pattern OutboundConnectionStatusCode_PENDING_ACCEPTANCE = OutboundConnectionStatusCode' "PENDING_ACCEPTANCE"
+
+pattern OutboundConnectionStatusCode_PROVISIONING :: OutboundConnectionStatusCode
+pattern OutboundConnectionStatusCode_PROVISIONING = OutboundConnectionStatusCode' "PROVISIONING"
+
+pattern OutboundConnectionStatusCode_REJECTED :: OutboundConnectionStatusCode
+pattern OutboundConnectionStatusCode_REJECTED = OutboundConnectionStatusCode' "REJECTED"
+
+pattern OutboundConnectionStatusCode_REJECTING :: OutboundConnectionStatusCode
+pattern OutboundConnectionStatusCode_REJECTING = OutboundConnectionStatusCode' "REJECTING"
+
+pattern OutboundConnectionStatusCode_VALIDATING :: OutboundConnectionStatusCode
+pattern OutboundConnectionStatusCode_VALIDATING = OutboundConnectionStatusCode' "VALIDATING"
+
+pattern OutboundConnectionStatusCode_VALIDATION_FAILED :: OutboundConnectionStatusCode
+pattern OutboundConnectionStatusCode_VALIDATION_FAILED = OutboundConnectionStatusCode' "VALIDATION_FAILED"
+
+{-# COMPLETE
+  OutboundConnectionStatusCode_ACTIVE,
+  OutboundConnectionStatusCode_APPROVED,
+  OutboundConnectionStatusCode_DELETED,
+  OutboundConnectionStatusCode_DELETING,
+  OutboundConnectionStatusCode_PENDING_ACCEPTANCE,
+  OutboundConnectionStatusCode_PROVISIONING,
+  OutboundConnectionStatusCode_REJECTED,
+  OutboundConnectionStatusCode_REJECTING,
+  OutboundConnectionStatusCode_VALIDATING,
+  OutboundConnectionStatusCode_VALIDATION_FAILED,
+  OutboundConnectionStatusCode'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/OverallChangeStatus.hs b/gen/Amazonka/OpenSearch/Types/OverallChangeStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/OverallChangeStatus.hs
@@ -0,0 +1,82 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.OverallChangeStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.OverallChangeStatus
+  ( OverallChangeStatus
+      ( ..,
+        OverallChangeStatus_COMPLETED,
+        OverallChangeStatus_FAILED,
+        OverallChangeStatus_PENDING,
+        OverallChangeStatus_PROCESSING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The overall status value of the domain configuration change.
+newtype OverallChangeStatus = OverallChangeStatus'
+  { fromOverallChangeStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern OverallChangeStatus_COMPLETED :: OverallChangeStatus
+pattern OverallChangeStatus_COMPLETED = OverallChangeStatus' "COMPLETED"
+
+pattern OverallChangeStatus_FAILED :: OverallChangeStatus
+pattern OverallChangeStatus_FAILED = OverallChangeStatus' "FAILED"
+
+pattern OverallChangeStatus_PENDING :: OverallChangeStatus
+pattern OverallChangeStatus_PENDING = OverallChangeStatus' "PENDING"
+
+pattern OverallChangeStatus_PROCESSING :: OverallChangeStatus
+pattern OverallChangeStatus_PROCESSING = OverallChangeStatus' "PROCESSING"
+
+{-# COMPLETE
+  OverallChangeStatus_COMPLETED,
+  OverallChangeStatus_FAILED,
+  OverallChangeStatus_PENDING,
+  OverallChangeStatus_PROCESSING,
+  OverallChangeStatus'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/PackageDetails.hs b/gen/Amazonka/OpenSearch/Types/PackageDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/PackageDetails.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.PackageDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.PackageDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.ErrorDetails
+import Amazonka.OpenSearch.Types.PackageStatus
+import Amazonka.OpenSearch.Types.PackageType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Basic information about a package.
+--
+-- /See:/ 'newPackageDetails' smart constructor.
+data PackageDetails = PackageDetails'
+  { -- | The package version.
+    availablePackageVersion :: Prelude.Maybe Prelude.Text,
+    -- | The timestamp when the package was created.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | Additional information if the package is in an error state. Null
+    -- otherwise.
+    errorDetails :: Prelude.Maybe ErrorDetails,
+    -- | Date and time when the package was last updated.
+    lastUpdatedAt :: Prelude.Maybe Data.POSIX,
+    -- | User-specified description of the package.
+    packageDescription :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the package.
+    packageID :: Prelude.Maybe Prelude.Text,
+    -- | User-specified name of the package.
+    packageName :: Prelude.Maybe Prelude.Text,
+    -- | Current status of the package.
+    packageStatus :: Prelude.Maybe PackageStatus,
+    -- | The type of package.
+    packageType :: Prelude.Maybe PackageType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PackageDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'availablePackageVersion', 'packageDetails_availablePackageVersion' - The package version.
+--
+-- 'createdAt', 'packageDetails_createdAt' - The timestamp when the package was created.
+--
+-- 'errorDetails', 'packageDetails_errorDetails' - Additional information if the package is in an error state. Null
+-- otherwise.
+--
+-- 'lastUpdatedAt', 'packageDetails_lastUpdatedAt' - Date and time when the package was last updated.
+--
+-- 'packageDescription', 'packageDetails_packageDescription' - User-specified description of the package.
+--
+-- 'packageID', 'packageDetails_packageID' - The unique identifier of the package.
+--
+-- 'packageName', 'packageDetails_packageName' - User-specified name of the package.
+--
+-- 'packageStatus', 'packageDetails_packageStatus' - Current status of the package.
+--
+-- 'packageType', 'packageDetails_packageType' - The type of package.
+newPackageDetails ::
+  PackageDetails
+newPackageDetails =
+  PackageDetails'
+    { availablePackageVersion =
+        Prelude.Nothing,
+      createdAt = Prelude.Nothing,
+      errorDetails = Prelude.Nothing,
+      lastUpdatedAt = Prelude.Nothing,
+      packageDescription = Prelude.Nothing,
+      packageID = Prelude.Nothing,
+      packageName = Prelude.Nothing,
+      packageStatus = Prelude.Nothing,
+      packageType = Prelude.Nothing
+    }
+
+-- | The package version.
+packageDetails_availablePackageVersion :: Lens.Lens' PackageDetails (Prelude.Maybe Prelude.Text)
+packageDetails_availablePackageVersion = Lens.lens (\PackageDetails' {availablePackageVersion} -> availablePackageVersion) (\s@PackageDetails' {} a -> s {availablePackageVersion = a} :: PackageDetails)
+
+-- | The timestamp when the package was created.
+packageDetails_createdAt :: Lens.Lens' PackageDetails (Prelude.Maybe Prelude.UTCTime)
+packageDetails_createdAt = Lens.lens (\PackageDetails' {createdAt} -> createdAt) (\s@PackageDetails' {} a -> s {createdAt = a} :: PackageDetails) Prelude.. Lens.mapping Data._Time
+
+-- | Additional information if the package is in an error state. Null
+-- otherwise.
+packageDetails_errorDetails :: Lens.Lens' PackageDetails (Prelude.Maybe ErrorDetails)
+packageDetails_errorDetails = Lens.lens (\PackageDetails' {errorDetails} -> errorDetails) (\s@PackageDetails' {} a -> s {errorDetails = a} :: PackageDetails)
+
+-- | Date and time when the package was last updated.
+packageDetails_lastUpdatedAt :: Lens.Lens' PackageDetails (Prelude.Maybe Prelude.UTCTime)
+packageDetails_lastUpdatedAt = Lens.lens (\PackageDetails' {lastUpdatedAt} -> lastUpdatedAt) (\s@PackageDetails' {} a -> s {lastUpdatedAt = a} :: PackageDetails) Prelude.. Lens.mapping Data._Time
+
+-- | User-specified description of the package.
+packageDetails_packageDescription :: Lens.Lens' PackageDetails (Prelude.Maybe Prelude.Text)
+packageDetails_packageDescription = Lens.lens (\PackageDetails' {packageDescription} -> packageDescription) (\s@PackageDetails' {} a -> s {packageDescription = a} :: PackageDetails)
+
+-- | The unique identifier of the package.
+packageDetails_packageID :: Lens.Lens' PackageDetails (Prelude.Maybe Prelude.Text)
+packageDetails_packageID = Lens.lens (\PackageDetails' {packageID} -> packageID) (\s@PackageDetails' {} a -> s {packageID = a} :: PackageDetails)
+
+-- | User-specified name of the package.
+packageDetails_packageName :: Lens.Lens' PackageDetails (Prelude.Maybe Prelude.Text)
+packageDetails_packageName = Lens.lens (\PackageDetails' {packageName} -> packageName) (\s@PackageDetails' {} a -> s {packageName = a} :: PackageDetails)
+
+-- | Current status of the package.
+packageDetails_packageStatus :: Lens.Lens' PackageDetails (Prelude.Maybe PackageStatus)
+packageDetails_packageStatus = Lens.lens (\PackageDetails' {packageStatus} -> packageStatus) (\s@PackageDetails' {} a -> s {packageStatus = a} :: PackageDetails)
+
+-- | The type of package.
+packageDetails_packageType :: Lens.Lens' PackageDetails (Prelude.Maybe PackageType)
+packageDetails_packageType = Lens.lens (\PackageDetails' {packageType} -> packageType) (\s@PackageDetails' {} a -> s {packageType = a} :: PackageDetails)
+
+instance Data.FromJSON PackageDetails where
+  parseJSON =
+    Data.withObject
+      "PackageDetails"
+      ( \x ->
+          PackageDetails'
+            Prelude.<$> (x Data..:? "AvailablePackageVersion")
+            Prelude.<*> (x Data..:? "CreatedAt")
+            Prelude.<*> (x Data..:? "ErrorDetails")
+            Prelude.<*> (x Data..:? "LastUpdatedAt")
+            Prelude.<*> (x Data..:? "PackageDescription")
+            Prelude.<*> (x Data..:? "PackageID")
+            Prelude.<*> (x Data..:? "PackageName")
+            Prelude.<*> (x Data..:? "PackageStatus")
+            Prelude.<*> (x Data..:? "PackageType")
+      )
+
+instance Prelude.Hashable PackageDetails where
+  hashWithSalt _salt PackageDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` availablePackageVersion
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` errorDetails
+      `Prelude.hashWithSalt` lastUpdatedAt
+      `Prelude.hashWithSalt` packageDescription
+      `Prelude.hashWithSalt` packageID
+      `Prelude.hashWithSalt` packageName
+      `Prelude.hashWithSalt` packageStatus
+      `Prelude.hashWithSalt` packageType
+
+instance Prelude.NFData PackageDetails where
+  rnf PackageDetails' {..} =
+    Prelude.rnf availablePackageVersion
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf errorDetails
+      `Prelude.seq` Prelude.rnf lastUpdatedAt
+      `Prelude.seq` Prelude.rnf packageDescription
+      `Prelude.seq` Prelude.rnf packageID
+      `Prelude.seq` Prelude.rnf packageName
+      `Prelude.seq` Prelude.rnf packageStatus
+      `Prelude.seq` Prelude.rnf packageType
diff --git a/gen/Amazonka/OpenSearch/Types/PackageSource.hs b/gen/Amazonka/OpenSearch/Types/PackageSource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/PackageSource.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.PackageSource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.PackageSource where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The Amazon S3 location to import the package from.
+--
+-- /See:/ 'newPackageSource' smart constructor.
+data PackageSource = PackageSource'
+  { -- | The name of the Amazon S3 bucket containing the package.
+    s3BucketName :: Prelude.Maybe Prelude.Text,
+    -- | Key (file name) of the package.
+    s3Key :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PackageSource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 's3BucketName', 'packageSource_s3BucketName' - The name of the Amazon S3 bucket containing the package.
+--
+-- 's3Key', 'packageSource_s3Key' - Key (file name) of the package.
+newPackageSource ::
+  PackageSource
+newPackageSource =
+  PackageSource'
+    { s3BucketName = Prelude.Nothing,
+      s3Key = Prelude.Nothing
+    }
+
+-- | The name of the Amazon S3 bucket containing the package.
+packageSource_s3BucketName :: Lens.Lens' PackageSource (Prelude.Maybe Prelude.Text)
+packageSource_s3BucketName = Lens.lens (\PackageSource' {s3BucketName} -> s3BucketName) (\s@PackageSource' {} a -> s {s3BucketName = a} :: PackageSource)
+
+-- | Key (file name) of the package.
+packageSource_s3Key :: Lens.Lens' PackageSource (Prelude.Maybe Prelude.Text)
+packageSource_s3Key = Lens.lens (\PackageSource' {s3Key} -> s3Key) (\s@PackageSource' {} a -> s {s3Key = a} :: PackageSource)
+
+instance Prelude.Hashable PackageSource where
+  hashWithSalt _salt PackageSource' {..} =
+    _salt
+      `Prelude.hashWithSalt` s3BucketName
+      `Prelude.hashWithSalt` s3Key
+
+instance Prelude.NFData PackageSource where
+  rnf PackageSource' {..} =
+    Prelude.rnf s3BucketName
+      `Prelude.seq` Prelude.rnf s3Key
+
+instance Data.ToJSON PackageSource where
+  toJSON PackageSource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("S3BucketName" Data..=) Prelude.<$> s3BucketName,
+            ("S3Key" Data..=) Prelude.<$> s3Key
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/PackageStatus.hs b/gen/Amazonka/OpenSearch/Types/PackageStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/PackageStatus.hs
@@ -0,0 +1,101 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.PackageStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.PackageStatus
+  ( PackageStatus
+      ( ..,
+        PackageStatus_AVAILABLE,
+        PackageStatus_COPYING,
+        PackageStatus_COPY_FAILED,
+        PackageStatus_DELETED,
+        PackageStatus_DELETE_FAILED,
+        PackageStatus_DELETING,
+        PackageStatus_VALIDATING,
+        PackageStatus_VALIDATION_FAILED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PackageStatus = PackageStatus'
+  { fromPackageStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern PackageStatus_AVAILABLE :: PackageStatus
+pattern PackageStatus_AVAILABLE = PackageStatus' "AVAILABLE"
+
+pattern PackageStatus_COPYING :: PackageStatus
+pattern PackageStatus_COPYING = PackageStatus' "COPYING"
+
+pattern PackageStatus_COPY_FAILED :: PackageStatus
+pattern PackageStatus_COPY_FAILED = PackageStatus' "COPY_FAILED"
+
+pattern PackageStatus_DELETED :: PackageStatus
+pattern PackageStatus_DELETED = PackageStatus' "DELETED"
+
+pattern PackageStatus_DELETE_FAILED :: PackageStatus
+pattern PackageStatus_DELETE_FAILED = PackageStatus' "DELETE_FAILED"
+
+pattern PackageStatus_DELETING :: PackageStatus
+pattern PackageStatus_DELETING = PackageStatus' "DELETING"
+
+pattern PackageStatus_VALIDATING :: PackageStatus
+pattern PackageStatus_VALIDATING = PackageStatus' "VALIDATING"
+
+pattern PackageStatus_VALIDATION_FAILED :: PackageStatus
+pattern PackageStatus_VALIDATION_FAILED = PackageStatus' "VALIDATION_FAILED"
+
+{-# COMPLETE
+  PackageStatus_AVAILABLE,
+  PackageStatus_COPYING,
+  PackageStatus_COPY_FAILED,
+  PackageStatus_DELETED,
+  PackageStatus_DELETE_FAILED,
+  PackageStatus_DELETING,
+  PackageStatus_VALIDATING,
+  PackageStatus_VALIDATION_FAILED,
+  PackageStatus'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/PackageType.hs b/gen/Amazonka/OpenSearch/Types/PackageType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/PackageType.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.PackageType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.PackageType
+  ( PackageType
+      ( ..,
+        PackageType_TXT_DICTIONARY
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PackageType = PackageType'
+  { fromPackageType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern PackageType_TXT_DICTIONARY :: PackageType
+pattern PackageType_TXT_DICTIONARY = PackageType' "TXT-DICTIONARY"
+
+{-# COMPLETE
+  PackageType_TXT_DICTIONARY,
+  PackageType'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/PackageVersionHistory.hs b/gen/Amazonka/OpenSearch/Types/PackageVersionHistory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/PackageVersionHistory.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.PackageVersionHistory
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.PackageVersionHistory where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Details about a package version.
+--
+-- /See:/ 'newPackageVersionHistory' smart constructor.
+data PackageVersionHistory = PackageVersionHistory'
+  { -- | A message associated with the package version when it was uploaded.
+    commitMessage :: Prelude.Maybe Prelude.Text,
+    -- | The date and time when the package was created.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | The package version.
+    packageVersion :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PackageVersionHistory' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'commitMessage', 'packageVersionHistory_commitMessage' - A message associated with the package version when it was uploaded.
+--
+-- 'createdAt', 'packageVersionHistory_createdAt' - The date and time when the package was created.
+--
+-- 'packageVersion', 'packageVersionHistory_packageVersion' - The package version.
+newPackageVersionHistory ::
+  PackageVersionHistory
+newPackageVersionHistory =
+  PackageVersionHistory'
+    { commitMessage =
+        Prelude.Nothing,
+      createdAt = Prelude.Nothing,
+      packageVersion = Prelude.Nothing
+    }
+
+-- | A message associated with the package version when it was uploaded.
+packageVersionHistory_commitMessage :: Lens.Lens' PackageVersionHistory (Prelude.Maybe Prelude.Text)
+packageVersionHistory_commitMessage = Lens.lens (\PackageVersionHistory' {commitMessage} -> commitMessage) (\s@PackageVersionHistory' {} a -> s {commitMessage = a} :: PackageVersionHistory)
+
+-- | The date and time when the package was created.
+packageVersionHistory_createdAt :: Lens.Lens' PackageVersionHistory (Prelude.Maybe Prelude.UTCTime)
+packageVersionHistory_createdAt = Lens.lens (\PackageVersionHistory' {createdAt} -> createdAt) (\s@PackageVersionHistory' {} a -> s {createdAt = a} :: PackageVersionHistory) Prelude.. Lens.mapping Data._Time
+
+-- | The package version.
+packageVersionHistory_packageVersion :: Lens.Lens' PackageVersionHistory (Prelude.Maybe Prelude.Text)
+packageVersionHistory_packageVersion = Lens.lens (\PackageVersionHistory' {packageVersion} -> packageVersion) (\s@PackageVersionHistory' {} a -> s {packageVersion = a} :: PackageVersionHistory)
+
+instance Data.FromJSON PackageVersionHistory where
+  parseJSON =
+    Data.withObject
+      "PackageVersionHistory"
+      ( \x ->
+          PackageVersionHistory'
+            Prelude.<$> (x Data..:? "CommitMessage")
+            Prelude.<*> (x Data..:? "CreatedAt")
+            Prelude.<*> (x Data..:? "PackageVersion")
+      )
+
+instance Prelude.Hashable PackageVersionHistory where
+  hashWithSalt _salt PackageVersionHistory' {..} =
+    _salt
+      `Prelude.hashWithSalt` commitMessage
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` packageVersion
+
+instance Prelude.NFData PackageVersionHistory where
+  rnf PackageVersionHistory' {..} =
+    Prelude.rnf commitMessage
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf packageVersion
diff --git a/gen/Amazonka/OpenSearch/Types/PrincipalType.hs b/gen/Amazonka/OpenSearch/Types/PrincipalType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/PrincipalType.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.PrincipalType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.PrincipalType
+  ( PrincipalType
+      ( ..,
+        PrincipalType_AWS_ACCOUNT,
+        PrincipalType_AWS_SERVICE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PrincipalType = PrincipalType'
+  { fromPrincipalType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern PrincipalType_AWS_ACCOUNT :: PrincipalType
+pattern PrincipalType_AWS_ACCOUNT = PrincipalType' "AWS_ACCOUNT"
+
+pattern PrincipalType_AWS_SERVICE :: PrincipalType
+pattern PrincipalType_AWS_SERVICE = PrincipalType' "AWS_SERVICE"
+
+{-# COMPLETE
+  PrincipalType_AWS_ACCOUNT,
+  PrincipalType_AWS_SERVICE,
+  PrincipalType'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/RecurringCharge.hs b/gen/Amazonka/OpenSearch/Types/RecurringCharge.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/RecurringCharge.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.RecurringCharge
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.RecurringCharge where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains the specific price and frequency of a recurring charges for an
+-- OpenSearch Reserved Instance, or for a Reserved Instance offering.
+--
+-- /See:/ 'newRecurringCharge' smart constructor.
+data RecurringCharge = RecurringCharge'
+  { -- | The monetary amount of the recurring charge.
+    recurringChargeAmount :: Prelude.Maybe Prelude.Double,
+    -- | The frequency of the recurring charge.
+    recurringChargeFrequency :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RecurringCharge' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recurringChargeAmount', 'recurringCharge_recurringChargeAmount' - The monetary amount of the recurring charge.
+--
+-- 'recurringChargeFrequency', 'recurringCharge_recurringChargeFrequency' - The frequency of the recurring charge.
+newRecurringCharge ::
+  RecurringCharge
+newRecurringCharge =
+  RecurringCharge'
+    { recurringChargeAmount =
+        Prelude.Nothing,
+      recurringChargeFrequency = Prelude.Nothing
+    }
+
+-- | The monetary amount of the recurring charge.
+recurringCharge_recurringChargeAmount :: Lens.Lens' RecurringCharge (Prelude.Maybe Prelude.Double)
+recurringCharge_recurringChargeAmount = Lens.lens (\RecurringCharge' {recurringChargeAmount} -> recurringChargeAmount) (\s@RecurringCharge' {} a -> s {recurringChargeAmount = a} :: RecurringCharge)
+
+-- | The frequency of the recurring charge.
+recurringCharge_recurringChargeFrequency :: Lens.Lens' RecurringCharge (Prelude.Maybe Prelude.Text)
+recurringCharge_recurringChargeFrequency = Lens.lens (\RecurringCharge' {recurringChargeFrequency} -> recurringChargeFrequency) (\s@RecurringCharge' {} a -> s {recurringChargeFrequency = a} :: RecurringCharge)
+
+instance Data.FromJSON RecurringCharge where
+  parseJSON =
+    Data.withObject
+      "RecurringCharge"
+      ( \x ->
+          RecurringCharge'
+            Prelude.<$> (x Data..:? "RecurringChargeAmount")
+            Prelude.<*> (x Data..:? "RecurringChargeFrequency")
+      )
+
+instance Prelude.Hashable RecurringCharge where
+  hashWithSalt _salt RecurringCharge' {..} =
+    _salt
+      `Prelude.hashWithSalt` recurringChargeAmount
+      `Prelude.hashWithSalt` recurringChargeFrequency
+
+instance Prelude.NFData RecurringCharge where
+  rnf RecurringCharge' {..} =
+    Prelude.rnf recurringChargeAmount
+      `Prelude.seq` Prelude.rnf recurringChargeFrequency
diff --git a/gen/Amazonka/OpenSearch/Types/ReservedInstance.hs b/gen/Amazonka/OpenSearch/Types/ReservedInstance.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/ReservedInstance.hs
@@ -0,0 +1,244 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.ReservedInstance
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.ReservedInstance where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.OpenSearchPartitionInstanceType
+import Amazonka.OpenSearch.Types.RecurringCharge
+import Amazonka.OpenSearch.Types.ReservedInstancePaymentOption
+import qualified Amazonka.Prelude as Prelude
+
+-- | Details of an OpenSearch Reserved Instance.
+--
+-- /See:/ 'newReservedInstance' smart constructor.
+data ReservedInstance = ReservedInstance'
+  { -- | The unique identifier of the billing subscription.
+    billingSubscriptionId :: Prelude.Maybe Prelude.Integer,
+    -- | The currency code for the offering.
+    currencyCode :: Prelude.Maybe Prelude.Text,
+    -- | The duration, in seconds, for which the OpenSearch instance is reserved.
+    duration :: Prelude.Maybe Prelude.Int,
+    -- | The upfront fixed charge you will paid to purchase the specific Reserved
+    -- Instance offering.
+    fixedPrice :: Prelude.Maybe Prelude.Double,
+    -- | The number of OpenSearch instances that have been reserved.
+    instanceCount :: Prelude.Maybe Prelude.Int,
+    -- | The OpenSearch instance type offered by theReserved Instance offering.
+    instanceType :: Prelude.Maybe OpenSearchPartitionInstanceType,
+    -- | The payment option as defined in the Reserved Instance offering.
+    paymentOption :: Prelude.Maybe ReservedInstancePaymentOption,
+    -- | The recurring charge to your account, regardless of whether you create
+    -- any domains using the Reserved Instance offering.
+    recurringCharges :: Prelude.Maybe [RecurringCharge],
+    -- | The customer-specified identifier to track this reservation.
+    reservationName :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the reservation.
+    reservedInstanceId :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the Reserved Instance offering.
+    reservedInstanceOfferingId :: Prelude.Maybe Prelude.Text,
+    -- | The date and time when the reservation was purchased.
+    startTime :: Prelude.Maybe Data.POSIX,
+    -- | The state of the Reserved Instance.
+    state :: Prelude.Maybe Prelude.Text,
+    -- | The hourly rate at which you\'re charged for the domain using this
+    -- Reserved Instance.
+    usagePrice :: Prelude.Maybe Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ReservedInstance' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'billingSubscriptionId', 'reservedInstance_billingSubscriptionId' - The unique identifier of the billing subscription.
+--
+-- 'currencyCode', 'reservedInstance_currencyCode' - The currency code for the offering.
+--
+-- 'duration', 'reservedInstance_duration' - The duration, in seconds, for which the OpenSearch instance is reserved.
+--
+-- 'fixedPrice', 'reservedInstance_fixedPrice' - The upfront fixed charge you will paid to purchase the specific Reserved
+-- Instance offering.
+--
+-- 'instanceCount', 'reservedInstance_instanceCount' - The number of OpenSearch instances that have been reserved.
+--
+-- 'instanceType', 'reservedInstance_instanceType' - The OpenSearch instance type offered by theReserved Instance offering.
+--
+-- 'paymentOption', 'reservedInstance_paymentOption' - The payment option as defined in the Reserved Instance offering.
+--
+-- 'recurringCharges', 'reservedInstance_recurringCharges' - The recurring charge to your account, regardless of whether you create
+-- any domains using the Reserved Instance offering.
+--
+-- 'reservationName', 'reservedInstance_reservationName' - The customer-specified identifier to track this reservation.
+--
+-- 'reservedInstanceId', 'reservedInstance_reservedInstanceId' - The unique identifier for the reservation.
+--
+-- 'reservedInstanceOfferingId', 'reservedInstance_reservedInstanceOfferingId' - The unique identifier of the Reserved Instance offering.
+--
+-- 'startTime', 'reservedInstance_startTime' - The date and time when the reservation was purchased.
+--
+-- 'state', 'reservedInstance_state' - The state of the Reserved Instance.
+--
+-- 'usagePrice', 'reservedInstance_usagePrice' - The hourly rate at which you\'re charged for the domain using this
+-- Reserved Instance.
+newReservedInstance ::
+  ReservedInstance
+newReservedInstance =
+  ReservedInstance'
+    { billingSubscriptionId =
+        Prelude.Nothing,
+      currencyCode = Prelude.Nothing,
+      duration = Prelude.Nothing,
+      fixedPrice = Prelude.Nothing,
+      instanceCount = Prelude.Nothing,
+      instanceType = Prelude.Nothing,
+      paymentOption = Prelude.Nothing,
+      recurringCharges = Prelude.Nothing,
+      reservationName = Prelude.Nothing,
+      reservedInstanceId = Prelude.Nothing,
+      reservedInstanceOfferingId = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      state = Prelude.Nothing,
+      usagePrice = Prelude.Nothing
+    }
+
+-- | The unique identifier of the billing subscription.
+reservedInstance_billingSubscriptionId :: Lens.Lens' ReservedInstance (Prelude.Maybe Prelude.Integer)
+reservedInstance_billingSubscriptionId = Lens.lens (\ReservedInstance' {billingSubscriptionId} -> billingSubscriptionId) (\s@ReservedInstance' {} a -> s {billingSubscriptionId = a} :: ReservedInstance)
+
+-- | The currency code for the offering.
+reservedInstance_currencyCode :: Lens.Lens' ReservedInstance (Prelude.Maybe Prelude.Text)
+reservedInstance_currencyCode = Lens.lens (\ReservedInstance' {currencyCode} -> currencyCode) (\s@ReservedInstance' {} a -> s {currencyCode = a} :: ReservedInstance)
+
+-- | The duration, in seconds, for which the OpenSearch instance is reserved.
+reservedInstance_duration :: Lens.Lens' ReservedInstance (Prelude.Maybe Prelude.Int)
+reservedInstance_duration = Lens.lens (\ReservedInstance' {duration} -> duration) (\s@ReservedInstance' {} a -> s {duration = a} :: ReservedInstance)
+
+-- | The upfront fixed charge you will paid to purchase the specific Reserved
+-- Instance offering.
+reservedInstance_fixedPrice :: Lens.Lens' ReservedInstance (Prelude.Maybe Prelude.Double)
+reservedInstance_fixedPrice = Lens.lens (\ReservedInstance' {fixedPrice} -> fixedPrice) (\s@ReservedInstance' {} a -> s {fixedPrice = a} :: ReservedInstance)
+
+-- | The number of OpenSearch instances that have been reserved.
+reservedInstance_instanceCount :: Lens.Lens' ReservedInstance (Prelude.Maybe Prelude.Int)
+reservedInstance_instanceCount = Lens.lens (\ReservedInstance' {instanceCount} -> instanceCount) (\s@ReservedInstance' {} a -> s {instanceCount = a} :: ReservedInstance)
+
+-- | The OpenSearch instance type offered by theReserved Instance offering.
+reservedInstance_instanceType :: Lens.Lens' ReservedInstance (Prelude.Maybe OpenSearchPartitionInstanceType)
+reservedInstance_instanceType = Lens.lens (\ReservedInstance' {instanceType} -> instanceType) (\s@ReservedInstance' {} a -> s {instanceType = a} :: ReservedInstance)
+
+-- | The payment option as defined in the Reserved Instance offering.
+reservedInstance_paymentOption :: Lens.Lens' ReservedInstance (Prelude.Maybe ReservedInstancePaymentOption)
+reservedInstance_paymentOption = Lens.lens (\ReservedInstance' {paymentOption} -> paymentOption) (\s@ReservedInstance' {} a -> s {paymentOption = a} :: ReservedInstance)
+
+-- | The recurring charge to your account, regardless of whether you create
+-- any domains using the Reserved Instance offering.
+reservedInstance_recurringCharges :: Lens.Lens' ReservedInstance (Prelude.Maybe [RecurringCharge])
+reservedInstance_recurringCharges = Lens.lens (\ReservedInstance' {recurringCharges} -> recurringCharges) (\s@ReservedInstance' {} a -> s {recurringCharges = a} :: ReservedInstance) Prelude.. Lens.mapping Lens.coerced
+
+-- | The customer-specified identifier to track this reservation.
+reservedInstance_reservationName :: Lens.Lens' ReservedInstance (Prelude.Maybe Prelude.Text)
+reservedInstance_reservationName = Lens.lens (\ReservedInstance' {reservationName} -> reservationName) (\s@ReservedInstance' {} a -> s {reservationName = a} :: ReservedInstance)
+
+-- | The unique identifier for the reservation.
+reservedInstance_reservedInstanceId :: Lens.Lens' ReservedInstance (Prelude.Maybe Prelude.Text)
+reservedInstance_reservedInstanceId = Lens.lens (\ReservedInstance' {reservedInstanceId} -> reservedInstanceId) (\s@ReservedInstance' {} a -> s {reservedInstanceId = a} :: ReservedInstance)
+
+-- | The unique identifier of the Reserved Instance offering.
+reservedInstance_reservedInstanceOfferingId :: Lens.Lens' ReservedInstance (Prelude.Maybe Prelude.Text)
+reservedInstance_reservedInstanceOfferingId = Lens.lens (\ReservedInstance' {reservedInstanceOfferingId} -> reservedInstanceOfferingId) (\s@ReservedInstance' {} a -> s {reservedInstanceOfferingId = a} :: ReservedInstance)
+
+-- | The date and time when the reservation was purchased.
+reservedInstance_startTime :: Lens.Lens' ReservedInstance (Prelude.Maybe Prelude.UTCTime)
+reservedInstance_startTime = Lens.lens (\ReservedInstance' {startTime} -> startTime) (\s@ReservedInstance' {} a -> s {startTime = a} :: ReservedInstance) Prelude.. Lens.mapping Data._Time
+
+-- | The state of the Reserved Instance.
+reservedInstance_state :: Lens.Lens' ReservedInstance (Prelude.Maybe Prelude.Text)
+reservedInstance_state = Lens.lens (\ReservedInstance' {state} -> state) (\s@ReservedInstance' {} a -> s {state = a} :: ReservedInstance)
+
+-- | The hourly rate at which you\'re charged for the domain using this
+-- Reserved Instance.
+reservedInstance_usagePrice :: Lens.Lens' ReservedInstance (Prelude.Maybe Prelude.Double)
+reservedInstance_usagePrice = Lens.lens (\ReservedInstance' {usagePrice} -> usagePrice) (\s@ReservedInstance' {} a -> s {usagePrice = a} :: ReservedInstance)
+
+instance Data.FromJSON ReservedInstance where
+  parseJSON =
+    Data.withObject
+      "ReservedInstance"
+      ( \x ->
+          ReservedInstance'
+            Prelude.<$> (x Data..:? "BillingSubscriptionId")
+            Prelude.<*> (x Data..:? "CurrencyCode")
+            Prelude.<*> (x Data..:? "Duration")
+            Prelude.<*> (x Data..:? "FixedPrice")
+            Prelude.<*> (x Data..:? "InstanceCount")
+            Prelude.<*> (x Data..:? "InstanceType")
+            Prelude.<*> (x Data..:? "PaymentOption")
+            Prelude.<*> ( x
+                            Data..:? "RecurringCharges"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "ReservationName")
+            Prelude.<*> (x Data..:? "ReservedInstanceId")
+            Prelude.<*> (x Data..:? "ReservedInstanceOfferingId")
+            Prelude.<*> (x Data..:? "StartTime")
+            Prelude.<*> (x Data..:? "State")
+            Prelude.<*> (x Data..:? "UsagePrice")
+      )
+
+instance Prelude.Hashable ReservedInstance where
+  hashWithSalt _salt ReservedInstance' {..} =
+    _salt
+      `Prelude.hashWithSalt` billingSubscriptionId
+      `Prelude.hashWithSalt` currencyCode
+      `Prelude.hashWithSalt` duration
+      `Prelude.hashWithSalt` fixedPrice
+      `Prelude.hashWithSalt` instanceCount
+      `Prelude.hashWithSalt` instanceType
+      `Prelude.hashWithSalt` paymentOption
+      `Prelude.hashWithSalt` recurringCharges
+      `Prelude.hashWithSalt` reservationName
+      `Prelude.hashWithSalt` reservedInstanceId
+      `Prelude.hashWithSalt` reservedInstanceOfferingId
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` state
+      `Prelude.hashWithSalt` usagePrice
+
+instance Prelude.NFData ReservedInstance where
+  rnf ReservedInstance' {..} =
+    Prelude.rnf billingSubscriptionId
+      `Prelude.seq` Prelude.rnf currencyCode
+      `Prelude.seq` Prelude.rnf duration
+      `Prelude.seq` Prelude.rnf fixedPrice
+      `Prelude.seq` Prelude.rnf instanceCount
+      `Prelude.seq` Prelude.rnf instanceType
+      `Prelude.seq` Prelude.rnf paymentOption
+      `Prelude.seq` Prelude.rnf recurringCharges
+      `Prelude.seq` Prelude.rnf reservationName
+      `Prelude.seq` Prelude.rnf reservedInstanceId
+      `Prelude.seq` Prelude.rnf reservedInstanceOfferingId
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf usagePrice
diff --git a/gen/Amazonka/OpenSearch/Types/ReservedInstanceOffering.hs b/gen/Amazonka/OpenSearch/Types/ReservedInstanceOffering.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/ReservedInstanceOffering.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.ReservedInstanceOffering
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.ReservedInstanceOffering where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.OpenSearchPartitionInstanceType
+import Amazonka.OpenSearch.Types.RecurringCharge
+import Amazonka.OpenSearch.Types.ReservedInstancePaymentOption
+import qualified Amazonka.Prelude as Prelude
+
+-- | Details of an OpenSearch Reserved Instance offering.
+--
+-- /See:/ 'newReservedInstanceOffering' smart constructor.
+data ReservedInstanceOffering = ReservedInstanceOffering'
+  { -- | The currency code for the Reserved Instance offering.
+    currencyCode :: Prelude.Maybe Prelude.Text,
+    -- | The duration, in seconds, for which the offering will reserve the
+    -- OpenSearch instance.
+    duration :: Prelude.Maybe Prelude.Int,
+    -- | The upfront fixed charge you will pay to purchase the specific Reserved
+    -- Instance offering.
+    fixedPrice :: Prelude.Maybe Prelude.Double,
+    -- | The OpenSearch instance type offered by the Reserved Instance offering.
+    instanceType :: Prelude.Maybe OpenSearchPartitionInstanceType,
+    -- | Payment option for the Reserved Instance offering
+    paymentOption :: Prelude.Maybe ReservedInstancePaymentOption,
+    -- | The recurring charge to your account, regardless of whether you creates
+    -- any domains using the offering.
+    recurringCharges :: Prelude.Maybe [RecurringCharge],
+    -- | The unique identifier of the Reserved Instance offering.
+    reservedInstanceOfferingId :: Prelude.Maybe Prelude.Text,
+    -- | The hourly rate at which you\'re charged for the domain using this
+    -- Reserved Instance.
+    usagePrice :: Prelude.Maybe Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ReservedInstanceOffering' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'currencyCode', 'reservedInstanceOffering_currencyCode' - The currency code for the Reserved Instance offering.
+--
+-- 'duration', 'reservedInstanceOffering_duration' - The duration, in seconds, for which the offering will reserve the
+-- OpenSearch instance.
+--
+-- 'fixedPrice', 'reservedInstanceOffering_fixedPrice' - The upfront fixed charge you will pay to purchase the specific Reserved
+-- Instance offering.
+--
+-- 'instanceType', 'reservedInstanceOffering_instanceType' - The OpenSearch instance type offered by the Reserved Instance offering.
+--
+-- 'paymentOption', 'reservedInstanceOffering_paymentOption' - Payment option for the Reserved Instance offering
+--
+-- 'recurringCharges', 'reservedInstanceOffering_recurringCharges' - The recurring charge to your account, regardless of whether you creates
+-- any domains using the offering.
+--
+-- 'reservedInstanceOfferingId', 'reservedInstanceOffering_reservedInstanceOfferingId' - The unique identifier of the Reserved Instance offering.
+--
+-- 'usagePrice', 'reservedInstanceOffering_usagePrice' - The hourly rate at which you\'re charged for the domain using this
+-- Reserved Instance.
+newReservedInstanceOffering ::
+  ReservedInstanceOffering
+newReservedInstanceOffering =
+  ReservedInstanceOffering'
+    { currencyCode =
+        Prelude.Nothing,
+      duration = Prelude.Nothing,
+      fixedPrice = Prelude.Nothing,
+      instanceType = Prelude.Nothing,
+      paymentOption = Prelude.Nothing,
+      recurringCharges = Prelude.Nothing,
+      reservedInstanceOfferingId = Prelude.Nothing,
+      usagePrice = Prelude.Nothing
+    }
+
+-- | The currency code for the Reserved Instance offering.
+reservedInstanceOffering_currencyCode :: Lens.Lens' ReservedInstanceOffering (Prelude.Maybe Prelude.Text)
+reservedInstanceOffering_currencyCode = Lens.lens (\ReservedInstanceOffering' {currencyCode} -> currencyCode) (\s@ReservedInstanceOffering' {} a -> s {currencyCode = a} :: ReservedInstanceOffering)
+
+-- | The duration, in seconds, for which the offering will reserve the
+-- OpenSearch instance.
+reservedInstanceOffering_duration :: Lens.Lens' ReservedInstanceOffering (Prelude.Maybe Prelude.Int)
+reservedInstanceOffering_duration = Lens.lens (\ReservedInstanceOffering' {duration} -> duration) (\s@ReservedInstanceOffering' {} a -> s {duration = a} :: ReservedInstanceOffering)
+
+-- | The upfront fixed charge you will pay to purchase the specific Reserved
+-- Instance offering.
+reservedInstanceOffering_fixedPrice :: Lens.Lens' ReservedInstanceOffering (Prelude.Maybe Prelude.Double)
+reservedInstanceOffering_fixedPrice = Lens.lens (\ReservedInstanceOffering' {fixedPrice} -> fixedPrice) (\s@ReservedInstanceOffering' {} a -> s {fixedPrice = a} :: ReservedInstanceOffering)
+
+-- | The OpenSearch instance type offered by the Reserved Instance offering.
+reservedInstanceOffering_instanceType :: Lens.Lens' ReservedInstanceOffering (Prelude.Maybe OpenSearchPartitionInstanceType)
+reservedInstanceOffering_instanceType = Lens.lens (\ReservedInstanceOffering' {instanceType} -> instanceType) (\s@ReservedInstanceOffering' {} a -> s {instanceType = a} :: ReservedInstanceOffering)
+
+-- | Payment option for the Reserved Instance offering
+reservedInstanceOffering_paymentOption :: Lens.Lens' ReservedInstanceOffering (Prelude.Maybe ReservedInstancePaymentOption)
+reservedInstanceOffering_paymentOption = Lens.lens (\ReservedInstanceOffering' {paymentOption} -> paymentOption) (\s@ReservedInstanceOffering' {} a -> s {paymentOption = a} :: ReservedInstanceOffering)
+
+-- | The recurring charge to your account, regardless of whether you creates
+-- any domains using the offering.
+reservedInstanceOffering_recurringCharges :: Lens.Lens' ReservedInstanceOffering (Prelude.Maybe [RecurringCharge])
+reservedInstanceOffering_recurringCharges = Lens.lens (\ReservedInstanceOffering' {recurringCharges} -> recurringCharges) (\s@ReservedInstanceOffering' {} a -> s {recurringCharges = a} :: ReservedInstanceOffering) Prelude.. Lens.mapping Lens.coerced
+
+-- | The unique identifier of the Reserved Instance offering.
+reservedInstanceOffering_reservedInstanceOfferingId :: Lens.Lens' ReservedInstanceOffering (Prelude.Maybe Prelude.Text)
+reservedInstanceOffering_reservedInstanceOfferingId = Lens.lens (\ReservedInstanceOffering' {reservedInstanceOfferingId} -> reservedInstanceOfferingId) (\s@ReservedInstanceOffering' {} a -> s {reservedInstanceOfferingId = a} :: ReservedInstanceOffering)
+
+-- | The hourly rate at which you\'re charged for the domain using this
+-- Reserved Instance.
+reservedInstanceOffering_usagePrice :: Lens.Lens' ReservedInstanceOffering (Prelude.Maybe Prelude.Double)
+reservedInstanceOffering_usagePrice = Lens.lens (\ReservedInstanceOffering' {usagePrice} -> usagePrice) (\s@ReservedInstanceOffering' {} a -> s {usagePrice = a} :: ReservedInstanceOffering)
+
+instance Data.FromJSON ReservedInstanceOffering where
+  parseJSON =
+    Data.withObject
+      "ReservedInstanceOffering"
+      ( \x ->
+          ReservedInstanceOffering'
+            Prelude.<$> (x Data..:? "CurrencyCode")
+            Prelude.<*> (x Data..:? "Duration")
+            Prelude.<*> (x Data..:? "FixedPrice")
+            Prelude.<*> (x Data..:? "InstanceType")
+            Prelude.<*> (x Data..:? "PaymentOption")
+            Prelude.<*> ( x
+                            Data..:? "RecurringCharges"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "ReservedInstanceOfferingId")
+            Prelude.<*> (x Data..:? "UsagePrice")
+      )
+
+instance Prelude.Hashable ReservedInstanceOffering where
+  hashWithSalt _salt ReservedInstanceOffering' {..} =
+    _salt
+      `Prelude.hashWithSalt` currencyCode
+      `Prelude.hashWithSalt` duration
+      `Prelude.hashWithSalt` fixedPrice
+      `Prelude.hashWithSalt` instanceType
+      `Prelude.hashWithSalt` paymentOption
+      `Prelude.hashWithSalt` recurringCharges
+      `Prelude.hashWithSalt` reservedInstanceOfferingId
+      `Prelude.hashWithSalt` usagePrice
+
+instance Prelude.NFData ReservedInstanceOffering where
+  rnf ReservedInstanceOffering' {..} =
+    Prelude.rnf currencyCode
+      `Prelude.seq` Prelude.rnf duration
+      `Prelude.seq` Prelude.rnf fixedPrice
+      `Prelude.seq` Prelude.rnf instanceType
+      `Prelude.seq` Prelude.rnf paymentOption
+      `Prelude.seq` Prelude.rnf recurringCharges
+      `Prelude.seq` Prelude.rnf reservedInstanceOfferingId
+      `Prelude.seq` Prelude.rnf usagePrice
diff --git a/gen/Amazonka/OpenSearch/Types/ReservedInstancePaymentOption.hs b/gen/Amazonka/OpenSearch/Types/ReservedInstancePaymentOption.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/ReservedInstancePaymentOption.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.ReservedInstancePaymentOption
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.ReservedInstancePaymentOption
+  ( ReservedInstancePaymentOption
+      ( ..,
+        ReservedInstancePaymentOption_ALL_UPFRONT,
+        ReservedInstancePaymentOption_NO_UPFRONT,
+        ReservedInstancePaymentOption_PARTIAL_UPFRONT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ReservedInstancePaymentOption = ReservedInstancePaymentOption'
+  { fromReservedInstancePaymentOption ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ReservedInstancePaymentOption_ALL_UPFRONT :: ReservedInstancePaymentOption
+pattern ReservedInstancePaymentOption_ALL_UPFRONT = ReservedInstancePaymentOption' "ALL_UPFRONT"
+
+pattern ReservedInstancePaymentOption_NO_UPFRONT :: ReservedInstancePaymentOption
+pattern ReservedInstancePaymentOption_NO_UPFRONT = ReservedInstancePaymentOption' "NO_UPFRONT"
+
+pattern ReservedInstancePaymentOption_PARTIAL_UPFRONT :: ReservedInstancePaymentOption
+pattern ReservedInstancePaymentOption_PARTIAL_UPFRONT = ReservedInstancePaymentOption' "PARTIAL_UPFRONT"
+
+{-# COMPLETE
+  ReservedInstancePaymentOption_ALL_UPFRONT,
+  ReservedInstancePaymentOption_NO_UPFRONT,
+  ReservedInstancePaymentOption_PARTIAL_UPFRONT,
+  ReservedInstancePaymentOption'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/RollbackOnDisable.hs b/gen/Amazonka/OpenSearch/Types/RollbackOnDisable.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/RollbackOnDisable.hs
@@ -0,0 +1,72 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.RollbackOnDisable
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.RollbackOnDisable
+  ( RollbackOnDisable
+      ( ..,
+        RollbackOnDisable_DEFAULT_ROLLBACK,
+        RollbackOnDisable_NO_ROLLBACK
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The rollback state while disabling Auto-Tune for the domain.
+newtype RollbackOnDisable = RollbackOnDisable'
+  { fromRollbackOnDisable ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern RollbackOnDisable_DEFAULT_ROLLBACK :: RollbackOnDisable
+pattern RollbackOnDisable_DEFAULT_ROLLBACK = RollbackOnDisable' "DEFAULT_ROLLBACK"
+
+pattern RollbackOnDisable_NO_ROLLBACK :: RollbackOnDisable
+pattern RollbackOnDisable_NO_ROLLBACK = RollbackOnDisable' "NO_ROLLBACK"
+
+{-# COMPLETE
+  RollbackOnDisable_DEFAULT_ROLLBACK,
+  RollbackOnDisable_NO_ROLLBACK,
+  RollbackOnDisable'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/SAMLIdp.hs b/gen/Amazonka/OpenSearch/Types/SAMLIdp.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/SAMLIdp.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.SAMLIdp
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.SAMLIdp where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The SAML identity povider information.
+--
+-- /See:/ 'newSAMLIdp' smart constructor.
+data SAMLIdp = SAMLIdp'
+  { -- | The metadata of the SAML application, in XML format.
+    metadataContent :: Prelude.Text,
+    -- | The unique entity ID of the application in the SAML identity provider.
+    entityId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SAMLIdp' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'metadataContent', 'sAMLIdp_metadataContent' - The metadata of the SAML application, in XML format.
+--
+-- 'entityId', 'sAMLIdp_entityId' - The unique entity ID of the application in the SAML identity provider.
+newSAMLIdp ::
+  -- | 'metadataContent'
+  Prelude.Text ->
+  -- | 'entityId'
+  Prelude.Text ->
+  SAMLIdp
+newSAMLIdp pMetadataContent_ pEntityId_ =
+  SAMLIdp'
+    { metadataContent = pMetadataContent_,
+      entityId = pEntityId_
+    }
+
+-- | The metadata of the SAML application, in XML format.
+sAMLIdp_metadataContent :: Lens.Lens' SAMLIdp Prelude.Text
+sAMLIdp_metadataContent = Lens.lens (\SAMLIdp' {metadataContent} -> metadataContent) (\s@SAMLIdp' {} a -> s {metadataContent = a} :: SAMLIdp)
+
+-- | The unique entity ID of the application in the SAML identity provider.
+sAMLIdp_entityId :: Lens.Lens' SAMLIdp Prelude.Text
+sAMLIdp_entityId = Lens.lens (\SAMLIdp' {entityId} -> entityId) (\s@SAMLIdp' {} a -> s {entityId = a} :: SAMLIdp)
+
+instance Data.FromJSON SAMLIdp where
+  parseJSON =
+    Data.withObject
+      "SAMLIdp"
+      ( \x ->
+          SAMLIdp'
+            Prelude.<$> (x Data..: "MetadataContent")
+            Prelude.<*> (x Data..: "EntityId")
+      )
+
+instance Prelude.Hashable SAMLIdp where
+  hashWithSalt _salt SAMLIdp' {..} =
+    _salt
+      `Prelude.hashWithSalt` metadataContent
+      `Prelude.hashWithSalt` entityId
+
+instance Prelude.NFData SAMLIdp where
+  rnf SAMLIdp' {..} =
+    Prelude.rnf metadataContent
+      `Prelude.seq` Prelude.rnf entityId
+
+instance Data.ToJSON SAMLIdp where
+  toJSON SAMLIdp' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("MetadataContent" Data..= metadataContent),
+            Prelude.Just ("EntityId" Data..= entityId)
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/SAMLOptionsInput.hs b/gen/Amazonka/OpenSearch/Types/SAMLOptionsInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/SAMLOptionsInput.hs
@@ -0,0 +1,160 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.SAMLOptionsInput
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.SAMLOptionsInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.SAMLIdp
+import qualified Amazonka.Prelude as Prelude
+
+-- | The SAML authentication configuration for an Amazon OpenSearch Service
+-- domain.
+--
+-- /See:/ 'newSAMLOptionsInput' smart constructor.
+data SAMLOptionsInput = SAMLOptionsInput'
+  { -- | True to enable SAML authentication for a domain.
+    enabled :: Prelude.Maybe Prelude.Bool,
+    -- | The SAML Identity Provider\'s information.
+    idp :: Prelude.Maybe SAMLIdp,
+    -- | The backend role that the SAML master user is mapped to.
+    masterBackendRole :: Prelude.Maybe Prelude.Text,
+    -- | The SAML master user name, which is stored in the domain\'s internal
+    -- user database.
+    masterUserName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | Element of the SAML assertion to use for backend roles. Default is
+    -- @roles@.
+    rolesKey :: Prelude.Maybe Prelude.Text,
+    -- | The duration, in minutes, after which a user session becomes inactive.
+    -- Acceptable values are between 1 and 1440, and the default value is 60.
+    sessionTimeoutMinutes :: Prelude.Maybe Prelude.Int,
+    -- | Element of the SAML assertion to use for the user name. Default is
+    -- @NameID@.
+    subjectKey :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SAMLOptionsInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enabled', 'sAMLOptionsInput_enabled' - True to enable SAML authentication for a domain.
+--
+-- 'idp', 'sAMLOptionsInput_idp' - The SAML Identity Provider\'s information.
+--
+-- 'masterBackendRole', 'sAMLOptionsInput_masterBackendRole' - The backend role that the SAML master user is mapped to.
+--
+-- 'masterUserName', 'sAMLOptionsInput_masterUserName' - The SAML master user name, which is stored in the domain\'s internal
+-- user database.
+--
+-- 'rolesKey', 'sAMLOptionsInput_rolesKey' - Element of the SAML assertion to use for backend roles. Default is
+-- @roles@.
+--
+-- 'sessionTimeoutMinutes', 'sAMLOptionsInput_sessionTimeoutMinutes' - The duration, in minutes, after which a user session becomes inactive.
+-- Acceptable values are between 1 and 1440, and the default value is 60.
+--
+-- 'subjectKey', 'sAMLOptionsInput_subjectKey' - Element of the SAML assertion to use for the user name. Default is
+-- @NameID@.
+newSAMLOptionsInput ::
+  SAMLOptionsInput
+newSAMLOptionsInput =
+  SAMLOptionsInput'
+    { enabled = Prelude.Nothing,
+      idp = Prelude.Nothing,
+      masterBackendRole = Prelude.Nothing,
+      masterUserName = Prelude.Nothing,
+      rolesKey = Prelude.Nothing,
+      sessionTimeoutMinutes = Prelude.Nothing,
+      subjectKey = Prelude.Nothing
+    }
+
+-- | True to enable SAML authentication for a domain.
+sAMLOptionsInput_enabled :: Lens.Lens' SAMLOptionsInput (Prelude.Maybe Prelude.Bool)
+sAMLOptionsInput_enabled = Lens.lens (\SAMLOptionsInput' {enabled} -> enabled) (\s@SAMLOptionsInput' {} a -> s {enabled = a} :: SAMLOptionsInput)
+
+-- | The SAML Identity Provider\'s information.
+sAMLOptionsInput_idp :: Lens.Lens' SAMLOptionsInput (Prelude.Maybe SAMLIdp)
+sAMLOptionsInput_idp = Lens.lens (\SAMLOptionsInput' {idp} -> idp) (\s@SAMLOptionsInput' {} a -> s {idp = a} :: SAMLOptionsInput)
+
+-- | The backend role that the SAML master user is mapped to.
+sAMLOptionsInput_masterBackendRole :: Lens.Lens' SAMLOptionsInput (Prelude.Maybe Prelude.Text)
+sAMLOptionsInput_masterBackendRole = Lens.lens (\SAMLOptionsInput' {masterBackendRole} -> masterBackendRole) (\s@SAMLOptionsInput' {} a -> s {masterBackendRole = a} :: SAMLOptionsInput)
+
+-- | The SAML master user name, which is stored in the domain\'s internal
+-- user database.
+sAMLOptionsInput_masterUserName :: Lens.Lens' SAMLOptionsInput (Prelude.Maybe Prelude.Text)
+sAMLOptionsInput_masterUserName = Lens.lens (\SAMLOptionsInput' {masterUserName} -> masterUserName) (\s@SAMLOptionsInput' {} a -> s {masterUserName = a} :: SAMLOptionsInput) Prelude.. Lens.mapping Data._Sensitive
+
+-- | Element of the SAML assertion to use for backend roles. Default is
+-- @roles@.
+sAMLOptionsInput_rolesKey :: Lens.Lens' SAMLOptionsInput (Prelude.Maybe Prelude.Text)
+sAMLOptionsInput_rolesKey = Lens.lens (\SAMLOptionsInput' {rolesKey} -> rolesKey) (\s@SAMLOptionsInput' {} a -> s {rolesKey = a} :: SAMLOptionsInput)
+
+-- | The duration, in minutes, after which a user session becomes inactive.
+-- Acceptable values are between 1 and 1440, and the default value is 60.
+sAMLOptionsInput_sessionTimeoutMinutes :: Lens.Lens' SAMLOptionsInput (Prelude.Maybe Prelude.Int)
+sAMLOptionsInput_sessionTimeoutMinutes = Lens.lens (\SAMLOptionsInput' {sessionTimeoutMinutes} -> sessionTimeoutMinutes) (\s@SAMLOptionsInput' {} a -> s {sessionTimeoutMinutes = a} :: SAMLOptionsInput)
+
+-- | Element of the SAML assertion to use for the user name. Default is
+-- @NameID@.
+sAMLOptionsInput_subjectKey :: Lens.Lens' SAMLOptionsInput (Prelude.Maybe Prelude.Text)
+sAMLOptionsInput_subjectKey = Lens.lens (\SAMLOptionsInput' {subjectKey} -> subjectKey) (\s@SAMLOptionsInput' {} a -> s {subjectKey = a} :: SAMLOptionsInput)
+
+instance Prelude.Hashable SAMLOptionsInput where
+  hashWithSalt _salt SAMLOptionsInput' {..} =
+    _salt
+      `Prelude.hashWithSalt` enabled
+      `Prelude.hashWithSalt` idp
+      `Prelude.hashWithSalt` masterBackendRole
+      `Prelude.hashWithSalt` masterUserName
+      `Prelude.hashWithSalt` rolesKey
+      `Prelude.hashWithSalt` sessionTimeoutMinutes
+      `Prelude.hashWithSalt` subjectKey
+
+instance Prelude.NFData SAMLOptionsInput where
+  rnf SAMLOptionsInput' {..} =
+    Prelude.rnf enabled
+      `Prelude.seq` Prelude.rnf idp
+      `Prelude.seq` Prelude.rnf masterBackendRole
+      `Prelude.seq` Prelude.rnf masterUserName
+      `Prelude.seq` Prelude.rnf rolesKey
+      `Prelude.seq` Prelude.rnf sessionTimeoutMinutes
+      `Prelude.seq` Prelude.rnf subjectKey
+
+instance Data.ToJSON SAMLOptionsInput where
+  toJSON SAMLOptionsInput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Enabled" Data..=) Prelude.<$> enabled,
+            ("Idp" Data..=) Prelude.<$> idp,
+            ("MasterBackendRole" Data..=)
+              Prelude.<$> masterBackendRole,
+            ("MasterUserName" Data..=)
+              Prelude.<$> masterUserName,
+            ("RolesKey" Data..=) Prelude.<$> rolesKey,
+            ("SessionTimeoutMinutes" Data..=)
+              Prelude.<$> sessionTimeoutMinutes,
+            ("SubjectKey" Data..=) Prelude.<$> subjectKey
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/SAMLOptionsOutput.hs b/gen/Amazonka/OpenSearch/Types/SAMLOptionsOutput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/SAMLOptionsOutput.hs
@@ -0,0 +1,121 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.SAMLOptionsOutput
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.SAMLOptionsOutput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.SAMLIdp
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the SAML application configured for the domain.
+--
+-- /See:/ 'newSAMLOptionsOutput' smart constructor.
+data SAMLOptionsOutput = SAMLOptionsOutput'
+  { -- | True if SAML is enabled.
+    enabled :: Prelude.Maybe Prelude.Bool,
+    -- | Describes the SAML identity provider\'s information.
+    idp :: Prelude.Maybe SAMLIdp,
+    -- | The key used for matching the SAML roles attribute.
+    rolesKey :: Prelude.Maybe Prelude.Text,
+    -- | The duration, in minutes, after which a user session becomes inactive.
+    sessionTimeoutMinutes :: Prelude.Maybe Prelude.Int,
+    -- | The key used for matching the SAML subject attribute.
+    subjectKey :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SAMLOptionsOutput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enabled', 'sAMLOptionsOutput_enabled' - True if SAML is enabled.
+--
+-- 'idp', 'sAMLOptionsOutput_idp' - Describes the SAML identity provider\'s information.
+--
+-- 'rolesKey', 'sAMLOptionsOutput_rolesKey' - The key used for matching the SAML roles attribute.
+--
+-- 'sessionTimeoutMinutes', 'sAMLOptionsOutput_sessionTimeoutMinutes' - The duration, in minutes, after which a user session becomes inactive.
+--
+-- 'subjectKey', 'sAMLOptionsOutput_subjectKey' - The key used for matching the SAML subject attribute.
+newSAMLOptionsOutput ::
+  SAMLOptionsOutput
+newSAMLOptionsOutput =
+  SAMLOptionsOutput'
+    { enabled = Prelude.Nothing,
+      idp = Prelude.Nothing,
+      rolesKey = Prelude.Nothing,
+      sessionTimeoutMinutes = Prelude.Nothing,
+      subjectKey = Prelude.Nothing
+    }
+
+-- | True if SAML is enabled.
+sAMLOptionsOutput_enabled :: Lens.Lens' SAMLOptionsOutput (Prelude.Maybe Prelude.Bool)
+sAMLOptionsOutput_enabled = Lens.lens (\SAMLOptionsOutput' {enabled} -> enabled) (\s@SAMLOptionsOutput' {} a -> s {enabled = a} :: SAMLOptionsOutput)
+
+-- | Describes the SAML identity provider\'s information.
+sAMLOptionsOutput_idp :: Lens.Lens' SAMLOptionsOutput (Prelude.Maybe SAMLIdp)
+sAMLOptionsOutput_idp = Lens.lens (\SAMLOptionsOutput' {idp} -> idp) (\s@SAMLOptionsOutput' {} a -> s {idp = a} :: SAMLOptionsOutput)
+
+-- | The key used for matching the SAML roles attribute.
+sAMLOptionsOutput_rolesKey :: Lens.Lens' SAMLOptionsOutput (Prelude.Maybe Prelude.Text)
+sAMLOptionsOutput_rolesKey = Lens.lens (\SAMLOptionsOutput' {rolesKey} -> rolesKey) (\s@SAMLOptionsOutput' {} a -> s {rolesKey = a} :: SAMLOptionsOutput)
+
+-- | The duration, in minutes, after which a user session becomes inactive.
+sAMLOptionsOutput_sessionTimeoutMinutes :: Lens.Lens' SAMLOptionsOutput (Prelude.Maybe Prelude.Int)
+sAMLOptionsOutput_sessionTimeoutMinutes = Lens.lens (\SAMLOptionsOutput' {sessionTimeoutMinutes} -> sessionTimeoutMinutes) (\s@SAMLOptionsOutput' {} a -> s {sessionTimeoutMinutes = a} :: SAMLOptionsOutput)
+
+-- | The key used for matching the SAML subject attribute.
+sAMLOptionsOutput_subjectKey :: Lens.Lens' SAMLOptionsOutput (Prelude.Maybe Prelude.Text)
+sAMLOptionsOutput_subjectKey = Lens.lens (\SAMLOptionsOutput' {subjectKey} -> subjectKey) (\s@SAMLOptionsOutput' {} a -> s {subjectKey = a} :: SAMLOptionsOutput)
+
+instance Data.FromJSON SAMLOptionsOutput where
+  parseJSON =
+    Data.withObject
+      "SAMLOptionsOutput"
+      ( \x ->
+          SAMLOptionsOutput'
+            Prelude.<$> (x Data..:? "Enabled")
+            Prelude.<*> (x Data..:? "Idp")
+            Prelude.<*> (x Data..:? "RolesKey")
+            Prelude.<*> (x Data..:? "SessionTimeoutMinutes")
+            Prelude.<*> (x Data..:? "SubjectKey")
+      )
+
+instance Prelude.Hashable SAMLOptionsOutput where
+  hashWithSalt _salt SAMLOptionsOutput' {..} =
+    _salt
+      `Prelude.hashWithSalt` enabled
+      `Prelude.hashWithSalt` idp
+      `Prelude.hashWithSalt` rolesKey
+      `Prelude.hashWithSalt` sessionTimeoutMinutes
+      `Prelude.hashWithSalt` subjectKey
+
+instance Prelude.NFData SAMLOptionsOutput where
+  rnf SAMLOptionsOutput' {..} =
+    Prelude.rnf enabled
+      `Prelude.seq` Prelude.rnf idp
+      `Prelude.seq` Prelude.rnf rolesKey
+      `Prelude.seq` Prelude.rnf sessionTimeoutMinutes
+      `Prelude.seq` Prelude.rnf subjectKey
diff --git a/gen/Amazonka/OpenSearch/Types/ScheduledAutoTuneActionType.hs b/gen/Amazonka/OpenSearch/Types/ScheduledAutoTuneActionType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/ScheduledAutoTuneActionType.hs
@@ -0,0 +1,72 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.ScheduledAutoTuneActionType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.ScheduledAutoTuneActionType
+  ( ScheduledAutoTuneActionType
+      ( ..,
+        ScheduledAutoTuneActionType_JVM_HEAP_SIZE_TUNING,
+        ScheduledAutoTuneActionType_JVM_YOUNG_GEN_TUNING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The Auto-Tune action type.
+newtype ScheduledAutoTuneActionType = ScheduledAutoTuneActionType'
+  { fromScheduledAutoTuneActionType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ScheduledAutoTuneActionType_JVM_HEAP_SIZE_TUNING :: ScheduledAutoTuneActionType
+pattern ScheduledAutoTuneActionType_JVM_HEAP_SIZE_TUNING = ScheduledAutoTuneActionType' "JVM_HEAP_SIZE_TUNING"
+
+pattern ScheduledAutoTuneActionType_JVM_YOUNG_GEN_TUNING :: ScheduledAutoTuneActionType
+pattern ScheduledAutoTuneActionType_JVM_YOUNG_GEN_TUNING = ScheduledAutoTuneActionType' "JVM_YOUNG_GEN_TUNING"
+
+{-# COMPLETE
+  ScheduledAutoTuneActionType_JVM_HEAP_SIZE_TUNING,
+  ScheduledAutoTuneActionType_JVM_YOUNG_GEN_TUNING,
+  ScheduledAutoTuneActionType'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/ScheduledAutoTuneDetails.hs b/gen/Amazonka/OpenSearch/Types/ScheduledAutoTuneDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/ScheduledAutoTuneDetails.hs
@@ -0,0 +1,115 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.ScheduledAutoTuneDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.ScheduledAutoTuneDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.ScheduledAutoTuneActionType
+import Amazonka.OpenSearch.Types.ScheduledAutoTuneSeverityType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies details about a scheduled Auto-Tune action. For more
+-- information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/auto-tune.html Auto-Tune for Amazon OpenSearch Service>.
+--
+-- /See:/ 'newScheduledAutoTuneDetails' smart constructor.
+data ScheduledAutoTuneDetails = ScheduledAutoTuneDetails'
+  { -- | A description of the Auto-Tune action.
+    action :: Prelude.Maybe Prelude.Text,
+    -- | The type of Auto-Tune action.
+    actionType :: Prelude.Maybe ScheduledAutoTuneActionType,
+    -- | The date and time when the Auto-Tune action is scheduled for the domain.
+    date :: Prelude.Maybe Data.POSIX,
+    -- | The severity of the Auto-Tune action. Valid values are @LOW@, @MEDIUM@,
+    -- and @HIGH@.
+    severity :: Prelude.Maybe ScheduledAutoTuneSeverityType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ScheduledAutoTuneDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'action', 'scheduledAutoTuneDetails_action' - A description of the Auto-Tune action.
+--
+-- 'actionType', 'scheduledAutoTuneDetails_actionType' - The type of Auto-Tune action.
+--
+-- 'date', 'scheduledAutoTuneDetails_date' - The date and time when the Auto-Tune action is scheduled for the domain.
+--
+-- 'severity', 'scheduledAutoTuneDetails_severity' - The severity of the Auto-Tune action. Valid values are @LOW@, @MEDIUM@,
+-- and @HIGH@.
+newScheduledAutoTuneDetails ::
+  ScheduledAutoTuneDetails
+newScheduledAutoTuneDetails =
+  ScheduledAutoTuneDetails'
+    { action = Prelude.Nothing,
+      actionType = Prelude.Nothing,
+      date = Prelude.Nothing,
+      severity = Prelude.Nothing
+    }
+
+-- | A description of the Auto-Tune action.
+scheduledAutoTuneDetails_action :: Lens.Lens' ScheduledAutoTuneDetails (Prelude.Maybe Prelude.Text)
+scheduledAutoTuneDetails_action = Lens.lens (\ScheduledAutoTuneDetails' {action} -> action) (\s@ScheduledAutoTuneDetails' {} a -> s {action = a} :: ScheduledAutoTuneDetails)
+
+-- | The type of Auto-Tune action.
+scheduledAutoTuneDetails_actionType :: Lens.Lens' ScheduledAutoTuneDetails (Prelude.Maybe ScheduledAutoTuneActionType)
+scheduledAutoTuneDetails_actionType = Lens.lens (\ScheduledAutoTuneDetails' {actionType} -> actionType) (\s@ScheduledAutoTuneDetails' {} a -> s {actionType = a} :: ScheduledAutoTuneDetails)
+
+-- | The date and time when the Auto-Tune action is scheduled for the domain.
+scheduledAutoTuneDetails_date :: Lens.Lens' ScheduledAutoTuneDetails (Prelude.Maybe Prelude.UTCTime)
+scheduledAutoTuneDetails_date = Lens.lens (\ScheduledAutoTuneDetails' {date} -> date) (\s@ScheduledAutoTuneDetails' {} a -> s {date = a} :: ScheduledAutoTuneDetails) Prelude.. Lens.mapping Data._Time
+
+-- | The severity of the Auto-Tune action. Valid values are @LOW@, @MEDIUM@,
+-- and @HIGH@.
+scheduledAutoTuneDetails_severity :: Lens.Lens' ScheduledAutoTuneDetails (Prelude.Maybe ScheduledAutoTuneSeverityType)
+scheduledAutoTuneDetails_severity = Lens.lens (\ScheduledAutoTuneDetails' {severity} -> severity) (\s@ScheduledAutoTuneDetails' {} a -> s {severity = a} :: ScheduledAutoTuneDetails)
+
+instance Data.FromJSON ScheduledAutoTuneDetails where
+  parseJSON =
+    Data.withObject
+      "ScheduledAutoTuneDetails"
+      ( \x ->
+          ScheduledAutoTuneDetails'
+            Prelude.<$> (x Data..:? "Action")
+            Prelude.<*> (x Data..:? "ActionType")
+            Prelude.<*> (x Data..:? "Date")
+            Prelude.<*> (x Data..:? "Severity")
+      )
+
+instance Prelude.Hashable ScheduledAutoTuneDetails where
+  hashWithSalt _salt ScheduledAutoTuneDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` action
+      `Prelude.hashWithSalt` actionType
+      `Prelude.hashWithSalt` date
+      `Prelude.hashWithSalt` severity
+
+instance Prelude.NFData ScheduledAutoTuneDetails where
+  rnf ScheduledAutoTuneDetails' {..} =
+    Prelude.rnf action
+      `Prelude.seq` Prelude.rnf actionType
+      `Prelude.seq` Prelude.rnf date
+      `Prelude.seq` Prelude.rnf severity
diff --git a/gen/Amazonka/OpenSearch/Types/ScheduledAutoTuneSeverityType.hs b/gen/Amazonka/OpenSearch/Types/ScheduledAutoTuneSeverityType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/ScheduledAutoTuneSeverityType.hs
@@ -0,0 +1,77 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.ScheduledAutoTuneSeverityType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.ScheduledAutoTuneSeverityType
+  ( ScheduledAutoTuneSeverityType
+      ( ..,
+        ScheduledAutoTuneSeverityType_HIGH,
+        ScheduledAutoTuneSeverityType_LOW,
+        ScheduledAutoTuneSeverityType_MEDIUM
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The Auto-Tune action severity.
+newtype ScheduledAutoTuneSeverityType = ScheduledAutoTuneSeverityType'
+  { fromScheduledAutoTuneSeverityType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ScheduledAutoTuneSeverityType_HIGH :: ScheduledAutoTuneSeverityType
+pattern ScheduledAutoTuneSeverityType_HIGH = ScheduledAutoTuneSeverityType' "HIGH"
+
+pattern ScheduledAutoTuneSeverityType_LOW :: ScheduledAutoTuneSeverityType
+pattern ScheduledAutoTuneSeverityType_LOW = ScheduledAutoTuneSeverityType' "LOW"
+
+pattern ScheduledAutoTuneSeverityType_MEDIUM :: ScheduledAutoTuneSeverityType
+pattern ScheduledAutoTuneSeverityType_MEDIUM = ScheduledAutoTuneSeverityType' "MEDIUM"
+
+{-# COMPLETE
+  ScheduledAutoTuneSeverityType_HIGH,
+  ScheduledAutoTuneSeverityType_LOW,
+  ScheduledAutoTuneSeverityType_MEDIUM,
+  ScheduledAutoTuneSeverityType'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/ServiceSoftwareOptions.hs b/gen/Amazonka/OpenSearch/Types/ServiceSoftwareOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/ServiceSoftwareOptions.hs
@@ -0,0 +1,178 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.ServiceSoftwareOptions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.ServiceSoftwareOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.DeploymentStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The current status of the service software for an Amazon OpenSearch
+-- Service domain. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/service-software.html Service software updates in Amazon OpenSearch Service>.
+--
+-- /See:/ 'newServiceSoftwareOptions' smart constructor.
+data ServiceSoftwareOptions = ServiceSoftwareOptions'
+  { -- | The timestamp, in Epoch time, until which you can manually request a
+    -- service software update. After this date, we automatically update your
+    -- service software.
+    automatedUpdateDate :: Prelude.Maybe Data.POSIX,
+    -- | True if you\'re able to cancel your service software version update.
+    -- False if you can\'t cancel your service software update.
+    cancellable :: Prelude.Maybe Prelude.Bool,
+    -- | The current service software version present on the domain.
+    currentVersion :: Prelude.Maybe Prelude.Text,
+    -- | A description of the service software update status.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The new service software version, if one is available.
+    newVersion' :: Prelude.Maybe Prelude.Text,
+    -- | True if a service software is never automatically updated. False if a
+    -- service software is automatically updated after the automated update
+    -- date.
+    optionalDeployment :: Prelude.Maybe Prelude.Bool,
+    -- | True if you\'re able to update your service software version. False if
+    -- you can\'t update your service software version.
+    updateAvailable :: Prelude.Maybe Prelude.Bool,
+    -- | The status of your service software update.
+    updateStatus :: Prelude.Maybe DeploymentStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ServiceSoftwareOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'automatedUpdateDate', 'serviceSoftwareOptions_automatedUpdateDate' - The timestamp, in Epoch time, until which you can manually request a
+-- service software update. After this date, we automatically update your
+-- service software.
+--
+-- 'cancellable', 'serviceSoftwareOptions_cancellable' - True if you\'re able to cancel your service software version update.
+-- False if you can\'t cancel your service software update.
+--
+-- 'currentVersion', 'serviceSoftwareOptions_currentVersion' - The current service software version present on the domain.
+--
+-- 'description', 'serviceSoftwareOptions_description' - A description of the service software update status.
+--
+-- 'newVersion'', 'serviceSoftwareOptions_newVersion' - The new service software version, if one is available.
+--
+-- 'optionalDeployment', 'serviceSoftwareOptions_optionalDeployment' - True if a service software is never automatically updated. False if a
+-- service software is automatically updated after the automated update
+-- date.
+--
+-- 'updateAvailable', 'serviceSoftwareOptions_updateAvailable' - True if you\'re able to update your service software version. False if
+-- you can\'t update your service software version.
+--
+-- 'updateStatus', 'serviceSoftwareOptions_updateStatus' - The status of your service software update.
+newServiceSoftwareOptions ::
+  ServiceSoftwareOptions
+newServiceSoftwareOptions =
+  ServiceSoftwareOptions'
+    { automatedUpdateDate =
+        Prelude.Nothing,
+      cancellable = Prelude.Nothing,
+      currentVersion = Prelude.Nothing,
+      description = Prelude.Nothing,
+      newVersion' = Prelude.Nothing,
+      optionalDeployment = Prelude.Nothing,
+      updateAvailable = Prelude.Nothing,
+      updateStatus = Prelude.Nothing
+    }
+
+-- | The timestamp, in Epoch time, until which you can manually request a
+-- service software update. After this date, we automatically update your
+-- service software.
+serviceSoftwareOptions_automatedUpdateDate :: Lens.Lens' ServiceSoftwareOptions (Prelude.Maybe Prelude.UTCTime)
+serviceSoftwareOptions_automatedUpdateDate = Lens.lens (\ServiceSoftwareOptions' {automatedUpdateDate} -> automatedUpdateDate) (\s@ServiceSoftwareOptions' {} a -> s {automatedUpdateDate = a} :: ServiceSoftwareOptions) Prelude.. Lens.mapping Data._Time
+
+-- | True if you\'re able to cancel your service software version update.
+-- False if you can\'t cancel your service software update.
+serviceSoftwareOptions_cancellable :: Lens.Lens' ServiceSoftwareOptions (Prelude.Maybe Prelude.Bool)
+serviceSoftwareOptions_cancellable = Lens.lens (\ServiceSoftwareOptions' {cancellable} -> cancellable) (\s@ServiceSoftwareOptions' {} a -> s {cancellable = a} :: ServiceSoftwareOptions)
+
+-- | The current service software version present on the domain.
+serviceSoftwareOptions_currentVersion :: Lens.Lens' ServiceSoftwareOptions (Prelude.Maybe Prelude.Text)
+serviceSoftwareOptions_currentVersion = Lens.lens (\ServiceSoftwareOptions' {currentVersion} -> currentVersion) (\s@ServiceSoftwareOptions' {} a -> s {currentVersion = a} :: ServiceSoftwareOptions)
+
+-- | A description of the service software update status.
+serviceSoftwareOptions_description :: Lens.Lens' ServiceSoftwareOptions (Prelude.Maybe Prelude.Text)
+serviceSoftwareOptions_description = Lens.lens (\ServiceSoftwareOptions' {description} -> description) (\s@ServiceSoftwareOptions' {} a -> s {description = a} :: ServiceSoftwareOptions)
+
+-- | The new service software version, if one is available.
+serviceSoftwareOptions_newVersion :: Lens.Lens' ServiceSoftwareOptions (Prelude.Maybe Prelude.Text)
+serviceSoftwareOptions_newVersion = Lens.lens (\ServiceSoftwareOptions' {newVersion'} -> newVersion') (\s@ServiceSoftwareOptions' {} a -> s {newVersion' = a} :: ServiceSoftwareOptions)
+
+-- | True if a service software is never automatically updated. False if a
+-- service software is automatically updated after the automated update
+-- date.
+serviceSoftwareOptions_optionalDeployment :: Lens.Lens' ServiceSoftwareOptions (Prelude.Maybe Prelude.Bool)
+serviceSoftwareOptions_optionalDeployment = Lens.lens (\ServiceSoftwareOptions' {optionalDeployment} -> optionalDeployment) (\s@ServiceSoftwareOptions' {} a -> s {optionalDeployment = a} :: ServiceSoftwareOptions)
+
+-- | True if you\'re able to update your service software version. False if
+-- you can\'t update your service software version.
+serviceSoftwareOptions_updateAvailable :: Lens.Lens' ServiceSoftwareOptions (Prelude.Maybe Prelude.Bool)
+serviceSoftwareOptions_updateAvailable = Lens.lens (\ServiceSoftwareOptions' {updateAvailable} -> updateAvailable) (\s@ServiceSoftwareOptions' {} a -> s {updateAvailable = a} :: ServiceSoftwareOptions)
+
+-- | The status of your service software update.
+serviceSoftwareOptions_updateStatus :: Lens.Lens' ServiceSoftwareOptions (Prelude.Maybe DeploymentStatus)
+serviceSoftwareOptions_updateStatus = Lens.lens (\ServiceSoftwareOptions' {updateStatus} -> updateStatus) (\s@ServiceSoftwareOptions' {} a -> s {updateStatus = a} :: ServiceSoftwareOptions)
+
+instance Data.FromJSON ServiceSoftwareOptions where
+  parseJSON =
+    Data.withObject
+      "ServiceSoftwareOptions"
+      ( \x ->
+          ServiceSoftwareOptions'
+            Prelude.<$> (x Data..:? "AutomatedUpdateDate")
+            Prelude.<*> (x Data..:? "Cancellable")
+            Prelude.<*> (x Data..:? "CurrentVersion")
+            Prelude.<*> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "NewVersion")
+            Prelude.<*> (x Data..:? "OptionalDeployment")
+            Prelude.<*> (x Data..:? "UpdateAvailable")
+            Prelude.<*> (x Data..:? "UpdateStatus")
+      )
+
+instance Prelude.Hashable ServiceSoftwareOptions where
+  hashWithSalt _salt ServiceSoftwareOptions' {..} =
+    _salt
+      `Prelude.hashWithSalt` automatedUpdateDate
+      `Prelude.hashWithSalt` cancellable
+      `Prelude.hashWithSalt` currentVersion
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` newVersion'
+      `Prelude.hashWithSalt` optionalDeployment
+      `Prelude.hashWithSalt` updateAvailable
+      `Prelude.hashWithSalt` updateStatus
+
+instance Prelude.NFData ServiceSoftwareOptions where
+  rnf ServiceSoftwareOptions' {..} =
+    Prelude.rnf automatedUpdateDate
+      `Prelude.seq` Prelude.rnf cancellable
+      `Prelude.seq` Prelude.rnf currentVersion
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf newVersion'
+      `Prelude.seq` Prelude.rnf optionalDeployment
+      `Prelude.seq` Prelude.rnf updateAvailable
+      `Prelude.seq` Prelude.rnf updateStatus
diff --git a/gen/Amazonka/OpenSearch/Types/SnapshotOptions.hs b/gen/Amazonka/OpenSearch/Types/SnapshotOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/SnapshotOptions.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.SnapshotOptions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.SnapshotOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The time, in UTC format, when OpenSearch Service takes a daily automated
+-- snapshot of the specified domain. Default is @0@ hours.
+--
+-- /See:/ 'newSnapshotOptions' smart constructor.
+data SnapshotOptions = SnapshotOptions'
+  { -- | The time, in UTC format, when OpenSearch Service takes a daily automated
+    -- snapshot of the specified domain. Default is @0@ hours.
+    automatedSnapshotStartHour :: Prelude.Maybe Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SnapshotOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'automatedSnapshotStartHour', 'snapshotOptions_automatedSnapshotStartHour' - The time, in UTC format, when OpenSearch Service takes a daily automated
+-- snapshot of the specified domain. Default is @0@ hours.
+newSnapshotOptions ::
+  SnapshotOptions
+newSnapshotOptions =
+  SnapshotOptions'
+    { automatedSnapshotStartHour =
+        Prelude.Nothing
+    }
+
+-- | The time, in UTC format, when OpenSearch Service takes a daily automated
+-- snapshot of the specified domain. Default is @0@ hours.
+snapshotOptions_automatedSnapshotStartHour :: Lens.Lens' SnapshotOptions (Prelude.Maybe Prelude.Int)
+snapshotOptions_automatedSnapshotStartHour = Lens.lens (\SnapshotOptions' {automatedSnapshotStartHour} -> automatedSnapshotStartHour) (\s@SnapshotOptions' {} a -> s {automatedSnapshotStartHour = a} :: SnapshotOptions)
+
+instance Data.FromJSON SnapshotOptions where
+  parseJSON =
+    Data.withObject
+      "SnapshotOptions"
+      ( \x ->
+          SnapshotOptions'
+            Prelude.<$> (x Data..:? "AutomatedSnapshotStartHour")
+      )
+
+instance Prelude.Hashable SnapshotOptions where
+  hashWithSalt _salt SnapshotOptions' {..} =
+    _salt
+      `Prelude.hashWithSalt` automatedSnapshotStartHour
+
+instance Prelude.NFData SnapshotOptions where
+  rnf SnapshotOptions' {..} =
+    Prelude.rnf automatedSnapshotStartHour
+
+instance Data.ToJSON SnapshotOptions where
+  toJSON SnapshotOptions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AutomatedSnapshotStartHour" Data..=)
+              Prelude.<$> automatedSnapshotStartHour
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/SnapshotOptionsStatus.hs b/gen/Amazonka/OpenSearch/Types/SnapshotOptionsStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/SnapshotOptionsStatus.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.SnapshotOptionsStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.SnapshotOptionsStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.OptionStatus
+import Amazonka.OpenSearch.Types.SnapshotOptions
+import qualified Amazonka.Prelude as Prelude
+
+-- | Container for information about a daily automated snapshot for an
+-- OpenSearch Service domain.
+--
+-- /See:/ 'newSnapshotOptionsStatus' smart constructor.
+data SnapshotOptionsStatus = SnapshotOptionsStatus'
+  { -- | The daily snapshot options specified for the domain.
+    options :: SnapshotOptions,
+    -- | The status of a daily automated snapshot.
+    status :: OptionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SnapshotOptionsStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'options', 'snapshotOptionsStatus_options' - The daily snapshot options specified for the domain.
+--
+-- 'status', 'snapshotOptionsStatus_status' - The status of a daily automated snapshot.
+newSnapshotOptionsStatus ::
+  -- | 'options'
+  SnapshotOptions ->
+  -- | 'status'
+  OptionStatus ->
+  SnapshotOptionsStatus
+newSnapshotOptionsStatus pOptions_ pStatus_ =
+  SnapshotOptionsStatus'
+    { options = pOptions_,
+      status = pStatus_
+    }
+
+-- | The daily snapshot options specified for the domain.
+snapshotOptionsStatus_options :: Lens.Lens' SnapshotOptionsStatus SnapshotOptions
+snapshotOptionsStatus_options = Lens.lens (\SnapshotOptionsStatus' {options} -> options) (\s@SnapshotOptionsStatus' {} a -> s {options = a} :: SnapshotOptionsStatus)
+
+-- | The status of a daily automated snapshot.
+snapshotOptionsStatus_status :: Lens.Lens' SnapshotOptionsStatus OptionStatus
+snapshotOptionsStatus_status = Lens.lens (\SnapshotOptionsStatus' {status} -> status) (\s@SnapshotOptionsStatus' {} a -> s {status = a} :: SnapshotOptionsStatus)
+
+instance Data.FromJSON SnapshotOptionsStatus where
+  parseJSON =
+    Data.withObject
+      "SnapshotOptionsStatus"
+      ( \x ->
+          SnapshotOptionsStatus'
+            Prelude.<$> (x Data..: "Options")
+            Prelude.<*> (x Data..: "Status")
+      )
+
+instance Prelude.Hashable SnapshotOptionsStatus where
+  hashWithSalt _salt SnapshotOptionsStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` options
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData SnapshotOptionsStatus where
+  rnf SnapshotOptionsStatus' {..} =
+    Prelude.rnf options
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/OpenSearch/Types/StorageType.hs b/gen/Amazonka/OpenSearch/Types/StorageType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/StorageType.hs
@@ -0,0 +1,101 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.StorageType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.StorageType where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.StorageTypeLimit
+import qualified Amazonka.Prelude as Prelude
+
+-- | A list of storage types for an Amazon OpenSearch Service domain that are
+-- available for a given intance type.
+--
+-- /See:/ 'newStorageType' smart constructor.
+data StorageType = StorageType'
+  { -- | The storage sub-type, such as @gp3@ or @io1@.
+    storageSubTypeName :: Prelude.Maybe Prelude.Text,
+    -- | Limits that are applicable for the given storage type.
+    storageTypeLimits :: Prelude.Maybe [StorageTypeLimit],
+    -- | The name of the storage type.
+    storageTypeName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StorageType' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'storageSubTypeName', 'storageType_storageSubTypeName' - The storage sub-type, such as @gp3@ or @io1@.
+--
+-- 'storageTypeLimits', 'storageType_storageTypeLimits' - Limits that are applicable for the given storage type.
+--
+-- 'storageTypeName', 'storageType_storageTypeName' - The name of the storage type.
+newStorageType ::
+  StorageType
+newStorageType =
+  StorageType'
+    { storageSubTypeName = Prelude.Nothing,
+      storageTypeLimits = Prelude.Nothing,
+      storageTypeName = Prelude.Nothing
+    }
+
+-- | The storage sub-type, such as @gp3@ or @io1@.
+storageType_storageSubTypeName :: Lens.Lens' StorageType (Prelude.Maybe Prelude.Text)
+storageType_storageSubTypeName = Lens.lens (\StorageType' {storageSubTypeName} -> storageSubTypeName) (\s@StorageType' {} a -> s {storageSubTypeName = a} :: StorageType)
+
+-- | Limits that are applicable for the given storage type.
+storageType_storageTypeLimits :: Lens.Lens' StorageType (Prelude.Maybe [StorageTypeLimit])
+storageType_storageTypeLimits = Lens.lens (\StorageType' {storageTypeLimits} -> storageTypeLimits) (\s@StorageType' {} a -> s {storageTypeLimits = a} :: StorageType) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the storage type.
+storageType_storageTypeName :: Lens.Lens' StorageType (Prelude.Maybe Prelude.Text)
+storageType_storageTypeName = Lens.lens (\StorageType' {storageTypeName} -> storageTypeName) (\s@StorageType' {} a -> s {storageTypeName = a} :: StorageType)
+
+instance Data.FromJSON StorageType where
+  parseJSON =
+    Data.withObject
+      "StorageType"
+      ( \x ->
+          StorageType'
+            Prelude.<$> (x Data..:? "StorageSubTypeName")
+            Prelude.<*> ( x
+                            Data..:? "StorageTypeLimits"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "StorageTypeName")
+      )
+
+instance Prelude.Hashable StorageType where
+  hashWithSalt _salt StorageType' {..} =
+    _salt
+      `Prelude.hashWithSalt` storageSubTypeName
+      `Prelude.hashWithSalt` storageTypeLimits
+      `Prelude.hashWithSalt` storageTypeName
+
+instance Prelude.NFData StorageType where
+  rnf StorageType' {..} =
+    Prelude.rnf storageSubTypeName
+      `Prelude.seq` Prelude.rnf storageTypeLimits
+      `Prelude.seq` Prelude.rnf storageTypeName
diff --git a/gen/Amazonka/OpenSearch/Types/StorageTypeLimit.hs b/gen/Amazonka/OpenSearch/Types/StorageTypeLimit.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/StorageTypeLimit.hs
@@ -0,0 +1,148 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.StorageTypeLimit
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.StorageTypeLimit where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Limits that are applicable for the given Amazon OpenSearch Service
+-- storage type.
+--
+-- /See:/ 'newStorageTypeLimit' smart constructor.
+data StorageTypeLimit = StorageTypeLimit'
+  { -- | Name of storage limits that are applicable for the given storage type.
+    -- If @StorageType@ is @ebs@, the following options are available:
+    --
+    -- -   __MinimumVolumeSize__ - Minimum volume size that is available for
+    --     the given storage type. Can be empty if not applicable.
+    --
+    -- -   __MaximumVolumeSize__ - Maximum volume size that is available for
+    --     the given storage type. Can be empty if not applicable.
+    --
+    -- -   __MaximumIops__ - Maximum amount of IOPS that is available for the
+    --     given the storage type. Can be empty if not applicable.
+    --
+    -- -   __MinimumIops__ - Minimum amount of IOPS that is available for the
+    --     given the storage type. Can be empty if not applicable.
+    --
+    -- -   __MaximumThroughput__ - Maximum amount of throughput that is
+    --     available for the given the storage type. Can be empty if not
+    --     applicable.
+    --
+    -- -   __MinimumThroughput__ - Minimum amount of throughput that is
+    --     available for the given the storage type. Can be empty if not
+    --     applicable.
+    limitName :: Prelude.Maybe Prelude.Text,
+    -- | The limit values.
+    limitValues :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StorageTypeLimit' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'limitName', 'storageTypeLimit_limitName' - Name of storage limits that are applicable for the given storage type.
+-- If @StorageType@ is @ebs@, the following options are available:
+--
+-- -   __MinimumVolumeSize__ - Minimum volume size that is available for
+--     the given storage type. Can be empty if not applicable.
+--
+-- -   __MaximumVolumeSize__ - Maximum volume size that is available for
+--     the given storage type. Can be empty if not applicable.
+--
+-- -   __MaximumIops__ - Maximum amount of IOPS that is available for the
+--     given the storage type. Can be empty if not applicable.
+--
+-- -   __MinimumIops__ - Minimum amount of IOPS that is available for the
+--     given the storage type. Can be empty if not applicable.
+--
+-- -   __MaximumThroughput__ - Maximum amount of throughput that is
+--     available for the given the storage type. Can be empty if not
+--     applicable.
+--
+-- -   __MinimumThroughput__ - Minimum amount of throughput that is
+--     available for the given the storage type. Can be empty if not
+--     applicable.
+--
+-- 'limitValues', 'storageTypeLimit_limitValues' - The limit values.
+newStorageTypeLimit ::
+  StorageTypeLimit
+newStorageTypeLimit =
+  StorageTypeLimit'
+    { limitName = Prelude.Nothing,
+      limitValues = Prelude.Nothing
+    }
+
+-- | Name of storage limits that are applicable for the given storage type.
+-- If @StorageType@ is @ebs@, the following options are available:
+--
+-- -   __MinimumVolumeSize__ - Minimum volume size that is available for
+--     the given storage type. Can be empty if not applicable.
+--
+-- -   __MaximumVolumeSize__ - Maximum volume size that is available for
+--     the given storage type. Can be empty if not applicable.
+--
+-- -   __MaximumIops__ - Maximum amount of IOPS that is available for the
+--     given the storage type. Can be empty if not applicable.
+--
+-- -   __MinimumIops__ - Minimum amount of IOPS that is available for the
+--     given the storage type. Can be empty if not applicable.
+--
+-- -   __MaximumThroughput__ - Maximum amount of throughput that is
+--     available for the given the storage type. Can be empty if not
+--     applicable.
+--
+-- -   __MinimumThroughput__ - Minimum amount of throughput that is
+--     available for the given the storage type. Can be empty if not
+--     applicable.
+storageTypeLimit_limitName :: Lens.Lens' StorageTypeLimit (Prelude.Maybe Prelude.Text)
+storageTypeLimit_limitName = Lens.lens (\StorageTypeLimit' {limitName} -> limitName) (\s@StorageTypeLimit' {} a -> s {limitName = a} :: StorageTypeLimit)
+
+-- | The limit values.
+storageTypeLimit_limitValues :: Lens.Lens' StorageTypeLimit (Prelude.Maybe [Prelude.Text])
+storageTypeLimit_limitValues = Lens.lens (\StorageTypeLimit' {limitValues} -> limitValues) (\s@StorageTypeLimit' {} a -> s {limitValues = a} :: StorageTypeLimit) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON StorageTypeLimit where
+  parseJSON =
+    Data.withObject
+      "StorageTypeLimit"
+      ( \x ->
+          StorageTypeLimit'
+            Prelude.<$> (x Data..:? "LimitName")
+            Prelude.<*> (x Data..:? "LimitValues" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable StorageTypeLimit where
+  hashWithSalt _salt StorageTypeLimit' {..} =
+    _salt
+      `Prelude.hashWithSalt` limitName
+      `Prelude.hashWithSalt` limitValues
+
+instance Prelude.NFData StorageTypeLimit where
+  rnf StorageTypeLimit' {..} =
+    Prelude.rnf limitName
+      `Prelude.seq` Prelude.rnf limitValues
diff --git a/gen/Amazonka/OpenSearch/Types/TLSSecurityPolicy.hs b/gen/Amazonka/OpenSearch/Types/TLSSecurityPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/TLSSecurityPolicy.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.TLSSecurityPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.TLSSecurityPolicy
+  ( TLSSecurityPolicy
+      ( ..,
+        TLSSecurityPolicy_Policy_Min_TLS_1_0_2019_07,
+        TLSSecurityPolicy_Policy_Min_TLS_1_2_2019_07
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TLSSecurityPolicy = TLSSecurityPolicy'
+  { fromTLSSecurityPolicy ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern TLSSecurityPolicy_Policy_Min_TLS_1_0_2019_07 :: TLSSecurityPolicy
+pattern TLSSecurityPolicy_Policy_Min_TLS_1_0_2019_07 = TLSSecurityPolicy' "Policy-Min-TLS-1-0-2019-07"
+
+pattern TLSSecurityPolicy_Policy_Min_TLS_1_2_2019_07 :: TLSSecurityPolicy
+pattern TLSSecurityPolicy_Policy_Min_TLS_1_2_2019_07 = TLSSecurityPolicy' "Policy-Min-TLS-1-2-2019-07"
+
+{-# COMPLETE
+  TLSSecurityPolicy_Policy_Min_TLS_1_0_2019_07,
+  TLSSecurityPolicy_Policy_Min_TLS_1_2_2019_07,
+  TLSSecurityPolicy'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/Tag.hs b/gen/Amazonka/OpenSearch/Types/Tag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/Tag.hs
@@ -0,0 +1,105 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.Tag
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.Tag where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A tag (key-value pair) for an Amazon OpenSearch Service resource.
+--
+-- /See:/ 'newTag' smart constructor.
+data Tag = Tag'
+  { -- | The tag key. Tag keys must be unique for the domain to which they are
+    -- attached.
+    key :: Prelude.Text,
+    -- | The value assigned to the corresponding tag key. Tag values can be null
+    -- and don\'t have to be unique in a tag set. For example, you can have a
+    -- key value pair in a tag set of @project : Trinity@ and
+    -- @cost-center : Trinity@
+    value :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Tag' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'key', 'tag_key' - The tag key. Tag keys must be unique for the domain to which they are
+-- attached.
+--
+-- 'value', 'tag_value' - The value assigned to the corresponding tag key. Tag values can be null
+-- and don\'t have to be unique in a tag set. For example, you can have a
+-- key value pair in a tag set of @project : Trinity@ and
+-- @cost-center : Trinity@
+newTag ::
+  -- | 'key'
+  Prelude.Text ->
+  -- | 'value'
+  Prelude.Text ->
+  Tag
+newTag pKey_ pValue_ =
+  Tag' {key = pKey_, value = pValue_}
+
+-- | The tag key. Tag keys must be unique for the domain to which they are
+-- attached.
+tag_key :: Lens.Lens' Tag Prelude.Text
+tag_key = Lens.lens (\Tag' {key} -> key) (\s@Tag' {} a -> s {key = a} :: Tag)
+
+-- | The value assigned to the corresponding tag key. Tag values can be null
+-- and don\'t have to be unique in a tag set. For example, you can have a
+-- key value pair in a tag set of @project : Trinity@ and
+-- @cost-center : Trinity@
+tag_value :: Lens.Lens' Tag Prelude.Text
+tag_value = Lens.lens (\Tag' {value} -> value) (\s@Tag' {} a -> s {value = a} :: Tag)
+
+instance Data.FromJSON Tag where
+  parseJSON =
+    Data.withObject
+      "Tag"
+      ( \x ->
+          Tag'
+            Prelude.<$> (x Data..: "Key")
+            Prelude.<*> (x Data..: "Value")
+      )
+
+instance Prelude.Hashable Tag where
+  hashWithSalt _salt Tag' {..} =
+    _salt
+      `Prelude.hashWithSalt` key
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Tag where
+  rnf Tag' {..} =
+    Prelude.rnf key `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON Tag where
+  toJSON Tag' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("Key" Data..= key),
+            Prelude.Just ("Value" Data..= value)
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/TimeUnit.hs b/gen/Amazonka/OpenSearch/Types/TimeUnit.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/TimeUnit.hs
@@ -0,0 +1,67 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.TimeUnit
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.TimeUnit
+  ( TimeUnit
+      ( ..,
+        TimeUnit_HOURS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The unit of a maintenance schedule duration. Valid value is @HOUR@.
+newtype TimeUnit = TimeUnit'
+  { fromTimeUnit ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern TimeUnit_HOURS :: TimeUnit
+pattern TimeUnit_HOURS = TimeUnit' "HOURS"
+
+{-# COMPLETE
+  TimeUnit_HOURS,
+  TimeUnit'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/UpgradeHistory.hs b/gen/Amazonka/OpenSearch/Types/UpgradeHistory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/UpgradeHistory.hs
@@ -0,0 +1,144 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.UpgradeHistory
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.UpgradeHistory where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.UpgradeStatus
+import Amazonka.OpenSearch.Types.UpgradeStepItem
+import qualified Amazonka.Prelude as Prelude
+
+-- | History of the last 10 upgrades and upgrade eligibility checks for an
+-- Amazon OpenSearch Service domain.
+--
+-- /See:/ 'newUpgradeHistory' smart constructor.
+data UpgradeHistory = UpgradeHistory'
+  { -- | UTC timestamp at which the upgrade API call was made, in the format
+    -- @yyyy-MM-ddTHH:mm:ssZ@.
+    startTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | A list of each step performed as part of a specific upgrade or upgrade
+    -- eligibility check.
+    stepsList :: Prelude.Maybe [UpgradeStepItem],
+    -- | A string that describes the upgrade.
+    upgradeName :: Prelude.Maybe Prelude.Text,
+    -- | The current status of the upgrade. The status can take one of the
+    -- following values:
+    --
+    -- -   In Progress
+    --
+    -- -   Succeeded
+    --
+    -- -   Succeeded with Issues
+    --
+    -- -   Failed
+    upgradeStatus :: Prelude.Maybe UpgradeStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpgradeHistory' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'startTimestamp', 'upgradeHistory_startTimestamp' - UTC timestamp at which the upgrade API call was made, in the format
+-- @yyyy-MM-ddTHH:mm:ssZ@.
+--
+-- 'stepsList', 'upgradeHistory_stepsList' - A list of each step performed as part of a specific upgrade or upgrade
+-- eligibility check.
+--
+-- 'upgradeName', 'upgradeHistory_upgradeName' - A string that describes the upgrade.
+--
+-- 'upgradeStatus', 'upgradeHistory_upgradeStatus' - The current status of the upgrade. The status can take one of the
+-- following values:
+--
+-- -   In Progress
+--
+-- -   Succeeded
+--
+-- -   Succeeded with Issues
+--
+-- -   Failed
+newUpgradeHistory ::
+  UpgradeHistory
+newUpgradeHistory =
+  UpgradeHistory'
+    { startTimestamp = Prelude.Nothing,
+      stepsList = Prelude.Nothing,
+      upgradeName = Prelude.Nothing,
+      upgradeStatus = Prelude.Nothing
+    }
+
+-- | UTC timestamp at which the upgrade API call was made, in the format
+-- @yyyy-MM-ddTHH:mm:ssZ@.
+upgradeHistory_startTimestamp :: Lens.Lens' UpgradeHistory (Prelude.Maybe Prelude.UTCTime)
+upgradeHistory_startTimestamp = Lens.lens (\UpgradeHistory' {startTimestamp} -> startTimestamp) (\s@UpgradeHistory' {} a -> s {startTimestamp = a} :: UpgradeHistory) Prelude.. Lens.mapping Data._Time
+
+-- | A list of each step performed as part of a specific upgrade or upgrade
+-- eligibility check.
+upgradeHistory_stepsList :: Lens.Lens' UpgradeHistory (Prelude.Maybe [UpgradeStepItem])
+upgradeHistory_stepsList = Lens.lens (\UpgradeHistory' {stepsList} -> stepsList) (\s@UpgradeHistory' {} a -> s {stepsList = a} :: UpgradeHistory) Prelude.. Lens.mapping Lens.coerced
+
+-- | A string that describes the upgrade.
+upgradeHistory_upgradeName :: Lens.Lens' UpgradeHistory (Prelude.Maybe Prelude.Text)
+upgradeHistory_upgradeName = Lens.lens (\UpgradeHistory' {upgradeName} -> upgradeName) (\s@UpgradeHistory' {} a -> s {upgradeName = a} :: UpgradeHistory)
+
+-- | The current status of the upgrade. The status can take one of the
+-- following values:
+--
+-- -   In Progress
+--
+-- -   Succeeded
+--
+-- -   Succeeded with Issues
+--
+-- -   Failed
+upgradeHistory_upgradeStatus :: Lens.Lens' UpgradeHistory (Prelude.Maybe UpgradeStatus)
+upgradeHistory_upgradeStatus = Lens.lens (\UpgradeHistory' {upgradeStatus} -> upgradeStatus) (\s@UpgradeHistory' {} a -> s {upgradeStatus = a} :: UpgradeHistory)
+
+instance Data.FromJSON UpgradeHistory where
+  parseJSON =
+    Data.withObject
+      "UpgradeHistory"
+      ( \x ->
+          UpgradeHistory'
+            Prelude.<$> (x Data..:? "StartTimestamp")
+            Prelude.<*> (x Data..:? "StepsList" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "UpgradeName")
+            Prelude.<*> (x Data..:? "UpgradeStatus")
+      )
+
+instance Prelude.Hashable UpgradeHistory where
+  hashWithSalt _salt UpgradeHistory' {..} =
+    _salt
+      `Prelude.hashWithSalt` startTimestamp
+      `Prelude.hashWithSalt` stepsList
+      `Prelude.hashWithSalt` upgradeName
+      `Prelude.hashWithSalt` upgradeStatus
+
+instance Prelude.NFData UpgradeHistory where
+  rnf UpgradeHistory' {..} =
+    Prelude.rnf startTimestamp
+      `Prelude.seq` Prelude.rnf stepsList
+      `Prelude.seq` Prelude.rnf upgradeName
+      `Prelude.seq` Prelude.rnf upgradeStatus
diff --git a/gen/Amazonka/OpenSearch/Types/UpgradeStatus.hs b/gen/Amazonka/OpenSearch/Types/UpgradeStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/UpgradeStatus.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.UpgradeStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.UpgradeStatus
+  ( UpgradeStatus
+      ( ..,
+        UpgradeStatus_FAILED,
+        UpgradeStatus_IN_PROGRESS,
+        UpgradeStatus_SUCCEEDED,
+        UpgradeStatus_SUCCEEDED_WITH_ISSUES
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype UpgradeStatus = UpgradeStatus'
+  { fromUpgradeStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern UpgradeStatus_FAILED :: UpgradeStatus
+pattern UpgradeStatus_FAILED = UpgradeStatus' "FAILED"
+
+pattern UpgradeStatus_IN_PROGRESS :: UpgradeStatus
+pattern UpgradeStatus_IN_PROGRESS = UpgradeStatus' "IN_PROGRESS"
+
+pattern UpgradeStatus_SUCCEEDED :: UpgradeStatus
+pattern UpgradeStatus_SUCCEEDED = UpgradeStatus' "SUCCEEDED"
+
+pattern UpgradeStatus_SUCCEEDED_WITH_ISSUES :: UpgradeStatus
+pattern UpgradeStatus_SUCCEEDED_WITH_ISSUES = UpgradeStatus' "SUCCEEDED_WITH_ISSUES"
+
+{-# COMPLETE
+  UpgradeStatus_FAILED,
+  UpgradeStatus_IN_PROGRESS,
+  UpgradeStatus_SUCCEEDED,
+  UpgradeStatus_SUCCEEDED_WITH_ISSUES,
+  UpgradeStatus'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/UpgradeStep.hs b/gen/Amazonka/OpenSearch/Types/UpgradeStep.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/UpgradeStep.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.UpgradeStep
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.UpgradeStep
+  ( UpgradeStep
+      ( ..,
+        UpgradeStep_PRE_UPGRADE_CHECK,
+        UpgradeStep_SNAPSHOT,
+        UpgradeStep_UPGRADE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype UpgradeStep = UpgradeStep'
+  { fromUpgradeStep ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern UpgradeStep_PRE_UPGRADE_CHECK :: UpgradeStep
+pattern UpgradeStep_PRE_UPGRADE_CHECK = UpgradeStep' "PRE_UPGRADE_CHECK"
+
+pattern UpgradeStep_SNAPSHOT :: UpgradeStep
+pattern UpgradeStep_SNAPSHOT = UpgradeStep' "SNAPSHOT"
+
+pattern UpgradeStep_UPGRADE :: UpgradeStep
+pattern UpgradeStep_UPGRADE = UpgradeStep' "UPGRADE"
+
+{-# COMPLETE
+  UpgradeStep_PRE_UPGRADE_CHECK,
+  UpgradeStep_SNAPSHOT,
+  UpgradeStep_UPGRADE,
+  UpgradeStep'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/UpgradeStepItem.hs b/gen/Amazonka/OpenSearch/Types/UpgradeStepItem.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/UpgradeStepItem.hs
@@ -0,0 +1,165 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.UpgradeStepItem
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.UpgradeStepItem where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.UpgradeStatus
+import Amazonka.OpenSearch.Types.UpgradeStep
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents a single step of an upgrade or upgrade eligibility check
+-- workflow.
+--
+-- /See:/ 'newUpgradeStepItem' smart constructor.
+data UpgradeStepItem = UpgradeStepItem'
+  { -- | A list of strings containing detailed information about the errors
+    -- encountered in a particular step.
+    issues :: Prelude.Maybe [Prelude.Text],
+    -- | The floating point value representing the progress percentage of a
+    -- particular step.
+    progressPercent :: Prelude.Maybe Prelude.Double,
+    -- | One of three steps that an upgrade or upgrade eligibility check goes
+    -- through:
+    --
+    -- -   PreUpgradeCheck
+    --
+    -- -   Snapshot
+    --
+    -- -   Upgrade
+    upgradeStep :: Prelude.Maybe UpgradeStep,
+    -- | The current status of the upgrade. The status can take one of the
+    -- following values:
+    --
+    -- -   In Progress
+    --
+    -- -   Succeeded
+    --
+    -- -   Succeeded with Issues
+    --
+    -- -   Failed
+    upgradeStepStatus :: Prelude.Maybe UpgradeStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpgradeStepItem' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'issues', 'upgradeStepItem_issues' - A list of strings containing detailed information about the errors
+-- encountered in a particular step.
+--
+-- 'progressPercent', 'upgradeStepItem_progressPercent' - The floating point value representing the progress percentage of a
+-- particular step.
+--
+-- 'upgradeStep', 'upgradeStepItem_upgradeStep' - One of three steps that an upgrade or upgrade eligibility check goes
+-- through:
+--
+-- -   PreUpgradeCheck
+--
+-- -   Snapshot
+--
+-- -   Upgrade
+--
+-- 'upgradeStepStatus', 'upgradeStepItem_upgradeStepStatus' - The current status of the upgrade. The status can take one of the
+-- following values:
+--
+-- -   In Progress
+--
+-- -   Succeeded
+--
+-- -   Succeeded with Issues
+--
+-- -   Failed
+newUpgradeStepItem ::
+  UpgradeStepItem
+newUpgradeStepItem =
+  UpgradeStepItem'
+    { issues = Prelude.Nothing,
+      progressPercent = Prelude.Nothing,
+      upgradeStep = Prelude.Nothing,
+      upgradeStepStatus = Prelude.Nothing
+    }
+
+-- | A list of strings containing detailed information about the errors
+-- encountered in a particular step.
+upgradeStepItem_issues :: Lens.Lens' UpgradeStepItem (Prelude.Maybe [Prelude.Text])
+upgradeStepItem_issues = Lens.lens (\UpgradeStepItem' {issues} -> issues) (\s@UpgradeStepItem' {} a -> s {issues = a} :: UpgradeStepItem) Prelude.. Lens.mapping Lens.coerced
+
+-- | The floating point value representing the progress percentage of a
+-- particular step.
+upgradeStepItem_progressPercent :: Lens.Lens' UpgradeStepItem (Prelude.Maybe Prelude.Double)
+upgradeStepItem_progressPercent = Lens.lens (\UpgradeStepItem' {progressPercent} -> progressPercent) (\s@UpgradeStepItem' {} a -> s {progressPercent = a} :: UpgradeStepItem)
+
+-- | One of three steps that an upgrade or upgrade eligibility check goes
+-- through:
+--
+-- -   PreUpgradeCheck
+--
+-- -   Snapshot
+--
+-- -   Upgrade
+upgradeStepItem_upgradeStep :: Lens.Lens' UpgradeStepItem (Prelude.Maybe UpgradeStep)
+upgradeStepItem_upgradeStep = Lens.lens (\UpgradeStepItem' {upgradeStep} -> upgradeStep) (\s@UpgradeStepItem' {} a -> s {upgradeStep = a} :: UpgradeStepItem)
+
+-- | The current status of the upgrade. The status can take one of the
+-- following values:
+--
+-- -   In Progress
+--
+-- -   Succeeded
+--
+-- -   Succeeded with Issues
+--
+-- -   Failed
+upgradeStepItem_upgradeStepStatus :: Lens.Lens' UpgradeStepItem (Prelude.Maybe UpgradeStatus)
+upgradeStepItem_upgradeStepStatus = Lens.lens (\UpgradeStepItem' {upgradeStepStatus} -> upgradeStepStatus) (\s@UpgradeStepItem' {} a -> s {upgradeStepStatus = a} :: UpgradeStepItem)
+
+instance Data.FromJSON UpgradeStepItem where
+  parseJSON =
+    Data.withObject
+      "UpgradeStepItem"
+      ( \x ->
+          UpgradeStepItem'
+            Prelude.<$> (x Data..:? "Issues" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "ProgressPercent")
+            Prelude.<*> (x Data..:? "UpgradeStep")
+            Prelude.<*> (x Data..:? "UpgradeStepStatus")
+      )
+
+instance Prelude.Hashable UpgradeStepItem where
+  hashWithSalt _salt UpgradeStepItem' {..} =
+    _salt
+      `Prelude.hashWithSalt` issues
+      `Prelude.hashWithSalt` progressPercent
+      `Prelude.hashWithSalt` upgradeStep
+      `Prelude.hashWithSalt` upgradeStepStatus
+
+instance Prelude.NFData UpgradeStepItem where
+  rnf UpgradeStepItem' {..} =
+    Prelude.rnf issues
+      `Prelude.seq` Prelude.rnf progressPercent
+      `Prelude.seq` Prelude.rnf upgradeStep
+      `Prelude.seq` Prelude.rnf upgradeStepStatus
diff --git a/gen/Amazonka/OpenSearch/Types/VPCDerivedInfo.hs b/gen/Amazonka/OpenSearch/Types/VPCDerivedInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/VPCDerivedInfo.hs
@@ -0,0 +1,126 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.VPCDerivedInfo
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.VPCDerivedInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about the subnets and security groups for an Amazon
+-- OpenSearch Service domain provisioned within a virtual private cloud
+-- (VPC). For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html Launching your Amazon OpenSearch Service domains using a VPC>.
+-- This information only exists if the domain was created with
+-- @VPCOptions@.
+--
+-- /See:/ 'newVPCDerivedInfo' smart constructor.
+data VPCDerivedInfo = VPCDerivedInfo'
+  { -- | The list of Availability Zones associated with the VPC subnets.
+    availabilityZones :: Prelude.Maybe [Prelude.Text],
+    -- | The list of security group IDs associated with the VPC endpoints for the
+    -- domain.
+    securityGroupIds :: Prelude.Maybe [Prelude.Text],
+    -- | A list of subnet IDs associated with the VPC endpoints for the domain.
+    subnetIds :: Prelude.Maybe [Prelude.Text],
+    -- | The ID for your VPC. Amazon VPC generates this value when you create a
+    -- VPC.
+    vPCId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VPCDerivedInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'availabilityZones', 'vPCDerivedInfo_availabilityZones' - The list of Availability Zones associated with the VPC subnets.
+--
+-- 'securityGroupIds', 'vPCDerivedInfo_securityGroupIds' - The list of security group IDs associated with the VPC endpoints for the
+-- domain.
+--
+-- 'subnetIds', 'vPCDerivedInfo_subnetIds' - A list of subnet IDs associated with the VPC endpoints for the domain.
+--
+-- 'vPCId', 'vPCDerivedInfo_vPCId' - The ID for your VPC. Amazon VPC generates this value when you create a
+-- VPC.
+newVPCDerivedInfo ::
+  VPCDerivedInfo
+newVPCDerivedInfo =
+  VPCDerivedInfo'
+    { availabilityZones =
+        Prelude.Nothing,
+      securityGroupIds = Prelude.Nothing,
+      subnetIds = Prelude.Nothing,
+      vPCId = Prelude.Nothing
+    }
+
+-- | The list of Availability Zones associated with the VPC subnets.
+vPCDerivedInfo_availabilityZones :: Lens.Lens' VPCDerivedInfo (Prelude.Maybe [Prelude.Text])
+vPCDerivedInfo_availabilityZones = Lens.lens (\VPCDerivedInfo' {availabilityZones} -> availabilityZones) (\s@VPCDerivedInfo' {} a -> s {availabilityZones = a} :: VPCDerivedInfo) Prelude.. Lens.mapping Lens.coerced
+
+-- | The list of security group IDs associated with the VPC endpoints for the
+-- domain.
+vPCDerivedInfo_securityGroupIds :: Lens.Lens' VPCDerivedInfo (Prelude.Maybe [Prelude.Text])
+vPCDerivedInfo_securityGroupIds = Lens.lens (\VPCDerivedInfo' {securityGroupIds} -> securityGroupIds) (\s@VPCDerivedInfo' {} a -> s {securityGroupIds = a} :: VPCDerivedInfo) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of subnet IDs associated with the VPC endpoints for the domain.
+vPCDerivedInfo_subnetIds :: Lens.Lens' VPCDerivedInfo (Prelude.Maybe [Prelude.Text])
+vPCDerivedInfo_subnetIds = Lens.lens (\VPCDerivedInfo' {subnetIds} -> subnetIds) (\s@VPCDerivedInfo' {} a -> s {subnetIds = a} :: VPCDerivedInfo) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ID for your VPC. Amazon VPC generates this value when you create a
+-- VPC.
+vPCDerivedInfo_vPCId :: Lens.Lens' VPCDerivedInfo (Prelude.Maybe Prelude.Text)
+vPCDerivedInfo_vPCId = Lens.lens (\VPCDerivedInfo' {vPCId} -> vPCId) (\s@VPCDerivedInfo' {} a -> s {vPCId = a} :: VPCDerivedInfo)
+
+instance Data.FromJSON VPCDerivedInfo where
+  parseJSON =
+    Data.withObject
+      "VPCDerivedInfo"
+      ( \x ->
+          VPCDerivedInfo'
+            Prelude.<$> ( x
+                            Data..:? "AvailabilityZones"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..:? "SecurityGroupIds"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "SubnetIds" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "VPCId")
+      )
+
+instance Prelude.Hashable VPCDerivedInfo where
+  hashWithSalt _salt VPCDerivedInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` availabilityZones
+      `Prelude.hashWithSalt` securityGroupIds
+      `Prelude.hashWithSalt` subnetIds
+      `Prelude.hashWithSalt` vPCId
+
+instance Prelude.NFData VPCDerivedInfo where
+  rnf VPCDerivedInfo' {..} =
+    Prelude.rnf availabilityZones
+      `Prelude.seq` Prelude.rnf securityGroupIds
+      `Prelude.seq` Prelude.rnf subnetIds
+      `Prelude.seq` Prelude.rnf vPCId
diff --git a/gen/Amazonka/OpenSearch/Types/VPCDerivedInfoStatus.hs b/gen/Amazonka/OpenSearch/Types/VPCDerivedInfoStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/VPCDerivedInfoStatus.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.VPCDerivedInfoStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.VPCDerivedInfoStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.OptionStatus
+import Amazonka.OpenSearch.Types.VPCDerivedInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | Status of the VPC options for a specified domain.
+--
+-- /See:/ 'newVPCDerivedInfoStatus' smart constructor.
+data VPCDerivedInfoStatus = VPCDerivedInfoStatus'
+  { -- | The VPC options for the specified domain.
+    options :: VPCDerivedInfo,
+    -- | The status of the VPC options for the specified domain.
+    status :: OptionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VPCDerivedInfoStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'options', 'vPCDerivedInfoStatus_options' - The VPC options for the specified domain.
+--
+-- 'status', 'vPCDerivedInfoStatus_status' - The status of the VPC options for the specified domain.
+newVPCDerivedInfoStatus ::
+  -- | 'options'
+  VPCDerivedInfo ->
+  -- | 'status'
+  OptionStatus ->
+  VPCDerivedInfoStatus
+newVPCDerivedInfoStatus pOptions_ pStatus_ =
+  VPCDerivedInfoStatus'
+    { options = pOptions_,
+      status = pStatus_
+    }
+
+-- | The VPC options for the specified domain.
+vPCDerivedInfoStatus_options :: Lens.Lens' VPCDerivedInfoStatus VPCDerivedInfo
+vPCDerivedInfoStatus_options = Lens.lens (\VPCDerivedInfoStatus' {options} -> options) (\s@VPCDerivedInfoStatus' {} a -> s {options = a} :: VPCDerivedInfoStatus)
+
+-- | The status of the VPC options for the specified domain.
+vPCDerivedInfoStatus_status :: Lens.Lens' VPCDerivedInfoStatus OptionStatus
+vPCDerivedInfoStatus_status = Lens.lens (\VPCDerivedInfoStatus' {status} -> status) (\s@VPCDerivedInfoStatus' {} a -> s {status = a} :: VPCDerivedInfoStatus)
+
+instance Data.FromJSON VPCDerivedInfoStatus where
+  parseJSON =
+    Data.withObject
+      "VPCDerivedInfoStatus"
+      ( \x ->
+          VPCDerivedInfoStatus'
+            Prelude.<$> (x Data..: "Options")
+            Prelude.<*> (x Data..: "Status")
+      )
+
+instance Prelude.Hashable VPCDerivedInfoStatus where
+  hashWithSalt _salt VPCDerivedInfoStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` options
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData VPCDerivedInfoStatus where
+  rnf VPCDerivedInfoStatus' {..} =
+    Prelude.rnf options
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/OpenSearch/Types/VPCOptions.hs b/gen/Amazonka/OpenSearch/Types/VPCOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/VPCOptions.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.VPCOptions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.VPCOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Options to specify the subnets and security groups for an Amazon
+-- OpenSearch Service VPC endpoint. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html Launching your Amazon OpenSearch Service domains using a VPC>.
+--
+-- /See:/ 'newVPCOptions' smart constructor.
+data VPCOptions = VPCOptions'
+  { -- | The list of security group IDs associated with the VPC endpoints for the
+    -- domain. If you do not provide a security group ID, OpenSearch Service
+    -- uses the default security group for the VPC.
+    securityGroupIds :: Prelude.Maybe [Prelude.Text],
+    -- | A list of subnet IDs associated with the VPC endpoints for the domain.
+    -- If your domain uses multiple Availability Zones, you need to provide two
+    -- subnet IDs, one per zone. Otherwise, provide only one.
+    subnetIds :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VPCOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'securityGroupIds', 'vPCOptions_securityGroupIds' - The list of security group IDs associated with the VPC endpoints for the
+-- domain. If you do not provide a security group ID, OpenSearch Service
+-- uses the default security group for the VPC.
+--
+-- 'subnetIds', 'vPCOptions_subnetIds' - A list of subnet IDs associated with the VPC endpoints for the domain.
+-- If your domain uses multiple Availability Zones, you need to provide two
+-- subnet IDs, one per zone. Otherwise, provide only one.
+newVPCOptions ::
+  VPCOptions
+newVPCOptions =
+  VPCOptions'
+    { securityGroupIds = Prelude.Nothing,
+      subnetIds = Prelude.Nothing
+    }
+
+-- | The list of security group IDs associated with the VPC endpoints for the
+-- domain. If you do not provide a security group ID, OpenSearch Service
+-- uses the default security group for the VPC.
+vPCOptions_securityGroupIds :: Lens.Lens' VPCOptions (Prelude.Maybe [Prelude.Text])
+vPCOptions_securityGroupIds = Lens.lens (\VPCOptions' {securityGroupIds} -> securityGroupIds) (\s@VPCOptions' {} a -> s {securityGroupIds = a} :: VPCOptions) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of subnet IDs associated with the VPC endpoints for the domain.
+-- If your domain uses multiple Availability Zones, you need to provide two
+-- subnet IDs, one per zone. Otherwise, provide only one.
+vPCOptions_subnetIds :: Lens.Lens' VPCOptions (Prelude.Maybe [Prelude.Text])
+vPCOptions_subnetIds = Lens.lens (\VPCOptions' {subnetIds} -> subnetIds) (\s@VPCOptions' {} a -> s {subnetIds = a} :: VPCOptions) Prelude.. Lens.mapping Lens.coerced
+
+instance Prelude.Hashable VPCOptions where
+  hashWithSalt _salt VPCOptions' {..} =
+    _salt
+      `Prelude.hashWithSalt` securityGroupIds
+      `Prelude.hashWithSalt` subnetIds
+
+instance Prelude.NFData VPCOptions where
+  rnf VPCOptions' {..} =
+    Prelude.rnf securityGroupIds
+      `Prelude.seq` Prelude.rnf subnetIds
+
+instance Data.ToJSON VPCOptions where
+  toJSON VPCOptions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("SecurityGroupIds" Data..=)
+              Prelude.<$> securityGroupIds,
+            ("SubnetIds" Data..=) Prelude.<$> subnetIds
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/Types/VersionStatus.hs b/gen/Amazonka/OpenSearch/Types/VersionStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/VersionStatus.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.VersionStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.VersionStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.OptionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The status of the the OpenSearch or Elasticsearch version options for
+-- the specified Amazon OpenSearch Service domain.
+--
+-- /See:/ 'newVersionStatus' smart constructor.
+data VersionStatus = VersionStatus'
+  { -- | The OpenSearch or Elasticsearch version for the specified domain.
+    options :: Prelude.Text,
+    -- | The status of the version options for the specified domain.
+    status :: OptionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VersionStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'options', 'versionStatus_options' - The OpenSearch or Elasticsearch version for the specified domain.
+--
+-- 'status', 'versionStatus_status' - The status of the version options for the specified domain.
+newVersionStatus ::
+  -- | 'options'
+  Prelude.Text ->
+  -- | 'status'
+  OptionStatus ->
+  VersionStatus
+newVersionStatus pOptions_ pStatus_ =
+  VersionStatus'
+    { options = pOptions_,
+      status = pStatus_
+    }
+
+-- | The OpenSearch or Elasticsearch version for the specified domain.
+versionStatus_options :: Lens.Lens' VersionStatus Prelude.Text
+versionStatus_options = Lens.lens (\VersionStatus' {options} -> options) (\s@VersionStatus' {} a -> s {options = a} :: VersionStatus)
+
+-- | The status of the version options for the specified domain.
+versionStatus_status :: Lens.Lens' VersionStatus OptionStatus
+versionStatus_status = Lens.lens (\VersionStatus' {status} -> status) (\s@VersionStatus' {} a -> s {status = a} :: VersionStatus)
+
+instance Data.FromJSON VersionStatus where
+  parseJSON =
+    Data.withObject
+      "VersionStatus"
+      ( \x ->
+          VersionStatus'
+            Prelude.<$> (x Data..: "Options")
+            Prelude.<*> (x Data..: "Status")
+      )
+
+instance Prelude.Hashable VersionStatus where
+  hashWithSalt _salt VersionStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` options
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData VersionStatus where
+  rnf VersionStatus' {..} =
+    Prelude.rnf options
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/OpenSearch/Types/VolumeType.hs b/gen/Amazonka/OpenSearch/Types/VolumeType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/VolumeType.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.VolumeType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.VolumeType
+  ( VolumeType
+      ( ..,
+        VolumeType_Gp2,
+        VolumeType_Gp3,
+        VolumeType_Io1,
+        VolumeType_Standard
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The type of EBS volume that a domain uses. For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/opensearch-createupdatedomains.html#opensearch-createdomain-configure-ebs Configuring EBS-based storage>.
+newtype VolumeType = VolumeType'
+  { fromVolumeType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern VolumeType_Gp2 :: VolumeType
+pattern VolumeType_Gp2 = VolumeType' "gp2"
+
+pattern VolumeType_Gp3 :: VolumeType
+pattern VolumeType_Gp3 = VolumeType' "gp3"
+
+pattern VolumeType_Io1 :: VolumeType
+pattern VolumeType_Io1 = VolumeType' "io1"
+
+pattern VolumeType_Standard :: VolumeType
+pattern VolumeType_Standard = VolumeType' "standard"
+
+{-# COMPLETE
+  VolumeType_Gp2,
+  VolumeType_Gp3,
+  VolumeType_Io1,
+  VolumeType_Standard,
+  VolumeType'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/VpcEndpoint.hs b/gen/Amazonka/OpenSearch/Types/VpcEndpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/VpcEndpoint.hs
@@ -0,0 +1,141 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.VpcEndpoint
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.VpcEndpoint where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.VPCDerivedInfo
+import Amazonka.OpenSearch.Types.VpcEndpointStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The connection endpoint for connecting to an Amazon OpenSearch Service
+-- domain through a proxy.
+--
+-- /See:/ 'newVpcEndpoint' smart constructor.
+data VpcEndpoint = VpcEndpoint'
+  { -- | The Amazon Resource Name (ARN) of the domain associated with the
+    -- endpoint.
+    domainArn :: Prelude.Maybe Prelude.Text,
+    -- | The connection endpoint ID for connecting to the domain.
+    endpoint :: Prelude.Maybe Prelude.Text,
+    -- | The current status of the endpoint.
+    status :: Prelude.Maybe VpcEndpointStatus,
+    -- | The unique identifier of the endpoint.
+    vpcEndpointId :: Prelude.Maybe Prelude.Text,
+    -- | The creator of the endpoint.
+    vpcEndpointOwner :: Prelude.Maybe Prelude.Text,
+    -- | Options to specify the subnets and security groups for an Amazon
+    -- OpenSearch Service VPC endpoint.
+    vpcOptions :: Prelude.Maybe VPCDerivedInfo
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VpcEndpoint' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainArn', 'vpcEndpoint_domainArn' - The Amazon Resource Name (ARN) of the domain associated with the
+-- endpoint.
+--
+-- 'endpoint', 'vpcEndpoint_endpoint' - The connection endpoint ID for connecting to the domain.
+--
+-- 'status', 'vpcEndpoint_status' - The current status of the endpoint.
+--
+-- 'vpcEndpointId', 'vpcEndpoint_vpcEndpointId' - The unique identifier of the endpoint.
+--
+-- 'vpcEndpointOwner', 'vpcEndpoint_vpcEndpointOwner' - The creator of the endpoint.
+--
+-- 'vpcOptions', 'vpcEndpoint_vpcOptions' - Options to specify the subnets and security groups for an Amazon
+-- OpenSearch Service VPC endpoint.
+newVpcEndpoint ::
+  VpcEndpoint
+newVpcEndpoint =
+  VpcEndpoint'
+    { domainArn = Prelude.Nothing,
+      endpoint = Prelude.Nothing,
+      status = Prelude.Nothing,
+      vpcEndpointId = Prelude.Nothing,
+      vpcEndpointOwner = Prelude.Nothing,
+      vpcOptions = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the domain associated with the
+-- endpoint.
+vpcEndpoint_domainArn :: Lens.Lens' VpcEndpoint (Prelude.Maybe Prelude.Text)
+vpcEndpoint_domainArn = Lens.lens (\VpcEndpoint' {domainArn} -> domainArn) (\s@VpcEndpoint' {} a -> s {domainArn = a} :: VpcEndpoint)
+
+-- | The connection endpoint ID for connecting to the domain.
+vpcEndpoint_endpoint :: Lens.Lens' VpcEndpoint (Prelude.Maybe Prelude.Text)
+vpcEndpoint_endpoint = Lens.lens (\VpcEndpoint' {endpoint} -> endpoint) (\s@VpcEndpoint' {} a -> s {endpoint = a} :: VpcEndpoint)
+
+-- | The current status of the endpoint.
+vpcEndpoint_status :: Lens.Lens' VpcEndpoint (Prelude.Maybe VpcEndpointStatus)
+vpcEndpoint_status = Lens.lens (\VpcEndpoint' {status} -> status) (\s@VpcEndpoint' {} a -> s {status = a} :: VpcEndpoint)
+
+-- | The unique identifier of the endpoint.
+vpcEndpoint_vpcEndpointId :: Lens.Lens' VpcEndpoint (Prelude.Maybe Prelude.Text)
+vpcEndpoint_vpcEndpointId = Lens.lens (\VpcEndpoint' {vpcEndpointId} -> vpcEndpointId) (\s@VpcEndpoint' {} a -> s {vpcEndpointId = a} :: VpcEndpoint)
+
+-- | The creator of the endpoint.
+vpcEndpoint_vpcEndpointOwner :: Lens.Lens' VpcEndpoint (Prelude.Maybe Prelude.Text)
+vpcEndpoint_vpcEndpointOwner = Lens.lens (\VpcEndpoint' {vpcEndpointOwner} -> vpcEndpointOwner) (\s@VpcEndpoint' {} a -> s {vpcEndpointOwner = a} :: VpcEndpoint)
+
+-- | Options to specify the subnets and security groups for an Amazon
+-- OpenSearch Service VPC endpoint.
+vpcEndpoint_vpcOptions :: Lens.Lens' VpcEndpoint (Prelude.Maybe VPCDerivedInfo)
+vpcEndpoint_vpcOptions = Lens.lens (\VpcEndpoint' {vpcOptions} -> vpcOptions) (\s@VpcEndpoint' {} a -> s {vpcOptions = a} :: VpcEndpoint)
+
+instance Data.FromJSON VpcEndpoint where
+  parseJSON =
+    Data.withObject
+      "VpcEndpoint"
+      ( \x ->
+          VpcEndpoint'
+            Prelude.<$> (x Data..:? "DomainArn")
+            Prelude.<*> (x Data..:? "Endpoint")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "VpcEndpointId")
+            Prelude.<*> (x Data..:? "VpcEndpointOwner")
+            Prelude.<*> (x Data..:? "VpcOptions")
+      )
+
+instance Prelude.Hashable VpcEndpoint where
+  hashWithSalt _salt VpcEndpoint' {..} =
+    _salt
+      `Prelude.hashWithSalt` domainArn
+      `Prelude.hashWithSalt` endpoint
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` vpcEndpointId
+      `Prelude.hashWithSalt` vpcEndpointOwner
+      `Prelude.hashWithSalt` vpcOptions
+
+instance Prelude.NFData VpcEndpoint where
+  rnf VpcEndpoint' {..} =
+    Prelude.rnf domainArn
+      `Prelude.seq` Prelude.rnf endpoint
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf vpcEndpointId
+      `Prelude.seq` Prelude.rnf vpcEndpointOwner
+      `Prelude.seq` Prelude.rnf vpcOptions
diff --git a/gen/Amazonka/OpenSearch/Types/VpcEndpointError.hs b/gen/Amazonka/OpenSearch/Types/VpcEndpointError.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/VpcEndpointError.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.VpcEndpointError
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.VpcEndpointError where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.VpcEndpointErrorCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Error information when attempting to describe an Amazon OpenSearch
+-- Service-managed VPC endpoint.
+--
+-- /See:/ 'newVpcEndpointError' smart constructor.
+data VpcEndpointError = VpcEndpointError'
+  { -- | The code associated with the error.
+    errorCode :: Prelude.Maybe VpcEndpointErrorCode,
+    -- | A message describing the error.
+    errorMessage :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the endpoint.
+    vpcEndpointId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VpcEndpointError' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorCode', 'vpcEndpointError_errorCode' - The code associated with the error.
+--
+-- 'errorMessage', 'vpcEndpointError_errorMessage' - A message describing the error.
+--
+-- 'vpcEndpointId', 'vpcEndpointError_vpcEndpointId' - The unique identifier of the endpoint.
+newVpcEndpointError ::
+  VpcEndpointError
+newVpcEndpointError =
+  VpcEndpointError'
+    { errorCode = Prelude.Nothing,
+      errorMessage = Prelude.Nothing,
+      vpcEndpointId = Prelude.Nothing
+    }
+
+-- | The code associated with the error.
+vpcEndpointError_errorCode :: Lens.Lens' VpcEndpointError (Prelude.Maybe VpcEndpointErrorCode)
+vpcEndpointError_errorCode = Lens.lens (\VpcEndpointError' {errorCode} -> errorCode) (\s@VpcEndpointError' {} a -> s {errorCode = a} :: VpcEndpointError)
+
+-- | A message describing the error.
+vpcEndpointError_errorMessage :: Lens.Lens' VpcEndpointError (Prelude.Maybe Prelude.Text)
+vpcEndpointError_errorMessage = Lens.lens (\VpcEndpointError' {errorMessage} -> errorMessage) (\s@VpcEndpointError' {} a -> s {errorMessage = a} :: VpcEndpointError)
+
+-- | The unique identifier of the endpoint.
+vpcEndpointError_vpcEndpointId :: Lens.Lens' VpcEndpointError (Prelude.Maybe Prelude.Text)
+vpcEndpointError_vpcEndpointId = Lens.lens (\VpcEndpointError' {vpcEndpointId} -> vpcEndpointId) (\s@VpcEndpointError' {} a -> s {vpcEndpointId = a} :: VpcEndpointError)
+
+instance Data.FromJSON VpcEndpointError where
+  parseJSON =
+    Data.withObject
+      "VpcEndpointError"
+      ( \x ->
+          VpcEndpointError'
+            Prelude.<$> (x Data..:? "ErrorCode")
+            Prelude.<*> (x Data..:? "ErrorMessage")
+            Prelude.<*> (x Data..:? "VpcEndpointId")
+      )
+
+instance Prelude.Hashable VpcEndpointError where
+  hashWithSalt _salt VpcEndpointError' {..} =
+    _salt
+      `Prelude.hashWithSalt` errorCode
+      `Prelude.hashWithSalt` errorMessage
+      `Prelude.hashWithSalt` vpcEndpointId
+
+instance Prelude.NFData VpcEndpointError where
+  rnf VpcEndpointError' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf vpcEndpointId
diff --git a/gen/Amazonka/OpenSearch/Types/VpcEndpointErrorCode.hs b/gen/Amazonka/OpenSearch/Types/VpcEndpointErrorCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/VpcEndpointErrorCode.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.VpcEndpointErrorCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.VpcEndpointErrorCode
+  ( VpcEndpointErrorCode
+      ( ..,
+        VpcEndpointErrorCode_ENDPOINT_NOT_FOUND,
+        VpcEndpointErrorCode_SERVER_ERROR
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype VpcEndpointErrorCode = VpcEndpointErrorCode'
+  { fromVpcEndpointErrorCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern VpcEndpointErrorCode_ENDPOINT_NOT_FOUND :: VpcEndpointErrorCode
+pattern VpcEndpointErrorCode_ENDPOINT_NOT_FOUND = VpcEndpointErrorCode' "ENDPOINT_NOT_FOUND"
+
+pattern VpcEndpointErrorCode_SERVER_ERROR :: VpcEndpointErrorCode
+pattern VpcEndpointErrorCode_SERVER_ERROR = VpcEndpointErrorCode' "SERVER_ERROR"
+
+{-# COMPLETE
+  VpcEndpointErrorCode_ENDPOINT_NOT_FOUND,
+  VpcEndpointErrorCode_SERVER_ERROR,
+  VpcEndpointErrorCode'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/VpcEndpointStatus.hs b/gen/Amazonka/OpenSearch/Types/VpcEndpointStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/VpcEndpointStatus.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.VpcEndpointStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.VpcEndpointStatus
+  ( VpcEndpointStatus
+      ( ..,
+        VpcEndpointStatus_ACTIVE,
+        VpcEndpointStatus_CREATE_FAILED,
+        VpcEndpointStatus_CREATING,
+        VpcEndpointStatus_DELETE_FAILED,
+        VpcEndpointStatus_DELETING,
+        VpcEndpointStatus_UPDATE_FAILED,
+        VpcEndpointStatus_UPDATING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype VpcEndpointStatus = VpcEndpointStatus'
+  { fromVpcEndpointStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern VpcEndpointStatus_ACTIVE :: VpcEndpointStatus
+pattern VpcEndpointStatus_ACTIVE = VpcEndpointStatus' "ACTIVE"
+
+pattern VpcEndpointStatus_CREATE_FAILED :: VpcEndpointStatus
+pattern VpcEndpointStatus_CREATE_FAILED = VpcEndpointStatus' "CREATE_FAILED"
+
+pattern VpcEndpointStatus_CREATING :: VpcEndpointStatus
+pattern VpcEndpointStatus_CREATING = VpcEndpointStatus' "CREATING"
+
+pattern VpcEndpointStatus_DELETE_FAILED :: VpcEndpointStatus
+pattern VpcEndpointStatus_DELETE_FAILED = VpcEndpointStatus' "DELETE_FAILED"
+
+pattern VpcEndpointStatus_DELETING :: VpcEndpointStatus
+pattern VpcEndpointStatus_DELETING = VpcEndpointStatus' "DELETING"
+
+pattern VpcEndpointStatus_UPDATE_FAILED :: VpcEndpointStatus
+pattern VpcEndpointStatus_UPDATE_FAILED = VpcEndpointStatus' "UPDATE_FAILED"
+
+pattern VpcEndpointStatus_UPDATING :: VpcEndpointStatus
+pattern VpcEndpointStatus_UPDATING = VpcEndpointStatus' "UPDATING"
+
+{-# COMPLETE
+  VpcEndpointStatus_ACTIVE,
+  VpcEndpointStatus_CREATE_FAILED,
+  VpcEndpointStatus_CREATING,
+  VpcEndpointStatus_DELETE_FAILED,
+  VpcEndpointStatus_DELETING,
+  VpcEndpointStatus_UPDATE_FAILED,
+  VpcEndpointStatus_UPDATING,
+  VpcEndpointStatus'
+  #-}
diff --git a/gen/Amazonka/OpenSearch/Types/VpcEndpointSummary.hs b/gen/Amazonka/OpenSearch/Types/VpcEndpointSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/VpcEndpointSummary.hs
@@ -0,0 +1,113 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.VpcEndpointSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.VpcEndpointSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types.VpcEndpointStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Summary information for an Amazon OpenSearch Service-managed VPC
+-- endpoint.
+--
+-- /See:/ 'newVpcEndpointSummary' smart constructor.
+data VpcEndpointSummary = VpcEndpointSummary'
+  { -- | The Amazon Resource Name (ARN) of the domain associated with the
+    -- endpoint.
+    domainArn :: Prelude.Maybe Prelude.Text,
+    -- | The current status of the endpoint.
+    status :: Prelude.Maybe VpcEndpointStatus,
+    -- | The unique identifier of the endpoint.
+    vpcEndpointId :: Prelude.Maybe Prelude.Text,
+    -- | The creator of the endpoint.
+    vpcEndpointOwner :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VpcEndpointSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainArn', 'vpcEndpointSummary_domainArn' - The Amazon Resource Name (ARN) of the domain associated with the
+-- endpoint.
+--
+-- 'status', 'vpcEndpointSummary_status' - The current status of the endpoint.
+--
+-- 'vpcEndpointId', 'vpcEndpointSummary_vpcEndpointId' - The unique identifier of the endpoint.
+--
+-- 'vpcEndpointOwner', 'vpcEndpointSummary_vpcEndpointOwner' - The creator of the endpoint.
+newVpcEndpointSummary ::
+  VpcEndpointSummary
+newVpcEndpointSummary =
+  VpcEndpointSummary'
+    { domainArn = Prelude.Nothing,
+      status = Prelude.Nothing,
+      vpcEndpointId = Prelude.Nothing,
+      vpcEndpointOwner = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the domain associated with the
+-- endpoint.
+vpcEndpointSummary_domainArn :: Lens.Lens' VpcEndpointSummary (Prelude.Maybe Prelude.Text)
+vpcEndpointSummary_domainArn = Lens.lens (\VpcEndpointSummary' {domainArn} -> domainArn) (\s@VpcEndpointSummary' {} a -> s {domainArn = a} :: VpcEndpointSummary)
+
+-- | The current status of the endpoint.
+vpcEndpointSummary_status :: Lens.Lens' VpcEndpointSummary (Prelude.Maybe VpcEndpointStatus)
+vpcEndpointSummary_status = Lens.lens (\VpcEndpointSummary' {status} -> status) (\s@VpcEndpointSummary' {} a -> s {status = a} :: VpcEndpointSummary)
+
+-- | The unique identifier of the endpoint.
+vpcEndpointSummary_vpcEndpointId :: Lens.Lens' VpcEndpointSummary (Prelude.Maybe Prelude.Text)
+vpcEndpointSummary_vpcEndpointId = Lens.lens (\VpcEndpointSummary' {vpcEndpointId} -> vpcEndpointId) (\s@VpcEndpointSummary' {} a -> s {vpcEndpointId = a} :: VpcEndpointSummary)
+
+-- | The creator of the endpoint.
+vpcEndpointSummary_vpcEndpointOwner :: Lens.Lens' VpcEndpointSummary (Prelude.Maybe Prelude.Text)
+vpcEndpointSummary_vpcEndpointOwner = Lens.lens (\VpcEndpointSummary' {vpcEndpointOwner} -> vpcEndpointOwner) (\s@VpcEndpointSummary' {} a -> s {vpcEndpointOwner = a} :: VpcEndpointSummary)
+
+instance Data.FromJSON VpcEndpointSummary where
+  parseJSON =
+    Data.withObject
+      "VpcEndpointSummary"
+      ( \x ->
+          VpcEndpointSummary'
+            Prelude.<$> (x Data..:? "DomainArn")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "VpcEndpointId")
+            Prelude.<*> (x Data..:? "VpcEndpointOwner")
+      )
+
+instance Prelude.Hashable VpcEndpointSummary where
+  hashWithSalt _salt VpcEndpointSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` domainArn
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` vpcEndpointId
+      `Prelude.hashWithSalt` vpcEndpointOwner
+
+instance Prelude.NFData VpcEndpointSummary where
+  rnf VpcEndpointSummary' {..} =
+    Prelude.rnf domainArn
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf vpcEndpointId
+      `Prelude.seq` Prelude.rnf vpcEndpointOwner
diff --git a/gen/Amazonka/OpenSearch/Types/ZoneAwarenessConfig.hs b/gen/Amazonka/OpenSearch/Types/ZoneAwarenessConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Types/ZoneAwarenessConfig.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Types.ZoneAwarenessConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Types.ZoneAwarenessConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The zone awareness configuration for an Amazon OpenSearch Service
+-- domain.
+--
+-- /See:/ 'newZoneAwarenessConfig' smart constructor.
+data ZoneAwarenessConfig = ZoneAwarenessConfig'
+  { -- | If you enabled multiple Availability Zones, this value is the number of
+    -- zones that you want the domain to use. Valid values are @2@ and @3@. If
+    -- your domain is provisioned within a VPC, this value be equal to number
+    -- of subnets.
+    availabilityZoneCount :: Prelude.Maybe Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ZoneAwarenessConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'availabilityZoneCount', 'zoneAwarenessConfig_availabilityZoneCount' - If you enabled multiple Availability Zones, this value is the number of
+-- zones that you want the domain to use. Valid values are @2@ and @3@. If
+-- your domain is provisioned within a VPC, this value be equal to number
+-- of subnets.
+newZoneAwarenessConfig ::
+  ZoneAwarenessConfig
+newZoneAwarenessConfig =
+  ZoneAwarenessConfig'
+    { availabilityZoneCount =
+        Prelude.Nothing
+    }
+
+-- | If you enabled multiple Availability Zones, this value is the number of
+-- zones that you want the domain to use. Valid values are @2@ and @3@. If
+-- your domain is provisioned within a VPC, this value be equal to number
+-- of subnets.
+zoneAwarenessConfig_availabilityZoneCount :: Lens.Lens' ZoneAwarenessConfig (Prelude.Maybe Prelude.Int)
+zoneAwarenessConfig_availabilityZoneCount = Lens.lens (\ZoneAwarenessConfig' {availabilityZoneCount} -> availabilityZoneCount) (\s@ZoneAwarenessConfig' {} a -> s {availabilityZoneCount = a} :: ZoneAwarenessConfig)
+
+instance Data.FromJSON ZoneAwarenessConfig where
+  parseJSON =
+    Data.withObject
+      "ZoneAwarenessConfig"
+      ( \x ->
+          ZoneAwarenessConfig'
+            Prelude.<$> (x Data..:? "AvailabilityZoneCount")
+      )
+
+instance Prelude.Hashable ZoneAwarenessConfig where
+  hashWithSalt _salt ZoneAwarenessConfig' {..} =
+    _salt `Prelude.hashWithSalt` availabilityZoneCount
+
+instance Prelude.NFData ZoneAwarenessConfig where
+  rnf ZoneAwarenessConfig' {..} =
+    Prelude.rnf availabilityZoneCount
+
+instance Data.ToJSON ZoneAwarenessConfig where
+  toJSON ZoneAwarenessConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AvailabilityZoneCount" Data..=)
+              Prelude.<$> availabilityZoneCount
+          ]
+      )
diff --git a/gen/Amazonka/OpenSearch/UpdateDomainConfig.hs b/gen/Amazonka/OpenSearch/UpdateDomainConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/UpdateDomainConfig.hs
@@ -0,0 +1,491 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.UpdateDomainConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Modifies the cluster configuration of the specified Amazon OpenSearch
+-- Service domain.
+module Amazonka.OpenSearch.UpdateDomainConfig
+  ( -- * Creating a Request
+    UpdateDomainConfig (..),
+    newUpdateDomainConfig,
+
+    -- * Request Lenses
+    updateDomainConfig_accessPolicies,
+    updateDomainConfig_advancedOptions,
+    updateDomainConfig_advancedSecurityOptions,
+    updateDomainConfig_autoTuneOptions,
+    updateDomainConfig_clusterConfig,
+    updateDomainConfig_cognitoOptions,
+    updateDomainConfig_domainEndpointOptions,
+    updateDomainConfig_dryRun,
+    updateDomainConfig_eBSOptions,
+    updateDomainConfig_encryptionAtRestOptions,
+    updateDomainConfig_logPublishingOptions,
+    updateDomainConfig_nodeToNodeEncryptionOptions,
+    updateDomainConfig_snapshotOptions,
+    updateDomainConfig_vPCOptions,
+    updateDomainConfig_domainName,
+
+    -- * Destructuring the Response
+    UpdateDomainConfigResponse (..),
+    newUpdateDomainConfigResponse,
+
+    -- * Response Lenses
+    updateDomainConfigResponse_dryRunResults,
+    updateDomainConfigResponse_httpStatus,
+    updateDomainConfigResponse_domainConfig,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to the @UpdateDomain@ operation.
+--
+-- /See:/ 'newUpdateDomainConfig' smart constructor.
+data UpdateDomainConfig = UpdateDomainConfig'
+  { -- | Identity and Access Management (IAM) access policy as a JSON-formatted
+    -- string.
+    accessPolicies :: Prelude.Maybe Prelude.Text,
+    -- | Key-value pairs to specify advanced configuration options. The following
+    -- key-value pairs are supported:
+    --
+    -- -   @\"rest.action.multi.allow_explicit_index\": \"true\" | \"false\"@ -
+    --     Note the use of a string rather than a boolean. Specifies whether
+    --     explicit references to indexes are allowed inside the body of HTTP
+    --     requests. If you want to configure access policies for domain
+    --     sub-resources, such as specific indexes and domain APIs, you must
+    --     disable this property. Default is true.
+    --
+    -- -   @\"indices.fielddata.cache.size\": \"80\" @ - Note the use of a
+    --     string rather than a boolean. Specifies the percentage of heap space
+    --     allocated to field data. Default is unbounded.
+    --
+    -- -   @\"indices.query.bool.max_clause_count\": \"1024\"@ - Note the use
+    --     of a string rather than a boolean. Specifies the maximum number of
+    --     clauses allowed in a Lucene boolean query. Default is 1,024. Queries
+    --     with more than the permitted number of clauses result in a
+    --     @TooManyClauses@ error.
+    --
+    -- -   @\"override_main_response_version\": \"true\" | \"false\"@ - Note
+    --     the use of a string rather than a boolean. Specifies whether the
+    --     domain reports its version as 7.10 to allow Elasticsearch OSS
+    --     clients and plugins to continue working with it. Default is false
+    --     when creating a domain and true when upgrading a domain.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomain-configure-advanced-options Advanced cluster parameters>.
+    advancedOptions :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Options for fine-grained access control.
+    advancedSecurityOptions :: Prelude.Maybe AdvancedSecurityOptionsInput,
+    -- | Options for Auto-Tune.
+    autoTuneOptions :: Prelude.Maybe AutoTuneOptions,
+    -- | Changes that you want to make to the cluster configuration, such as the
+    -- instance type and number of EC2 instances.
+    clusterConfig :: Prelude.Maybe ClusterConfig,
+    -- | Key-value pairs to configure Amazon Cognito authentication for
+    -- OpenSearch Dashboards.
+    cognitoOptions :: Prelude.Maybe CognitoOptions,
+    -- | Additional options for the domain endpoint, such as whether to require
+    -- HTTPS for all traffic.
+    domainEndpointOptions :: Prelude.Maybe DomainEndpointOptions,
+    -- | This flag, when set to True, specifies whether the @UpdateDomain@
+    -- request should return the results of validation check without actually
+    -- applying the change.
+    dryRun :: Prelude.Maybe Prelude.Bool,
+    -- | The type and size of the EBS volume to attach to instances in the
+    -- domain.
+    eBSOptions :: Prelude.Maybe EBSOptions,
+    -- | Encryption at rest options for the domain.
+    encryptionAtRestOptions :: Prelude.Maybe EncryptionAtRestOptions,
+    -- | Options to publish OpenSearch lots to Amazon CloudWatch Logs.
+    logPublishingOptions :: Prelude.Maybe (Prelude.HashMap LogType LogPublishingOption),
+    -- | Node-To-Node Encryption options for the domain.
+    nodeToNodeEncryptionOptions :: Prelude.Maybe NodeToNodeEncryptionOptions,
+    -- | Option to set the time, in UTC format, for the daily automated snapshot.
+    -- Default value is @0@ hours.
+    snapshotOptions :: Prelude.Maybe SnapshotOptions,
+    -- | Options to specify the subnets and security groups for a VPC endpoint.
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html Launching your Amazon OpenSearch Service domains using a VPC>.
+    vPCOptions :: Prelude.Maybe VPCOptions,
+    -- | The name of the domain that you\'re updating.
+    domainName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateDomainConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'accessPolicies', 'updateDomainConfig_accessPolicies' - Identity and Access Management (IAM) access policy as a JSON-formatted
+-- string.
+--
+-- 'advancedOptions', 'updateDomainConfig_advancedOptions' - Key-value pairs to specify advanced configuration options. The following
+-- key-value pairs are supported:
+--
+-- -   @\"rest.action.multi.allow_explicit_index\": \"true\" | \"false\"@ -
+--     Note the use of a string rather than a boolean. Specifies whether
+--     explicit references to indexes are allowed inside the body of HTTP
+--     requests. If you want to configure access policies for domain
+--     sub-resources, such as specific indexes and domain APIs, you must
+--     disable this property. Default is true.
+--
+-- -   @\"indices.fielddata.cache.size\": \"80\" @ - Note the use of a
+--     string rather than a boolean. Specifies the percentage of heap space
+--     allocated to field data. Default is unbounded.
+--
+-- -   @\"indices.query.bool.max_clause_count\": \"1024\"@ - Note the use
+--     of a string rather than a boolean. Specifies the maximum number of
+--     clauses allowed in a Lucene boolean query. Default is 1,024. Queries
+--     with more than the permitted number of clauses result in a
+--     @TooManyClauses@ error.
+--
+-- -   @\"override_main_response_version\": \"true\" | \"false\"@ - Note
+--     the use of a string rather than a boolean. Specifies whether the
+--     domain reports its version as 7.10 to allow Elasticsearch OSS
+--     clients and plugins to continue working with it. Default is false
+--     when creating a domain and true when upgrading a domain.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomain-configure-advanced-options Advanced cluster parameters>.
+--
+-- 'advancedSecurityOptions', 'updateDomainConfig_advancedSecurityOptions' - Options for fine-grained access control.
+--
+-- 'autoTuneOptions', 'updateDomainConfig_autoTuneOptions' - Options for Auto-Tune.
+--
+-- 'clusterConfig', 'updateDomainConfig_clusterConfig' - Changes that you want to make to the cluster configuration, such as the
+-- instance type and number of EC2 instances.
+--
+-- 'cognitoOptions', 'updateDomainConfig_cognitoOptions' - Key-value pairs to configure Amazon Cognito authentication for
+-- OpenSearch Dashboards.
+--
+-- 'domainEndpointOptions', 'updateDomainConfig_domainEndpointOptions' - Additional options for the domain endpoint, such as whether to require
+-- HTTPS for all traffic.
+--
+-- 'dryRun', 'updateDomainConfig_dryRun' - This flag, when set to True, specifies whether the @UpdateDomain@
+-- request should return the results of validation check without actually
+-- applying the change.
+--
+-- 'eBSOptions', 'updateDomainConfig_eBSOptions' - The type and size of the EBS volume to attach to instances in the
+-- domain.
+--
+-- 'encryptionAtRestOptions', 'updateDomainConfig_encryptionAtRestOptions' - Encryption at rest options for the domain.
+--
+-- 'logPublishingOptions', 'updateDomainConfig_logPublishingOptions' - Options to publish OpenSearch lots to Amazon CloudWatch Logs.
+--
+-- 'nodeToNodeEncryptionOptions', 'updateDomainConfig_nodeToNodeEncryptionOptions' - Node-To-Node Encryption options for the domain.
+--
+-- 'snapshotOptions', 'updateDomainConfig_snapshotOptions' - Option to set the time, in UTC format, for the daily automated snapshot.
+-- Default value is @0@ hours.
+--
+-- 'vPCOptions', 'updateDomainConfig_vPCOptions' - Options to specify the subnets and security groups for a VPC endpoint.
+-- For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html Launching your Amazon OpenSearch Service domains using a VPC>.
+--
+-- 'domainName', 'updateDomainConfig_domainName' - The name of the domain that you\'re updating.
+newUpdateDomainConfig ::
+  -- | 'domainName'
+  Prelude.Text ->
+  UpdateDomainConfig
+newUpdateDomainConfig pDomainName_ =
+  UpdateDomainConfig'
+    { accessPolicies =
+        Prelude.Nothing,
+      advancedOptions = Prelude.Nothing,
+      advancedSecurityOptions = Prelude.Nothing,
+      autoTuneOptions = Prelude.Nothing,
+      clusterConfig = Prelude.Nothing,
+      cognitoOptions = Prelude.Nothing,
+      domainEndpointOptions = Prelude.Nothing,
+      dryRun = Prelude.Nothing,
+      eBSOptions = Prelude.Nothing,
+      encryptionAtRestOptions = Prelude.Nothing,
+      logPublishingOptions = Prelude.Nothing,
+      nodeToNodeEncryptionOptions = Prelude.Nothing,
+      snapshotOptions = Prelude.Nothing,
+      vPCOptions = Prelude.Nothing,
+      domainName = pDomainName_
+    }
+
+-- | Identity and Access Management (IAM) access policy as a JSON-formatted
+-- string.
+updateDomainConfig_accessPolicies :: Lens.Lens' UpdateDomainConfig (Prelude.Maybe Prelude.Text)
+updateDomainConfig_accessPolicies = Lens.lens (\UpdateDomainConfig' {accessPolicies} -> accessPolicies) (\s@UpdateDomainConfig' {} a -> s {accessPolicies = a} :: UpdateDomainConfig)
+
+-- | Key-value pairs to specify advanced configuration options. The following
+-- key-value pairs are supported:
+--
+-- -   @\"rest.action.multi.allow_explicit_index\": \"true\" | \"false\"@ -
+--     Note the use of a string rather than a boolean. Specifies whether
+--     explicit references to indexes are allowed inside the body of HTTP
+--     requests. If you want to configure access policies for domain
+--     sub-resources, such as specific indexes and domain APIs, you must
+--     disable this property. Default is true.
+--
+-- -   @\"indices.fielddata.cache.size\": \"80\" @ - Note the use of a
+--     string rather than a boolean. Specifies the percentage of heap space
+--     allocated to field data. Default is unbounded.
+--
+-- -   @\"indices.query.bool.max_clause_count\": \"1024\"@ - Note the use
+--     of a string rather than a boolean. Specifies the maximum number of
+--     clauses allowed in a Lucene boolean query. Default is 1,024. Queries
+--     with more than the permitted number of clauses result in a
+--     @TooManyClauses@ error.
+--
+-- -   @\"override_main_response_version\": \"true\" | \"false\"@ - Note
+--     the use of a string rather than a boolean. Specifies whether the
+--     domain reports its version as 7.10 to allow Elasticsearch OSS
+--     clients and plugins to continue working with it. Default is false
+--     when creating a domain and true when upgrading a domain.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomain-configure-advanced-options Advanced cluster parameters>.
+updateDomainConfig_advancedOptions :: Lens.Lens' UpdateDomainConfig (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+updateDomainConfig_advancedOptions = Lens.lens (\UpdateDomainConfig' {advancedOptions} -> advancedOptions) (\s@UpdateDomainConfig' {} a -> s {advancedOptions = a} :: UpdateDomainConfig) Prelude.. Lens.mapping Lens.coerced
+
+-- | Options for fine-grained access control.
+updateDomainConfig_advancedSecurityOptions :: Lens.Lens' UpdateDomainConfig (Prelude.Maybe AdvancedSecurityOptionsInput)
+updateDomainConfig_advancedSecurityOptions = Lens.lens (\UpdateDomainConfig' {advancedSecurityOptions} -> advancedSecurityOptions) (\s@UpdateDomainConfig' {} a -> s {advancedSecurityOptions = a} :: UpdateDomainConfig)
+
+-- | Options for Auto-Tune.
+updateDomainConfig_autoTuneOptions :: Lens.Lens' UpdateDomainConfig (Prelude.Maybe AutoTuneOptions)
+updateDomainConfig_autoTuneOptions = Lens.lens (\UpdateDomainConfig' {autoTuneOptions} -> autoTuneOptions) (\s@UpdateDomainConfig' {} a -> s {autoTuneOptions = a} :: UpdateDomainConfig)
+
+-- | Changes that you want to make to the cluster configuration, such as the
+-- instance type and number of EC2 instances.
+updateDomainConfig_clusterConfig :: Lens.Lens' UpdateDomainConfig (Prelude.Maybe ClusterConfig)
+updateDomainConfig_clusterConfig = Lens.lens (\UpdateDomainConfig' {clusterConfig} -> clusterConfig) (\s@UpdateDomainConfig' {} a -> s {clusterConfig = a} :: UpdateDomainConfig)
+
+-- | Key-value pairs to configure Amazon Cognito authentication for
+-- OpenSearch Dashboards.
+updateDomainConfig_cognitoOptions :: Lens.Lens' UpdateDomainConfig (Prelude.Maybe CognitoOptions)
+updateDomainConfig_cognitoOptions = Lens.lens (\UpdateDomainConfig' {cognitoOptions} -> cognitoOptions) (\s@UpdateDomainConfig' {} a -> s {cognitoOptions = a} :: UpdateDomainConfig)
+
+-- | Additional options for the domain endpoint, such as whether to require
+-- HTTPS for all traffic.
+updateDomainConfig_domainEndpointOptions :: Lens.Lens' UpdateDomainConfig (Prelude.Maybe DomainEndpointOptions)
+updateDomainConfig_domainEndpointOptions = Lens.lens (\UpdateDomainConfig' {domainEndpointOptions} -> domainEndpointOptions) (\s@UpdateDomainConfig' {} a -> s {domainEndpointOptions = a} :: UpdateDomainConfig)
+
+-- | This flag, when set to True, specifies whether the @UpdateDomain@
+-- request should return the results of validation check without actually
+-- applying the change.
+updateDomainConfig_dryRun :: Lens.Lens' UpdateDomainConfig (Prelude.Maybe Prelude.Bool)
+updateDomainConfig_dryRun = Lens.lens (\UpdateDomainConfig' {dryRun} -> dryRun) (\s@UpdateDomainConfig' {} a -> s {dryRun = a} :: UpdateDomainConfig)
+
+-- | The type and size of the EBS volume to attach to instances in the
+-- domain.
+updateDomainConfig_eBSOptions :: Lens.Lens' UpdateDomainConfig (Prelude.Maybe EBSOptions)
+updateDomainConfig_eBSOptions = Lens.lens (\UpdateDomainConfig' {eBSOptions} -> eBSOptions) (\s@UpdateDomainConfig' {} a -> s {eBSOptions = a} :: UpdateDomainConfig)
+
+-- | Encryption at rest options for the domain.
+updateDomainConfig_encryptionAtRestOptions :: Lens.Lens' UpdateDomainConfig (Prelude.Maybe EncryptionAtRestOptions)
+updateDomainConfig_encryptionAtRestOptions = Lens.lens (\UpdateDomainConfig' {encryptionAtRestOptions} -> encryptionAtRestOptions) (\s@UpdateDomainConfig' {} a -> s {encryptionAtRestOptions = a} :: UpdateDomainConfig)
+
+-- | Options to publish OpenSearch lots to Amazon CloudWatch Logs.
+updateDomainConfig_logPublishingOptions :: Lens.Lens' UpdateDomainConfig (Prelude.Maybe (Prelude.HashMap LogType LogPublishingOption))
+updateDomainConfig_logPublishingOptions = Lens.lens (\UpdateDomainConfig' {logPublishingOptions} -> logPublishingOptions) (\s@UpdateDomainConfig' {} a -> s {logPublishingOptions = a} :: UpdateDomainConfig) Prelude.. Lens.mapping Lens.coerced
+
+-- | Node-To-Node Encryption options for the domain.
+updateDomainConfig_nodeToNodeEncryptionOptions :: Lens.Lens' UpdateDomainConfig (Prelude.Maybe NodeToNodeEncryptionOptions)
+updateDomainConfig_nodeToNodeEncryptionOptions = Lens.lens (\UpdateDomainConfig' {nodeToNodeEncryptionOptions} -> nodeToNodeEncryptionOptions) (\s@UpdateDomainConfig' {} a -> s {nodeToNodeEncryptionOptions = a} :: UpdateDomainConfig)
+
+-- | Option to set the time, in UTC format, for the daily automated snapshot.
+-- Default value is @0@ hours.
+updateDomainConfig_snapshotOptions :: Lens.Lens' UpdateDomainConfig (Prelude.Maybe SnapshotOptions)
+updateDomainConfig_snapshotOptions = Lens.lens (\UpdateDomainConfig' {snapshotOptions} -> snapshotOptions) (\s@UpdateDomainConfig' {} a -> s {snapshotOptions = a} :: UpdateDomainConfig)
+
+-- | Options to specify the subnets and security groups for a VPC endpoint.
+-- For more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html Launching your Amazon OpenSearch Service domains using a VPC>.
+updateDomainConfig_vPCOptions :: Lens.Lens' UpdateDomainConfig (Prelude.Maybe VPCOptions)
+updateDomainConfig_vPCOptions = Lens.lens (\UpdateDomainConfig' {vPCOptions} -> vPCOptions) (\s@UpdateDomainConfig' {} a -> s {vPCOptions = a} :: UpdateDomainConfig)
+
+-- | The name of the domain that you\'re updating.
+updateDomainConfig_domainName :: Lens.Lens' UpdateDomainConfig Prelude.Text
+updateDomainConfig_domainName = Lens.lens (\UpdateDomainConfig' {domainName} -> domainName) (\s@UpdateDomainConfig' {} a -> s {domainName = a} :: UpdateDomainConfig)
+
+instance Core.AWSRequest UpdateDomainConfig where
+  type
+    AWSResponse UpdateDomainConfig =
+      UpdateDomainConfigResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateDomainConfigResponse'
+            Prelude.<$> (x Data..?> "DryRunResults")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "DomainConfig")
+      )
+
+instance Prelude.Hashable UpdateDomainConfig where
+  hashWithSalt _salt UpdateDomainConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` accessPolicies
+      `Prelude.hashWithSalt` advancedOptions
+      `Prelude.hashWithSalt` advancedSecurityOptions
+      `Prelude.hashWithSalt` autoTuneOptions
+      `Prelude.hashWithSalt` clusterConfig
+      `Prelude.hashWithSalt` cognitoOptions
+      `Prelude.hashWithSalt` domainEndpointOptions
+      `Prelude.hashWithSalt` dryRun
+      `Prelude.hashWithSalt` eBSOptions
+      `Prelude.hashWithSalt` encryptionAtRestOptions
+      `Prelude.hashWithSalt` logPublishingOptions
+      `Prelude.hashWithSalt` nodeToNodeEncryptionOptions
+      `Prelude.hashWithSalt` snapshotOptions
+      `Prelude.hashWithSalt` vPCOptions
+      `Prelude.hashWithSalt` domainName
+
+instance Prelude.NFData UpdateDomainConfig where
+  rnf UpdateDomainConfig' {..} =
+    Prelude.rnf accessPolicies
+      `Prelude.seq` Prelude.rnf advancedOptions
+      `Prelude.seq` Prelude.rnf advancedSecurityOptions
+      `Prelude.seq` Prelude.rnf autoTuneOptions
+      `Prelude.seq` Prelude.rnf clusterConfig
+      `Prelude.seq` Prelude.rnf cognitoOptions
+      `Prelude.seq` Prelude.rnf domainEndpointOptions
+      `Prelude.seq` Prelude.rnf dryRun
+      `Prelude.seq` Prelude.rnf eBSOptions
+      `Prelude.seq` Prelude.rnf encryptionAtRestOptions
+      `Prelude.seq` Prelude.rnf logPublishingOptions
+      `Prelude.seq` Prelude.rnf nodeToNodeEncryptionOptions
+      `Prelude.seq` Prelude.rnf snapshotOptions
+      `Prelude.seq` Prelude.rnf vPCOptions
+      `Prelude.seq` Prelude.rnf domainName
+
+instance Data.ToHeaders UpdateDomainConfig where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON UpdateDomainConfig where
+  toJSON UpdateDomainConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AccessPolicies" Data..=)
+              Prelude.<$> accessPolicies,
+            ("AdvancedOptions" Data..=)
+              Prelude.<$> advancedOptions,
+            ("AdvancedSecurityOptions" Data..=)
+              Prelude.<$> advancedSecurityOptions,
+            ("AutoTuneOptions" Data..=)
+              Prelude.<$> autoTuneOptions,
+            ("ClusterConfig" Data..=) Prelude.<$> clusterConfig,
+            ("CognitoOptions" Data..=)
+              Prelude.<$> cognitoOptions,
+            ("DomainEndpointOptions" Data..=)
+              Prelude.<$> domainEndpointOptions,
+            ("DryRun" Data..=) Prelude.<$> dryRun,
+            ("EBSOptions" Data..=) Prelude.<$> eBSOptions,
+            ("EncryptionAtRestOptions" Data..=)
+              Prelude.<$> encryptionAtRestOptions,
+            ("LogPublishingOptions" Data..=)
+              Prelude.<$> logPublishingOptions,
+            ("NodeToNodeEncryptionOptions" Data..=)
+              Prelude.<$> nodeToNodeEncryptionOptions,
+            ("SnapshotOptions" Data..=)
+              Prelude.<$> snapshotOptions,
+            ("VPCOptions" Data..=) Prelude.<$> vPCOptions
+          ]
+      )
+
+instance Data.ToPath UpdateDomainConfig where
+  toPath UpdateDomainConfig' {..} =
+    Prelude.mconcat
+      [ "/2021-01-01/opensearch/domain/",
+        Data.toBS domainName,
+        "/config"
+      ]
+
+instance Data.ToQuery UpdateDomainConfig where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The results of an @UpdateDomain@ request. Contains the status of the
+-- domain being updated.
+--
+-- /See:/ 'newUpdateDomainConfigResponse' smart constructor.
+data UpdateDomainConfigResponse = UpdateDomainConfigResponse'
+  { -- | Results of a dry run performed in an update domain request.
+    dryRunResults :: Prelude.Maybe DryRunResults,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The status of the updated domain.
+    domainConfig :: DomainConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateDomainConfigResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dryRunResults', 'updateDomainConfigResponse_dryRunResults' - Results of a dry run performed in an update domain request.
+--
+-- 'httpStatus', 'updateDomainConfigResponse_httpStatus' - The response's http status code.
+--
+-- 'domainConfig', 'updateDomainConfigResponse_domainConfig' - The status of the updated domain.
+newUpdateDomainConfigResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'domainConfig'
+  DomainConfig ->
+  UpdateDomainConfigResponse
+newUpdateDomainConfigResponse
+  pHttpStatus_
+  pDomainConfig_ =
+    UpdateDomainConfigResponse'
+      { dryRunResults =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        domainConfig = pDomainConfig_
+      }
+
+-- | Results of a dry run performed in an update domain request.
+updateDomainConfigResponse_dryRunResults :: Lens.Lens' UpdateDomainConfigResponse (Prelude.Maybe DryRunResults)
+updateDomainConfigResponse_dryRunResults = Lens.lens (\UpdateDomainConfigResponse' {dryRunResults} -> dryRunResults) (\s@UpdateDomainConfigResponse' {} a -> s {dryRunResults = a} :: UpdateDomainConfigResponse)
+
+-- | The response's http status code.
+updateDomainConfigResponse_httpStatus :: Lens.Lens' UpdateDomainConfigResponse Prelude.Int
+updateDomainConfigResponse_httpStatus = Lens.lens (\UpdateDomainConfigResponse' {httpStatus} -> httpStatus) (\s@UpdateDomainConfigResponse' {} a -> s {httpStatus = a} :: UpdateDomainConfigResponse)
+
+-- | The status of the updated domain.
+updateDomainConfigResponse_domainConfig :: Lens.Lens' UpdateDomainConfigResponse DomainConfig
+updateDomainConfigResponse_domainConfig = Lens.lens (\UpdateDomainConfigResponse' {domainConfig} -> domainConfig) (\s@UpdateDomainConfigResponse' {} a -> s {domainConfig = a} :: UpdateDomainConfigResponse)
+
+instance Prelude.NFData UpdateDomainConfigResponse where
+  rnf UpdateDomainConfigResponse' {..} =
+    Prelude.rnf dryRunResults
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf domainConfig
diff --git a/gen/Amazonka/OpenSearch/UpdatePackage.hs b/gen/Amazonka/OpenSearch/UpdatePackage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/UpdatePackage.hs
@@ -0,0 +1,213 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.UpdatePackage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates a package for use with Amazon OpenSearch Service domains. For
+-- more information, see
+-- <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/custom-packages.html Custom packages for Amazon OpenSearch Service>.
+module Amazonka.OpenSearch.UpdatePackage
+  ( -- * Creating a Request
+    UpdatePackage (..),
+    newUpdatePackage,
+
+    -- * Request Lenses
+    updatePackage_commitMessage,
+    updatePackage_packageDescription,
+    updatePackage_packageID,
+    updatePackage_packageSource,
+
+    -- * Destructuring the Response
+    UpdatePackageResponse (..),
+    newUpdatePackageResponse,
+
+    -- * Response Lenses
+    updatePackageResponse_packageDetails,
+    updatePackageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for request parameters to the @UpdatePackage@ operation.
+--
+-- /See:/ 'newUpdatePackage' smart constructor.
+data UpdatePackage = UpdatePackage'
+  { -- | Commit message for the updated file, which is shown as part of
+    -- @GetPackageVersionHistoryResponse@.
+    commitMessage :: Prelude.Maybe Prelude.Text,
+    -- | A new description of the package.
+    packageDescription :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the package.
+    packageID :: Prelude.Text,
+    -- | Amazon S3 bucket and key for the package.
+    packageSource :: PackageSource
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdatePackage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'commitMessage', 'updatePackage_commitMessage' - Commit message for the updated file, which is shown as part of
+-- @GetPackageVersionHistoryResponse@.
+--
+-- 'packageDescription', 'updatePackage_packageDescription' - A new description of the package.
+--
+-- 'packageID', 'updatePackage_packageID' - The unique identifier for the package.
+--
+-- 'packageSource', 'updatePackage_packageSource' - Amazon S3 bucket and key for the package.
+newUpdatePackage ::
+  -- | 'packageID'
+  Prelude.Text ->
+  -- | 'packageSource'
+  PackageSource ->
+  UpdatePackage
+newUpdatePackage pPackageID_ pPackageSource_ =
+  UpdatePackage'
+    { commitMessage = Prelude.Nothing,
+      packageDescription = Prelude.Nothing,
+      packageID = pPackageID_,
+      packageSource = pPackageSource_
+    }
+
+-- | Commit message for the updated file, which is shown as part of
+-- @GetPackageVersionHistoryResponse@.
+updatePackage_commitMessage :: Lens.Lens' UpdatePackage (Prelude.Maybe Prelude.Text)
+updatePackage_commitMessage = Lens.lens (\UpdatePackage' {commitMessage} -> commitMessage) (\s@UpdatePackage' {} a -> s {commitMessage = a} :: UpdatePackage)
+
+-- | A new description of the package.
+updatePackage_packageDescription :: Lens.Lens' UpdatePackage (Prelude.Maybe Prelude.Text)
+updatePackage_packageDescription = Lens.lens (\UpdatePackage' {packageDescription} -> packageDescription) (\s@UpdatePackage' {} a -> s {packageDescription = a} :: UpdatePackage)
+
+-- | The unique identifier for the package.
+updatePackage_packageID :: Lens.Lens' UpdatePackage Prelude.Text
+updatePackage_packageID = Lens.lens (\UpdatePackage' {packageID} -> packageID) (\s@UpdatePackage' {} a -> s {packageID = a} :: UpdatePackage)
+
+-- | Amazon S3 bucket and key for the package.
+updatePackage_packageSource :: Lens.Lens' UpdatePackage PackageSource
+updatePackage_packageSource = Lens.lens (\UpdatePackage' {packageSource} -> packageSource) (\s@UpdatePackage' {} a -> s {packageSource = a} :: UpdatePackage)
+
+instance Core.AWSRequest UpdatePackage where
+  type
+    AWSResponse UpdatePackage =
+      UpdatePackageResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdatePackageResponse'
+            Prelude.<$> (x Data..?> "PackageDetails")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdatePackage where
+  hashWithSalt _salt UpdatePackage' {..} =
+    _salt
+      `Prelude.hashWithSalt` commitMessage
+      `Prelude.hashWithSalt` packageDescription
+      `Prelude.hashWithSalt` packageID
+      `Prelude.hashWithSalt` packageSource
+
+instance Prelude.NFData UpdatePackage where
+  rnf UpdatePackage' {..} =
+    Prelude.rnf commitMessage
+      `Prelude.seq` Prelude.rnf packageDescription
+      `Prelude.seq` Prelude.rnf packageID
+      `Prelude.seq` Prelude.rnf packageSource
+
+instance Data.ToHeaders UpdatePackage where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON UpdatePackage where
+  toJSON UpdatePackage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CommitMessage" Data..=) Prelude.<$> commitMessage,
+            ("PackageDescription" Data..=)
+              Prelude.<$> packageDescription,
+            Prelude.Just ("PackageID" Data..= packageID),
+            Prelude.Just
+              ("PackageSource" Data..= packageSource)
+          ]
+      )
+
+instance Data.ToPath UpdatePackage where
+  toPath = Prelude.const "/2021-01-01/packages/update"
+
+instance Data.ToQuery UpdatePackage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Container for the response returned by the @UpdatePackage@ operation.
+--
+-- /See:/ 'newUpdatePackageResponse' smart constructor.
+data UpdatePackageResponse = UpdatePackageResponse'
+  { -- | Information about a package.
+    packageDetails :: Prelude.Maybe PackageDetails,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdatePackageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'packageDetails', 'updatePackageResponse_packageDetails' - Information about a package.
+--
+-- 'httpStatus', 'updatePackageResponse_httpStatus' - The response's http status code.
+newUpdatePackageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdatePackageResponse
+newUpdatePackageResponse pHttpStatus_ =
+  UpdatePackageResponse'
+    { packageDetails =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about a package.
+updatePackageResponse_packageDetails :: Lens.Lens' UpdatePackageResponse (Prelude.Maybe PackageDetails)
+updatePackageResponse_packageDetails = Lens.lens (\UpdatePackageResponse' {packageDetails} -> packageDetails) (\s@UpdatePackageResponse' {} a -> s {packageDetails = a} :: UpdatePackageResponse)
+
+-- | The response's http status code.
+updatePackageResponse_httpStatus :: Lens.Lens' UpdatePackageResponse Prelude.Int
+updatePackageResponse_httpStatus = Lens.lens (\UpdatePackageResponse' {httpStatus} -> httpStatus) (\s@UpdatePackageResponse' {} a -> s {httpStatus = a} :: UpdatePackageResponse)
+
+instance Prelude.NFData UpdatePackageResponse where
+  rnf UpdatePackageResponse' {..} =
+    Prelude.rnf packageDetails
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/UpdateVpcEndpoint.hs b/gen/Amazonka/OpenSearch/UpdateVpcEndpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/UpdateVpcEndpoint.hs
@@ -0,0 +1,183 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.UpdateVpcEndpoint
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Modifies an Amazon OpenSearch Service-managed interface VPC endpoint.
+module Amazonka.OpenSearch.UpdateVpcEndpoint
+  ( -- * Creating a Request
+    UpdateVpcEndpoint (..),
+    newUpdateVpcEndpoint,
+
+    -- * Request Lenses
+    updateVpcEndpoint_vpcEndpointId,
+    updateVpcEndpoint_vpcOptions,
+
+    -- * Destructuring the Response
+    UpdateVpcEndpointResponse (..),
+    newUpdateVpcEndpointResponse,
+
+    -- * Response Lenses
+    updateVpcEndpointResponse_httpStatus,
+    updateVpcEndpointResponse_vpcEndpoint,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateVpcEndpoint' smart constructor.
+data UpdateVpcEndpoint = UpdateVpcEndpoint'
+  { -- | The unique identifier of the endpoint.
+    vpcEndpointId :: Prelude.Text,
+    -- | The security groups and\/or subnets to add, remove, or modify.
+    vpcOptions :: VPCOptions
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateVpcEndpoint' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'vpcEndpointId', 'updateVpcEndpoint_vpcEndpointId' - The unique identifier of the endpoint.
+--
+-- 'vpcOptions', 'updateVpcEndpoint_vpcOptions' - The security groups and\/or subnets to add, remove, or modify.
+newUpdateVpcEndpoint ::
+  -- | 'vpcEndpointId'
+  Prelude.Text ->
+  -- | 'vpcOptions'
+  VPCOptions ->
+  UpdateVpcEndpoint
+newUpdateVpcEndpoint pVpcEndpointId_ pVpcOptions_ =
+  UpdateVpcEndpoint'
+    { vpcEndpointId = pVpcEndpointId_,
+      vpcOptions = pVpcOptions_
+    }
+
+-- | The unique identifier of the endpoint.
+updateVpcEndpoint_vpcEndpointId :: Lens.Lens' UpdateVpcEndpoint Prelude.Text
+updateVpcEndpoint_vpcEndpointId = Lens.lens (\UpdateVpcEndpoint' {vpcEndpointId} -> vpcEndpointId) (\s@UpdateVpcEndpoint' {} a -> s {vpcEndpointId = a} :: UpdateVpcEndpoint)
+
+-- | The security groups and\/or subnets to add, remove, or modify.
+updateVpcEndpoint_vpcOptions :: Lens.Lens' UpdateVpcEndpoint VPCOptions
+updateVpcEndpoint_vpcOptions = Lens.lens (\UpdateVpcEndpoint' {vpcOptions} -> vpcOptions) (\s@UpdateVpcEndpoint' {} a -> s {vpcOptions = a} :: UpdateVpcEndpoint)
+
+instance Core.AWSRequest UpdateVpcEndpoint where
+  type
+    AWSResponse UpdateVpcEndpoint =
+      UpdateVpcEndpointResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateVpcEndpointResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "VpcEndpoint")
+      )
+
+instance Prelude.Hashable UpdateVpcEndpoint where
+  hashWithSalt _salt UpdateVpcEndpoint' {..} =
+    _salt
+      `Prelude.hashWithSalt` vpcEndpointId
+      `Prelude.hashWithSalt` vpcOptions
+
+instance Prelude.NFData UpdateVpcEndpoint where
+  rnf UpdateVpcEndpoint' {..} =
+    Prelude.rnf vpcEndpointId
+      `Prelude.seq` Prelude.rnf vpcOptions
+
+instance Data.ToHeaders UpdateVpcEndpoint where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON UpdateVpcEndpoint where
+  toJSON UpdateVpcEndpoint' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("VpcEndpointId" Data..= vpcEndpointId),
+            Prelude.Just ("VpcOptions" Data..= vpcOptions)
+          ]
+      )
+
+instance Data.ToPath UpdateVpcEndpoint where
+  toPath =
+    Prelude.const
+      "/2021-01-01/opensearch/vpcEndpoints/update"
+
+instance Data.ToQuery UpdateVpcEndpoint where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateVpcEndpointResponse' smart constructor.
+data UpdateVpcEndpointResponse = UpdateVpcEndpointResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The endpoint to be updated.
+    vpcEndpoint :: VpcEndpoint
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateVpcEndpointResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'updateVpcEndpointResponse_httpStatus' - The response's http status code.
+--
+-- 'vpcEndpoint', 'updateVpcEndpointResponse_vpcEndpoint' - The endpoint to be updated.
+newUpdateVpcEndpointResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'vpcEndpoint'
+  VpcEndpoint ->
+  UpdateVpcEndpointResponse
+newUpdateVpcEndpointResponse
+  pHttpStatus_
+  pVpcEndpoint_ =
+    UpdateVpcEndpointResponse'
+      { httpStatus =
+          pHttpStatus_,
+        vpcEndpoint = pVpcEndpoint_
+      }
+
+-- | The response's http status code.
+updateVpcEndpointResponse_httpStatus :: Lens.Lens' UpdateVpcEndpointResponse Prelude.Int
+updateVpcEndpointResponse_httpStatus = Lens.lens (\UpdateVpcEndpointResponse' {httpStatus} -> httpStatus) (\s@UpdateVpcEndpointResponse' {} a -> s {httpStatus = a} :: UpdateVpcEndpointResponse)
+
+-- | The endpoint to be updated.
+updateVpcEndpointResponse_vpcEndpoint :: Lens.Lens' UpdateVpcEndpointResponse VpcEndpoint
+updateVpcEndpointResponse_vpcEndpoint = Lens.lens (\UpdateVpcEndpointResponse' {vpcEndpoint} -> vpcEndpoint) (\s@UpdateVpcEndpointResponse' {} a -> s {vpcEndpoint = a} :: UpdateVpcEndpointResponse)
+
+instance Prelude.NFData UpdateVpcEndpointResponse where
+  rnf UpdateVpcEndpointResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf vpcEndpoint
diff --git a/gen/Amazonka/OpenSearch/UpgradeDomain.hs b/gen/Amazonka/OpenSearch/UpgradeDomain.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/UpgradeDomain.hs
@@ -0,0 +1,297 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.UpgradeDomain
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Allows you to either upgrade your Amazon OpenSearch Service domain or
+-- perform an upgrade eligibility check to a compatible version of
+-- OpenSearch or Elasticsearch.
+module Amazonka.OpenSearch.UpgradeDomain
+  ( -- * Creating a Request
+    UpgradeDomain (..),
+    newUpgradeDomain,
+
+    -- * Request Lenses
+    upgradeDomain_advancedOptions,
+    upgradeDomain_performCheckOnly,
+    upgradeDomain_domainName,
+    upgradeDomain_targetVersion,
+
+    -- * Destructuring the Response
+    UpgradeDomainResponse (..),
+    newUpgradeDomainResponse,
+
+    -- * Response Lenses
+    upgradeDomainResponse_advancedOptions,
+    upgradeDomainResponse_changeProgressDetails,
+    upgradeDomainResponse_domainName,
+    upgradeDomainResponse_performCheckOnly,
+    upgradeDomainResponse_targetVersion,
+    upgradeDomainResponse_upgradeId,
+    upgradeDomainResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Container for the request parameters to the @UpgradeDomain@ operation.
+--
+-- /See:/ 'newUpgradeDomain' smart constructor.
+data UpgradeDomain = UpgradeDomain'
+  { -- | Only supports the @override_main_response_version@ parameter and not
+    -- other advanced options. You can only include this option when upgrading
+    -- to an OpenSearch version. Specifies whether the domain reports its
+    -- version as 7.10 so that it continues to work with Elasticsearch OSS
+    -- clients and plugins.
+    advancedOptions :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | When true, indicates that an upgrade eligibility check needs to be
+    -- performed. Does not actually perform the upgrade.
+    performCheckOnly :: Prelude.Maybe Prelude.Bool,
+    -- | Name of the OpenSearch Service domain that you want to upgrade.
+    domainName :: Prelude.Text,
+    -- | OpenSearch or Elasticsearch version to which you want to upgrade, in the
+    -- format Opensearch_X.Y or Elasticsearch_X.Y.
+    targetVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpgradeDomain' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'advancedOptions', 'upgradeDomain_advancedOptions' - Only supports the @override_main_response_version@ parameter and not
+-- other advanced options. You can only include this option when upgrading
+-- to an OpenSearch version. Specifies whether the domain reports its
+-- version as 7.10 so that it continues to work with Elasticsearch OSS
+-- clients and plugins.
+--
+-- 'performCheckOnly', 'upgradeDomain_performCheckOnly' - When true, indicates that an upgrade eligibility check needs to be
+-- performed. Does not actually perform the upgrade.
+--
+-- 'domainName', 'upgradeDomain_domainName' - Name of the OpenSearch Service domain that you want to upgrade.
+--
+-- 'targetVersion', 'upgradeDomain_targetVersion' - OpenSearch or Elasticsearch version to which you want to upgrade, in the
+-- format Opensearch_X.Y or Elasticsearch_X.Y.
+newUpgradeDomain ::
+  -- | 'domainName'
+  Prelude.Text ->
+  -- | 'targetVersion'
+  Prelude.Text ->
+  UpgradeDomain
+newUpgradeDomain pDomainName_ pTargetVersion_ =
+  UpgradeDomain'
+    { advancedOptions = Prelude.Nothing,
+      performCheckOnly = Prelude.Nothing,
+      domainName = pDomainName_,
+      targetVersion = pTargetVersion_
+    }
+
+-- | Only supports the @override_main_response_version@ parameter and not
+-- other advanced options. You can only include this option when upgrading
+-- to an OpenSearch version. Specifies whether the domain reports its
+-- version as 7.10 so that it continues to work with Elasticsearch OSS
+-- clients and plugins.
+upgradeDomain_advancedOptions :: Lens.Lens' UpgradeDomain (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+upgradeDomain_advancedOptions = Lens.lens (\UpgradeDomain' {advancedOptions} -> advancedOptions) (\s@UpgradeDomain' {} a -> s {advancedOptions = a} :: UpgradeDomain) Prelude.. Lens.mapping Lens.coerced
+
+-- | When true, indicates that an upgrade eligibility check needs to be
+-- performed. Does not actually perform the upgrade.
+upgradeDomain_performCheckOnly :: Lens.Lens' UpgradeDomain (Prelude.Maybe Prelude.Bool)
+upgradeDomain_performCheckOnly = Lens.lens (\UpgradeDomain' {performCheckOnly} -> performCheckOnly) (\s@UpgradeDomain' {} a -> s {performCheckOnly = a} :: UpgradeDomain)
+
+-- | Name of the OpenSearch Service domain that you want to upgrade.
+upgradeDomain_domainName :: Lens.Lens' UpgradeDomain Prelude.Text
+upgradeDomain_domainName = Lens.lens (\UpgradeDomain' {domainName} -> domainName) (\s@UpgradeDomain' {} a -> s {domainName = a} :: UpgradeDomain)
+
+-- | OpenSearch or Elasticsearch version to which you want to upgrade, in the
+-- format Opensearch_X.Y or Elasticsearch_X.Y.
+upgradeDomain_targetVersion :: Lens.Lens' UpgradeDomain Prelude.Text
+upgradeDomain_targetVersion = Lens.lens (\UpgradeDomain' {targetVersion} -> targetVersion) (\s@UpgradeDomain' {} a -> s {targetVersion = a} :: UpgradeDomain)
+
+instance Core.AWSRequest UpgradeDomain where
+  type
+    AWSResponse UpgradeDomain =
+      UpgradeDomainResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpgradeDomainResponse'
+            Prelude.<$> ( x
+                            Data..?> "AdvancedOptions"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "ChangeProgressDetails")
+            Prelude.<*> (x Data..?> "DomainName")
+            Prelude.<*> (x Data..?> "PerformCheckOnly")
+            Prelude.<*> (x Data..?> "TargetVersion")
+            Prelude.<*> (x Data..?> "UpgradeId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpgradeDomain where
+  hashWithSalt _salt UpgradeDomain' {..} =
+    _salt
+      `Prelude.hashWithSalt` advancedOptions
+      `Prelude.hashWithSalt` performCheckOnly
+      `Prelude.hashWithSalt` domainName
+      `Prelude.hashWithSalt` targetVersion
+
+instance Prelude.NFData UpgradeDomain where
+  rnf UpgradeDomain' {..} =
+    Prelude.rnf advancedOptions
+      `Prelude.seq` Prelude.rnf performCheckOnly
+      `Prelude.seq` Prelude.rnf domainName
+      `Prelude.seq` Prelude.rnf targetVersion
+
+instance Data.ToHeaders UpgradeDomain where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON UpgradeDomain where
+  toJSON UpgradeDomain' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AdvancedOptions" Data..=)
+              Prelude.<$> advancedOptions,
+            ("PerformCheckOnly" Data..=)
+              Prelude.<$> performCheckOnly,
+            Prelude.Just ("DomainName" Data..= domainName),
+            Prelude.Just
+              ("TargetVersion" Data..= targetVersion)
+          ]
+      )
+
+instance Data.ToPath UpgradeDomain where
+  toPath =
+    Prelude.const
+      "/2021-01-01/opensearch/upgradeDomain"
+
+instance Data.ToQuery UpgradeDomain where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | Container for the response returned by @UpgradeDomain@ operation.
+--
+-- /See:/ 'newUpgradeDomainResponse' smart constructor.
+data UpgradeDomainResponse = UpgradeDomainResponse'
+  { -- | The advanced options configuration for the domain.
+    advancedOptions :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Container for information about a configuration change happening on a
+    -- domain.
+    changeProgressDetails :: Prelude.Maybe ChangeProgressDetails,
+    -- | The name of the domain that was upgraded.
+    domainName :: Prelude.Maybe Prelude.Text,
+    -- | When true, indicates that an upgrade eligibility check was performed.
+    performCheckOnly :: Prelude.Maybe Prelude.Bool,
+    -- | OpenSearch or Elasticsearch version that the domain was upgraded to.
+    targetVersion :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the domain upgrade.
+    upgradeId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpgradeDomainResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'advancedOptions', 'upgradeDomainResponse_advancedOptions' - The advanced options configuration for the domain.
+--
+-- 'changeProgressDetails', 'upgradeDomainResponse_changeProgressDetails' - Container for information about a configuration change happening on a
+-- domain.
+--
+-- 'domainName', 'upgradeDomainResponse_domainName' - The name of the domain that was upgraded.
+--
+-- 'performCheckOnly', 'upgradeDomainResponse_performCheckOnly' - When true, indicates that an upgrade eligibility check was performed.
+--
+-- 'targetVersion', 'upgradeDomainResponse_targetVersion' - OpenSearch or Elasticsearch version that the domain was upgraded to.
+--
+-- 'upgradeId', 'upgradeDomainResponse_upgradeId' - The unique identifier of the domain upgrade.
+--
+-- 'httpStatus', 'upgradeDomainResponse_httpStatus' - The response's http status code.
+newUpgradeDomainResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpgradeDomainResponse
+newUpgradeDomainResponse pHttpStatus_ =
+  UpgradeDomainResponse'
+    { advancedOptions =
+        Prelude.Nothing,
+      changeProgressDetails = Prelude.Nothing,
+      domainName = Prelude.Nothing,
+      performCheckOnly = Prelude.Nothing,
+      targetVersion = Prelude.Nothing,
+      upgradeId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The advanced options configuration for the domain.
+upgradeDomainResponse_advancedOptions :: Lens.Lens' UpgradeDomainResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+upgradeDomainResponse_advancedOptions = Lens.lens (\UpgradeDomainResponse' {advancedOptions} -> advancedOptions) (\s@UpgradeDomainResponse' {} a -> s {advancedOptions = a} :: UpgradeDomainResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Container for information about a configuration change happening on a
+-- domain.
+upgradeDomainResponse_changeProgressDetails :: Lens.Lens' UpgradeDomainResponse (Prelude.Maybe ChangeProgressDetails)
+upgradeDomainResponse_changeProgressDetails = Lens.lens (\UpgradeDomainResponse' {changeProgressDetails} -> changeProgressDetails) (\s@UpgradeDomainResponse' {} a -> s {changeProgressDetails = a} :: UpgradeDomainResponse)
+
+-- | The name of the domain that was upgraded.
+upgradeDomainResponse_domainName :: Lens.Lens' UpgradeDomainResponse (Prelude.Maybe Prelude.Text)
+upgradeDomainResponse_domainName = Lens.lens (\UpgradeDomainResponse' {domainName} -> domainName) (\s@UpgradeDomainResponse' {} a -> s {domainName = a} :: UpgradeDomainResponse)
+
+-- | When true, indicates that an upgrade eligibility check was performed.
+upgradeDomainResponse_performCheckOnly :: Lens.Lens' UpgradeDomainResponse (Prelude.Maybe Prelude.Bool)
+upgradeDomainResponse_performCheckOnly = Lens.lens (\UpgradeDomainResponse' {performCheckOnly} -> performCheckOnly) (\s@UpgradeDomainResponse' {} a -> s {performCheckOnly = a} :: UpgradeDomainResponse)
+
+-- | OpenSearch or Elasticsearch version that the domain was upgraded to.
+upgradeDomainResponse_targetVersion :: Lens.Lens' UpgradeDomainResponse (Prelude.Maybe Prelude.Text)
+upgradeDomainResponse_targetVersion = Lens.lens (\UpgradeDomainResponse' {targetVersion} -> targetVersion) (\s@UpgradeDomainResponse' {} a -> s {targetVersion = a} :: UpgradeDomainResponse)
+
+-- | The unique identifier of the domain upgrade.
+upgradeDomainResponse_upgradeId :: Lens.Lens' UpgradeDomainResponse (Prelude.Maybe Prelude.Text)
+upgradeDomainResponse_upgradeId = Lens.lens (\UpgradeDomainResponse' {upgradeId} -> upgradeId) (\s@UpgradeDomainResponse' {} a -> s {upgradeId = a} :: UpgradeDomainResponse)
+
+-- | The response's http status code.
+upgradeDomainResponse_httpStatus :: Lens.Lens' UpgradeDomainResponse Prelude.Int
+upgradeDomainResponse_httpStatus = Lens.lens (\UpgradeDomainResponse' {httpStatus} -> httpStatus) (\s@UpgradeDomainResponse' {} a -> s {httpStatus = a} :: UpgradeDomainResponse)
+
+instance Prelude.NFData UpgradeDomainResponse where
+  rnf UpgradeDomainResponse' {..} =
+    Prelude.rnf advancedOptions
+      `Prelude.seq` Prelude.rnf changeProgressDetails
+      `Prelude.seq` Prelude.rnf domainName
+      `Prelude.seq` Prelude.rnf performCheckOnly
+      `Prelude.seq` Prelude.rnf targetVersion
+      `Prelude.seq` Prelude.rnf upgradeId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/OpenSearch/Waiters.hs b/gen/Amazonka/OpenSearch/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/OpenSearch/Waiters.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.OpenSearch.Waiters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.OpenSearch.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.OpenSearch.Lens
+import Amazonka.OpenSearch.Types
+import qualified Amazonka.Prelude as Prelude
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Main (main) where
+
+import Test.Amazonka.OpenSearch
+import Test.Amazonka.OpenSearch.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "OpenSearch"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/OpenSearch.hs b/test/Test/Amazonka/Gen/OpenSearch.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/OpenSearch.hs
@@ -0,0 +1,1018 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Test.Amazonka.Gen.OpenSearch
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.Gen.OpenSearch where
+
+import Amazonka.OpenSearch
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.OpenSearch.Internal
+import Test.Amazonka.Prelude
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestAcceptInboundConnection $
+--             newAcceptInboundConnection
+--
+--         , requestAddTags $
+--             newAddTags
+--
+--         , requestAssociatePackage $
+--             newAssociatePackage
+--
+--         , requestAuthorizeVpcEndpointAccess $
+--             newAuthorizeVpcEndpointAccess
+--
+--         , requestCancelServiceSoftwareUpdate $
+--             newCancelServiceSoftwareUpdate
+--
+--         , requestCreateDomain $
+--             newCreateDomain
+--
+--         , requestCreateOutboundConnection $
+--             newCreateOutboundConnection
+--
+--         , requestCreatePackage $
+--             newCreatePackage
+--
+--         , requestCreateVpcEndpoint $
+--             newCreateVpcEndpoint
+--
+--         , requestDeleteDomain $
+--             newDeleteDomain
+--
+--         , requestDeleteInboundConnection $
+--             newDeleteInboundConnection
+--
+--         , requestDeleteOutboundConnection $
+--             newDeleteOutboundConnection
+--
+--         , requestDeletePackage $
+--             newDeletePackage
+--
+--         , requestDeleteVpcEndpoint $
+--             newDeleteVpcEndpoint
+--
+--         , requestDescribeDomain $
+--             newDescribeDomain
+--
+--         , requestDescribeDomainAutoTunes $
+--             newDescribeDomainAutoTunes
+--
+--         , requestDescribeDomainChangeProgress $
+--             newDescribeDomainChangeProgress
+--
+--         , requestDescribeDomainConfig $
+--             newDescribeDomainConfig
+--
+--         , requestDescribeDomains $
+--             newDescribeDomains
+--
+--         , requestDescribeInboundConnections $
+--             newDescribeInboundConnections
+--
+--         , requestDescribeInstanceTypeLimits $
+--             newDescribeInstanceTypeLimits
+--
+--         , requestDescribeOutboundConnections $
+--             newDescribeOutboundConnections
+--
+--         , requestDescribePackages $
+--             newDescribePackages
+--
+--         , requestDescribeReservedInstanceOfferings $
+--             newDescribeReservedInstanceOfferings
+--
+--         , requestDescribeReservedInstances $
+--             newDescribeReservedInstances
+--
+--         , requestDescribeVpcEndpoints $
+--             newDescribeVpcEndpoints
+--
+--         , requestDissociatePackage $
+--             newDissociatePackage
+--
+--         , requestGetCompatibleVersions $
+--             newGetCompatibleVersions
+--
+--         , requestGetPackageVersionHistory $
+--             newGetPackageVersionHistory
+--
+--         , requestGetUpgradeHistory $
+--             newGetUpgradeHistory
+--
+--         , requestGetUpgradeStatus $
+--             newGetUpgradeStatus
+--
+--         , requestListDomainNames $
+--             newListDomainNames
+--
+--         , requestListDomainsForPackage $
+--             newListDomainsForPackage
+--
+--         , requestListInstanceTypeDetails $
+--             newListInstanceTypeDetails
+--
+--         , requestListPackagesForDomain $
+--             newListPackagesForDomain
+--
+--         , requestListTags $
+--             newListTags
+--
+--         , requestListVersions $
+--             newListVersions
+--
+--         , requestListVpcEndpointAccess $
+--             newListVpcEndpointAccess
+--
+--         , requestListVpcEndpoints $
+--             newListVpcEndpoints
+--
+--         , requestListVpcEndpointsForDomain $
+--             newListVpcEndpointsForDomain
+--
+--         , requestPurchaseReservedInstanceOffering $
+--             newPurchaseReservedInstanceOffering
+--
+--         , requestRejectInboundConnection $
+--             newRejectInboundConnection
+--
+--         , requestRemoveTags $
+--             newRemoveTags
+--
+--         , requestRevokeVpcEndpointAccess $
+--             newRevokeVpcEndpointAccess
+--
+--         , requestStartServiceSoftwareUpdate $
+--             newStartServiceSoftwareUpdate
+--
+--         , requestUpdateDomainConfig $
+--             newUpdateDomainConfig
+--
+--         , requestUpdatePackage $
+--             newUpdatePackage
+--
+--         , requestUpdateVpcEndpoint $
+--             newUpdateVpcEndpoint
+--
+--         , requestUpgradeDomain $
+--             newUpgradeDomain
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseAcceptInboundConnection $
+--             newAcceptInboundConnectionResponse
+--
+--         , responseAddTags $
+--             newAddTagsResponse
+--
+--         , responseAssociatePackage $
+--             newAssociatePackageResponse
+--
+--         , responseAuthorizeVpcEndpointAccess $
+--             newAuthorizeVpcEndpointAccessResponse
+--
+--         , responseCancelServiceSoftwareUpdate $
+--             newCancelServiceSoftwareUpdateResponse
+--
+--         , responseCreateDomain $
+--             newCreateDomainResponse
+--
+--         , responseCreateOutboundConnection $
+--             newCreateOutboundConnectionResponse
+--
+--         , responseCreatePackage $
+--             newCreatePackageResponse
+--
+--         , responseCreateVpcEndpoint $
+--             newCreateVpcEndpointResponse
+--
+--         , responseDeleteDomain $
+--             newDeleteDomainResponse
+--
+--         , responseDeleteInboundConnection $
+--             newDeleteInboundConnectionResponse
+--
+--         , responseDeleteOutboundConnection $
+--             newDeleteOutboundConnectionResponse
+--
+--         , responseDeletePackage $
+--             newDeletePackageResponse
+--
+--         , responseDeleteVpcEndpoint $
+--             newDeleteVpcEndpointResponse
+--
+--         , responseDescribeDomain $
+--             newDescribeDomainResponse
+--
+--         , responseDescribeDomainAutoTunes $
+--             newDescribeDomainAutoTunesResponse
+--
+--         , responseDescribeDomainChangeProgress $
+--             newDescribeDomainChangeProgressResponse
+--
+--         , responseDescribeDomainConfig $
+--             newDescribeDomainConfigResponse
+--
+--         , responseDescribeDomains $
+--             newDescribeDomainsResponse
+--
+--         , responseDescribeInboundConnections $
+--             newDescribeInboundConnectionsResponse
+--
+--         , responseDescribeInstanceTypeLimits $
+--             newDescribeInstanceTypeLimitsResponse
+--
+--         , responseDescribeOutboundConnections $
+--             newDescribeOutboundConnectionsResponse
+--
+--         , responseDescribePackages $
+--             newDescribePackagesResponse
+--
+--         , responseDescribeReservedInstanceOfferings $
+--             newDescribeReservedInstanceOfferingsResponse
+--
+--         , responseDescribeReservedInstances $
+--             newDescribeReservedInstancesResponse
+--
+--         , responseDescribeVpcEndpoints $
+--             newDescribeVpcEndpointsResponse
+--
+--         , responseDissociatePackage $
+--             newDissociatePackageResponse
+--
+--         , responseGetCompatibleVersions $
+--             newGetCompatibleVersionsResponse
+--
+--         , responseGetPackageVersionHistory $
+--             newGetPackageVersionHistoryResponse
+--
+--         , responseGetUpgradeHistory $
+--             newGetUpgradeHistoryResponse
+--
+--         , responseGetUpgradeStatus $
+--             newGetUpgradeStatusResponse
+--
+--         , responseListDomainNames $
+--             newListDomainNamesResponse
+--
+--         , responseListDomainsForPackage $
+--             newListDomainsForPackageResponse
+--
+--         , responseListInstanceTypeDetails $
+--             newListInstanceTypeDetailsResponse
+--
+--         , responseListPackagesForDomain $
+--             newListPackagesForDomainResponse
+--
+--         , responseListTags $
+--             newListTagsResponse
+--
+--         , responseListVersions $
+--             newListVersionsResponse
+--
+--         , responseListVpcEndpointAccess $
+--             newListVpcEndpointAccessResponse
+--
+--         , responseListVpcEndpoints $
+--             newListVpcEndpointsResponse
+--
+--         , responseListVpcEndpointsForDomain $
+--             newListVpcEndpointsForDomainResponse
+--
+--         , responsePurchaseReservedInstanceOffering $
+--             newPurchaseReservedInstanceOfferingResponse
+--
+--         , responseRejectInboundConnection $
+--             newRejectInboundConnectionResponse
+--
+--         , responseRemoveTags $
+--             newRemoveTagsResponse
+--
+--         , responseRevokeVpcEndpointAccess $
+--             newRevokeVpcEndpointAccessResponse
+--
+--         , responseStartServiceSoftwareUpdate $
+--             newStartServiceSoftwareUpdateResponse
+--
+--         , responseUpdateDomainConfig $
+--             newUpdateDomainConfigResponse
+--
+--         , responseUpdatePackage $
+--             newUpdatePackageResponse
+--
+--         , responseUpdateVpcEndpoint $
+--             newUpdateVpcEndpointResponse
+--
+--         , responseUpgradeDomain $
+--             newUpgradeDomainResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestAcceptInboundConnection :: AcceptInboundConnection -> TestTree
+requestAcceptInboundConnection =
+  req
+    "AcceptInboundConnection"
+    "fixture/AcceptInboundConnection.yaml"
+
+requestAddTags :: AddTags -> TestTree
+requestAddTags =
+  req
+    "AddTags"
+    "fixture/AddTags.yaml"
+
+requestAssociatePackage :: AssociatePackage -> TestTree
+requestAssociatePackage =
+  req
+    "AssociatePackage"
+    "fixture/AssociatePackage.yaml"
+
+requestAuthorizeVpcEndpointAccess :: AuthorizeVpcEndpointAccess -> TestTree
+requestAuthorizeVpcEndpointAccess =
+  req
+    "AuthorizeVpcEndpointAccess"
+    "fixture/AuthorizeVpcEndpointAccess.yaml"
+
+requestCancelServiceSoftwareUpdate :: CancelServiceSoftwareUpdate -> TestTree
+requestCancelServiceSoftwareUpdate =
+  req
+    "CancelServiceSoftwareUpdate"
+    "fixture/CancelServiceSoftwareUpdate.yaml"
+
+requestCreateDomain :: CreateDomain -> TestTree
+requestCreateDomain =
+  req
+    "CreateDomain"
+    "fixture/CreateDomain.yaml"
+
+requestCreateOutboundConnection :: CreateOutboundConnection -> TestTree
+requestCreateOutboundConnection =
+  req
+    "CreateOutboundConnection"
+    "fixture/CreateOutboundConnection.yaml"
+
+requestCreatePackage :: CreatePackage -> TestTree
+requestCreatePackage =
+  req
+    "CreatePackage"
+    "fixture/CreatePackage.yaml"
+
+requestCreateVpcEndpoint :: CreateVpcEndpoint -> TestTree
+requestCreateVpcEndpoint =
+  req
+    "CreateVpcEndpoint"
+    "fixture/CreateVpcEndpoint.yaml"
+
+requestDeleteDomain :: DeleteDomain -> TestTree
+requestDeleteDomain =
+  req
+    "DeleteDomain"
+    "fixture/DeleteDomain.yaml"
+
+requestDeleteInboundConnection :: DeleteInboundConnection -> TestTree
+requestDeleteInboundConnection =
+  req
+    "DeleteInboundConnection"
+    "fixture/DeleteInboundConnection.yaml"
+
+requestDeleteOutboundConnection :: DeleteOutboundConnection -> TestTree
+requestDeleteOutboundConnection =
+  req
+    "DeleteOutboundConnection"
+    "fixture/DeleteOutboundConnection.yaml"
+
+requestDeletePackage :: DeletePackage -> TestTree
+requestDeletePackage =
+  req
+    "DeletePackage"
+    "fixture/DeletePackage.yaml"
+
+requestDeleteVpcEndpoint :: DeleteVpcEndpoint -> TestTree
+requestDeleteVpcEndpoint =
+  req
+    "DeleteVpcEndpoint"
+    "fixture/DeleteVpcEndpoint.yaml"
+
+requestDescribeDomain :: DescribeDomain -> TestTree
+requestDescribeDomain =
+  req
+    "DescribeDomain"
+    "fixture/DescribeDomain.yaml"
+
+requestDescribeDomainAutoTunes :: DescribeDomainAutoTunes -> TestTree
+requestDescribeDomainAutoTunes =
+  req
+    "DescribeDomainAutoTunes"
+    "fixture/DescribeDomainAutoTunes.yaml"
+
+requestDescribeDomainChangeProgress :: DescribeDomainChangeProgress -> TestTree
+requestDescribeDomainChangeProgress =
+  req
+    "DescribeDomainChangeProgress"
+    "fixture/DescribeDomainChangeProgress.yaml"
+
+requestDescribeDomainConfig :: DescribeDomainConfig -> TestTree
+requestDescribeDomainConfig =
+  req
+    "DescribeDomainConfig"
+    "fixture/DescribeDomainConfig.yaml"
+
+requestDescribeDomains :: DescribeDomains -> TestTree
+requestDescribeDomains =
+  req
+    "DescribeDomains"
+    "fixture/DescribeDomains.yaml"
+
+requestDescribeInboundConnections :: DescribeInboundConnections -> TestTree
+requestDescribeInboundConnections =
+  req
+    "DescribeInboundConnections"
+    "fixture/DescribeInboundConnections.yaml"
+
+requestDescribeInstanceTypeLimits :: DescribeInstanceTypeLimits -> TestTree
+requestDescribeInstanceTypeLimits =
+  req
+    "DescribeInstanceTypeLimits"
+    "fixture/DescribeInstanceTypeLimits.yaml"
+
+requestDescribeOutboundConnections :: DescribeOutboundConnections -> TestTree
+requestDescribeOutboundConnections =
+  req
+    "DescribeOutboundConnections"
+    "fixture/DescribeOutboundConnections.yaml"
+
+requestDescribePackages :: DescribePackages -> TestTree
+requestDescribePackages =
+  req
+    "DescribePackages"
+    "fixture/DescribePackages.yaml"
+
+requestDescribeReservedInstanceOfferings :: DescribeReservedInstanceOfferings -> TestTree
+requestDescribeReservedInstanceOfferings =
+  req
+    "DescribeReservedInstanceOfferings"
+    "fixture/DescribeReservedInstanceOfferings.yaml"
+
+requestDescribeReservedInstances :: DescribeReservedInstances -> TestTree
+requestDescribeReservedInstances =
+  req
+    "DescribeReservedInstances"
+    "fixture/DescribeReservedInstances.yaml"
+
+requestDescribeVpcEndpoints :: DescribeVpcEndpoints -> TestTree
+requestDescribeVpcEndpoints =
+  req
+    "DescribeVpcEndpoints"
+    "fixture/DescribeVpcEndpoints.yaml"
+
+requestDissociatePackage :: DissociatePackage -> TestTree
+requestDissociatePackage =
+  req
+    "DissociatePackage"
+    "fixture/DissociatePackage.yaml"
+
+requestGetCompatibleVersions :: GetCompatibleVersions -> TestTree
+requestGetCompatibleVersions =
+  req
+    "GetCompatibleVersions"
+    "fixture/GetCompatibleVersions.yaml"
+
+requestGetPackageVersionHistory :: GetPackageVersionHistory -> TestTree
+requestGetPackageVersionHistory =
+  req
+    "GetPackageVersionHistory"
+    "fixture/GetPackageVersionHistory.yaml"
+
+requestGetUpgradeHistory :: GetUpgradeHistory -> TestTree
+requestGetUpgradeHistory =
+  req
+    "GetUpgradeHistory"
+    "fixture/GetUpgradeHistory.yaml"
+
+requestGetUpgradeStatus :: GetUpgradeStatus -> TestTree
+requestGetUpgradeStatus =
+  req
+    "GetUpgradeStatus"
+    "fixture/GetUpgradeStatus.yaml"
+
+requestListDomainNames :: ListDomainNames -> TestTree
+requestListDomainNames =
+  req
+    "ListDomainNames"
+    "fixture/ListDomainNames.yaml"
+
+requestListDomainsForPackage :: ListDomainsForPackage -> TestTree
+requestListDomainsForPackage =
+  req
+    "ListDomainsForPackage"
+    "fixture/ListDomainsForPackage.yaml"
+
+requestListInstanceTypeDetails :: ListInstanceTypeDetails -> TestTree
+requestListInstanceTypeDetails =
+  req
+    "ListInstanceTypeDetails"
+    "fixture/ListInstanceTypeDetails.yaml"
+
+requestListPackagesForDomain :: ListPackagesForDomain -> TestTree
+requestListPackagesForDomain =
+  req
+    "ListPackagesForDomain"
+    "fixture/ListPackagesForDomain.yaml"
+
+requestListTags :: ListTags -> TestTree
+requestListTags =
+  req
+    "ListTags"
+    "fixture/ListTags.yaml"
+
+requestListVersions :: ListVersions -> TestTree
+requestListVersions =
+  req
+    "ListVersions"
+    "fixture/ListVersions.yaml"
+
+requestListVpcEndpointAccess :: ListVpcEndpointAccess -> TestTree
+requestListVpcEndpointAccess =
+  req
+    "ListVpcEndpointAccess"
+    "fixture/ListVpcEndpointAccess.yaml"
+
+requestListVpcEndpoints :: ListVpcEndpoints -> TestTree
+requestListVpcEndpoints =
+  req
+    "ListVpcEndpoints"
+    "fixture/ListVpcEndpoints.yaml"
+
+requestListVpcEndpointsForDomain :: ListVpcEndpointsForDomain -> TestTree
+requestListVpcEndpointsForDomain =
+  req
+    "ListVpcEndpointsForDomain"
+    "fixture/ListVpcEndpointsForDomain.yaml"
+
+requestPurchaseReservedInstanceOffering :: PurchaseReservedInstanceOffering -> TestTree
+requestPurchaseReservedInstanceOffering =
+  req
+    "PurchaseReservedInstanceOffering"
+    "fixture/PurchaseReservedInstanceOffering.yaml"
+
+requestRejectInboundConnection :: RejectInboundConnection -> TestTree
+requestRejectInboundConnection =
+  req
+    "RejectInboundConnection"
+    "fixture/RejectInboundConnection.yaml"
+
+requestRemoveTags :: RemoveTags -> TestTree
+requestRemoveTags =
+  req
+    "RemoveTags"
+    "fixture/RemoveTags.yaml"
+
+requestRevokeVpcEndpointAccess :: RevokeVpcEndpointAccess -> TestTree
+requestRevokeVpcEndpointAccess =
+  req
+    "RevokeVpcEndpointAccess"
+    "fixture/RevokeVpcEndpointAccess.yaml"
+
+requestStartServiceSoftwareUpdate :: StartServiceSoftwareUpdate -> TestTree
+requestStartServiceSoftwareUpdate =
+  req
+    "StartServiceSoftwareUpdate"
+    "fixture/StartServiceSoftwareUpdate.yaml"
+
+requestUpdateDomainConfig :: UpdateDomainConfig -> TestTree
+requestUpdateDomainConfig =
+  req
+    "UpdateDomainConfig"
+    "fixture/UpdateDomainConfig.yaml"
+
+requestUpdatePackage :: UpdatePackage -> TestTree
+requestUpdatePackage =
+  req
+    "UpdatePackage"
+    "fixture/UpdatePackage.yaml"
+
+requestUpdateVpcEndpoint :: UpdateVpcEndpoint -> TestTree
+requestUpdateVpcEndpoint =
+  req
+    "UpdateVpcEndpoint"
+    "fixture/UpdateVpcEndpoint.yaml"
+
+requestUpgradeDomain :: UpgradeDomain -> TestTree
+requestUpgradeDomain =
+  req
+    "UpgradeDomain"
+    "fixture/UpgradeDomain.yaml"
+
+-- Responses
+
+responseAcceptInboundConnection :: AcceptInboundConnectionResponse -> TestTree
+responseAcceptInboundConnection =
+  res
+    "AcceptInboundConnectionResponse"
+    "fixture/AcceptInboundConnectionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AcceptInboundConnection)
+
+responseAddTags :: AddTagsResponse -> TestTree
+responseAddTags =
+  res
+    "AddTagsResponse"
+    "fixture/AddTagsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AddTags)
+
+responseAssociatePackage :: AssociatePackageResponse -> TestTree
+responseAssociatePackage =
+  res
+    "AssociatePackageResponse"
+    "fixture/AssociatePackageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AssociatePackage)
+
+responseAuthorizeVpcEndpointAccess :: AuthorizeVpcEndpointAccessResponse -> TestTree
+responseAuthorizeVpcEndpointAccess =
+  res
+    "AuthorizeVpcEndpointAccessResponse"
+    "fixture/AuthorizeVpcEndpointAccessResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AuthorizeVpcEndpointAccess)
+
+responseCancelServiceSoftwareUpdate :: CancelServiceSoftwareUpdateResponse -> TestTree
+responseCancelServiceSoftwareUpdate =
+  res
+    "CancelServiceSoftwareUpdateResponse"
+    "fixture/CancelServiceSoftwareUpdateResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CancelServiceSoftwareUpdate)
+
+responseCreateDomain :: CreateDomainResponse -> TestTree
+responseCreateDomain =
+  res
+    "CreateDomainResponse"
+    "fixture/CreateDomainResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateDomain)
+
+responseCreateOutboundConnection :: CreateOutboundConnectionResponse -> TestTree
+responseCreateOutboundConnection =
+  res
+    "CreateOutboundConnectionResponse"
+    "fixture/CreateOutboundConnectionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateOutboundConnection)
+
+responseCreatePackage :: CreatePackageResponse -> TestTree
+responseCreatePackage =
+  res
+    "CreatePackageResponse"
+    "fixture/CreatePackageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreatePackage)
+
+responseCreateVpcEndpoint :: CreateVpcEndpointResponse -> TestTree
+responseCreateVpcEndpoint =
+  res
+    "CreateVpcEndpointResponse"
+    "fixture/CreateVpcEndpointResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateVpcEndpoint)
+
+responseDeleteDomain :: DeleteDomainResponse -> TestTree
+responseDeleteDomain =
+  res
+    "DeleteDomainResponse"
+    "fixture/DeleteDomainResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteDomain)
+
+responseDeleteInboundConnection :: DeleteInboundConnectionResponse -> TestTree
+responseDeleteInboundConnection =
+  res
+    "DeleteInboundConnectionResponse"
+    "fixture/DeleteInboundConnectionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteInboundConnection)
+
+responseDeleteOutboundConnection :: DeleteOutboundConnectionResponse -> TestTree
+responseDeleteOutboundConnection =
+  res
+    "DeleteOutboundConnectionResponse"
+    "fixture/DeleteOutboundConnectionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteOutboundConnection)
+
+responseDeletePackage :: DeletePackageResponse -> TestTree
+responseDeletePackage =
+  res
+    "DeletePackageResponse"
+    "fixture/DeletePackageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeletePackage)
+
+responseDeleteVpcEndpoint :: DeleteVpcEndpointResponse -> TestTree
+responseDeleteVpcEndpoint =
+  res
+    "DeleteVpcEndpointResponse"
+    "fixture/DeleteVpcEndpointResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteVpcEndpoint)
+
+responseDescribeDomain :: DescribeDomainResponse -> TestTree
+responseDescribeDomain =
+  res
+    "DescribeDomainResponse"
+    "fixture/DescribeDomainResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDomain)
+
+responseDescribeDomainAutoTunes :: DescribeDomainAutoTunesResponse -> TestTree
+responseDescribeDomainAutoTunes =
+  res
+    "DescribeDomainAutoTunesResponse"
+    "fixture/DescribeDomainAutoTunesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDomainAutoTunes)
+
+responseDescribeDomainChangeProgress :: DescribeDomainChangeProgressResponse -> TestTree
+responseDescribeDomainChangeProgress =
+  res
+    "DescribeDomainChangeProgressResponse"
+    "fixture/DescribeDomainChangeProgressResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDomainChangeProgress)
+
+responseDescribeDomainConfig :: DescribeDomainConfigResponse -> TestTree
+responseDescribeDomainConfig =
+  res
+    "DescribeDomainConfigResponse"
+    "fixture/DescribeDomainConfigResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDomainConfig)
+
+responseDescribeDomains :: DescribeDomainsResponse -> TestTree
+responseDescribeDomains =
+  res
+    "DescribeDomainsResponse"
+    "fixture/DescribeDomainsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDomains)
+
+responseDescribeInboundConnections :: DescribeInboundConnectionsResponse -> TestTree
+responseDescribeInboundConnections =
+  res
+    "DescribeInboundConnectionsResponse"
+    "fixture/DescribeInboundConnectionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeInboundConnections)
+
+responseDescribeInstanceTypeLimits :: DescribeInstanceTypeLimitsResponse -> TestTree
+responseDescribeInstanceTypeLimits =
+  res
+    "DescribeInstanceTypeLimitsResponse"
+    "fixture/DescribeInstanceTypeLimitsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeInstanceTypeLimits)
+
+responseDescribeOutboundConnections :: DescribeOutboundConnectionsResponse -> TestTree
+responseDescribeOutboundConnections =
+  res
+    "DescribeOutboundConnectionsResponse"
+    "fixture/DescribeOutboundConnectionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeOutboundConnections)
+
+responseDescribePackages :: DescribePackagesResponse -> TestTree
+responseDescribePackages =
+  res
+    "DescribePackagesResponse"
+    "fixture/DescribePackagesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribePackages)
+
+responseDescribeReservedInstanceOfferings :: DescribeReservedInstanceOfferingsResponse -> TestTree
+responseDescribeReservedInstanceOfferings =
+  res
+    "DescribeReservedInstanceOfferingsResponse"
+    "fixture/DescribeReservedInstanceOfferingsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeReservedInstanceOfferings)
+
+responseDescribeReservedInstances :: DescribeReservedInstancesResponse -> TestTree
+responseDescribeReservedInstances =
+  res
+    "DescribeReservedInstancesResponse"
+    "fixture/DescribeReservedInstancesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeReservedInstances)
+
+responseDescribeVpcEndpoints :: DescribeVpcEndpointsResponse -> TestTree
+responseDescribeVpcEndpoints =
+  res
+    "DescribeVpcEndpointsResponse"
+    "fixture/DescribeVpcEndpointsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeVpcEndpoints)
+
+responseDissociatePackage :: DissociatePackageResponse -> TestTree
+responseDissociatePackage =
+  res
+    "DissociatePackageResponse"
+    "fixture/DissociatePackageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DissociatePackage)
+
+responseGetCompatibleVersions :: GetCompatibleVersionsResponse -> TestTree
+responseGetCompatibleVersions =
+  res
+    "GetCompatibleVersionsResponse"
+    "fixture/GetCompatibleVersionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetCompatibleVersions)
+
+responseGetPackageVersionHistory :: GetPackageVersionHistoryResponse -> TestTree
+responseGetPackageVersionHistory =
+  res
+    "GetPackageVersionHistoryResponse"
+    "fixture/GetPackageVersionHistoryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetPackageVersionHistory)
+
+responseGetUpgradeHistory :: GetUpgradeHistoryResponse -> TestTree
+responseGetUpgradeHistory =
+  res
+    "GetUpgradeHistoryResponse"
+    "fixture/GetUpgradeHistoryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetUpgradeHistory)
+
+responseGetUpgradeStatus :: GetUpgradeStatusResponse -> TestTree
+responseGetUpgradeStatus =
+  res
+    "GetUpgradeStatusResponse"
+    "fixture/GetUpgradeStatusResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetUpgradeStatus)
+
+responseListDomainNames :: ListDomainNamesResponse -> TestTree
+responseListDomainNames =
+  res
+    "ListDomainNamesResponse"
+    "fixture/ListDomainNamesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDomainNames)
+
+responseListDomainsForPackage :: ListDomainsForPackageResponse -> TestTree
+responseListDomainsForPackage =
+  res
+    "ListDomainsForPackageResponse"
+    "fixture/ListDomainsForPackageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDomainsForPackage)
+
+responseListInstanceTypeDetails :: ListInstanceTypeDetailsResponse -> TestTree
+responseListInstanceTypeDetails =
+  res
+    "ListInstanceTypeDetailsResponse"
+    "fixture/ListInstanceTypeDetailsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListInstanceTypeDetails)
+
+responseListPackagesForDomain :: ListPackagesForDomainResponse -> TestTree
+responseListPackagesForDomain =
+  res
+    "ListPackagesForDomainResponse"
+    "fixture/ListPackagesForDomainResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListPackagesForDomain)
+
+responseListTags :: ListTagsResponse -> TestTree
+responseListTags =
+  res
+    "ListTagsResponse"
+    "fixture/ListTagsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTags)
+
+responseListVersions :: ListVersionsResponse -> TestTree
+responseListVersions =
+  res
+    "ListVersionsResponse"
+    "fixture/ListVersionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListVersions)
+
+responseListVpcEndpointAccess :: ListVpcEndpointAccessResponse -> TestTree
+responseListVpcEndpointAccess =
+  res
+    "ListVpcEndpointAccessResponse"
+    "fixture/ListVpcEndpointAccessResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListVpcEndpointAccess)
+
+responseListVpcEndpoints :: ListVpcEndpointsResponse -> TestTree
+responseListVpcEndpoints =
+  res
+    "ListVpcEndpointsResponse"
+    "fixture/ListVpcEndpointsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListVpcEndpoints)
+
+responseListVpcEndpointsForDomain :: ListVpcEndpointsForDomainResponse -> TestTree
+responseListVpcEndpointsForDomain =
+  res
+    "ListVpcEndpointsForDomainResponse"
+    "fixture/ListVpcEndpointsForDomainResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListVpcEndpointsForDomain)
+
+responsePurchaseReservedInstanceOffering :: PurchaseReservedInstanceOfferingResponse -> TestTree
+responsePurchaseReservedInstanceOffering =
+  res
+    "PurchaseReservedInstanceOfferingResponse"
+    "fixture/PurchaseReservedInstanceOfferingResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PurchaseReservedInstanceOffering)
+
+responseRejectInboundConnection :: RejectInboundConnectionResponse -> TestTree
+responseRejectInboundConnection =
+  res
+    "RejectInboundConnectionResponse"
+    "fixture/RejectInboundConnectionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy RejectInboundConnection)
+
+responseRemoveTags :: RemoveTagsResponse -> TestTree
+responseRemoveTags =
+  res
+    "RemoveTagsResponse"
+    "fixture/RemoveTagsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy RemoveTags)
+
+responseRevokeVpcEndpointAccess :: RevokeVpcEndpointAccessResponse -> TestTree
+responseRevokeVpcEndpointAccess =
+  res
+    "RevokeVpcEndpointAccessResponse"
+    "fixture/RevokeVpcEndpointAccessResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy RevokeVpcEndpointAccess)
+
+responseStartServiceSoftwareUpdate :: StartServiceSoftwareUpdateResponse -> TestTree
+responseStartServiceSoftwareUpdate =
+  res
+    "StartServiceSoftwareUpdateResponse"
+    "fixture/StartServiceSoftwareUpdateResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartServiceSoftwareUpdate)
+
+responseUpdateDomainConfig :: UpdateDomainConfigResponse -> TestTree
+responseUpdateDomainConfig =
+  res
+    "UpdateDomainConfigResponse"
+    "fixture/UpdateDomainConfigResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateDomainConfig)
+
+responseUpdatePackage :: UpdatePackageResponse -> TestTree
+responseUpdatePackage =
+  res
+    "UpdatePackageResponse"
+    "fixture/UpdatePackageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdatePackage)
+
+responseUpdateVpcEndpoint :: UpdateVpcEndpointResponse -> TestTree
+responseUpdateVpcEndpoint =
+  res
+    "UpdateVpcEndpointResponse"
+    "fixture/UpdateVpcEndpointResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateVpcEndpoint)
+
+responseUpgradeDomain :: UpgradeDomainResponse -> TestTree
+responseUpgradeDomain =
+  res
+    "UpgradeDomainResponse"
+    "fixture/UpgradeDomainResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpgradeDomain)
diff --git a/test/Test/Amazonka/OpenSearch.hs b/test/Test/Amazonka/OpenSearch.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/OpenSearch.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.OpenSearch
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.OpenSearch
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/OpenSearch/Internal.hs b/test/Test/Amazonka/OpenSearch/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/OpenSearch/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.OpenSearch.Internal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.OpenSearch.Internal where
